feat(spec)!: retire the object-master-detail-form detail entry sortField — the console derives the line-position field from the child object (#21589) - #21632
Conversation
…ield The console reads no authored value: the line grid stamps the field it derives from the child object. retiredKey() tombstone, D2 strip conversion, nested RETIRED_KEYS_BY_MAJOR row and D3 entry; the derived sort-field names move to one relative-import-only declaration the prescription prints. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
… and the lint pin Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
… the repo project Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
…tail-sortfield-retire
…tail-sortfield-retire
The os-regen driver kept the branch's copy of component.mdx in the merge, dropping the element:text variant row main landed; regenerated from the merged source, the page carries both rows. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
…ariant landing The element:text variant retirement landed at conversion order 59 and rationale order 68; this retirement moves to 60 and 69. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
…tail-sortfield-retire
…ntry key The detail-entry closure's replacement listed `sortField?` among the keys to write, and the record:line_items closure sent `sortField` to the detail entry; both are false once the key is a tombstone there. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 3 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 138 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 4f65d88f0b7b23d18641301a8fd5a59a62d45734 && git checkout 4f65d88f0b7b23d18641301a8fd5a59a62d45734
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 15fe567c9c74e088684944094aa686b9bd3b386c f765e8caaf8854f8677350dc153dbbbb3a856945 && git checkout -B drift-repro 15fe567c9c74e088684944094aa686b9bd3b386c && git merge --no-ff f765e8caaf8854f8677350dc153dbbbb3a856945
node scripts/docs-audit/affected-docs.mjs --json 15fe567c9c74e088684944094aa686b9bd3b386c
|
…tail-sortfield-retire
…gen step 3 hand-off) The os-regen driver kept this branch's side of content/docs/references/ui/component.mdx in the merge commit and dropped main's object-metric rows from #21622. Step 2 restored main's side; this commit regenerates the page from the merged source with gen:schema and gen:docs. Result: main's side plus this branch's one `sortField` row, and the delta against the branch side is exactly #21622's own delta on the page. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
…s order 70 #21622 (#21464 stage 4) landed on main as 3f1bc81 with its step-18 rationale fragment `ui-object-metric-aggregate-trend-typed` at order 69, the order this branch's fragment also held. Re-read on the merged tree's main side (5b5e83f) the highest STEP18_RATIONALE order is 69, so this fragment takes the next free one, 70, and now renders after #21622's. The D2 conversion keeps order 60: the highest MAJOR_18_CONVERSIONS order on main is still 59 (`elementTextVariantHeadingLevels`). Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
|
|
…tail-sortfield-retire
…gen step 3 hand-off) The os-regen driver kept this branch's side of content/docs/references/ui/component.mdx in merge commit 5f5b809 and dropped main's object-grid keyboardNavigation row (1cbe165). Step 2 restored main's side; gen:schema and gen:docs on the merged tree (HEAD the merge commit, no MERGE_HEAD) produce this page. Its delta against origin/main 15fe567 is exactly this branch's one sortField row. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
Fixes #21589
Clause-②: no (narrowing)
What this does
Retires
sortFieldfrom theobject-master-detail-formdetail entry (ComponentPropsMap['object-master-detail-form'].details[]). The console reads no authored value for it. At the.objectui-shapin89cad75d5570(and unchanged at the current pinab1879721595:MasterDetailForm.tsxandderiveMasterDetail.tsare byte-identical between the two),MasterDetailDetailConfighas nosortFieldmember (plugin-form/src/MasterDetailForm.tsx:83). The field the line grid stamps with each line's position is the onederiveDetailderives from the child object (deriveMasterDetail.ts:540), and it reaches the grid assort_field(:874). The spec still declared the key, so an authoredsortFieldwent throughos validateclean and was then dropped.This executes the direction triage confirmed (
5969870827), the one recorded on #21220's landing (5937457620) and mirrored on objectstack-ai/objectui#11396 ③: aretiredKey()tombstone, one ADR-0087 D2 conversion and one D3 entry, with no staged window because the writer census is zero. There is no objectui edit here: the objectui#11396 mirror follows once a published@objectstack/speccarries this.The retirement kit
packages/spec/src/ui/component.zod.ts). The refusal is the prescription, and the key's input type is the retired-key mark, sotscrefuses it too. The prescription opens with the fully qualified key:object-master-detail-formpropertydetails[].sortField. It ends with the houseos migrate meta --from 17sentence.INLINE_GRID_SORT_FIELDS(the same six names in the same order as the renderer'sSORT_FIELD_NAMES) moves out ofdata/inline-grid-columns.tsintodata/inline-grid-sort-fields.ts, a module reached only by relative import, likeui/action-target-aliases.ts. Exported frominline-grid-columns.ts, it would have reached the published API through thedatabarrel.inline-grid-columns.tsimports it, and the tombstone's prescription andrecord:line_items' answer print the list from it (INLINE_GRID_SORT_FIELD_LIST).check:api-surfaceis unchanged, as expected.object-master-detail-form-detail-sort-field-removed(step 18,retiredFromLoadPath,retiredAfter: '17.6.0', order 60). It is a lossless delete ofsortFieldfrom eachproperties.details[]entry of anobject-master-detail-form, scoped by component type and by position. Its fixture covers region, nested-card and slotted positions, an open-namespace control with the same shape, and an entry that is not an object.RETIRED_KEYS_BY_MAJOR[18]registers the nested keyui/ObjectMasterDetailFormProps:details.sortField(an array member, spelled without its[]). It has noauthorable-surface/line, so checks (b2) and (b3) resolve it against the emitted schema, andcheck:authorable-surfaceis green on it.object-master-detail-form-detail-sort-field-retired, plus aSTEP18_RATIONALEfragment at order 70.sortField" now says the line-position field is derived;record:line_items' guidance forsortField, which used to say the key "belongs to anobject-master-detail-formdetail entry" and now says no block takes it;content/docs/references/ui/component.mdx);FULL_DETAIL_ENTRY, now 11 keys);ui-object-master-detail-form-details-closedlistedsortField?among the keys to write, andui-record-line-items-props-closedsentsortFieldto the detail entry. Both entries shipped in 17.6.0'sregistry.ts. Step 18 is still open, so the 17 → 18 upgrade guide will be generated from these texts. Reviewer, please confirm that this correction belongs in this PR.@objectstack/specminor, with a BREAKING banner, the FROM → TO table and the ADR-0087registereddisposition.Premise checks (measured on origin/main 9a4182a, objectui at the pin 89cad75d5570)
component.zod.ts:5566, the docblock at:5539and therecord:line_itemsguidance at:2201–:2202, as the claim said.MasterDetailForm.tsx:83says "⛔ NosortFieldmember". The onlysortFieldon that path is the derived one (:372,:874,:1066,:1081;deriveMasterDetail.ts:55and:540). A fully configured entry (FK plus every column typed) loads no child schema (:977–:979), so it stamps no line position. The prescription says this.git grep -n -w sortFieldoverexamples apps packages skills content/docs, excludingpackages/spec/**and CHANGELOGs: 1 hit, the generated reference page. Same instrument, controladdLabel: 6 hits, including the showcase project workspace's detail entry. At the objectui pin, the only detail entries that write the key are probes asserting that nothing reads it (masterDetailDetailsMembers-8071.test.tsxrows 2c and:295/:304). No objectui source assigns it through a spec type.packages/specis the producer of the declared key. No other package was involved.Evidence
All on the final head
f765e8caafunless noted. The branch mergedorigin/mainthree times: ate367002e11(which carries the sibling element:text landing36ad3210d4), at5b5e83f446(which carries #21622's landing3f1bc816a2), and at15fe567c9c(which carries #21625's pin bump1cbe165bfcand #21642's15fe567c9c). Readings marked69f42d393dpredate the second merge.@objectstack/speclocal project atf765e8caaf: 609 files and 18059 tests passed (1 todo), with no skip.@objectstack/specrepo project atf765e8caaf: the three merge-shape and retirement files (step18-rationale-merge,conversions-major18-mergeandmaster-detail-detail-sort-field-retirement) passed 41 tests. The wider repo-project run is a69f42d393dreading: 52 of 53 files passed. NOT MEASURED:scripts/build-schemas-check-mode.test.ts, which alone exceeds the 590 s foreground cap.check:authorable-surface, the gate whose mode it tests, is green atf765e8caaf.pnpm --filter @objectstack/spec typecheck: exit 0, includingcheck:test-typecheck. The new pin's@ts-expect-erroris compiled there, so an unused directive would be red.object-master-detail-formdetails[]entry:@objectstack/lintatf765e8caaf:validate-component-props.test.tspassed 51 tests (including the new advisory pin). At69f42d393d, all 119 files and 5621 tests passed, and its typecheck passed;@objectstack/example-showcaseat69f42d393d: its typecheck passed, and 32 files and 399 tests passed.pnpm --filter @objectstack/spec check:generated: all 15 artifacts are up to date.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 114 commands atf765e8caaf(the same set as ata1b0552acd), and all 114 exited 0 on the first attempt after a full build.--ranreconciled them as 114 derived, 114 run, 0 NOT-MEASURED, 0 UNRUN. Ata1b0552acd, the round report that first quoted the same reading had stale provenance; the seat's note5974199078on the card corrects it.pnpm lint:eslint.config.mjslints**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}minusNEVER_LINTED.--no-inline-config --format jsonover the 12 changed lintable files at the final headf765e8caafreported 12 files, 0 errors and 0 warnings (no ignored-file warnings, so all 12 are in the population). An earlier run, before the two D3 entry text edits, read 10 files with the same result.parserOptions.projectand noprojectService), and the diff touches neither the config nor its baselines, so no verdict on an untouched file can move.scripts/ablation-replace.mjs, wrapped in a trap. Each restore is proven by blob == HEAD and an emptygit diff HEAD.z.string().optional(): 5 of the pin's tombstone rows went red (refusal, list, props-lint row, tombstone-not-strict-arm, tsc channel), and 15 stayed green.sortField: 'position'planted on the showcase workspace's detail entry: the tree-scoped absence walk went red, namingexamples/app-showcase/src/ui/pages/project-workspace.page.ts authors sortField: 'position'.New pins
packages/spec/src/ui/master-detail-detail-sort-field-retirement.test.ts, in the repo project because it walks the tree. It covers:codeinvalid_type, pathdetails.0.sortField, the prescription, and the derived names drawn from the one declaration;record:line_items' answer;@objectstack/specalready declares.check:cross-package-test-inputsis green, and the test is listed invitest.repo-tests.json.packages/lint/src/validate-component-props.test.ts: a detail-entrysortFieldis acomponent-props-invalidwarning atproperties.details.1.sortField, carrying the prescription.Acceptance notes
replacementspells out the six derived names literally. The generator copies entry values intoregistry.tsand keeps no imports, so it cannot read the declaration. The pin asserts that every member ofINLINE_GRID_SORT_FIELDSappears in it.36ad3210d4) landed first at conversion order 59 and rationale order 68. feat(spec)!: object-metric aggregate and trend take the shape the tile reads; drillDown, compareTo held for a ruling (#21464, stage 4) #21622 (3f1bc816a2) landed next with rationale order 69. This PR takes 60 and 70. All three merges went throughscripts/pm/os-regen-merge.sh. Each time, the os-regen driver kept this branch's copy ofcomponent.mdxand dropped main's rows: the variant row, then feat(spec)!: object-metric aggregate and trend take the shape the tile reads; drillDown, compareTo held for a ruling (#21464, stage 4) #21622'sobject-metricrows, then chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) #21625'sobject-gridkeyboardNavigationrow. Each time, the page was regenerated from the merged source in its own commit (the last isf765e8caaf). Measured by comparing change lines, the head's delta againstmainis this PR's own delta ata1b0552acd, file by file; and the head's delta againsta1b0552acdismain's own delta. chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) #21625 did not touch the detail entry or its docblock.f765e8caaf: complete and green, 33 success and 2 skipped (Console Pin Gateand the opt-in packed-tarball smoke, by their own filters).Lint & Repo Gates, red ata1b0552acdonly because GitHub's issues API answered HTTP 503 incheck-issue-citations, is success on this head.