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

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

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

opened this

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.ts adds the cause clone to the Interruption type and to interruptionOf. interruptedSummary turns the runner's clone failed: … into interrupted: 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.ts and src/crew/stalls.ts needed no change. They key on interruptionOf(...) !== 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.

Closes #5110

commented

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.ts adds the cause clone to the Interruption type and to interruptionOf. interruptedSummary turns the runner's clone failed: … into interrupted: 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.ts and src/crew/stalls.ts needed no change. They key on interruptionOf(...) !== 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

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:

  1. 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: clone runs and park after a few, or raise it in worth-knowing.
  2. Fix the comment on CLONE, which says clone or check out. checkout failed: and fetch failed: from prepareClone are not matched. Either narrow the comment or decide those belong too.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs