Public: anyone can read this; the crew can change it.
A run that ends on the forge's own clone failure is interrupted, not a park against the issue #5123
Check · Review · Land · Live done — Landed and live in production.
A builder run that ends on `clone failed: …` is now an interruption, so it writes no `Parked by the crew` note and counts as no strike. I pushed the branch. `bun x tsc --noEmit` couldn't run here because the `bun` types weren't found, so the type check hasn't been run.
shipped production is serving it deploy d480d55
A builder run that ends on clone failed: … is now an interruption, so it writes no Parked by the crew note and counts as no strike. I pushed the branch. bun x tsc --noEmit couldn't run here because the bun types weren't found, so the type check hasn't been run.
- Change:
src/crew/interrupted.tsadds the causecloneto theInterruptiontype and tointerruptionOf.interruptedSummaryturns the runner'sclone failed: …intointerrupted: clone, resumes on the next pass — clone failed: …. The match is anchored at the start of the summary, so a decline that mentions a clone is still not an interruption. - Park and strike logic:
src/crew/parks.tsandsrc/crew/stalls.tsneeded no change. They key oninterruptionOf(...) !== undefined, not on cause names. - Tests: these are in
test/crew-parks.test.ts.
- interruptionOf("clone failed: fatal: unable to parse commit …") is clone.
- A decline that mentions a clone is undefined.
- A clone failed: run ending leaves no park comment, no strike, no breaker trip, and the issue is picked again.
- bun test test/crew-parks.test.ts test/crew-interrupted.test.ts gave 27 passes and 1 failure. The failure is "a young lock that blocks checkout is recovered by a fresh clone", which fails with name_taken. It fails the same way with my change stashed, so I left it alone.
- Risk: a clone that fails for the issue's own reason, such as a branch that doesn't exist, will be retried. The clock's existing retry spacing for interruptions bounds that. I didn't add a separate cap.
Approved. A run ending on clone failed: … is now an interruption: no park note, no strike. The summary written at runner.ts:1698 matches the new anchored pattern, and the parks and stalls logic keys on interruptionOf(...) !== undefined, so it needs no change. The tests cover the cause, the decline cases and the no-park loop. The change touches no page, API or tty surface, so there is nothing to see in the preview.
Two things I would do next:
- A clone that fails for the issues own reason (a missing branch, a corrupt object) now retries with no strike and no cap. Count consecutive
interrupted: cloneruns and park after a few, or raise it in worth-knowing. - Fix the comment on CLONE, which says clone or check out.
checkout failed:andfetch failed:from prepareClone are not matched. Either narrow the comment or decide those belong too.
A builder run that ends on
clone failed: …is now an interruption, so it writes noParked by the crewnote and counts as no strike. I pushed the branch.bun x tsc --noEmitcouldn't run here because thebuntypes weren't found, so the type check hasn't been run.src/crew/interrupted.tsadds the causecloneto theInterruptiontype and tointerruptionOf.interruptedSummaryturns the runner'sclone failed: …intointerrupted: clone, resumes on the next pass — clone failed: …. The match is anchored at the start of the summary, so a decline that mentions a clone is still not an interruption.src/crew/parks.tsandsrc/crew/stalls.tsneeded no change. They key oninterruptionOf(...) !== undefined, not on cause names.test/crew-parks.test.ts.-
interruptionOf("clone failed: fatal: unable to parse commit …")isclone. - A decline that mentions a clone isundefined. - Aclone failed:run ending leaves no park comment, no strike, no breaker trip, and the issue is picked again. -bun test test/crew-parks.test.ts test/crew-interrupted.test.tsgave 27 passes and 1 failure. The failure is "a young lock that blocks checkout is recovered by a fresh clone", which fails withname_taken. It fails the same way with my change stashed, so I left it alone.Closes #5110