From 73692e1bb6eff271eee123a6f75410c9978f2ab8 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Sat, 24 Oct 2026 12:01:01 -0500 Subject: [PATCH] morgana: row 257 slot result on 1261fa2d8 (sage-4159): three files whole 15/29/1 pass, supervisor suite 45/45, mutants M1-M8 all killed by assertion, tree restored; BUILD.md and evidence only --- agents/morgana/work/queue-257/BUILD.md | 22 + agents/morgana/work/queue-257/gate-run.log | 34 ++ agents/morgana/work/queue-257/mutants-run.log | 391 ++++++++++++++++++ 3 files changed, 447 insertions(+) create mode 100644 agents/morgana/work/queue-257/gate-run.log create mode 100644 agents/morgana/work/queue-257/mutants-run.log diff --git a/agents/morgana/work/queue-257/BUILD.md b/agents/morgana/work/queue-257/BUILD.md index 7657fe7fe..e6d2ea086 100644 --- a/agents/morgana/work/queue-257/BUILD.md +++ b/agents/morgana/work/queue-257/BUILD.md @@ -142,3 +142,25 @@ dependency. - The kit is /mnt/storage/scratch/morgana-r257 (slot257.sh, mutate.py). It refuses unless HEAD is the candidate and the tree is clean, and stops after two unexpected failures (mos-0823). - Static checks before the slot: `node --check` on every file, run from `/`. No test has run yet. + +## Slot result (sage-4159 CLEAR, 2026-10-24 17:00:27Z to 17:00:30Z, candidate 1261fa2d8) + +Run as `busy.sh && timeout -k 10 1500 slot257.sh` in its own session (setsid). The busy check read +CLEAR. The worktree was checked out at 1261fa2d8 with a clean tree. Filbert's approved code is +unchanged. The summary is in `gate-run.log` and the per-run node output in `mutants-run.log`. + +| Run | tests | pass | fail | skip | cancelled | todo | +|---|---|---|---|---|---|---| +| tests/pressure.test.mjs whole | 15 | 15 | 0 | 0 | 0 | 0 | +| tests/rules.test.mjs whole | 29 | 29 | 0 | 0 | 0 | 0 | +| tests/purity.test.mjs whole | 1 | 1 | 0 | 0 | 0 | 0 | +| package suite `node --test tests/` | 45 | 45 | 0 | 0 | 0 | 0 | + +Mutants: 8 of 8 killed. Each one ran only its named test (1 test, rc=1), and each failure was an +AssertionError in that test, not a crash: M1 hold edge, M2 early release, M3 memory floor, M4 sample +count, M5 stale, M6 effective CPU, M7 critical latch, M8 critical memory edge. + +Restore check: `git checkout -- packages/supervisor` ran after each mutant, and the script found the +tree clean every time. At the end HEAD was 1261fa2d8 and `git status --porcelain` was empty. After the +run no node, python or bash process had its cwd under the kit or the worktree, and no g257 TMPDIR was +left behind. The run reached no scripts/test-*.sh. diff --git a/agents/morgana/work/queue-257/gate-run.log b/agents/morgana/work/queue-257/gate-run.log new file mode 100644 index 000000000..2e6b757d7 --- /dev/null +++ b/agents/morgana/work/queue-257/gate-run.log @@ -0,0 +1,34 @@ +CLEAR +== files 2026-10-24T17:00:27Z +file-pressure rc=0 1s ℹ pass 15 ℹ fail 0 +file-rules rc=0 0s ℹ pass 29 ℹ fail 0 +file-purity rc=0 0s ℹ pass 1 ℹ fail 0 +== package suite 2026-10-24T17:00:28Z +suite-supervisor rc=0 0s ℹ pass 45 ℹ fail 0 +== mx 2026-10-24T17:00:28Z (each must fail its named test) +M1 applied to rules.mjs +mx-M1 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M1 KILLED +M2 applied to rules.mjs +mx-M2 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M2 KILLED +M3 applied to rules.mjs +mx-M3 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M3 KILLED +M4 applied to rules.mjs +mx-M4 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M4 KILLED +M5 applied to rules.mjs +mx-M5 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M5 KILLED +M6 applied to pressure.mjs +mx-M6 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M6 KILLED +M7 applied to rules.mjs +mx-M7 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M7 KILLED +M8 applied to rules.mjs +mx-M8 rc=1 0s ℹ pass 0 ℹ fail 1 + mx-M8 KILLED +restored at 1261fa2d8 +SLOT257_DONE 2026-10-24T17:00:30Z diff --git a/agents/morgana/work/queue-257/mutants-run.log b/agents/morgana/work/queue-257/mutants-run.log new file mode 100644 index 000000000..b576440fd --- /dev/null +++ b/agents/morgana/work/queue-257/mutants-run.log @@ -0,0 +1,391 @@ +===== file-pressure.log +✔ loadavg parses the three loads (1.192277ms) +✔ a malformed loadavg throws (0.412303ms) +✔ meminfo returns bytes and keeps unitless counts (0.258214ms) +✔ meminfo without MemAvailable, with a repeated key or a bad line throws (0.206592ms) +✔ PSI parses some and full, and cpu may lack full (0.374747ms) +✔ PSI without a full line for memory or io, or with a bad line, throws (0.195229ms) +✔ CPU lists count distinct CPUs (0.237299ms) +✔ cpu.max gives the quota in CPUs, or null for max (0.23685ms) +✔ memory.max, memory.current and memory.events (0.351243ms) +✔ vmstat gives swap counters and the host OOM counter (0.234271ms) +✔ effective CPUs fall back to the host count with no cgroup input (0.119728ms) +✔ effective CPUs take the smallest of host, cpuset and every quota level (0.117052ms) +✔ effective memory falls back to the host with no cgroup levels, or only max (0.609639ms) +✔ effective memory uses the tightest limited level (0.187466ms) +✔ a limited level without memory.current throws (0.096904ms) +ℹ tests 15 +ℹ suites 0 +ℹ pass 15 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 171.66419 +===== file-rules.log +✔ the first state is held, and healthy samples open it after exactly 30 s (2.048214ms) +✔ load holds at 0.80 for 3 samples and not at 0.7999 (1.121376ms) +✔ load divides by effective CPUs, fractional ones included (0.360874ms) +✔ a gap of more than 6 s resets the consecutive count (0.343221ms) +✔ load releases at 0.55 and not at 0.5501 (0.435882ms) +✔ a dead-band sample restarts the 30 s release window (0.376884ms) +✔ memory holds below the larger floor, on one sample (0.259125ms) +✔ on a small limit the 1 GiB floor is the larger one (0.346965ms) +✔ memory releases only above the larger release floor (0.906516ms) +✔ each PSI hold threshold holds at its value for 3 samples and not just below (0.661209ms) +✔ the PSI count runs across resources (0.15624ms) +✔ each PSI release threshold blocks at its value and releases just below (0.613751ms) +✔ a missing required signal holds at once with health-unknown (0.388768ms) +✔ a signal is stale at more than 6 s old and fresh at exactly 6 s (0.446828ms) +✔ malformed signal values count as missing (0.787389ms) +✔ after health-unknown, recovery waits the full 30 s (0.34472ms) +✔ a host that never had PSI skips the PSI rows (0.201995ms) +✔ PSI that disappears after it was present holds with health-unknown (0.634442ms) +✔ a rise in the OOM kill counter is critical; the first sample is the baseline (0.230518ms) +✔ a falling OOM counter resets the baseline with a note, not an event (0.208182ms) +✔ memory under 5% and disk under 1 GiB are critical, at their edges (0.800954ms) +✔ critical stays until reconciliation, then still waits the 30 s release (0.585483ms) +✔ critical reasons accumulate while critical (0.174367ms) +✔ a clock that goes backwards holds with health-unknown (0.165886ms) +✔ a sample without a numeric time throws (0.515819ms) +✔ evaluate doesn't change the state it was given (0.327166ms) +✔ resolveRules with no overrides is the D4 table, frozen (0.502534ms) +✔ overrides apply in the evaluator (0.291524ms) +✔ contradictory or unknown settings refuse (1.168994ms) +ℹ tests 29 +ℹ suites 0 +ℹ pass 29 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 86.686704 +===== file-purity.log +✔ src reads no file, process, network or clock (1.611513ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 1 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 63.38547 +===== suite-supervisor.log +✔ loadavg parses the three loads (1.322312ms) +✔ a malformed loadavg throws (0.491714ms) +✔ meminfo returns bytes and keeps unitless counts (0.306568ms) +✔ meminfo without MemAvailable, with a repeated key or a bad line throws (0.282108ms) +✔ PSI parses some and full, and cpu may lack full (0.382364ms) +✔ PSI without a full line for memory or io, or with a bad line, throws (0.229427ms) +✔ CPU lists count distinct CPUs (0.310693ms) +✔ cpu.max gives the quota in CPUs, or null for max (0.258658ms) +✔ memory.max, memory.current and memory.events (0.36499ms) +✔ vmstat gives swap counters and the host OOM counter (0.27834ms) +✔ effective CPUs fall back to the host count with no cgroup input (0.148614ms) +✔ effective CPUs take the smallest of host, cpuset and every quota level (0.118641ms) +✔ effective memory falls back to the host with no cgroup levels, or only max (0.189321ms) +✔ effective memory uses the tightest limited level (0.248126ms) +✔ a limited level without memory.current throws (0.174502ms) +✔ src reads no file, process, network or clock (1.698537ms) +✔ the first state is held, and healthy samples open it after exactly 30 s (2.722678ms) +✔ load holds at 0.80 for 3 samples and not at 0.7999 (1.31022ms) +✔ load divides by effective CPUs, fractional ones included (0.457608ms) +✔ a gap of more than 6 s resets the consecutive count (0.487291ms) +✔ load releases at 0.55 and not at 0.5501 (0.471881ms) +✔ a dead-band sample restarts the 30 s release window (0.407363ms) +✔ memory holds below the larger floor, on one sample (0.311888ms) +✔ on a small limit the 1 GiB floor is the larger one (0.337859ms) +✔ memory releases only above the larger release floor (0.852137ms) +✔ each PSI hold threshold holds at its value for 3 samples and not just below (0.670722ms) +✔ the PSI count runs across resources (0.168238ms) +✔ each PSI release threshold blocks at its value and releases just below (0.706245ms) +✔ a missing required signal holds at once with health-unknown (0.45638ms) +✔ a signal is stale at more than 6 s old and fresh at exactly 6 s (0.501209ms) +✔ malformed signal values count as missing (0.703616ms) +✔ after health-unknown, recovery waits the full 30 s (0.252741ms) +✔ a host that never had PSI skips the PSI rows (0.136341ms) +✔ PSI that disappears after it was present holds with health-unknown (0.302628ms) +✔ a rise in the OOM kill counter is critical; the first sample is the baseline (0.181417ms) +✔ a falling OOM counter resets the baseline with a note, not an event (0.166744ms) +✔ memory under 5% and disk under 1 GiB are critical, at their edges (0.59429ms) +✔ critical stays until reconciliation, then still waits the 30 s release (0.346404ms) +✔ critical reasons accumulate while critical (0.111712ms) +✔ a clock that goes backwards holds with health-unknown (0.098686ms) +✔ a sample without a numeric time throws (0.425754ms) +✔ evaluate doesn't change the state it was given (0.239173ms) +✔ resolveRules with no overrides is the D4 table, frozen (0.368226ms) +✔ overrides apply in the evaluator (0.251687ms) +✔ contradictory or unknown settings refuse (0.917827ms) +ℹ tests 45 +ℹ suites 0 +ℹ pass 45 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 92.173971 +===== mx-M1.log +✖ load holds at 0.80 for 3 samples and not at 0.7999 (2.627622ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 53.826624 + +✖ failing tests: + +test at tests/rules.test.mjs:75:1 +✖ load holds at 0.80 for 3 samples and not at 0.7999 (2.627622ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal: + + actual - expected + + [ + 'open', + 'open', + + 'open' + - 'held' + ] + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/rules.test.mjs:77:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: [ 'open', 'open', 'open' ], + expected: [ 'open', 'open', 'held' ], + operator: 'deepStrictEqual', + diff: 'simple' + } +===== mx-M2.log +✖ the first state is held, and healthy samples open it after exactly 30 s (1.670671ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 48.463372 + +✖ failing tests: + +test at tests/rules.test.mjs:62:1 +✖ the first state is held, and healthy samples open it after exactly 30 s (1.670671ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + + 'open' !== 'held' + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/rules.test.mjs:65:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 'open', + expected: 'held', + operator: 'strictEqual', + diff: 'simple' + } +===== mx-M3.log +✖ memory holds below the larger floor, on one sample (2.628385ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 54.087261 + +✖ failing tests: + +test at tests/rules.test.mjs:119:1 +✖ memory holds below the larger floor, on one sample (2.628385ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + + 'open' !== 'held' + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/rules.test.mjs:125:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 'open', + expected: 'held', + operator: 'strictEqual', + diff: 'simple' + } +===== mx-M4.log +✖ load holds at 0.80 for 3 samples and not at 0.7999 (2.72525ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 54.494912 + +✖ failing tests: + +test at tests/rules.test.mjs:75:1 +✖ load holds at 0.80 for 3 samples and not at 0.7999 (2.72525ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal: + + actual - expected + + [ + - 'open', + - 'open', + 'held', + + 'held', + + 'held' + ] + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/rules.test.mjs:77:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: [ 'held', 'held', 'held' ], + expected: [ 'open', 'open', 'held' ], + operator: 'deepStrictEqual', + diff: 'simple' + } +===== mx-M5.log +✖ a signal is stale at more than 6 s old and fresh at exactly 6 s (2.946775ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 58.672563 + +✖ failing tests: + +test at tests/rules.test.mjs:187:1 +✖ a signal is stale at more than 6 s old and fresh at exactly 6 s (2.946775ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal: + + actual - expected + + + [] + - [ + - 'load' + - ] + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/rules.test.mjs:191:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: [], + expected: [ 'load' ], + operator: 'deepStrictEqual', + diff: 'simple' + } +===== mx-M6.log +✖ effective CPUs take the smallest of host, cpuset and every quota level (1.625079ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 55.012035 + +✖ failing tests: + +test at tests/pressure.test.mjs:101:1 +✖ effective CPUs take the smallest of host, cpuset and every quota level (1.625079ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + + 4 !== 1.5 + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/pressure.test.mjs:103:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 4, + expected: 1.5, + operator: 'strictEqual', + diff: 'simple' + } +===== mx-M7.log +✖ critical stays until reconciliation, then still waits the 30 s release (4.842568ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 54.317924 + +✖ failing tests: + +test at tests/rules.test.mjs:259:1 +✖ critical stays until reconciliation, then still waits the 30 s release (4.842568ms) + AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: + + assert.ok(waiting.decisions.every((d) => d.mode === "critical" && d.reasons[0] === "critical-disk")) + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/rules.test.mjs:262:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: false, + expected: true, + operator: '==', + diff: 'simple' + } +===== mx-M8.log +✖ memory under 5% and disk under 1 GiB are critical, at their edges (3.080014ms) +ℹ tests 1 +ℹ suites 0 +ℹ pass 0 +ℹ fail 1 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 49.440823 + +✖ failing tests: + +test at tests/rules.test.mjs:245:1 +✖ memory under 5% and disk under 1 GiB are critical, at their edges (3.080014ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + + 'critical' !== 'held' + + at TestContext. (file:///home/jwoltje/.t3/worktrees/mosaic-stack/morgana-row257/packages/supervisor/tests/rules.test.mjs:253:10) + at Test.runInAsyncScope (node:async_hooks:226:14) + at Test.run (node:internal/test_runner/test:1402:25) + at Test.start (node:internal/test_runner/test:1262:17) + at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 'critical', + expected: 'held', + operator: 'strictEqual', + diff: 'simple' + }