From 3fc3af5a61451e99af0f181fed8fb2cb9fbc7903 Mon Sep 17 00:00:00 2001 From: Dotta Date: Wed, 21 Oct 2026 08:41:52 -0500 Subject: [PATCH] test: require every journey before daily qualification rotation Co-Authored-By: Paperclip --- tests/runner-e2e/README.md | 2 +- tests/runner-e2e/dependable-qualification.test.ts | 9 +++++++++ tests/runner-e2e/dependable-qualification.ts | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/runner-e2e/README.md b/tests/runner-e2e/README.md index 2b220d50296..e7f75b61e3f 100644 --- a/tests/runner-e2e/README.md +++ b/tests/runner-e2e/README.md @@ -25,7 +25,7 @@ costs, timings, evidence scanning, and attempt records remain authoritative. The observer receipt is typed and validated as `RunnerE2EResult.dependableWork`; it contains no credentials or provider prose. `dependableDailyExecutions` returns four exact execution IDs per UTC day, rotating all cells in six days. It refuses -to select a journey absent from the catalog. The existing bounded operations +to start the rotation until all 24 exact journeys exist in the catalog. The existing bounded operations manifest and shared journal must own spending and scheduling; this checkpoint does not start work, retry it, or create a second scheduler. diff --git a/tests/runner-e2e/dependable-qualification.test.ts b/tests/runner-e2e/dependable-qualification.test.ts index 079785b1d07..db750966998 100644 --- a/tests/runner-e2e/dependable-qualification.test.ts +++ b/tests/runner-e2e/dependable-qualification.test.ts @@ -221,3 +221,12 @@ it.each(["missing", "duplicate", "linked", "unsafe"])("writes an incomplete repo expect(await readFile(path.join(output, "index.html"), "utf8")).toContain("html"); } finally { await rm(root, { recursive: true, force: true }); } }); + +it("does not start a daily rotation when only today's journeys are registered", () => { + const today = dependableDailySelection("2026-10-20").map(dependableExecutionId); + expect(() => dependableDailyExecutions("2026-10-20", today)).toThrow("not registered"); + const all = DEPENDABLE_CELLS.map(dependableExecutionId); + const later = all.find(id => !today.includes(id))!; + const missingLater = all.filter(id => id !== later); + expect(() => dependableDailyExecutions("2026-10-20", missingLater)).toThrow("not registered"); +}); diff --git a/tests/runner-e2e/dependable-qualification.ts b/tests/runner-e2e/dependable-qualification.ts index ed915212de8..cf15385b71f 100644 --- a/tests/runner-e2e/dependable-qualification.ts +++ b/tests/runner-e2e/dependable-qualification.ts @@ -149,7 +149,7 @@ export function dependableDailySelection(utcDate: string) { export function dependableDailyExecutions(utcDate: string, availableIds: readonly string[]) { const ids = dependableDailySelection(utcDate).map(dependableExecutionId); - const absent = ids.filter(id => !availableIds.includes(id)); + const absent = DEPENDABLE_CELLS.map(dependableExecutionId).filter(id => !availableIds.includes(id)); if (absent.length) throw new Error(`Dependable journeys not registered: ${absent.join(", ")}`); return ids; }