Skip to content

Bag of Changes#23

Open
uh-oh-monteiro wants to merge 15 commits into
halter-modsfrom
feat/child-test-label
Open

Bag of Changes#23
uh-oh-monteiro wants to merge 15 commits into
halter-modsfrom
feat/child-test-label

Conversation

@uh-oh-monteiro

@uh-oh-monteiro uh-oh-monteiro commented Jul 4, 2026

Copy link
Copy Markdown

halter-mods is the main branch here (or at least it was when we had an htf fork). Unsure if master` is now the trunk.

Anyway, I wanted to make a change to show the slot number on the history panel, but realised all you folks were working off a non- halter-mods branch. So I found the branch which was most up to date remotes/origin/feat/operator-fault-report-escalate and made my branch off that. Attempting to merge it all in now lol

uh-oh-monteiro and others added 15 commits March 18, 2026 23:43
* Add DDNS health indicator to single-station dashboard status bar

Render the tri-state DDNS record health reported by the station server in
the single-station status bar, below the IP line:

  MATCH    -> green check     (resolves to the station's current IP)
  MISMATCH -> red cross        (resolves, but to a different/stale IP)
  UNKNOWN  -> grey question    (could not resolve: NXDOMAIN, timeout, no FQDN)

The line is omitted entirely when the server reports no DDNS information
(the multi-station dashboard path and older servers do not send these
fields), so the change degrades safely against an un-bumped backend.

The fields (ddns_hostname / ddns_resolved_ip / ddns_status) are produced
by the backend counterpart in halter-corp/hardware-test-framework#1567.

NOTE: the committed dist/ bundle is NOT regenerated in this commit. The
Angular 4 / webpack 3 / node-sass 7 toolchain could not be built in the
authoring environment (Node 25 / Python 3.12 lacks distutils, node-sass
native build fails). Run "npm install && npm run build" in web_gui with a
compatible Node before deploying, and commit the regenerated dist/. See
the accompanying APPLY.md.

Co-Authored-By: clank-halter[bot] <2696940+clank-halter[bot]@users.noreply.github.com>
Clank-Job-Id: 6ae51244-e605-4ce0-9e50-ebf172b7b87d

* Pin Node 16 in web_ui CI job so node-sass can build

The web_ui job used setup-node without a version, picking up the
runner's default (now Node 22). node-sass@7 can't compile its native
addon on Node >= 18, so npm install failed. Pin Node 16 to unblock CI.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: kurtmc <2661907+kurtmc@users.noreply.github.com>
Co-authored-by: clank-halter[bot] <2696940+clank-halter[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Commit 3214561 (#20) added the single-station DDNS indicator source but
could not regenerate the committed dist/ bundle (the Angular 4 / webpack 3
/ node-sass 7 toolchain needs Node 16), so the served bundle still ran the
pre-DDNS JS and the indicator never rendered on the station.

Rebuilt dist/ under Node 16 (npm install --ignore-scripts && npm rebuild
node-sass && npm run build). New bundle hash 2fc68a8 now contains the
ddnsStatus / ddns-indicator rendering.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Surface structured test failures to factory operators instead of raw
logs. When a failed test carries outcome_details, the station summary now
renders a prominent red panel with:

- "What to do": operator-facing remediation steps (primary content).
- A de-emphasised engineering "Issue" line (fault code + short message).
- For unmapped/unexpected errors (no remediation), a "Report to
  engineering" button that POSTs the station/test context plus the error
  logs to the station server's /fault-report relay.

The GUI never calls external services: station_server exposes a
/fault-report endpoint that delegates to a handler injected by the
framework (501 if unset), which forwards to hardware-test-service. The
report payload matches hardware-test-service's IReportFaultRequestDTO
(fixtureId/testPlan/dutId/code/issue/traceback); the station relay fills
in the canonical fixtureNumber before forwarding.

station-data filters out the internal OperatorActionRequired marker and
splits the description into issue / "what to do" for the panel.

Includes the rebuilt web_gui dist bundle (app.6cf0568f...).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The web_ui job left setup-node unpinned, so it used the runner's default
Node. ubuntu-latest moved to a newer Node where node-sass ^7 (libsass
3.5.5) no longer compiles, breaking the native build. Pin Node 16 — the
version the stations run and the committed dist is built with.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Brings the DDNS health indicator (#20) and its dist rebuild onto the
operator-fault-panel branch.

Conflicts were of two kinds:
- continuous_integration.yml: both sides pinned Node 16; kept the
  commented `'16'` form.
- web_gui/dist/*: both sides rebuilt the bundle to different webpack
  content hashes. Generated artifacts are not hand-merged; instead the
  cleanly-merged source (DDNS + operator panel, no source conflicts) was
  rebuilt with `npm run build` under Node 16, producing a single fresh
  bundle (app.e9c4d879...) that carries both features.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Operator fault panel in the station GUI
- The report buttons now show a spinner, disable while in flight, then a
  good/fail result. State is keyed by a stable code+issue id so it survives
  the station's periodic re-polls (an object-keyed map reverted the button).
- A known fault whose remediation steps did not resolve it gets a distinct red
  "Report Issue" button that POSTs to a new /fault-escalate relay (raises a
  PagerDuty incident via hardware-test-service), shown below the hint and kept
  separate from the grey "Notify Halter" report for uncaught errors.
- station_server: add FaultEscalateHandler + set_fault_escalate_handler +
  /fault-escalate route, delegating to an injected handler exactly like
  /fault-report (the GUI never calls external services itself).
- Rebuild dist.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
An aborted test is a reset (e.g. the station service restarting on a deploy),
not a fault — so its outcome_details must not surface as an operator action.
Gate the panel behind a showFaultPanel getter that excludes ABORTED. Rebuild
dist.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Conflicts:
#	openhtf/output/web_gui/dist/css/app.4cad1b230047e7d0f056.css
#	openhtf/output/web_gui/dist/css/app.4cad1b230047e7d0f056.css.map
#	openhtf/output/web_gui/dist/css/app.575e9bb61286fde76cb9.css
#	openhtf/output/web_gui/dist/css/app.575e9bb61286fde76cb9.css.map
#	openhtf/output/web_gui/dist/css/app.587dc395b04f17af29f3.css
#	openhtf/output/web_gui/dist/css/app.587dc395b04f17af29f3.css.map
#	openhtf/output/web_gui/dist/index.html
#	openhtf/output/web_gui/dist/js/app.4cad1b230047e7d0f056.js
#	openhtf/output/web_gui/dist/js/app.575e9bb61286fde76cb9.js
#	openhtf/output/web_gui/dist/js/app.587dc395b04f17af29f3.js
#	openhtf/output/web_gui/dist/js/polyfills.4cad1b230047e7d0f056.js
#	openhtf/output/web_gui/dist/js/polyfills.4cad1b230047e7d0f056.js.map
#	openhtf/output/web_gui/dist/js/polyfills.575e9bb61286fde76cb9.js
#	openhtf/output/web_gui/dist/js/polyfills.575e9bb61286fde76cb9.js.map
#	openhtf/output/web_gui/dist/js/polyfills.587dc395b04f17af29f3.js
#	openhtf/output/web_gui/dist/js/polyfills.587dc395b04f17af29f3.js.map
#	openhtf/output/web_gui/dist/js/vendor.4cad1b230047e7d0f056.js
#	openhtf/output/web_gui/dist/js/vendor.575e9bb61286fde76cb9.js
#	openhtf/output/web_gui/dist/js/vendor.587dc395b04f17af29f3.js
#	openhtf/output/web_gui/dist/js/vendor.587dc395b04f17af29f3.js.map
#	openhtf/output/web_gui/src/app/stations/station/station-data.ts
@coveralls

Copy link
Copy Markdown

Coverage Report for CI Build 28709453179

Coverage increased (+0.3%) to 60.498%

Details

  • Coverage increased (+0.3%) from the base build.
  • Patch coverage: 40 uncovered changes across 1 file (0 of 40 lines covered, 0.0%).
  • 1 coverage regression across 1 file.

Uncovered Changes

File Changed Covered %
openhtf/output/servers/station_server.py 40 0 0.0%

Coverage Regressions

1 previously-covered line in 1 file lost coverage.

File Lines Losing Coverage Coverage
openhtf/output/servers/station_server.py 1 0.0%

Coverage Stats

Coverage Status
Relevant Lines: 7754
Covered Lines: 4691
Line Coverage: 60.5%
Coverage Strength: 2.42 hits per line

💛 - Coveralls

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants