…nitialValues`, `initialData` and `submitBehavior`
objectui#8071 slice 10. Three keys leave `MEMBER_PIN_EXEMPTIONS` and gain real
per-block member pins; `MEMBER_PIN_EXEMPTION_CEILING` follows 31 -> 28 in the
same change.
`initialValues` / `initialData` get a new file: the two keys are chosen between
as whole objects (`schema.initialData || schema.initialValues`), so with both
authored every `initialValues` member is dropped rather than merged, and an
empty `initialData` shadows a populated `initialValues` entirely. The plausible
`{ ...initialValues, ...initialData }` spelling reds rows 3 and 4.
`submitBehavior` already had a file whose subject is the key and which drives
the real renderer, but it left two members of the read unasserted, so it was
grown before being registered: `delayMs` is pinned on the number the redirect
wait is armed with (with the same declaration minus the member as the lit
control), and `next-record` on reaching the confirmation panel rather than
`continue`'s no-op.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
Refs #8071
Clause-②: no
objectui#8071 slice 10. Three
object-formkeys leaveMEMBER_PIN_EXEMPTIONSand gain real per-block member pins.MEMBER_PIN_EXEMPTION_CEILINGfollows 31 -> 28 in the same commit, as every slice of that card owes.This batch was dispatched to convert the three "near-miss" keys the card body flags —
object-form.fields,object-grid.exportOptions,object-grid.bulkActions/bulkActionDefs— pluspage:accordion.items,page:tabs.items,record:path.stages,record:alert.action,element:button.actionas follow-on candidates.All nine have been pinned since slices 1-7. Measured on
origin/mainf73521f93by TypeScript AST walk of the constant, not by reading the card:The card body's enumerated 58-key list has been stale since PR #8737 merged on 2026-09-09, and issuecomment-5599611864 already recorded that the authoritative list is the constant, never the card's prose. It has now mis-aimed a dispatch a second time. That note is repeated inside the constant's own docblock in this PR so the next dispatcher reads it where the numbers live.
⇒ the batch was re-selected from the live table.
object-kanban(held on a stated question) andrecord:related_list.actions(a different debt) were left alone;object-formwas taken because it is the smallest of the three open multi-key blocks.What was converted, and the renderer read pinned for each
object-form.initialValuesandobject-form.initialData— NEW filepackages/plugin-form/src/__tests__/objectFormInitialMembers-8071.test.tsxRead site:
ObjectForm.tsx, the two sites that seedinitialDatastate (the inline-fields effect and the create branch offetchInitialData), both spelledsetInitialData(schema.initialData || schema.initialValues || {}).||, never a merge. With both authored, everyinitialValuesmember is dropped, including the onesinitialDatasays nothing about. Nothing declared distinguishes that from{ ...initialValues, ...initialData }, which is what "alternate spelling … read FIRST" reads like and what a per-member precedence would mean;||tests the OBJECT's truthiness, so an emptyinitialDatashadows a populatedinitialValuescompletely;Both keys are registered
type: 'object'and typedRecord<string, any>, so every object parses on both declared sides — the read site is the whole member contract.object-form.submitBehavior— EXISTING file, GROWN before it was registeredpackages/plugin-form/src/ObjectForm.submitBehavior.test.tsxThis is a genuine near miss, unlike two of the three the card named at slice 1: its whole subject is the key and it drives the real renderer. But it left two members of the read unasserted, so it was strengthened rather than credited as found.
Read site:
ObjectForm.tsx'sswitch (behavior.kind). Every member is touched once there —urlanddelayMs ?? 0onredirect,titleandmessageonthank-you(both guarded on the discriminant, so no other arm reaches them), and nothing at all oncontinueornext-record.delayMsis a MEMBER, not a constant. Collapsingbehavior.delayMs ?? 0to a bare0removes the readable pause without changing any destination, so every other row in this file and inObjectForm.submitRedirect.test.tsxstays green. Pinned on the number the wait is armed with, with the same declaration minus the member as the lit control — without it, an emptyarmedwould be indistinguishable from a spy that never sees this renderer's timers.next-recordis a declared arm that reads NO members. It shares the confirmation-panel body withthank-youby falling through, so an edit giving it its own arm or dropping it intocontinue's no-op would leave a spec-legal authored value doing something else with nothing red.Ablations — every pin shown FAILING, restore proven by blob
Each from the committed state,
trap … EXIT INT TERM, restore bygit checkout HEAD -- path(never a bare checkout), on-disk proof read before any result.schema.initialData || schema.initialValues || {}→{ ...(schema.initialValues ?? {}), ...(schema.initialData ?? {}) }(the plausible "improvement")delayMs: behavior.delayMs ?? 0→delayMs: 0delayMsrow red, 6 passedcase 'next-record'moved intocontinue's no-op arm:1105-1106next-recordrow red, 6 passedBlobs: HEAD
42b7a9b0855c5a53276af4f1d9b3842ad6a0899d; mutated30e2c464…/e50a99be…/ce8521db…; restored42b7a9b0…= the HEAD blob in all three legs,git diff HEADempty each time. Restored runs: pin A 5 passed, pin B 7 passed.||agree when only one key is authored. Not every row is presented as if it reddened.Exemption ledger — measured by AST, not by arithmetic
TypeScript AST walk (
ts.createSourceFile→VariableDeclaration→ initializer unwrapped throughas/satisfies/ parens → directPropertyAssignmentchildren):Exemptions −3, pins +3 — they move together, so the three keys were converted, not dropped. Instrument control:
nonPropertyAssignmentMembersis[]on both trees, so no spread, getter or shorthand hides inside a span the counter treats as flat.object-formis not closed:customFields,dataSource,mobileandsectionsremain — the two-bite shape slice 9 said every remaining block now has.NEWLY_JUDGED_UNPINNED_MEMBERSandrecord:related_list.actionsare untouched by this slice.Gates — exit codes captured to disk before any pipe
apps/consoleregistry-inputs-spec-parity.test.ts(the gate this card serves)pnpm --filter @object-ui/console testpnpm --filter @object-ui/plugin-form testpnpm --filter @object-ui/plugin-form type-checkpnpm --filter @object-ui/console type-checkpnpm --filter @object-ui/plugin-form lint·@object-ui/console lintcheck:*scriptscheck-governed-queue-guard.mjs --testover the four changed pathscheck:node-esm-loadexited 1 on the first run, and it is not this diff. Its own provenance leg refused 2 of 37 entries because turbo's shared cache replayed artifacts built by a different worktree (/home/user/objectui-issue-9659—@object-ui/auth,@object-ui/react-runtime), neither of which this diff touches. The script names that condition and prescribes the remedy itself; re-run with its own--force-build: exit 0, 37 of 37 gradable entries built by this tree.Typecheck coverage proven, not assumed:
tsc -p tsconfig.test.json --listFileslists bothObjectForm.submitBehavior.test.tsxandobjectFormInitialMembers-8071.test.tsx, so the greens are not the excluded-tests trap.Control bytes:
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over all four changed files — no match (andcheck:control-bytesexit 0).Changeset grade — MEASURED from a build, with both controls
Empty-frontmatter changeset. Both packages were built and their published
files[]output grepped:objectFormInitialMemberspackages/plugin-form/distSaved — next one,from initialValuespackages/plugin-form/distMEMBER_PIN_EXEMPTION_CEILING,AWAITING_A_PINapps/console/distsubmitBehavior(positive control)packages/plugin-form/distobject-form(positive control)apps/console/distTwo zeros with a lit control on the same instrument and corpus. One near-miss chased down:
registry-inputs-spec-paritymatches 1 file inapps/console/dist, and it isvendor-objectstack-*.js—@objectstack/spec's own prose naming this gate file, not a byte of this diff.Serial constraint — re-taken immediately before the first write
Enumerated over the 11 open PRs (the dispatch's table listed 3; this lane's tables have been short before). Intersection at FILE level: empty. Nothing open touches
apps/console/src/__tests__/registry-inputs-spec-parity.test.tsor anypackages/plugin-form/src/**. PR #8941 touchespackages/plugin-form/package.jsononly. Rootpackage.jsonis held by PR #9752 in the queue — this batch does not need it.Out of scope — handed back, not filed and not fixed
initialDatasilently discarding a populatedinitialValuesis pinned as the renderer's behaviour and deliberately not endorsed. Changing it is a renderer change, and Clause-② for this batch isno— so it is reported to the dispatching seat rather than filed or repaired here.🤖 Generated with Claude Code
https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
Generated by Claude Code