Skip to content

fix(ci): nothing merges and nothing scans — two org-move breakages - #801

Closed
catomean wants to merge 3 commits into
mainfrom
fix/canonical-workflow-owner
Closed

fix(ci): nothing merges and nothing scans — two org-move breakages#801
catomean wants to merge 3 commits into
mainfrom
fix/canonical-workflow-owner

Conversation

@catomean

@catomean catomean commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

The repos moved into the bitbaum organisation, and two separate things broke silently.

1. Nothing merges. catomean/dotfiles — itself the fix for the maonakamoto rename two days ago — is now a redirect in turn, and every auto-merge run has failed since. REST and git follow a rename redirect; the Actions resolver does not. So PRs stay green, clean and mergeable while the red run sits on main under a workflow nobody opens. 13 PRs were queued behind it.

2. Nothing scans. gitleaks-action is free for personal accounts only. In an org it refuses to run — "[bitbaum] is an organization. License key is required." — so the security job went red on every PR while scanning zero commits. A check that is both red and inert: it blocks the queue and protects nothing.

Fixes

scripts/ci/check-workflow-refs.mjs asks the REST API what each referenced repo is really called and fails when that disagrees with the workflow. That disagreement is exactly the bug — REST resolves the redirect, Actions does not. A static allowlist could not catch it: after a rename the workflow and the allowlist would hold the same stale name and agree with each other.

scripts/ci/secret-scan.sh runs the MIT-licensed gitleaks CLI directly, keeping the coverage the action gave. It also guards the trap that makes a security gate worthless: gitleaks exits 0 on an empty commit range, so a force-push or a shallow clone reports success having examined nothing — not "no secrets" but "no look", wearing a green tick. The range is computed first and an empty one fails hard.

Proven by mutation

Injected defect Result
restore catomean/dotfiles fails, naming bitbaum/dotfiles as the fix
empty commit range exit 2, refuses to report success
planted Slack token exit 1, finding redacted in the log

The planted credential is deliberately not one of the vendor EXAMPLE strings gitleaks allowlists — that is how a mutation stays green and proves nothing.

🤖 Generated with Claude Code

https://claude.ai/code/session_012dpTLxh5GJWeWTF1UEvcD5

catomean and others added 2 commits August 28, 2026 08:26
The repos moved to the `bitbaum` organisation, so `catomean/dotfiles` —
itself the fix for the `maonakamoto` rename two days ago — became a
redirect in turn. Every auto-merge run since has failed, so nothing
merges and nothing deploys.

Same invisible failure as before. GitHub redirects a renamed owner for
the REST API and for git remotes, so `gh api repos/catomean/dotfiles`
answers happily and `git push` works; the Actions resolver is the one
consumer that does not follow the redirect. It dies before any step
exists — "This run likely failed because of a workflow file issue", no
readable log — while pull requests stay green, clean and mergeable. The
red run is on main, under a workflow nobody opens.

Twice is where the rule says stop fixing instances. check-workflow-refs
asks the REST API what each referenced repo is really called and fails
when that disagrees with what the workflow says. That disagreement IS
the bug: REST resolves the redirect, Actions does not. A static
allowlist cannot do this — after a rename the workflow and the allowlist
would hold the same stale name and agree with each other.

It runs in CI rather than in `npm run verify`, because verify is the
offline SSOT bundle and this needs the API to answer; without a token it
skips rather than passing quietly.

Proven by mutation: restoring `catomean/dotfiles` fails the check with
the canonical name to use.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012dpTLxh5GJWeWTF1UEvcD5
gitleaks-action is free for personal accounts only. The move to the
bitbaum org made it refuse to run — "License key is required" — so the
security job went red on every PR and blocked the whole merge queue,
while scanning nothing.

The gitleaks CLI is MIT and has no such restriction, so this runs the
scanner directly and keeps the coverage the action gave.

The script guards the trap that makes a security gate worthless: gitleaks
exits 0 on an EMPTY commit range, so a force-push, a missing base ref or
a shallow clone reports success having examined nothing — not "no
secrets" but "no look", wearing a green tick. The range is computed
first and an empty one fails hard.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012dpTLxh5GJWeWTF1UEvcD5
@catomean catomean changed the title fix(ci): auto-merge points at a redirect again, and now something checks fix(ci): nothing merges and nothing scans — two org-move breakages Aug 28, 2026
They rode in on a branch switch and were swept up by `git add -A`.
Unrelated to the CI fixes; they belong with the Cat handle work.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@catomean

Copy link
Copy Markdown
Collaborator Author

Superseded. #800 landed the same owner fix and an equivalent gitleaks CLI swap while this was in flight — two sessions converging on one outage. Keeping only the part that was not duplicated: the check that stops there being a third rename, now in #803.

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