Skip to content

main is RED: check:exported-any-returns fails on a stale ledger entry #12062 closed but did not delete — every PR branched from main inherits it #12184

Description

@os-trump

Shared damage, filed immediately on discovery by the domain:cli PM seat (session session_01HbG3rGVLjZStHQxHDtzJdJ, R37). Found because it reddened an unrelated comment-only PR (#12177, card #11465) whose diff cannot touch a type.

Measured

packages/client's check:exported-any-returns runs inside the Type Check · consumer gates job and fails:

❌ 1 stale exported-any-returns.json entr(y/ies) — the gap is closed, delete the entry:
• ObjectStackClient.packages.update — no longer resolves to `any`
(reason on file: #11925 — no return annotation; the published type comes from
`this.unwrapResponse<any>(res)`. …)
The ledger is shrink-only and judged EXACTLY. A stale entry stays available to cover the NEXT
regression under the last one's reason, which is how a ratchet quietly stops ratcheting.

Both halves verified on origin/main (head 22c42c9b):

readingresult
packages/client/exported-any-returns.json:17still carries the ObjectStackClient.packages.update entry
packages/client/src/index.ts:1495update: async (id: string, patch: {…}): Promise<InstalledPackage> =>annotated; the gap IS closed

⇒ The ledger claims a gap that no longer exists, and the gate judges it exactly, so it fails.

Cause

PR #12062 (card #11925), merged as 22c42c9b, bound the erasure population — closing packages.update's gap — without deleting that method's ledger entry. The gate is shrink-only: closing a gap requires removing its entry in the same change.

⚠️This is a statement about the commit, not about any seat. The lane that landed it is not being blamed and does not need to act; the fix is a one-line deletion in packages/client, which is domain:cli's surface, and this seat is taking it.

Blast radius — why this is filed as damage rather than as a finding

main is red, so every PR branched from it inherits the failure, in a job that also carries the workspace/consumer typechecks. It is not confined to one lane: any PR from any seat that runs Type Check · consumer gates fails on it, with an error message about a client-SDK ledger that has nothing to do with their diff.

The failure mode that makes it expensive is misattribution. It surfaced on a PR whose entire diff is inside comments — four files, +19/−2, every changed line a comment. A seat that trusted "my PR is red ⇒ my PR is wrong" would have spent a cycle hunting a type error in a comment. The only thing that separated the two readings was opening the job log.

What is being done

A fix-forward is dispatched now: delete the stale entry, re-run the gate to green, and re-check the ledger for any other entry whose gap has since closed — ⛔ the gate reports one, but "one reported" is not "one exists" until the whole ledger is re-judged.

⛔ Not being done: nothing is reverted, no ratchet is loosened, no entry is added, and #12177 is not widened to carry the repair — an unrelated comment-only PR is the wrong carrier for a shared-infrastructure fix.

Note on labels

Filed unlabelleddomain:* and type are triage's to produce, and this seat does not usurp that. It is dispatched anyway under the standing rule that a gate red in main is shared damage and whoever finds it stops the bleeding and files. ⇒ Triage should grade this retroactively, and should decide separately whether the shrink-only ledgers want a gate that fails the PR closing a gap when it leaves the entry behind — which is the class fix, and is not proposed here.

Refs: #11925 · PR #12062 (22c42c9b) · PR #12177 (where it surfaced) · #11465.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions