docs(objectui): give the 3 singular section: examples in layout-dsl.mdx a name i18n anchor - #13882
Merged
os-project-manager merged 1 commit intoAug 31, 2026
Conversation
….mdx a `name` anchor `layout-dsl.mdx` teaches form sections both as a `sections:` sequence and as a singular `section:` mapping. The sequence examples were given `name` anchors in the YAML-arm sweep; the three singular ones were outside that population and stayed nameless, so each renders its authored label in every locale on a page whose job is to teach the opposite. The third site is not a copy of the other two -- it carries no `label:` at all, so it takes a descriptive `name` and no invented label: the "Rendered Grid" diagram directly below it draws no section header. `FormSectionSchema.name` stays `.optional()`; no schema moves. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pk26oZ12t5N1hwGW1m1MgC
os-project-manager
marked this pull request as ready for review
August 31, 2026 16:39
os-project-manager
deleted the
claude/issue-13759-layout-dsl-singular-section-name
branch
August 31, 2026 17:01
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #13759
content/docs/protocol/objectui/layout-dsl.mdxteaches form sections twice over: as asections:sequence, and as a singularsection:mapping — one section on its own.The sequence examples were given
nameanchors by the sweep that added the gate's YAML arm(#13761). The three singular ones were outside that sweep's population and stayed nameless, so
each renders its authored label in every locale, on the page whose job is to teach the opposite.
Three edits in one file, plus a changeset. No schema, no gate, no script moves.
The three edits, decided per site
They are not three copies of one edit — the third carries no
label:at all.### Basic Grid Layout(:235)label: Contact Informationname: contact_information### Custom Span Widths(:263)label: Product Detailsname: product_details### Responsive Breakpoints(:295)label:— onlycolumns:+fields:name: responsive_gridlabel:The third site is the one worth stating in full. It is deliberately minimal so the breakpoint
discussion is about
columnscollapsing, and none of the three fences' ASCII "Rendered Grid"diagrams draw a section header — inventing a
label:would have desynchronised the diagramprinted directly below it. The i18n symptom the other two carry does not even arise for a
section with no heading to mis-render; what it gains is the stable identifier itself, which is
what
FormSectionSchema.nameis for.namegoes abovelabelin all three, matching the sequence examples on this page.FormSectionSchemafinding —nameis declared and optional, confirmed by ablationpackages/spec/src/ui/view.zod.ts:2417,FormSectionSchemais astrictObjectdeclaring:Its JSDoc: "Stable identifier for translation lookup. snake_case convention. When provided,
translation bundles can target this section's
labelanddescription." So addingnameisexactly what the convention wants, and it stays
.optional()— no schema change here, per#10709 and reaffirmed by #10830.
These three fences are typechecked: each carries
{/* os:check-yaml FormSectionSchema key=section */}, andcheck:yaml-examplesvalidates them against the live schema. That gateis green on this branch, and a reverse verification proves the green is a real reading
rather than a vacuous one — misspelling one added key
name→nmaeon the committed treedrove it RED with the schema's own message:
The mutation was confirmed on disk before the run (injected spelling count 1, removed spelling
count 0, blob hash moved
777c1364…→bac9f27e…), and the restore leg was proven by bytes,not by an exit code:
git checkout HEAD --returned the file to777c1364…, identical to itsHEAD blob, with
git diff HEADempty. That the suggester mapsnmae→nameis itself theproof that
nameis a declared member of the schema.Re-run census — the population is 4, not 3, and the 4th is filed rather than fixed
Re-running the #13759 census on
8c6a7fc0bwith the sameyamlparser and the sameclassifyYamlFencethe #11887 arm uses, over all ofcontent/docs/**, with no marker filter:The card's "exactly these 3" was scoped by MARKER, not by shape, and the difference is not
drift:
- section:is present atconcept.mdx:425inaf01080e3, the very commit the cardmeasured on. Two controls separate the hypotheses — re-running the census with the gate's own
YAML_SECTIONS_KEYpre-filter yields 0 (so the card did not use it), whilegrepforos:check-yaml FormSectionSchema key=sectionacrosscontent/docs/**yields exactly the card's3, all in this file.
concept.mdxcarries noos:check-yamlmarkers at all.The 4th is not fixed here, and that is a judgement rather than an omission. Its
- section:sits under a
customizations:sequence of overlay entries that is declared nowhere inpackages/spec(the onlycustomizationsin the authorable surface istenant.zod.ts'sfree-form
z.record), and the ```json "Final Merged Layout" fence directly below it carries twomore nameless sections that neither arm of the gate judges, because
jsonis in neitherfence-language set. Repairing the YAML half alone would teach an anchor that vanishes from the
merged output two paragraphs later. That whole cluster is the population question this PR is
fenced out of, so it is filed bare and unassigned as #13880 with the measurement, for triage to
route.
check-docs-section-namejudgessections:sequences in both of its arms: the TS armbracket-matches
sections: [ … ]literals, the YAML arm walks everysections:sequence formapping items. A singular
section:mapping is outside both, which is exactly how these threedrifted in the first place. This PR does not widen the gate — triage's ruling on #13759
fenced that out, because widening means deciding which YAML keys introduce a form section at
all, and that wants taking together with how the
os:check-yamlmarker vocabulary is read.So nothing here stops a fourth nameless singular
section:appearing tomorrow. The gate's ownsweep line makes the blind spot visible on this branch — it reports
0 namelesswhile naming19 YAML section mapping(s) JUDGED, and none of those 19 are these 3.Is a follow-up warranted? Yes, in my judgement, and #13880 is it — but as the population
card, not as a "fix 3 more sites" card. The recurring shape across #10830, #11887 and now
#13759 is that each pass closes one selector and the next selector drifts, so the useful
follow-up decides the gate's population once (which keys, and which fence languages) rather than
sweeping a fourth spelling. Routing and priority are triage's call; the card is filed unlabelled
and unassigned.
Changeset
.changeset/docs-layout-dsl-singular-section-name.md,"@objectstack/docs": patch.Added rather than skipped, and the reasoning either way:
apps/docsis stillprivate: true,so nothing publishes from it — but
.changeset/config.jsonsetsprivatePackages: { version: true, tag: false }, so private packages are versioned and a changeset here is legal andmeaningful. The
skip-changesetroute does not apply: its closed list isdocs/adr/**,.claude/**,scripts/pm/**, tests/workflow and comments, andcontent/docs/**is in none ofthem. Precedent on
mainis the same shape —.changeset/docs-meta-index-detaches-folder-index.mdand
.changeset/flow-refusal-enumeration-four-pages.mdboth take"@objectstack/docs": patchfor a
content/docs/**correction.Verification
All commands below ran on the final commit,
fb218e6dd.The gate family was derived from the real change set, not from a hand-written list:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack→ 36 families from the2 changed paths. 35 green, 1 NOT MEASURED, none red.
node scripts/check-docs-section-name.mjs --self-testnode scripts/check-docs-section-name.mjs0 nameless form-section examples — 405 docs file(s) · 22 section literal(s) JUDGED · 19 YAML section mapping(s) JUDGEDpnpm --filter @objectstack/spec run check:yaml-examples18 tagged YAML example(s) … validate against their declared live spec schemaspnpm --filter @objectstack/spec run check:docsgen:schemavia the spec build)pnpm --filter @objectstack/spec run check:skill-examples260 prose examples type-check across 3 surface(s)pnpm check:doc-anchors·check:doc-authoring·check:docs-single-h1·node scripts/check-doc-frontmatter.mjscheck:docs-audit-scope·check:docs-redirects·check:corpus-claim-drift·check:role-word·check:react-page-adapter-contract·check:published-readme-links·check:section-landing-index·check:doc-route-spellingcheck:changeset-gate-self-tests·check:objectui-changeset·check:empty-changeset·check:changeset-no-major·check:adr-0087-registration·check:keyed-text-bounds·check:pm-half-statespnpm --filter @objectstack/lint run check:doc-formula-expressions·check:doc-security-posture@objectstack/formula/@objectstack/lint)pnpm check:nul-bytesscanned 7608 text file(s) … no raw ASCII control bytespnpm lint(repo-wideeslint . --no-inline-config)node scripts/check-test-completeness.mjsThat last row is the documented prerequisite branch, not a failure: the gate grades a saved
turbo run testlog that only CI produces, and it says so itself — "the local reading for thisgate is NOT MEASURED. ⛔ It is not a red, and there is nothing here to fix."
Four gates first refused with "Nothing was measured" because packages were unbuilt
(
check:doc-formula-expressions,check:doc-security-posture,check:docs,check:skill-examples). They were not recorded as reds — the packages were built(
turbo run buildforspec,lint,formula, thenclient-react,client; both runsthrough
scripts/pm/os-verify-lock.sh,VERDICT command-exit 0) and all four re-run green.The builds left the worktree clean:
git status --porcelainempty afterwards, sogen:schemamoved no tracked baseline.
Generated by Claude Code