From 096774ea47256f99bbc2208e47f8f7f3f4c8a444 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Sat, 16 May 2026 17:24:15 -0400 Subject: [PATCH 1/3] fix(B-0441): re-open per parent-child status invariant (B-0532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI failure: `lint (backlog parent-child status)` correctly caught that B-0441 closed while child B-0460 (slice 5.2 subscriber handler) still open. The --enforce-parent-child-status lint exists exactly to prevent this graph inconsistency. Honoring the rule: flip status back to open, keep the 6 acceptance checkbox refreshes + last_updated bump (those are still accurate — notifier-side IS complete), add a "Closure status (2026-05-16)" section explaining the situation so the next reviewer doesn't re-attempt the same close cycle. When B-0460 lands, this row is ready to flip to closed with zero further substrate work. Co-Authored-By: Claude --- docs/BACKLOG.md | 2 +- ...-to-grind-notifier-background-service-2026-05-13.md | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 3e1668da2..a20c2ab46 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -257,7 +257,7 @@ are closed (status: closed in frontmatter)._ - [ ] **[B-0436](backlog/P1/B-0436-demo-hamiltonian-to-git-visualization-2026-05-13.md)** Demo — Hamiltonian-to-git visualization (git history → phase-space rendering) - [x] **[B-0437](backlog/P1/B-0437-demo-ux-of-math-panel-bivector-fingerprints-2026-05-13.md)** Demo — UX-of-math panel (bivector fingerprints, partial-credit scoring) - [ ] **[B-0440](backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md)** Standing-by failure-mode detector — background service that catches idle-foreground + nudges via bus -- [x] **[B-0441](backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md)** Backlog-row-ready-to-grind notifier — background service that proactively assigns claims when agent queue empty +- [ ] **[B-0441](backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md)** Backlog-row-ready-to-grind notifier — background service that proactively assigns claims when agent queue empty - [x] **[B-0442](backlog/P1/B-0442-missed-substrate-cascade-detector-background-service-2026-05-13.md)** Missed-substrate cascade detector — background service that catches branch-vs-merged-PR drift (e.g., Otto-section-missed-PR-2980-by-3-min class) - [x] **[B-0445](backlog/P1/B-0445-csharp-fluent-operator-surface-pm2-2026-05-13.md)** C# fluent operator surface — Map, Filter, Join, Distinct, Window via idiomatic CSharp API - [ ] **[B-0448](backlog/P1/B-0448-cloud-routines-integration-4th-catch-43-defence-layer-2026-05-13.md)** Cloud Routines integration — 4th catch-43 defence layer via Anthropic-hosted scheduled tasks + API + GitHub event triggers diff --git a/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md b/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md index 29930d278..15af6aeda 100644 --- a/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md +++ b/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md @@ -1,7 +1,7 @@ --- id: B-0441 priority: P1 -status: closed +status: open title: "Backlog-row-ready-to-grind notifier — background service that proactively assigns claims when agent queue empty" tier: factory-infrastructure effort: M @@ -176,3 +176,11 @@ Using the canonical per-service slice ordering from `tools/bg/README.md`: Slices 1, 2, 4 are live in `tools/bg/backlog-ready-notifier.ts` (per README "1+2+4 live"). B-0460 depends on B-0449 (subscriber library design pass); B-0500/B-0501/B-0502 are independent. + +## Closure status (2026-05-16) + +**Notifier-side: complete.** All 8 acceptance criteria checked (slices 1, 2, 3, 4, 5a, 6 shipped per the decomposition table; tests in `tools/bg/backlog-ready-notifier.test.ts`; launchd plist via B-0502; docs in `docs/AUTONOMOUS-LOOP.md`). Empirically confirmed live during the 2026-05-16 session via `bun tools/bg/backlog-ready-notifier.ts --once` — returned the documented JSON shape with `queueBusy: true` correctly suppressing publication. + +**Row stays `status: open`** because child **B-0460** (slice 5.2, agent-side subscriber handler) is genuinely the remaining unshipped scope, and the `--enforce-parent-child-status` lint (B-0532 gate) correctly requires parent rows to stay open while any child is open. Closing this row would violate that invariant. + +When B-0460 lands and closes, this row is ready to flip to `closed` with no further substrate work. From fa818514ab7723db4c2fdd5dd2d5d76f2cb14730 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Sat, 16 May 2026 17:36:50 -0400 Subject: [PATCH 2/3] =?UTF-8?q?fix(B-0441):=20correct=20slice=205a=20statu?= =?UTF-8?q?s=20to=20=E2=9D=8C=20open=20per=20codex/copilot=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #3945 review threads (codex + copilot) flagged that the prior closure note claimed slice 5a as "✅ shipped" while child B-0501 is still status: open with unchecked acceptance criteria AND the notifier source (tools/bg/backlog-ready-notifier.ts) has no history/cooldown logic. Verified on origin/main: B-0501 status: open; notifier source has no matches for history|cooldown|dedup|assigned. Corrected: - Decomposition table: 5a "✅ shipped" → "❌ open" - Closure note: "All 8 acceptance criteria checked" → "Slices 1, 2, 3, 4, 6 shipped; 5a NOT yet shipped" - Row stays status: open citing B-0501 AND B-0460 as remaining children Co-Authored-By: Claude Opus 4.7 --- ...-to-grind-notifier-background-service-2026-05-13.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md b/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md index 15af6aeda..f502176c0 100644 --- a/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md +++ b/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md @@ -170,7 +170,7 @@ Using the canonical per-service slice ordering from `tools/bg/README.md`: | 2 | Real detection signal #1 (backlog-row scan: status + deps satisfied) | ✅ shipped | — | | 3 | Queue-state guard wiring (`isAgentQueueEmpty` into `pollOnce`) | ✅ shipped | B-0500 | | 4 | Bus-publish wiring (`work-assignment` topic) | ✅ shipped | — | -| 5a | Assignment history dedup / cooldown (avoid re-assigning same row) | ✅ shipped | B-0501 | +| 5a | Assignment history dedup / cooldown (avoid re-assigning same row) | ❌ open | B-0501 | | 5.2 | Agent-side `work-assignment` subscriber handler (consume + act) | ❌ open | B-0460 | | 6 | launchd plist + `docs/AUTONOMOUS-LOOP.md` wiring | ✅ shipped | B-0502 | @@ -179,8 +179,10 @@ B-0460 depends on B-0449 (subscriber library design pass); B-0500/B-0501/B-0502 ## Closure status (2026-05-16) -**Notifier-side: complete.** All 8 acceptance criteria checked (slices 1, 2, 3, 4, 5a, 6 shipped per the decomposition table; tests in `tools/bg/backlog-ready-notifier.test.ts`; launchd plist via B-0502; docs in `docs/AUTONOMOUS-LOOP.md`). Empirically confirmed live during the 2026-05-16 session via `bun tools/bg/backlog-ready-notifier.ts --once` — returned the documented JSON shape with `queueBusy: true` correctly suppressing publication. +**Notifier-side: partially complete.** Slices 1, 2, 3, 4, 6 are shipped (skeleton + detection + queue-state guard + bus-publish + launchd wiring; tests in `tools/bg/backlog-ready-notifier.test.ts`; docs in `docs/AUTONOMOUS-LOOP.md`). Empirically confirmed live during the 2026-05-16 session via `bun tools/bg/backlog-ready-notifier.ts --once` — returned the documented JSON shape with `queueBusy: true` correctly suppressing publication. -**Row stays `status: open`** because child **B-0460** (slice 5.2, agent-side subscriber handler) is genuinely the remaining unshipped scope, and the `--enforce-parent-child-status` lint (B-0532 gate) correctly requires parent rows to stay open while any child is open. Closing this row would violate that invariant. +**Slice 5a (assignment-history dedup / cooldown) is NOT yet shipped.** Child row B-0501 is still `status: open` with unchecked acceptance criteria; `tools/bg/backlog-ready-notifier.ts` does not yet contain `historyFile`/cooldown logic. Per codex + copilot review on PR #3945, the prior version of this row overstated 5a as shipped — corrected here. -When B-0460 lands and closes, this row is ready to flip to `closed` with no further substrate work. +**Row stays `status: open`** because children **B-0501** (slice 5a) and **B-0460** (slice 5.2, agent-side subscriber handler) are both genuinely the remaining unshipped scope, and the `--enforce-parent-child-status` lint (B-0532 gate) correctly requires parent rows to stay open while any child is open. Closing this row would violate that invariant. + +When B-0501 and B-0460 land and close, this row is ready to flip to `closed` with no further substrate work. From d0ea0581ecb633910a73ea4c6ed20d1831c362c6 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Sat, 16 May 2026 18:20:21 -0400 Subject: [PATCH 3/3] fix(B-0441): correct slice 5a acceptance + flag B-0502 status mismatch (Copilot P1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two findings: 1. Line 53-54: uncheck acceptance for assignment-history (slice 5a) — B-0501 is status:open, not shipped. Row's slice table already reflected this (line 173); acceptance section now matches. 2. Line 188: closure guidance now flags that child B-0502 carries status:shipped, which is NOT in CLOSED_STATUSES (audit-backlog-items.ts:245) nor in README's documented enum. Without a status flip OR enum extension, --enforce-parent-child-status (B-0532) will still fail when this row is later closed. --- ...ready-to-grind-notifier-background-service-2026-05-13.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md b/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md index f502176c0..b4967db07 100644 --- a/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md +++ b/docs/backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md @@ -50,8 +50,8 @@ provides a less-ambiguous concrete claim — eliminating the decompositionSuggestion: } }` (Slice 4, shipped) - [x] Honors agent autonomy — assignment is suggestion, not directive (per `.claude/rules/no-directives.md`) — by design; envelope is advisory -- [x] Tracks assignment history to avoid re-assigning same row - within short window (Slice 5a, B-0501 shipped) +- [ ] Tracks assignment history to avoid re-assigning same row + within short window (Slice 5a, B-0501 open — `historyFile`/cooldown logic not yet in `tools/bg/backlog-ready-notifier.ts`) - [x] Tests cover the readiness-detection heuristics (`tools/bg/backlog-ready-notifier.test.ts`) - [x] Documented in `docs/AUTONOMOUS-LOOP.md` @@ -185,4 +185,4 @@ B-0460 depends on B-0449 (subscriber library design pass); B-0500/B-0501/B-0502 **Row stays `status: open`** because children **B-0501** (slice 5a) and **B-0460** (slice 5.2, agent-side subscriber handler) are both genuinely the remaining unshipped scope, and the `--enforce-parent-child-status` lint (B-0532 gate) correctly requires parent rows to stay open while any child is open. Closing this row would violate that invariant. -When B-0501 and B-0460 land and close, this row is ready to flip to `closed` with no further substrate work. +When B-0501 and B-0460 land and close, this row is ready to flip to `closed` — **with one caveat**: child row **B-0502** currently carries `status: shipped`, which is NOT in the lint's `CLOSED_STATUSES` set (`{closed, landed, superseded, merged, done}` in `tools/hygiene/audit-backlog-items.ts:245`) and is NOT among the documented statuses in `tools/backlog/README.md` (`open / closed / superseded-by-B-NNNN / deferred / decomposed`). Before closing B-0441, B-0502 must either be flipped to a documented closed status (e.g., `closed`) OR the `shipped` value must be added to `CLOSED_STATUSES` + the README enum. Otherwise the `--enforce-parent-child-status` (B-0532) lint will still fail.