feat(B-0532): parent-child status-mismatch lint (hard-error slice) + gate.yml wiring#3567
Merged
AceHack merged 2 commits intoMay 15, 2026
Conversation
…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>
3 tasks
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bf66b2ece0
ℹ️ 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
Adds a new “catch-once-then-lint” CI gate to enforce backlog graph consistency for the hard-error case in B-0532: a parent backlog row marked closed must not list any child row that is still open.
Changes:
- Extend
tools/hygiene/audit-backlog-items.tswith audit class #9 and a new--enforce-parent-child-statusflag (exit 1 when mismatches exist). - Wire a new
lint-backlog-parent-child-statusjob into.github/workflows/gate.ymlto run the new enforcement mode on every PR.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| tools/hygiene/audit-backlog-items.ts | Adds parent→children status-mismatch detection + --enforce-parent-child-status gating behavior. |
| .github/workflows/gate.yml | Adds a new CI job to run the audit tool in enforcement mode. |
AceHack
added a commit
that referenced
this pull request
May 15, 2026
…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>
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>
AceHack
added a commit
that referenced
this pull request
May 15, 2026
…g CI; natural plateau (#3569) - PR #3566 + #3567 + #3568 all wait-CI, armed - No new finding-class surfaced this tick - 16-tick session arc: 14 substantive PRs + 2 quiet checkpoints (1919Z + this 1952Z) - Future-Otto pickup hints recorded (B-0532 remaining slices; docs/research residuals; audit cross-ref triage) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
AceHack
added a commit
that referenced
this pull request
May 15, 2026
…urfaces (3 hits) (#3571) - PR #3567 + #3569 wait-CI - PR #3570 — 3 Otto-279 role-ref fixes in .claude/rules + .claude/skills - Pattern: "Per Aaron 2026-" → "Per the human maintainer 2026-" - audit-orphan-role-refs verification: 0 hits in target scope after fix - Discipline pivot: audit FIRST, then decide (quiet shard vs fix-PR) - Remaining violations in docs/, tools/hygiene/*, src/Core/Maji.fs deferred to follow-up batches Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
AceHack
added a commit
that referenced
this pull request
May 15, 2026
…aces (3 hits) (#3573) - All prior-tick PRs merged: #3567 (B-0532), #3569 + #3571 (shards), #3570 (.claude/ batch) - PR #3572 — 3 docs/ Per Aaron hits fixed; same pattern as .claude/ batch - Audit-first-then-decide pattern continues from 1959Z - Otto-279 cleanup: 6 fixes across 2 ticks; remaining batches deferred - 18-tick session arc Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
AceHack
added a commit
that referenced
this pull request
May 16, 2026
… (+ peer Otto B-0532 audit shard) (#3759) * shard(tick): 2026-05-16T05:45Z — B-0532 partial-completion audit landed (pure-git) Fourteenth tick. Pure-git decomposition: empirical audit of B-0532 via grep + ls (zero gh calls). Confirmed partial-completion (Slice 1 shipped via PR #3567, Slice 2 pending). Added Status section to row body (commit 3ecad08 on dedicated branch; pushed; PR deferred to post-reset). Brief-ack #1 of new counter cycle (counter reset last tick via rate-limit rule extension). Total branches awaiting post-reset PR creation: 6. Co-Authored-By: Claude <noreply@anthropic.com> * memory(feedback): 2nd false-positive class in audit-backlog-status-drift tool Discovered tick 11 by manually verifying B-0518 (which the audit tool flagged but is NOT drift — it's a 7-sharpening tracking row with partial-completion expected). The section-aware parser correctly skips top-level ## Composes with sections, but misses inline Composes with X bullets WITHIN Acceptance sub-sections. Fix: add INLINE_CROSSREF_PATTERNS regex set to skip lines matching composes with / sister / see also / per / references / cites patterns even inside primary sections. Does not invalidate the audit tool — its first slice found 30+ genuine candidates, 4 of which were closed earlier this session (B-0506 / B-0528 / B-0530 / B-0535). This is precision refinement. Substrate-honest: file as memory observation rather than backlog row because it's a small follow-up commit to the same B-0553 deliverable, not a new row. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
AceHack
added a commit
that referenced
this pull request
May 16, 2026
…e 1 shipped, Slice 2 pending) (#3762) * chore(b-0532): add Status section confirming partial-completion (Slice 1 shipped, Slice 2 pending) Empirical audit at 2026-05-16T05:43Z via pure-git operations (rate-limit at 0/5000) confirms B-0532 is **partial completion**, not drift, per the row-close gate triage in PR #3757's step-0 rule extension. Shipped via PR #3567 (hard-error slice + gate.yml wiring): - Hard-error: parent closed + declared child open → exit 1 - --enforce-parent-child-status flag on tools/hygiene/audit-backlog-items.ts (extended existing tool) - --json flag - Gate.yml lint-backlog-parent-child-status job Pending (Slice 2 — not yet a sub-row): - Soft warning: all children closed but parent open - Bidirectional consistency check - Test file - Documentation in docs/AGENT-BEST-PRACTICES.md Audit anchors: grep -E 'soft.warning|bidirectional' returns 0 matches in tools/hygiene/audit-backlog-items.ts; ls tools/hygiene/*test* yields nothing for parent-child; grep docs/AGENT-BEST-PRACTICES.md yields nothing. Row stays status: open until Slice 2 lands. This Status section makes the partial-completion state visible to any future agent running the row-close gate triage discriminator. Co-Authored-By: Claude <noreply@anthropic.com> * fix(pr-3762): bump last_updated to 2026-05-16 (Status section added today) Co-Authored-By: Claude <noreply@anthropic.com> * chore(b-0532): bump last_updated to 2026-05-16 per tools/backlog/README.md (review fix) --------- Co-authored-by: Claude <noreply@anthropic.com>
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements B-0532 hard-error case: parent row `status: closed` AND any declared child still `status: open` → exit 1.
Sibling-pattern completion
Once this lands, all 4 catch-once-then-lint cluster siblings are live.
Scope (hard-error slice)
Per the empirical anchor (PR #3518): parent B-0442 was flipped to `closed` while children B-0504 + B-0505 were still `open`. Caught by Codex + Copilot review but took 4 thread cycles to resolve.
The hard-error case alone catches this exact failure class. Deferred to follow-up slices per B-0532's full acceptance criteria:
Implementation
Test plan
🤖 Generated with Claude Code