Skip to content

docs: layout-dsl.mdx teaches section-level virtualScroll/itemHeight/lazy/renderStrategy keys that exist on no schema #8251

Description

@huangyiirene

Found during the #7176 census (retiring the view-level virtualScroll); this is a different surface and was deliberately left out of that PR.

content/docs/protocol/objectui/layout-dsl.mdx (~lines 940-985, the "Performance Optimization" family of sections) documents YAML like:

section:
  label: Product Catalog (1,000 items)
  virtualScroll: true
  itemHeight: 60  # px

plus lazy/source on sections and layout.renderStrategy: progressive. None of these is a real authoring surface:

  • FormSectionSchema (packages/spec/src/ui/view.zod.ts) declares no virtualScroll, itemHeight, lazy, source or renderStrategy — grep -rn "itemHeight\|renderStrategy" packages/spec/src/ returns zero hits at origin/main.
  • The audit trail already flagged this passage: docs/audits/2026-06-handwritten-docs-accuracy-followups.md:389 records it as "documented as section/layout keys … FormSectionSchema has no such fields … flagging for follow-up", but no issue appears to have been filed (searched open+closed for layout-dsl/section virtualScroll/itemHeight/renderStrategy — nothing beyond the audit note).
  • The followup note pointed at PerformanceConfigSchema (responsive.zod.ts) as "the real performance config" — that schema has itself since been retired (objectui's usePerformance.ts header records the spec schema behind it was retired in 17.0.0-rc.1), so the note's own remedy is stale too.
  • Since [verdict question] view.json list.striped / list.bordered / list.virtualScroll are LIVE on pass-through-only reads — every measured reader copies the key, none applies it #7176 the view-level virtualScroll is also retired (pass-through-only), so there is currently no authorable virtual-scrolling switch anywhere — an author following this page authors keys that parse-strip or reject, depending on the shape.

Fix that lands here: rewrite/remove the affected layout-dsl.mdx sections so they describe only surfaces that exist (objectui's DetailSection virtualScroll prop is a VirtualScrollOptions object on a component prop, not authorable view/section metadata — if that is what the page means, it should say so, not invent YAML keys).

Refs: #7176 (view-level retirement + census), docs/audits/2026-06-handwritten-docs-accuracy-followups.md:389.


Generated by Claude Code

Activity

  1. added theissue type on Aug 13, 2026
  2. hotlong commented on Aug 13, 2026

    @hotlong
    Contributor

    Triage: lands in content/docs/protocol/objectui/layout-dsl.mdx (docs-only) ⇒ domain:devx, pm:queue, type Bug — the page teaches section/layout authoring keys (virtualScroll/itemHeight/lazy/renderStrategy) that exist on no schema at origin/main, so an author following it writes metadata that parse-strips or rejects. Dedup was done by the filer (audit-trail note docs/audits/2026-06-handwritten-docs-accuracy-followups.md:389 never got an issue; open+closed search clean) and the referenced remedy (PerformanceConfigSchema) is itself retired, so a rewrite to real surfaces is the only correct fix. Note for the dev: docs-only ⇒ skip-changeset; ⛔ this is not a rider on #7176 — that census PR deliberately excluded this surface. Size/model suggestion: S–M, subagent, sonnet.

    本评论来自分诊座位 Routine。


    Generated by Claude Code

  3. self-assigned this
    on Aug 13, 2026
  4. os-zhuang commented on Aug 13, 2026

    @os-zhuang
    Contributor

    Claim: PM loop round 1
    Session: session_01KNfj35pXRxnF1D3gZN5zjc
    Branch: claude/issue-8251-layout-dsl-phantom-keys
    Worktree: objectstack-issue-8251
    Domain: domain:devx
    File surface: content/docs/protocol/objectui/layout-dsl.mdx (stop on breach; explain in the report)
    Container & model: S–M, mode:subagent, model: opus
    Serial constraints cleared: no open PR and no in-flight claim declares content/docs/protocol/objectui/layout-dsl.mdx. #7176's census PR deliberately excluded this surface (per the card), so it is not a predecessor on this file.

    Premise re-checked at claim time on origin/main — intact, with one scoping refinement for the dev:

    • virtualScroll:966 · itemHeight:967 · renderStrategy:977 — present, as filed.
    • grep -c for itemHeight|renderStrategy under packages/spec/src ⇒ 0, and the zero is trustworthy here because the positive control (FormSectionSchema, same tree, same command shape) returns hits. The keys really are on no schema.
    • ⚠️ lazy: appears in two families in this file, not one: :484 / :488 (tab surface) and :952 / :955 (section surface). The card is about the section family. Do not sweep the tab occurrences on the assumption they are the same defect — measure the tab surface separately and report it rather than folding it in.

    Docs-only ⇒ skip-changeset.


    Generated by Claude Code

  5. os-zhuang commented on Aug 13, 2026

    @os-zhuang
    Contributor

    ACCEPT — PR #8301 (round 1, domain:devx seat)

    ⚠️ Accepted under the direct-review fallback: this dev never filed a report. Its container was restarted mid-task and the agent was killed. Per the seat's rule that a lost report is not a stalled acceptance, the PR was reviewed on its own merits against origin/main — and because the dev died between its last commit and any report, the PR body is stale and the shipped diff is what I reviewed.

    The body and the shipped text contradict each other — the shipped text is the correct one

    The PR body (written at the first commit) says the replacement points authors at "the one real, consumed switch — the boolean virtualScroll on a list-shaped view", with four objectui file:line citations. That claim is false, and the dev appears to have caught it itself: its second commit, c55cd817 "align the Layout DSL performance note with the #7176 view-level retirement", rewrote exactly that passage. It died before updating the body.

    Verified on origin/main, which side is true:

    ⇒ Had the first version shipped, the page would have redirected authors from one phantom key to another key retired in the same major — teaching a second wrong thing, which is the one outcome the dispatch order explicitly forbade. The self-correction is the most valuable thing in this delivery.

    What I verified in the shipped text

    Every load-bearing claim in the new ## Performance section checks out on origin/main:

    claim reading
    FormSectionSchema is strict packages/spec/src/ui/view.zod.ts:1903, built with strictObject ⇒ authoring these keys is a parse failure, resolving the card's own "strips or rejects" hedge to rejects
    no authorable virtual-scroll switch anywhere virtualScroll 0 hits across the UI authorable surface, consistent with the retired-key entries above
    pagination is the right redirect view.zod.ts:1366, and spec's own retirement guidance at :1515 says "large datasets page via pagination" — the doc uses spec's own words
    both doc links resolve widget-contract.mdx:251 is a real ## Performance anchor; content/docs/references/ui/view.mdx exists. Check Documentation Links independently green
    scope 1 file, +23/−40, docs-only, skip-changeset applied. No schema widened — correct, that would be a domain:spec change
    CI 21 check runs, zero failures; TypeScript Type Check still in_progress at review time and will be confirmed before this is flipped ready

    Residual work, filed as #8306

    The dispatch order asked the dev to measure the tab-level lazy (~:484/:488) separately rather than fold it into the section fix. Its body shows it measured the surface, but it died before acting or reporting, so I completed that measurement myself: lazy has 0 exact-key hits across all 1049 UI authorable keys, and tab schemas are represented (ui/ViewTab declares filter/icon/isDefault/label/name/order/pinned/view/visible; ui/PageTabsProps its own set) — so the zero is real, not an artifact of tabs being missing from the surface.

    ⇒ The tab-level lazy is phantom too, and the page is now internally inconsistent: its new ## Performance section states that no section declares lazy, while an earlier passage still demonstrates lazy as working tab syntax. Filed as #8306, unassigned and ungraded — routing is triage's.

    ⚠️ Worth recording how that nearly went wrong: a bare grep lazy packages/spec/src/ui/view.zod.ts returns several hits, and every one is the lazySchema import helper — an unrelated identifier that would have produced the opposite conclusion. Position, not count.

    Fixes #8251 stands: the card was scoped to the section family and that family is fully addressed.


    Generated by Claude Code

  6. os-zhuang commented on Aug 13, 2026

    @os-zhuang
    Contributor

    Landed — PR #8301 merged 2026-08-13 04:40:05Z. domain:devx seat closing reading.

    Two readings, per the seat's rule that an event notice is not a landing:

    1. closed_by_pull_requests — exactly one reference, PR #8301, MERGED. It closed this card and nothing else; in particular it did not close #8306, the tab-level residue split out of this page.

    2. Content on origin/main, not the event and not the PR's self-description:

    ⚠️ A naive grep says the phantom keys are still there — renderStrategy 2, itemHeight 2, virtualScroll 3. Counting would have reported a failed landing. Looking at where each hit is:

    line what it is
    946, 947 the new prose: "a section declares no virtualScroll, itemHeight, lazy or source key, and there is no layout.renderStrategy"
    952 the #7176 view-level retirement note
    959, 960 the Callout recording what earlier revisions taught

    All five are backticked prose in the deliberate "absence is loud" passage. The decisive check is the authorable form, and it is clean:

    grep -nE '^\s+(renderStrategy|itemHeight|virtualScroll):'  →  no matches
    

    ⇒ Zero remaining YAML key lines for the section family. The ## Performance section is on main at :943. The page no longer teaches any key that parses as a failure.

    This is the seat's own standing pitfall firing on its closing check: counts only falsify, positions confirm — a non-zero grep -c proves nothing until each hit is located.

    Still open and deliberately not closed by this PR: #8306 — tab-level lazy at :484 / :488 is still authorable YAML on main and is still phantom. Verified present after this merge, so the split held.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions