Repository navigation
feat(spec): a dataset dimension may name its null bucket with nullLabel - #25397
Conversation
…ull bucket An optional I18nLabel on DatasetDimensionSchema that names the bucket of rows whose dimension value is null; consumers fall back to their own default when it is absent. Liveness row lands as planned (authorWarn), with no reader on either side yet. Claude-Session: https://claude.ai/code/session_01Fd2ukZvGZZbccf6CSDPzuv Co-Authored-By: Claude <noreply@anthropic.com>
…ounts for nullLabel Claude-Session: https://claude.ai/code/session_01Fd2ukZvGZZbccf6CSDPzuv Co-Authored-By: Claude <noreply@anthropic.com>
…planned-not-rendered Claude-Session: https://claude.ai/code/session_01Fd2ukZvGZZbccf6CSDPzuv Co-Authored-By: Claude <noreply@anthropic.com>
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. What this run could not see
Coarse fallback — 144 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 6317570d7503c463893b6dde9aee6380036b0052 && git checkout 6317570d7503c463893b6dde9aee6380036b0052
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin b22ab8d6fb3462bff05142efc6b6cc040c95f646 b22602309e10291c37b646e051f0af005cdc1470 && git checkout -B drift-repro b22ab8d6fb3462bff05142efc6b6cc040c95f646 && git merge --no-ff b22602309e10291c37b646e051f0af005cdc1470
node scripts/docs-audit/affected-docs.mjs --json b22ab8d6fb3462bff05142efc6b6cc040c95f646 |
Contract reviewServed-tier: Inputs read at 2026-10-23T07:36Z: card #25391 (body, claim ① Derived judgments
② Semver level
Clause-②: yes (widening) — matches the diff. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对 · ACCEPT ·
|
Requested by Tesla · project thread
Fixes #25391
Clause-②: yes (widening)
Metadata-protocol: added
The spec half of ruling
6358843349on #25330 (letter A, maintainer 「同意」), verbatim: "new spec keyDatasetDimension.nullLabel(I18nLabel, optional; final spelling settled at spec review), the objectui consumer reads it overchart.nullCategory, andsystem.datasets.tssetsuser_id's null label to 「System」." The consumer half and thesystem.datasets.tsproducer follow after this lands; #25330 remains open for them.What changes
DatasetDimensionSchema.nullLabel(packages/spec/src/ui/dataset.zod.ts): optional, typedI18nLabelSchema(thelabelslot's own type, so a plain string or an inline locale map),.meta({ title: 'Null Label' }). The describe says it names the bucket of rows whose value for the dimension is null, that it is display copy only (grouping is unchanged), and that consumers fall back to their own default when it is absent. No alias and no guidance entry: no sibling contract spells this slot, so there is nothing to anchor one to.dataset.dimensions.nullLabel:planned,evidenceScope: cross-repo,authorWarn: truewith anauthorHint. Measured: objectstack's dataset compiler copiesname/label/field/type/dateGranularityinto the Cube dimension and nothing else; objectui at the.objectui-shapin0d12e953and at maina14737bhas no reader (its onlynullLabelspelling is the local parameter ofchart-series.tspivotSeriesBuckets, fed fromChartSeriesOptions.nullCategoryLabel).metadata-form-zod-reconciliation.test.ts): oneomitrow fordataset/dimensions/nullLabel, in the planned-not-rendered group (page.print,page.record,field.conditionalFormatting). Offering a repeater column now would let an author set a label nothing shows. It also keepspackages/platform-objectsout of this diff: a new repeater row child would owe four locale catalog entries there.content/docs/references/ui/dataset.mdx,packages/spec/authorable-surface/ui.json(ui/DatasetDimension:nullLabel),packages/spec/liveness/state-counts/dataset.md(planned 0 to 1), viacheck:generated --fix..changeset/25391-dataset-dimension-null-label.md:@objectstack/specminor, with both declaration lines.Verification (head
b22602309)packages/spec/src/ui/dataset-dimension-null-label.test.ts, 6 cases: the string form and the locale-map form parse and keep their value; an absent key parses to the same object with nonullLabelmaterialized;nullLabel: 42is refused asinvalid_unionat['nullLabel']; an undeclared sibling key is still refused (unrecognized_keys); a wholeDatasetSchemacarrying it parses clean.pnpm --filter @objectstack/spec test: 711/711 files, 21633 passed, 1 todo. The first run (before the ledger row) failed exactly one case,dataset.dimensions: accepted by the Zod but unauthorable in the form, which the ledger row answers.pnpm --filter @objectstack/spec typecheck: exit 0.pnpm --filter @objectstack/lint test: 155/155 files, 7178 tests.lintLivenessPropertiesFromLedgerDirover a stack whose dataset dimension setsnullLabel: 'System'returns oneliveness-planned-propertyfinding carrying the row's hint; the same stack without the key returns none.node scripts/pm/dispatch-gates.mjs --commandsderived 112 families for this diff; all 112 ran and exit 0.--ranreconciliation: 112 run, 0 NOT-MEASURED, 0 UNRUN. On the first sweep 11 families answered exit 3 (a stalepackages/spec/distafter the test edit, and one pinned control commit missing from the shallow clone) andcheck:generatedanswered 1 for the same stale dist; afterpnpm --filter @objectstack/spec buildand a fetch of that one commit, all 12 re-ran and exit 0.Acceptance notes
{ name, type, label }, and the compiler does not copynullLabelinto the Cube. The objectui half can read it from the served dataset document, or the response's dimension descriptor can carry it, which would be aservice-analyticschange. The ruling does not pick one; noted here, not filed.translation.datasets.NAME.dimensions.DIMdeclares onlylabel, so a translated null label is written today as an inline locale map on the key itself. A bundle face for it would come with the consumer, if wanted.🤖 Generated with Claude Code
https://claude.ai/code/session_01Fd2ukZvGZZbccf6CSDPzuv