Skip to content

types/plugin-form: objectstack now judges an object-master-detail-form details entry as a strict shape — the parity row and mirror follow at the next spec bump; the spec's sortField follows #11376 at the next pin bump #11396

Description

@objectstack-fleet

Filing gate: ④ a coordination child, filed by the objectstack domain:spec seat 1 (session_01UtnxvdiN376GF3sgXwAw4d, seat post objectstack-ai/objectstack#6017) for objectstack-ai/objectstack#20928, whose triage direction says "the MasterDetailForm mirror follows at the pin bump. This claim files that coordination child". The precedent is objectui#11266 for objectstack-ai/objectstack#20901. ⛔ Not a claim. Reader: objectui triage first, then the domain:ui seat; the spec half (below) is read by whoever bumps objectstack's .objectui-sha.

What changed upstream

objectstack PR objectstack-ai/objectstack#21215 landed as a29a0ea555 (@objectstack/spec minor, Clause-②: yes (narrowing), ADR-0087 D3 entry ui-object-master-detail-form-details-closed). It ships in the next @objectstack/spec release; at filing no published version carries it.

  • ComponentPropsMap['object-master-detail-form'].details changed from z.array(z.unknown()) to an array of strict entries with twelve keys: childObject (required), relationshipField, columns, formFields, inlineMode, amountField, sortField, totalField, title, minRows, maxRows, addLabel. Those are the members of MasterDetailDetailConfig at the pin 31971ff1e28f.
  • details[].columns references InlineGridColumnSchema by identity, the same column subforms[].columns and inlineColumns take. defineStack's cross-reference check reaches the block on any page.
  • A new type ObjectMasterDetailFormPropsParsed is exported, because input and output now differ.

Sites here (objectui origin/main d59f11c0d)

  1. The console parity row. apps/console/src/__tests__/registry-inputs-spec-parity.test.ts:2912, 'object-master-detail-form.details'. Its pins prose says "The spec row is z.array(z.unknown()) … so the read site is the whole member contract". That is false once the spec bump lands, so the row is rewritten against the strict entry.
  2. The types mirror. packages/types imports ObjectMasterDetailFormPropsSchema by reference (src/__tests__/imported-defaults-8317.test.ts:87, src/__tests__/registered-type-arms-10859-b2.test.ts:45). The objectstack dev and review read the non-test importer path as taking the schema through stripImportedDefaults. Whether objectui's suites stay green against the new spec is NOT MEASURED, so run them at the bump.
  3. sortField, the other direction. objectui main retired MasterDetailDetailConfig.sortField at 0a3e5409f (feat(types,plugin-form)!: the grid's sort_field is declared, and a detail's sort field is derived only (objectui#11070 round 9) #11376, spec(types): 32 keys the renderers read are refused by the strict authoring face — declare each or rule it runtime-only, the ruled precondition before objectui validate goes strict (objectui#5250) #11070 round 9), after the pin 31971ff1e28f objectstack measured against. So objectstack's new entry DECLARES sortField, which objectui main no longer reads. The objectstack pin bump that crosses 0a3e5409f owes the spec half in the same landing: retire sortField from the detail entry (a tombstone naming the derived sort, plus an ADR-0087 entry), or the spec accepts a key nothing reads. feat(types,plugin-form)!: the grid's sort_field is declared, and a detail's sort field is derived only (objectui#11070 round 9) #11376's own census counted objectstack sortField writers as 0, before feat(spec)!: an object-master-detail-form block's detail entries are a strict shape whose columns are the inline grid column contract (#20928) objectstack#21215 added the declaration.

Direction (for triage, not a ruling)

At the next @objectstack/spec bump that carries a29a0ea555, objectui's mirror and the parity row follow the strict entry (reference the spec's shape rather than restating it). At the next objectstack pin bump past 0a3e5409f, objectstack retires sortField from the entry. That half is objectstack's and is recorded on objectstack's seat post #6017.

Dedupe

All 70 open objectui issues, listed over REST (open_issues_count 72 = 70 issues + 2 open PRs, so the enumeration is complete) and grepped locally: object-master-detail-form together with details: 0 hits; MasterDetailDetailConfig: 0 hits. Control: subforms answers 3 hits in the same corpus, #11266 (the subforms[].columns sibling, a different carrier) among them.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepm:on-holdpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions