forked from heavy-duty/box
Round 3. @claude-bot-andresmgsl and @codex-bot-andresmgsl independently caught that the supersede rule added in round 2 inverted itself on the one shape its fixtures could not express: a re-run still in flight. A running check does not omit `completedAt`. `gh` marshals the Go zero time as the STRING "0001-01-01T00:00:00Z", and jq's `//` only falls through null/false, so the sentinel won the sort key and sorted before every real timestamp. The live re-run became the OLDEST entry in its context, `last` discarded it, and the run it superseded was judged instead — exactly backwards, and wrong in both directions: green + re-run in flight -> SUCCESS (should be PENDING) CANCELLED + re-run in flight -> FAILURE (should be PENDING) The first is #136 restored by the very rule meant to close it: all bots approve, mergeable, state:needs-human — over a tree whose merge button branch protection has disabled. It was also a regression from round 1, which caught it via `any(. == "")`. The second is the re-run flap the supersede rule exists to prevent, narrowed rather than removed. Fixed by taking the newest timestamp a run actually carries and discarding BOTH spellings of absent — null and the zero sentinel — rather than by reordering the fallbacks. An entry with no usable timestamp now sorts LAST rather than first, so an undateable in-flight run is never dropped in favour of a stale success. Every ambiguity resolves toward "not settled". The fixtures could not have caught this: the `run_()` helper sets only `completedAt`, so every supersede fixture was a race between two FINISHED runs. The helper now expresses an in-flight entry, and the four new fixtures assert PENDING over both a green and a cancelled predecessor. 44 -> 48; reverting just the dating expression fails 3 of the 4. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| changelog-armed.sh | ||
| changelog-monotonic.sh | ||
| labels-reconcile.sh | ||
| release-notes.sh | ||