Files
Paolo Mottadelli 06a2d78493 fix(stardust): replica instruments — pixel-compare exit hang fixed, deadlines, live-side caches, script-path lint (0.22.1)
Evidence: 48 field sessions (Aug–Sep 2026, 24 projects) and the notes those
runs wrote about themselves. pixel-compare.mjs was slow or timed out in 17 of
24 runs and on every plugin version since 0.18.1; seven projects' own notes
name it, four describe it at 0 % CPU after printing its verdict; agents
answered with `sleep 150; kill` loops (one page: 30 fixed minutes).

Reproduced 2026-09-18: with stdout redirected (as gate.sh and every agent
pipeline run it) process.exit() after the compare hangs Node's platform
shutdown (Environment::Exit → DisposePlatform →
WorkerThreadsTaskRunner::Shutdown → uv_thread_join), ~1 run in 4 on Node 25;
nine such processes from earlier migrations were still alive on the test
machine, some for six days.

- pixel-compare.mjs: drain via process.exitCode (0 hangs in 10 runs where the
  original hung) + supervised --timeout (default 120 s, exit 124 = no verdict)
- run-capped.mjs (new): process-group deadline wrapper (macOS has no timeout)
- gate.sh: captures under run-capped (GATE_STITCH_TIMEOUT / GATE_COMPARE_TIMEOUT),
  no partial live.png reuse, stale-instrument reap (GATE_REAP_MIN, default 15)
- chrome-parity.mjs --live-cache, anchor.mjs --cache: live side probed once per
  breakpoint, reused while url/width/selectors match; anchor warns when --main
  matched a wrapper still containing header/footer
- evals/lint/script-paths.mjs (new, npm run lint:stardust + CI): plugin-internal
  skills/<skill>/scripts|reference paths in docs must exist; fixed the two it found
- docs: gate iteration discipline, replica Phase 4 snippet, deploy § 7 brief
  discipline, master hands-off defaults, capped DA protocol waits; CHANGELOG 0.22.1

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 14:55:28 +02:00
..