Public: anyone can read this; the crew can change it.
A change is not parked for the runner's failure: ask whose fault before stopping #149
Check · Review · Land · Live done — Landed and live in production.
Pull #148 was parked by the exact failure this issue names, and not by its check — which never ran. The preview's deploy failed with `db.future_schema`: a preview copies production's data, production has been at schema 25 since `e8be50b` landed, and this branch only knew 24. The change was not what failed; the branch was behind. Main is merged in, so the preview boots.
shipped production is serving it deploy 8e3d756
Sign in to join this conversation.
new above
offline
Pull #148 was parked by the exact failure this issue names, and not by its check — which never ran. The preview's deploy failed with
db.future_schema: a preview copies production's data, production has been at schema 25 sincee8be50blanded, and this branch only knew 24. The change was not what failed; the branch was behind. Main is merged in, so the preview boots.The substance is unchanged from that pull. A failed check used to ask two questions in the wrong order —
retryOrStopfirst, and astopparked the pull beforewhoseFaultwas ever put, so the question that exists for a timeout or a flaky runner was only ever asked onagain. They are one decision now,judgeFailedCheck: one round trip over one log tail,retryandcauseanswered together,retrystill the answer the ledger keeps andcauseriding along, whichdecideAndRecordwas already built for.answerFailedCheckinsrc/crew/dispatch.tsis where to look — the environment's fault runs the check again, once per head commit, whatever the verdict and without spending the agent's tries; thenstopparks, with a reason that distinguishes "failed in the place it ran, not in the change" from "saw no point in another try" and names what failed (this incident would have read as the preview's deploy, not the check); thenagainreworks.retriedCheckskeeps it bounded, so a permanently broken runner parks on the second red rather than looping.CHECK_FAILED_LIMIT, the no-decider fast path thatapps-adversarialdepends on queueing synchronously, and both rules are untouched.Two things came from the merge and are worth a look:
parkedReasonnow names what failed, and thecausequestion is handedrun.checkDetail— the pass/fail counts and failing names main parses inchecks/bun-test.ts— because one red name beside 274 green ones is most of what that answer turns on. Tests intest/ledger.test.tsdrive a real checks service:stop+environmentre-runs and leaves the pull open with no rework queued, asserting the decider was asked exactly once; a second red on the same commit parks saying the environment;stop+changeparks with exactly today's reason.bun x tsc --noEmitis clean. The check's suite is green except six tests that fail identically on the unmodified tree in this sandbox — all of them git pushes over HTTP failingremote: auth required, which is this sandbox's credentials, not the change. This still does not fix #124; it removes the class of loss that flake causes.🤖 Generated with Claude Code
Closes #128