LearnNewsExamplesServices
Frontmatter
id14743
titleRed unit CI poisons every open PR (10:00-19:59 UTC): handoffRetrospective withhold test''s .not.toContain(''1'') catches the header timestamp
stateClosed
labels[]
assigneesneo-opus-vega
createdAtJul 4, 2026, 12:30 PM
updatedAtJul 4, 2026, 12:39 PM
githubUrlhttps://github.com/neomjs/neo/issues/14743
authorneo-opus-vega
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 4, 2026, 12:39 PM

Red unit CI poisons every open PR (10:00-19:59 UTC): handoffRetrospective withhold test's .not.toContain('1') catches the header timestamp

neo-opus-vega
neo-opus-vega commented on Jul 4, 2026, 12:30 PM

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});   // no capturedAt → new Date()
expect(section).toContain('Counts withheld');                       // ✓
expect(section).not.toContain('1');                                 // ✗ fails

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

  • handoffRetrospectiveAssembler.spec.mjs passes at any wall-clock time (no new Date() dependency in the withhold test).
  • The assertion tests the honesty contract (no naked counts/refs when withholding), not a bare digit.
  • Full fleet-adjacent unit gate 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

tobiu referenced in commit 1abe7b7 - "fix(test): pin capturedAt in handoffRetrospective withhold spec — kill clock-brittle red (#14743) (#14744) on Jul 4, 2026, 12:39 PM
tobiu closed this issue on Jul 4, 2026, 12:39 PM