Emergency: dev-level unit-red poisoning most open PRs
@tobiu flagged most open PRs red on the unit gate; @neo-gpt independently called it a "full-unit red unrelated CI gate." With the Fable family + Grace + Ada rate-limited ~2h, this is the broadest-blast blocker.
Root cause (V-B-A'd — reproduced locally, deterministic)
Single hard failure: test/playwright/unit/ai/services/graph/handoffRetrospectiveAssembler.spec.mjs:95
const section = render({grain: grains.DAILY, stats: undeclared});
expect(section).toContain('Counts withheld');
expect(section).not.toContain('1'); The withhold render path is correct — it omits all counts and event refs. But the header renders Captured at: ${formatGoldenPathCapturedAt(capturedAt)} and capturedAt defaults to new Date(), formatted YYYY-MM-DD HH:MM UTC. .not.toContain('1') was a blunt proxy for "no naked count / no PR #1 ref leaks," but it also catches the '1' in the wall-clock hour. For the entire 10:00–19:59 UTC block the hour always contains '1', so the test fails every run in that window → reddens every PR's unit check. It merged green during a no-'1' window; the brittleness is clock-dependent.
The Fix (test-only; the render is correct)
- Pin
capturedAt to the spec's fixed NOW so the render is deterministic (remove the new Date() dependency — the root lesson).
- Replace
.not.toContain('1') with contract-precise assertions: the withhold render contains no count line (Merged PRs:) and no event ref (PR #1).
Acceptance Criteria
Meta
Release classification: boardless (CI-hygiene, emergency dev-red). Author owns via emergency pickup (Fable rate-limited; render authored under #14694/#14709).
Origin Session ID: 3bc21462-8122-4b02-81e4-324ed781e1ac
Emergency: dev-level unit-red poisoning most open PRs
@tobiu flagged most open PRs red on the
unitgate; @neo-gpt independently called it a "full-unit red unrelated CI gate." With the Fable family + Grace + Ada rate-limited ~2h, this is the broadest-blast blocker.Root cause (V-B-A'd — reproduced locally, deterministic)
Single hard failure:
test/playwright/unit/ai/services/graph/handoffRetrospectiveAssembler.spec.mjs:95const section = render({grain: grains.DAILY, stats: undeclared}); // no capturedAt → new Date() expect(section).toContain('Counts withheld'); // ✓ expect(section).not.toContain('1'); // ✗ failsThe withhold render path is correct — it omits all counts and event refs. But the header renders
Captured at: ${formatGoldenPathCapturedAt(capturedAt)}andcapturedAtdefaults tonew Date(), formattedYYYY-MM-DD HH:MM UTC..not.toContain('1')was a blunt proxy for "no naked count / noPR #1ref leaks," but it also catches the'1'in the wall-clock hour. For the entire 10:00–19:59 UTC block the hour always contains '1', so the test fails every run in that window → reddens every PR'sunitcheck. It merged green during a no-'1' window; the brittleness is clock-dependent.The Fix (test-only; the render is correct)
capturedAtto the spec's fixedNOWso the render is deterministic (remove thenew Date()dependency — the root lesson)..not.toContain('1')with contract-precise assertions: the withhold render contains no count line (Merged PRs:) and no event ref (PR #1).Acceptance Criteria
handoffRetrospectiveAssembler.spec.mjspasses at any wall-clock time (nonew Date()dependency in the withhold test).unitgate green → unblocks the open-PR backlog.Meta
Release classification: boardless (CI-hygiene, emergency dev-red). Author owns via emergency pickup (Fable rate-limited; render authored under #14694/#14709).
Origin Session ID: 3bc21462-8122-4b02-81e4-324ed781e1ac