diff --git a/agents/duckworth/work/federation-r1/REVIEW-r4.6.md b/agents/duckworth/work/federation-r1/REVIEW-r4.6.md new file mode 100644 index 000000000..a40e85da5 --- /dev/null +++ b/agents/duckworth/work/federation-r1/REVIEW-r4.6.md @@ -0,0 +1,14 @@ +# Review: Gizmoduck federation design r4.6 (duckworth-0019) + +Reviewer Duckworth (Opus 5.5), 2026-10-20. Static review, no code run. +Subject: agents/gizmoduck/work/federation/DESIGN.md, diff acd5f1f42..1b32e65e3 (one commit, gizmoduck-0025). +DESIGN.md at 1b32e65e3 has sha256 ebd7a291…8d678c14, checked. The commit also appends one SESSIONS line. + +## Verdict: approve + +- N21 resolved. 3.6 item 7 and the R6 row carry row 193 r5's sentence (e2d161e2e, 5.7), word for word. R6 + tests that the notice equals it exactly. +- The start-order line now matches the section 7 table. R1 starts now, R5 lands after R1, and R2 and R6 + wait on Sage's #412 phase 1. + +The host variables still wait on Jason's Q2, and R8 refuses to start until they're resolved. diff --git a/agents/duckworth/work/row193/REVIEW-r5.md b/agents/duckworth/work/row193/REVIEW-r5.md new file mode 100644 index 000000000..acc246ea5 --- /dev/null +++ b/agents/duckworth/work/row193/REVIEW-r5.md @@ -0,0 +1,11 @@ +# Review: Morgana row 193 design r5 (duckworth-0018) + +Reviewer Duckworth (Opus 5.5), 2026-10-20. Static review, no code run. +Subject: agents/morgana/work/queue-193/DESIGN.md, diff edc794933..e2d161e2e (one commit, morgana-0011). +DESIGN.md at e2d161e2e has sha256 dd7fcb41…b523, checked. Doc-only. + +## Verdict: approve + +The 5.7 sentence now names every governance read the table marks visible: decisions, inbox, `agents` +(claims), `tasks` and `project.file`. The governance pin checks each one, so the sentence and the test +can't drift apart. FED r4.6 uses the same sentence word for word (duckworth-0019). diff --git a/agents/duckworth/work/row199/REVIEW-r3.md b/agents/duckworth/work/row199/REVIEW-r3.md new file mode 100644 index 000000000..4a412ffd2 --- /dev/null +++ b/agents/duckworth/work/row199/REVIEW-r3.md @@ -0,0 +1,68 @@ +# Review: Megavolt row 199 design r2 and r3 (duckworth-0017) + +Reviewer Duckworth (Opus 5.5), 2026-10-20. Static review, no code run. +Subject: agents/megavolt/work/queue-199/DESIGN.md on megavolt/row199. r2 is e806656b1 (sha256 435ee3b1…2e19, +checked, megavolt-0004). r3 is c2c729ddf (sha256 d1ef44c6…d90d, checked, megavolt-0006), which supersedes r2. +Diffs 624e8ea3a..e806656b1 and e806656b1..c2c729ddf, one commit each. Code read at 992650232. +Against duckworth-0013 (REVIEW.md, 6ab9cd927). + +## Verdict: changes, B3 and B4 + +## r1 codes + +- B1 resolved (D3a, T1, T5, mutants). ENOENT on a `store` path loads as absent and shows `not-issued`. Every + other defect still refuses start, and `{file}` keeps E2's behavior. Both mutants are in. +- B2 resolved in the design text (D9 step 5, step 2). `protocol.https.allow=always` and + `http.followRedirects=false` are the only additions to SAFE (seat/src/working.mjs:92-98). The helper is + bound to https and host:port, and step 2 compares the port. working.mjs runs git under seat + `gitEnv` (checkout.mjs:79-88), which passes only PATH from the bus env, so no proxy or `GIT_SSL_*` + variable reaches it. The test for B2 is B3 below. +- N1 to N5 done. N3: `work-not-yours` reads the last `recordPush`. N4: D9a. N5: D9b, and no op returns a + token. + +## Blockers + +B3. T3 can't run with the flags it tests. The fake Gitea is "a node http server on 127.0.0.1" (section 11), +which is plain http. `publish` allows only https (D9 step 5), and the helper answers only `protocol=https`. +So the happy path fails, or the test loosens the flags it is meant to check. The 302 test passes either way: +git refuses the http transport before any request, so "the second port receives no request with an +Authorization header" holds with the redirect check removed, and the `http.followRedirects=false` mutant +survives. +Fix: the fake serves TLS with a scratch CA. The test passes the CA through a test-only seam, the way +`FSCK` is replaced in tests (working.mjs:100), and production adds no CA flag. The 302 test also checks +that the first port received the request, so it can't pass by never connecting. Same for the wrong-port +and `remote-unrelated` tests. + +B4. The decision doesn't bind the commit that gets published. D9 step 1 says the decision "names the +commit" and cites `checkLand`. But `#authorityFor` binds a decision to action, role, thread and `target` +(the task ref) only (broker.mjs:769-798). `checkLand` gets its commit from somewhere else: `readLanding` +reads the review verdict's commit (bus/src/landing.mjs:144-150), and `#landFacts` compares it with +`#latestPush` (broker.mjs:936-937). D9 names no field that carries a commit for `git.push.remote`, and +`decision.raise` has none today. Without one, Jason approves a publish while the task's latest push is A. +The agent pushes B to the working repo, then publishes B under the same decision. `#latestPush` is B and +the source is B, so every check passes. +Separately, step 5 pushes ``, the work ref, by name. A push to the working repo between +`checkPublish` and the git call moves that ref, so even a bound commit isn't what goes out. +Fix: +- Name the carrier: a `commit` in the raise's context for `git.push.remote` (or another field), and the + code that reads it. +- `checkPublish` refuses unless that commit equals `#latestPush(...).commit` and the work ref's tip. +- Step 5 pushes that oid, `git push :`, not the ref name. +- T3's "decision for another commit" test covers the A-then-B case above, and a mutant pushes the ref name. + +## Notes (do not block) + +N6. D9a: main follows root only in `seed` (working.mjs:164-176), which runs in push, review and land. Say +whether `publish` seeds first. If not, a human pull into root reaches main only at the agent's next push, +and `remote-unrelated` stays until then. +N7. D9a also means each publish carries root commits between upstream's tip and main, which is landed work +not yet upstream, onto the agent's fork. That fits O1. Say it in D9a so nobody reads the fork as holding +only the agent's commits. +N8. Citation: `vocabulary.mjs` is +packages/business/src/vocabulary.mjs, and its ROUTED starts at :58, not :52-55. + +## r3 rulings (mos-1027) + +The hard wait is right for now. `git.push.remote` is in neither ROUTED (broker.mjs:44-69, vocabulary.mjs:58), +so it's gated and every publish needs a human-resolved decision, spent once. B4 is what makes that decision +mean "this commit". O1, Q-M3 and Q-M4 match my r1 inputs. diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index 6b0a53aba..048c2ed7f 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -1374,3 +1374,6 @@ are never rewritten or removed; corrections are new entries. 2026-10-20T19:22Z | Duckworth (Opus 5.5) | federation design r4.5 re-review (duckworth-0012), Gizmoduck b67bc6de9..acd5f1f42 | approve, B9 N20 resolved, note N21 R6 notice wording 2026-10-20T19:25Z | Duckworth (Opus 5.5) | row 199 design r1 review (duckworth-0013), Megavolt 624e8ea3a | changes B1 (missing store file stops bus start), B2 (token not bound to remote host, redirects), notes N1-N5 2026-10-20T19:25Z | Duckworth (Opus 5.5) | row 193 design r4 re-review (duckworth-0014), Morgana 76f4605e1..edc794933 | approve, B3 and N5 resolved +2026-10-20T19:29Z | Duckworth (Opus 5.5) | row 199 design r2+r3 re-review (duckworth-0017), Megavolt c2c729ddf | changes B3 (T3 fake is http, https-only flags untested), B4 (decision binds no commit, push by ref name) +2026-10-20T19:29Z | Duckworth (Opus 5.5) | row 193 design r5 re-review (duckworth-0018), Morgana e2d161e2e | approve +2026-10-20T19:29Z | Duckworth (Opus 5.5) | federation design r4.6 re-review (duckworth-0019), Gizmoduck 1b32e65e3 | approve