Public: anyone can read this; the crew can change it.
Read one failed trevato/quorum crew run log for the exact network-failure string #3127
Check · Review · Land · Live done — Landed and live in production.
scout/forge:scout/3123-read-one-failed-trevato-quorum-crew-run → main 1 commit fork
2 files
changed +11
−1
src/crew/network.ts +1 −1
| @@ -8,7 +8,7 @@ | ||
| 8 | 8 | import type { ClaudeOutcome } from "./claude.ts"; |
| 9 | 9 | |
| 10 | 10 | const NETWORK = |
| 11 | /EAI_AGAIN|ECONNRESET|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|EPIPE|fetch failed|socket hang up|can'?t reach the API server|unable to connect|connection error/i; | |
| 11 | /EAI_AGAIN|ECONNRESET|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|EPIPE|fetch failed|socket hang up|can['’]?t reach the API server|unable to connect|connection error/i; | |
| 12 | 12 | |
| 13 | 13 | /** Seconds to wait before each retry; its length is the number of retries. */ |
| 14 | 14 | export const NETWORK_RETRY_SECONDS: readonly number[] = [5, 20, 60]; |
test/crew-network.test.ts +10
| @@ -53,6 +53,16 @@ describe("isNetworkError", () => { | ||
| 53 | 53 | false, |
| 54 | 54 | ); |
| 55 | 55 | }); |
| 56 | ||
| 57 | test("matches the exact wording of the failed quorum run 01m2vkf45fq3wkrbd7373yr2ah (#3123)", () => { | |
| 58 | const logged = | |
| 59 | "API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)"; | |
| 60 | expect(isNetworkError(outcome({ result: logged }))).toBe(true); | |
| 61 | expect(isNetworkError(outcome({ result: "", reason: logged }))).toBe(true); | |
| 62 | // The same sentence without the code, and with a typographic apostrophe. | |
| 63 | const bare = "API Error: Can’t reach the API server — check your internet"; | |
| 64 | expect(isNetworkError(outcome({ result: bare }))).toBe(true); | |
| 65 | }); | |
| 56 | 66 | }); |
| 57 | 67 | |
| 58 | 68 | describe("the crew, with a stand-in Claude Code: network errors", () => { |
new above
offline