3.0 KiB
Row279: stopRun deadline final observation
Scope: sage-2512, mos-1269; brief docs/plans/2026-10-22_stoprun-deadline.md.
Base f40f2e770. Reviewer Dewey; gate owner Sage. V502 stays separate.
Cause and smallest change
The loop's precondition now()<=deadline can skip the existing final status read when a sleep wakes beyond deadline. Use for(;;) so the existing now()>=deadline branch is the only time exit. Change that loop header only; all record/identity/ended exits and result mapping remain byte-identical. The old trailing fallback remains unreachable in the fixed loop. M1 restores only the old header and thereby restores the complete old fall-through path.
Regression and evidence plan
Add one test to stop-run.test.mjs, preserving existing tests. Its fake sleep advances requested duration plus1ms, so the last sleep crosses the deadline. Its signal stub records TERM/KILL and returns success without killing the always-live fixture process. Expect both signals, time>7000ms and alive. The old loop should fail only the alive assertion with unknown.
Ask Sage CLEAR before any run, including the expected regression red. Then apply the one-line fix, run the touched whole file and processing-control package as granted, and kill M1 with that same named regression. Busy check, short scratch TMPDIR,deadDocker,owned process groups,timeouts,restore,sweep. No live state,units,store,provider,browser,Docker or V502 changes.
Packet includes base,patch,candidate hashes,regression/gate/mutant logs and exact source-diff check. Commit candidate and packet on the new branch only after authorized checks. No token is available; Sage publishes as jarvis. The business/CLI suites remain Sage's landing gate unless separately granted.
Authorized run and result
Claim rev 3138, op rocko-279-start-r1. Sage granted this exact sequence in sage-2516 (2026-10-22T05:55:21Z). Runs: 05:56:03Z to 05:58:03Z.
| Step | Pass | Fail | Skip | Result |
|---|---|---|---|---|
| Regression on unfixed base | 0 | 1 | 0 | Expected assertion: unknown versus alive |
| stop-run.test.mjs whole | 13 | 0 | 0 | Green |
| processing-control package whole | 62 | 0 | 0 | Green |
| M1 old loop | 0 | 1 | 0 | Killed by the named regression, unknown versus alive |
M1's killer is a sleep past the stop deadline still observes an alive run after both signals. It exits 1 with that assertion, never a syntax error or
timeout. Logs and results.json retain the intentional failures separately.
Green runs total 75 passes (the whole-file tests are also part of the package).
No skips. All commands used a short scratch TMPDIR, a dead Docker socket and
fixture-only configuration. Each node command ran in its own process group
with a 120-second timeout. No timeout occurred. Final cwd sweep: empty.
The source restoration and exact one-line product scope are checked in
source-scope-check.json. The trailing unknown return stays unchanged and is
unreachable after the fix. Business and CLI suites remain Sage's owner gate.
Slot returned to Sage at 05:58:03Z. No live action or V502 change.