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

This commit is contained in:
jason.woltje committed 2026-10-24 12:02:34 -05:00
1 parent fc5f282902
commit 73692e1bb6
3 files changed
+447

No files matched your search

+22
View File
@@ -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.
@@ -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
@@ -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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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.<anonymous> (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'
}