Recorded while implementing #13925 (Plugin.type narrowed from string to the closed PluginType set on @objectstack/core). Out of that card's file surface — skills/** is a governed surface (AGENTS.md Prime Directive #14) — so filed for triage, no assignee.
The observation
The published objectstack-platform skill copies the Plugin interface with the field spelled as an open string and the enumeration carried in a trailing comment, at two sites:
skills/objectstack-platform/SKILL.md:798 — type?: string; // standard|ui|driver|server|app|theme|agent|objectqlskills/objectstack-platform/rules/plugin-lifecycle.md:48 — type?: string; // standard|ui|driver|server|app|theme|agent|objectql
Once #13925 lands, the field on the published surface is type?: PluginType (exported from @objectstack/core, derived from the spec's CORE_PLUGIN_TYPES plus standard), and a value outside the set does not compile. The skill's copy would then teach an AI author a wider accept set than the compiler enforces — the same prose-doing-a-type's-job drift #13762 measured on the TSDoc, one layer out. The hand-written docs copy (content/docs/plugins/anatomy.mdx) was corrected in #13925's PR; the skill copy was not touched because of the governed-surface rule and the skills line ratchet (net additions are paid with deletions; the fix here is a same-length spelling change plus, at most, a comment pointing at PluginType).
How it was settled
Read on the #13925 branch at 962914029 (origin/main f60ab90ae merged): the two skills/** lines above by grep -rn "type?: string" skills, against packages/core/src/types.ts where the field is now type?: PluginType. No open card names these lines (search: skills objectstack-platform plugin-lifecycle Plugin type string; the hits are the closed #13762 and the closed skills sweep #13747).
Generated by Claude Code
Recorded while implementing #13925 (
Plugin.typenarrowed fromstringto the closedPluginTypeset on@objectstack/core). Out of that card's file surface —skills/**is a governed surface (AGENTS.md Prime Directive #14) — so filed for triage, no assignee.The observation
The published
objectstack-platformskill copies thePlugininterface with the field spelled as an open string and the enumeration carried in a trailing comment, at two sites:skills/objectstack-platform/SKILL.md:798—type?: string; // standard|ui|driver|server|app|theme|agent|objectqlskills/objectstack-platform/rules/plugin-lifecycle.md:48—type?: string; // standard|ui|driver|server|app|theme|agent|objectqlOnce #13925 lands, the field on the published surface is
type?: PluginType(exported from@objectstack/core, derived from the spec'sCORE_PLUGIN_TYPESplusstandard), and a value outside the set does not compile. The skill's copy would then teach an AI author a wider accept set than the compiler enforces — the same prose-doing-a-type's-job drift #13762 measured on the TSDoc, one layer out. The hand-written docs copy (content/docs/plugins/anatomy.mdx) was corrected in #13925's PR; the skill copy was not touched because of the governed-surface rule and the skills line ratchet (net additions are paid with deletions; the fix here is a same-length spelling change plus, at most, a comment pointing atPluginType).How it was settled
Read on the #13925 branch at
962914029(origin/mainf60ab90aemerged): the twoskills/**lines above bygrep -rn "type?: string" skills, againstpackages/core/src/types.tswhere the field is nowtype?: PluginType. No open card names these lines (search: skills objectstack-platform plugin-lifecycle Plugin type string; the hits are the closed #13762 and the closed skills sweep #13747).Generated by Claude Code