fix: a triage-authored issue arrival must not abort the sweep #92
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#92
Loading…
Reference in a new issue
No description provided.
Delete branch "build/91-arrival-standdown"
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 #91
reconcile_opened_issue's two "nothing to do here" early exits were barereturns, which carry the failed guard's exit status into the executed script's liveset -e— so every triage-authored mint (the common case) killed thelabelsrun in ~400ms with zero stdout, before a single issue was reconciled. Per the spec: both stand-downs now sayreturn 0(D1),main's call stays bare so a genuine arrival-path failure still aborts loudly (D2), the per-issue batch guard is untouched (D3), and a new executed-subprocess test section guards the class of bug the sourced suite cannot see (D4).Acceptance criteria
issues:openedrun exits 0 and its output reachesissueflow: reconciled.issues:openedrun still addsneeds-triageand still reachesissueflow: reconciled.issues:openedevent whose subject is a PR exits 0 and reachesissueflow: reconciled.reconcile_opened_issuestill fails the run non-zero (D2 preserved: stub.errorsentinel on the issue fetch → run exits 1, sweep does not run)bb37c15and passes against the fix — verified both directions; the failing-first run reproduces the production signature exactly (exit 1, empty output) on the triage-authored and PR-arrival checkstest/run.sh: 15 files passed; issueflow suite 107 passed, 0 failed)Verification
|| returns in the file were L369/L373;offsite_timeline's|| return 1(L246) and the config loader'sreturn 1s are already explicit and correct.DRY_RUN=1 REPO=heavy-duty/ceremony LABELS_CONF=.github/labels.conf EVENT_NAME=issues EVENT_ACTION=opened EVENT_ISSUE=90 bash actions/issueflow-reconcile/issueflow-reconcile.sh→ exit 0, output endsissueflow: reconciled.(was: exit 1, no output).shellcheck-all.shsweep passes (33 tracked scripts).Worklog
test/release-chain.test.sh)bb37c15with the production signature|| return→|| return 0at L369/L373, with the why-comment carrying #91|| returns (none — only L246's explicitreturn 1)⟲ resuming from
c39b78959d🔎 reviewing head
c39b78959d🔎 reviewing head
c39b78959dVerified the fix against #91's full contract at
c39b78959dcadbcbcf79a556346fef9eae88a6ca.The two no-work arrival guards now return 0 explicitly, while
mainstill callsreconcile_opened_issuebare and the per-issue batch failure guard is unchanged. The executed-subprocess tests cover triage-authored, outside-authored, and PR arrivals, assert that the sweep is reached, and preserve non-zero failure for an arrival API error. The changelog entry is present.I ran
bash test/run.sh(15 test files passed; issueflow 107 passed) andbash .github/scripts/shellcheck-all.sh(33 tracked scripts clean).git diff --checkalso passes.Verdict: approve
Reviewed head
c39b78959dcadbcbcf79a556346fef9eae88a6caagainst #91's acceptance criteria and D1–D4.Spec check
return 0(was barereturnat the PR/issue and triage KEEP exits)main's call toreconcile_opened_issuestays bare (genuine arrival failure still aborts)## Unreleased, cites #91Acceptance criteria all hold: triage-authored, outside-authored, and PR arrivals reach
issueflow: reconciled.at exit 0; forced API failure on the arrival path still exits non-zero with no sweep log; suite green.Verification (ran in detached worktree at head)
bash test/issueflow-reconcile.test.sh→ 107 passed, 0 failed (including the four new arrival checks + D2 loud-failure pair)bash test/run.sh→ 15 files passed, 0 failed|| returnforms: only the two fixed sites;offsite_timeline's|| return 1and config-loaderreturn 1s stay explicitCode
The defect is exactly what #91 describes: under execution,
set -eis live, and a barereturnafter a failing guard propagates status 1 and kills the run before the sweep.return 0is the minimal correct stand-down; leaving the bare call inmainpreserves loud failure for real errors. The new tests execute the script behind a PATH-stubbedgh(house pattern fromrelease-chain), so the suite is no longer blind to this class of bug.No blocking issues. Approve.
🔎 reviewing head
c39b78959dApprove head
c39b789.Verified against #91's spec, not just read:
reconcile_opened_issuenow sayreturn 0(L372, L376), with a comment carrying the why and the incident number.main's call at L395 stays bare; a stubbed dead API on the issue fetch still exits 1 and the sweep does not run — confirmed by the new executed test, which I ran.|| log ... continuing, L418) is untouched. Grepped the file for other|| returns: only L246 remains, already explicit|| return 1, correct intent.gh, the house pattern fromtest/release-chain.test.sh, and asserts both exit 0 and reachingissueflow: reconciled.— so a stand-down that skips the sweep cannot pass.Ran it myself in a detached worktree:
bb37c15vs 63 at head differ by exactly the two new jq-dependent assertions — environment, not the PR).bb37c15with the new test file dropped in: the triage-authored and PR-arrival checks fail with exit 1 and empty output — the production signature from the three dead runs in the issue — and pass against the fix. Both directions verified.## Unreleased, inserted above the existing entries, cites #91.Every acceptance criterion in #91 is met. Non-blocking nit, builder's discretion: the new
ghstub is now the second hand-rolled endpoint-to-file stub in the suite family; if a third arrives, factoring it intotest/harness.shwould be worth it — not a gate for this PR.