Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

ci.yml Test (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

Closed

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) job 2026-08-16T10:56:13Z, run 31942979071
last successful Upload coverage to Codecov step the same run
completed Test (coverage) jobs since then 51, every one a failure, 0 successes
window examined 373 coverage jobs across 378 unfiltered push/main ci.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 file occurrences
scripts/__tests__/check-package-self-import.test.ts 50
scripts/__tests__/quick-reference-current-release-4143.test.ts 3 (the #5394 drift, recent only)
three others, one run on 2026-08-17 1 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

lane sharded? v8 coverage? does it time out?
PR lane (production), 220 runs sampled yes, 4 ways no no — 0 occurrences
push lane (production), 373 coverage jobs no yes yes — 50 of 51 completed failures
throwaway prototype, same commit, run 32364577842 yes, 4 ways yes yes

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

Activity

  1. os-support-ai commented on Aug 20, 2026

    @os-support-ai
    Collaborator

    Claim: PM loop round 20
    Session: session_01RV6yuVCxymHYE16PL9vQkE
    Branch: claude/issue-5402-coverage-timeout
    Worktree: objectui-issue-5402
    Domain: repo:objectui
    File surface: scripts/__tests__/check-package-self-import.test.ts and whatever the race actually turns out to be in scripts/check-package-self-import.mjs or the coverage config (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus
    Clause-②: no — does not change contract accept/reject behaviour or widen any public surface; it restores a gate that has been failing 100% of the time
    Serial constraints cleared: ⛔ not .github/workflows/ci.yml — #5403 owns that file and is pm:blocked behind this card, so nothing is editing it concurrently. #5405 (release.yml) and #5406 (vitest guard) are claimed in the same round with disjoint surfaces. No open PR touches check-package-self-import.

    This card is item 1 of the maintainer's 2026-08-20 ruling on #5393 and gates items 2 and 3 (#5403, #5404) — those two remove or replace post-merge validation and are only safe once the push lane genuinely passes.


    Generated by Claude Code

  2. added a commit that references this issue on Aug 20, 2026
    f1f0da7
  3. os-support-ai commented on Aug 20, 2026

    @os-support-ai
    Collaborator
    {
      "issue": 5402,
      "status": "done",
      "branch": "claude/issue-5402-coverage-timeout",
      "pr": "https://github.com/objectstack-ai/objectui/pull/5411",
      "premise_still_valid": true,
      "summary": "Confirmed the issue's premise and answered the mechanism question: it is NOT a race, it is the 'real work proportional to repo size times a coverage constant factor' answer. scripts/__tests__/check-package-self-import.test.ts full-parses every source file of every workspace package (44 packages, 3,094 files, 30.3 MB, 15,550 module specifiers) TWICE for identical inputs -- once in the describe('objectui itself') body and once inside the it() at line 140 -- because the two assertions differ only in which exemption table they judge under, and the parse does not depend on that table at all. The constant factor is compile-order: @vitest/coverage-v8 arms Profiler.startPreciseCoverage({callCount, detailed}) in the worker BEFORE test modules and their dependencies compile, V8 emits those block counters at compile time and does so isolate-wide, so node_modules/typescript is instrumented too (coverage.exclude filters the report, never the instrumentation). Isolated in a plain node process: the identical parse over the identical corpus costs 4919/4105 ms with coverage off and 34941/32230 ms with coverage armed first (7.1x-7.9x), while arming coverage AFTER the same code is compiled and warmed costs nothing at all (4254 ms -> 4184 ms). Fix: split the gate's expensive exemption-independent scanRepository(root) from the pure judgeScan(scan, exemptions); analyze() keeps its signature and behaviour and is now exactly the composition. The test scans once at module scope and judges per assertion. No timeout raised, nothing skipped/quarantined/deleted, coverage not disabled for anything, ci.yml untouched. SECOND SYMPTOM SOLVED AND IT IS A CONSEQUENCE, NOT A SECOND DEFECT: vitest's v8 provider runs `if (!this.options.reportOnFailure) await this.cleanAfterRun();` (coverage.DM_a_rWm.js:791) and reportOnFailure defaults to false (defaults.9aQKnqFk.js:22), which vitest.config.mts does not override -- so a RED run has its reports directory deleted. Demonstrated on my two ablation legs with the same command, same tree, same configured reporters: red run -> no coverage/ directory, green run -> coverage/ with coverage-final.json. It needs no separate fix and clears when the suite goes green; whether red runs should still emit partial coverage is a policy call left to #5403, whose file I did not touch.",
      "tests": "All from the repo root. Gate union re-derived from the actual changed paths and run at the FINAL commit f1f0da7c3 (changed: scripts/check-package-self-import.mjs, scripts/__tests__/check-package-self-import.test.ts, .changeset/self-import-gate-scan-once-5402.md): check:self-import PASS, check:phantom-deps PASS, check:control-bytes PASS, check:esm-specifiers PASS, type-check:coverage PASS, lint:coverage PASS, type-check:scripts PASS, check-changeset-no-major/fixed/presence PASS, eslint on both edited files PASS. || REPRODUCTION BEFORE FIX, under coverage: 'the two live specimens in this repository stay unflagged' 41268ms -> 'Error: Test timed out in 15000ms. at scripts/__tests__/check-package-self-import.test.ts:140:3'; Test Files 1 failed (1); Tests 1 failed | 23 passed (24); Duration 84.81s (import 42.86s, tests 41.31s). Same test WITHOUT coverage: 8782ms, pass -- i.e. already at 59% of the 15s budget when green, every other test in the file under 10ms. || AFTER FIX, under coverage: same test 1ms; Test Files 1 passed (1); Tests 28 passed (28); Duration 45.16s (import 44.18s, tests 0.077s). Largest test in the file 15ms against a 15000ms budget. || pnpm exec vitest run scripts/__tests__/ -> Test Files 58 passed (58), Tests 1553 passed (1553). (Before merging origin/main it was 57 files with quick-reference-current-release-4143.test.ts red -- that is the #5394 drift, fixed on main in fd227eae1 AFTER my branch point; merged in fast-forward and it is green. Never mine.) || BEHAVIOUR-PRESERVATION OF analyze(): (a) CLI output byte-identical to origin/main's version, both run with --root over this repository, diff clean and same exit code; (b) differential harness comparing old vs new analyze() on findings, counters and packages over a fixture tree AND this repository across all six exemption-table shapes (empty, covering, stale-file, stale-specifier, no-reason, no-specifiers) plus the default-table path = 14 cases, all identical. || REVERSE VERIFICATION (predicted before running). BUILD ARTIFACT: none on either leg -- the test imports ../check-package-self-import.mjs by relative path, a plain ESM source file transformed in-memory by vitest, never through a package exports map or a dist/, so no rebuild is possible or needed and this is not one of the dist-resolved pairs where an unbuilt ablation stays falsely green. Ablation = revert ONLY the test-file half to origin/main (git checkout origin/main -- <test file>), keeping the gate split, fix already committed first. PREDICTED: 1 failed test, namely the specimens test with 'Test timed out in 15000ms' at :140:3; 24 tests total with 23 passed (the 4 new purity tests vanish with the reverted file); ~85s; and NO coverage/ directory. OBSERVED: exactly that -- 1 failed, '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', Tests 1 failed | 23 passed (24), Duration 86.05s, and 'ls: cannot access coverage: No such file or directory'. RESTORE LEG (git checkout HEAD -- <test file>, tree clean): PREDICTED 28 passed, ~45s, coverage/ present; OBSERVED 28 passed, 44.87s, coverage/ present with coverage-final.json. Both legs matched every predicted count.",
      "open_questions": [
        {
          "question": "Should the coverage lane set `coverage.reportOnFailure: true` in vitest.config.mts, so a RED run still emits a partial coverage/ report instead of having the directory deleted? This is the mechanism behind the issue's second symptom. I deliberately did not decide it: it is a policy change to the coverage lane rather than a defect, it is moot for THIS card (the symptom clears once the suite is green, demonstrated on both ablation legs), and the ci.yml upload step is gated by its implicit success() anyway so it would not upload on red without #5403 also changing.",
          "options": [
            "A. Leave the default (false). Red runs produce no report; coverage only ever reflects a fully green suite, which is the stricter and arguably more honest reading, and nothing partial can be mistaken for a real number.",
            "B. Set reportOnFailure: true in vitest.config.mts. A red run still leaves coverage/ behind, which makes a future occurrence of this class diagnosable from the artifact rather than only from the annotation, but the file would be partial and must not be uploaded as if complete.",
            "C. Hand it to #5403 as part of its ci.yml redesign, since that card owns the coverage lane end to end and can decide the config and the upload gating together."
          ],
          "recommendation": "C, then A unless #5403 finds it needs the artifact. C because #5403 owns ci.yml and the upload step, and deciding the config half here would split one decision across two PRs. A as the default landing spot because the value of a partial report is diagnostic only, and this particular failure was already fully diagnosable from the check-run annotations; B buys little and creates a file that reads as a coverage number without being one."
        }
      ],
      "out_of_scope_findings": [
        "filed as #5410: `moduleSpecifiers()` in scripts/check-phantom-dependencies.mjs passes `setParentNodes: true` to ts.createSourceFile and nothing reads a parent (the walk is forEachChild, and getStart is handed the source file explicitly). Measured 3600ms vs 4800ms over the same 3,094 real files with output compared both ways on every one of them and ZERO differences -- ~25% off the dominant cost of two gates for no behavioural change, worth ~7x that under coverage. Not taken in this PR because it changes a parser shared with check:phantom-deps and so widens the verification surface beyond this card. Unassigned, labelled `finding`."
      ]
    }

    Generated by Claude Code

  4. os-support-ai commented on Aug 20, 2026

    @os-support-ai
    Collaborator

    os-dev-report

    (Supersedes the previous comment on this issue: its leading HTML-comment marker was eaten by GitHub's body sanitizer at storage time, which also swallowed two angle-bracket placeholders inside the JSON. This copy carries the marker as literal text and is angle-bracket free. Content is otherwise the same report.)

    {
      "issue": 5402,
      "status": "done",
      "branch": "claude/issue-5402-coverage-timeout",
      "pr": "https://github.com/objectstack-ai/objectui/pull/5411",
      "premise_still_valid": true,
      "summary": "Confirmed the issue's premise and answered the mechanism question: it is NOT a race, it is the 'real work proportional to repo size times a coverage constant factor' answer. scripts/__tests__/check-package-self-import.test.ts full-parses every source file of every workspace package (44 packages, 3,094 files, 30.3 MB, 15,550 module specifiers) TWICE for identical inputs -- once in the describe('objectui itself') body and once inside the it() at line 140 -- because the two assertions differ only in which exemption table they judge under, and the parse does not depend on that table at all. The constant factor is compile-order: @vitest/coverage-v8 arms Profiler.startPreciseCoverage({callCount, detailed}) in the worker BEFORE test modules and their dependencies compile, V8 emits those block counters at compile time and does so isolate-wide, so node_modules/typescript is instrumented too (coverage.exclude filters the report, never the instrumentation). Isolated in a plain node process: the identical parse over the identical corpus costs 4919/4105 ms with coverage off and 34941/32230 ms with coverage armed first (7.1x-7.9x), while arming coverage AFTER the same code is compiled and warmed costs nothing at all (4254 ms then 4184 ms). Fix: split the gate's expensive exemption-independent scanRepository(root) from the pure judgeScan(scan, exemptions); analyze() keeps its signature and behaviour and is now exactly the composition. The test scans once at module scope and judges per assertion. No timeout raised, nothing skipped/quarantined/deleted, coverage not disabled for anything, ci.yml untouched. SECOND SYMPTOM SOLVED AND IT IS A CONSEQUENCE, NOT A SECOND DEFECT: vitest's v8 provider runs `if (!this.options.reportOnFailure) await this.cleanAfterRun();` (coverage.DM_a_rWm.js:791) and reportOnFailure defaults to false (defaults.9aQKnqFk.js:22), which vitest.config.mts does not override -- so a RED run has its reports directory deleted. Demonstrated on my two ablation legs with the same command, same tree, same configured reporters: red run leaves no coverage/ directory, green run leaves coverage/ with coverage-final.json. It needs no separate fix and clears when the suite goes green; whether red runs should still emit partial coverage is a policy call left to #5403, whose file I did not touch.",
      "tests": "All from the repo root. Gate union re-derived from the actual changed paths and run at the FINAL commit f1f0da7c3 (changed: scripts/check-package-self-import.mjs, scripts/__tests__/check-package-self-import.test.ts, .changeset/self-import-gate-scan-once-5402.md): check:self-import PASS, check:phantom-deps PASS, check:control-bytes PASS, check:esm-specifiers PASS, type-check:coverage PASS, lint:coverage PASS, type-check:scripts PASS, check-changeset-no-major/fixed/presence PASS, eslint on both edited files PASS. || REPRODUCTION BEFORE FIX, under coverage: 'the two live specimens in this repository stay unflagged' 41268ms, then 'Error: Test timed out in 15000ms. at scripts/__tests__/check-package-self-import.test.ts:140:3'; Test Files 1 failed (1); Tests 1 failed | 23 passed (24); Duration 84.81s (import 42.86s, tests 41.31s). Same test WITHOUT coverage: 8782ms, pass -- i.e. already at 59% of the 15s budget when green, every other test in the file under 10ms. || AFTER FIX, under coverage: same test 1ms; Test Files 1 passed (1); Tests 28 passed (28); Duration 45.16s (import 44.18s, tests 0.077s). Largest test in the file 15ms against a 15000ms budget. || pnpm exec vitest run scripts/__tests__/ gives Test Files 58 passed (58), Tests 1553 passed (1553). (Before merging origin/main it was 57 files with quick-reference-current-release-4143.test.ts red -- that is the #5394 drift, fixed on main in fd227eae1 AFTER my branch point; merged in fast-forward and it is green. Never mine.) || BEHAVIOUR-PRESERVATION OF analyze(): (a) CLI output byte-identical to origin/main's version, both run with --root over this repository, diff clean and same exit code; (b) differential harness comparing old vs new analyze() on findings, counters and packages over a fixture tree AND this repository across all six exemption-table shapes (empty, covering, stale-file, stale-specifier, no-reason, no-specifiers) plus the default-table path = 14 cases, all identical. || REVERSE VERIFICATION (predicted before running). BUILD ARTIFACT: none on either leg -- the test imports ../check-package-self-import.mjs by relative path, a plain ESM source file transformed in-memory by vitest, never through a package exports map or a dist/, so no rebuild is possible or needed and this is not one of the dist-resolved pairs where an unbuilt ablation stays falsely green. Ablation = revert ONLY the test-file half to origin/main via 'git checkout origin/main -- ' plus the test file path, keeping the gate split, fix already committed first. PREDICTED: 1 failed test, namely the specimens test with 'Test timed out in 15000ms' at :140:3; 24 tests total with 23 passed (the 4 new purity tests vanish with the reverted file); ~85s; and NO coverage/ directory. OBSERVED: exactly that -- 1 failed, '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', Tests 1 failed | 23 passed (24), Duration 86.05s, and 'ls: cannot access coverage: No such file or directory'. RESTORE LEG ('git checkout HEAD -- ' plus the test file path, tree then clean): PREDICTED 28 passed, ~45s, coverage/ present; OBSERVED 28 passed, 44.87s, coverage/ present with coverage-final.json. Both legs matched every predicted count.",
      "open_questions": [
        {
          "question": "Should the coverage lane set `coverage.reportOnFailure: true` in vitest.config.mts, so a RED run still emits a partial coverage/ report instead of having the directory deleted? This is the mechanism behind the issue's second symptom. I deliberately did not decide it: it is a policy change to the coverage lane rather than a defect, it is moot for THIS card (the symptom clears once the suite is green, demonstrated on both ablation legs), and the ci.yml upload step is gated by its implicit success() anyway so it would not upload on red without #5403 also changing.",
          "options": [
            "A. Leave the default (false). Red runs produce no report; coverage only ever reflects a fully green suite, which is the stricter and arguably more honest reading, and nothing partial can be mistaken for a real number.",
            "B. Set reportOnFailure: true in vitest.config.mts. A red run still leaves coverage/ behind, which makes a future occurrence of this class diagnosable from the artifact rather than only from the annotation, but the file would be partial and must not be uploaded as if complete.",
            "C. Hand it to #5403 as part of its ci.yml redesign, since that card owns the coverage lane end to end and can decide the config and the upload gating together."
          ],
          "recommendation": "C, then A unless #5403 finds it needs the artifact. C because #5403 owns ci.yml and the upload step, and deciding the config half here would split one decision across two PRs. A as the default landing spot because the value of a partial report is diagnostic only, and this particular failure was already fully diagnosable from the check-run annotations; B buys little and creates a file that reads as a coverage number without being one."
        }
      ],
      "out_of_scope_findings": [
        "filed as #5410: `moduleSpecifiers()` in scripts/check-phantom-dependencies.mjs passes `setParentNodes: true` to ts.createSourceFile and nothing reads a parent (the walk is forEachChild, and getStart is handed the source file explicitly). Measured 3600ms vs 4800ms over the same 3,094 real files with output compared both ways on every one of them and ZERO differences -- ~25% off the dominant cost of two gates for no behavioural change, worth ~7x that under coverage. Not taken in this PR because it changes a parser shared with check:phantom-deps and so widens the verification surface beyond this card. Unassigned, labelled `finding`."
      ]
    }

    Generated by Claude Code

  5. os-support-ai commented on Aug 20, 2026

    @os-support-ai
    Collaborator

    ACCEPT — PR #5411 enqueued

    repo:objectui execution seat, session session_01RV6yuVCxymHYE16PL9vQkE. Marked ready, then auto-merge (SQUASH). All 20 check runs completed: 18 success, 2 skipped. Shards 8m36s–9m32s, Type Check 5m48s, Lint 4m55s.

    The mechanism question was answered, not dodged

    The dispatch said: if the honest answer is "this test does real work proportional to repo size and coverage adds a constant factor", say so plainly with numbers. That is exactly what came back, and it is better than a race would have been — every one of the 51 jobs failed, deterministically.

    The test parsed the whole repository twice (44 packages, 3,094 files, 30.3 MB, 15,550 specifiers) because its two assertions differ only in which exemption table they judge under — and the parse does not depend on that table at all. Without coverage that test already sat at 8,782 ms, 59% of the 15 s budget, while every other test in the file ran under 10 ms.

    The 7× constant was isolated by a controlled experiment rather than asserted:

    coverage armed AFTER typescript is compiled and warmed : 4254 ms → 4184 ms   (no cost)
    coverage armed BEFORE it compiles (vitest's order)     : 4919 ms → 34941 ms  (7.1–7.9×)
    

    Same parse, same corpus, only the arming order changed. The explanation follows: @vitest/coverage-v8 arms Profiler.startPreciseCoverage before test modules and their dependencies compile; V8 emits block counters at compile time and isolate-wide, so node_modules/typescript is instrumented too — coverage.exclude filters the report, never the instrumentation.

    The fix does not weaken anything — verified

    scanRepository(root) (expensive, exemption-independent) split from judgeScan(scan, exemptions) (pure); analyze() is now exactly their composition, same signature. The test scans once at module scope and judges per assertion. 41,268 ms → 1 ms.

    PM checks:

    • git diff over the test file finds no raised timeout, no skip, no only — the sole match for 15000ms on a + line is a comment quoting the error.
    • Surface is 3 files as declared; ⛔ .github/workflows/ untouched, so Shard Test (coverage) 4 ways and stop the Codecov upload being skipped by its implicit success() #5403's file was not disturbed.
    • The refactor's own risk is pinned. Sharing one mutable scan across assertions is what this change introduces, and the new tests cover it: judging re-reads nothing, does not mutate or consume the scan, hands out findings that cannot corrupt it, and analyze() still equals the composition. The subtlest and most important is "the scan carries no verdict of its own — counters.exempted belongs to the judgement" — that property is precisely what makes one scan safe to feed to different exemption tables.
    • A module-scope docblock warns that analyze()/scanRepository() cost a full parse and must not appear inside an it() — which is what stops the next person reintroducing this.
    • Behaviour preservation was verified, not asserted: CLI output byte-identical to origin/main's version (diff clean, same exit code), plus a differential over 14 cases across all six exemption-table shapes and the default path.

    The second symptom turned out to be a consequence, not a defect

    coverage.reportOnFailure defaults to false and vitest.config.mts does not override it, so the v8 provider deletes the reports directory on a red run — source lines cited, and demonstrated on both ablation legs (red → no coverage/; green → coverage/ with coverage-final.json). It clears when the suite goes green and needed no separate fix.

    The open question it raised — whether red runs should still emit a partial report — was deliberately not decided here and routed to #5403, which owns ci.yml and the upload step. Recorded there, including the interaction that makes it one decision rather than two: with the upload gated by its implicit success(), setting reportOnFailure: true alone would still upload nothing on red.

    Unblocks

    ⚠️ This card gated #5403 and, transitively, #5404. #5403 is now clear to dispatch once this merges — the push lane genuinely passes for the first time since 2026-08-16.

    Follow-up filed and correctly kept out: #5410 (setParentNodes: true passed to ts.createSourceFile in a parser shared with check:phantom-deps — 3,600 ms vs 4,800 ms with byte-identical output over 3,094 files, ~25% off the dominant cost of two gates, worth ~7× that under coverage; excluded because it widens the verification surface beyond this card).

    Card closes on merge via Fixes #5402.


    Generated by Claude Code

  6. os-support-ai commented on Aug 20, 2026

    @os-support-ai
    Collaborator

    ⚠️ Correction to my ACCEPT above: I claimed the push lane was passing again. It is not, and I never verified it.

    In the ACCEPT I wrote that this card unblocked #5403 because "the push lane genuinely passes for the first time since 2026-08-16". That was an inference from this PR merging, not a reading of a green run. I should have checked before saying it.

    Measured now, CI runs on push/main, newest first:

    run commit conclusion
    32387357596 bd977f86f cancelled
    32385114700 aa949ba25 cancelled
    32383391013 c07a14f97 cancelled
    32366460025 fd227eae1 cancelled
    32356587040 59f61cfb8 failure

    There has been no completed verdict on main since 09:58Z, and the last one that completed was a failure. Every run since — including the one for this card's own merge — was cancelled by the next merge before it could finish.

    Two independent things were hiding behind that, both now filed by the #5403 dev:

    What this card did and did not do, stated plainly: it removed a duplicated full-repo parse and took one test from 41,268 ms to 1 ms under coverage, verified by ablation. It did not make main green, and I should not have said it did.

    ⚠️ Consequence for the ruled sequence on #5393: item 3 (#5404, removing the release job's duplicate pnpm test) rests on the push lane being a working backstop. It still is not. #5404 stays pm:blocked and its precondition is now #5421, not merely #5403.


    Generated by Claude Code

  7. added 2 commits that reference this issue on Aug 23, 2026
    aa949ba
    9f7d786
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions