Uh oh!
There was an error while loading. Please reload this page.
docs(ui): document the html and react page authoring tiers - #10281
Merged
Conversation
The react tier is real, shipped and gated, but the docs site only mentioned it negatively (one bullet saying `record:*` blocks are rejected there) and the Page Properties table listed neither `kind` nor `source` — so the Page guide read as if `regions` + `components` were the only way to author a page. - `ui/pages.mdx`: add the `kind` and `source` rows, and an "Authoring modes" section before `## Regions` contrasting the three tiers, stating that `source` is authoritative over `regions`, and carrying the ADR-0065 styling warning that applies to both source tiers. - `ui/react-pages.mdx` (new): the full react-tier guide — the trust boundary, the `react-pages` capability and `OS_PAGE_REACT=off`, the injected scope, flat props and `<Block>`, `useAdapter` query shapes, the ADR-0065 styling rule, accepted source shapes, page state, the `record:*` exclusion, and the real `os validate` output for each failure mode. Per-block prop tables are linked to the generated contract, never restated. - `ui/meta.json`: list `react-pages` immediately after `pages`. - `.claude/workflows/docs-accuracy-audit.js`: regenerated by `scripts/docs-audit/check-audit-scope.mjs --write`, which `check:docs-audit-scope` requires whenever a hand-written docs page is added. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GawRwpD44VwBDVy3hs77AX
This was referenced Aug 20, 2026
os-zhuang
approved these changes
Aug 20, 2026
os-zhuang
marked this pull request as ready for review
August 20, 2026 16:49
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 21, 2026
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 freeto 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#10210 · sub-issue of #10206
What this adds
The react tier is real, shipped and gated, but on the docs site a developer could
find only two generated schema rows, one negatively-phrased bullet, and the validation
rules. The Page Properties table listed neither
kindnorsource, so the Page guideread as if
regions+componentswere the only way to author a page.content/docs/ui/pages.mdx— adds thekindandsourcerows to PageProperties, and an Authoring modes section before
## Regionscontrastingfull/slottedvshtmlvsreact, stating plainly thatsourceis authoritativeover
regions, and carrying the ADR-0065 styling warning that applies to bothsource tiers. Cross-links the new page and
deployment/validating-metadata.content/docs/ui/react-pages.mdx(new) — the react-tier guide: the trustboundary, the
react-pageshost capability and theOS_PAGE_REACT=offkill switch,the injected scope and PascalCase tags, flat props and the Block escape hatch,
useAdapterquery shapes, the ADR-0065 styling rule, accepted source shapes, pagestate, the
record:*exclusion, and the realos validateoutput for each failuremode.
content/docs/ui/meta.json—react-pagesimmediately afterpages..claude/workflows/docs-accuracy-audit.js— a declared deviation from this card'sfile surface; see the section below for why it is required and not optional.
Per-block prop tables are not restated. The generated contract
(
skills/objectstack-ui/references/react-blocks.md, built fromREACT_BLOCKSbypackages/spec/scripts/build-react-blocks-contract.ts) is linked as the authority.No file under
packages/spec/**,skills/**, or the objectui repo is touched, and nofile under
content/docs/ui/other than the three above — #10237 owns the rest.Everything on the page was measured, not recalled
The
os validateblocks are real captured output, not composed.os validatewas runagainst
examples/app-showcasewith the built CLI, clean and then with deliberatemistakes injected into
renewals-pipeline.page.ts:Running author-time rules (41)...·Validation passed (1523ms)objectNamedropped from the ObjectChart blockreact-prop-missing-requiredonSuccessrenamed toonSucceson the ObjectForm blockreact-block-needs-record-contextEach mutation was confirmed on disk by grepping for both the removed and the injected
text before the run, and the file was restored to a byte-identical copy afterwards
(
sha256matched,git statusclean).Sources disagreed; here is how each was resolved
objectui/content/docs/guide/react-pages.mdwas the starting draft. Four of its claimsare contradicted by this repo's sources and were not carried over:
className="grid grid-cols-2 gap-4"and instructs "compose layout with real HTML andTailwind". ADR-0080 carries an explicit amendment (2026-06-30, ADR-0065 styling
correction): "Do not author Tailwind classes in page source" — a page's
sourceisruntime metadata the console's build-time Tailwind never scans, so utility classes
silently produce no CSS. The generated contract says the same, and all three real
kind:'react'pages inexamples/app-showcasecontain zeroclassNameand styleexclusively with inline
styleobjects plushsl(var(--token))colors. This repo'ssources win; the rule is the page's most prominent callout.
record:*blocks. The objectui guide offersrecord:detailsas an in-scopeexample. Those blocks are reachable in the runtime scope, but
os validaterejectsthem (
react-block-needs-record-context). The page states both halves.adapter.findoptions. The objectui guide writesadapter.find('x', { filters: [['status','=','open']] }).filtersis not aQueryParamskey — the canonical keys are$filter/$top/$skip/$select/$orderby/$search, and the adapter reads$filter. The guide's sample returnsunfiltered data with no error. The page uses
$filter/$topand warns aboutthe prefix explicitly.
ObjectMetric. The curated contract publishes ObjectForm, ListView, ObjectChart and
Block; a kanban is
ListView viewType="kanban"orBlock type="object-kanban". Thepage defers to the generated contract and does not list block names of its own.
Filed upstream rather than smoothed over — see the linked findings.
Declared deviation from the file surface, and why this PR is human-merge-only
This card's declared file surface is
content/docs/ui/**. One path outside it is inthis diff, deliberately:
.claude/workflows/docs-accuracy-audit.js. It is not a handedit — it is exactly what the gate's own
--writeproduced, committed unmodified.check:docs-audit-scopegoes red the moment a hand-written page is added tocontent/docs/, and its only remedy isnode scripts/docs-audit/check-audit-scope.mjs --write, which regenerates that file (a+1/-0line). The list has to live inlinethere because the workflow runs in a
node:vmwith no filesystem and cannot enumeratecontent/docsitself..claude/**is on the governed register, so:This is #9866 exactly, which already measures the same
+1/-0collision on fourpage-adding docs PRs. No seat should flip this ready, enqueue it, or arm auto-merge.
The regeneration is not optional — dropping it makes a required lint context red.
Gates
Re-derived with
node scripts/pm/dispatch-gates.mjsafter the final commit — the.claude/file pulled in three families the dispatch list did not name(
check:pm-governed-merges,check:skill-frame-sync,@objectstack/lint check:doc-formula-expressions). All 15 run green atc6a62709c:check:doc-anchors·check:doc-authoring·check:docs-audit-scope·check:docs-redirects·check:published-readme-links·check:role-word·check:cross-package-test-inputs·check:pm-governed-merges·check:skill-frame-sync·@objectstack/lint check:doc-formula-expressions· and the spec setcheck:empty-state·check:liveness·check:strictness-ledger·check:variant-docs·check:skill-examples.Verdict lines, as the gates printed them:
The new page carries one
{/* os:check */}block — a completedefinePage({...})reactpage — and
check:skill-examplesextracted and type-checked it(
content/docs/ui/react-pages.mdx:346 -> docs__ui_react-pages__1.ts), so the sample isverified against the built spec rather than asserted.
No changeset
Docs-site content plus one generated scope line; this PR publishes no package. Labelled
skip-changeset.Generated by Claude Code