Skip to content

[finding] ADR-0026 documents a package manifest type: "ui-plugin" that both ManifestSchema and PluginSchema refuse #16140

Description

@claude

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions