fix(ci): the card-closer called a binary the rewrite deleted — dead for the whole rust-rewrite (#576) - #1359
Merged
Conversation
…or the whole rust-rewrite (#576) `auto-close-queue-cards` ran `./airc queue close-merged <url> …`. That was the BASH-era dispatcher — a `./airc` script at the repo root, which the rewrite deleted. A fresh checkout has no such file, so every run died at ./airc: No such file or directory (exit 127) 8 for 8 on the runs still in retention, going back to the rewrite. The verb was stale too. The Rust CLI has `queue-card close-merged-meta` and `close-merged-refs` — JSON transforms over `gh pr view` output — not a single `queue close-merged` that also performs the close. So BOTH ends existed: a workflow that wanted to close cards, and helpers that could compute what to close, with nothing joining them. Neither helper had a single caller anywhere in the tree. Built on both sides, wired on neither. Nobody read the red X because it lands AFTER merge, when attention has already moved on. The visible cost was a work board full of cards whose PRs shipped days ago — which then read as idle lanes and drew nudges, the exact litter this job was written to prevent. This builds `airc-cli` from the checkout and composes the two helpers with `gh issue close`, so the ref-parsing rule has one home and the workflow stops carrying a second copy of it. Three things it now refuses to do silently: - an absent binary is an `::error::` naming that nothing was closed, not a bare exit 127 — the failure that hid this for months - "no closing refs" prints as the distinct, common outcome it is, rather than looking like work performed - cross-repo refs are reported as skipped with the reason (repo-scoped token), instead of vanishing Debug build, not release: these subcommands are JSON transforms whose runtime is microseconds, so optimising them would only lengthen the build this job pays for on every merge. Verified: the workflow YAML parses and all five steps resolve. A GitHub workflow can only be validated in situ — the next merge into canary is the real test, and it will now either close a card or say why it did not. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc
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.
Dead the whole time, and it said so every time
auto-close-queue-cardsran./airc queue close-merged <url> …. That was the bash-era dispatcher — a./aircscript at the repo root, which the rewrite deleted. A fresh checkout has no such file, so every run died at:8 for 8 on the runs still in retention, going back to the rewrite.
The verb was stale too. The Rust CLI has
queue-card close-merged-metaandclose-merged-refs— JSON transforms overgh pr viewoutput — not a singlequeue close-mergedthat also performs the close.So both ends existed — a workflow that wanted to close cards, and helpers that could compute what to close — with nothing joining them. Neither helper had a single caller anywhere in the tree.
Nobody read the red X because it lands after merge, when attention has already moved to the next thing. The visible cost was a work board full of cards whose PRs shipped days ago, which then read as idle lanes and drew nudges — the exact litter this job was written to prevent.
The fix
Build
airc-clifrom the checkout and compose the two helpers withgh issue close, so the ref-parsing rule has one home and the workflow stops carrying a second copy of it.Three things it now refuses to do silently:
::error::naming that nothing was closed::notice::with the reason (repo-scoped token)Debug build, not release — these are JSON transforms whose runtime is microseconds, so optimising them would only lengthen the build this job pays for on every merge.
Verification
The YAML parses and all five steps resolve. A GitHub workflow can only be validated in situ: the next merge into canary is the real test, and it will now either close a card or say why it did not. If it fails again it will fail with a sentence instead of a path.
🤖 Generated with Claude Code
https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc