docs(core,rest): the closed-set pins state the durable reason ui-plugin stays refused - #16139
docs(core,rest): the closed-set pins state the durable reason ui-plugin stays refused#16139claude[bot] wants to merge 1 commit into
ui-plugin stays refused#16139Conversation
…gin` stays refused Both `plugin-type-closed-set` pins justified their choice of `'ui-plugin'` by "the spelling a stale describe() string still uses". No describe string in the tree uses that spelling any more, so each pin's stated justification read as expired while the pin itself is still correct and still doing real work — the failure mode being a later reader who checks the claim, finds nothing, and deletes a working test as vestigial. Replaced with the durable reason, identically in both files so the parallel texts keep explaining the same pinned value the same way: `'ui-plugin'` is the legacy spelling of today's `'ui'`, callers outside this repo may still send it, and the closed set must keep refusing it rather than grow a tolerant alias (Prime Directive #12). Comment prose only. No assertion, no pinned value and no test semantics change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
|
Out-of-scope finding raised while working this card, filed bare and unassigned rather than fixed here: #16140 — It is the same family as this PR but deliberately not part of it: different file, outside this card's two-comment authorisation, and Generated by Claude Code |
Fixes #15640
Both
plugin-type-closed-setpins justified their choice of the refused spelling'ui-plugin'by pointing at something that no longer exists: "the spelling a stale describe() string still uses". PR #15639 corrected the last such.describe()string, so each pin's stated justification read as expired while the pin itself is still correct and still doing real work.The risk is not that a reader misunderstands what the test does — it is that the sentence states the pin's justification, so a later reader who checks the claim, finds no stale describe anywhere in the tree, and concludes the pin is vestigial may delete a test that is guarding a real contract. This PR replaces the expired reason with the durable one, in both files, so the two parallel texts keep explaining the same pinned value the same way.
The change, in full
packages/core/src/plugin-type-closed-set.test.ts, the comment above the refused-value loop:packages/rest/src/plugin-type-closed-set.pin.test.ts, the@ts-expect-errordirective comment:The new wording is the durable reason rather than a shorter one: it says what
'ui-plugin'was, why a caller can still send it, and what the pin is therefore protecting — that the closed set keeps refusing it instead of growing a tolerant alias. That last clause is the failure this pin is actually standing in front of, and it does not depend on anydescribe()string existing anywhere, so it cannot expire the way its predecessor did. The word "legacy" is the tree's own:packages/plugins/plugin-hono-server/src/hono-plugin.tsstill carries the comment "Support legacy 'ui-plugin' and new 'ui' type".What deliberately did NOT change
'ui-plugin'— unchanged in both files, still refused byPluginSchemaand still outsidePluginType.//.Verification, all at
e7ae20930(this PR's head)The card's premise, re-measured on this base rather than inherited. Triage read
origin/mainat95d5cbb; this branch is cut from1f2a02ba0. Re-run there:git grep -c "ui-plugin" -- packages/spec/src/kernel/plugin.zod.tsis 0, with the positive controlCORE_PLUGIN_TYPEShitting:89and:123in that same file, so the zero is a real zero and not an unreadable path. Tree-wide, the only two lines puttingui-pluginanddescribetogether were the two comments this PR rewrites.Both pin suites green as written — the claim this PR makes is that it changes no semantics, so the suites had to pass unmodified:
pnpm --filter @objectstack/core exec vitest run src/plugin-type-closed-set.test.ts— 1 file, 3 tests passed.pnpm --filter @objectstack/rest exec vitest run src/plugin-type-closed-set.pin.test.ts— 1 file, 4 tests passed.The
@ts-expect-errordirective is still live, which is the one thing a longer comment block could plausibly have broken (the directive attaches to the next line of code, skipping comment-only lines).pnpm --filter @objectstack/rest typecheckis green, and its test layer reports0 file(s) / 0 error(s)under the EXACT per-file ratchet — an unattached directive would have surfaced as TS2578 plus the error it stopped suppressing. Measured rather than assumed:tsc -p tsconfig.test.json --listFilesputs this pin file in the program (734 files), resolving@objectstack/corethrough its builtdist/index.d.ts.pnpm --filter @objectstack/core typecheckis likewise green, its 4 test-layer errors being the pre-existing ledgered ones in other files.Gate union: 45 derived families plus 4 anchor extras, all green at this commit. Derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(which reads the change set from git itself) and run whole — not narrowed on the grounds that the diff is "only comments", because a comment edit moves line numbers and the line-number-anchored census gates are exactly the class that judgement misses.check:system-context-census,check:doc-anchors,check:adr-anchors,check:adr-symbol-anchorsandcheck:scripts-symbol-anchorsare all green; no doc anchors point into either edited file. Two families first returned exit 3PREREQUISITE NOT MET(check:dual-build-cjs-loads,check:type-check-debt) — not a red, nothing measured — and both are green after building the full workspace closure aslint.ymldoes.Published surface: unchanged, by ablation. Built at this head, then both edited files swapped back to
1f2a02ba0content, rebuilt, and all 22 published files of the two packages (dist/**plusREADME.mdandCHANGELOG.md, per each package'sfiles[]) compared by sha256: byte-identical, with the rebuild proven to have really re-run by moveddistmtimes. The files were then restored HEAD-anchored and proven byte-exact against their HEAD blobs. The sourcemap caveat was measured rather than assumed:dist/*.js.mapembedssourcesContentverbatim, and a control confirms it embeds comment text from bundled sources — yet neither map lists any.test.tsamong its 59 / 365 sources, and untouched text from each edited file appears in 0 published files. So no text from these files reaches any published artifact, sourcemaps included.Changeset
This PR carries the
skip-changesetlabel rather than a.changeset/*.mdentry, and that is a measurement, not a convention call: the ablation above shows the diff publishes nothing from either released package — both declarefiles: ["dist","README.md","CHANGELOG.md"],src/**/*.test.tsis excluded from the build config on purpose, and every published byte is identical either side of the change.Neither edited path is a governed surface, so nothing here is reserved for a maintainer's hand-merge beyond the normal review.
Authorship, stated here in prose because a body edit can drop the footer below: authored by Claude Code in session
session_01ARYe3yQTQCUFm5qPYNgKaJ, on branchclaude/issue-15640-closed-set-pin-comment, dispatched to thedomain:engineexecution seat. Card #15638 covers a different residue of the same retired spelling and remains open; triage ruled the two must not be merged, and this PR does not touch it.Generated by Claude Code