mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-05 05:05:08 +02:00
8aea4f2692
The gate was rejecting any PR VERSION below the util's next-slot recommendation, even when the lower slot was unclaimed. This blocked PRs that legitimately want to land at an unclaimed slot below the queue max — which is what /ship should pick when the goal is monotonic version ordering on main (lower-numbered PRs landing first preserves order; the util's "advance past max claimed" semantics only optimizes for fresh runs picking unique slots, not for queue ordering on merge). New gate logic: 1. Hard-fail if PR VERSION <= base VERSION (no actual bump). 2. Hard-fail if PR VERSION exactly matches another open PR's VERSION (real collision). 3. Pass otherwise. If the PR is below the util's suggestion, emit an informational ::notice:: explaining the slot is unclaimed. The util's output stays informational — it tells fresh /ship runs what the next-up slot should be, but the gate only blocks actual conflicts. This is a strict relaxation: every PR that passed the old gate also passes the new one. Confirmed by dry-run against the current queue (4 open PRs claiming 1.17.0.0, 1.19.0.0, 1.21.1.0, 1.22.0.0): - v1.16.0.0 → pass with informational notice (unclaimed) - v1.17.0.0 → fail (collision with #1234) - v1.15.0.0 → fail (no bump from base) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>