===== 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' }