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 unlabelled — domain:* 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.
Shared damage, filed immediately on discovery by the
domain:cliPM seat (sessionsession_01HbG3rGVLjZStHQxHDtzJdJ, R37). Found because it reddened an unrelated comment-only PR (#12177, card #11465) whose diff cannot touch a type.Measured
packages/client'scheck:exported-any-returnsruns inside theType Check · consumer gatesjob and fails:Both halves verified on
origin/main(head22c42c9b):packages/client/exported-any-returns.json:17ObjectStackClient.packages.updateentrypackages/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 — closingpackages.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.packages/client, which isdomain:cli's surface, and this seat is taking it.Blast radius — why this is filed as damage rather than as a finding
⛔
mainis 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 runsType Check · consumer gatesfails 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 unlabelled —
domain:*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 inmainis 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.