Merge pull request #153 from claude-bot-andresmgsl/build/149-fleet-reviewer-wake

docs: FLEET.md's reviewer wake describes the deployed requested_reviewers sweep
This commit is contained in:
Daniel Marin 2026-07-24 15:40:42 +01:00 committed by GitHub
commit cb5bfb1e01
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 33 additions and 14 deletions

View file

@ -6,7 +6,12 @@
> the vendored doctrine set (`.ceremony/`) and is never mirrored to consumer > the vendored doctrine set (`.ceremony/`) and is never mirrored to consumer
> repos. The doctrine files (AGENTS.md, TRIAGE.md, BUILDER.md, REVIEWER.md, > repos. The doctrine files (AGENTS.md, TRIAGE.md, BUILDER.md, REVIEWER.md,
> LABELS.md, CONTRIBUTING.md) say what roles *must* do; this file says how the > LABELS.md, CONTRIBUTING.md) say what roles *must* do; this file says how the
> current bench *physically* does it. > current bench *physically* does it. Last reconciled against the deployed
> duty scripts at
> [`heavy-duty/crew@b2fd864`](https://github.com/heavy-duty/crew/tree/b2fd8642e7f7aa8dc9de6b44edadbe1dc557b140)
> (private to the org; the fleet can read it), 2026-07-24 — a descriptive
> file with no reconciliation stamp gives the next reader nothing to diff,
> which is exactly how the #149 drift went unnoticed.
## The roster ## The roster
@ -34,9 +39,12 @@ Every box runs the same skeleton, adapted to its CLI:
triage box adds an hourly hygiene sweep under its own lock. Holding the lock triage box adds an hourly hygiene sweep under its own lock. Holding the lock
is load-bearing: a tick that acquires it *knows* nothing else is running on is load-bearing: a tick that acquires it *knows* nothing else is running on
this identity. this identity.
- **Poll:** the script reads `~/duty/repos.txt` (the repo registry — adding a - **Poll:** the script reads `~/duty/repos.txt` and queries GitHub with `gh`
repo is adding a line) and queries GitHub with `gh` for work matching the for work matching the box's role. Whose registry that file is depends on
box's role. the role: the triage box's `repos.txt` **is** its registry — adding a repo
is adding a line — while a reviewer's registry is the org itself, and its
`repos.txt` is a backstop that cannot scope it (grok's copy says so in its
own first line).
- **Act:** when there is work, the script launches the box's CLI as a one-shot - **Act:** when there is work, the script launches the box's CLI as a one-shot
session with a role prompt; the session does the work via `gh` as the box's session with a role prompt; the session does the work via `gh` as the box's
own identity, then exits. Sessions are stateless and disposable — all state own identity, then exits. Sessions are stateless and disposable — all state
@ -95,13 +103,21 @@ absent, so the wiring can be verified live the day the row lands.
fully approved (write the closing summary, flip to `state:needs-human`, fully approved (write the closing summary, flip to `state:needs-human`,
request the human), my PR `CONFLICTING` (rebase; never act on `UNKNOWN` request the human), my PR `CONFLICTING` (rebase; never act on `UNKNOWN`
post-merge flap). post-merge flap).
- **Reviewers**, in priority order: first, a review requested on me in any - **Reviewers**, one candidate set from two merged sources. Source 1,
repo (`gh search prs --review-requested=@me --state=open`); second, the authoritative: every open PR in the `heavy-duty` org **plus the named bot
repo-list poll for an open PR by someone else whose head I have not yet forks** that lists me in `requested_reviewers`, enumerated straight from
reviewed. Both triggers keep the existing one-verdict-per-head rule, the pulls API — never `gh search`, whose index lags (cast#143,
deduplicated against my own latest review's SHA rather than the search index incubator#25 and box#164 each sat unreviewed behind it). A review request
(it lags). The request trigger runs first because it reaches repos the list is authorization, so no repo filter may gate it. Source 2, backstop: the
does not name. `repos.txt` poll for an open PR by someone else whose head I have not yet
reviewed — it only **adds** candidates the sweep may have missed (an
org-enumeration failure, say) and never concludes "nothing to do". The
sources are merged and deduplicated by (repo, PR) **before** acting, not
run as sequential passes — the sequential shape double-announced on
ceremony#32, when the request sweep and the repo-list poll each acted on
the same PR in one tick (operator protocol 2026-07-23) — and worked
oldest-first. Unchanged: one verdict per head, deduplicated against my
own latest review's SHA.
#### The operator notifier — the `needs-ruling` queue #### The operator notifier — the `needs-ruling` queue
@ -149,9 +165,11 @@ the notifier and triage's past-24h wake above *report and pick up* what the
board already shows; the label itself moves only by the doctrine's hands. board already shows; the label itself moves only by the doctrine's hands.
`~/duty/repos.txt` and the duty scripts live inside each box and are the `~/duty/repos.txt` and the duty scripts live inside each box and are the
operator's to change. This descriptive edit is the spec for those box-side operator's to change; this descriptive edit is the spec for those box-side
updates; until an operator makes them, the request trigger and the notifier's updates. The reviewers' request sweep is one such spec made real — deployed
`needs-ruling` queue exist on paper only. on all four reviewer boxes since 2026-07-23 (the Reviewers wake above). The
notifier's `needs-ruling` queue is still on paper only: `notify.sh`'s one
label filter today is `state:needs-human`.
### Resilience ### Resilience

1
changelog.d/149.md Normal file
View file

@ -0,0 +1 @@
- FLEET.md — the Reviewers wake describes the deployed sweep, not the `gh search` trigger the bench replaced: the pulls-API `requested_reviewers` sweep across the org plus the named bot forks is source 1, the `repos.txt`/search poll an adds-only backstop, and the two are merged and deduplicated by (repo, PR) before acting. Only the notifier's `needs-ruling` queue remains on paper; `repos.txt` is the registry only on the triage box; and the Status block now stamps the crew ref the file was last reconciled against (#149).