fix(backlog): close B-0442 + B-0503 row status (work landed via PR #3458)#3518
Conversation
) Two row-status loose-ends flagged in tick 1436Z shard (#3509): - B-0442: all 6 acceptance items already `[x]` on main (slice 5 closed by PR #3458 commit description); flipped `status: open` → `closed` with `closed: 2026-05-15` + `closed_by_pr: 3458`. PR #3458's own description explicitly said "After this merges, B-0442 itself can be marked `status: closed`" — that line was the loose-end. - B-0503: 4 unchecked acceptance items on main despite the named files (`tools/bg/missed-substrate-recovery.ts` + `missed-substrate-recovery.test.ts`) being present and tested. Checked off all 4; flipped `status: open` → `closed`. Noted observed spec-drift on `buildRecoveryBranchName` signature (shipped as `(prNumber)`; spec said `(prNumber, ts: Date)`) — the timestamp was dropped in favor of `recovery/<prNumber>` per PR #3458 docs ("deterministic branch name `recovery/<prNumber>`"). Per `.claude/rules/refresh-before-decide.md`: status verified against `origin/main` snapshot at 2026-05-15T16:08Z (not local working-tree; sidetick branch state was stale relative to main). Claim acquired before the edit via `tools/bus/claim.ts acquire --from otto-cli --item B-0442` + `--item B-0503`. Both rows were unclaimed when work started. Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a6c1cca872
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
This PR updates backlog row metadata to close B-0442 and B-0503 after related missed-substrate recovery work landed via PR #3458.
Changes:
- Marks B-0442 closed with closure date and closing PR.
- Marks B-0503 closed and checks off its acceptance items.
- Notes spec drift for the recovery branch-name helper signature.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
docs/backlog/P1/B-0503-b0442-slice5a-open-recovery-pr-core-function-2026-05-14.md |
Closes the B-0503 row and updates acceptance status. |
docs/backlog/P1/B-0442-missed-substrate-cascade-detector-background-service-2026-05-13.md |
Closes the parent B-0442 row and records closure metadata. |
…tus loose-ends closed (PR #3518) (#3519) - PR #3515 (fix shard 1524Z post-merge findings) merged → 8145672. - PR #3517 (tick 1601Z shard) merged → 1d4802e. - PR #3518 opened — flips B-0442 + B-0503 status: open → closed. Both rows' work had landed via PR #3458 but status was never flipped (loose-end flagged in tick 1436Z shard). - Spec-vs-impl drift caught: B-0503's buildRecoveryBranchName shipped as (prNumber) without ts: Date — recorded in the row, not masked. - Refresh-before-decide applied at row-state scope: verified against origin/main (sidetick branch was stale). Co-authored-by: Claude <noreply@anthropic.com>
…tch with as-shipped; regen BACKLOG.md Addresses Codex + Copilot findings on PR #3518: - P1 (Copilot) + P2 (Codex) on B-0442 closure: parent was being closed while children B-0504 + B-0505 still `status: open` on main — backlog-graph inconsistency. Both children's work also landed via PR #3458 chain; flipped both to `status: closed` with `closed_by_pr: 3458`. Backlog graph now coherent: all four rows (parent B-0442 + slice-5 children 0503/0504/0505) closed together. - P1 (Copilot) + P2 (Codex) on B-0503 internal inconsistency: the acceptance note flagged `buildRecoveryBranchName(prNumber)` as as-shipped but the design sketch + "Why new Date() internally" section below still showed the old `(prNumber, ts: Date)` shape + timestamped branch name. Reconciled all three locations to match shipped: signature, internal call site, and the rationale section retitled to "Why the recovery branch name is `recovery/<prNumber>` (no timestamp)". The row is now internally consistent and serves as accurate design substrate for future readers. - BACKLOG.md regenerated via `bun tools/backlog/generate-index.ts` (BACKLOG_WRITE_FORCE=1) so the autogenerated index reflects the 4 status flips (was the non-required check warning on the prior commit). Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ab1e24fcaa
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| id: B-0504 | ||
| priority: P1 | ||
| status: open | ||
| status: closed |
There was a problem hiding this comment.
Reopen B-0504 until its acceptance checklist is complete
This change flips B-0504 to status: closed, but every item in that row’s ## Acceptance criteria block is still unchecked ([ ]). Since backlog tooling and readers treat frontmatter status as completion, this marks the slice as done while its own contract still says it is unfinished, which can suppress follow-up work or misreport progress.
Useful? React with 👍 / 👎.
| id: B-0505 | ||
| priority: P1 | ||
| status: open | ||
| status: closed |
There was a problem hiding this comment.
Reopen B-0505 until the row-level acceptance criteria are met
This row is also marked status: closed even though its ## Acceptance criteria section remains entirely unchecked. Closing the row before its own checklist is reconciled creates an internal contradiction in the backlog artifact and can cause review/automation flows to treat documentation and acceptance-close work as complete when the row still records it as pending.
Useful? React with 👍 / 👎.
…so flipped + B-0503 spec text reconciled (#3521) - PR #3518 unblocked: ab1e24f addresses 2 Codex+Copilot findings (parent-vs-children consistency, B-0503 internal drift) + the BACKLOG.md generated-index drift. 4 threads resolved. - 2 substrate-discipline observations captured: (1) Backlog-graph consistency lint is a future mechanization candidate. (2) Spec-vs-impl drift propagates — grep the whole row, not just the most-visible occurrence. Co-authored-by: Claude <noreply@anthropic.com>
…ild status-mismatch detection (#3523) Originating incident: PR #3518 closed parent B-0442 without closing declared children B-0504 + B-0505 — silent backlog-graph inconsistency caught by Codex + Copilot review through 4 thread cycles. The 1629Z tick shard flagged this as a future mechanization candidate; this row files it for substrate persistence. Spec includes: - Hard error: parent closed + child open - Hard error: bidirectional graph mismatch (parent.children vs child.parent) - Soft warning: all-children-closed-but-parent-open (closure candidate) - JSON output mode for compose-with-downstream - gate.yml wiring + AGENT-BEST-PRACTICES.md documentation Tagged P3 because: failure mode is rare (row-status flips not daily), review-cycle caught the single observed instance before merge, no production-impact blocker. Listed as composes-with the B-0442 chain so future-Otto reading that chain finds this row. BACKLOG.md regenerated to include the new row. Co-authored-by: Claude <noreply@anthropic.com>
…echanization) - PR #3518 (B-0442 chain close) merged → 627e797. - PR #3519 (tick 1618Z shard) merged → afc1a99. - PR #3523 opened — B-0532 (backlog-graph consistency lint, P3) filed as substrate from the 1629Z shard insight. BACKLOG.md regenerated. Auto-merge armed. - Sentinel 1011e43d live. ID allocation discipline applied: verified B-0532 free against origin/main (B-0530 max) + in-flight PR scan (B-0531 taken by peer Lior PR #3520). Co-Authored-By: Claude <noreply@anthropic.com>
…echanization) (#3524) - PR #3518 (B-0442 chain close) merged → 627e797. - PR #3519 (tick 1618Z shard) merged → afc1a99. - PR #3523 opened — B-0532 (backlog-graph consistency lint, P3) filed as substrate from the 1629Z shard insight. BACKLOG.md regenerated. Auto-merge armed. - Sentinel 1011e43d live. ID allocation discipline applied: verified B-0532 free against origin/main (B-0530 max) + in-flight PR scan (B-0531 taken by peer Lior PR #3520). Co-authored-by: Claude <noreply@anthropic.com>
…ed; nothing in-flight (#3527) Captures the burst-close state: PRs #3511, #3515, #3517, #3518, #3519, #3521, #3523, #3524 all MERGED to main with zero force-pushes to main and no in-flight. Next-tick speculative-work priority ladder reviewed: no Tier 1 known-gap surfaced; held until next tick per Aaron's forgetting-as-back-pressure substrate. Sentinel 1011e43d live. Co-authored-by: Claude <noreply@anthropic.com>
…ade status (#3525) * shard(tick): 1719Z — quiet checkpoint; all 8 recent Otto-CLI PRs merged; nothing in-flight Captures the burst-close state: PRs #3511, #3515, #3517, #3518, #3519, #3521, #3523, #3524 all MERGED to main with zero force-pushes to main and no in-flight. Next-tick speculative-work priority ladder reviewed: no Tier 1 known-gap surfaced; held until next tick per Aaron's forgetting-as-back-pressure substrate. Sentinel 1011e43d live. Co-Authored-By: Claude <noreply@anthropic.com> * shard(tick): 1718Z — fresh-session cold-boot; cron sentinel re-armed; §33 cascade status - CronList empty at boot → <<autonomous-loop>> sentinel re-armed - Confirmed PR #3513 (Riven §33) + #3516 (Vera §33) merged on origin/main - §33 cascade: 8 personas migrated (~127 files out of docs/research/) - Surfaced docs/research/ residuals: 78 claudeai + 8 gemini + 8 codex (content-id required; not slam-dunks) - Primary worktree mid-rebase on peer-Lior branch → borrow-on-existing pattern applied Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
… (P2) Surfaced 2026-05-15T18:18Z. `bun tools/bg/backlog-ready-notifier.ts --once` from the primary worktree returned B-0442 + B-0503 as ready candidates — both closed earlier this session via PR #3518. Root cause: the notifier reads YAML frontmatter from local working-tree files. The primary worktree was on peer Otto-CLI's branch `feat/persona-vera-migrate-conversations-otto-cli-2026-05-15`, which doesn't have my B-0442/B-0503 closure commits. Local view showed `status: open` despite origin/main correctly showing `closed`. Three already-merged rows were published as work-assignments at the observed tick (envelopes 292f1c57, 20f991c8, aa5060ff). Impact is low (advisory; 2h TTL) but the design is wrong — should read from origin/main. Spec includes `--source local|origin` flag (default `origin`) and note-field reporting of source used. BACKLOG.md regenerated. Co-Authored-By: Claude <noreply@anthropic.com>
… (P2) (#3551) Surfaced 2026-05-15T18:18Z. `bun tools/bg/backlog-ready-notifier.ts --once` from the primary worktree returned B-0442 + B-0503 as ready candidates — both closed earlier this session via PR #3518. Root cause: the notifier reads YAML frontmatter from local working-tree files. The primary worktree was on peer Otto-CLI's branch `feat/persona-vera-migrate-conversations-otto-cli-2026-05-15`, which doesn't have my B-0442/B-0503 closure commits. Local view showed `status: open` despite origin/main correctly showing `closed`. Three already-merged rows were published as work-assignments at the observed tick (envelopes 292f1c57, 20f991c8, aa5060ff). Impact is low (advisory; 2h TTL) but the design is wrong — should read from origin/main. Spec includes `--source local|origin` flag (default `origin`) and note-field reporting of source used. BACKLOG.md regenerated. Co-authored-by: Claude <noreply@anthropic.com>
…nt cluster siblings in-flight (#3568) - PR #3566 (1939Z shard) wait-CI - PR #3567 — B-0532 hard-error slice (parent-child status-mismatch) shipped - Cluster: lint-archive-header-§33 + lint-§33-migration-xrefs + lint-backlog-id-uniqueness + lint-backlog-parent-child-status (this PR) - Hard-error case alone catches empirical failure (PR #3518 B-0442/B-0504/B-0505) - Soft-warning + bidirectional slices deferred - 15-tick session arc; cluster completion approaching Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…gate.yml wiring (#3567) * feat(b-0532): parent-child status-mismatch lint (hard-error slice) + gate.yml wiring Implements the hard-error case from B-0532 acceptance criteria: parent row with `status: closed` (or equivalent landed/superseded/merged/done) AND any declared child still has `status: open`. Changes: 1. tools/hygiene/audit-backlog-items.ts (item 9 audit class): - Extend FrontmatterFields + BacklogRow with `childrenRefs` - Add `isClosedStatus()` helper (reuses CLOSED_STATUSES + handles `superseded-by-*` prefix) - Add `reportParentChildStatusMismatch()` function (item 9) - Add `--enforce-parent-child-status` CLI flag (exit 1 on findings) - Update Summary section + script header docs 2. .github/workflows/gate.yml: - New `lint-backlog-parent-child-status` job (sibling of lint-backlog-id-uniqueness from PR #3565) - Runs `bun tools/hygiene/audit-backlog-items.ts --enforce-parent-child-status` - Baseline = 0 mismatches (verified locally) Scope: hard-error case only. B-0532's full acceptance criteria also covers soft-warning (all children closed, parent open) + bidirectional consistency (parent.children ↔ child.parent). Those are deferred to follow-up slices. Empirical anchor: PR #3518 (2026-05-15) shipped a row-status flip closing parent B-0442 without closing children B-0504 + B-0505. Took 4 review-thread cycles to fully resolve. This lint catches that class at PR time before merge. Composes with: PR #3565 (lint-backlog-id-uniqueness, sibling pattern), PR #3555 (lint-section-33-migration-xrefs, sibling pattern), B-0532 (parent row). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(B-0532): extend B_REF_RE to capture dotted child IDs (B-NNNN.suffix) Reviewer finding (Copilot P0 + chatgpt-codex-connector P2, PR #3567): B_REF_RE = /B-\d{4}/g truncated dotted backlog IDs like B-0029.1 → B-0029, causing the parent/child status-mismatch gate to miss mismatches on decomposed child rows. Updated to /B-\d{4}(?:\.\d+)*/g to capture the full dotted suffix. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Closes two row-status loose-ends flagged in tick 1436Z shard (PR #3509):
B-0442: all 6 acceptance items already
[x]on main (slice 5 closed by PR #3458); flippedstatus: open→closed, addedclosed: 2026-05-15+closed_by_pr: 3458. PR docs(b-0505): close B-0442 slice 5 acceptance + document --auto-recover #3458's own description explicitly said "After this merges, B-0442 itself can be markedstatus: closed" — that exact line was the loose-end.B-0503: 4 unchecked acceptance items on main despite the named files (
tools/bg/missed-substrate-recovery.ts+missed-substrate-recovery.test.ts) being present and tested. Checked all 4; flippedstatus: open→closed. Noted observed spec-drift onbuildRecoveryBranchName: spec said(prNumber: number, ts: Date); shipped as(prNumber: number)only. The timestamp was dropped in favor ofrecovery/<prNumber>per PR docs(b-0505): close B-0442 slice 5 acceptance + document --auto-recover #3458 docs ("deterministic branch namerecovery/<prNumber>").Refresh-before-decide
Status verified against
origin/mainsnapshot at 2026-05-15T16:08Z. Sidetick branch (feat/ani-full-history-extract-...) was stale relative to main —git show origin/main:<row>was required because checked-out file content didn't match merged state.Claim coordination
Both rows were unclaimed when work started.
Test plan
origin/main(not local working tree)buildRecoveryBranchNamesignature simplification🤖 Generated with Claude Code