fix(review_receipt): only an independent SHIP naming the exact head is a receipt
Summary
scripts/ci/review_receipt.py (gh-merge-green's review gate) still accepted a carried SHIP line ("Review (x; carried): SHIP at ", or "carried from/over") as the receipt for a head no review named, as long as the newest independent verdict was a SHIP and the PR was not risk:high. cmux#36322 landed through exactly that shape: a SHIP at 71d93871, a clean base merge to 8e3e59a4, and the exact-head review of 8e3e59a4 then came back BLOCK.
Now only an independent SHIP naming the exact head is a receipt, at every risk tier. A carried line is still recognised (so it never counts as a review and never overtakes a hold or BLOCK), but it is never a receipt; the refusal says so. The risk:high special case goes away because every tier now gets that rule. next-autoland and land_ready already apply the same rule.
skills/cmux-review/SKILL.md no longer describes a carried receipt as something that can count.
Verification
python3 -m unittest tests.test_review_receipt: 57 passed. New: SHIP at A, a clean base merge to B, refused at B with or without a carried line (comment, lane-place box or APPROVED review behind it), throughdecideand through the command; B's own SHIP passes and B's own BLOCK holds. The risk:high matrix now expects a refusal at every tier.python3 -m unittest tests.test_gh_merge_green: 169 passed.git diff --check: clean.
Observed / Not run
Observed the old matcher pass [SHIP at A, carried SHIP at B] at head B (the old test_a_clean_carry_with_no_block_passes). That case now refuses. No app build is needed for this Python guard.
Changelog
none
Agent session: agent session
🤖 Generated with Claude Code
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Fixes the gh-merge-green review gate so only an independent SHIP naming the exact head is a merge receipt. A carried SHIP previously counted when no independent verdict named the head, which let cmux#36322 land on a carry across a clean base merge before the exact-head review came back BLOCK.
- A carried line is still recognized, so it never overtakes a hold or BLOCK, but it never counts as a receipt.
- Applies the rule at all risk tiers, removing the risk:high special case and matching next-autoland and land_ready.
- Updates
skills/cmux-review/SKILL.mdto say a carry claim is never a receipt.
Summary by CodeRabbit
- Bug Fixes
- Review receipts now require an independent SHIP verdict for the exact current head. SHIPs carried over from another head no longer count, regardless of risk tier or approval type.
- A newer independent BLOCK invalidates an older SHIP, including when the verdicts refer to different heads.
- Refusal messages now identify newer BLOCKs and carried SHIPs.
- Documentation
- Updated review guidance to clarify that the resulting head after a base merge requires a new review.