FLEET.md — the operator notifier and the fleet's wake conditions for an aging ruling #74
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#74
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #50. Blocked by #72.
Epic decision D16, and the one consequence of @danmt's ladder ruling that lands outside the repo: "the operator is notified throughout." Today nothing notifies on
needs-rulingat all.Context
The operator notifier (
notify.sh, on the triage box) watches open PRs carryingstate:needs-humanand nothing else.needs-rulinglives mostly on issues, and no poller reads it. That is not hypothetical — three escalations spent their whole lives invisible to the operator on 2026-07-23 alone:claimedand nothing else, indistinguishable from a builder mid-build.The ladder makes this sharper rather than neutral: every rung is a moment (12h, 24h, past 24h) that something must actually observe. #73 makes the rungs visible on the board, which is what wakes the fleet. This issue makes them visible to the operator, who is the one being waited on.
FLEET.md is the right home and has the precedent: it is a descriptive snapshot, explicitly "the spec for those box-side updates; until an operator makes them, the request trigger exists on paper only" (L44-L69) — exactly how the reviewer request trigger was specified before any box ran it. The deliverable is a FLEET.md edit, not a script:
~/duty/*lives inside each box and is the operator's to change; no agent in this fleet can edit or deploy it.Spec
The notifier gains a second query
Alongside the existing
state:needs-humanPR poll,notify.shpolls open issues and PRs labelledneeds-rulingacross~/duty/repos.txt. One tracked message per item, edited in place — the same one-message-per-item discipline the PR poll already uses, so an aging ruling reads as a live queue rather than a feed.The message carries what makes a ruling decidable at a glance: the item, the decision line (the escalation comment's first line), the flag's age, and the current rung. It is edited, not re-posted, as the item crosses 12h and 24h — the rung is a property of the message, not a new notification. It is removed when the flag comes off.
Rungs are the notification's content, not its trigger
D14: the clock runs from the current episode's
labeledevent. The notifier therefore reports which rung an item is on and never acts on it — no box-side script sets, clears or decides anything aboutneeds-ruling(D9, D15). A rung crossing changes the text of an existing message; it does not page again.What is worth alerting on
A
needs-rulingpast its statedDefault:deadline, or standing past 24h, is the fleet-health signal — not the flag's existence. Escalations resolved inside the window are working as designed and deserve a quiet queue entry, not an alarm.Tasks
needs-rulingsubsection to FLEET.md's Wake conditions (after the reviewer triggers), specifying the notifier's second query, the one-message-per-item edit-in-place behavior, the message contents, and the removal condition.needs-rulingolder than 24h is triage's turn to pick (#72 makes it triage's duty; the wake list is where triage learns it exists).Acceptance criteria
needs-rulingfor both the operator notifier and triage; a reader can implementnotify.sh's second query from the text without asking a question.needs-ruling.docs/VENDORED.txt, and is never mirrored to consumers.Test plan
test/run.shgreen — FLEET.md carries no executable behavior; the run proves the edit broke nothing that reads the tree.docs-sync --checkunaffected: FLEET.md is deliberately outside the manifest. Verify the manifest is untouched by the diff — adding FLEET.md to it would push a fleet snapshot into every consumer repo, which is the failure the file's own header warns about.main.Dependencies
Blocked by #72 — the rung wording is #72's to fix, and two files inventing two vocabularies for one ladder is the drift this epic exists to prevent. Sibling of #73 (board-side observation); neither blocks the other. Part of #50.
Every issue named by
Blocked byis closed. The sweep is moving this issue toready.🔨 Claiming — starting now. Epic #50's last open child after #73 landed in PR #78 (merged 16:05Z). Plan: the FLEET.md Wake conditions edit per the spec — the notifier's second query (
needs-rulingacross issues and PRs, one tracked message per item, edited in place across the rungs, removed on clearance), rung wording matched to #72's four rungs verbatim, the division-of-labor sentence vs #73, the on-paper caveat, and triage's past-24h wake condition — plus the CHANGELOG line. Draft PR shortly.For the record per BUILDER.md's picking rule: I hold two claims besides this, both parked with the next move owned elsewhere — #15 (remaining ACs operator-owned: labels dispatch + the next real cast release, declared there) and #16 (
needs-ruling, held per triage's directive). This is the one issue with build work in flight.