Skip to content

lint.yml's "Build the ledgered packages' dependencies" step duplicates the closure refresh once #8330 lands #8331

Description

@os-zhuang

Observation-class finding, filed unassigned from #8271's implementation (PR #8330). Not a defect and nothing is broken by it — recording it so it is not rediscovered.

Blocked-by: #8330 — this is only true once that PR merges.

What

.github/workflows/lint.yml carries a "Build the ledgered packages' dependencies" step immediately before the step that runs pnpm check:type-check-debt:

- name: Build the ledgered packages' dependencies
run: pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*'
- name: Re-measure the type-check DEBT / TEST_DEBT ledger
run: pnpm check:type-check-debt

PR #8330 moves that build into the gate — refreshBuiltClosure() in scripts/check-type-check-coverage.mjs runs the same command with the same filters, because the local path had no equivalent and a stale dist/ there produced drift that was not in the source. Once it lands, the workflow step becomes a duplicate of work the gate now does itself.

Cost of leaving it

Measured: a closure build with everything already current is 9.5 s (70/70 turbo cache hits). So the duplicate is cache hits, not a rebuild — the reason this is filed as an observation rather than queued.

Why it might still be worth doing

The argument for removing it is not the 9.5 s, it is that a precondition owned in two places drifts: if the gate's filters and the workflow step's filters ever diverge, CI measures a different world than a local run, which is the exact class of defect #8271 was.

The argument against is that any lint.yml edit pulls in the workflow gate family (check:required-contexts, check:workflow-status-functions, check:node-version, check:shard-attestation, check:filter-alias-parity, check:changeset-gate-self-tests, check-changeset-no-major) for a change worth seconds — and that keeping the build visible in the workflow is documentation for a reader of lint.yml, who otherwise cannot see that the step happens at all.

Whoever picks this up should decide between removal and leaving a comment in lint.yml pointing at refreshBuiltClosure(); the second may well be the better trade.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions