Skip to content

ci: the clock-shift job runs every test of a file, or fails (#848) - #1094

Merged
jayden1711 merged 3 commits into
mainfrom
issue-848-shifted-clock-count
Oct 26, 2026
Merged

jayden1711 merged 3 commits into
mainfrom
issue-848-shifted-clock-count

Conversation

@jayden1711

@jayden1711 jayden1711 commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

What changed (round 2, head 44b2b8b, on main e80bac6)

  • New script, scripts/ci/clock-shift-run.mjs. It gives each test file under the given directories a node --test of its own, with no --test-force-exit. It runs as many files at once as node --test does (availableParallelism() - 1).
    • A file passes only when its run exits 0 and prints a summary.
    • A file still running after --file-timeout is killed together with its process group, named, and fails the run.
    • The run ends with totals and a list of the failed files. On SIGINT or SIGTERM (a step timeout) it kills what's running and names it.
    • It exits 2 when given no test file.
    • Each file's run gets the preload as ...PRELOAD, '--test', from the repo root, which is the form test/isolate.test.ts requires. That check failed on both Node shards at dfe21e9 and was fixed in 44b2b8b.
  • .github/workflows/clock-shift.yml. Both steps (+45d and +400d) run the script: node scripts/ci/clock-shift-run.mjs --test-timeout=600000 --file-timeout=1500000 dist/test. That is 10 minutes per test and 25 minutes per file. The clock-shift NODE_OPTIONS preload, the step limits (75 min) and the job limit (170 min) are unchanged.
  • test/clock-shift.test.ts. It reads both steps from the workflow and checks:
    • each step's exact command line (so no || true or wrapper), shell: bash, and no continue-on-error on any step or on the job;
    • for each step, on fixtures:
      • a test registered after a top-level await runs (it writes a marker), and the totals say 2 of 2;
      • a file with a handle left open fails, named "still running after --file-timeout", while the other file is still reported;
      • a failing test and a hanging test each fail the step, named;
    • and that a run with no test file fails.
  • changelog.d/848-clock-shift-all-tests.md: reworded (R94a, R94b).

Closes #848

Why this design (round 1 failed, R94a)

  • --test-force-exit dropped tests registered after a top-level await, and the run still said 0 fail: 18 of slot-dir-writes' 55 tests at +400d, per the issue.
  • Round 1 dropped the flag and relied on --test-timeout to end a file whose process doesn't exit. That holds on Node 22 only. On Node 24 (the job's version), a file with an open handle is never ended, so the step would wait for its 75-minute limit with no summary (Tests: fix the budget-health second-boundary flake; weekly optional shifted-clock run; lint on clock-reading helpers (#687) [PROTECTED: owner merges] #774). Measured below, and by R94a on the Node 24 shard.
  • I did not use the issue's option 2 (keep force-exit and compare counts with an unshifted run). With force-exit, the unshifted run drops tests too, and not the same number each time: 36, 25 and 51 of 55 in the issue's runs. So a count from it can't serve as the plan. Without force-exit, the unshifted run has the same Node 24 hang. It would also double the suite's time inside the 170-minute job. (inferred)
  • One node --test per file bounds each file on any Node version, from outside the process. It doesn't need Node's own file timeout. (measured on 22 and 24, below)

Evidence

Local runs used Node 22.23.3 and a scratch Node v24.22.1. The Node 24 tarball was checked against nodejs.org's SHASUMS256 and lives under this builder's TMPDIR; nothing was installed.

The old command lines, on fixtures at +400d (measured):

  • main's command (--test-force-exit) on a file with a test after an await: # tests 1, exit 0, on both 22 and 24. The late test never runs.
  • round 1's command (no force-exit, --test-timeout=3000) on a file with an open setInterval, capped with timeout 30: exit 1 on Node 22, and exit 124 on Node 24, meaning it hung until the cap.
  • the new script on the same two fixtures: late test # tests 2 # pass 2, exit 0; open handle (--file-timeout=5000) exit 1, named in "# failed files". Both results on 22 and 24.

Fail-before / pass-after (measured): node --import ./dist/test/isolate.js --test --test-timeout=180000 dist/test/clock-shift.test.js.

Other checks (measured):

  • npm run typecheck: exit 0.
  • npm run check:denylist: "1669 files clean".
  • scripts/check-dco.mjs origin/main HEAD: "all commits signed off".
  • clock-shift, no-wall-clock-durations, changelog and ci-affected tests: 49 of 49 pass on 22 and on 24.
  • Full local npm test under the shared lock, at 44b2b8b: exit 1. The run had 5895 tests: 5769 pass, 17 fail, 69 skipped. The 17 are the same host-only failures as round 1 (merge-vacuity-*, machine-sudoers-*, coordinator), minus desktop-removed. None is in a file this PR touches. The vacuity backstop names the symlinked node_modules as the cause (measured). That the others also come from this host is inferred.

CI at 44b2b8b (measured, gh pr checks 1094): 27 checks pass, 1 fails.

  • All 8 required test shards pass, on both Node 22 and Node 24, and so do the test (ubuntu-latest, 22) and test (ubuntu-latest, 24) roll-ups.
  • The one failure is the optional unit tests on a shifted clock (job 121334474723, Node 24), which fails on the 7 files from before this PR (next section). From its log:
    • Both steps ran to the end, in about 25 minutes each, well inside their 75-minute limits.
    • Each step printed # clock-shift run: 656 files # tests 5822 # pass 5710 # fail 7 # cancelled 0, followed by the 7 failed files by name.
    • slot-dir-writes reported # tests 55 at both +45d and +400d. (Round 1's run did not use --test-force-exit either, so its 5795-test count is not a force-exit comparison; corrected by the coordinator per R94c.)
    • No file hit --file-timeout.

The clock-shift job's other failures predate this PR

R94a measured run 40237889161 of this optional job at round 1's head: 8 failures at each shift, one of them the round-1 open-handle test. The other 7 predate this PR:

R94a ran 3 of them (script-host-tools, watchdog and frozen-guard) locally at +45d. They fail the same way with and without --test-force-exit (measured by R94a). That the other 4 also predate this PR is inferred: this workflow's last green run was Oct 19, before #991. This PR's own run at 44b2b8b failed on exactly these 7 files at both shifts, and on no other file: engine-update, frozen-guard, machine-helper, isolate (the #312 regression), script-host-tools, separate-users and watchdog. So this job will still be red on main after merge, until those 7 are fixed. None of them is an open-handle timeout. This PR doesn't fix them; they are tracked in #1107.

Critical set

Yes. The PR changes a CI workflow and adds a CI script (scripts/ci/), so it needs two independent reviews. No engine-guards test changes. No required check is added or renamed: the job stays optional, and its name, triggers and limits are unchanged.

Not done / follow-ups

  • R94b mutant 3: a test file that calls process.exit(0) partway through still passes silently, as on main. The new script does fail a run with no test file at all. Checking each file's registered count against what ran would close the process.exit case, but it needs the file's own plan, which the runner can't see from outside. Left as a follow-up.
  • test/slot-dir-writes.test.ts is unchanged (engine-guards). It needs no change: 55 of 55 tests run without force-exit (measured in round 1).
  • src/merge-policy-vacuity.ts accepts --test-force-exit in a project's runner.one. The same drop may affect vacuity coverage runs (guess).

@jayden1711

Copy link
Copy Markdown
Owner Author

Independent adversarial review (R94b), posted by the coordinator.

VERDICT: PASS @c542ea595a823dcc66e877e6aaddd4d1a814c8db (adversarial)

Reviewer R94b, own detached worktree at the head, Node 22.23.3, TMPDIR under /var/tmp. CI was still pending when I finished, including "unit tests on a shifted clock" and the test shards. Read CI before merging.

Findings

  • Fail-before and pass-after hold. measured: node --import ./dist/test/isolate.js --test --test-timeout=180000 dist/test/clock-shift.test.js. With the head workflow: 7 pass, 0 fail. With origin/main's clock-shift.yml swapped in: 5 pass, 2 fail (tests 6 and 7).
  • The test reads the workflow, not a copy. measured (workflow mutants, run with --test-name-pattern="#848|#774"). These mutants are caught: --test-force-exit added to either step, --test-name-pattern=early on both, the glob narrowed to dist/test/*.test.js, and the +45d step's --test-timeout dropped or || true appended.
  • A workflow-only edit runs this test in CI. inferred from scripts/ci/affected.mjs: ^\.github\/ is in the run-everything list.
  • The glob covers the whole suite. measured: 654 test/*.test.ts files and 654 dist/test/**/*.test.js files, none missing. The glob is the same as npm test's.
  • No regression against main in the silent-skip shapes I tried. measured: each probe ran through the job's command at +45d, with and without --test-force-exit.
Probe Head Main
Test after a top-level await throws exit 1 exit 0, test never ran
Test registered in a setTimeout exit 1 exit 0
Unhandled rejection inside a test exit 1 exit 0
Unhandled rejection after the tests exit 1 exit 0
Top-level await Promise.reject() before a describe exit 1 exit 1
describe with a test after an await exit 1 exit 1
process.exit(0) at top level after an await exit 0, later test silently skipped same
process.exit(0) inside a test exit 0, later test silently skipped same
File that registers no tests exit 0 exit 0

The process.exit and no-tests cases pass silently on both. They are outside what the PR claims, so they are follow-ups.

  • Typecheck, denylist, changelog test and DCO pass. measured: npm run typecheck exit 0; npm run check:denylist "1658 files clean"; dist/test/changelog.test.js 27 pass, 0 fail; scripts/check-dco.mjs "all commits signed off".

Surviving mutants (follow-ups, not FAILs)

measured: each mutant left the #848 and #774 tests at 2 pass, 0 fail.

  1. The +400d step's timeout and exit code aren't checked. Dropping --test-timeout from that step, appending || true to it, or adding continue-on-error: true all survive. The open-handle test runs only jobTestSteps()[0]; the late-await test checks exit 0, not that a failure fails. The changelog says the test "runs both steps' command lines… a file left with an open handle must fail, named". That is true of the step set as a whole, but the open-handle part runs on +45d only. The PR body ("the step must exit 1") is accurate. I read the changelog line as imprecise, not false. Suggested fix: loop test 7 over both steps and assert no continue-on-error.
  2. Removing the +400d step's isolate.js preload or the NODE_OPTIONS clock-shift preload survives. The test doesn't check that the shift is actually applied in the step.
  3. process.exit(0) in a test file and files with zero tests pass silently. This is the same on main. A per-file "registered and ran at least one test" check would close it.

What I ran

I built with tsc, ran the new tests against the head and main workflows, ran the 9 probe fixtures in both modes, ran 11 workflow mutants, and ran typecheck, denylist, the changelog test, DCO and gh pr checks 1094. The head was still c542ea5 at the end, and the workflow file was restored afterwards.

@jayden1711

Copy link
Copy Markdown
Owner Author

Independent final check (R94a), posted by the coordinator.

VERDICT: FAIL @c542ea595a823dcc66e877e6aaddd4d1a814c8db (final check)

Findings

  1. A required check is red because of the change, and the PR's main safety claim is false on the job's Node version. (measured) The required check test shard 4/4 (ubuntu-latest, 24) (job 121303273763) fails with ℹ fail 1. The one failing test is the PR's new clock-shift.test.ts:158, "the job's flags end a file that keeps a handle open…". On Node 24, the open-handle fixture was not cancelled at --test-timeout=3000. It printed ✔ done, then "Interrupted while running … open-handle.test.js (119980ms)", "Promise resolution is still pending but the event loop has already resolved". It ended only when the test's own 120 s spawn timeout killed it. The same test passes on the Node 22 shards and locally on Node 22.23.3.

    • So the body's claim "Node applies --test-timeout to each file's own process too, so a file whose process doesn't exit is cancelled at the timeout and named" holds on Node 22 only. The clock-shift job runs Node 24 (node-version: '24'). The workflow comment and the changelog repeat the false claim. (measured, via CI logs from gh api …/jobs/<id>/logs)
    • Consequence (inferred): on Node 24, a file with a leaked handle is no longer bounded at 10 minutes and named. It hangs until the step's timeout-minutes: 75 kills the step, and that kill loses the summary. The job still can't hang forever (75 min per step, 170 min per job), but this is the Tests: fix the budget-health second-boundary flake; weekly optional shifted-clock run; lint on clock-reading helpers (#687) [PROTECTED: owner merges] #774 silent-hang shape the PR says it avoids. That fails bar (a), an overclaim, and the "red required CI caused by the change" rule.
  2. Optional clock-shift run 40237889161 failed at both shifts. (measured) Each shift reported tests 5795, pass 5682, fail 8, cancelled 0. One of the 8 is finding 1. The other 7 are script-host-tools test: add-project.test.ts may reach the real sudo since #904 (stand in as_user_argv; host stand-ins first on PATH) #991 round 3, the watchdog real-systemctl test, the engine-update, frozen-guard, machine-helper and separate-users files, and the Tests collide with a live Worklane on the same machine: use ephemeral ports and temp state only #312 regression test.

  3. Fail-before and pass-after hold on Node 22. (measured) The tests from the head run against main's clock-shift.yml gave # pass 5 # fail 2 (tests 6 and 7). On the head they gave # pass 7 # fail 0.

  4. The test is meaningful for the force-exit part. (measured) Re-adding the flag fails test 6, which checks both steps.

    • Surviving mutant: removing --test-timeout from the +400d step only still gives 7/7, because test 7 checks only steps[0]. This is a follow-up.
  5. No required check was added or renamed. (measured from the diff) Only the run lines and a comment changed. The job name, triggers and timeouts are unchanged.

  6. Typecheck exit 0, denylist "1658 files clean", DCO "all commits signed off", changelog test 27/27. (measured)

What I ran

  • git diff origin/main...HEAD
  • npm run typecheck
  • npx tsc -p .
  • node --import ./dist/test/isolate.js --test --test-timeout=180000 dist/test/clock-shift.test.js on the head, on main's workflow, and on the mutant
  • Shifted runs of three failing files, with and without --test-force-exit
  • gh pr checks 1094
  • gh run watch 40237889161
  • gh api repos/jayden1711/worklane/actions/jobs/{121303273630,121303273763,…}/logs

Follow-ups

  • For Node 24, the job needs a real bound per file. Options:
    • keep --test-force-exit and add a count check (option 2 in the issue);
    • use a per-file wrapper with timeout;
    • find out what Node 24 offers.
      Then test the fixture on Node 24, since the test already does that in CI.
  • Make test 7 check both steps.
  • File or link an issue for the 7 shifted-clock failures that came before this PR.

--test-force-exit ended a file's process once the tests it knew of were done, so a file that registers tests after
a top-level await (test/slot-dir-writes.test.ts) lost them silently: 18 fewer tests at +400d, still 0 fail. Both
test steps drop the flag. --test-timeout already bounds a file whose process doesn't exit (a handle left open): it
is cancelled and named, and the step fails, where before it passed.

Test (fails without): test/clock-shift.test.ts runs both steps' command lines from the workflow on fixtures. A test
registered after an await must run (before: never ran, exit 0), and a file left with an open handle must fail,
named, at the step's timeout (before: exit 0).

Signed-off-by: Jayden Vasquez <jaydenvasquez1711@gmail.com>
)

Round 1 dropped --test-force-exit and relied on --test-timeout to end a file whose process doesn't exit. That holds
on Node 22 only: on Node 24, which the job uses, a file with a handle left open is never ended, so the step would
wait for its 75-minute limit with no summary (#774 again; the new open-handle test failed on the Node 24 shard).

scripts/ci/clock-shift-run.mjs runs every test file in a `node --test` of its own, without force-exit, as many at
once as node --test does. A file passes only when it exits 0 with a summary; one still running after --file-timeout
(25 minutes in the job) is killed with its process group and named, and the run fails. The run ends with totals and
the failed files.

The tests read both steps from the workflow and require their exact command lines (no `|| true`, no
continue-on-error on any step or the job), then run each step on fixtures: a test registered after an await runs; a
file with an open handle, a failing test and a hanging test each fail the step, named; no test file fails it.

Signed-off-by: Jayden Vasquez <jaydenvasquez1711@gmail.com>
@jayden1711
jayden1711 force-pushed the issue-848-shifted-clock-count branch from c542ea5 to dfe21e9 Compare October 25, 2026 23:39
…t.ts requires (#848)

test/isolate.test.ts requires a JavaScript runner to declare PRELOAD as ['--import', './dist/test/isolate.js'] and
pass ...PRELOAD right before '--test'. Each file's run now does, from the repo root (its working directory, as in npm
test), with the file given by its absolute path. The check failed on both Node shards at dfe21e9.

Signed-off-by: Jayden Vasquez <jaydenvasquez1711@gmail.com>
@jayden1711

Copy link
Copy Markdown
Owner Author

Independent final check (R94c), posted by the coordinator.

VERDICT: FAIL @44b2b8b61fd43edc10600dc2628be5c9135e6fef (final check)

Reviewer R94c: own detached worktree, Node 22.23.3 and a scratch Node v24.22.1 (checksum checked, kept under TMPDIR). Head re-checked at the end: unchanged.

Why FAIL: one false claim in the PR body (bar a). The code passes.

The Evidence section says: "Round 1's run, still with force-exit, reported 5795 tests per shift." That is false (measured). Run 40237889161 is a pull_request run at c542ea5. Its step ran node --import ./dist/test/isolate.js --test --test-timeout=600000 "dist/test/**/*.test.js", with no --test-force-exit (from gh api …/jobs/<id>/logs, and git show c542ea59:.github/workflows/clock-shift.yml). So the 5795-to-5822 comparison is not evidence that dropping force-exit recovered tests. Fix: edit the body only. Drop the comparison, or say round 1 had no force-exit. No push is needed.

Findings (all measured unless labelled)

  • The design holds on Node 22 and Node 24. I ran the commands on fixtures at +400d:
    • Main's command on a file that registers a test after an await reports # tests 1, exit 0, on both versions.
    • Round 1's command on an open-handle file, capped at 30 s: exit 1 on 22, and exit 124 (hung until the cap) on 24.
    • The new runner: the late-await file runs 2 of 2 tests, exit 0. The open-handle file exits 1, named, within 5 s, on both. A grandchild in the same process group is killed with the file.
  • Fail-before and pass-after hold. node --import ./dist/test/isolate.js --test dist/test/clock-shift.test.js:
    • On the head: 9 of 9 pass on 22 and on 24.
    • With main's or c542ea5's workflow swapped in: exactly tests 6 to 9 (the 4 job tests) fail, on both versions.
  • Runner mutants:
    • Adding --test-force-exit to the per-file run: caught on 22 and 24.
    • Removing the file-timeout kill: caught on 22 and 24.
    • Forcing process.exit(0): caught.
  • Required CI is green. gh pr checks 1094: all 8 test shards pass, plus both roll-ups; 27 checks pass and 1 fails. The one failure is the optional unit tests on a shifted clock (run 40248228551, at the head sha). Each step printed 656 files, tests 5822, pass 5710, fail 7. No file hit --file-timeout, and slot-dir-writes reported # tests 55.
  • The 7 shifted-clock failures predate this PR. I checked 4 more on main (fba8946), using main's own command line at +45d on Node 24:
  • Other checks:
    • Runner file set equals the old glob: 655 of 655.
    • SIGTERM kills the running file and names it, exit 1.
    • npm run typecheck exits 0.
    • Denylist: "1669 files clean". DCO: "all commits signed off". Changelog test: 27 of 27.
  • Changelog: accurate, apart from the narrow case in the first follow-up.

Weakening flags

node <tmp> <repo> 44b2b8b6 gave 2 reasons:

  1. Removed comment lines in clock-shift.yml: not weakening. The comment was rewritten for the new runner. The run lines only got stricter: force-exit is gone, there is a per-file bound, and the exact command line is pinned by test.
  2. process.exit(...) in clock-shift-run.mjs, flagged as a skip mark: false positive. These are the runner's exit codes, and every one fails closed: 2 for bad usage or no files, 1 on a signal, 1 when any file fails.

Follow-ups

  • A grandchild that detaches (detached: true, its own session) survives the kill: measured, I cleaned up its sleep by hand. The runner still finishes, so it doesn't hang. The changelog's "along with what it started" is true for the process group only.
  • A dropped "no summary" check survives the job tests: measured on 24.
  • File an issue for the job's 7 red files, naming the NODE_OPTIONS preload combined with test: add-project.test.ts may reach the real sudo since #904 (stand in as_user_argv; host stand-ins first on PATH) #991's refusal as the cause. The body says they need an issue but links none.
  • R94b's process.exit(0) partway through a file still passes silently, as on main.

@jayden1711

Copy link
Copy Markdown
Owner Author

Independent adversarial review (R94d), posted by the coordinator.

VERDICT: PASS @44b2b8b61fd43edc10600dc2628be5c9135e6fef (adversarial)

Reviewer R94d. I used my own detached worktree at the head (gh pr view confirmed it still at the end). I ran Node 22.23.3 and Node v24.22.1 (the scratch binary from an earlier review), with TMPDIR under /var/tmp. I didn't run the full suite.

Findings

  • No silent pass that is new versus main. measured: I ran fixture directories through the +400d step's exact run line, read from the head's workflow, with short timeouts, via step.sh.
    • These all fail the step and name the file, on both 22 and 24:
      • a test registered in a setTimeout;
      • a failing test registered after a top-level await;
      • an unhandled rejection inside a test, and one after the tests;
      • process.exitCode=3 with every test passing;
      • a fake summary printed in on('exit');
      • a hanging test (on 24 it is ended by the --file-timeout kill).
    • Two shapes pass silently: process.exit(0) partway through a file, and a file with no tests. Main's command exits 0 for process.exit(0) too (measured), and R94b measured the no-tests case on main, so both are follow-ups.
  • The process-group kill works. measured: a grandchild sleep holding the pipe was gone after the file timeout. Two cases are follow-ups:
    • A grandchild started with detached:true (its own session) holding the pipe: the step fails, named, but the grandchild survives. The changelog's "killed, along with what it started" is loose here. It doesn't change the outcome (inferred).
    • A stdio-less grandchild outlives a passing file. Main does the same (inferred).
  • Aggregation is correct. measured: four files, including one nested and one with no tests, gave tests 5 pass 3 fail 2, failed files: 2, exit 1. SIGTERM during a run printed totals and "still running", exited 1, and left no process behind.
  • Coverage matches npm test. measured: fs.globSync('dist/test/**/*.test.js') and the script's listing are the same 655 files, 24 of them in subdirectories. There are no symlinked test files.
  • The preloads apply in each file's run. measured: a fixture saw a shift of 400.0 days and a tm-* isolated XDG_CONFIG_HOME, on 22 and 24.
  • The workflow tests catch the weakening edits. measured, each edit applied by hand and run with --test-name-pattern="the job": || true, step continue-on-error, a dropped NODE_OPTIONS preload and dist/test/unit each give 4 fail. Dropping isolate.js from the runner fails isolate.test.ts (29 pass, 1 fail).
  • Baseline: 9 of 9 on 22 and on 24. The head leaked no fixture process (measured with pgrep).
  • CI matches the body. measured: the only red check is the optional unit tests on a shifted clock. Both steps print 656 files, tests 5822, pass 5710, fail 7, and no file hit the file timeout (job 121334474723 log). Main hasn't changed these files since the base.

Surviving mutants (follow-ups)

measured, each one left the suite green:

  1. if: false on a test step. The test doesn't check if:.
  2. The runner stripping NODE_OPTIONS per file, so it runs unshifted.
  3. A non-recursive listing, which silently drops the 24 subdirectory files.
  4. p.kill() instead of the group kill. On Node 24 this left the fixture's file processes running, which I killed afterwards.

Suggested fixes: assert no if: other than !cancelled(); put a shifted-clock and nested-file fixture in the job tests; assert that the fixture's pid is gone after a kill.

Weakening flags

Output of weakeningOf(base e80bac69, head, tip fba8946e):

  1. "removes or changes a line of a guard or lint" in clock-shift.yml. Not a weakening.
  2. "adds a skip/only/suppression mark" on process.exit(2), process.exit(1) and process.exit(failed.length>0?1:0). False positive. These are the runner's failure exits, and the tests assert codes 1 and 2 (measured: || true is caught; that exit(0) would be caught is inferred).

Ran

tsc -p ., the scanner call, 17 probe fixtures, 9 mutants, gh pr checks, and the job log through gh api. The worktree was restored at the end (git status clean).

@jayden1711

Copy link
Copy Markdown
Owner Author

Independent final check (R94e), posted by the coordinator.

VERDICT: PASS @44b2b8b61fd43edc10600dc2628be5c9135e6fef (final check)

Reviewer R94e, re-checking R94c after a body-only edit. The head is unchanged at 44b2b8b (measured: gh pr view 1094 --json headRefOid,body). R94c's code findings at this head stand: 9 of 9 tests on Node 22 and 24, the 4 job tests failing on main's and round 1's workflows, runner mutants caught, all 8 required shards green, and typecheck, denylist, DCO and the changelog test passing.

Body re-check (measured against R94c's findings)

Weakening flags (carried over from R94c)

weak-scan.mjs <repo> 44b2b8b6 gave 2 reasons:

  1. Removed comment lines in clock-shift.yml: not weakening. The comment was rewritten for the new runner, and the run lines got stricter: force-exit is gone, each file has a bound, and test pins the exact command line.
  2. process.exit(...) in clock-shift-run.mjs, flagged as a skip mark: false positive. These are the runner's exit codes, and each one fails closed: 2 for bad usage or no files, 1 on a signal, 1 when any file fails.

Nits (no action needed for this PR)

@jayden1711

Copy link
Copy Markdown
Owner Author

Weakening scan decision for head 44b2b8b61fd43edc10600dc2628be5c9135e6fef, recorded by the coordinator under the owner's delegation.

The owner's instruction (verbatim): "Stp asking me quesgtions and just take recommended option each time". Both independent reviews of this exact head passed:

  • the final check, R94c, re-checked as R94e after a body-only edit by the coordinator;
  • the adversarial review, R94d.

Both classified the scan's flags the same way.

The weakening scan reports 2 reasons (measured, R94c and R94d):

  1. Changed lines in clock-shift.yml: not a weakening.
  2. process.exit(...) lines in the runner: false positive. They are the runner's failure exits, each failing closed, and the tests assert codes 1 and 2.

The 7 failures in the optional shifted-clock job predate this PR and are tracked in #1107.

Decision: proceed (recommended option). This covers only this head; any new push needs a fresh scan and review.

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.

Shifted-clock job: --test-force-exit drops tests silently (18 from slot-dir-writes at +400d, still 0 fail); make the job fail closed

1 participant