ci(triage): tell "no gate to triage" apart from "squabble is broken" - #36
Merged
Merged
Conversation
The preceding commit branches on `squabble fetch` exit 3 for "the base branch has no required_status_checks rule". That code did not exist at the pinned revision, so the fix was inert: rc=2 fell into the `*` arm and hard-failed exactly as before. An ordering trap, and one that looks identical to a working fix from the diff alone. hyperpolymath/cicd-squabbler#99 merged at 2026-09-21T18:55Z and is what introduced `FetchError::NoGate` and `ExitCode::from(e.exit_code())`. Re-pinning onto its merge commit is what makes the preceding commit live. The window also carries #94..#98 -- CI permissions indentation, two DEED grammar gate fixes, an actions.lock reconcile, and a harden-runner bump. None touches squabble's CLI behaviour. The pin comment now records the FLOOR rather than just the value, because moving this pin backwards would silently revert the exit-code handling below without touching a line of it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
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.



What was red
Gate triage (cicd-squabbler)was the only failing job onJoshuaJewell/MetaManifold-WebUI#6— hygiene and the Julia matrix were green.It died at Fetch the live gate for this PR:
squabble was right. That base branch really is unprotected — 0 rulesets and
404 Branch not protectedon the classic API, both verified directly ratherthan taken from the tool's own message. It refused to emit a verdict it could
not support, which is the emptiness guard working.
The defect was that the refusal was indistinguishable from a malfunction:
run_fetchmapped everyErrto exit 2, the same code as a serialisationfailure, a missing argument or an unknown subcommand. A caller could not tell
"nothing to measure" from "failed to measure" — which is precisely the pressure
that makes people write
|| trueand mute genuine breakage along with it.⚠ This is not a cross-repo artefact. This fork's own
mainis equally bare,so the job dies identically on our own PRs. The cross-repo PR only made it
visible on a repo where we have pull-only access.
What lands here
Two commits, and the second is the one that matters:
f7a3e51teaches the step the difference. It captures the exit code andbranches on it —
0triage,3skip with a notice, anything else stillhard-fails. It discriminates on the code, not on the message text, so the
producer answers the question rather than the consumer guessing at it. It also
removes the 0-byte
gate.jsonthe redirect leaves behind on failure, whichwould otherwise upload as though an empty gate had been fetched.
4af3d1dre-pinsSQUABBLER_SHAonto9846169c, the merge ofhyperpolymath/cicd-squabbler#99 — which is what introduced
FetchError::NoGateand exit 3 in the first place.
Without the second commit the first is inert. At the old pin there is no
exit 3;
rc=2falls into the*arm and hard-fails exactly as it does today.The diff would read as a fix and change nothing. The pin comment now records
the floor rather than just a value, because moving this pin backwards would
silently revert the handling above without touching a line of it.
A skip is not a pass, and the step says so
The exit-3 branch is deliberately loud. It writes to the step summary:
and emits
::warning title=No gate to triage::. A green check that quietlymeans "I verified nothing" is the vacuous-gate pattern; this one states its own
denominator.
Verification
9846169ccarriesNO_GATE_EXIT: u8 = 3andExitCode::from(e.exit_code()),so NoGate → 3 and every other error → 2. Traced end to end in the merged
source, not assumed from the PR title.
6be52e3..9846169c) is #94–#99: a permissions-indentationrepair, two DEED grammar gate fixes, an
actions.lockreconcile, aharden-runner bump, and #99. None touches squabble's CLI behaviour.
ci.ymlparses; the rewritten step body passesbash -n.mainis unprotected too, soGate triage here must exercise the exit-3 path: green, with the warning above.
If it goes red, the fix is wrong. If it goes green without the warning,
something else is wrong.
Known gap, tracked not fixed
hyperpolymath/cicd-squabbler#100 —
fetchreads only the rulesets API(
rules/branches/{branch}) and never classic branch protection(
branches/{branch}/protection). A classically-protected repo has a realenforced gate and squabble reports none.
That gap gets worse after #99, not better: this consumer will now render it
as a confident green "nothing was gated" on a branch that is in fact
protected. A wrong answer nobody investigates beats a wrong answer that stops
the line. Neither repo in this PR is affected — both are genuinely unprotected
by both mechanisms — but the ordering matters, and #100 carries the acceptance
criteria.
🤖 Generated with Claude Code
https://claude.ai/code/session_01WPSJ7fBhVAMcpSffCBWUDo