Skip to content

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

Closed

Description

@objectstack-fleet

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

Ask (this card: the spec half only)

Acceptance

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.

Dedupe: git grep -n -iE 'nullLabel|null bucket|nullCategory' origin/main -- packages/spec/src → 0 hits; open issues searched for "DatasetDimension nullLabel null bucket label" → none. New.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  3. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:reportsBusiness reporting — dashboards, reports, the numbers a manager readsdomain:specenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions