Skip to content

feat(spec): declare 14 registry-published ObjectForm props on the react-blocks tier - #9728

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-9392-objectform-react-blocks-parity
Aug 18, 2026
Merged

feat(spec): declare 14 registry-published ObjectForm props on the react-blocks tier#9728
os-zhuang merged 1 commit into
mainfrom
claude/issue-9392-objectform-react-blocks-parity

Conversation

@os-elon

@os-elon os-elon commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator

Fixes #9392

Implements the maintainer's mixed disposition (issue comment 5328153876, 2026-08-18, verbatim ruling quote: 「其他接受你的建议」).

What changed

Declared (14 keys) on the react-blocks ObjectForm block in packages/spec/src/ui/react-blocks.ts: modalCloseButton, contentLayout, confirmOnDiscard, customFields, readOnly, submitText, cancelText, nextText, prevText, showSubmit, showCancel, showReset, successMessage, resetOnSuccess. Descriptions are adapted from objectui's own object-form registration (packages/plugin-form/src/index.tsx, identical at the pin 82a94170c405 and at objectui origin/main). The keys are published from the block's interaction overlay, not from FormViewSchema dataProps — the same placement as the ObjectChart drillDown precedent, because FormViewSchema is also what a declarative form view parses and only the registry/react tier reads these keys. The ratchet is cleared by the declarations themselves — no blanket --update covering them.

Baselined with recorded reasons (3 keys) via check:react-declaration-parity --update against a freshly dumped manifest at the pin, exactly the ruled three: initialData (alias spelling of initialValues — aliases are not promoted into spec), mobile (internal override, not an authoring surface), navigateOnSuccess (parked pending the action-success-navigation family ruling on #9474/#9566 and objectui#5034 — the family landed 2026-08-18 in PR #9601; the reason stands as ruled and the revisit is tracked on #9392, which remains the tracking card for it). Reasons are recorded in a hand-maintained _acceptedReasons block inside packages/spec/react-declaration-parity.baseline.json (with a note that a future --update rewrite must re-add it), in the changeset, and here.

Side effects of the canonical --update run: the baseline now also snapshots the six SDUI object-* blocks (in the checker's current set since #7751, but never baselined) — all with empty registryOnly, purely additive ratchet coverage (an object-* block vanishing from the manifest is now flagged). The clean-baseline test in scripts/check-react-blocks-declaration-parity.test.ts derives that tail from the committed file so its synthetic manifest always covers every baselined block.

Regenerated: skills/objectstack-ui/contracts/react-blocks.contract.json + skills/objectstack-ui/references/react-blocks.md (gen:react-blocks). ⚠️ That makes this a governed-surface diff (skills/**) — human merge only per Prime Directive #14; never queue, arm, or flip out of draft. The generated contract cannot land separately from the index edit (check:react-blocks pins them together).

Changeset: @objectstack/spec minor (additive public author surface; not breaking, so no ADR-0087 marker required — check:adr-0087-registration green).

Premise verification (mechanism assumptions)

  • Re-ran pnpm sdui:manifest on origin/main (ed4ca59) before editing: the divergence is byte-identical to the card — ObjectForm 17 registry-only keys, nothing else new vs baseline. Premise valid.
  • One mechanism detail corrected: the ComponentRegistry.register('form', …) call at plugin-form/src/index.tsx:159 declares only 3 inputs (objectName, fields, mode). Both parity channels enumerate the object-form registration (the react block's schemaType is object-form), which is where the 17 inputs and their descriptions live. This changes nothing about the ruled disposition — the 17 keys and descriptions are exactly as quoted in the ruling.
  • Playwright note: the container ships chromium build 1194 while objectui's pinned playwright wants 1234 — resolved with the scratchpad symlink tree documented in docs/releases-maintenance.md ("If the dispatch container's Playwright browser doesn't match the revision").

Verification (all at head bb73380)

  • pnpm sdui:manifest (full wrapper, browser dump + strict ratchet): exit 0 — "no new DECLARATION divergence vs accepted baseline"; ObjectForm row now 16 declared by both, 7 spec-only, 3 registry-only (initialData, navigateOnSuccess, mobile).
  • pnpm --filter @objectstack/spec test -- --maxWorkers=2: 412 files, 10963 tests passed.
  • pnpm --filter @objectstack/spec typecheck: green.
  • pnpm --filter @objectstack/spec build && check:generated: all 13 generated artifacts up to date.
  • node scripts/pm/dispatch-gates.mjs re-derived on the actual diff: all 18 path-derived gates green (adds vs the dispatch list: check:changeset-gate-self-tests, check:objectui-changeset, check:pm-governed-merges, check:adr-0087-registration, check:changeset-no-major, check:empty-changeset), plus the 5 convention-triggered test-file gates (query-options-erasure, type-check-coverage, type-check-debt --re-measure on the built closure, engine-double-contract, where-matcher) and check:nul-bytes — all green.

Generated by Claude Code

…ct-blocks tier (#9392)

Catch-up with the registry inputs objectui#4648/#4901 published on the
object-form registration: 14 keys are declared on the react-blocks
ObjectForm overlay (descriptions adapted from objectui's registration),
and 3 are baselined with recorded reasons per the maintainer's 2026-08-18
mixed-disposition ruling — initialData (alias of initialValues), mobile
(internal override), navigateOnSuccess (parked pending the action-success-
navigation family; revisit tracked on #9392).

The parity baseline is regenerated via --update, which also snapshots the
six SDUI object-* blocks (#7751) as additive coverage; the clean-baseline
test now derives that tail from the committed file.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016D9wdJR14KKCxz1WgdAzcw
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec, touching 14 documentable anchor(s).

7 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/automation/flows.mdx (via successMessage (literal))
  • content/docs/data-modeling/drivers.mdx (via readOnly (literal))
  • content/docs/getting-started/build-with-claude-code.mdx (via successMessage (literal))
  • content/docs/plugins/adding-a-metadata-type.mdx (via readOnly (literal))
  • content/docs/protocol/objectui/actions.mdx (via successMessage (literal))
  • content/docs/protocol/objectui/record-alert.mdx (via successMessage (literal))
  • content/docs/ui/actions.mdx (via successMessage (literal))

2 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v15.mdx (via readOnly (literal))
  • content/docs/releases/v17.mdx (via readOnly (literal))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/spec/react-declaration-parity.baseline.json) — pages documenting those are invisible to this run
  • 1 name(s) were too generic to anchor anything (single lowercase words)

Coarse fallback — 115 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 9bfd54105853bef3af39685502454bb8c7ce3befpackageMentionDocs.

Which tree this was computed on

This run read content/docs from 1fb5bf32badd7588214631d64ee2896718595fe4 — the merge of head bb73380284718c89f43808d69b999fbae6d4804f into base 9bfd54105853bef3af39685502454bb8c7ce3bef, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 1fb5bf32badd7588214631d64ee2896718595fe4 && git checkout 1fb5bf32badd7588214631d64ee2896718595fe4
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 9bfd54105853bef3af39685502454bb8c7ce3bef bb73380284718c89f43808d69b999fbae6d4804f && git checkout -B drift-repro 9bfd54105853bef3af39685502454bb8c7ce3bef && git merge --no-ff bb73380284718c89f43808d69b999fbae6d4804f

node scripts/docs-audit/affected-docs.mjs --json 9bfd54105853bef3af39685502454bb8c7ce3bef

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 9bfd54105853bef3af39685502454bb8c7ce3bef → pass the list as
args.docs, on the commit named under Which tree this was computed on.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] ADR-0082 D4 ratchet: react-blocks &lt;ObjectForm&gt; gains 17 registry-only props after objectui#4648/#4901 — spec has not caught up

3 participants