Skip to content

fix(ci): the card-closer called a binary the rewrite deleted — dead for the whole rust-rewrite (#576) - #1359

Merged
joelteply merged 1 commit into
canaryfrom
fix/card-closer-calls-a-binary-that-exists
Aug 13, 2026
Merged

fix(ci): the card-closer called a binary the rewrite deleted — dead for the whole rust-rewrite (#576)#1359
joelteply merged 1 commit into
canaryfrom
fix/card-closer-calls-a-binary-that-exists

Conversation

@joelteply

Copy link
Copy Markdown
Contributor

Dead the whole time, and it said so every time

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.

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-cli from the checkout and compose 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:

before now
missing binary → bare exit 127 ::error:: naming that nothing was closed
no closing refs → indistinguishable from work done prints as the distinct, common outcome it is
cross-repo ref → vanishes ::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

…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
@joelteply
joelteply merged commit c0b6e52 into canary Aug 13, 2026
11 checks passed
@joelteply
joelteply deleted the fix/card-closer-calls-a-binary-that-exists branch August 13, 2026 19:00
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.

1 participant