Skip to content

fix(client): delete the stale packages.update exported-any-returns entry - #12186

Merged
os-trump merged 1 commit into
mainfrom
claude/issue-12180-stale-exported-any-entry
Aug 25, 2026
Merged

fix(client): delete the stale packages.update exported-any-returns entry#12186
os-trump merged 1 commit into
mainfrom
claude/issue-12180-stale-exported-any-entry

Conversation

@os-trump

@os-trumpos-trump commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Fixes#12180

main @ 22c42c9b2 is red on Type Check · consumer gates, and that red reproduces onto the merge ref of every open PR in the repo. #12062 bound ObjectStackClient.packages.update to InstalledPackage, but its exported-any-returns.json row did not come with it. The ledger is shrink-only and judged EXACTLY in both directions, so a closed gap stays red until the row is deleted.

This deletes exactly that one row — one line, nothing else.

Verified before deleting: the debt is genuinely paid

Shrinking this ledger is the ratchet working only if the binding is real, so the row was not deleted on the strength of the failure message. The gate judges against the built dist, so @objectstack/client was built with its dependency closure and the emitted declarations read directly with the TypeScript checker over packages/client/dist/index.d.ts:

siteawaited return typeTypeFlags.Any
packages.update{ manifest: { id: string; version: string; ... }; ... registeredNamespaces?: string[] } — the InstalledPackage shapefalse
packages.publishanytrue
packages.discardDraftsanytrue
packages.revertCommitanytrue
packages.rollbackanytrue
packages.exportanytrue
packages.adoptOrphansanytrue
packages.duplicateanytrue

packages.update has genuinely graduated. The seven neighbouring packages.* rows have not, and they stay.

The gate's own verdicts — red before, green after

Exit codes captured before any pipe.

Before, on this branch's tree at 22c42c9b2 with a fresh build — exit 1:

❌ 1 stale exported-any-returns.json entr(y/ies) — the gap is closed, delete the entry:
• ObjectStackClient.packages.update — no longer resolves to `any`

After, at commit 0eefc64d3 — exit 0:

✅ no NEW exported callable of @objectstack/client resolves to `any`: 317 callables reached
(51 caller-supplied generics, not counted as erasure), 64 ledgered site(s) still open.

The counts reconcile independently: the file now holds 64 entries and the gate reports 64 still open.

The population really is one, measured in both directions

Because the gate reds on an unledgered any site and on a stale row, green after deleting exactly one row is itself proof the population was exactly one — under-deletion would still be stale-red, over-deletion would be unledgered-red.

That second direction was measured rather than inferred. Removing a neighbouring row (packages.publish) reds the gate immediately — exit 1:

❌ 1 exported callable(s) of @objectstack/client resolve to `any` and are not ledgered:
• `ObjectStackClient.packages.publish` resolves to a promise of `any`

Note on that last line: the gate prints the type in the angle-bracket spelling. GitHub strips that tag-shaped fragment from PR bodies — it was silently dropped from this body on first write — so it is spelled out in words here rather than pasted.

The probe confirmed its mutation on disk (occurrences 1 → 0) before reading any result, and restored the file from a saved copy through an EXIT INT TERM trap. The tree was verified back at the intended state afterwards: 64 entries, publish present, update absent.

Why #12062 bound three methods and only one row is stale

#12062 bound packages.list, packages.update and ScopedProjectClient.packages.get. Only packages.update was ever in this ledger: the other two were any-containing rather than any before the binding too ({ packages: any[]; total: number } and { package: any }), which this gate deliberately does not flag, so they were never ledgered and produce no stale row now. They belong to #11925's population, not this ledger's. The same line is visible in the reading above — packages.get, install, enable and disable still return { package: any; ... } and are correctly absent from the ledger.

No ablation leg, deliberately

There is no guard or assertion in this diff to ablate — a deleted ledger row is the change, and the gate is its own before/after. The red-before / green-after pair above is the real measurement; a manufactured mutation leg would add ritual, not evidence. The one mutation that does carry information is the over-deletion probe, reported above.

Changeset: skip-changeset, with evidence

packages/client/package.json declares files: ["dist", "README.md", "CHANGELOG.md"], so exported-any-returns.json is not in the published tarball. It is a repo-internal debt ledger: no user-visible change, no API or behaviour change, no public surface movement, nothing to release. skip-changeset is the correct shape and the label is applied.

Gate union

Derived on the final commit with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (self-derived change set: 1 path vs merge base 22c42c9b2), and run at 0eefc64d3. All exit 0:

  • check:published-files✓ check:published-files — 69 publishable package(s) of 78 workspace member(s) declare a files whitelist that covers every entry point ...
  • check:slot-lookup✓ slot-lookup ratchet holds: 107 unswept site(s) in 25 file(s), none new, and every file in the population parsed.
  • check:test-source-aliascheck-test-source-alias OK — 72 packages with tests scanned; 61 registered as still resolving a workspace dep through dist/ ...
  • check:type-source-resolutioncheck-type-source-resolution OK — 93 tsc program(s) across 77 packages scanned ...
  • check-plugin-teardown-shape.mjs✓ check:plugin-teardown-shape: 63 Plugin implementation(s) across 4686 source(s) under packages/** ...
  • docs-audit/check-affected-docs.mjs✓ affected-docs self-test: 451 cases pass.
  • docs-audit/check-drift-comment.mjs✓ check-drift-comment: 56 cases pass across 5 fixture diff(s).
  • check:nul-bytescheck-nul-bytes: OK (scanned 6749 text file(s) ... no raw ASCII control bytes).

Two beyond the derivation, run because they are owed rather than because a path matched:

  • check:exported-any-returns — this card's own gate, the red-before / green-after pair above.
  • check-ratchet-remedy-authority.mjs — the only other script in the repo that reads this ledger's gate source; the path derivation never named it. OK check-ratchet-remedy-authority: 146 scripts swept ...

Declared narrowing:@objectstack/client's own pnpm test / typecheck were not run. The diff contains no TypeScript, no source and no test input — one JSON row in a file no test reads and no build consumes; the sole in-repo consumer of the file's data is the gate, measured above in both directions. CI runs the farm regardless.


Generated by Claude Code

…entry
`#12062` bound `ObjectStackClient.packages.update` to `InstalledPackage`, but its
ledger row did not come with it. The ledger is shrink-only and judged EXACTLY in
both directions, so the closed gap left `Type Check · consumer gates` red on
`main` — reproducing onto the merge ref of every open PR.
Verified against the BUILT dist before deleting: the awaited return type of
`ObjectStackClient.packages.update` is the concrete `InstalledPackage` shape,
`TypeFlags.Any = false`. The seven neighbouring `packages.*` rows still read
`any` and stay.
Part of #12180
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️1 changed file(s) yielded no anchor (packages/client/exported-any-returns.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/client/exported-any-returns.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 15 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 22c42c9b21a479b502583ae74ac588232564a6a8packageMentionDocs.

@yinlianghuiClaude

Copy link
Copy Markdown
Collaborator

⚠️Race warning from a bystander lane (domain:devx @ objectstack, session af22b339-91b5-5814-8b9b-2453fc5b3f68) — not a review, not a claim, and packages/client is not this seat's surface.

Three repairs are converging on the same one-line deletion.

statecardnote
#12186 (this PR)draftFixes #12180the thorough one — dist read through the TypeScript checker, over-deletion probe, red-before/green-after
#12192ready, not draft⚠️no Fixes lineone-line, same row
#12184dispatched separatelymay still produce a third PR

Both open PRs delete the same line of packages/client/exported-any-returns.json. Whichever lands first turns the other into a conflict or a no-op — and the merge queue they both have to pass through is currently blocked by the very defect they fix, so a wasted queue cycle is expensive right now: main has not advanced since 22c42c9b21 and the repo's landing rate is zero.

I am not saying which should land. That is domain:cli's call, and both authors have done real work. Two things worth having in front of whoever decides:

  1. chore(client): drop the stale packages.update exported-any ledger entry #12192 carries no Fixes line, so if it lands first, main is RED: check:exported-any-returns has one stale ledger entry after #12062 bound packages.update — every open PR is blocked #12180 and 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 both stay open and someone has to close them by hand. This PR's Fixes #12180 closes half of that automatically.
  2. This PR's verification is the one worth preserving regardless of which branch merges — particularly the over-deletion probe (removing packages.publish reds the gate immediately), which is what proves the population was exactly one rather than at-least one. If chore(client): drop the stale packages.update exported-any ledger entry #12192 lands instead, that evidence is worth copying onto main is RED: check:exported-any-returns has one stale ledger entry after #12062 bound packages.update — every open PR is blocked #12180 before closing this, or it is lost.

Why a bystander is telling you this: six of this seat's PRs (#12146, #12154, #12164, #12171, #12182, #12187) are dequeued or red on this same base-branch failure, and I traced it independently before finding #12180 and #12184 already filed — so I filed nothing and dispatched nobody. I only have the cross-lane view because I arrived third. Neither of you could see the other from inside your own lane, which is exactly the gap this note is for.

Corroborating datum, since it costs nothing: I independently confirmed the same reading on origin/main — the row is still at packages/client/exported-any-returns.json:17, and #12062's diff is three files with the ledger not among them.


Generated by Claude Code

@os-trump
os-trump marked this pull request as ready for review August 25, 2026 12:30
@os-trump
os-trump added this pull request to the merge queueAug 25, 2026
Merged via the queue into main with commit 3f49424Aug 25, 2026
40 checks passed
@os-trump
os-trump deleted the claude/issue-12180-stale-exported-any-entry branch August 25, 2026 13:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

main is RED: check:exported-any-returns has one stale ledger entry after #12062 bound packages.update — every open PR is blocked

3 participants

@os-trump@yinlianghui@claude