Skip to content

docs: layout.md names the object-grid object with objectName, and flex.mdx teaches the four direction values (objectui#11298) - #11314

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-11298-docs-snippet-key-value
Oct 1, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-11298-docs-snippet-key-value

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #11298
Clause-②: no

Two docs snippets taught a key and a value that objectui validate refuses. This PR corrects both in today's flat spelling, and nothing else.

Site Taught Now teaches
content/docs/guide/layout.md, the "With Action Buttons" snippet, its object-grid node "object": "products" "objectName": "products"
content/docs/components/layout/flex.mdx, the Schema block, direction 'row' | 'column' 'row' | 'col' | 'row-reverse' | 'col-reverse'
  • There is no alias and no renderer fallback for object or column. The validator is right, and the docs were wrong.
  • Both hunks are one line each. The layout.md hunk stays on the snippet's own line, so it does not touch the prose after the snippet that draft objectui#11069 edits.
  • FlexSchema.direction declares the four values above, and the flex renderer maps each one to a class (flex-row, flex-col, flex-row-reverse, flex-col-reverse). It has no branch for column.

Measured before and after (head 680a2be4b4)

The probe reads both snippets from the docs on disk and runs safeValidateSchema from packages/types/src/zod/index.zod.ts on them. That is the function objectui validate calls. The probe lives in the scratchpad and is not committed.

Before, on base caa0cd3927:

layout.md "With Action Buttons" (verbatim): FAIL [{"path":"children","code":"invalid_union","message":"Invalid input"}]
  object-grid node alone: FAIL [{"path":"objectName","code":"invalid_type","message":"Invalid input: expected string, received undefined"}]
flex.mdx direction line: direction?: 'row' | 'column';
  { type: 'flex', direction: 'row' }: PASS
  { type: 'flex', direction: 'column' }: FAIL [{"path":"direction","code":"invalid_value","message":"Invalid option: expected one of \"row\"|\"col\"|\"row-reverse\"|\"col-reverse\""}]

After:

layout.md "With Action Buttons" (verbatim): PASS
  object-grid node alone: PASS
flex.mdx direction line: direction?: 'row' | 'col' | 'row-reverse' | 'col-reverse';
  { type: 'flex', direction: 'row' }: PASS
  { type: 'flex', direction: 'col' }: PASS
  { type: 'flex', direction: 'row-reverse' }: PASS
  { type: 'flex', direction: 'col-reverse' }: PASS

On the strict authoring face (StrictAnyComponentSchema), the fixed "With Action Buttons" snippet passes, and so does { type: 'flex', direction: 'col' }. The controls stay red: direction: 'column' fails invalid_value, and { type: 'object-grid', object: 'products' } fails both objectName invalid_type and unrecognized_keys: object.

Other copies

A census of every object-grid node literal (in any fence language) and every direction taught as a quoted column covered content/docs/** and every tracked README.md (257 files, 48 object-grid literals). It found exactly one copy of each mistake, and this PR fixes both. After the fix, both counts read 0.

Do the repo's snippet checks reach these fences? No, so no pin is added

  • check:doc-snippets compiles ts / tsx fences only. Its header names schema-key validity as blind spot 1.
  • The layout.md snippet is a json fence. The flex.mdx block is a plaintext fence that check:doc-fences lists in its declared shrink-only debt (the objectui#5867 lane).
  • check:doc-types reads the type literal only. check:doc-examples reads JSDoc @example blocks under packages/*/src only.
  • The tests that read layout.md's json fences (page-actions-refusal-7926.test.ts, guide-layout-page-buttons-7926.test.tsx) assert actions and children, and that the buttons render. None of them runs safeValidateSchema.

The ruling made a snippet pin conditional on a snippet check reaching these fences, and no check reaches them. So no pin and no new gate are added.

Checks (run at 680a2be4b4)

  • The 23 test files that node scripts/markdown-test-inputs.mjs --list records as reading either edited file, run under the verify lock from the repo root with pnpm exec vitest run --maxWorkers=2 and those 23 paths: Test Files 23 passed (23), Tests 851 passed (851), VERDICT command-exit 0.
  • pnpm check:doc-fences exits 0: "every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 72 declared file(s)…".
  • pnpm check:doc-types exits 0: "Every documented component type is registered."
  • node scripts/check-doc-links.mjs exits 0: "Links are valid across 17 scan roots."
  • pnpm check:control-bytes exits 0: "OK (scanned 9780 tracked text file(s); skipped 85 binary)".
  • node scripts/check-changeset-presence.mjs exits 0: "No source or published contract of a released package changed in this range, so no changeset is owed."
  • pnpm changeset:check exits 0.
  • pnpm check:new-line-citations exits 0: "0 new citation(s)".
  • node scripts/check-governed-queue-guard.mjs --test on both paths reports NOT GOVERNED.
  • pnpm check:doc-snippets is NOT MEASURED. It exited 2 with PRECONDITION NOT MET because its 34-package build closure is not built in this container, and that build does not fit the foreground cap. This diff changes no ts/tsx fence, so the gate's population is untouched. CI's doc-snippet-types.yml builds the closure and runs it.
  • Lint: eslint's own answer for both edited files is "File ignored because no matching configuration was supplied", so this diff has no lint population. The repo-wide lint run belongs to CI.

No changeset is added: docs are not a released package, and the presence gate agrees. ⛔ No skip-changeset label, because nothing in this repo reads it.

Acceptance notes

  • Coupling. objectui#11276's object-grid batch may later move this node into the properties bag, and flex.mdx is part of the objectui#11300 decision's corpus. This PR corrects the key and the value in the flat spelling only. Whichever batch moves the node later carries the corrected key.
  • Other lines in flex.mdx's Schema block. align and justify list a subset of what FlexSchema accepts (baseline/stretch, around/evenly are missing). children is shown as required, but the schema makes it optional and accepts a single node or an array. Every value taught there validates, so they are left as they are: incomplete, not wrong. The block is also in check:doc-fences' declared debt, so no gate reads it.
  • Two related readings are handed to the seat in the dispatch report and are not fixed here: the "Settings Page with Tabs" snippet on layout.md, and five object-grid nodes elsewhere in the docs that bind through dataSource without objectName.

This PR was written in session https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ (objectui domain:ui seat 1 dispatch).


Generated by Claude Code

…lex.mdx teaches the four direction values the schema takes (objectui#11298)

The "With Action Buttons" snippet in content/docs/guide/layout.md wrote
`"object": "products"` on its `object-grid` node. `object` is no
ObjectGridSchema key and `objectName` is required, so safeValidateSchema
(what `objectui validate` calls) refused the verbatim snippet at `children`
and the grid never named its object. It now writes `"objectName": "products"`.

The Schema block in content/docs/components/layout/flex.mdx taught
`direction?: 'row' | 'column'`. FlexSchema.direction is
`'row' | 'col' | 'row-reverse' | 'col-reverse'`: `'column'` is refused with
invalid_value and the flex renderer adds no direction class for it. The block
now lists the four values the schema declares and the renderer draws.

No alias and no renderer fallback for `object` or `column`: the validator is
right and the docs were wrong.

Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Oct 1, 2026
@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 3 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/6872-app-shell-branding-title-jsdoc.md

  • names content/docs/guide/layout.md → content/docs/guide/layout.md — edited by this change

    Correct the AppShellBranding.title doc comment. It read "Page title suffix (sets document.title)" while useAppShellBranding assigns document.title = title wholesale — nothing is appended; the caller composes the whole string (the console passes "App label — Product name"). That comment ships in dist/index.d.ts and is the only description a consumer sees on editor hover, so a reader who followed it passed a suffix-only fragment and got a truncated title with no error. The comment now carries the same wording as content/docs/layout/app-shell.mdx, and agrees with the AppShellProps tables in the package README and content/docs/guide/layout.md. No runtime behaviour changes; the wholesale assignment and the four-surface agreement are now pinned by tests.

.changeset/7926-page-node-refuses-actions.md

  • names content/docs/guide/layout.md → content/docs/guide/layout.md — edited by this change

    Scope. One key, by name; the node is NOT strict. A census over this tree read 91 authored page-tagged objects with a blind-spot reading of 8 unreadable sites, and found only actions (3 sites, all in content/docs/guide/layout.md) and breadcrumbs (1 site, its own question, untouched) surviving passthrough on a real page node — every other undeclared key belongs to a different declaration that merely spells type: 'page'. PageNodeSchema still passes unknown renderer props through.

.changeset/8871-page-node-refuses-breadcrumbs.md

  • names content/docs/guide/layout.md → content/docs/guide/layout.md — edited by this change

    Three author sites, all teaching passages in content/docs/guide/layout.md, and that count corrects the actions refusal's "1 site": its census reads every git-tracked JSON file, every json fence in .md/.mdx, and every TS/TSX object literal via the TypeScript AST (PR fix(types,docs): refuse actions by name on the page node, teach the shape that draws (objectui#7926) #8870), and it undercounted for two different reasons. The Schema API block declared breadcrumbs?: ArrayANGLE-BRACKETS({ label, href }) outright and its literal does carry type: 'page', but that literal sits inside a markdown typescript fence — a fence language the census's json-fence reader never visits, so it was never read at all. Best Practices §2 authored it on a fragment inside a json fence the census does read, but that fragment never writes type, so a page-tagged filter correctly excluded it. No example app, catalog fixture, template or customer document writes the key, so the refusal strands no authored document in this tree.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with 50583364a (merge-base with origin/main): 2 file(s) changed outside .changeset/, read against 1882 pending declaration(s) that publish a body (2495 pending in total). · run

…tems, the key the tabs node reads (objectui#11298)

The "Settings Page with Tabs" snippet in content/docs/guide/layout.md wrote
its tab list under `tabs` on a `type: "tabs"` node. TabsSchema requires
`items`, and the tabs renderer reads `schema.items`, so safeValidateSchema
(what `objectui validate` calls) refused the verbatim snippet at `children`
and the node draws no tabs as taught. It now writes the list under `items`.

No alias and no renderer fallback for `tabs`. This is the third site of the
same family, folded into this card by the dispatching seat.

Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 703d7385421db1cd1ce6dfea5a75914b6ff798b8
Local-runs: none

Inputs: card objectui#11298 (body; triage 5922545718; claim 5923217045; dev report 5923598012; patch-round-1 report 5923725773), PR objectui#11314 (body, 2-file list, the changeset-claim-re-read comment 5923540015), the net diff caa0cd3927..703d738542 (2 commits, 3 hunks, +3/-3, content/docs/** only), the 38 check-runs on the head, and source reads at the head: packages/types/src/zod/{objectql,layout}.zod.ts, packages/components/src/renderers/layout/{tabs,flex,page}.tsx, the scripts/check-doc-*.mjs headers, the three pending changesets the bot names. Branch point caa0cd3927 is the merge-base; git log caa0cd3927..origin/main on both edited files is empty, and the three-dot stat equals the two-dot diff.

① Derived judgments

  1. layout.md "With Action Buttons", "object" to "objectName" — right. ObjectGridSchema.objectName is z.string(), required (objectql.zod.ts:305); object is no key of that schema. One line moved; the fence's buttons-in-children shape is untouched.
  2. flex.mdx Schema block, 'row' | 'column' to 'row' | 'col' | 'row-reverse' | 'col-reverse' — right. FlexSchema.direction is z.enum(['row', 'col', 'row-reverse', 'col-reverse']) (layout.zod.ts:339, and :366 on the public-block twin); flex.tsx:29-32 maps exactly those four to flex-row / flex-col / flex-row-reverse / flex-col-reverse with no column branch. One line moved; the align, justify, wrap, children lines are untouched.
  3. layout.md "Settings Page with Tabs", "tabs" to "items" — right. TabsSchema.items is z.array(TabItemSchema), required (layout.zod.ts:471); tabs.tsx:50 and :61 read schema.items; tabs is undeclared on the node and body / children are tombstoned. One line moved. This is the third site the seat folded in on patch round 1; the claim's file surface is read as amended by the seat's ACCEPT.
  4. No alias, no renderer fallback — honoured. Nothing under packages/** is in the diff.
  5. Census — holds on spot-check (git grep at the head over content/docs/** and tracked README.md): no object-grid literal is followed by an object key (every remaining "object": sits inside a dataSource, options.data or optionsFrom sub-object, which is the spec's own spelling there); no direction is taught as column (the 3 remaining direction + column hits are the flex direction gap / grid columns html-block prose in react-pages.md and the react-runtime README, not a flex value); 6 type: tabs literals, the other 5 all under items; the remaining tabs: keys (schema-reference.md:693, :1175, plugin-detail/README.md) sit on detail / detail-view nodes, a different node type. Exactly one copy of each mistake existed, and all three are fixed.
  6. No pin — the reading is right. check-doc-snippet-types.mjs compiles ts / tsx / typescript fences only and its header names schema-key validity as blind spot 1; check-doc-fence-languages.mjs judges fence language only and lists flex.mdx as one block of objectui#5867's shrink-only debt (:422); check-doc-component-types.mjs judges the type literal only; check-doc-expression-carriage.mjs is report-only, and its own header says a json fence on these pages can author any key and no gate objects. Of the tests that read layout.md, the two that call safeParse (page-actions-refusal-7926, page-breadcrumbs-refusal-8871) parse their own fixtures and scan the guide's json fences for the retired key by name; neither validates a fence, and no test reads flex.mdx. The ruling's condition ("if the repo's snippet checks reach these fences") is unmet, and a new gate is default-no. Noted, not owed: a fence-reading pin in the readme-kanban-example-8256 / timeline-readme-schema-example-10824 shape would have needed no gate.
  7. Pending-changeset re-read — no sentence falsified. 6872 cites the AppShellProps table in layout.md, untouched. 7926's "3 sites … rewritten onto the shape that draws, and pinned by their rendered result" still holds: the With Action Buttons fence keeps its buttons in children, the hunk is on the sibling object-grid node, and guide-layout-page-buttons-7926.test.tsx is among the 23 the dev ran green. 8871's "three author sites" and its "There is no breadcrumbs array" passage are untouched. No body correction is owed.
  8. Public surface: none. No export, schema, prop or renderer changes; the accept-set is unchanged on both faces.
  9. Check-runs on the head. 28 success, 3 skipped (coverage shard, coverage, dependabot — the path switch), 7 in_progress and not concluded: Spec Main Shape Gate, Test shards 1/8, 2/8, 3/8, 5/8, 7/8, 8/8 (shards 4/8 and 6/8 are success; no Test roll-up exists on this head yet). Doc Snippet Type Check success closes the dev's NOT MEASURED; Lint success closes the dev's unmeasured lint; Changeset Declaration, Changeset Claim Re-read, Doc Fence Language Check, Doc Component Type Check, Internal Docs Link Check, Build Docs, Type Check and Test (dist pins) are success. The earlier Test failure on 680a2be4b4 was the roll-up cancelled by the patch-round push and is not read.

② Semver level

  • No changeset — right. check-changeset-presence.mjs guards pkg/src/** of the fixed group only; content/docs/** is outside it, and the Changeset Declaration check-run is success on the head. No skip-changeset label, and the PR body is right that nothing in this repo reads one.
  • Clause-②: no — right. Docs only; no accept-set change on the tolerant or the strict face; the schemas are the instrument, not the patient.
  • Level: none (docs are not a released package).

③ Boundary flags

  • open_questions: [] in both rounds. Nothing to answer.
  • Dev flag, both rounds — the PR body is stale and the dev does not PATCH. Owed by the seat before the PR leaves draft: (a) a third Site row for the tabs to items hunk; (b) the Acceptance notes' last bullet drops the "Settings Page with Tabs" hand-off (fixed at this head) and rewords the grid half as "five object-grid nodes that carry no objectName (three bind through dataSource, one through bind, one through rowData), carried by objectui#11276"; (c) the Checks section cites 680a2be4b4, and patch round 1 re-ran them at 703d738542. Not blocking the verdict on the diff: the card's two reports carry the true description.
  • Dev flag — commit trailer uses the repo's model-free pair per objectui AGENTS.md precedence. Accepted; no action.
  • Out-of-scope 1 (tabs fence) — folded on patch round 1 and fixed at this head. Closed.
  • Out-of-scope 2 (object-grid with dataSource and no objectName) — verified at the head: objectName is required (objectql.zod.ts:305) while dataSource is optional, by reference to the spec's element binding (:312), whose comment says the registered renderer reads it through ElementDataSourceGate. A contract decision, not a docs edit. Carrier objectui#11276's object-grid batch is right, that batch owning the node's spelling, with one condition: the batch must carry the requiredness question by name (five docs grids depend on it), else a class (b) card of its own is owed. Escalated to the seat as one line on objectui#11276.
  • Out-of-scope 3 (flex.mdx align / justify subsets, children shown required) — carrier objectui#11300's corpus is right; triage named flex.mdx as that decision's corpus. Nothing owed here.
  • Out-of-scope 4 (strict face, "carrier: none") — escalated; it is worth a line, and the page half is fileable. Verified at the head: maxWidth / padding at layout.zod.ts:310-315 belong to ContainerSchema; PageNodeSchema (:835) declares neither in its own extension; and page.tsx (the registered page renderer, :801) has no read for either key — its max-width class comes from pageType through getPageMaxWidth (:655). So layout.md:241, :500, :744 (maxWidth on a page node) and :661 ("padding": false on a page node, under the heading "Control page content padding") teach keys the page renderer never reads: the tolerant face passes them unjudged through passthrough and draws nothing, the objectui#7926 / finding(types): breadcrumbs on the SDUI page node has no reader — the same class as objectui#7926, one key over, deliberately left parsing #8871 shape on the same node. The action:button half (flat variant / icon / actionType) is the declared public-block state (changeset 10872-held-public-block-arms: flat props pass the tolerant face, the strict face refuses them, properties passes both), so it belongs with the properties-bag family and PR objectui#11069's un-park census. Owed: one line on objectui#11069's un-park census for all five fences, and a class (c) card for the four page sites (dedupe words: layout.md page maxWidth inert · page padding false not read · PageRenderer getPageMaxWidth pageType). Not this PR's surface; not blocking.
  • 7 check-runs in progress are named above as not concluded. The seat's merge waits on them; this verdict reads them neither as pass nor as fail.
  • Draft PR — the seat marks it ready after the body PATCH.

Implemented-by: claude/issue-11298-docs-snippet-key-value
Reviewed-by: session_0122Knsowci76D2rBWReCzzZ

VERDICT: PASS

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 1, 2026 03:01
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 1, 2026
Merged via the queue into main with commit 0c6f9bb Oct 1, 2026
41 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11298-docs-snippet-key-value branch October 1, 2026 03:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

2 participants