From 7686d3c80c5704df8844b99bedf8ecc0da1c346c Mon Sep 17 00:00:00 2001 From: "claude[bot]" Date: Sun, 6 Sep 2026 03:42:56 +0000 Subject: [PATCH] docs(guide): state the html tier's tag spelling and scope the react tier's MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `content/docs/guide/react-pages.md` covers both source-authoring tiers but stated only the react tier's PascalCase rule, so a `kind:'html'` author copied a spelling the parser rejects at save time with nothing on the page naming the rule they broke. Two prose edits, modelled on the same fix upstream: - the `kind:'html'` section now says how whitelist entries are spelled — the registered type names written verbatim, namespace prefix and underscores included, with a prefixed and a snake_case example, and an explicit note that neither a PascalCase borrow nor a re-spelled `record:related-list` is registered; - the react-tier naming passages (the scope table row and the tag-derivation paragraph) are now scoped with "on this tier", and the derivation points at what an html page writes instead. The whitelist is `new Set(Object.keys(manifest.components))` compared by exact `Set.has` with no case folding, so this documents the rule as it already is; no parser, manifest or authorable-surface change. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_013uAaxiwgYDybsTNV9xwa1M --- content/docs/guide/react-pages.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/content/docs/guide/react-pages.md b/content/docs/guide/react-pages.md index b6dbfbcf2e..35b649a21d 100644 --- a/content/docs/guide/react-pages.md +++ b/content/docs/guide/react-pages.md @@ -80,7 +80,7 @@ Nothing is imported. These identifiers are injected as closure variables: | In scope | What it is | |---|---| | `React` | The host's React — call hooks with it (`React.useState`). | -| The public data blocks | Every public non-container block, as a PascalCase tag — but *what resolves* and *what you author against* are two different sets, below. | +| The public data blocks | Every public non-container block, as a PascalCase tag *on this tier* — but *what resolves* and *what you author against* are two different sets, below. | | `Block` | Escape hatch for anything not injected. | | `useAdapter` | The live data source — query/create/update. | | `data`, `variables`, `page` | The page's own data, local variables, and schema. | @@ -88,10 +88,12 @@ Nothing is imported. These identifiers are injected as closure variables: #### Two tiers: what resolves, and what you author against **The runtime scope** is every block in the curated public contract -(`PUBLIC_BLOCKS`) that is not a layout container. Tags are derived by splitting -the registry type on `-`, `_` and `:` and PascalCasing each part: `object-grid` → -``, `record:details` → ``. Blocks registered lazily -are in scope too — you never wait on a plugin chunk to reference one. +(`PUBLIC_BLOCKS`) that is not a layout container. **On this tier** tags are +derived by splitting the registry type on `-`, `_` and `:` and PascalCasing each +part: `object-grid` → ``, `record:details` → ``. A +`kind:'html'` page writes the registry type itself instead — ``, +``. Blocks registered lazily are in scope too — you never wait +on a plugin chunk to reference one. **The authored contract** is the much smaller set that has *published props* — checked by `os validate` and generated into the reference an author, human or AI, @@ -314,6 +316,17 @@ into a schema tree and rendered through the normal renderer — never executed. Only tags in the public block manifest are allowed, props are validated against each block's declared inputs, and unknown tags are a hard error at save time. +Those tags are the **registered type names, written verbatim** — whatever the +registry spells, character for character, including a `record:` / `page:` / +`element:` / `action:` namespace prefix and any underscore inside the name: +``, ``, ``, ``. +The whitelist is an exact string comparison, so nothing is normalised for you: +the **PascalCase** tags this page shows for `kind:'react'` are the other tier's +convention and are not registered names (`` is rejected with +` is not an allowed component`), and neither is a name re-spelled to +look uniform — `` is not registered, only +`` is. + Use it for anything author- or AI-generated. Expressions are limited to what the schema supports (`${data.x}`), and there is no local state or event handling beyond the action system.