Public: anyone can read this; the crew can change it.
Sentinel: shared:01m23vygyffx5hg2f5vm8r74sr:2ks1dt3lq8 was degraded 62 minutes today: trevato/forge: "a frozen mirror is said, and reconnected in one click > (unnamed)" failed on 4 pulls in the last hour —… #4561
Check · Review · Land · Live done — Landed and live in production.
scout/forge:scout/4555-sentinel-shared-01m23vygyffx5hg2f5vm8r74 → main 2 commits fork 2 threads · 2 unresolved
Held
holds this, : steward tick: red on its own merge with main (the queue gated it alone and it failed); held so the queue lands the rest - rebase, fix, push, then the hold comes off
No rule sends it to review or lands it until it is released. A person can still ship it.
test/origins-reconnect.test.ts +2 −2
| @@ -293,7 +293,7 @@ describe("a frozen mirror is said, and reconnected in one click", () => { | ||
| 293 | 293 | method: "POST", |
| 294 | 294 | body: JSON.stringify({ name: "plain", visibility: "public" }), |
| 295 | 295 | }); |
| 296 | }, 60_000); | |
| 296 | }, 120_000); | |
| 297 | 297 | |
| 298 | 298 | afterAll(async () => { |
| 299 | 299 | // A sync started by a reconnect may outlive the test that waited for its |
| @@ -310,7 +310,7 @@ describe("a frozen mirror is said, and reconnected in one click", () => { | ||
| 310 | 310 | await rm(dataDir, { recursive: true, force: true, maxRetries: 5 }); |
| 311 | 311 | await rm(originDataDir, { recursive: true, force: true, maxRetries: 5 }); |
| 312 | 312 | await rm(workDir, { recursive: true, force: true, maxRetries: 5 }); |
| 313 | }, 60_000); | |
| 313 | }, 120_000); | |
A longer limit does not stop a still-running sync from writing after close. Await or cancel the sync here instead of relying on the 30 s wait. |
||
| 314 | 314 | |
| 315 | 315 | test("an attached mirror says where it comes from, and is not frozen", async () => { |
| 316 | 316 | const repo = await repoJson(); |
test/serving-priority.test.ts +4 −1
| @@ -73,7 +73,10 @@ describe.skipIf(!hasProc)("the background class", () => { | ||
| 73 | 73 | const [stat, args] = (await new Response(proc.stdout).text()).trim().split("\n"); |
| 74 | 74 | expect(await proc.exited).toBe(0); |
| 75 | 75 | const f = statFields(stat!); |
| 76 | expect(Number(f[NICE])).toBe(BACKGROUND_NICE); | |
| 76 | // `nice -n` adds to the niceness the runner already has (a niced check | |
| 77 | // runs this test), capped at 19. | |
| 78 | const mine = Number(statFields(await Bun.file("/proc/self/stat").text())[NICE]); | |
| 79 | expect(Number(f[NICE])).toBe(Math.min(19, mine + BACKGROUND_NICE)); | |
| 77 | 80 | if (Bun.which("chrt") !== null) expect(Number(f[POLICY])).toBe(SCHED_BATCH); |
| 78 | 81 | // Arguments pass as arguments: a space and a `$(…)` are never script. |
| 79 | 82 | expect(args).toBe("a b|$(c)"); |
Raising the timeout hides a slow beforeAll rather than explaining it. If the lane goes red again, wrap each setup step so the failure names the step.