fix: union repeated Blocked by declarations #185
No reviewers
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#185
Loading…
Reference in a new issue
No description provided.
Delete branch "build/184-multi-blocked-by"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #184
Worklog
Blocked byoccurrence and union its clause recordsAcceptance criteria
148 152 153KEEPtest/run.shgreenVerification
bash test/run.sh(18 test files pass; issueflow has 143 checks)bash .github/scripts/shellcheck-all.shbash .github/scripts/actionlint-all.shgit diff --check🔎 reviewing head
07c8db9939🔎 reviewing head
07c8db9939Verdict: approve
Panel membership: on-panel (author is
codex-bot-andresmgsl; I am required).Spec / acceptance criteria (#184)
148 152 153KEEPtest/run.shgreenCloses #184is present. Grouped changelog fragmentchangelog.d/184.mdis present and proportional.Code
blocked_reference_recordsnow slurps the body and walks everyblocked byoccurrence, cutting each clause at its own first./;(or to EOF when unterminated). That is exactly the union the issue specifies: later declarations are no longer dropped when the first clause names a closed issue, and earlier prose cannot monopolize the parse. Soft-wrap still lands inside a single clause. Cross-repo classification andblocked_decisionare untouched; over-retention of historical prose is called out in the function comment with the correct bias (#184).Blocks #Ncorrectly never contributes. I re-ran the issue’s exact repro string under systemmawkand got148\n152\n153.Verification (this head
07c8db9939dae018d0113c00e51ef593a0ba10e6)bash test/run.sh— 18 files, 0 failed (issueflow: 143 checks, including the three new ones)bash .github/scripts/shellcheck-all.sh— cleanactionlintis not installed in this box; relied on CI (action-exercise/ workflow checks green on this head) and reading the unchanged workflow surfacetest,self-guards,action-exercise, release-exercise fixtures, labels reconcile — successNo blocking issues. Non-blocking none worth a round-trip.
Approve — reviewed at head
07c8db9939.The extraction rewrite is correct: the body is accumulated whole, every
blocked byoccurrence is scanned, each clause runs to its own first./;, and the unterminated tail still prints to end of input. A marker embedded inside an already-printed clause contributes its refs through the printed superset, so the union is never lossy. Classification stays per-record through the unchangedissue_references, so #61's cross-repo invariant holds over the larger set.Verified, not just read:
bash test/run.sh— 18 test files pass (issueflow: 143 checks).shellcheck-all.shandactionlint-all.shexit 0;git diff --checkclean. The box's system awk is mawk 1.3.4, so mawk compatibility is exercised, not assumed.148 152 153. AC2 — earlier prose containing "blocked by" no longer hijacks: the two-line body →148 152 153, and the prose clause's refs would be retained too, never substituted.blocked_reference_recordsto the first-occurrence-only shape and re-ran the suite — exactly the two new cases go red (repeated blocker declarations retain every clause,earlier blocker prose does not hide a later declaration), everything else stays green. The tests pin precisely the promotion bug this issue is about.Blocks #155never contributes; unterminated repeated clauses (Blocked by #12\nBlocked by #13) union both; a qualified ref in a second clause (Blocked by #12. Blocked by rig#7.) still routes toblocked_cross_references; the soft-wrapped and comma/paren/slash-adjacent single-clause cases parse identically to before;blocked_decisionon the union with one OPEN →KEEP.### Fixed), under the #167 length bound, named184.md.One non-blocking note: the new
an open blocker in a repeated declaration prevents promotioncheck drivesblocked_decisionwith a literal$'12\n13'rather than piping a repeated-declaration body through extraction, so by itself it wouldn't catch an extraction regression — but the two extraction cases beside it do, and together they cover the pipeline end to end. Fine as is.🔎 reviewing head
07c8db9939Approve — head
07c8db9.Verified against issue #184's acceptance criteria in a detached worktree at the head (mawk 1.3.4, the exact engine CI ships):
blocked_referenceson the verbatim rig#154 body →148 152 153. ✓Blocked by #152, #153, #148.→ all three; prose refs are retained, not substituted (blocked by #9 …+Blocked by #12.→9 12). ✓test/issueflow-reconcile.test.shpasses 114 (baseline onorigin/mainin the same environment: 111; the +3 are this PR's new cases). ✓KEEP. ✓ (probe:Blocked by #152. Blocked by #153.withCLOSED/OPENstates.)origin/main, both new extraction cases go red (repeated blocker declarations retain every clause,earlier blocker prose does not hide a later declaration) — they pin exactly the promotion this issue is about. Restored after.FLAG_CROSS_REPO(probe →rig#7). Control: single clause, all closed →READY.git diff --checkclean. Fragmentchangelog.d/184.mdcarries the### Fixedheading the groupedshapesentinel requires (#182). CI green on this head.Could not verify locally: shellcheck is not installed on this box, so
.github/scripts/shellcheck-all.shwas not run here — relied on CI (test,self-guardsgreen on this head) and on reading the awk for mawk-incompatible constructs (none found: no\xescapes,match/RSTARTused portably). The 29 failures inissueflow-reconcile.test.shon this box are pre-existing environment gaps (nojq, nonpm/node); they fail identically onorigin/mainand none is in the invariant-3 block this PR touches.Non-blocking nits:
blocked_decisiona hand-written$'12\n13'ref list rather than refs derived from a repeated declaration, so the criterion is pinned one indirection away from its letter. The behavior itself is correct (probe above).9 12) or for a cross-repo ref in a later clause; both behave correctly, and #186 pins them if you want the coverage for free.Panel note (not a code defect): this and #186 both
Closes #184, both are assigned on the issue, and they edit the same function, the same test block, and the samechangelog.d/184.md— only one can land. I'm approving each head on its merits per the round doctrine; which of the two merges is the human's call at the merge gate, and triage may want to note the double-claim that produced it.Closing round summary
What shipped
blocked_reference_recordsnow scans the whole issue body and unions everyBlocked byclause instead of stopping after the first occurrence../;, or EOF), ordering/dedup remains unchanged, and cross-repo classification plus theKEEP/READY/FLAG_*decision table are untouched.changelog.d/184.mdfragment.Rounds
07c8db9939dae018d0113c00e51ef593a0ba10e6): no code changes were requested. Grok, Claude, and Kimi each approved the current head. Their boundary probes confirmed repeated and unterminated clauses, soft wraps,Blocks #Nexclusion, later qualified cross-repo refs, and conservative over-retention.Verification
bash test/run.sh(18 test files; issueflow 143 checks),bash .github/scripts/shellcheck-all.sh,bash .github/scripts/actionlint-all.sh, andgit diff --check.148 152 153, exercised theKEEPpath with mixed open/closed blockers, and ran must-fail reversions proving the new extraction regressions fail under the old behavior.blocker:*labels.Post-merge residue
Closes #184; if this PR merges, #186 should be closed as the superseded duplicate.Pull request closed