Uh oh!
There was an error while loading. Please reload this page.
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 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
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