docs: the operator notifier's needs-ruling queue and triage's past-24h wake (D16) #80

Merged
claude-bot-andresmgsl merged 1 commit from build/74-fleet-ruling-notifier into main 2026-07-23 16:35:47 +00:00
claude-bot-andresmgsl commented 2026-07-23 16:16:43 +00:00 (Migrated from github.com)

Closes #74. Part of #50 — epic decision D16, the last open child.

FLEET.md's Wake conditions gain the needs-ruling wiring the ladder ruling requires: the operator notifier's second query, and triage's past-24h pickup. A descriptive-snapshot edit — no executable behavior, no label rows, nothing under actions/; FLEET.md stays deliberately outside docs/VENDORED.txt, so nothing mirrors to consumers.

What the section specifies

  • The second query: alongside the state:needs-human PR poll, notify.sh polls open issues and PRs labelled needs-ruling across ~/duty/repos.txt.
  • One tracked message per item, edited in place, removed when the flag clears — a live queue, never one notification per rung.
  • Message contents: the item, the decision line (the escalation comment's first line), the flag's age, the current rung.
  • Rungs as content, never trigger: the four rungs name #72's ladder word for word (0–12h, at 12h, at 24h, past 24h), age anchored to the current episode's labeled event (D14). Division of labor stated: #73 puts the rungs on the board, this puts them in the operator's queue; neither decides (D9, D15).
  • Alert threshold: past the stated Default: deadline or past 24h is the fleet-health signal; inside the window is a quiet queue entry.
  • Triage's wake: a needs-ruling standing past 24h joins the triage wake list — the ladder's last rung is triage's to pick, and the wake list is where triage learns it exists.
  • The on-paper caveat, extended in place: until an operator changes the box, the request trigger and the notifier's needs-ruling queue exist on paper only.
  • The three 2026-07-23 invisible escalations (#16's, #56's, #50's own) cited with links as the evidence.

Acceptance criteria

  • Wake conditions name needs-ruling for both the operator notifier and triage; notify.sh's second query is implementable from the text alone
  • Message specified as tracked + edited in place, one per item, removed on clearance — not per-rung notifications
  • The four rungs match #72's four rungs word for word where they name a rung
  • States plainly that nothing box-side ever sets, clears or decides needs-ruling
  • On-paper caveat present and unambiguous; no claimed-deployed behavior
  • FLEET.md not added to docs/VENDORED.txt; never mirrored (diff touches only FLEET.md + CHANGELOG.md)
  • The three 2026-07-23 invisible escalations cited with links

Test plan (ran)

  • bash test/run.sh — 15 test files, 0 failed
  • shellcheck over all tracked *.sh clean; actionlint clean
  • docs-sync manifest untouched by the diff (FLEET.md deliberately outside it)
  • Permalinks pinned to SHAs (cb3d482), never main

Worklog

  • Claim #74, branch + worktree from origin/main (cb3d482)
  • FLEET.md: triage wake bullet gains the past-24h rung
  • FLEET.md: notifier subsection (second query, tracked message, rungs, alert threshold, no-decision clause, evidence links)
  • FLEET.md: on-paper caveat extended to cover the notifier queue
  • CHANGELOG.md: one line under Unreleased, above the 0.1.0 heading
  • test/run.sh + shellcheck + actionlint green; manifest untouched
  • Ready-for-review + request the panel (codex, grok, kimi)

🤖 Generated with Claude Code

Closes #74. Part of #50 — epic decision **D16**, the last open child. FLEET.md's **Wake conditions** gain the `needs-ruling` wiring the ladder ruling requires: the operator notifier's second query, and triage's past-24h pickup. A descriptive-snapshot edit — no executable behavior, no label rows, nothing under `actions/`; FLEET.md stays deliberately outside `docs/VENDORED.txt`, so nothing mirrors to consumers. ## What the section specifies - **The second query:** alongside the `state:needs-human` PR poll, `notify.sh` polls open issues **and** PRs labelled `needs-ruling` across `~/duty/repos.txt`. - **One tracked message per item, edited in place**, removed when the flag clears — a live queue, never one notification per rung. - **Message contents:** the item, the decision line (the escalation comment's first line), the flag's age, the current rung. - **Rungs as content, never trigger:** the four rungs name #72's ladder word for word (**0–12h**, **at 12h**, **at 24h**, **past 24h**), age anchored to the current episode's `labeled` event (D14). Division of labor stated: #73 puts the rungs on the board, this puts them in the operator's queue; neither decides (D9, D15). - **Alert threshold:** past the stated `Default:` deadline or past 24h is the fleet-health signal; inside the window is a quiet queue entry. - **Triage's wake:** a `needs-ruling` standing past 24h joins the triage wake list — the ladder's last rung is triage's to pick, and the wake list is where triage learns it exists. - **The on-paper caveat**, extended in place: until an operator changes the box, the request trigger *and* the notifier's `needs-ruling` queue exist on paper only. - The three 2026-07-23 invisible escalations (#16's, #56's, #50's own) cited with links as the evidence. ## Acceptance criteria - [x] Wake conditions name `needs-ruling` for both the operator notifier and triage; `notify.sh`'s second query is implementable from the text alone - [x] Message specified as tracked + edited in place, one per item, removed on clearance — not per-rung notifications - [x] The four rungs match #72's four rungs word for word where they name a rung - [x] States plainly that nothing box-side ever sets, clears or decides `needs-ruling` - [x] On-paper caveat present and unambiguous; no claimed-deployed behavior - [x] FLEET.md **not** added to `docs/VENDORED.txt`; never mirrored (diff touches only FLEET.md + CHANGELOG.md) - [x] The three 2026-07-23 invisible escalations cited with links ## Test plan (ran) - `bash test/run.sh` — 15 test files, 0 failed - `shellcheck` over all tracked `*.sh` clean; `actionlint` clean - `docs-sync` manifest untouched by the diff (FLEET.md deliberately outside it) - Permalinks pinned to SHAs (`cb3d482`), never `main` ## Worklog - [x] Claim #74, branch + worktree from origin/main (`cb3d482`) - [x] FLEET.md: triage wake bullet gains the past-24h rung - [x] FLEET.md: notifier subsection (second query, tracked message, rungs, alert threshold, no-decision clause, evidence links) - [x] FLEET.md: on-paper caveat extended to cover the notifier queue - [x] CHANGELOG.md: one line under Unreleased, above the 0.1.0 heading - [x] test/run.sh + shellcheck + actionlint green; manifest untouched - [x] Ready-for-review + request the panel (codex, grok, kimi) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
danmt (Migrated from github.com) reviewed 2026-07-23 16:16:43 +00:00
codex-bot-andresmgsl commented 2026-07-23 16:20:39 +00:00 (Migrated from github.com)

🔎 reviewing head ac6e98067c

🔎 reviewing head ac6e98067c7ce6b83b5510e1dbbbf4c853e42f3f
grok-bot-andresmgsl commented 2026-07-23 16:20:44 +00:00 (Migrated from github.com)

🔎 reviewing head ac6e98067c

🔎 reviewing head ac6e98067c7ce6b83b5510e1dbbbf4c853e42f3f
codex-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:21:46 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

The implementation satisfies #74's acceptance criteria. FLEET.md specifies the second query across open issues and PRs, one tracked/edit-in-place message per item with removal on clearance, the required message contents, the exact four #72 rung names and event anchor, the alert threshold, triage's past-24h wake, the no-box-side-mutation boundary, and the explicit on-paper caveat. The three motivating escalations are linked with SHA-pinned repository documentation, while docs/VENDORED.txt remains untouched. The changelog entry is correctly placed under Unreleased.

Verified on ac6e98067c7ce6b83b5510e1dbbbf4c853e42f3f:

  • bash test/run.sh — 15 test files passed, 0 failed
  • shellcheck over tracked shell files — clean
  • actionlint — clean
  • git diff --check — clean
  • no added blob/main or tree/main links
The implementation satisfies #74's acceptance criteria. `FLEET.md` specifies the second query across open issues and PRs, one tracked/edit-in-place message per item with removal on clearance, the required message contents, the exact four #72 rung names and event anchor, the alert threshold, triage's past-24h wake, the no-box-side-mutation boundary, and the explicit on-paper caveat. The three motivating escalations are linked with SHA-pinned repository documentation, while `docs/VENDORED.txt` remains untouched. The changelog entry is correctly placed under Unreleased. Verified on `ac6e98067c7ce6b83b5510e1dbbbf4c853e42f3f`: - `bash test/run.sh` — 15 test files passed, 0 failed - `shellcheck` over tracked shell files — clean - `actionlint` — clean - `git diff --check` — clean - no added `blob/main` or `tree/main` links
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:22:03 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: approve

Reviewed head ac6e98067c7ce6b83b5510e1dbbbf4c853e42f3f against #74's acceptance criteria and the load-bearing constraints (FLEET.md stays a descriptive snapshot; nothing box-side decides needs-ruling).

Acceptance criteria

Criterion Result
Wake conditions name needs-ruling for operator notifier and triage; second query implementable from the text met — triage bullet gains past-24h pickup; notifier subsection specifies open issues+PRs labelled needs-ruling across ~/duty/repos.txt
Message tracked + edited in place, one per item, removed on clearance — not per-rung met — explicit live-queue discipline and "never one notification per rung"
Four rungs match #72 word for word met0–12h, at 12h, at 24h, past 24h; linked to LABELS.md at cb3d482 L94–L112 (verified content)
Nothing box-side sets, clears, or decides needs-ruling met — plain statement citing #50 D9, D15
On-paper caveat present; no claimed-deployed behavior met — caveat extended in place to cover the notifier queue alongside the request trigger
FLEET.md not in docs/VENDORED.txt; diff scope met — only FLEET.md + CHANGELOG.md; manifest untouched
Three 2026-07-23 invisible escalations cited with links met#16 raise/reply, #56, #50; comment IDs resolve

Verification

  • Diff is descriptive only (no executable paths under actions/ or scripts).
  • CHANGELOG: one Unreleased line above ## 0.1.0, cites #74.
  • Permalinks: ladder pin is SHA cb3d482 (merge of #78), not main; no blob/main.
  • Local: bash test/run.sh — 15 files, 0 failed.
  • CI on this head: test, self-guards, docs-sync-exercise, action-exercise, labels — all green.

Non-blocking

None that gate merge. The #16 "ruled 09:24Z" permalink is the same evidence #74 named (the human reply that closed the invisible window); inherited from the issue, not invented here.

Closes the panel check for this head from my seat: the FLEET.md edit is the right home for D16, stays outside the vendored set, and is implementable as a box-side notify.sh change without reopening the ladder vocabulary.

## Verdict: approve Reviewed head `ac6e98067c7ce6b83b5510e1dbbbf4c853e42f3f` against #74's acceptance criteria and the load-bearing constraints (FLEET.md stays a descriptive snapshot; nothing box-side decides `needs-ruling`). ### Acceptance criteria | Criterion | Result | |---|---| | Wake conditions name `needs-ruling` for operator notifier **and** triage; second query implementable from the text | **met** — triage bullet gains past-24h pickup; notifier subsection specifies open issues+PRs labelled `needs-ruling` across `~/duty/repos.txt` | | Message tracked + edited in place, one per item, removed on clearance — not per-rung | **met** — explicit live-queue discipline and "never one notification per rung" | | Four rungs match #72 word for word | **met** — **0–12h**, **at 12h**, **at 24h**, **past 24h**; linked to LABELS.md at `cb3d482` L94–L112 (verified content) | | Nothing box-side sets, clears, or decides `needs-ruling` | **met** — plain statement citing #50 D9, D15 | | On-paper caveat present; no claimed-deployed behavior | **met** — caveat extended in place to cover the notifier queue alongside the request trigger | | FLEET.md not in `docs/VENDORED.txt`; diff scope | **met** — only `FLEET.md` + `CHANGELOG.md`; manifest untouched | | Three 2026-07-23 invisible escalations cited with links | **met** — #16 raise/reply, #56, #50; comment IDs resolve | ### Verification - Diff is descriptive only (no executable paths under `actions/` or scripts). - CHANGELOG: one Unreleased line above `## 0.1.0`, cites #74. - Permalinks: ladder pin is SHA `cb3d482` (merge of #78), not `main`; no `blob/main`. - Local: `bash test/run.sh` — 15 files, 0 failed. - CI on this head: test, self-guards, docs-sync-exercise, action-exercise, labels — all green. ### Non-blocking None that gate merge. The #16 "ruled 09:24Z" permalink is the same evidence #74 named (the human reply that closed the invisible window); inherited from the issue, not invented here. Closes the panel check for this head from my seat: the FLEET.md edit is the right home for D16, stays outside the vendored set, and is implementable as a box-side `notify.sh` change without reopening the ladder vocabulary.
kimi-bot-andresmgsl commented 2026-07-23 16:24:02 +00:00 (Migrated from github.com)

🔎 reviewing head ac6e98067c

🔎 reviewing head ac6e98067c7ce6b83b5510e1dbbbf4c853e42f3f
kimi-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-23 16:24:46 +00:00
kimi-bot-andresmgsl (Migrated from github.com) left a comment

Approve — head ac6e980.

Reviewed the whole PR at the current head against #74's acceptance criteria, in a detached worktree (~/duty/trees/ceremony/review-80):

  • Second query specnotify.sh polling open issues and PRs labelled needs-ruling across ~/duty/repos.txt is stated plainly; a reader holding only this section can write the query. ✓
  • Tracked message — one per item, edited in place, removed on flag clearance, and "never one notification per rung" is stated explicitly. ✓
  • Rungs word-for-word0–12h / at 12h / at 24h / past 24h match #72's ladder; I verified the permalink target: LABELS.md at cb3d482 lines 94–112 is the ladder, and the anchor (current episode's labeled event, D14) matches. ✓
  • Nothing box-side mutates the flag — stated plainly with D9/D15 cited. ✓
  • On-paper caveat — extended in place, unambiguous, claims no deployed behavior. ✓
  • docs/VENDORED.txt — untouched; FLEET.md is not in the manifest (verified by grep), so nothing mirrors to consumers. ✓
  • Evidence — all three 2026-07-23 invisible escalations cited with links. ✓
  • Changelog — entry present under ## Unreleased, inserted above the heading, cites #74. ✓

Verification: CI is green (all checks pass, including test). I also ran test/run.sh locally in the worktree; the failures there (jq: command not found, node is required for version-source: package-json) are my box's missing tooling — the identical run on main produces the identical failures (e.g. ruling.test.sh: 49 passed / 43 failed on both), so nothing here is caused by this diff. The diff touches no executable code.

One non-blocking nit, ride or ignore: line 86 uses "labelled" while the doctrine files use American "labeled" (e.g. LABELS.md's labeled event) — worth normalizing for grep-ability, at the builder's discretion.

**Approve** — head `ac6e980`. Reviewed the whole PR at the current head against #74's acceptance criteria, in a detached worktree (`~/duty/trees/ceremony/review-80`): - **Second query spec** — `notify.sh` polling open issues *and* PRs labelled `needs-ruling` across `~/duty/repos.txt` is stated plainly; a reader holding only this section can write the query. ✓ - **Tracked message** — one per item, edited in place, removed on flag clearance, and "never one notification per rung" is stated explicitly. ✓ - **Rungs word-for-word** — **0–12h / at 12h / at 24h / past 24h** match #72's ladder; I verified the permalink target: `LABELS.md` at `cb3d482` lines 94–112 is the ladder, and the anchor (current episode's `labeled` event, D14) matches. ✓ - **Nothing box-side mutates the flag** — stated plainly with D9/D15 cited. ✓ - **On-paper caveat** — extended in place, unambiguous, claims no deployed behavior. ✓ - **`docs/VENDORED.txt`** — untouched; FLEET.md is not in the manifest (verified by grep), so nothing mirrors to consumers. ✓ - **Evidence** — all three 2026-07-23 invisible escalations cited with links. ✓ - **Changelog** — entry present under `## Unreleased`, inserted above the heading, cites #74. ✓ **Verification:** CI is green (all checks pass, including `test`). I also ran `test/run.sh` locally in the worktree; the failures there (`jq: command not found`, `node is required for version-source: package-json`) are my box's missing tooling — the identical run on `main` produces the identical failures (e.g. ruling.test.sh: 49 passed / 43 failed on both), so nothing here is caused by this diff. The diff touches no executable code. One non-blocking nit, ride or ignore: line 86 uses "labelled" while the doctrine files use American "labeled" (e.g. LABELS.md's `labeled` event) — worth normalizing for grep-ability, at the builder's discretion.
claude-bot-andresmgsl commented 2026-07-23 16:27:52 +00:00 (Migrated from github.com)

📋 Round summary — handing off to @danmt.

One round, no fix cycles: codex, grok, and kimi each reviewed head ac6e980 (the PR's only substantive head after the draft phase) and approved with no blocking or non-blocking asks. All three verified the diff against #74's acceptance criteria directly: the operator notifier's second query (open issues and PRs carrying needs-ruling across the fleet), the one-tracked-message-per-item edit-in-place contract with removal on clearance, the message contents, the exact four #72 ladder rung names anchored to the labeled event, the alert threshold, triage's past-24h wake, and the boundary that nothing box-side sets, clears, or decides needs-ruling — FLEET.md stays a descriptive snapshot, with the on-paper caveat stated.

Docs-only diff (FLEET.md + CHANGELOG.md); test/run.sh, shellcheck, and actionlint green. state:needs-human is set and this is #50's last child — merging closes the epic.

📋 Round summary — handing off to @danmt. One round, no fix cycles: codex, grok, and kimi each reviewed head `ac6e980` (the PR's only substantive head after the draft phase) and approved with no blocking or non-blocking asks. All three verified the diff against #74's acceptance criteria directly: the operator notifier's second query (open issues **and** PRs carrying `needs-ruling` across the fleet), the one-tracked-message-per-item edit-in-place contract with removal on clearance, the message contents, the exact four #72 ladder rung names anchored to the `labeled` event, the alert threshold, triage's past-24h wake, and the boundary that nothing box-side sets, clears, or decides `needs-ruling` — FLEET.md stays a descriptive snapshot, with the on-paper caveat stated. Docs-only diff (`FLEET.md` + `CHANGELOG.md`); `test/run.sh`, shellcheck, and actionlint green. `state:needs-human` is set and this is #50's last child — merging closes the epic.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#80
No description provided.