gizmoduck: row 270 (264c, #1775) gate run 2 second red, fixed under mos-1364 and sage-3093: compactions-budget.test F1 (:39 input 8.5 * MiB is a whole number, now MiB + 0.5) and F2 (the 0o000 window in try/finally; the after-hook ran after setup's rm); K M22 :129, M23 :120, M22 and M15 notes; BUILD.md run 2

This commit is contained in:
jason.woltje committed 2026-10-22 19:23:19 -05:00
1 parent 5f697db995
commit 53406f3e46
3 files changed
+43 -9

No files matched your search

+32
View File
@@ -593,3 +593,35 @@ tree. No node process was left, and the tree was clean. Its log is
/mnt/storage/scratch/gizmo-271-out/r4-run1/. This is the row's first red. Run 2 is the whole gate
again on the commit that adds the placement. That commit changes the 270 manifest (compactions-launch.test.mjs,
mutants.py and this file), so Sage and Duckworth see it before landing.
### Run 2: a second red, two test defects (mos-1364, sage-3093)
Run 2 started 00:09:50Z on 5f697db99. Phase 1 passed except one file: the 15 bus files, session-compactions
4/4, compactions-launch 5/5, cli session-clear 5/5, stack-release 219/219, seat compactions 20/20,
stack-instances 24/24, webui pinned-copy 10/10 and business 231/231. seat compactions-budget.test.mjs
went RED: 8 of 10 pass. The file is new in round 2, and this was its first run. Rounds 2 and 3 were not
run. This is the row's second red, so I stopped the run (r4.out's last write 00:20:12Z) and changed
nothing until Mos ruled yes on both fixes (mos-1364, passed on in sage-3093). Phase 2 did not start. Its
log is /mnt/storage/scratch/gizmo-271-out/r4-run2/.
Both failures are defects in the test, not in compactions.mjs.
F1, :39 in "the budget is the setting's whole number of bytes...". `readBudget(8.5 * MiB)` returned
8912896, not the default 67108864. 8.5 MiB is 8912896 bytes: a whole number, in range. readBudget
(compactions.mjs:80-82, Number.isSafeInteger and the 1 MiB to 1 GiB bounds) is right to take it. The case
meant a value that is not a whole number of bytes. The fix changes only that input, to `MiB + 0.5`. The
other twelve bad values stay. M17's kill line is this :39, so M17 had no valid kill before the fix.
F2, :107 in "a claude-projects/ that can't be read...". The hook `t.after(() => chmodSync(projects,
0o700))` threw ENOENT. A test's after hooks run in the order they were registered. setup()'s rmSync of the
root (:20) was registered first, so the tree was gone when this hook ran. The test's assertions had passed.
The fix puts the 0o000 window in try/finally, which restores 0o700 before the rm even when an assertion
fails, and drops the hook and the inline chmod. It keeps the same assertions in the same order, and none
is removed. Net +2 lines, so in mutants.py K, M23 moves :118 to :120 and M22 :127 to :129. M22's note
cites the default-cap test's :141, now :143. M15's note cites the clear test's :323 and the legacy :343,
which are :328 and :348 since run 1. That change is to note text only. `mutants.py check` shows all 24
anchors matching once.
The file alone then passed 10 of 10 (/mnt/storage/scratch/gizmo-271-out/place-compactions-budget.log).
Run 3 is the whole combined gate again, on one tree, on the commit with F1 and F2. A third red on 270
stops it and goes to Sage and Mos before any change.
+4 -4
View File
@@ -86,7 +86,7 @@ K = {
"M14": (CT, "a run collects compactions at its start and its end, and the count holds across a resume and a host restart", 188,
"no end collection: run 1 logs only [D,1,true,null]"),
"M15": (CT, "a run collects compactions at its start and its end, and the count holds across a resume and a host restart", 203,
"session.list's compactions is null: {at: 'undefined'} and no count; the clear test's :323 and the legacy :343 fail the same way"),
"session.list's compactions is null: {at: 'undefined'} and no count; the clear test's :328 and the legacy :348 fail the same way"),
"M16": (SB, "a stream past the default budget is not-collected with a lower bound, and a later collection catches up", 50,
"the whole 66 MiB is read: {count 1, known true, reason null}"),
"M17": (SB, "the budget is the setting's whole number of bytes from 1 MiB to 1 GiB, and the default for anything else", 39,
@@ -99,9 +99,9 @@ K = {
"the first collection counts c1: {count 1, known true}"),
"M21": (SB, "Claude history from before the ledger makes the first Pi collection harness-unsupported, for good", 91,
"a Pi collected record isn't sticky: the second reads {count 1, known true}"),
"M22": (SB, "more streams than the cap is not-collected, with cursors only for the streams opened, and a larger cap catches up", 127,
"all four streams are opened: {count 4, known true, reason null}; the default-cap test's :141 fails the same way (1025 cursors)"),
"M23": (SB, "the stream cap is the setting's whole number from 32 to 65536, and the default for anything else", 118,
"M22": (SB, "more streams than the cap is not-collected, with cursors only for the streams opened, and a larger cap catches up", 129,
"all four streams are opened: {count 4, known true, reason null}; the default-cap test's :143 fails the same way (1025 cursors)"),
"M23": (SB, "the stream cap is the setting's whole number from 32 to 65536, and the default for anything else", 120,
"readStreams(null) is the default, but readStreams('2048') is the string"),
"M24": (CT, "the stream cap is the system config's compactionStreams, and a bad value takes the default", 290,
"the cap of 32 is ignored, all 34 streams are opened: [D,1,true,null] twice"),
@@ -35,7 +35,7 @@ const at = (n) => `2026-10-22T12:00:0${n}.000Z`;
test("the budget is the setting's whole number of bytes from 1 MiB to 1 GiB, and the default for anything else", () => {
assert.equal(READ_BYTES, 64 * MiB);
for (const v of [MiB, 8 * MiB, 1024 * MiB]) assert.equal(readBudget(v), v);
for (const v of [undefined, null, "8388608", 8.5 * MiB, -1, 0, MiB - 1, 1024 * MiB + 1, NaN, Infinity, {}, [MiB], true]) {
for (const v of [undefined, null, "8388608", MiB + 0.5, -1, 0, MiB - 1, 1024 * MiB + 1, NaN, Infinity, {}, [MiB], true]) {
assert.equal(readBudget(v), READ_BYTES, JSON.stringify(v) ?? String(v));
}
});
@@ -104,10 +104,12 @@ test("a claude-projects/ that can't be read records nothing, and the next collec
const f = setup(t);
writeFileSync(join(f.store.projects, "old.jsonl"), "{}\n");
chmodSync(f.store.projects, 0o000);
t.after(() => chmodSync(f.store.projects, 0o700));
assert.throws(() => f.collect(), { code: "EACCES" });
assert.throws(() => readFileSync(join(f.store.dir, LEDGER)), { code: "ENOENT" });
chmodSync(f.store.projects, 0o700);
try {
assert.throws(() => f.collect(), { code: "EACCES" });
assert.throws(() => readFileSync(join(f.store.dir, LEDGER)), { code: "ENOENT" });
} finally {
chmodSync(f.store.projects, 0o700);
}
assert.deepEqual(f.collect(), { count: null, known: false, reason: "harness-unsupported", at: at(1) });
});