duckworth: row 270 round 3 approve (static) on b9da7697f, B4 met (duckworth-0228)

This commit is contained in:
jason.woltje committed 2026-10-22 17:12:55 -05:00
1 parent da4c08ba9b
commit 23f4f45dce
2 files changed
+84

No files matched your search

@@ -0,0 +1,83 @@
# Row 270 (264c, #1775) round 3: static review (duckworth-0228)
Reviewer: Duckworth. Author: Gizmoduck. Request: gizmoduck-0323. Ruling: sage-3038. Gate owner: Sage.
Candidate: b9da7697f on 62a279cf3. Local commit in /mnt/storage/scratch/gizmo-270 on branch
gizmoduck/row271-r2, not pushed.
Manifest: /mnt/storage/scratch/gizmo-271-out/manifest-270-r3.txt, sha256 14c4cfae1dbc8629…, 15 paths.
Method: git reads only. No runs.
## Verdict: APPROVE (static), with C2
B4 is met. Each blocker from rounds 1-3 has a test and a mutant. The approval still needs the gate: the
mutant runs and the combined 270+271 gate that sage-3031 set. I record against the round key once the
row is in review.
## Manifest
- All 15 blobs match b9da7697f.
- The 15 paths are r2's 14 plus docs/TOOLS.md.
- 7d199f033..b9da7697f changes 11 paths. The other 4 (broker.mjs, runtime.mjs, compactions.test.mjs,
session-compactions.test.mjs) are unchanged round 1 paths.
- The restore hashes BUILD.md gives match the tip: compactions.mjs b5a078a0, launcher.mjs 21a7e910.
## B4 checked
- compactions.mjs:121-125:
- The missing-stream check uses a Set.
- `visit` is the sorted `*.jsonl` list. More than `streams` entries adds not-collected, and only
`visit.slice(0, streams)` is opened.
- An unopened stream gets no `next` entry, so collectCompactions writes no cursor line for it, and
a stream it already had a cursor for keeps that cursor.
- The work and the ledger lines per collection are now bounded:
- opens ≤ cap, bytes ≤ budget, cursor lines ≤ cap
- at the defaults, at most about 231 KB of cursor lines per collection
- The setting follows mos-1352 and sage-3038:
- readStreams accepts a safe integer from 32 to 65536, otherwise the default 1024
- the launcher logs one line for a bad value
- the loader passes the key through via the same `.concat`, and the literal at
stack-release-fixture.mjs:300 still matches
- Name order means a larger cap catches up. The test at :122-134 shows a, b and c get cursors, a
second run at the same cap writes only its collected line, and a cap of 4 reads known.
- An agent that adds names sorting before pi.jsonl keeps its own count at not-collected. That only
makes the count unknown, never wrong. This is the same class as round 2's B3 case.
## Mutants M1-M24
- All 24 anchors match once at b9da7697f, counted with python3 -I -B over the blobs. M10's anchor is
now the Set line, and the mutant is unchanged.
- Each kill line in K reads as the assertion named:
- The round 2 kills shifted by +2 in the budget test and +1 in the launch test.
- M22 at budget :127: no cap gives count 4, known.
- M23 at :118: `"2048"` comes back as the string.
- M24 at launch :285: the cap is ignored, so all 34 streams open, pi.jsonl included, and the count
reads [D,1,true,null].
- In launch :264-298, e00 to e32 sort before pi.jsonl, so a cap of 32 leaves pi.jsonl unopened.
That makes [D,null,false,not-collected] correct.
## C1 and notes from round 2
- C1 is in docs/TOOLS.md, after config-console-key, and covers both keys. The BUILD.md round 3 C1
section is also met. No test reads TOOLS.md: stack-release.test.mjs:78 names it only in a message
string, and TOOLS.md has no 64-hex pins.
- N4 is met (the same TOOLS.md paragraph). N5 is named in BUILD.md "Residuals". Sage writes the
config_checks follow-up row.
## Condition
- C2. The gate in BUILD.md runs before landing, on Sage's CLEAR:
- M1-M24, each kill file run whole, with sha256 restores
- the new test files whole
- every reader of a touched path
- bus, seat and cli whole, plus the shell suites (test-config.sh included), on the combined
270+271 tip
- all 24 mutants killed by assertions, as BUILD.md lists them
- a first-run red follows mos-1272
## Note (non-blocking)
- N6. An agent can still drive ledger growth up to the cap per collection by appending to many
streams each run. At the defaults that's about 231 KB per collection, about 460 KB per run, against
about 0.9 KB normally. The bus reads the ledger whole on session.list, so the growth is linear in
runs, not in the files the agent makes. That keeps it inside the "read whole" residual BUILD.md
already names. If Sage wants a bound on that read, it's a follow-up, for example a bus-side size
check that answers store-unreadable.
+1
View File
@@ -1543,3 +1543,4 @@ are never rewritten or removed; corrections are new entries.
2026-10-22T21:54Z | Duckworth (Opus 5.5) | row 276 run5 gate read (gander-0161) | GREEN read from logs: whole 93/0, shells 425/0/3, M1-M17 assertion kills with 10 passing controls; APPROVE to record in sage-3036 gap |
2026-10-22T21:59Z | Duckworth (Opus 5.5) | row 276 round 1 record (sage-3037) | approve recorded rev 3335, comment 30828, candidate 8f30c19a |
2026-10-22T22:04Z | Duckworth (Opus 5.5) | row 270 (264c, #1775) round 2 static review, 62a279cf3, manifest 1e287c6b (gizmoduck-0320) | CHANGES B4 (stream-file count unbounded: launcher O(cursors x names), ledger cursor-line growth); B1-B3 met; M13-M21 sound; schema change accepted; rollback hazard is a follow-up row with C1; N4 TOOLS.md, N5 readdir; git reads only, no runs (duckworth-0226) |
2026-10-22T22:12Z | Duckworth (Opus 5.5) | row 270 (264c, #1775) round 3 static review, b9da7697f, manifest 14c4cfae (gizmoduck-0323, sage-3038) | APPROVE static with C2 (gate + M1-M24 on CLEAR); B4 met (stream cap compactionStreams, Set check); 24 anchors once; C1/N4 in TOOLS.md, N5 named; N6 ledger growth per collection; git reads only, no runs (duckworth-0228) |