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
Check · Review · Land · Live done — Landed and live in production.
scout/forge:scout/2034-sentinel-crew-runs-in-trevato-quorum-kee → main 1 commit fork 1 thread · 1 unresolved
2 files
changed +8
−1
src/crew/runner.ts +6 −1
| @@ -1325,9 +1325,14 @@ async function work( | ||
| 1325 | 1325 | Object.values(grant.env), |
| 1326 | 1326 | run.variantGroup, |
| 1327 | 1327 | ); |
| 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); | |
| 1328 | 1331 | return { |
| 1329 | 1332 | 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})`), | |
| 1331 | 1336 | resumesAt: limitLifts, |
| 1332 | 1337 | sessionId: result.sessionId, |
| 1333 | 1338 | costUsd: result.costUsd, |
test/crew-network.test.ts +2
| @@ -154,6 +154,8 @@ describe("the crew, with a stand-in Claude Code: network errors", () => { | ||
| 154 | 154 | .run(MAX_PAUSES, new Date().toISOString(), next.id); |
| 155 | 155 | const ended = await waitFor((r) => r.id === next.id && r.state === "failed"); |
| 156 | 156 | expect(ended.summary).not.toStartWith("paused"); |
| 157 | expect(ended.summary).toContain("network unreachable"); | |
| 158 | expect(ended.summary).not.toContain("no changes pushed"); | |
| 157 | 159 | rmSync(join(standIn.dataDir, "down")); |
| 158 | 160 | }, 60_000); |
| 159 | 161 | }); |
new above
offline
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.