Filed unassigned out of #6086 round 3. #6155 records KanbanCard / KanbanColumn as declared four times with disagreeing published copies and is left for triage. That card has a population it never measured; this is what the #6086 sweep turned up alongside it, so triage can size the class rather than the instance.
Three further collisions, each measured
1. FormField — 23 keys vs 29, and the doc claims it is declared once
| declaration | keys |
|---|
@object-ui/types (packages/types/src/form.ts:906) | 23 — id, name, label, description, type, inputType, required, disabled, placeholder, options, validation, condition, widget, dependsOn, visibleOn, hidden, readonly, visibleWhen, readonlyWhen, requiredWhen, field, colSpan, span |
@objectstack/spec (json-schema/ui/FormField.json) | 29 — field, type, options, reference, publicPicker, maxLength, minLength, min, max, precision, scale, multiple, label, placeholder, helpText, readonly, immutable, required, hidden, colSpan, span, widget, language, keyField, dependsOn, visibleWhen, visibleOn, disclosure, fields |
Only 14 keys are common. id, name, description, inputType, validation, condition, readonlyWhen, requiredWhen, disabled exist only in the types copy; reference, publicPicker, maxLength, helpText, immutable, disclosure, fields and six more only in the spec copy.
⚠️content/docs/plugins/plugin-form.mdx:51 asserts the opposite: "FormField is declared once, in @object-ui/types (packages/types/src/form.ts) — this page does not redeclare it…". Under the closure rule adopted on #6086, "declared once" is a closure claim, and it is false. (The page's own 21-row table restates the types copy exactly, 0 unmatched — so the table is right and only the sentence about uniqueness is wrong.)
2. MarkdownSchema — required vs optional, and two keys apart
| declaration | shape |
|---|
@object-ui/types (packages/types/src/data-display.ts:797) | contentrequired, plus sanitize, components |
@object-ui/plugin-markdown (packages/plugin-markdown/src/types.ts:15) | contentoptional, plus className, and no sanitize / components |
PR #6168 had to qualify the docs naming to the plugin's copy because of exactly this.
3. KanbanSchema — two shapes with almost nothing in common
| declaration | own keys |
|---|
@object-ui/types (packages/types/src/complex.ts:100) | columns, draggable, onCardMove, onCardClick, onColumnAdd, onCardAdd |
@object-ui/plugin-kanban (packages/plugin-kanban/src/types.ts:61) | objectName, groupBy, swimlaneField, cardTitle, cardFields, data, … |
Also relevant to #6155: three of the four KanbanCard declarations are inside @object-ui/plugin-kanban itself (KanbanImpl.tsx:51, KanbanEnhanced.tsx:36, types.ts:15), so a package qualifier does not disambiguate the name either — which was why #6086 could not name that page's tables.
Why it is worth a card
#6086 measured the consequence: a tool keyed on a type name returns a confident wrong answer instead of abstaining, and so does a reader. The docs cannot route around it — plugin-markdown.mdx now carries a sentence whose only job is to say which of two same-named types it means, which is a workaround for the collision rather than a fix.
Whether the answer is renaming, re-exporting one copy from the other, or a check: that forbids a second declaration of an exported schema name, is a contract decision. Recording the population so it is made once rather than per page.
Reproduce
grep -rn 'interface FormField' packages/types/src/form.ts
python3 -c "import json;print(sorted(json.load(open('node_modules/@objectstack/spec/json-schema/ui/FormField.json'))['properties']))"
grep -rn 'interface MarkdownSchema\|interface KanbanSchema\|interface KanbanCard\|interface KanbanColumn' packages/*/src --include=*.ts --include=*.tsx
sed -n '49,54p' content/docs/plugins/plugin-form.mdx
Refs: #6155 (the instance already carded) · #6086 (where these were measured) · PR #6168.
Filed unassigned out of #6086 round 3. #6155 records
KanbanCard/KanbanColumnas declared four times with disagreeing published copies and is left for triage. That card has a population it never measured; this is what the #6086 sweep turned up alongside it, so triage can size the class rather than the instance.Three further collisions, each measured
1.
FormField— 23 keys vs 29, and the doc claims it is declared once@object-ui/types(packages/types/src/form.ts:906)id,name,label,description,type,inputType,required,disabled,placeholder,options,validation,condition,widget,dependsOn,visibleOn,hidden,readonly,visibleWhen,readonlyWhen,requiredWhen,field,colSpan,span@objectstack/spec(json-schema/ui/FormField.json)field,type,options,reference,publicPicker,maxLength,minLength,min,max,precision,scale,multiple,label,placeholder,helpText,readonly,immutable,required,hidden,colSpan,span,widget,language,keyField,dependsOn,visibleWhen,visibleOn,disclosure,fieldsOnly 14 keys are common.
id,name,description,inputType,validation,condition,readonlyWhen,requiredWhen,disabledexist only in the types copy;reference,publicPicker,maxLength,helpText,immutable,disclosure,fieldsand six more only in the spec copy.content/docs/plugins/plugin-form.mdx:51asserts the opposite: "FormFieldis declared once, in@object-ui/types(packages/types/src/form.ts) — this page does not redeclare it…". Under the closure rule adopted on #6086, "declared once" is a closure claim, and it is false. (The page's own 21-row table restates the types copy exactly, 0 unmatched — so the table is right and only the sentence about uniqueness is wrong.)2.
MarkdownSchema— required vs optional, and two keys apart@object-ui/types(packages/types/src/data-display.ts:797)contentrequired, plussanitize,components@object-ui/plugin-markdown(packages/plugin-markdown/src/types.ts:15)contentoptional, plusclassName, and nosanitize/componentsPR #6168 had to qualify the docs naming to the plugin's copy because of exactly this.
3.
KanbanSchema— two shapes with almost nothing in common@object-ui/types(packages/types/src/complex.ts:100)columns,draggable,onCardMove,onCardClick,onColumnAdd,onCardAdd@object-ui/plugin-kanban(packages/plugin-kanban/src/types.ts:61)objectName,groupBy,swimlaneField,cardTitle,cardFields,data, …Also relevant to #6155: three of the four
KanbanCarddeclarations are inside@object-ui/plugin-kanbanitself (KanbanImpl.tsx:51,KanbanEnhanced.tsx:36,types.ts:15), so a package qualifier does not disambiguate the name either — which was why #6086 could not name that page's tables.Why it is worth a card
#6086 measured the consequence: a tool keyed on a type name returns a confident wrong answer instead of abstaining, and so does a reader. The docs cannot route around it —
plugin-markdown.mdxnow carries a sentence whose only job is to say which of two same-named types it means, which is a workaround for the collision rather than a fix.Whether the answer is renaming, re-exporting one copy from the other, or a
check:that forbids a second declaration of an exported schema name, is a contract decision. Recording the population so it is made once rather than per page.Reproduce
Refs: #6155 (the instance already carded) · #6086 (where these were measured) · PR #6168.