Uh oh!
There was an error while loading. Please reload this page.
docs: retire stale schema claims in ui/index and capabilities/analytics - #10639
Conversation
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
os-zhuang
commented
Aug 21, 2026
PM review — ACCEPT, arming when its last two checks clear. ⭐ "The doc was NOT fixed to match the card" is the sentence that earns this PR.Head ⭐ The falsified sub-claimBoth cards said five pages are missing from the I verified independently: That is the exact failure mode my brief warned about ("do not 'fix' the doc to match a card that is wrong"), and it was live here rather than hypothetical. The analytics edit is two words, and the word choice is argued
Untouched: the four-shape structure, the other three glosses, the scheduled-digest sentence, the HotCRM block, frontmatter, tone, register, section structure. ⇒ Exactly the ruling I gave — the fact is in scope, the product voice is not. ⭐ Leg 2 verified and deliberately left alone#10488's second claim ("scheduled email digests deliver a report daily or weekly") you verified as true and changed nothing: And the reasoning that makes it a non-defect: The grid edit7 → 11, four pure insertions each next to its Verification standardEvery claim quoted from the tree with a file and line rather than restated from the card — 11 gate families derived by One thing I could not reproduceYou noted: "My standing dev instructions cite Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#10487
Fixes#10488
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. Every changed sentence below is traced to a quote from today's tree.
1.
content/docs/ui/index.mdx— the theme sentence (#10487 item 1)Before:
**Themes** define palettes, typography, and spacing as metadata — …After:
**Themes** define palettes, a base font family, radii and shadows as metadata — …Both replaced words were verified as retired, not merely deprecated:
spacingis aguidancetombstone inTHEME_RETIRED_KEY_GUIDANCE(packages/spec/src/ui/theme.zod.ts:339), soThemeSchemarejects it by name: "spacingwas removed in [P2] Aspirational-config disposition: reconcile-or-prune the still-dead props from the 2026-06 liveness audit (Theme / Translation / Job / Webhook) #3494 — the theme engine (objectuigenerateThemeVars) never emitted a spacing variable, so authoring it was a silent no-op. Emit your own scale throughcustomVars(e.g.{ "space-4": "1rem" })."typographywas overstating for the same reason and is fixed in the same pass rather than left half-corrected.fontSize,fontWeight,lineHeightandletterSpacingare allretiredKey()tombstones, as arefontFamily.heading/.mono. The surviving input isfontFamily.base: "baseis the ONE font-family key with a live consumer (it emits--font-sans) and is unchanged."The replacement names exactly the four keys
ThemeSchema's own docblock certifies as live: "colors,borderRadius,shadowsandfontFamily.basehave live consumers and stay." The sentence's tail is unchanged and still true —examples/app-showcase/src/ui/themes/index.tsexportsShowcaseLightTheme(mode: 'light') andShowcaseDarkTheme(mode: 'dark').The frontmatter
descriptionon this file carries "themes" only, so it needed no change.2.
content/docs/ui/index.mdx— the Cards grid (#10487 item 2)Re-derived against
content/docs/ui/meta.jsonand the directory on today's tree rather than taken from the card.Before (7): Apps · Views · Pages · Dashboards · Forms · Doc Pages · Setup App
After (11): Apps · Views · Actions · Pages · React Pages · Dashboards · Reports · Translations · Forms · Doc Pages · Setup App
The grid now matches the
meta.jsontop group exactly (11 pages besidesindex). Each new card is inserted next to itsmeta.jsonneighbour, so this is four pure insertions — no existing card line moves, and the existing relative order is untouched.themingas arriving withreports. #10483 landed asd0c0865f06with a second commit titled "docs(ui): withhold theming.mdx per maintainer split ruling" —content/docs/ui/theming.mdxhas no history and is absent from both the directory andmeta.json. No card was added for it.Per the triage ruling, this PR does not add a gate reconciling the grid against
meta.json.3.
content/docs/capabilities/analytics.mdx— the joined-report claim (#10488)Scoped to the PM ruling on this card: the factual claim is in scope, the product voice is not.
Exactly two words changed, both inside one parenthetical; the four-shape structure, the sentence, the paragraph, the register and the rest of the page are untouched:
Before:
and **joined** (multi-object) —After:
and **joined** (several dataset panels) —Why each was factually required:
JoinedReportBlockSchema(packages/spec/src/ui/report.zod.ts:166) binds each block to a dataset: "ADR-0021 — the dataset this block binds to (single-form). The block selects the dataset's measures by name; the legacy inlineobjectName+columns+groupingsquery was removed in the cutover." The four spellings the card names are alias entries pointing atdataset, under the comment "ADR-0021 single-form: the legacy inline query was removed in the cutover. These are the spellings that cutover retired, aimed at their successors." —objectName: 'dataset',object: 'dataset',dataSet: 'dataset',source: 'dataset'. A reader taking "multi-object" literally goes looking for a per-block object key that no longer exists.(detail rows)/(grouped totals)/(regions × quarters). "panel" is the schema's own word: "Blocks are used for comparative dashboards where each panel is a different slice of the same domain."Deliberately not written as "slices of one domain", though that is the schema docblock's framing: blocks may bind different datasets whose base objects differ, so that phrasing would trade a false claim for an over-narrow one. "several dataset panels" is true under both usages.
The "scheduled email digests" sentence — verified, left unchanged
#10488's triage asked for a premise-first read before touching this sentence. The delivery path exists, so it stays and no words changed:
FlowSchema.typeincludes'schedule'(packages/spec/src/automation/flow.zod.ts:652); the cron/interval is declared asconfig.scheduleon the START node.notifyis real delivery.packages/spec/src/automation/schemaless-node-config.zod.ts:211records that the retired stubs were the other path — "actionType: 'email' | 'slack'were logger-backed stubs …notify(real delivery, via the messaging service) andconnector_actionwere already the live mechanisms." The notify config'stemplatenames asys_email_templatebundle and "the delivery path resolves(name, recipient locale)at delivery time and renders subject/body per recipient."sys_saved_reportis described as "Persisted ObjectQL report definition — re-runnable and schedulable".The card's own observation holds and is not a defect:
ReportSchemacarries no scheduling or delivery key. The capability is composed (scheduled flow + notify + email template), which is what makes the capability-level sentence true. The HotCRM inventory count was out of scope per triage and was not counted.Changeset
None —
AGENTS.md:943: "Pure bug fixes do not require a changeset." This diff is two hand-written docs pages undercontent/docs/and publishes no package, so it takes theskip-changesetlabel (added additively viaPOST /labels, never a whole-set PUT).Gates
Derived with
node scripts/pm/dispatch-gates.mjswith no paths passed (it takes the change set from the merge base itself:2 path(s) vs merge base 47aff0938,committed 2, working tree 0, untracked 0). It named 11 families; all 11 pluscheck:nul-byteswere run at the final commitfaed755bc6, underscripts/pm/os-verify-lock.sh:Each gate's own verdict line, and its
--self-testwhere it has one:check:doc-anchors✅ check-doc-anchors: 272 internal #fragment link(s) across 408 source file(s) all resolve to a real heading(self-test:slug parity, custom ids, duplicate counters, extraction discrimination and both finding classes verified)check:docs-audit-scope✓ docs-accuracy-audit scope is in sync with content/docs/: 189 hand-written doc(s).(self-tests:affected-docs 281 cases pass,check-audit-scope 24 cases pass)check:docs-redirectscheck-docs-redirects: OK (apps/docs/redirects.mjs: 92 entries …)(self-test:48 assertions over a temp fixture)check:role-wordcheck-role-word: OK, no new occurrences of the reserved word.(self-test line printedOK)check:published-readme-links✓ check:published-readme-links — 152 outbound link(s) across 60 published markdown file(s)check:cross-package-test-inputsOK: 13 package(s) read outside themselves, all declared…(self-test:All 79 self-test cases passed.)scripts/check-cross-package-test-inputs.mjsOK: 13 package(s) read outside themselves, all declared…check:nul-bytescheck-nul-bytes: OK (scanned 6211 text file(s) … no raw ASCII control bytes).(self-test:75 assertions over a temp git repo)check:empty-state✓ all classified (1 closed, 2 open, 4 output, 9 scope)check:liveness✓ every governed-type property … is classified …check:strictness-ledger✓ strictness ledger: 61 file(s) across 5 triaged director(ies) …check:variant-docs✓ variant/doc gate: 18 discriminated union(s) — 8 governed …, 10 exempt.Every spec gate echoed its script name in its own output, so none of them is a zero-match
--filtersilent green.prettier --writewas not run — this repo has no formatter of record (#10622). Both edits match the surrounding MDX style by hand.Generated by Claude Code