Filed bare by the domain:engine execution seat while working #15640 (PR #16139). Routing and grading are triage's. ⛔ Not fixed in that PR: it is outside the card's authorisation, it lands in a different file, and docs/adr/** is a governed surface.
The measurement
docs/adr/0026-client-ui-plugin-distribution.md documents a package manifest whose type is a value both relevant schemas refuse:
:80 — the .osplugin manifest example in §3.1: "type": "ui-plugin",
:170 — §3.7 prose: "a UI plugin (type: ui-plugin) is an internal contribution"
Probed at origin/main 1f2a02ba0, against the built @objectstack/spec/kernel, with the accepted spelling as a firing control on the same instrument:
CORE_PLUGIN_TYPES: ["ui","driver","server","app","theme","agent","objectql"]
ManifestSchema.safeParse({type:'ui-plugin'}) -> success=false | type issue: invalid_value
ManifestSchema.safeParse({type:'ui'}) -> success=true | no issue at ["type"]
PluginSchema.safeParse({type:'ui-plugin'}) -> success=false | type issue: invalid_value
PluginSchema.safeParse({type:'ui'}) -> success=true | no issue at ["type"]
ManifestSchema.type is z.enum(['plugin', ...CORE_PLUGIN_TYPES, 'module', 'gateway', 'adapter']) (packages/spec/src/kernel/manifest.zod.ts:299). ui-plugin is in neither list; ui is in both.
Why this is the same family, and why it may be the more severe member
This is the defect class #14609 named: text that instructs an author to write a value the schema then rejects, as opposed to text that merely explains provenance to a maintainer. #15639 corrected three such .describe() strings in plugin.zod.ts; #15640 corrects two test comments that cited them. This ADR is the remaining instructive occurrence, and it is the one an author copying a manifest example would actually paste.
⚠️ The counter-reading, stated so triage can weigh it rather than discover it. ADR-0026 is Status: Proposed, and its example describes a proposed future artifact ("runtime": "ui" is annotated "new tier"). On that reading ui-plugin was the spelling this proposal chose, 'ui' is what the closed set later adopted, and the ADR is not stale guidance but an unmerged proposal that predates the naming. In-tree corroboration that 'ui' superseded it: packages/plugins/plugin-hono-server/src/hono-plugin.ts:507 still reads "Support legacy 'ui-plugin' and new 'ui' type".
⇒ Whether this is a documentation correction, an ADR status/addendum question, or nothing at all is a judgement this seat is not placed to make. ⛔ It is also not mechanically fixable by any seat: an accepted-or-proposed ADR is a governed surface, so a change here is authored openly but merged by the maintainer.
Relation to the neighbouring cards
#15638 covers the runtime arm in plugin-hono-server that still tolerates the spelling, and remains open under needs-user-decision. #15640 covered the two pin comments. This is a third, distinct residue: the authoring-facing one. ⛔ Not a merge candidate with either — different file, different lane, and this one carries a live counter-reading the other two do not.
Suggested shape (⛔ not a ruling)
If triage grades it actionable, the minimal shape is to make the ADR say which spelling is current — either correcting the two occurrences to ui with a note that ui-plugin was the proposal's original spelling, or adding a status line recording that the closed set adopted ui. ⛔ Either way the pinned refusal of ui-plugin in packages/core/src/plugin-type-closed-set.test.ts and packages/rest/src/plugin-type-closed-set.pin.test.ts must not change: those pins are correct and the value is refused on purpose.
Generated by Claude Code
Filed bare by the
domain:engineexecution seat while working #15640 (PR #16139). Routing and grading are triage's. ⛔ Not fixed in that PR: it is outside the card's authorisation, it lands in a different file, anddocs/adr/**is a governed surface.The measurement
docs/adr/0026-client-ui-plugin-distribution.mddocuments a package manifest whosetypeis a value both relevant schemas refuse::80— the.ospluginmanifest example in §3.1:"type": "ui-plugin",:170— §3.7 prose: "a UI plugin (type: ui-plugin) is an internal contribution"Probed at
origin/main1f2a02ba0, against the built@objectstack/spec/kernel, with the accepted spelling as a firing control on the same instrument:ManifestSchema.typeisz.enum(['plugin', ...CORE_PLUGIN_TYPES, 'module', 'gateway', 'adapter'])(packages/spec/src/kernel/manifest.zod.ts:299).ui-pluginis in neither list;uiis in both.Why this is the same family, and why it may be the more severe member
This is the defect class #14609 named: text that instructs an author to write a value the schema then rejects, as opposed to text that merely explains provenance to a maintainer. #15639 corrected three such
.describe()strings inplugin.zod.ts; #15640 corrects two test comments that cited them. This ADR is the remaining instructive occurrence, and it is the one an author copying a manifest example would actually paste.Status: Proposed, and its example describes a proposed future artifact ("runtime": "ui"is annotated "new tier"). On that readingui-pluginwas the spelling this proposal chose,'ui'is what the closed set later adopted, and the ADR is not stale guidance but an unmerged proposal that predates the naming. In-tree corroboration that'ui'superseded it:packages/plugins/plugin-hono-server/src/hono-plugin.ts:507still reads "Support legacy 'ui-plugin' and new 'ui' type".⇒ Whether this is a documentation correction, an ADR status/addendum question, or nothing at all is a judgement this seat is not placed to make. ⛔ It is also not mechanically fixable by any seat: an accepted-or-proposed ADR is a governed surface, so a change here is authored openly but merged by the maintainer.
Relation to the neighbouring cards
#15638covers the runtime arm inplugin-hono-serverthat still tolerates the spelling, and remains open underneeds-user-decision.#15640covered the two pin comments. This is a third, distinct residue: the authoring-facing one. ⛔ Not a merge candidate with either — different file, different lane, and this one carries a live counter-reading the other two do not.Suggested shape (⛔ not a ruling)
If triage grades it actionable, the minimal shape is to make the ADR say which spelling is current — either correcting the two occurrences to
uiwith a note thatui-pluginwas the proposal's original spelling, or adding a status line recording that the closed set adoptedui. ⛔ Either way the pinned refusal ofui-plugininpackages/core/src/plugin-type-closed-set.test.tsandpackages/rest/src/plugin-type-closed-set.pin.test.tsmust not change: those pins are correct and the value is refused on purpose.Generated by Claude Code