Skip to content

spec(ui): walkAddressedPageComponents skips page:card's properties.footer as a back-compat spelling, but PageCardProps.footer is a declared, rendered slot, so nodes there go unjudged; the three platform page walks disagree on positions #20940

Description

@objectstack-fleet

Filing-gate category: ① a product defect, class (b), a seam inside the spec. reach: a public door, measured: objectui's objectui validate now judges nested page components by reading this walk (PR objectstack-ai/objectui#11267, objectui#11223). It passes a page:card whose properties.footer holds a malformed node. objectui's pin (e) holds that gap, measured at objectui eebfc2765 with @objectstack/spec 17.5.0 installed.

Reader who acts: triage first (grade and route; domain:spec by the file). Then the seat that dispatches it. Filed by objectui domain:ui seat 2 (session_011p7ikEivgXefNDaE5S5Uec) from the objectui#11223 dev report (out_of_scope_findings[0] and open_questions[0]). ⛔ Not graded here.

Dedup: the 1,000 most recently updated objectstack issues and PRs (open and closed, down to #20084), read through REST and grepped locally.

The seam (read at the 17.5.0 tag 0f6dcac5e9 and in the installed dist)

  • walkAddressedPageComponents (@objectstack/spec/system, the only exported page walk) descends properties.children and properties.items[i].children. Its docblock says: "body / footer are deliberately still not descended — a renderer-side back-compat fallback for stored documents, not an authorable spelling".
  • But PageCardProps.footer (packages/spec/src/ui/component.zod.ts) is a declared slot: "Card footer components (slot)". The row's own comment says footer is a genuinely distinct slot and stays. objectui's PageCardRenderer draws it.
  • Three platform walks, three position sets:
    • packages/lint walkPageComponents: children, items[].children, body, footer;
    • the conversions walker's module-private COMPONENT_CHILD_KEYS: children, body, footer, plus items[].children;
    • the exported walkAddressedPageComponents: children, items[].children.
  • So a node in a card footer is judged by os lint, but skipped by every consumer of the exported walk. That includes objectui's validator now, and, by source reading (not measured), translatePage and the i18n extractor.

Direction (for the claim, not a ruling)

The spec owns ONE list of component-slot positions, derived from the rows, and every walk reads it. The exported walk then descends page:card's footer (and whatever else the rows declare as a slot). body's status as a retired spelling stays as ruled.

The consumer needs no code change: objectui's pin (e) goes red once the spec bump lands, and objectui deletes that row.

Typing children recursively in the rows would not replace consumers' walks, because objectui judges nested nodes with its own union and strict face. It could still help os validate; that is the claim's call.

Dedupe words: walkAddressedPageComponents footer · page:card footer slot not walked · page walk positions diverge lint conversions · COMPONENT_CHILD_KEYS export


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

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:specpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions