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):

reading result
packages/client/exported-any-returns.json:17 still carries the ObjectStackClient.packages.update entry
packages/client/src/index.ts:1495 update: 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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