docs: post-retest follow-up briefs, queue add gate owner, row 88 and row 100 notes

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-13 12:23:41 -05:00
co-authored by Claude Opus 5.5
parent dff7e52610
commit ec6e398817
@@ -0,0 +1,201 @@
# Follow-ups queued behind Jason's PM re-test
Three rows filed on 2026-10-13. Each stays `queued` until Mos confirms
Jason's PM re-test is finished (Mos's ruling, 2026-10-13). Sage moves a
row to `briefed` only after that.
## Queue add names its gate owner
### Problem
`queue add` defaults `gateOwner` to `jason` when the caller passes none
(`packages/queue/src/queue.mjs`, the `add` case in apply). Sage added
row 100 at rev 942 without `--gate-owner`. The row got a Jason gate
that nobody meant and whose gate text holds nothing for Jason. After
both approvals, `move 100 done` refused, so the row went to
`waiting-on-jason`. That state's only exit is `done`, and when Sage
makes that move it needs evidence of Jason's approval. A slip put a
step in front of Jason that he never agreed to (Mos, Vikunja #257).
Non-privileged seats can't set `gateOwner` on add at all (the same
case refuses it). For them the Jason default is the fail-closed choice,
and it stays.
### Owner and reviewer
Owner: Researcher. Reviewer: Filbert (decision 130, not a sandbox row).
### Files owned
- `packages/queue/src/queue.mjs`, the `add` validation and apply only
- `packages/queue/src/cli.mjs`, the `add` usage text only
- `packages/queue/tests/`, one existing test file or a new one
- `packages/queue/README.md`, the `add` paragraph only
- `agents/researcher/work/queue-<row>/`
### What ships
- A privileged actor (`jason`, `sage`) adding a row without
`--gate-owner` is refused with a message that names the flag. The
refusal comes before the log entry is written.
- A non-privileged add is unchanged: it can't name a gate owner, and the
row's gate owner is `jason`.
- Replay of the existing log is unchanged. Every entry already in
`docs/plans/queue.json` replays to the same rows, and
`queue verify --current` passes on the current file. If the check
needs a semantics bump to tell new entries from old, say so in the
build notes.
- Tests: a privileged add without the flag is refused and writes no
entry; with it, the row carries the named owner; a non-privileged add
still gets `jason`; a log holding an old privileged add with
`gateOwner: null` still replays.
- The usage text and README say the flag is required on a privileged
add, and why.
Each new check is shown to fail on a mutant that removes it.
Suites: the queue node suite and `scripts/test-queue.sh`, then every
`scripts/test-*.sh`.
### Out of scope
Any new exit from `waiting-on-jason`. Changing row 100 or any other
existing row. Any other verb.
### Gate
Filbert approves on the row's issue, naming the candidate manifest, and
the suites above pass on Sage's gate rerun.
## Row 88 follow-up: field table header, line length and bidi escapes
### Problem
Row 88 (82414385, #1582) landed with Filbert's approval (28214) and
four non-blocking notes:
- N1. The header comment in `packages/tasks/src/fields.mjs` says the
test checks the prose against the table, but not how.
- N2. `packages/tasks/tests/fields.test.mjs` line 13 is 146 characters.
- N3. Three files carry literal bidi control characters in source where
an escape would do: `packages/webui/src/public/bus.js` line 13 (the
UNSEEN pattern), `packages/webui/tests/bus.test.mjs` line 20 and
`packages/conversation/tests/flows.test.mjs` line 495.
- N4. `inertCheck` in `packages/webui/tests/bus-browser.test.mjs`
refuses U+202A-U+202E and U+2066-U+2069 in shown text but not U+200E
and U+200F.
### Owner and reviewer
Owner: Researcher, row 88's owner. Reviewer: Filbert.
### Files owned
- `packages/tasks/src/fields.mjs`, the header comment only
- `packages/tasks/tests/fields.test.mjs`, line 13 only
- `packages/webui/src/public/bus.js`, the UNSEEN pattern only
- `packages/webui/tests/bus.test.mjs`
- `packages/conversation/tests/flows.test.mjs`, line 495 only
- `packages/webui/tests/bus-browser.test.mjs`, `inertCheck` only
- `agents/researcher/work/queue-<row>/`
### What ships
- N1: one sentence in the header naming the check the test makes.
- N2: line 13 wrapped. No other reflow.
- N3: each literal replaced by its `\u` escape, with the same code
points matched before and after. The build notes show each file's
bidi count going from its current value to zero, and the tests that
cover each pattern still pass.
- N4: U+200E and U+200F added to the `inertCheck` pattern, shown to
fail when a test injects either.
Suites: the tasks, webui and conversation node suites and every
`scripts/test-*.sh`.
### Out of scope
Any behaviour change in `bus.js` beyond the escape. Restarting the
Console.
### Gate
Filbert approves on the row's issue, naming the candidate manifest, and
the suites above pass on Sage's gate rerun. The `public/` change needs
Mos's go before landing (decision 123), and the decision 109 notices go
to Mos before and after.
## Row 100 follow-up: git kill reach, close bound and the last refusal tests
### Problem
Row 100 (664199f7, #1594) landed with approvals from Sage (28225) and
Dewey (28226). Their notes and Darkwing's build notes
(`agents/darkwing/work/queue-100/r1/build.md`) leave these gaps:
- `packages/seat/src/checkout.mjs` `git()` and the runner-side git in
`packages/harness/src/git-tools.mjs` still time out with spawn's SIGKILL, so the stale lock row
100 fixed in `working.mjs` can still happen there.
- Every timed-out git kill reaches only the direct child, not its
process group. A hook or helper git spawns can outlive it.
- `close()` in `git-socket.mjs` waits on the told sockets with no time
limit (Sage d, Dewey d).
- `send()` relies on EPIPE to classify a peer that closes with bytes
queued. The post-loop errored arm has no test; a FIFO as the file
makes it deterministic (Dewey a, Sage b, Dewey e).
- The 30 second idle refusal has no test (Dewey b).
- `have`'s within-remote date order isn't asserted; the test stays
under HAVE_MAX (Dewey c). "Newest first" holds within each clone, not
across clones, and the comment doesn't say so (Sage a).
- `startHost`'s single-host check on `host.json` isn't atomic.
- `roles/reviewer.md` doesn't point at the `nothing-to-fetch` text in
`packages/cli/README.md` (Dewey g).
### Owner and reviewer
Darkwing builds it. Dewey and Sage review.
### Files owned
- `packages/seat/src/checkout.mjs`, `packages/seat/src/working.mjs` and
their tests, `packages/seat/README.md`
- `packages/harness/src/git-tools.mjs` (its git spawn and the `have`
comment only) and its tests
- `packages/cli/src/git-socket.mjs`, `packages/cli/src/host.mjs`
(the `startHost` check only), their tests, `packages/cli/README.md`
- `roles/reviewer.md`, one pointer line only
- `agents/darkwing/work/queue-<row>/`
### What ships
- `checkout.mjs` and `git-tools.mjs` use the same SIGTERM, grace,
SIGKILL sequence as `working.mjs`, each with a test.
- Every host git runs in its own process group, and the timeout signals
the group. A test shows a child git spawns doesn't outlive the kill.
- `close()` caps its wait on told sockets at a stated constant, then
destroys them. A test with a peer that never reads shows the cap.
- A FIFO test reaches `send()`'s post-loop errored arm. The comment
states the EPIPE assumption.
- A test for the idle refusal.
- A `have` test with more working refs than HAVE_MAX and known commit
dates that asserts the order. The comment says the order is per
clone, or the loop sorts across clones; say which in the build notes.
- `startHost` takes `host.json` atomically (exclusive create or a lock),
with a test that two hosts racing leave one running.
- `roles/reviewer.md` points at the `nothing-to-fetch` text.
Each new check is shown to fail on a mutant that removes it.
Suites: every node suite and every `scripts/test-*.sh`.
### Out of scope
Any broker or schema change. Tying a push to its task's project or
assignee. gc of refused pushes.
### Gate
Dewey and Sage approve 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 landing. The cli and seat side is
live only at a bus restart, and that needs Mos's go.