Uh oh!
There was an error while loading. Please reload this page.
docs(ui): add the report and theming guides, and the book spine half of doc-pages - #10483
Conversation
…of doc-pages Three authorable surfaces had a generated schema reference and no page teaching them. Same defect shape, same directory, one meta.json — landed together. - content/docs/ui/reports.mdx (new) — leads with the distinction that sends a reader here (report vs list view vs dashboard widget), then the four report types, drill-through, the embedded chart, app-nav reachability, and what the schema does and does not say about access. Dataset authoring, ordering semantics and filter placeholders are cross-linked to data-modeling/analytics.mdx rather than restated. - content/docs/ui/theming.mdx (new) — the palette/typography/radius/shadow surface, the schema-key -> CSS-variable rename table, the two-theme light/dark idiom the showcase actually ships, and the bare-HSL-triple token contract that makes ui/react-pages.mdx's `hsl(var(--token))` rule what it is. Carries a warn callout stating what authoring a theme does and does not wire up today. - content/docs/ui/doc-pages.mdx — adds the `book` half. The existing `doc` content is untouched; the new section states precisely what derives group membership, the three per-doc keys the spine reads, identity and audience, a worked example, and how `doc` and `book` compose on the tree endpoint. - content/docs/ui/meta.json — `reports` after `dashboards`, `theming` after `reports`. Two insertions; nothing else re-ordered. - .claude/workflows/docs-accuracy-audit.js — the mechanical `--write` regeneration `check:docs-audit-scope` requires when a hand-written page is added, committed exactly as the tool produced it (+2/-0). `.claude/**` is a governed surface, so this PR is human-merge-only. Claude-Session: https://claude.ai/code/session_01GawRwpD44VwBDVy3hs77AX Co-authored-by: Claude <sales@objectstack.ai> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
os-elon
commented
Aug 21, 2026
Maintainer ruling: this PR is split — |
Per the maintainer ruling on PR #10483 (issue comment #10483 (comment)), issue #10485 retired the `themes` authoring surface (option B) between this PR's writing and its merge, so its theming guide must not ship while reports.mdx and the doc-pages book half land as planned. - remove content/docs/ui/theming.mdx - drop the "theming" entry from content/docs/ui/meta.json ("reports" stays) - regenerate .claude/workflows/docs-accuracy-audit.js via node scripts/docs-audit/check-audit-scope.mjs --write (ALL_HANDWRITTEN -1) The withheld content stays recoverable in this branch's history; its disposition (deletion vs. a short app.branding pointer page) is owned by the retirement card #10485.
os-elon
commented
Aug 21, 2026
os-dev-report Mechanical split-commit is prepared and verified locally but could not be pushed — the PR's head branch has been added to a merge queue, and GitHub's protected-branch hook refuses the push: This PR touches Per my dispatch's basic rules, dequeuing / flipping this PR to draft is explicitly not my call — that state was set by another actor and reversing a ready/queue flip is reserved for the PM or maintainer. I am stopping here rather than touching it. Work completed and verified, sitting as a local unpushed commit (
Diffstat vs the PR's Confirmed no dangling inbound links into the removed page before deleting ( Gates run against the actual diff (
Needed from the PM/maintainer: dequeue this PR (or confirm it should stay queued and tell me why, since that reads as a Prime Directive #14 violation) so the branch accepts a push, then I can land this commit as-is — no rework needed, just a re-push once the branch is writable. The commit is sitting locally in my worktree ( Generated by Claude Code |
os-elon
commented
Aug 21, 2026
os-dev-report Split commit pushed successfully. The prior GH006 rejection (PR was in a merge queue, an incident being tracked separately by the maintainer) is resolved — the remote branch was confirmed still at the unmoved head Commit: Diffstat vs the prior head (
Gates run against this diff (
Not flipped ready, not armed for auto-merge, not touched by me at all — that state remains the maintainer's / PM's to set. Awaiting CI re-convergence and human merge. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Two hand-written pages assert things the schema no longer does. Both were found by the #10237 docs seat (PR #10483) and filed rather than fixed because they fell outside that card's declared file surface. content/docs/ui/index.mdx - "The building blocks" credited themes with `typography` and `spacing`. `spacing` is a `guidance` tombstone (removed #3494); the typography scales are `retiredKey()` tombstones (removed #5021) and only `fontFamily.base` survives. Replaced with the four keys ThemeSchema's own docblock names as live: "`colors`, `borderRadius`, `shadows` and `fontFamily.base` have live consumers and stay." - The Cards grid listed 7 of the module's 11 sibling pages. Added the four it was missing (`actions`, `react-pages`, `reports`, `translations`), each inserted next to its meta.json neighbour so no existing card moves. content/docs/capabilities/analytics.mdx - "joined (multi-object)" names the mechanism ADR-0021 removed. Every block of a joined report is dataset-bound; `objectName` / `object` / `dataSet` / `source` are alias entries pointing at `dataset`. Two words changed, nothing else on the page touched. Fixes#10487Fixes#10488 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
Fixes#10237 · sub-issue of #10206 · last card of the epic
What this adds
Three authorable surfaces each had a generated schema reference and no page teaching
them. Same defect shape, same directory, one
meta.json— landed together, but writtenas three independently checkable pieces.
content/docs/ui/reports.mdx(new) — leads with the distinction that sends areader here (report vs list view vs dashboard widget), then the four report types with
worked
summary/matrix/joinedexamples, ordering rules, drill-through, theembedded chart, app-nav reachability, and what the schema does and does not say about
access. Dataset authoring, ordering semantics and filter placeholders are cross-linked
to
data-modeling/analytics.mdx, not restated.content/docs/ui/theming.mdx(new) — what a theme declares, the schema-key toCSS-variable rename table, the two-theme light/dark idiom the showcase actually ships,
extends/customVars/ mode resolution, and the bare-HSL-triple token contract.Opens with a warn callout stating what authoring a theme does and does not wire up
today (see below).
content/docs/ui/doc-pages.mdx— adds thebookhalf. The existingdoccontentis untouched; the new section states precisely what derives group membership, the three
per-doc keys the spine reads, identity and audience, a worked
defineBookexample, andhow
docandbookcompose on the tree endpoint.content/docs/ui/meta.json—reportsafterdashboards,themingafterreports. Exactly two insertions; nothing else re-ordered..claude/workflows/docs-accuracy-audit.js— the mechanical regeneration, committedexactly as the tool produced it. See the human-merge section.
Nothing under
packages/spec/**is touched, and no file undercontent/docs/ui/otherthan the four above —
pages.mdxandreact-pages.mdxare read-only here.Three PM premises were measured. One of them is false.
1.
ReportSchemais live — confirmed.reportis inMetadataType, inDEFAULT_METADATA_TYPE_REGISTRY(**/*.report.ts,loadOrder: 60) and inBUILTIN_METADATA_TYPE_SCHEMAS, so the runtime REST door validates a stored report.App nav
type: 'report'is cross-ref-validated instack.zod.tsand routes to/report/plus the report name, which objectui renders throughReportViewandDatasetReportRenderer. No warn callout needed.2.
ThemeSchemaparses but nothing applies it — FALSIFIED as "live and enforced".This is the
stack.toolsshape the dispatch warned about, and the page says so in a warncallout rather than reading as if authoring a theme wires something up:
defineStack({ themes })/defineTheme()parse strictly (ADR-0078)ARTIFACT_FIELD_TO_TYPEmapsthemes->theme, items are registeredthemeappears zero times inmetadata-plugin.zod.ts; not inMetadataType, not in the registry, not inBUILTIN_METADATA_TYPE_SCHEMAS, so there is no runtime REST validation doorgenerateThemeVarsin@object-ui/core, applied by theThemeProviderin@object-ui/reactvia itsthemespropthemeitem back, and no key selects oneMeasured, not inferred: no framework package under
core/runtime/rest/services/pluginsreads.themesor a'theme'metadata item; the onlyThemeProvider mounted in objectui is
ConsoleShell.tsxmountingapp-shell/chrome/ThemeProvider(a light/dark/system class toggle unrelated toThemeSchema), and the console never fetches theme metadata.AppSchemahas nothemekey either —themethere is an alias ontobranding.What does colour a running console is
app.branding.primaryColor/accentColor, read bypackages/layout/src/AppShell.tsxand written onto--primary,--primary-foreground,--ring,--sidebar-primary,--sidebar-ring,--accent,--accent-foreground. The page points there for "recolour the shipped console" and keepsthe theme surface for host apps that mount the provider. Filed as a finding.
3.
BookSchema+ ADR-0046 §6 describe a live derived-membership mechanism — confirmed,and the page describes the resolver rather than the ADR.
resolveBookTree/deriveImplicitPackageBook/resolveDocAudiences/docAudienceAllowsare all calledfrom
packages/rest/src/rest-server.tsonGET /meta/book/:name/tree. The page statesthe actual four-step derivation (group order, first-claim-wins over
include-or-group,doc.orderthen label within a group, orphans into a synthetic Uncategorized group),the two
includeforms,pagesoverrides with'---'/'...', and the two-stageaudience filter. One ADR/code divergence is noted inline: §6.7 sketches the gate as
{ profile }; the shipped key is{ permissionSet }per ADR-0090.Cross-page consistency with
react-pages.mdxtheming.mdxis the other end of the token systemreact-pages.mdxdescribes, so thetwo were made to agree on measurement, not by matching wording:
hsl(…)wrapper exists.toCSSColorconverts an authored hex to a bareHSL triple —
#7C3AEDbecomes262 83% 58%. The variable holds the inside of acolour, so
hsl(var(--card))is required rather than stylistic.theming.mdxsays thisand links
react-pages.mdx#styling; non-colour tokens (var(--radius),var(--shadow-md)) take no wrapper, matching that page's own examples.react-pages.mdxlists--primary-foregroundand--space-*among usable tokens.Neither is theme-authorable — both come from the console base stylesheet
(
@object-ui/components/src/index.css, which wraps every colour token ashsl(var(--token))).theming.mdxtherefore says a theme overrides a subset of thebase token set rather than defining it, so a page may legitimately reference a token no
theme can set.
"constrained JSX/HTML+Tailwind" wording that ADR-0080's 2026-06-30 amendment retracted
and that
PageSchema'sdescribe()strings still carry (spec: PageSchema'skind/sourcedescriptions still teach "JSX/HTML+Tailwind", which ADR-0080's 2026-06-30 amendment retracted — and the generated reference publishes it verbatim #10286).theming.mdxdescribes theme tokens only and does not restate the page-styling rule it links to.
Everything on the pages was read from source
ReportSchema/JoinedReportBlockSchema/ReportSortSchemaand thefour showcase reports in
examples/app-showcase/src/ui/reports/index.ts. Thereport-vs-view distinction is the showcase's own recorded conversion (its former
TaskListReportbecame thetabularlist view onshowcase_task, because a flatrecord list is an object-bound row lens under ADR-0017), not an invented framing.
COLOR_TO_CSS_MAPplus the radius/shadowmaps in
@object-ui/core'sThemeEngine.ts, key by key. The light/dark idiom isexamples/app-showcase/src/ui/themes/index.ts— two theme items sharing a palette base,which is what the schema supports (
modeis a scalar; there is no nested dark block).BookSchemaand theresolveBookTreeresolver, plus the REST route.One PM lead corrected: the report "two data paths"
The card asks for "the two data paths: object-bound and dataset-bound". There is one.
Under the ADR-0021 single-form cutover the legacy inline
objectName+columns+groupingsquery was removed;ReportSchema.superRefinerequiresdataset+valuesforevery non-
joinedreport, andobjectName/object/source/dataSetare aliasentries pointing at
dataset. The page documents one path and says so in an info callout,and
analytics.mdxis cross-linked for the dataset side as instructed. The two pages agree.Human-merge-only, expected, not a failure
check:docs-audit-scopewent red the moment the two new pages existed:Its only remedy is
node scripts/docs-audit/check-audit-scope.mjs --write, which produceda
+2/-0edit to that file — committed unmodified..claude/**is on the governedregister:
No seat should flip this ready, enqueue it, or arm auto-merge. Dropping the
regeneration is not an option — it makes a required lint context red. This is #9866, the
same collision all five sibling docs PRs in this epic hit.
Gates
Re-derived with
node scripts/pm/dispatch-gates.mjs(no path args — it derives its ownchange set) after the final commit, and the whole union re-run at that commit,
72e1a98f2. All 15 derived families green, pluscheck:nul-bytesandcheck:skill-examples: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(both spellings) ·check:pm-governed-merges·check:skill-frame-sync·@objectstack/lint check:doc-formula-expressions· and thespec set
check:empty-state·check:liveness·check:strictness-ledger·check:variant-docs·check:skill-examples.Verdict lines, as the gates printed them:
check:doc-formula-expressionsneeds@objectstack/formulabuilt on a fresh worktree —built alongside
@objectstack/specbefore the run, so noERR_MODULE_NOT_FOUND.The nine
{/* os:check */}blocks these pages add were confirmed extracted from thegate's own log rather than assumed — five in
reports.mdx, three intheming.mdx, one indoc-pages.mdx:No changeset
Docs-site content plus one generated scope line; this PR publishes no package. Labelled
skip-changeset, matching sibling #10281.Out-of-scope findings, filed not fixed
Listed in the report comment on #10237.
Generated by Claude Code