You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec: DatasetDimension gains an optional nullLabel (I18nLabel) naming the null bucket, so a dashboard can label system writes "System" instead of "(None)" (ruling 6358843349 on #25330) #25391
Filing gate ③, a task the maintainer set: ruling 6358843349 on #25330 (item 1, letter A, maintainer 「同意」), from the decision analysis 6357286691. Filed by domain:spec seat 1 (seat post #6017), os-tesla, session session_013odhA26dvzy7pQmevdTTvy. ⛔ Not a claim. Grade p3 inherited from #25330 (the ruling: "priority stays p3").
Why
Setup → System Overview, "Events by User": the largest bar (~740 system writes, user_id empty) is labelled "(None)". No declaration today can name a dimension's empty bucket: DatasetDimensionSchema (packages/spec/src/ui/dataset.zod.ts:139 on origin/main) is a strictObject with name / label / field / type / dateGranularity only, and the "(None)" text is objectui's global chart.nullCategory.
Governing text
Ruling 6358843349 (verbatim): "new spec key DatasetDimension.nullLabel (I18nLabel, optional; final spelling settled at spec review), the objectui consumer reads it over chart.nullCategory, and system.datasets.ts sets user_id's null label to 「System」."
Add an optional nullLabel (I18nLabel) to DatasetDimensionSchema, with a describe that says it names the bucket of rows whose dimension value is null, and that consumers fall back to their own default when it is absent. Final spelling may be settled at spec review.
Liveness ledger row, generated references, minor changeset with Clause-②: yes (widening) and Metadata-protocol: added.
DatasetDimensionSchema parses a dimension with nullLabel: 'System' (and an I18nLabel object form), still refuses unknown keys, and an absent nullLabel parses exactly as today.
Unblocks:#25330 (label half), which carries Blocked-by: this card.
Claim: PM loop round 1
Session: session_01Fd2ukZvGZZbccf6CSDPzuv (the card thread; seat session session_013odhA26dvzy7pQmevdTTvy posts this claim)
Account: os-tesla
Branch: claude/project-thread-qbbntk
Worktree: objectstack-issue-25391
Domain: domain:spec
Seat: domain:spec#1 (seat post #6017)
File surface: packages/spec/src/ui/dataset.zod.ts (+ tests, liveness ledger row, generated references, changeset) (stop on breach; explain in the report). ⛔ no objectui, ⛔ no packages/platform-objects.
Container & model: M, mode:thread, model: default tier (dispatch-gates --tier: "no path-derived mandate", floor sonnet · default opus · ceiling fable), effort: high
Clause-②: yes (widening)
Metadata-protocol: added
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: none (no in-flight lane claim names this file; #25330 waits on this card as Blocked-by: #25391)
The platform lets the card thread push only its designated thread branch, so Branch: records that branch, not claude/issue-25391-<slug>. Dispatch order: the project's shared folder, spec-seat-1/dispatch-25391.md. The seat runs a CONTRACT_REVIEW_TIER review before the queue.
{
"issue": 25391,
"status": "done",
"branch": "claude/project-thread-qbbntk",
"pr": "https://github.com/objectstack-ai/objectstack/pull/25397",
"session": "session_01Fd2ukZvGZZbccf6CSDPzuv",
"premise_still_valid": true,
"summary": "DatasetDimensionSchema (packages/spec/src/ui/dataset.zod.ts) gains optional nullLabel: I18nLabelSchema, meta title 'Null Label', describe = names the bucket of rows whose dimension value is null, display copy only, consumers fall back to their own default when absent. Liveness row dataset.dimensions.nullLabel lands planned + evidenceScope cross-repo + authorWarn + authorHint (no reader: dataset-compiler.ts#compileDataset copies only name/label/field/type/dateGranularity; objectui @0d12e953 pin and main @a14737b have no reader). One deviation from the dispatch file surface, inside packages/spec: metadata-form-zod-reconciliation.test.ts gains an omit ledger row (dataset/dimensions/nullLabel, planned-not-rendered group) because the full spec suite reds on a schema key the dataset form does not offer; offering it instead would have owed four locale catalog entries in packages/platform-objects, which the order forbids. Generated references, authorable-surface shard, liveness state-counts and a minor changeset with both declaration lines are in.",
"tests": "head b22602309: pnpm --filter @objectstack/spec test -> Test Files 711 passed (711), Tests 21633 passed | 1 todo (lock VERDICT command-exit 0). Earlier run at b3352a34 (before the ledger row) -> 1 failed: 'dataset.dimensions: accepted by the Zod but unauthorable in the form ... expected [ nullLabel ] to deeply equal []', fixed by the ledger row. pnpm --filter @objectstack/spec typecheck -> exit 0 (check:test-typecheck OK). pnpm --filter @objectstack/lint test -> 155/155 files, 7178 tests. New src/ui/dataset-dimension-null-label.test.ts 6/6 (string form, locale-map form, absent parses unchanged with no key materialized, nullLabel 42 -> invalid_union at [nullLabel], undeclared sibling -> unrecognized_keys, whole DatasetSchema parses). Probe: lintLivenessPropertiesFromLedgerDir over a dataset with dimensions[0].nullLabel 'System' -> 1 finding liveness-planned-property with the row hint; without the key -> 0. No ablation: the diff adds a key and changes no tested behaviour.",
"gates": "local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at b22602309 derived 112 families; all 112 ran, every exit 0 after one re-run of 12. First sweep: 11 answered exit 3 (PREREQUISITE NOT MET, packages/spec/dist stale after the test-file edit; check-plugin-teardown-shape --self-test could not read pinned control 621a4876 on the shallow clone) and spec check:generated answered 1 for the same stale dist; after pnpm --filter @objectstack/spec build and fetching that one commit into refs/os-dev-25391/teardown-control, all 12 re-ran exit 0. dispatch-gates --ran reconciliation -> exit 0: '112 derived famil(ies) accounted for, 112 run, 0 NOT-MEASURED'. Local-only check:dev-prereqs -> exit 0. CI on PR #25397 head b22602309 at report time: 'No other open PR may claim the same issue' success, two opt-in jobs skipped, every other check-run in_progress (Lint x8, Type Check x4, Check Changeset, Spec property liveness, Governed Surface Queue Guard, Check PR Size, claim-branch and part-of guards).",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"line_budget": "8 files, +112 / -1 (src 13, tests 62 + 11, ledger 8, changeset 14, generated 4)",
"files_changed": [
".changeset/25391-dataset-dimension-null-label.md",
"content/docs/references/ui/dataset.mdx",
"packages/spec/authorable-surface/ui.json",
"packages/spec/liveness/dataset.json",
"packages/spec/liveness/state-counts/dataset.md",
"packages/spec/src/system/metadata-form-zod-reconciliation.test.ts",
"packages/spec/src/ui/dataset-dimension-null-label.test.ts",
"packages/spec/src/ui/dataset.zod.ts"
],
"deviations": [
"file surface: packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (an existing spec test's ledger, not named in the order) gained one omit row; reason in summary",
"the harness asked for an MCP issue_write assignee and an MCP review request after pr_create; neither was made (seat rule: no MCP write tools); the assignee came with pr_create, no reviewer was requested",
"not subscribed to PR activity (os-dev: the dispatch contract outranks the platform subscribe posture)"
],
"mcp_calls": "0 — every GitHub read went through gh api (issue, comments, PR, check-runs); no MCP tool called",
"api_writes": "2 — fleet-write pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, assignees os-tesla; relay run 39917901453, read-back 5022/5022 bytes identical) and POST /repos/objectstack-ai/objectstack/issues/25391/comments (this report, scripts/pm/post-stamped.mjs). Plus git push to claude/project-thread-qbbntk (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"class: observation (not filed) · reach: n/a · evidence: a dataset response describes a dimension column as { name, type, label } and compileDataset does not copy nullLabel into the Cube, so the consumer half must choose its channel (served dataset document vs the response descriptor, the latter a service-analytics change) · carrier: #25330 (its label half) — noted in the PR's Acceptance notes",
"class: observation (not filed) · reach: n/a · evidence: translation.datasets.NAME.dimensions.DIM declares only label (packages/spec/src/system/translation.zod.ts), so a translated null label is only an inline locale map on the key today · carrier: #25330 — noted, not filed"
]
}
Activity
objectstack-fleet commentedon Oct 23, 2026
Claim: PM loop round 1
Session:
session_01Fd2ukZvGZZbccf6CSDPzuv(the card thread; seat sessionsession_013odhA26dvzy7pQmevdTTvyposts this claim)Account:
os-teslaBranch:
claude/project-thread-qbbntkWorktree:
objectstack-issue-25391Domain:
domain:specSeat:
domain:spec#1(seat post #6017)File surface:
packages/spec/src/ui/dataset.zod.ts(+ tests, liveness ledger row, generated references, changeset) (stop on breach; explain in the report). ⛔ no objectui, ⛔ nopackages/platform-objects.Container & model:
M,mode:thread,model: default tier (dispatch-gates --tier: "no path-derived mandate", floor sonnet · default opus · ceiling fable),effort: highClause-②: yes (widening)
Metadata-protocol: added
Responsibility:
n/a — not a defect cardThread-read: none
Serial constraints cleared: none (no in-flight lane claim names this file; #25330 waits on this card as
Blocked-by: #25391)The platform lets the card thread push only its designated thread branch, so
Branch:records that branch, notclaude/issue-25391-<slug>. Dispatch order: the project's shared folder,spec-seat-1/dispatch-25391.md. The seat runs aCONTRACT_REVIEW_TIERreview before the queue.Generated by Claude Code
objectstack-fleet commentedon Oct 23, 2026
os-dev-report
{ "issue": 25391, "status": "done", "branch": "claude/project-thread-qbbntk", "pr": "https://github.com/objectstack-ai/objectstack/pull/25397", "session": "session_01Fd2ukZvGZZbccf6CSDPzuv", "premise_still_valid": true, "summary": "DatasetDimensionSchema (packages/spec/src/ui/dataset.zod.ts) gains optional nullLabel: I18nLabelSchema, meta title 'Null Label', describe = names the bucket of rows whose dimension value is null, display copy only, consumers fall back to their own default when absent. Liveness row dataset.dimensions.nullLabel lands planned + evidenceScope cross-repo + authorWarn + authorHint (no reader: dataset-compiler.ts#compileDataset copies only name/label/field/type/dateGranularity; objectui @0d12e953 pin and main @a14737b have no reader). One deviation from the dispatch file surface, inside packages/spec: metadata-form-zod-reconciliation.test.ts gains an omit ledger row (dataset/dimensions/nullLabel, planned-not-rendered group) because the full spec suite reds on a schema key the dataset form does not offer; offering it instead would have owed four locale catalog entries in packages/platform-objects, which the order forbids. Generated references, authorable-surface shard, liveness state-counts and a minor changeset with both declaration lines are in.", "tests": "head b22602309: pnpm --filter @objectstack/spec test -> Test Files 711 passed (711), Tests 21633 passed | 1 todo (lock VERDICT command-exit 0). Earlier run at b3352a34 (before the ledger row) -> 1 failed: 'dataset.dimensions: accepted by the Zod but unauthorable in the form ... expected [ nullLabel ] to deeply equal []', fixed by the ledger row. pnpm --filter @objectstack/spec typecheck -> exit 0 (check:test-typecheck OK). pnpm --filter @objectstack/lint test -> 155/155 files, 7178 tests. New src/ui/dataset-dimension-null-label.test.ts 6/6 (string form, locale-map form, absent parses unchanged with no key materialized, nullLabel 42 -> invalid_union at [nullLabel], undeclared sibling -> unrecognized_keys, whole DatasetSchema parses). Probe: lintLivenessPropertiesFromLedgerDir over a dataset with dimensions[0].nullLabel 'System' -> 1 finding liveness-planned-property with the row hint; without the key -> 0. No ablation: the diff adds a key and changes no tested behaviour.", "gates": "local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at b22602309 derived 112 families; all 112 ran, every exit 0 after one re-run of 12. First sweep: 11 answered exit 3 (PREREQUISITE NOT MET, packages/spec/dist stale after the test-file edit; check-plugin-teardown-shape --self-test could not read pinned control 621a4876 on the shallow clone) and spec check:generated answered 1 for the same stale dist; after pnpm --filter @objectstack/spec build and fetching that one commit into refs/os-dev-25391/teardown-control, all 12 re-ran exit 0. dispatch-gates --ran reconciliation -> exit 0: '112 derived famil(ies) accounted for, 112 run, 0 NOT-MEASURED'. Local-only check:dev-prereqs -> exit 0. CI on PR #25397 head b22602309 at report time: 'No other open PR may claim the same issue' success, two opt-in jobs skipped, every other check-run in_progress (Lint x8, Type Check x4, Check Changeset, Spec property liveness, Governed Surface Queue Guard, Check PR Size, claim-branch and part-of guards).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "line_budget": "8 files, +112 / -1 (src 13, tests 62 + 11, ledger 8, changeset 14, generated 4)", "files_changed": [ ".changeset/25391-dataset-dimension-null-label.md", "content/docs/references/ui/dataset.mdx", "packages/spec/authorable-surface/ui.json", "packages/spec/liveness/dataset.json", "packages/spec/liveness/state-counts/dataset.md", "packages/spec/src/system/metadata-form-zod-reconciliation.test.ts", "packages/spec/src/ui/dataset-dimension-null-label.test.ts", "packages/spec/src/ui/dataset.zod.ts" ], "deviations": [ "file surface: packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (an existing spec test's ledger, not named in the order) gained one omit row; reason in summary", "the harness asked for an MCP issue_write assignee and an MCP review request after pr_create; neither was made (seat rule: no MCP write tools); the assignee came with pr_create, no reviewer was requested", "not subscribed to PR activity (os-dev: the dispatch contract outranks the platform subscribe posture)" ], "mcp_calls": "0 — every GitHub read went through gh api (issue, comments, PR, check-runs); no MCP tool called", "api_writes": "2 — fleet-write pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, assignees os-tesla; relay run 39917901453, read-back 5022/5022 bytes identical) and POST /repos/objectstack-ai/objectstack/issues/25391/comments (this report, scripts/pm/post-stamped.mjs). Plus git push to claude/project-thread-qbbntk (not REST).", "open_questions": [], "out_of_scope_findings": [ "class: observation (not filed) · reach: n/a · evidence: a dataset response describes a dimension column as { name, type, label } and compileDataset does not copy nullLabel into the Cube, so the consumer half must choose its channel (served dataset document vs the response descriptor, the latter a service-analytics change) · carrier: #25330 (its label half) — noted in the PR's Acceptance notes", "class: observation (not filed) · reach: n/a · evidence: translation.datasets.NAME.dimensions.DIM declares only label (packages/spec/src/system/translation.zod.ts), so a translated null label is only an inline locale map on the key today · carrier: #25330 — noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 23, 2026
Seat ACCEPT on PR #25397 at head
b22602309e: comment 6360392578 (contract review 6359948450 PASS). Landing through the relay, 2026-10-23T08:04Z.Generated by Claude Code