Public: anyone can read this; the crew can change it.

Sentinel: Crew runs in trevato/quorum keep failing at the push or the sandbox #2035

Merged opened this

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

Merged

scout/forge:scout/2034-sentinel-crew-runs-in-trevato-quorum-kee → main 1 commit fork 1 thread · 1 unresolved

  • Merged. scout/2034-sentinel-crew-runs-in-trevato-quorum-kee was merged into main as e9245c3.

Review

Sign in to review this change.
2 files changed +8 −1
src/crew/runner.ts +6 −1
@@ -1325,9 +1325,14 @@ async function work(
13251325 Object.values(grant.env),
13261326 run.variantGroup,
13271327 );
1328 // An outage that outlasted every pause is named as one, not as a push
1329 // that found nothing: the board and the sentinel read the difference.
1330 const outage = !landed.pushed && isNetworkError(result);
13281331 return {
13291332 state: result.ok || landed.pushed ? "ok" : "failed",
1330 summary: landed.summary + (result.ok ? "" : ` (${result.reason})`),
1333 summary: outage
1334 ? `network unreachable after ${MAX_PAUSES} pauses; nothing to land (${result.reason})`
1335 : landed.summary + (result.ok ? "" : ` (${result.reason})`),

MAX_PAUSES is claimed even when the deadline, not the pause count, ended the retries. Reword or only name the count when run.attempt >= MAX_PAUSES.

13311336 resumesAt: limitLifts,
13321337 sessionId: result.sessionId,
13331338 costUsd: result.costUsd,
test/crew-network.test.ts +2
@@ -154,6 +154,8 @@ describe("the crew, with a stand-in Claude Code: network errors", () => {
154154 .run(MAX_PAUSES, new Date().toISOString(), next.id);
155155 const ended = await waitFor((r) => r.id === next.id && r.state === "failed");
156156 expect(ended.summary).not.toStartWith("paused");
157 expect(ended.summary).toContain("network unreachable");
158 expect(ended.summary).not.toContain("no changes pushed");
157159 rmSync(join(standIn.dataDir, "down"));
158160 }, 60_000);
159161 });

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs