docs(changeset): drop the deleted api-surface-declarations family from four pending release notes - #19627
Conversation
…m four pending release notes The revert 2277d1f deleted packages/spec/api-surface-declarations/ (17 shards plus its build script), its two package scripts, and its entry in packages/spec's files[]. Four unreleased changesets still described that family in prose, and a release compiles changeset prose verbatim into CHANGELOG.md before deleting the consumed file -- so the next cut would publish sentences telling a reader the package ships a directory it does not. Five sentences, one per stale claim: - 17108: the projection clause named api-surface-declarations/ui.txt; the surviving generated projection named in the same sentence (content/docs/references/ui/component.mdx) is kept and verified to carry the widening. - 18605: api-surface-declarations dropped from the list of unchanged artifacts. - 19085: check:api-surface-declarations dropped; that script no longer exists in packages/spec's manifest. - 18991, two spots. The stated reason to publish rested on two files[] entries, one of which is gone. Re-measured: the surviving entry carries it alone. dist/ is in files[], and dist/data/index.d.ts reproduces BOTH corrected docblocks byte-for-byte against src/data/api-derivation.ts -- the ResolveApiOptions.userExportAllowed member block (sha256 fe70486a...) and the API_METHOD_DERIVATION leading block (sha256 2f78bac0...). So the publish decision stands and only the prose is repaired. The parenthetical about leading TSDoc being excluded was specific to the deleted artifact's recording rule and would be false of the emitted declaration, which carries leading docblocks too, so it goes with it. No new changeset and no label: correcting a pending release note is an edit to that note, not an erratum in a later entry. Claude-Session: https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgmentsRe-measured from GitHub and the tree at the head sha. ⛔ Nothing below is adopted from the PR body or the dispatch. Instrument radius, stated first so the zeros are readable. The working checkout is a SHALLOW clone — 7 commits reachable from the base — and its HEAD Diff shape. 4 files, The family is gone, and these four files were the last of it. At the head, a tree-wide The window is real, not rhetorical. Release PR #17076 is open and not a draft, bumps The five repairs, judged one at a time.
No new changeset, and that is right on both legs. Reproduced at full workspace radius: 81 workspace manifests, 70 carrying a Affected packages: none — derived structurally rather than re-run. No
PR body does the author's half of the remedy. It names each of the four notes and exactly what changed under each, and it states plainly that the confirmation is the maintainer's word and outstanding. ② Semver level
⇒ consumer-visible published bytes move. Per The staleness caveat, weighed rather than inherited — it closes, for a reason the PR body does not give. The author's self-dating argument is sound but narrow: the distinctive phrase dates only the one block that contains it. The decisive fact is that Nit, nothing publishing: the two sha256 prefixes quoted in the PR body are not reproducible without the exact normalizer used — mine differ under a different whitespace normalization while the equality verdict reproduces identically. The verdict is what carries weight; the digests are weak evidence for a later reader. PR-body only, absent from the shipped prose, so ⛔ not a finding. The other three notes keep ③ Boundary flagsCI at review time, on Outstanding, for the maintainer and not for this seat: the written confirmation the #18375 ruling requires — arm ② B, the maintainer's own word on the PR with who / what / where, naming the note and what changed under it. This PR carried zero comments before this record, so it is unmet. ⛔ Neither this seat's nor the author's to supply; it is the other half of the remedy and it gates landing, not correctness. PR is a draft with Gap I am not asserting past: I did not build Implemented-by: VERDICT: PASS Generated by Claude Code |
The DELIBERATE CORRECTION was confirmed by the maintainer's own merge, 2026-09-22T02:51ZThis PR modifies four The confirmation arrived as an act, not as text:
The four notes, and what changed under each as merged — every edit strips a claim about the retired
The premise these four edits rest on holds on
Generated by Claude Code |
Fixes #19372
Clause-②: no
Four unreleased changesets on
mainstill describedpackages/spec/api-surface-declarations/— a family the revert2277d1fcd10deleted outright: 17 shards, its build script, its two package scripts (gen:api-surface-declarationsandcheck:api-surface-declarations) and its entry inpackages/spec'sfiles[]. Changeset prose is compiled verbatim intoCHANGELOG.mdat the next cut, which then deletes the consumed file, and the release PR carryingpackages/specat 17.5.0 is open right now. So whatever stands in these four files at the cut is what publishes: a shipped entry telling a reader the package ships a directory it does not have, amendable afterwards only by a docs-only PR against a published entry.Five sentences, four files, ten changed lines. No code, no
files[], nopackages/spec/**, no second changeset, no label.Check Changesetis RED on this PR by design — no commit clears itThis PR modifies four
.changeset/*.mdthat exist on the merge base and were not added by it, soscripts/check-empty-changeset.mjsrefuses it under the foreign-changeset rule. Measured on this branch's head: the empty-frontmatter rule passes ("No empty-frontmatter changeset introduced by this diff (4 declaring changeset(s) added)") and the foreign rule exits 1 naming all four paths.The refusal is correct, and the remedy it prints for this class is the one being followed:
skip-changesetis not applied. The dispatching seat carries a maintainer ruling on 18375 refusing that label by name for a PR that edits an existing changeset; the gate stays advisory red instead.Check Changesetis not one of the seven contexts registered inscripts/check-required-contexts.mjs— grepped on this branch, absent (exit 1), withLint & Repo Gatespresent (exit 0) as the control that the grep fired.The DELIBERATE CORRECTION text reads "the note you rewrote describes behaviour THIS PR changed". Here a third PR falsified the notes — the deleting revert
2277d1fcd10— and this PR repairs only the prose in its wake. The remedy is still the right one, because restoring the base text would republish false sentences. But neither declared class describes "a landed sibling falsified a pending note; this PR repairs the note and nothing else". Noted, not filed.Each note, and exactly what changed under it
1.
.changeset/17108-element-text-variant-published-nine.md(@objectstack/spec: minor) — the closing projection clause namedapi-surface-declarations/ui.txtas gaining the seven newelement:text.variantmembers. That shard is gone. The clause is deleted; the surviving generated projection named in the same sentence is kept, and verified to carry the widening (overline, the value only this change added, is present incontent/docs/references/ui/component.mdx, with a fabricated value as the dark control returning 0). Thecheck:api-surfacesentence after it is untouched.2.
.changeset/18605-enable-on-install-one-authority.md(@objectstack/spec: minor) —api-surface-declarationswas one of four artifacts listed as unchanged. Dropped from the list;api-surface,authorable-surfaceandauthorable-defaultsstay exactly as written. Naming a non-existent directory in a list of unchanged artifacts tells a reader the package has it.3.
.changeset/19085-metadata-form-declared-rows.md(@objectstack/spec: minor,@objectstack/platform-objects: patch) — the sentence claimedcheck:api-surfaceandcheck:api-surface-declarationswere both green with no regeneration. The second script no longer exists inpackages/spec's manifest (the revert removed bothgen:andcheck:entries), so it is dropped. The claim aboutcheck:api-surfaceis unchanged.4.
.changeset/18991-user-export-slot-is-a-real-optin-grant.md(@objectstack/spec: patch) — two spots, and the second is the reason this card was filed sharp. Detail below.The sharpest leg: 18991's stated reason to publish — re-measured, and it stands
That changeset's
Why this publishes rather than taking skip-changesetparagraph rested its decision on twofiles[]entries moving, and namedapi-surface-declarations/as the first. That entry is gone frompackages/spec'sfiles[]. The question the card left open is whether the remaining reason carries the publish on its own. It does, and the reading is this:dist/is inpackages/spec'sfiles[], and the build still emits declarations (BUILD_DTS=true tsupsecond pass, gated byscripts/check-dts-emitted.mjs).dist/data/index.d.tsreproduces both corrected docblocks byte-for-byte againstpackages/spec/src/data/api-derivation.tson this branch. Normalising only the comment-prefix whitespace, sha256 of source block equals sha256 of emitted block:fe70486a…for theResolveApiOptions.userExportAllowedmember block,2f78bac0…for theAPI_METHOD_DERIVATIONleading block. Control: the same comparison run against a different docblock in the same file differs, so the equality is not an artifact of the comparison..d.tsreads different bytes after that change. It publishes.skip-changesetwould have been wrong then and would be wrong now.So the repair is to the prose only, and the changeset keeps its
patchlevel and itsClause-②: no. Two things had to move with the dead entry:files[]move" becomes one.API_METHOD_DERIVATIONleading block is indist/data/index.d.ts. Keeping it while re-pointing the sentence atdist/would have swapped one false sentence for another.The other spot in the same file is the
No behaviour changeparagraph's trailing clause, "and the generated declaration baseline that reproduces one of them". No generated baseline reproduces either docblock any more, and the emitted declaration reproduces both, not one — so the clause is deleted rather than re-pointed; the paragraph below it already states where the text reaches a consumer.What this PR deliberately does not do
.changesetappears in 0 of the 70 workspacefiles[]arrays (control: 70 of 70 nameCHANGELOG.md), so this diff ships nothing by itself; a changeset of its own would be an erratum in a later entry, which thepackages/*/CHANGELOG.mdguardrail refuses by name..changesetat all (packages/spec/scripts/build-migration-registry.ts) mentions it in a docblock as an analogy, never as an input, so no checked-in artifact derives from this prose.check:adr-0087-registrationsees four non-breaking changesets and asks for no disposition marker.packages/spec/package.json, the deleted family, the release PR, or any non-changeset file.Verified on this branch
scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackderived 19 families from the four paths; all 19 run with exit codes recorded, reconciliation reports "19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero)". Eighteen exit 0. The one exit 1 ischeck-empty-changeset --base origin/main, by design, above.turbo ls --affectedagainst the merge base reports "0 no packages"; the same instrument with the revert commit as its base lists the wholepackages/specclosure, which is the control that it fires. Blind spots stated: the set comes from the package dependency graph, so it is blind to a test that reads another package's source off disk, and the repo-root package is not inturbo lsat all — so "not on the graph", never "cannot move"..changeset/belongs to no package, so there is no dependency closure to build and no packagetestortypecheckis owed..changeset/*.mdpath — its own message, not an assumption — so of the 1 file passed in, 0 are linted and 0 rules evaluate. Type-aware linting is not reached for these paths either, so nothing in this diff can move a verdict on any untouched file.check:nul-bytesgreen (9178 text files scanned, no raw ASCII control bytes), plus an own scan of the four edited files over the non-tab, non-newline control range — clean, with a vertical-tab and a delete-byte probe as the controls that the scan fires.api-surfaceas the control returning hits on the same instrument at the same radius. Before it, the same search returned exactly these four files.Acceptance notes
check-empty-changesettwo-class taxonomy has no arm for "a landed sibling falsified a pending note; a later PR repairs only the note". The printed remedy is still correct for that case, so nothing goes wrong — recorded here rather than filed, and no carrier is in flight.Generated by Claude Code