Skip to content

feat: node 24, zero known vulnerabilities, arm64 image and instrument UI redesign - #733

Open
enudler wants to merge 3 commits into
Zooz:masterfrom
enudler:feat/node24-instrument-ui
Open

feat: node 24, zero known vulnerabilities, arm64 image and instrument UI redesign#733
enudler wants to merge 3 commits into
Zooz:masterfrom
enudler:feat/node24-instrument-ui

Conversation

@enudler

@enudler enudler commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

What

Two things that belong together, since the UI toolchain couldn't move without the runtime moving first:

  1. Node 12 → 24, zero known production vulnerabilities, arm64 support.
  2. A full UI/UX redesign ("Instrument" direction: neutral chrome, colour reserved for measurement state).

Runtime & dependencies

  • engines >=22, .nvmrc at 24. Sequelize 6, umzug, mysql2 3, eslint 9 flat config (neostandard), mocha 11, sinon 19, nock 14.
  • c8 replaces nyc — nyc's spawn-wrap instrumentation is broken on modern Node and silently reported ~16% coverage.
  • request/request-promise-native removed (deprecated, unpatched). Outbound HTTP goes through src/common/requestSender.js on node:http(s), or native fetch.
  • artillery dependency removed — it was only needed for one JSON schema, now vendored at src/tests/helpers/artillery-test-script.schema.json.
  • @aws-sdk/client-ecs v3, archiver 8, uuid 13. npm audit --omit=dev: 0 vulnerabilities (was 100, 11 critical). UI audit: 0 (was 17).
  • Bug fix: DATABASE_PORT unset no longer forces 3306 onto non-MySQL dialects.
  • Docker image builds and runs on linux/amd64 + linux/arm64, 176MB (was ~1GB). UI moved to dart-sass (node-sass has no arm64 prebuilds).
  • All five CI database/platform integration combos pass on fresh databases.

UI redesign

  • Design tokens (ui/src/styles/_tokens.scss) for colour/type/spacing/motion, light + dark, bridged to ~35 legacy stylesheets through _colors.scss. Status hues (held/strain/breach) are reserved for measurement state and always paired with a glyph or label.
  • Report hero: p95 / RPS / errors / duration readouts plus a load-spine latency trace drawn against the benchmark run's p95.
  • Colourblind-validated chart palette (six series, assigned by slot), theme-aware monaco + JSON editors, status pills, rebuilt navigation rail (collapse, mobile overlay, theme toggle), token-based tables and pagination with real disabled states.
  • Fixed a duplicate duration column id that made report tables show raw seconds instead of formatted durations.
  • Verified in both themes with headless Chrome: all routes mount, 0 page errors, 0 contrast failures, no horizontal overflow at 390px.

CLAUDE.md documents the architecture, testing traps, and the design-system rules.

Screenshots

Dark report page, dark tests list, and light equivalents were verified route-by-route; the design system section in CLAUDE.md includes the validation commands used.

🤖 Generated with Claude Code

enudler and others added 3 commits July 28, 2026 22:52
… ui redesign

Runtime and dependencies:
- Node 12 -> 24 (engines >=22, .nvmrc), Sequelize 6, eslint 9 flat config,
  mocha 11/sinon 19/nock 14, c8 replacing nyc (spawn-wrap is broken on
  modern Node and silently reported ~16% coverage)
- request/request-promise-native removed: outbound HTTP now uses
  node:http(s) via requestSender, or fetch
- artillery dependency removed: its JSON schema is vendored at
  src/tests/helpers/artillery-test-script.schema.json
- @aws-sdk/client-ecs v3, archiver 8, uuid 13; npm overrides pin patched
  transitives. npm audit --omit=dev: 0 vulnerabilities (was 100, 11 critical)
- DATABASE_PORT no longer defaults to 3306 for non-MySQL dialects; unset
  leaves the dialect default (5432/1433/3306)
- Docker image builds and runs on linux/amd64 and linux/arm64 (176MB)
- UI: webpack 5, dart-sass (node-sass has no arm64 prebuilds), css-loader 7
  pinned to namedExport:false, single monaco-editor copy

UI redesign ("Instrument" direction):
- Design tokens in ui/src/styles/_tokens.scss (light+dark), bridged to ~35
  legacy stylesheets through _colors.scss; status hues (held/strain/breach)
  reserved for measurement state
- Report hero with p95/RPS/errors/duration readouts and a load-spine trace
  against the benchmark run's p95
- Colourblind-validated chart palette assigned by slot; theme-aware monaco
  and JSON editors; status pills with glyphs; rebuilt navigation rail with
  collapse, mobile overlay and theme toggle
- Page-header actions slot, token-based pagination with disabled states,
  single-line mono timestamps, compact durations, ellipsised text cells
- Fixed duplicate 'duration' column id that showed raw seconds on report
  tables; both themes verified for contrast, page errors and 390px overflow

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…hcr release

Replaces the stale CircleCI pipeline. The integration job runs the same five
database/platform combos through the existing run.sh scripts. Release builds
multi-arch (amd64+arm64) images to ghcr.io on master pushes and v* tags.

Also hardens the processors integration setup: each of the 101 inserts is now
asserted (with one retry), so a transient failed insert reports its real error
instead of surfacing 30 tests later as an off-by-one paging failure.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Stubbing Date.prototype.constructor never intercepted new Date(), so the
expected published_at was a second timestamp taken in the test — flaking
whenever the two landed on different milliseconds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

1 participant