Conversation
Both cost a lap on #946 and neither was written anywhere a later session would find it: the commit bodies could not carry them, because both surfaced after the messages they belonged in were already written. THE FAN-IN HOLE IS NAMED WHERE THE PRINCIPLE ALREADY LIVES. The Verdicts section already says a `cancelled` read as red wedges a branch with no exit. It does not say that this repository currently does exactly that on its second fan-in: `CI_FANIN_CHECK` holds one name against `final` and `action-final`, so a cancelled `action-final` writes a real `failure` — `if: always()` fails its `needs:` assertion — and a failure conclusion is an ANSWER, outranking the newer run's non-answer. What made it expensive rather than merely wrong is that the conclusion is permanent on its sha: an unchanged sha creates no new run, so re-lapping re-reads the same failure for a full `verify`. CLOUD-1663 is open and owns the fix; this is the operating note until it lands. A UNION IS THE WRONG RESOLUTION WHEN ONE SIDE REMOVED. `MUTANT_GATES` is one long comma-separated line both sides append to, so most conflicted laps conflict there and a union looks obviously right. `8b619266` removed `release-trigger-independent` because `mutate sweep` answered `no-suite`, and a union silently resurrects that retired coverage claim with nothing in the conflict markers to say so. The rule is to diff against `origin/main` rather than the merge base, so a deliberate removal survives the resolution. Refs: CLOUD-1663, CLOUD-1787, CLOUD-1790
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe landing-loop documentation now describes that Priority: ⬇️ Low Merge Risk: ⚪ Minimal · up to This documentation-only change does not alter runtime behavior, and no merge-blocking risk remains. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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 |
Refs CLOUD-1663
Two traps that each cost a lap on #946, written nowhere a later session would find them. Neither could ride in the commit body it belonged to: both surfaced after those messages were written — the first during CI, the second during the second rebase.
The fan-in hole
mem:workflow/landing-loop's Verdicts section already states the principle: acancelledread as red wedges a branch with no exit. What it did not say is that this repository currently does exactly that on its second fan-in.CI_FANIN_CHECKholds one name againstfinalandaction-final, so the superseded-run handling never applies to the latter. A cancelledaction-finalwrites a realfailure— itsif: always()fails theneeds:assertion — and a failure conclusion is an answer, so it outranks the newer run's non-answer and reads as red.Verified the engine is not misreading anything, by feeding
checks greenthe two real rows viaCHECKS_GREEN_RUNS:skippedalone →pending — required check(s) with no verdict, exit 3. Correct: a skip is not an answer.failure+ laterskipped→red, exit 1. Correct in isolation.What made it expensive rather than merely wrong: the conclusion is permanent on its sha. An unchanged sha creates no new run, so re-lapping re-reads the identical failure for a full
verify's cost — measured, twice on #946. Only a new sha clears it, which is free whenmainhas moved and unavailable when it has not.CLOUD-1663 is open and owns the fix (measured there independently on #848). This is the operating note until it lands.
A union is the wrong resolution when one side removed
MUTANT_GATESis one long comma-separated line both sides append to, so most conflicted laps conflict there and a union looks obviously right.It is right only while both sides added.
8b619266removedrelease-trigger-independent—mutate sweepansweredno-suite, so the row was a coverage claim with nothing behind it and moved to#MUTANT-EXEMPT. A mechanical union silently resurrects exactly that, re-reddeningmutate censuswith a name main had just retired, and nothing in the conflict markers says so. Caught on #946 only because the entry's name looked unfamiliar.The rule: diff against
origin/main, not the merge base, so a deliberate removal survives the resolution.Also records the neighbouring trap in the opposite direction —
$MUTANT_GATESentries are module names resolved againstpolicy/{name}.regoon disk, never rule ids, so renaming them to follow a rule-id rename stands the census's subjects up against names no file carries.Scope
Memory file only; no code, no gate behaviour changes.
Generated by Claude Code