feat(spec): declare 14 registry-published ObjectForm props on the react-blocks tier - #9728
Conversation
…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
📓 Docs Drift CheckThis PR changes 1 package(s): 7 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 2 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 115 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # 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
|
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
ObjectFormblock inpackages/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 ownobject-formregistration (packages/plugin-form/src/index.tsx, identical at the pin82a94170c405and at objectuiorigin/main). The keys are published from the block's interaction overlay, not fromFormViewSchemadataProps— the same placement as the ObjectChartdrillDownprecedent, becauseFormViewSchemais 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--updatecovering them.Baselined with recorded reasons (3 keys) via
check:react-declaration-parity --updateagainst a freshly dumped manifest at the pin, exactly the ruled three:initialData(alias spelling ofinitialValues— 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_acceptedReasonsblock insidepackages/spec/react-declaration-parity.baseline.json(with a note that a future--updaterewrite must re-add it), in the changeset, and here.Side effects of the canonical
--updaterun: the baseline now also snapshots the six SDUIobject-*blocks (in the checker'scurrentset since #7751, but never baselined) — all with emptyregistryOnly, purely additive ratchet coverage (anobject-*block vanishing from the manifest is now flagged). The clean-baseline test inscripts/check-react-blocks-declaration-parity.test.tsderives that tail from the committed file so its synthetic manifest always covers every baselined block.Regenerated:⚠️ That makes this a governed-surface diff (
skills/objectstack-ui/contracts/react-blocks.contract.json+skills/objectstack-ui/references/react-blocks.md(gen:react-blocks).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-blockspins them together).Changeset:
@objectstack/specminor (additive public author surface; not breaking, so no ADR-0087 marker required —check:adr-0087-registrationgreen).Premise verification (mechanism assumptions)
pnpm sdui:manifestonorigin/main(ed4ca59) before editing: the divergence is byte-identical to the card — ObjectForm 17 registry-only keys, nothing else new vs baseline. Premise valid.ComponentRegistry.register('form', …)call atplugin-form/src/index.tsx:159declares only 3 inputs (objectName,fields,mode). Both parity channels enumerate theobject-formregistration (the react block'sschemaTypeisobject-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.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 now16 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.mjsre-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-measureon the built closure,engine-double-contract,where-matcher) andcheck:nul-bytes— all green.Generated by Claude Code