Repository navigation
feat(spec): converge ComponentPropsMap['object-grid'].data onto ViewDataSchema (ui#6207 Option A); record the ui#6206-B measurement fork - #12120
Conversation
…Schema (objectui-6207 Option A)
Accept-set change on one props-map entry: data was z.array(z.unknown()),
now ViewDataSchema (provider-discriminated object). Static inline rows move
to { provider: 'value', items: [...] }. ADR-0087 semantic entry
object-grid-data-view-data-converged carries the prescription; sweep found
zero bare-array authors in first-party corpora. The element:number.filter
sibling key of the same card is deliberately untouched (measurement-first
fork; see the card report).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV
…ult-free pin family (ADR-0122) ViewDataSchema's own input/infer split rides into ObjectGridPropsSchema, so Iso839 is deleted per its comment's prescription and the Parsed alias is declared. Regenerates api-surface, export-origins and docs references. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV
…ith its receipt Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV
…mponentpropsmap-rulings # Conflicts: # packages/spec/src/type-alias-convention.pin.test.ts
…ed tree Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV
📓 Docs Drift Check3 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. What this run could not see
Coarse fallback — 126 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 c9f5227d8ad83c49bf0ffa6b8b0a56bad9f82d85 && git checkout c9f5227d8ad83c49bf0ffa6b8b0a56bad9f82d85
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 399ecad58033006635b69d645b4df1d2091c98e5 8fcbd6b3c6f546b4aceb60ac27e2677efed6c73b && git checkout -B drift-repro 399ecad58033006635b69d645b4df1d2091c98e5 && git merge --no-ff 8fcbd6b3c6f546b4aceb60ac27e2677efed6c73b
node scripts/docs-audit/affected-docs.mjs --json 399ecad58033006635b69d645b4df1d2091c98e5 |
Part of #12039 — Key 1 of 2 (
object-grid.data, ruling objectui#6207 Option A) is implemented here. Key 2 (element:number.filter, ruling objectui#6206 Option B) is deliberately not changed: its binding measurement-first precondition measured the pinned runtime refusing the array form on the element's primary read path, which per the ruling's own text is a fork back to triage — the card report on #12039 carries the fork. #12039 must therefore stay open past this merge; objectui#6207 and objectui#6206 also remain open (their unlock is the downstream exemption deletion after a released spec version reaches the objectui pin).Key 1 —
ComponentPropsMap['object-grid'].data→ViewDataSchemaRuling (objectui#6207, 2026-08-25, batch adjudication; verbatim acceptance: 「同意」): Option A — the props-map entry converges onto
ViewDataSchema(the #5090-ruled, pinned authority); the bare-array form is the deprecatedstaticDatashortcut the objectui#4648 carve-out already refuses to publish.packages/spec/src/ui/component.zod.ts:datawasz.array(z.unknown()).optional()("Static inline rows"), nowViewDataSchema.optional()(provider-discriminated:object/api/value/schema).staticDatakeeps its shape; its describe now points at the prescription instead of calling itself an alternate spelling ofdata.object-grid-data-view-data-converged(packages/spec/src/migrations/entries/semantic/18.object-grid-data-view-data-converged.ts), registry regenerated viagen:migration-registry. Changeset carries the FROM → TO and theadr-0087: registeredmarker.examples/,skills/,packages/create-objectstack/,content/docs/, and spec fixtures forobject-gridnodes — the only authors (showcasemy-work.page.ts,command-center.page.ts) authorobjectName/columns/filterand neverdata; zero bare-arraydataauthors found, so no rewrite ships and the semantic entry carries the prescription for out-of-repo authors.ViewDataSchema's ownz.input≠z.infer(measured: anEqprobe onViewDataSchemaalone answersfalse), soobject-gridleaves the type-alias pin file's default-free family exactly the way that family's comment prescribes —ObjectGridPropsParseddeclared, pinIso839deleted, pin count 835 → 834 with its receipt (post-merge count; main added Iso857/858 in feat(spec): declare the audit door and catch the delete request schema up — both meta-door casts retired #12003 while this branch was in flight).packages/spec/src/ui/component.test.ts):safeParse({ data: { provider: 'value', items: [] } })→ success (the issue's acceptance criterion — the exact value the old entry refused), a second union arm (provider: 'object') → success, and the reverse pin: bare-arraydata→ refused at thedatapath.Key 2 —
element:number.filter: the binding measurement, recordedRuling 6206-B's precondition, verbatim: "Measurement-first is binding: the upstream card must verify the adapter/runtime behaviour on array filters for this element's read path before editing — if the runtime genuinely cannot take the array form, that is a fork back to triage, not a silent flip to Option A."
Measured, at objectui pin
190fbd01(.objectui-sha) and this repo's head:packages/components/src/renderers/basic/elements.tsx@ pin): opaque pass-through —adapter.aggregate(object, { field, function, groupBy: '_all', filter });filter?: unknown.packages/data-objectstack/src/index.ts@ pin): for that params shape,aggregate()takes the analytics path and sends the filter raw:payload.where = params.filter→client.analytics.query(payload). The rule-array lowering machinery (translateFilterArray/objectFilterEntriesToAST) exists in the same file but runs only on thefind()path (convertQueryParams), whichaggregate()reaches only when the analytics capability is absent (404/501) — and deliberately not on a server rejection (AnalyticsQueryRejectedErroris thrown instead, per the file's own framework#3878 note).service-analyticssrc after building the package's dependency closure; both strategies pass through it):isFilterASTon a one-entry rule-object array (field/operator/value) →falselowerAnalyticsWhereonwhere= that rule-object array → throws "[analytics] received a 'where' array that is not a filter: …" (the [engine] driver-sql 编译 spec 未声明的「数组 where 方言」—— 与 Turso remote 的拒收分叉,需一次定调(接纳进 spec 或响亮弃用) #5158/analytics 是 #5158 拍板 C 漏掉的第五道门:where为数组(FilterArray 糖)时被normalizeAnalyticsFilterTree静默丢弃,图表画全表 #5334 refusal; the same class is pinned infilter-array-lowering.test.ts's UNLOWERABLE table)lowerAnalyticsWhereonwhere= AST tuples[['stage', '=', 'won']]→ accepted, lowers to{ stage: 'won' }examples/app-showcase/objectstack.config.tsrecords "the CLI always loads it" — so the refusing path is the default deployment's path, not an edge case.Conclusion: at the current pin the runtime genuinely cannot take the raw
ViewFilterRule[]form on this element's primary read path (an authored array filter renders the element into its error state on any analytics-capable deployment). Landing the spec declaration now would be exactly the "declaration the runtime refuses" the ruling forbids. Forked back to triage in the #12039 report, with a recommended sequencing (objectui adapter lowers rule-arrays on the aggregate path — the machinery already exists one method over — then pin bump, then the spec convergence as ruled).Verification
Union run at
8fcbd6b(this branch's final commit, after mergingorigin/main@a933ed7):pnpm --filter @objectstack/spec check:generated— gate's own line: "✓ All 14 generated artifacts are up to date" (check:test-typecheck✓ after the Iso839 departure was recorded).pnpm --filter @objectstack/spec run typecheck— green (tsc --noEmit+ scripts + test tsconfig).pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2— Test Files 425 passed (425) / Tests 11340 passed (11340).8fcbd6b:check:changeset-gate-self-tests,check:cross-package-test-inputs,@objectstack/lint check:doc-formula-expressions(self-test 50 cases; 22/9/14 clean),@objectstack/spec check:empty-state/check:liveness/check:strictness-ledger/check:variant-docs,check:merge-driver,check:published-files,check:query-options-erasure,check:slot-lookup,check:spec-parsed-alias,scripts/check-adr-0087-registration.mjs,check:nul-bytes.scripts/pm/dispatch-gates.mjsre-derived with no paths at8fcbd6b(stderr stamps the answer's repo and commit); every additionally derived family run and green: doc-anchors, doc-authoring, doc-security-posture, docs-audit-scope, docs-redirects, published-readme-links, quick-reference-counts, react-page-adapter-contract, role-word, objectui-changeset, test-source-alias, type-source-resolution, engine-double-contract, where-matcher, changeset-no-major, ci-filter-parity, doc-frontmatter, doc-route-spelling, docs-section-name, empty-changeset, plugin-teardown-shape, section-landing-index, docs-audit affected/drift-comment, release-rehearsal self-test; dev-prereqs / type-check-coverage / type-check-debt after the workspace build they demand (results in the issue report).dist/*.d.ts: bare-arraydata→ TS2322 naming the ViewData union (red); provider-objectdata→ compiles (green).pnpm lintand the full multi-package farm are CI's runs; local verification was scoped to the affected package plus every path-derived gate above (declared narrowing — CI runs the farm on this PR).H17 note:
packages/spec/src/ui/view.zod.tsis NOT touched —ViewDataSchemais imported from it incomponent.zod.tsonly.Generated by Claude Code