Skip to content

feat(B-0532): parent-child status-mismatch lint (hard-error slice) + gate.yml wiring#3567

Merged
AceHack merged 2 commits into
mainfrom
feat/b0532-parent-child-status-mismatch-lint-otto-cli-2026-05-15
May 15, 2026
Merged

feat(B-0532): parent-child status-mismatch lint (hard-error slice) + gate.yml wiring#3567
AceHack merged 2 commits into
mainfrom
feat/b0532-parent-child-status-mismatch-lint-otto-cli-2026-05-15

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented May 15, 2026

Summary

Implements B-0532 hard-error case: parent row `status: closed` AND any declared child still `status: open` → exit 1.

Sibling-pattern completion

Lint Status
`lint-archive-header-section33` LIVE (B-0036)
`lint-section-33-migration-xrefs` LIVE (PR #3555, B-0533)
`lint-backlog-id-uniqueness` LIVE (PR #3565, B-0535)
`lint-backlog-parent-child-status` In-flight (this PR, B-0532 hard-error slice)

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:

  • Soft-warning: all children closed but parent still open (closure candidate)
  • Bidirectional consistency: parent.children ↔ child.parent (orphan / dangling refs)

Implementation

File LOC delta Change
`tools/hygiene/audit-backlog-items.ts` +90 / -3 Item 9 audit class + `--enforce-parent-child-status` flag
`.github/workflows/gate.yml` +28 New `lint-backlog-parent-child-status` job

Test plan

  • `bun tools/hygiene/audit-backlog-items.ts` runs as before (detect-only)
  • `bun tools/hygiene/audit-backlog-items.ts --enforce-parent-child-status` exits 0 on baseline (0 mismatches)
  • Unknown flag rejected with stderr error + exit 1
  • CI green (including the new `lint (backlog parent-child status)` job itself running on this PR)
  • Auto-merge arms

🤖 Generated with Claude Code

…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>
Copilot AI review requested due to automatic review settings May 15, 2026 19:49
@AceHack AceHack enabled auto-merge (squash) May 15, 2026 19:49
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread tools/hygiene/audit-backlog-items.ts
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.ts with audit class #9 and a new --enforce-parent-child-status flag (exit 1 when mismatches exist).
  • Wire a new lint-backlog-parent-child-status job into .github/workflows/gate.yml to 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.

Comment thread tools/hygiene/audit-backlog-items.ts
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 AceHack merged commit 376a686 into main May 15, 2026
29 checks passed
@AceHack AceHack deleted the feat/b0532-parent-child-status-mismatch-lint-otto-cli-2026-05-15 branch May 15, 2026 19:59
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants