Skip to content

ci.ymlTest (coverage) has failed 100% of the time since 2026-08-16 — one test times out under v8 coverage, and Codecov has received nothing since #5402

Description

@claude

Found while re-measuring the CI cost model for #5395. Filing it separately because it is a
concrete defect, not a cost question, and neither #5393 (cost) nor #5394 (QUICK_REFERENCE.md
drift) covers it. Not assigned to anyone and nothing has been changed — this card is a
measurement card and did not touch it.

ci.yml's Test (coverage) job has failed 100% of the time since 2026-08-16, so Codecov has received nothing since

last successful Test (coverage) job2026-08-16T10:56:13Z, run 31942979071
last successful Upload coverage to Codecov stepthe same run
completed Test (coverage) jobs since then51, every one a failure, 0 successes
window examined373 coverage jobs across 378 unfiltered push/mainci.yml runs, 2026-08-12 .. 2026-08-20

The Upload coverage to Codecov step has no if:, so it carries the implicit success() and
is skipped whenever the test step fails. It is skipped in 311 of the 373 coverage jobs, and
in 120 of the 121 most recent ones.

It is one test, and it is a timeout not an assertion

Reading GitHub's check-run annotations for all 51 completed failures:

failing test fileoccurrences
scripts/__tests__/check-package-self-import.test.ts50
scripts/__tests__/quick-reference-current-release-4143.test.ts3 (the #5394 drift, recent only)
three others, one run on 2026-08-171 each
[unit] scripts/__tests__/check-package-self-import.test.ts
> a package name that is not a module edge is not a finding
> the two live specimens in this repository stay unflagged
Error: Test timed out in 15000ms.
at scripts/__tests__/check-package-self-import.test.ts:140:3

First occurrence 2026-08-16T12:48:02Z — the run immediately after the last green one.

The discriminator is v8 coverage instrumentation, not load — measured by ablation

lanesharded?v8 coverage?does it time out?
PR lane (production), 220 runs sampledyes, 4 waysnono — 0 occurrences
push lane (production), 373 coverage jobsnoyesyes — 50 of 51 completed failures
throwaway prototype, same commit, run 32364577842yes, 4 waysyesyes

Counter-probe for the PR-lane zero: the identical annotation scan over the identical PR shard
jobs does return results (7 annotations naming vite-alias-closure.test.ts,
AppContent.systemHubRoutes.test.tsx, vite-objectstack-spec-dist.test.ts,
check-type-check-coverage.test.ts, check-changeset-no-major.test.ts), and the same call
against the push lane returns 50 hits for this file. The method resolves; the zero is real.

So splitting the job 4 ways does not fix it — that was measured, not assumed. Coverage
instrumentation pushes this one test past its 15-second budget regardless of how much else is
running alongside it.

Per AGENTS.md's testing section, the fix direction for "an unbounded cost inside a bounded
window" is to find the race rather than raise the timeout — this issue records the measurement,
not a prescription.

Second, independent symptom found while prototyping

On a failing suite, the live unsharded recipe
(pnpm test:coverage --coverage.reporter=json --coverage.reporter=text) leaves no
coverage/ directory at all
. Reproduced 2 of 2 on the same commit — run 32364577842
(NO COVERAGE FILE at coverage/coverage-final.json, after 39m05s) and run 32368063518
(NO coverage/ DIRECTORY AT ALL after the live unsharded run, after 39m25s) — while the same
tree run through vitest's blob-report path produced a complete 1287-file report every time.

So there are two independent reasons Codecov is dark, not one: the upload step is skipped by its
implicit success(), and there would be no file for it to upload anyway. As long as the
suite is red, this job cannot produce a coverage report at all. The mechanism was not identified
— the Actions log CDN is blocked from the measuring session.

Why this matters beyond coverage percentages

ci.yml's own comment justifies keeping this job unsharded as "one unsharded run so Codecov
still receives a single complete report"
. That justification has been delivering nothing for
four days, which is worth knowing before #5393 is ruled on.

Full measurement, method and counter-probes: #5395.


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions