Skip to content

docs(plugin-form): object-master-detail-form's fields description says it bounds what is drawn; Save also writes seeded initialValues (objectui#11114) - #11149

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-11114-master-detail-fields-text
Sep 29, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-11114-master-detail-fields-text

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #11114

Clause-②: no

The object-master-detail-form registration called its fields input "the submitted set". Save writes more than that: a parent value seeded through initialValues (or initialData) that fields does not list is written too. The triage ruling on the card (comment 5893817922) keeps the behaviour and corrects the text, so that is what this PR does. ⛔ No behaviour changes; the parent leg is not filtered to fields.

What changed

  • packages/plugin-form/src/index.tsx: the fields input's description. Only the clause "this key is also the parent pool for values, create defaults and the submitted set" is replaced; the rest of the sentence is byte-identical. It now says fields bounds what the form DRAWS and edits, and that on a create the submitted set is the drawn fields plus any parent value seeded through initialValues (or its alternate spelling initialData), drawn or not. It adds one qualifier the probes below measured: a seed for an undeclared, server-owned, computed or read-only field is still stripped, as on any save.
  • packages/plugin-form/src/__tests__/topLevelFieldsWarnCoverage-8847.test.tsx: the pin 「the key bounds what is DRAWN, not what the parent leg WRITES」 keeps its direction, its title and its assertion. Its header bullet and the inline comment above the assertion now cite the ruled behaviour instead of describing it as "handed back".
  • packages/plugin-form/src/ObjectForm.tsx: comment only, see the surface note below.
  • .changeset/11114-master-detail-fields-text.md: @object-ui/plugin-form patch.

Measured at 385ebc5c6 (the dispatch's mechanism assumptions)

  1. Premise holds: the clause and the pin were both present as the card says.
  2. Real MasterDetailForm mounted in create mode, fields: ['status'], the create Save clicked, the batch's parent leg read from dataSource.batchTransaction (throwaway probe file, deleted; not committed):
    • initialValues: { status, note } gives a parent leg carrying note, which is not drawn. Same with initialData as the seed.
    • A seed for a key the object does not declare is dropped. Seeds for a readonly field, a formula field and owner_id are dropped.
    • details[].totalField writes its rollup onto the parent whatever fields lists (total: 0 in the probe).
    • An object field memo with a static defaultValue that fields does not list, and that nobody seeded, is written (memo: 'object-default'). This is the dispatch's "different defect" question; it is reported on the card, not changed or described here.
  3. Published: object-master-detail-form is in the public block tier, and manifestFromConfigs copies each input's description verbatim. A throwaway probe over the real registry read the plugin-form manifest entry after this change: the new sentence present, the old clause absent, and an unchanged phrase of the same description ("the two INTERSECT") present as the positive control. No generated file in this repo carries the text (git grep for the description's opening words finds index.tsx only), so nothing here is regenerated. The pinned sdui.manifest.json copy that objectstack holds follows at its own sync.

Surface note

The claimed file surface was index.tsx, the 8847 pin and a changeset. One file is beyond it: the comment in ObjectForm.tsx beside the sections/fields intersection said fields is "the parent field pool for values, create defaults and the submitted set". That is the same false claim in the implementation, and the description's own wording derives from it. It is corrected in place under the bounded exemption, with all four conditions checked: same defect class; a mechanical comment rewording; no open PR touches ObjectForm.tsx (the open PR list's file sets were read); no gate family beyond this PR's. The surface is supplemented here rather than in a new claim.

Not touched (Acceptance notes)

  • apps/console/src/__tests__/registry-inputs-spec-parity.test.ts: the ledger row pins: for object-master-detail-form.fields still says "the registration calls this key the parent pool for 'the submitted set'", which is now stale, and so does the historical slice-18 docblock. Left alone because open PR objectui#11086 holds that file. Both belong to whoever next edits it.
  • sectionEntryOverrides-10475.test.tsx quotes the earlier card wording "values, create defaults and the submitted set stay pool-driven" inside a quotation; not edited.
  • Pending changeset 8738-object-form-fields-description.md names ObjectForm.tsx (flagged by check-changeset-claims, report-only); read, still true.
  • The initialValues input's own description ("Values to prefill on the PARENT record in create mode.") is unchanged; the fields description now carries the fact.

Verification

  • pnpm exec vitest run on the 8847 pin plus the three sibling master-detail member files: 4 files, 29 tests passed.
  • pnpm exec vitest run on the console's registry consumers (registry-inputs-spec-parity, masterDetailFormTypeManifest, masterDetailFormI18nLabelManifest, public-contract, public-block-binding-reach): 5 files, 257 tests passed.
  • pnpm --filter @object-ui/plugin-form type-check after pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-form^...' build (the dependency closure): exit 0.
  • pnpm exec eslint --no-inline-config on the three changed source files: 3 files linted, 0 errors, 86 warnings, none on a changed line.
  • check-changeset-presence, check-control-bytes, check:new-line-citations, changeset:check: exit 0 each, re-run at 813b8826f for the first three.
  • No reverse verification or ablation: the change is text only and no behaviour moved, so there is nothing that could turn red.

Generated by Claude Code

…s it bounds what is drawn; Save also writes seeded initialValues (objectui#11114)

The registration called `fields` "the submitted set", but Save's parent leg
also writes a parent value seeded through `initialValues` / `initialData`
that `fields` does not list. The triage ruling keeps that behaviour (it is
how a hidden parent key reaches a record) and corrects the text: `fields`
bounds what the form draws and edits, and on a create the submitted set is
the drawn fields plus any seeded value.

- index.tsx: the `fields` input's description says so, and that a seed for an
  undeclared, server-owned, computed or read-only field is still stripped.
- topLevelFieldsWarnCoverage-8847: the pin keeps its direction and assertion;
  its header bullet and inline comment now cite the ruled behaviour instead of
  calling it handed back.
- ObjectForm.tsx: the comment beside the sections/fields intersection made the
  same claim about the pool; comment only.
- changeset for @object-ui/plugin-form (patch).

Claude-Session: https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 1 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/8738-object-form-fields-description.md

  • names ObjectForm.tsx → packages/plugin-form/src/ObjectForm.tsx — edited by this change

    The registration declared { name: 'fields', type: 'array' } with no description, so an author had nowhere to read that this key's members are bare field names — a different vocabulary from sections[].fields, which also accepts the spec FormFieldSchema object (identity key field, e.g. { field: 'note', colSpan: 2 }). Moving one of those objects to the top-level fields resolves to no name and is skipped by SimpleObjectForm (ObjectForm.tsx) and by buildFlatFields (flatFields.ts, shared by the drawer/modal presentations). Behaviour is unchanged by this entry; it only adds the description text an author would need to avoid the drop before writing it.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with f75e1f7e0 (merge-base with origin/main): 3 file(s) changed outside .changeset/, read against 1771 pending declaration(s) that publish a body (2377 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3113.6 KB 3149.4 KB
Main entry chunk (gzip) 149.5 KB 350 KB
Entry file index-C_cUQCw8.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.88KB 6.25KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.17KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 559.68KB 134.21KB
core (index.js) 9.94KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 227.99KB 63.22KB
fields (index.js) 261.28KB 66.40KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.35KB 9.18KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.32KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.58KB 4.90KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.25KB 2.17KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 52.17KB 15.06KB
plugin-charts (index.js) 84.09KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 138.73KB 37.05KB
plugin-designer (index.js) 215.78KB 44.42KB
plugin-detail (index.js) 234.55KB 62.25KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 171.40KB 43.85KB
plugin-gantt (index.js) 171.88KB 42.61KB
plugin-grid (index.js) 229.83KB 63.15KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 115.82KB 28.67KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 32.26KB 9.43KB
plugin-tree (index.js) 11.21KB 3.89KB
plugin-view (index.js) 90.43KB 22.76KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.55KB 39.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.17KB 2.73KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 22.61KB 7.40KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 3.83KB 1.49KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 3.19KB 1.62KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.30KB 6.99KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 813b8826fcf24fe425c522ab33a0712fd59475d3
Local-runs: none

Inputs: card objectui#11114 (body, triage 5893817922, claim 5899087766, os-dev-report 5899423413), PR objectui#11149 (body, 4-file list, net diff against main at f75e1f7e0), the head's check-runs read with filter=latest, and files read at the head for context (ObjectForm.tsx, MasterDetailForm.tsx, writePayload.ts, sanitize.ts, schemaDefaults.ts, initialRecord.ts, the 8847 pin, the two untouched files, plugin-form/package.json, the 10 open PRs' file lists, the head commit). Nothing built, run or re-run.

Check-runs on the head: 43 latest runs, every one on this head and every one completed at 21:47Z — 40 success, 3 skipped (Test (coverage), the coverage shard matrix, dependabot), 0 failed, 0 in progress. The 8 test shards, Lint, Type Check, Spec Main Shape Gate, Build & E2E, Build Docs and Test (dist pins) are among the successes.

① Derived judgments

  1. packages/plugin-form/src/index.tsx:482 — the object-master-detail-form.fields input's description. Measured on the diff: 535 leading and 399 trailing characters of the string are byte-identical; only the clause 「is also the parent pool for values, create defaults and the submitted set」 moved. No input name, type, enum, required, default or accepted value moves, so no accept set changes; what changes is published text (the description is copied verbatim into the public-tier manifest — objectstack's pinned sdui.manifest.json carries the old clause for this very input, which is the tier proof). Right.
    • Against the triage 5893817922: the ruling's sentence is 「fields bounds what is drawn and edited; the submitted set is the drawn fields plus any seeded initialValues」. The new text says that, direction intact, and the parent leg is not filtered (the diff touches no runtime line). Right.
    • 「on a create」 — read at source, not probed: ObjectForm.tsx seeds resolveInitialRecord(schema) only under !schema.recordId || schema.mode === 'create'; with a recordId in edit mode findOne replaces initialData and the two seed keys are never read, and dirtyEditPayload then sends only fields that differ from the record read. isCreateFormMode (mode === 'create' || !recordId) is the same test, and MasterDetailForm's isEdit = mode === 'edit' && !!recordId routes everything else to the create batch. Without the qualifier the sentence would over-claim for an edit. Accurate.
    • 「(or its alternate spelling initialData)」: parentSchema carries both keys onto the parent form; resolveInitialRecord merges them per member ({ ...initialValues, ...initialData }); the initialData input at :511 already declares itself the alternate spelling. Measured written by the dev. Accurate.
    • The strip qualifier 「undeclared, server-owned, computed or read-only … as on any save」: formWritePayload step 1 is sanitizeFormData, on BOTH routes (the host submitHandler the master-detail parent leg uses, and the form's own create / OCC update) in both modes; it drops unknown keys when a definition exists, SERVER_OWNED_FIELD_NAMES (owner_id, created_at, …) and system: true, COMPUTED_FIELD_TYPES / computed / formula, and readOnly / readonly. Each word maps to a branch; the dev measured each class dropped. Not named: the caller's field-level refusal (canEdit, a per-caller fact, not a description matter) and the create-only omitServerResolvedDefaults, which drops only an EMPTY runtime-default field and never a seeded value. Neither makes the sentence false. Accurate, not over-claiming.
    • Under-claim, named so it is not read as a miss: the sentence lists two contributors to the create parent leg. Source shows two more, both measured by the dev: finalDefaultValues = { ...schemaDefaultValues(objectSchema), ...initialData } seeds every declared STATIC defaultValue whatever fields lists, and sendBatch merges details[].totalField rollups into parentData. The sentence does not say 「only」, the triage fixed its shape and sent that class to the card, and the dev reported both there. Judged in ③ item 5; not a text defect of this PR.
  2. The 8847 pin (topLevelFieldsWarnCoverage-8847.test.tsx :54-59, :271-275). Title, fixture and assertion unchanged: mode: 'create', fields: ['status'], initialValues: { status, memo }, parent object with no static defaults, create Save, parent op data equal to { status: 'draft', memo: 'seeded' }. The header bullet and the inline comment now cite the ruled behaviour and say the row keeps the description's sentence true — which it does, in the direction the triage ordered. Not published. Right.
  3. ObjectForm.tsx:1652-1657 — comment only, outside the claim's surface. The old comment made the identical false claim in the implementation the description derives from (「the parent field pool for values, create defaults and the submitted set」 — false twice, since finalDefaultValues is built from the object schema and the seed keys, never from fields). Bounded in-place exemption, four conditions: ① same defect class — yes; ② mechanical, shape pinned — a rewording, behaviour pinned by the 8847 row; ③ no other claim holds the file — verified: none of the nine other open PRs (fix(plugin-detail): an authored record:path with a statusField and no stages derives its stages from the picklist (objectui#11106) #11147, fix(app-shell): Studio's app designer canvas shows a locale-map nav label and renames only the current locale's entry (objectui#11128) #11146, feat(cli): objectui check refuses a ${…} on a text key its node never evaluates (objectui#4795) #11126, feat(types): the object-form zod mirror declares the members its TypeScript twin declared (objectui#6152, round 1) #11125, feat(types): declare the read keys the strict authoring face refused (objectui#11070) #11115, chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086, feat(cli): objectui validate and objectui check judge through the strict authoring face (objectui#5250, slice A) #11069, feat(plugin-grid): one display page size read from the spec, and a distinct fetch batch (objectui#9853) #10278, chore: release packages #5400) lists packages/plugin-form/src/ObjectForm.tsx; ④ no new gate family — a comment adds none. Of the two debts, the PR body names the fix with evidence (Surface note); the claim's declared file surface is still to be supplemented on the card, which is the seat's write (③ item 1). Not a breach.
  4. .changeset/11114-master-detail-fields-text.md. Published CHANGELOG prose: 「text only … no runtime behaviour changes … the parent leg is deliberately not filtered」 is what the diff does; 「reaches the published sdui.manifest.json」 is true for a public-tier input. No model identifier, no tag-shaped fragment. Right. Level judged in ②.
  5. No packages/spec, content/docs/** or apps/docs/** file is touched; the initialValues input's own description is unchanged and still true.

② Semver level

  • Clause-②: no on the claim and the PR body — right. No accept set is widened or narrowed and no public surface is added; a published description string is corrected to what the runtime already does.
  • Changeset level: @object-ui/plugin-form is published (private unset, files: dist, README.md, CHANGELOG.md, LICENSE, 17.6.0) and src/index.tsx is published executable source, so a declaration is required; because the text reaches a published artefact (the manifest input description; the CHANGELOG), patch is the right form rather than the empty frontmatter, and objectui has no skip-changeset label. Changeset Declaration, Bump Policy, Fixed Group Check, Overwrite Report and Claim Re-read are all success on the head.
  • Generated artefacts carrying the text, at the head: none checked in. The head's tree holds no sdui.manifest.json / sdui-blocks.md (gen-manifest.ts and scripts/dump-public-manifest.mjs write to an output dir or a build), and content/docs/guide/component-registry.md and content/docs/plugins/plugin-form.mdx carry neither the old clause nor the description's unchanged phrase 「the two INTERSECT」. Build Docs and Bundle Analysis are success. The dev's registry probe (new sentence present, old clause absent, positive control present) is consistent with this: nothing in objectui needs regenerating. Cross-repo, objectstack's checked-in sdui.manifest.json still carries the old clause, which is correct for its .objectui-sha pin (check-sdui-manifest.mjs gates freshness against the pin; the copy regenerates at the next bump-objectui), so nothing is owed by this PR.
  • Pending changeset 8738-object-form-fields-description.md (Claim Re-read flag): its paragraph is about object-form.fields members' bare-name vocabulary and the SimpleObjectForm / buildFlatFields skip; a comment edit in ObjectForm.tsx moves none of it. Still true. Right.

③ Boundary flags

open_questions: [] — nothing to answer. Deviations and out-of-scope notes, each:

  1. Deviation — ObjectForm.tsx beyond the claim's surface. Answered in ① item 3: four conditions hold, PR body carries the fix with evidence. Escalated to the seat: the claim's declared file surface (comment 5899087766) is owed a same-round supplement naming packages/plugin-form/src/ObjectForm.tsx (comment only) — the dev cannot write it; the seat does when adopting this record.
  2. Deviation — three qualifiers beyond the ruling's literal words. Each confirmed at source in ① item 1; they keep the sentence from over-claiming. Right.
  3. Deviation — extra report keys (gates, line_budget, deviations, files_changed). Procedural, ordered by the dispatch; no contract effect. Fine.
  4. Deviation — trailer pair. The head commit ends with the model-free Claude-Session: line and the Co-authored-by: Claude trailer objectui's AGENTS.md prescribes; no model identifier in the PR title, body, changeset, comments or code. Right.
  5. Out-of-scope 1 — the card's 「different defect」 clause, answered. (a) An undrawn, unseeded parent field's STATIC object defaultValue is written by the create Save: source is schemaDefaultValues walking every declared field (create only) into finalDefaultValues. The value is the object author's own declared default — the same value the server's applyFieldDefaults stores for an omitted field (schemaDefaults.ts records that as measured on the reporting stack). Write-equivalent to the server's insert default; not a value nobody declared; the stored record is the same either way; not a defect. (b) details[].totalField rollup written onto an undrawn parent field: sendBatch merges it for every entry that declares totalField, so it is an author-declared write (the author named the receiving field). Not a defect. Both are therefore description questions only: whether the fields sentence gains a third contributor, and whether details[].totalField (registered at index.tsx:583 with no description) should say it writes the parent. Escalated: the PR reads Fixes #11114, which is right for the card's deliverable, so the seat should carry these two readings to a follow-up card or a triage reading before the card closes on merge, rather than leaving them inside a closed card. Not blocking: the triage told the seat to report, not fix, here.
  6. Out-of-scope 2 — stale prose in apps/console/src/__tests__/registry-inputs-spec-parity.test.ts. Verified: open draft PR chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 modifies that file, so exemption condition ③ fails and leaving it is right; no gate reads the prose (Test (dist pins) and the console registry-consumer files are green). The :3649-3651 docblock is history and can stay; the :2558 ledger pins: row asserts a present-tense fact (「the registration calls this key the parent pool for 'the submitted set'」) that is now false. Escalated to the seat for a carrier: a rider on chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086's landing, or a follow-up card for whoever next edits the file; the dev's 「noted not filed」 must not be the end of it.
  7. Out-of-scope 3 — sectionEntryOverrides-10475.test.tsx:32. 「values, create defaults and the submitted set stay pool-driven」 is a quotation of the objectui#10475 card's wording about the half that did not move under that card; editing a quotation would misquote it. Not published. Right to leave.
  8. Reviewer's own reads, no flag raised by the dev: the other plugin-form tests named for master-detail, 9884, 8847, 8071 and the package README carry no further copy of the old clause; the PR is a draft against main with the card on its first line; mergeable_state: behind is a rebase-free merge-queue matter, not a review finding.

Implemented-by: claude/issue-11114-master-detail-fields-text
Reviewed-by: session_011p7ikEivgXefNDaE5S5Uec

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 29, 2026 21:55
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 29, 2026
Merged via the queue into main with commit 3fa1938 Sep 29, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11114-master-detail-fields-text branch September 29, 2026 22:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants