diff --git a/agents/duckworth/work/row307/BUILD1-1f00d4f91.md b/agents/duckworth/work/row307/BUILD1-1f00d4f91.md new file mode 100644 index 000000000..17b2368b7 --- /dev/null +++ b/agents/duckworth/work/row307/BUILD1-1f00d4f91.md @@ -0,0 +1,109 @@ +# Row 307 (#1814, Vikunja 598) build round 1 (duckworth-0284) + +Reviewer: Duckworth. Builder: Gizmoduck. Request: gizmoduck-0408. Old-test ruling: mos-1459. +Candidate: gizmoduck/row307 at 1f00d4f91. The red-first commit is 1f6db1589 and the build is 44104adb1. +1f6db1589's parent is cb048b93c, the folded design, and that commit sits on base 1e629c892. +Method: git reads of local objects only. No node, no tests, no fetch. No manifest digest has been +posted yet. The sha256 prefixes below are the blobs at 1f00d4f91, and the manifest round checks the +posted digest against them. + +## Verdict: APPROVE (static), with C1 and C2 + +- **Scope.** `git diff --stat 1e629c892 1f00d4f91` lists 16 paths. harness.test.mjs, + cli helpers.mjs, launch-routes.test.mjs and launcher.test.mjs are not among them. 1f6db1589 adds + only the packet, capture.mjs and the two new tests. 44104adb1 adds no test file beyond the four + ruled ones. +- **The four old-test edits are inside mos-1459.** Each adds import lines in the import block and + changes nothing else outside the ruled spans: + - kinds.test.mjs:20: `"compactions"` appended to the pinned list. + - compactions.test.mjs:14-15 imports, :23 `collect` helper only. + - compactions-budget.test.mjs:15 import, :26 `collect` helper only. + - compactions-launch.test.mjs:31 import, :345 (base :344) call only. `.count, 1` is kept. + No expected value, assertion or test name changes. The only non-pi `collect` argument in either + seat file is `"claude"` at compactions.test.mjs:201 (base :197), and `{ pi, claude }` maps it. The + ledger's `harness` field stays `"claude"`, as base wrote it. +- **The move is faithful.** pi/compactions.mjs:33-140 is base seat/src/compactions.mjs:90-197 line + for line, except scanPi's signature: it is no longer exported and has no defaults. Its one caller + passes all four arguments. claudeHistory (:142-153) matches base :238-249. The reason order (:29) + and the Claude-history branch (:158-162) match base :278-305. Core passes `first: prior === null`, + which is base's `!prior`. No source, script or test imports scanPi, PI_VERSION or claudeHistory + from the seat module any more. The PI_VERSION hits that remain are conversation/pi-pin.mjs's own + constant and scripts/agent-host-dev.sh. +- **Core names no harness.** harness.test.mjs:171's NAMED regex matches no line of the new + seat/src/compactions.mjs (`grep -E` rc=1). readLedger:113 reads `r.reason` only. +- **Core checks the answer before it writes.** collectCompactions (:174-205) calls the export, runs + checkAnswer (:147-164), throws with the harness name before the open, and then writes the same + lines in the same order as base. The launcher closure (:309-321) calls it outside `call()`, and + the N1 comment says why. Its catch still records store-unreadable. Both call sites (:512, :653) + pass the `harness` that startLocked takes from `check()` at :506. +- **Fixtures need no edit.** cli fakeHarnesses (helpers.mjs:137-146) and launcher.test.mjs:696-697 + build modules with `export * from` the real index, so `compactions` passes through. launch-routes' + `broken` still refuses at `levels`. The plugins and cli scratch trees copy only `src/` and import + the real index by absolute URL, so pi/index.mjs's `./compactions.mjs` re-export resolves. + runtime.mjs:74 lists harness directory names only. scripts/stack-copy.sh copies packages/plugins + whole. +- **The brief's three tests are there.** + - One ledger per reason row 270 writes: compactions-ledger.test.mjs FIXTURES, seven ledgers. Test + A reads `compactionCount`. capture.mjs checks each ledger byte for byte, and each `count`, + against base's code, which gives the "before" half. + - pi's module counts a stream as scanPi does, with the budget and the cap: + harness-compactions.test.mjs CASES `budget` and `cap`, plus `plain`, `shrank` and `header`, which + capture.mjs checks against base scanPi. + - Missing export refuses at load: harness-compactions.test.mjs:65-75. +- **Test B's change from DESIGN.md:189.** I agree with it. Over an empty session, every fixture with + a cursor goes store-incomplete because its stream went away. I worked the seven `next` values by + hand against the new core and the moved scan, and all seven hold. DESIGN.md can stay as it is, + since BUILD.md records the change. +- **Mutants.** M1 is killed by harness.test.mjs:192 (source text). M2 is killed by + compactions-budget.test.mjs:87 and the `first` test at harness-compactions.test.mjs:47. M3 is killed + by test B for `claude-code` and `claude-history`, which would go known, and by + compactions.test.mjs:203. M4 is killed by compactions-ledger.test.mjs:151-167. +- **Expected red on 1f6db1589.** BUILD.md's list matches what base does with an object as the + harness: it takes it as non-pi and writes harness-unsupported. That gives three test B reds, plus + the malformed-answer and argument tests, plus the TypeErrors and the loader pass in the plugins + file. + +## Conditions + +- **C1** Sage's gate on the BUILD.md run plan: + - capture.mjs prints `all match`. + - The red-first runs show the reds BUILD.md lists and no others. + - The bus, cli, plugins, webui, business and seat suites each run whole. Plugins has zero + failures. + - Every scripts/test-*.sh runs. + - The cli TAP shows compactions-launch's T3 tests at :207, :306 and :345 run, and the cli run ends + with `ℹ skipped 0`. + - M1-M4 are killed. + Any red in an old test goes to Sage unfixed, and from there to Mos. +- **C2** The manifest posted for the round has these 16 paths and these blobs. If any blob + changes, the round reopens on the delta. + +``` +e3f7a6838ef0d869 agents/gizmoduck/work/queue-307/BUILD.md +a5a4adb9207f5d53 agents/gizmoduck/work/queue-307/DESIGN.md +3b05066c471757aa agents/gizmoduck/work/queue-307/capture.mjs +6455b8042317e6dd packages/cli/src/launcher.mjs +ddada50d681093ef packages/cli/tests/compactions-launch.test.mjs +cbfd206f9ab94098 packages/plugins/README.md +a317ac544359d321 packages/plugins/harness/claude-code/index.mjs +aabaf5c4602e28f0 packages/plugins/harness/pi/compactions.mjs +39c225f157b8f66b packages/plugins/harness/pi/index.mjs +f0acac67a6a4ef83 packages/plugins/src/kinds.mjs +b4e7e8e0cd98ed1e packages/plugins/tests/harness-compactions.test.mjs +75a61934626cb471 packages/plugins/tests/kinds.test.mjs +c5de99284b8fa617 packages/seat/src/compactions.mjs +e486fc33578e0157 packages/seat/tests/compactions-budget.test.mjs +3d70516cee9f71b4 packages/seat/tests/compactions-ledger.test.mjs +957f4a75ea765a4e packages/seat/tests/compactions.test.mjs +``` + +## Notes (non-blocking) + +- **N1 (row 270 behaviour, outside 307).** The `store-unreadable` fixture's `next` is known with + count 0. The first collection moves the stream's cursor past the line that wasn't a session + header. The next collection starts at the cursor with `header = from > 0` (pi/compactions.mjs:87) + and doesn't check the header again. readLedger doesn't keep store-unreadable, so the count goes + known. Base does the same, and 307 is a move, so it is right to keep it. The new test now pins + it. If Sage wants unreadable to stick, that's a follow-up row, and it changes this expected + value. +- **N2** The README contract bullet and kinds.mjs:52-53 agree with checkAnswer. Doc only. diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index ff60f4b3d..98fcf0e37 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1559,3 +1559,4 @@ are never rewritten or removed; corrections are new entries. 2026-10-23T12:08Z | Duckworth (Opus 5.5) | row 300 round 2 delta review (db5122920, digest db8be52c, sage-3412) | approve: call() resolves headers again, no assertion change; round 1 miss of the missing headers field recorded; C1 carried (duckworth-0268) | 2026-10-23T12:18Z | Duckworth (Opus 5.5) | row 301 round 2 fixture delta review (acc97fb9c, digest 6e1e4fcd, launchpad-0115, mos-1451) | approve: one appended throwing-stub line in each of library-cli and thread-claims, stub sweep clean, round 1 miss recorded; C1 gate (duckworth-0274) | 2026-10-23T13:17Z | Duckworth (Opus 5.5) | row 307 design round 1 (67daf6403 DESIGN.md on base 1e629c892, gizmoduck-0403) | approve: ledger compat holds on all three row 270 collected lines, interfaceVersion 1 accepted, fixture list complete; C1 seat suite whole in the gate, C2 no compactions-launch skips; N1 launcher comment, N2 line refs (duckworth-0279) | +2026-10-23T13:30Z | Duckworth (Opus 5.5) | row 307 build round 1 static review on 1f00d4f91 (gizmoduck-0408) | APPROVE (static), C1 gate per BUILD.md run plan, C2 manifest blobs; mos-1459 edits in bounds; N1 row 270 store-unreadable not sticky (follow-up), N2 doc |