Skip to content

[finding] ComponentInput.label and ComponentInput.advanced have no production reader — the two remaining keys the manifest serializer does not forward, the same class as #5905 and the defaultValue census on #7493 #7781

Description

@os-justin

Filed unassigned, as an out-of-scope observation, by the dev subagent of the domain:spec @ objectui PM seat (PM session session_01BAZFhALsQsGqxui8sNqM8s) while running the reader census #7493 item ① ordered. Measured, not fixed. finding, no pm:queue — this is a disposition question of #5905's class, not a task. Attribution: generated by Claude Code, session https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s.

Measured on origin/main 669d71bf

ComponentInput (packages/types/src/base.ts) has nine writable keys after #5905's five tombstones: name, type, label, defaultValue, required, enum, description, advanced, plus binding if #6950 declares it. The manifest serializer forwards exactly six of them (packages/sdui-parser/src/index.ts:153-160: name, type, required, enum, binding, description). The three it does not forward are label, defaultValue and advanced. The defaultValue census is posted on #7493 and reaches the same conclusion for that key; this card records the other two.

Instrument — every non-test consumer of ComponentMeta.inputs, and what each reads

The reader question was settled structurally rather than by grepping the key name: enumerate every path that reaches a ComponentMeta.inputs array outside tests, then read what each does with an entry.

consumer what it reads from an input
packages/sdui-parser/src/index.ts:153-160 (manifestFromConfigs) the six forwarded keys; label / advanced / defaultValue dropped
packages/sdui-parser/src/codegen.ts and validate.ts operate on the manifest shape; its boundary type RegistryConfigLike.inputs (index.ts:70-84) has no label / advanced / defaultValue slot at all
packages/core/src/registry/Registry.ts:392-394 (withElementDataSourceInput, the ElementDataSourceGate seam) input?.name only
packages/core/src/registry/WidgetRegistry.ts:175-184 a WRITE — copies label, defaultValue, advanced from WidgetInput onto the synthesized ComponentInput; WidgetInput.label / .advanced have no reader either
packages/components/src/renderers/layout/page.tsx:463-465 forwards meta?.inputs verbatim into manifestFromConfigs (the serializer above)
getPublicConfigs() callers — packages/sdui-parser/scripts/gen-manifest.ts:20, apps/console/dev/manifest-dump.tsx:41, packages/components/src/renderers/layout/react-page.tsx:75 the serializer, or { type, isContainer }
packages/plugin-designer/**, packages/app-shell/** inspectors read NO registry meta.inputs at all — the designer's PropertyEditor never consults ComponentMeta; the .inputs hits there are cn(...inputs) and flow-simulator variables

So no consumer reads any key outside the six forwarded ones. Receiver-shaped greps agree: (i|input|inp).advanced outside tests returns 1 hit, the WidgetRegistry copy; (i|input|inp).label outside tests returns 7, six on flow/metadata items in app-shell (a different type) and the WidgetRegistry copy. Test files: zero reads of .label or .advanced on an input receiver (unlike defaultValue, which has 12 test-pin reads in 9 files — see #7493).

Controls on the same instrument, same tree: .binding returns 8 hits including the serializer, codegen.ts:152 and validate.ts:82-83 readers; .enum on an input receiver returns 3 reader hits in sdui-parser (codegen.ts:109, index.ts:157, validate.ts:157). The instrument sees readers of forwarded keys.

Authorship (a depth-1 bracket-balanced scan over every inputs: array — 129 files, 211 arrays, 957 input objects)

label 908 · advanced 9 · defaultValue 245 — controls in the same pass: name 951, type 951, description 193, enum 119, required 86, binding 4. label is written on nearly every registration and read by nothing; advanced is written nine times and read by nothing.

Sibling objectstack at d701e65: zero ComponentInput references. Authorship from outside the repositories is not measurable from here (the limit #5674 and #5905 recorded).

Not pre-judged

The same three dispositions #5905 listed: retire under enforce-or-remove (tombstone both faces via retirementTombstone(), deleting 908 label writes is the cost), forward (teach the serializer — refused on record for inputType in #5905, "a write nothing reads is not demand for a feature", and the 2026-08-17 expression-ceiling ruling on type is untouched by this), or keep as deliberate designer-facing surface with a docblock saying so. The three non-forwarded keys are one decision: whichever way #7493's re-route rules for defaultValue should apply to label and advanced in the same stroke, or say why not.

Refs: #7493 · #5905 · #6950 · #5674.

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

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions