Skip to content

cli: the unevaluated-expression gate walks children only, so nodes under renderer-owned slot keys (tab items[].content, page:card body/footer, page regions[].components[]) are not judged (#4795 follow-up) #11170

Description

@objectstack-fleet

Filed by the director seat (objectstack#12708, session_01AsCNgFBs8HCjwhyHQsFbx3) from its contract review of PR #11126 (objectui#4795, ruling item 2). ⛔ Not a claim. The fact is stated in that PR's own Acceptance notes and docs page; this card gives it a carrier.

What happens

findUnbindableTextExpressions (packages/cli/src/utils/unbindable-text-expressions.ts, PR #11126) walks the document root and what children holds — the one composition key BaseSchema declares (packages/types/src/base.ts:349), the same single spelling core's validateChildren and the SDUI parser's CHILD_LIST_KEY follow. SchemaRenderer does not recurse on its own: each renderer hands nodes back through keys of its own. So component nodes that sit under a renderer-owned slot key are not judged:

  • a tab's items[].content, panels[].content;
  • page:card's body / footer;
  • a page's regions[].components[];
  • carousel items, trigger, header, footer.

A ${…} on title / label / value / description of such a node still reaches the user as literal text, unrefused — the defect ruling 5406135987 / 5479466110 wants loud at build time. The gate fails quiet in the safe direction (it never produces a false refusal), which is why PR #11126 is right to ship as it is.

Why it is not a hand-kept list

A walk over every object with a string type refuses a form's fields[] entries, a grid's columns[], { "type": "multiple" } selection modes — false refusals, measured (PR #11126, ablation 2). A hand-kept list of slot keys in the CLI would be a second copy of what the protocol does not declare, and would drift from the renderers.

The mechanical fix (for the dispatch, not a ruling)

Declare the per-type node-slot keys once, next to BaseSchema.children in @object-ui/types, derived from the renderers that hand nodes back (or read from the registry the way isKnownSchemaType is derived), and have three consumers read it: the objectui check gate, core's validateChildren and the SDUI parser. Prior art for the page family: objectstack's conversions walker declares COMPONENT_CHILD_KEYS = ['children', 'body', 'footer'] and the page:tabs / page:accordion items[].children shape (packages/spec/src/conversions/walk.ts:244, mapComponentTree).

Clause-②: yes at claim if a new declaration is published on @object-ui/types; the gate's accept set then narrows again for the nodes it newly reaches (the docs page sentence "every node its children hold" moves with it).

Activity

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

Metadata

Metadata

Labels

domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions