docs: briefs for the re-test faults, seat git identity and review request held
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
# Faults from Jason's PM re-test on 664199f7
|
||||
|
||||
Jason's PM re-test finished on 2026-10-13 (Mos, PM run rcc0f72be8b17,
|
||||
Vikunja #228). The #229 loop worked end to end: the coder pushed
|
||||
010d30cb, the reviewer approved it after running its tests, and the PM
|
||||
closed the task. Mos listed four faults. Sage checked two of them and
|
||||
neither holds, so neither gets a row:
|
||||
|
||||
- The reviewer did run the tests. Its own transcript shows
|
||||
`node --test` in a clean worktree at 010d30cb (14 pass) eight seconds
|
||||
before its verdict. Its first prompt was the coder's REVIEW-REQUEST,
|
||||
so it didn't need the PM's later message.
|
||||
- The PM's clone wasn't stale. Row 95's landing 17ad6f35 is an ancestor
|
||||
of both commits the clone has held (4da68152 at clone, 664199f7 after
|
||||
the launch fast-forward), and `app.js` and `board-held.test.mjs` are
|
||||
tracked in it. The PM's search missed the code.
|
||||
|
||||
The other two get rows here.
|
||||
|
||||
## Seats commit under their own name
|
||||
|
||||
### Problem
|
||||
|
||||
A role session runs with HOME set to the run's empty `home/` and no git
|
||||
identity. The coder's first commit failed with "Author identity
|
||||
unknown", and the coder got past it with `git config user.name` and
|
||||
`user.email` in its clone.
|
||||
|
||||
That workaround breaks the next launch. `allowed()` in
|
||||
`packages/seat/src/checkout.mjs` keeps a clone whose config holds any
|
||||
key outside its list, so the coder's clone will be kept, not
|
||||
fast-forwarded, from now on. Its config holds both keys today.
|
||||
|
||||
A related confusion: the PM said its clone of `stack` on branch
|
||||
`refactor` had no Board code when it did. Nothing tells a seat which
|
||||
branch and commit its clone holds or when it refreshes.
|
||||
|
||||
### Owner and reviewer
|
||||
|
||||
Owner: Darkwing, after row 103 (both rows touch `packages/seat`).
|
||||
Reviewer: Dewey (a sandbox row, decision 130).
|
||||
|
||||
### Files owned
|
||||
|
||||
- `packages/seat/src/sandbox.mjs` and whichever launch file passes it
|
||||
the role and business, with their tests
|
||||
- `packages/harness/src/bundle.mjs`, one prompt line, and its test
|
||||
- `packages/seat/README.md`
|
||||
- `agents/darkwing/work/queue-<row>/`
|
||||
|
||||
### What ships
|
||||
|
||||
- Every role session's sandbox sets `GIT_AUTHOR_NAME`,
|
||||
`GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_NAME` and `GIT_COMMITTER_EMAIL`:
|
||||
the name is the role, the email `<role>@<business>.mosaic.invalid`. A
|
||||
test commits in a sandboxed clone with no config and reads the author
|
||||
back.
|
||||
- The clone's config needs no new key, so `allowed()` doesn't change.
|
||||
- The bundle prompt gets one line: the clone's branch and the commit it
|
||||
was at when the session started, that it refreshes only at launch, and
|
||||
that setting git config in it stops the next launch from updating it.
|
||||
- The README says where the identity comes from.
|
||||
|
||||
Each new check is shown to fail on a mutant that removes it.
|
||||
|
||||
Suites: the seat and harness node suites and every `scripts/test-*.sh`.
|
||||
|
||||
### Out of scope
|
||||
|
||||
Changing `allowed()`. Signing. Fixing the coder's existing clone: after
|
||||
landing, with Mos's go, Sage unsets the two keys so the next launch
|
||||
updates it again.
|
||||
|
||||
### Gate
|
||||
|
||||
Dewey approves on the row's issue, naming the candidate manifest, and
|
||||
the suites above pass on Sage's gate rerun. Decision 109 notices go to
|
||||
Mos before and after. The launch side is live only at a bus restart,
|
||||
and that needs Mos's go.
|
||||
|
||||
## A review request says whether a reviewer is running
|
||||
|
||||
### Problem
|
||||
|
||||
`review.request` in `packages/bus/src/broker.mjs` routes the
|
||||
REVIEW-REQUEST to whichever run holds the reviewer role, or to nobody
|
||||
when no run holds it. The message then waits until a run claims the
|
||||
role. The reply is the same either way.
|
||||
|
||||
In the re-test the coder asked before any reviewer held the role. The
|
||||
PM happened to launch one, which got the request as its first prompt,
|
||||
so the loop worked. But the coder couldn't tell that its request was
|
||||
waiting on nobody, and nothing told anyone to launch a reviewer. Had
|
||||
nobody launched one, the request would have sat there unseen.
|
||||
|
||||
Refusing the request isn't the fix. Delivery on claim is what lets the
|
||||
PM launch a reviewer after the coder asks, and that path worked. The
|
||||
fix is to say so.
|
||||
|
||||
### Owner and reviewer
|
||||
|
||||
Owner: Researcher (a Haiku subagent may build it, decision 129).
|
||||
Reviewer: Filbert (decision 130).
|
||||
|
||||
### Files owned
|
||||
|
||||
- `packages/bus/src/broker.mjs`, the `review.request` case only, and
|
||||
its tests
|
||||
- `packages/harness/src/tools.mjs`, the `request_review` description
|
||||
only, and its test
|
||||
- `packages/bus/README.md`, the review paragraph only
|
||||
- `agents/researcher/work/queue-<row>/`
|
||||
|
||||
### What ships
|
||||
|
||||
- The reply adds `held`: the run id holding the reviewer role when the
|
||||
request was routed, or `null`. Tests cover both, and the existing
|
||||
reply fields don't change.
|
||||
- The `review.requested` event records the same value.
|
||||
- The `request_review` description says what `null` means: no reviewer
|
||||
is running, the request waits for one, and the requester should tell
|
||||
whoever launches roles.
|
||||
- The README says the same.
|
||||
|
||||
Each new check is shown to fail on a mutant that removes it.
|
||||
|
||||
Suites: the bus and harness node suites and every `scripts/test-*.sh`.
|
||||
|
||||
### Out of scope
|
||||
|
||||
Refusing a request to an unheld role. Launching a reviewer
|
||||
automatically. The Console. Plain `message.send` to an unheld role.
|
||||
|
||||
### Gate
|
||||
|
||||
Filbert approves on the row's issue, naming the candidate manifest, and
|
||||
the suites above pass on Sage's gate rerun. Decision 109 notices go to
|
||||
Mos before and after. The bus side is live only at a bus restart, and
|
||||
that needs Mos's go.
|
||||
Reference in New Issue
Block a user