Skip to content

docs(guide): resolve four react-pages.md contradictions toward the framework's sources - #5462

Merged
os-support-ai merged 1 commit into
mainfrom
claude/issue-5413-react-pages-contradictions
Aug 21, 2026
Merged

docs(guide): resolve four react-pages.md contradictions toward the framework's sources#5462
os-support-ai merged 1 commit into
mainfrom
claude/issue-5413-react-pages-contradictions

Conversation

@os-support-ai

@os-support-aios-support-ai commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Fixes#5413

The guide is live material — @object-ui/react-runtime's README links it twice
(README.md:19 and :127) — so each contradiction was reachable teaching.

Every claim was re-measured, not inherited. The card measured against
objectstack@502dc6fe7; that pin had moved 65 commits by the time this ran. All four
were re-measured against objectstack@f094214b3 and objectui 77f846a8b. Nothing had
been fixed upstream in the meantime, so no axis is moot — but three of the card's
citations had drifted, noted below.

Per-axis verdict

All four came out settled, each by a live shipped mechanism rather than by an ADR
whose status could be argued. Nothing goes to the decision inbox.

#AxisVerdictWhat changed in the guideSource read
1Tailwind stylingsettledDropped "+ Tailwind" from the kind table and the html-tier blurb; restyled the headline example to an inline style object; replaced the "so use Tailwind" conclusion on the layout-containers paragraph; added a Styling section giving the mechanism and the per-tier primitivepackages/lint/src/validate-page-source-styling.ts — rule page-source-className-tailwind, fires on kindhtml/react/jsx, hint names inline style + hsl(var(--token)) for react and structured props + JSON style for html. Registered in authoring-rules.ts:741 (tier: 'advisory'), exported from lint/src/index.ts:152, released in @objectstack/lint@11.5.0 (changelog ec7175d, which states it "corrects … ADR-0080/0081 away from the 'HTML + Tailwind' framing"). Backed by ADR-0065 (Accepted 2026-06-22) and ADR-0080's 2026-06-30 header amendment
2record:* scopesettledKept the tag-derivation rule (it is accurate); added the exclusion, the real os validate error text, the per-block alternatives table, and the note that the rule matches by type so Block type="record:…" is caught toopackages/spec/src/ui/react-blocks.ts — the REACT_RECORD_BLOCK_ALTERNATIVES ledger and the withdrawal rationale (#4413); packages/lint/src/validate-react-page-props.ts:913REACT_BLOCK_NEEDS_RECORD_CONTEXT, severity error, matched by type not by tag list
3adapter.find optionssettledfilters:$filter; added the load-bearing-$ note with the exact key listobjectui packages/types/src/data.ts:42QueryParams declares only $-prefixed keys; packages/data-objectstack/src/index.ts:2976convertQueryParams builds a fresh options object from $-prefixed reads only, so an unprefixed key reaches no branch. The framework's own react page uses $filter (renewals-pipeline.page.ts:67)
4Block inventorysettledSplit the single tag list into runtime scope vs authored contract, named react-blocks.md as the prop authority, and moved the flat-props example off two deprecated ObjectGrid spellingsREACT_BLOCKS in packages/spec/src/ui/react-blocks.ts is exactly ObjectForm, ListView, ObjectChart, Block; objectui packages/core/src/registry/public-blocks.tsPUBLIC_BLOCKS plus buildComponentScope (renderers/layout/react-page.tsx:66, `if (!tag

Why axis 1 is settled rather than escalated

This is the one the card framed as an ADR-amendment question, so it got the most scrutiny.
The amendment lives in ADR-0080, whose own Status line still reads "Proposed" — but the
amendment is a correction pointing back toADR-0065, which is Accepted, and it has
since been implemented and released: a dedicated lint rule ships and is wired into
os validate/os build, the generated react contract carries it, and objectstack#10286 /
PR #10436 has just carried the same correction into PageSchema's own describes. That
card's needs:contract-review label is a path-limb process gate on packages/spec/src/**,
and its reviewer graded the content limb "no" — it is not a dispute about direction.
Nothing anywhere in either tree argues the other way.

Three of the card's citations had drifted — corrected here

  • The card cites packages/lint/src/validate-responsive-styles.ts (style-classname-tailwind)
    as the Tailwind corroborator. Counter-probed: that rule never reads page source
    it walks regions[].components[] only, and the file contains no occurrence of source
    at all. The rule that actually governs the source tier is the separate
    validate-page-source-styling.ts cited above. Same conclusion, stronger and correct
    authority.
  • The card locates QueryParams at packages/types/src/data.ts in the framework repo.
    That path does not exist at objectstack@f094214b3; the file is objectui's own.
  • The card says the record:* gate applies to the four withdrawn tags. It matches by
    type prefix, so all record:* blocks are covered — including the six never in the
    contract — and Block type="record:…" with the type spelled out.

One bounded in-place fix, declared

The Live data sample had a second defect in the same call, same class (the sample
contradicts ObjectStackAdapter's real contract): it passed the result straight to
setRows and then called .map on it. find resolves to a QueryResult
({ data, total, page, pageSize, hasMore }), never a bare array — normalizeQueryResult
(data-objectstack/src/index.ts) returns that shape on every branch, and find is
declared as returning a promise of QueryResult (generic elided here — GitHub's sanitizer
eats angle brackets). As written the sample throws. Corrected to res.data alongside the
$filter fix and called out in the prose, rather than left as a silent rider. Same file,
same defect class, same gate family, no new verification surface.

Verification

All results below are on the final commit 42a1d7359, re-run after committing; exit
codes captured per gate, never through a pipe.

EXIT=0 :: check-doc-component-types.mjs :: Every documented component type is registered.
(183 doc files, 1054 code blocks, 887 `type` literals, 742 registered / 145 exempted)
EXIT=0 :: check-doc-links.mjs :: Links are valid across 13 scan roots.
EXIT=0 :: check-control-bytes.mjs :: OK (scanned 4521 tracked text files; skipped 85 binary)
EXIT=0 :: check-changeset-presence.mjs :: No source of a released package changed in this range
EXIT=0 :: check-changeset-no-major.mjs :: No changeset declares a `major` bump

Plus the standing control-byte self-scan on the changed files
(grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]') — clean.

One gate narrowed, declared not skipped.check:doc-snippets compiles every ts/tsx
fence in a covered document against built dist/*.d.ts, and react-pages.md is covered
(not in UNGATED_DOCS). Its only input from this file is one tsx fence, and that fence is
byte-identical before and after — extracted and compared programmatically, 1 fence
before, 1 after, IDENTICAL: True — with its doc-snippet: fragment marker still
immediately above it. The gate's verdict on this file therefore cannot move, and CI runs it
on a built tree regardless. No ablation was run: nothing here is a gate-can-fail claim.

No test was skipped, disabled, or quarantined. content/docs/utilities/index.md was not
touched (sibling card #5360 is in flight there); content/docs/releases/ untouched; no
force-push.

Changeset

Empty frontmatter — docs-only, so this publishes nothing, declared explicitly rather than
left undeclared (objectui does not use a skip-changeset label). check-changeset-presence
confirms none is owed.

Out-of-scope findings, filed not fixed


Generated by Claude Code

…amework's sources (#5413)
The guide is live material — `@object-ui/react-runtime`'s README links it twice —
so each contradiction was reachable teaching. All four re-measured against
objectstack@f094214b3 (the card's pin 502dc6fe7 had moved 65 commits).
1. Tailwind styling. The guide taught Tailwind `className` as the react tier's
styling primitive; ADR-0080's 2026-06-30 amendment retracted that under
ADR-0065 (Accepted). Replaced with the per-tier primitive, plus a Styling
section giving the mechanism.
2. `record:*` scope. Offered as the illustrative in-scope example while
`os validate` rejects it (react-block-needs-record-context, severity error).
Tag-derivation rule kept; exclusion, real error text and alternatives added.
3. `adapter.find` options. `filters:` is not a QueryParams key — corrected to
`$filter`. The same sample also treated the result as an array; `find`
resolves to a QueryResult, so `.map` on it throws. Corrected alongside.
4. Block inventory. Runtime scope and authored contract stated as two tiers,
with the generated react-blocks.md named as the prop authority.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants

@os-support-ai@claude