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

os-support-ai merged 1 commit into
mainfrom
claude/issue-5413-react-pages-contradictions

Conversation

@os-support-ai

@os-support-ai os-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.

# Axis Verdict What changed in the guide Source read
1 Tailwind styling settled Dropped "+ 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 primitive packages/lint/src/validate-page-source-styling.ts — rule page-source-className-tailwind, fires on kind html/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
2 record:* scope settled Kept 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 too packages/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:913 — REACT_BLOCK_NEEDS_RECORD_CONTEXT, severity error, matched by type not by tag list
3 adapter.find options settled filters: → $filter; added the load-bearing-$ note with the exact key list objectui packages/types/src/data.ts:42 — QueryParams declares only $-prefixed keys; packages/data-objectstack/src/index.ts:2976 convertQueryParams 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)
4 Block inventory settled Split 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 spellings REACT_BLOCKS in packages/spec/src/ui/react-blocks.ts is exactly ObjectForm, ListView, ObjectChart, Block; objectui packages/core/src/registry/public-blocks.ts PUBLIC_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 to ADR-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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants