Repository navigation
docs(spec): the lookup picker reads its seven keys camelCase-only (docblock + six liveness notes) - #23894
Conversation
…e-alias claims (docblock + three liveness notes) Claude-Session: https://claude.ai/code/session_011kWYXHPKzsrE8KEgBk1bRD Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 11 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 — 142 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 ee284a95ecf9d2984a54aa23c85d8f7a2a394d01 && git checkout ee284a95ecf9d2984a54aa23c85d8f7a2a394d01
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 570f01d270a37aeadfe078a6892797428151a7a8 7aabf18aa591b6f04afbd9a88c629eea51380f93 && git checkout -B drift-repro 570f01d270a37aeadfe078a6892797428151a7a8 && git merge --no-ff 7aabf18aa591b6f04afbd9a88c629eea51380f93
node scripts/docs-audit/affected-docs.mjs --json 570f01d270a37aeadfe078a6892797428151a7a8
|
…s notes read camelCase-only at the pin and name the non-picker snake legs Claude-Session: https://claude.ai/code/session_011kWYXHPKzsrE8KEgBk1bRD Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs: card #23012's body and all six comments (triage ① Derived judgmentsNo accept-set or key move — confirmed. The net diff is three files: the docblock above Every sentence, checked at objectui
Every sentence the docblock and the six notes now carry is true at the pin. ② Semver level
③ Boundary flagsDev report
Dev report
Implemented-by: VERDICT: PASS |
席位核对 · ACCEPT · PR #23894 @
|
Fixes #23012
Clause-②: no
What changed
Prose only. No schema,
.describe(), key or accepted value changes.packages/spec/src/data/field.zod.ts: the docblock above the lookup picker keys was headed "SNAKE_CASE TOLERANCE". It said objectui readslookupColumns,lookupPageSizeandallowCreateassnake ?? cameland called them "the three aliases that survive". It now says the picker reads all seven keys camelCase-only. It keeps the history (objectui#7155, objectui#7357) and adds objectui#12157 as the round that retired the last three. It says a stored snake spelling is folded onto the declared key when the console ingests it (normalizeSchemaReferenceKeys). It still ends by pointing to thelookupColumnsledger row.packages/spec/liveness/field.json: the six lookup picker notes (lookupColumns,lookupPageSize,allowCreate,descriptionField,lookupFilters,dependsOn) drop their "(reads X || x)" tails. Each carries the reading atobjectui @daeb77fc84andverifiedAt: 2026-10-16. Where a reader outside the picker keeps a snake leg behind the declared key, the note names it as a cited read point:resolveActionParams.ts#resolveActionParamfordescription_field/lookup_filters, andObjectFieldInspector.tsx#readLookupFilters/#readDependsOnforlookup_filters/depends_on..changeset/23012-lookup-snake-tolerance-text.md: apatchfor@objectstack/spec. Itsfiles[]ships bothsrc/**/*.zod.tsandliveness, so both edits publish.The reading, at objectui
daeb77fc84dd824e74c95b87cdede85afdb248e7(objectstack's.objectui-sha)packages/fields/src/widgets/LookupField.tsxreads each of the seven keys camelCase-only, indeclaredDisplayField,descriptionField,explicitAllowCreate,lookupColumns,lookupPageSize,lookupFiltersanddependsOn.displayFieldkeepsreference_fieldbehind it. That is objectui's own leg, not a spec key. No snake read of any of the seven is left in that file.The fold holds as the card suggested.
packages/core/src/utils/reference-keys.ts#normalizeSchemaReferenceKeysstamps an undeclared key onto theFieldSchemakey that shares its alias probe (lowercased, separators removed). It never overwrites a declared value that is already there.packages/app-shell/src/providers/MetadataProvider.tsxruns it over every storedobjectitem.Hypothesis 1 is only partly true. Two readers outside the picker still rank a snake leg behind the declared key at the pin:
packages/fields/src/resolveActionParams.ts, where a lookup action param is built:descriptionField ?? description_fieldandlookupFilters ?? lookup_filters.packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx(readLookupFilters,readDependsOn):lookupFilters ?? lookup_filtersanddependsOn ?? depends_on, as the designer's read of a stored document.So the docblock does not claim "no reader anywhere reads a snake spelling". It is scoped to the picker readers it already named (LookupField / RecordPickerDialog), where the claim holds. The surviving legs are recorded, dated, in the
lookupColumnsledger row and in the rows of the keys they read. None is a spelling this schema declares.Acceptance notes
descriptionField,lookupFiltersanddependsOnnotes were first left out of scope. They joined this PR in the seat's patch round (card comment 6215181639) and were rewritten the same way as the other three.Gates (local, at
7aabf18a; the same counts as at250724e)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 79 commands for the 3 paths. 75 exited 0. 4 exited 3 (PREREQUISITE NOT MET, not measured):check-plugin-teardown-shape.mjs --self-test(shallow clone),@objectstack/lint check:doc-formula-expressions(@objectstack/formulanot built),check:dual-build-cjs-loadsandcheck:lean-entry-closure(workspace not built).--ranwith exit codes: "79 derived famil(ies) accounted for — 75 run, 4 NOT-MEASURED".check:livenesspassed: "1030 live · 1 experimental · 1 live-elsewhere · 112 dead · 12 planned = 1156 classified".check:docspassed: "227 generated files in sync".check:api-surfacereports the surface unchanged.check:authorable-surface,check-spec-docblock-symbol-anchorsandcheck:nul-bytespassed. No generated file changed.vitest run scripts/liveness src/data/fieldin@objectstack/spec: 27 files, 886 tests passed, at both heads.pnpm --filter @objectstack/spec typecheckexited 0 at250724e.Generated by Claude Code