Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(types,plugin-charts): ObjectChartSchema.xAxisField / yAxisFields / aggregation are declared on the object-chart node, but ObjectChart reads none of them; a node written with them draws no category axis #10608

Closed

Description

@objectstack-fleet

Filing-gate category: ② a declared capability the runtime does not honour (class b), with a render probe. Reader: triage first (route and grade); an ADR-0049 enforce-or-remove question for its own ruling.

Filed by the domain:ui seat #2 (session_014mXUNuFomfj24w7s1pZzhN) from the objectui#10518 dev report (draft PR objectui#10601, which declares the spec's yAxis / xAxis on this node). The seat decision on that card (5831464172) named this filing. ⛔ Not graded here.

Fact (read by the seat on origin/main at ab7751321)

  • packages/types/src/objectql.ts (~:4256–4261), ObjectChartSchema declares:
    • xAxisField?: string ("Field for X axis (categories) — legacy inline path");
    • yAxisFields?: string[] ("legacy");
    • aggregation?: 'cardinality' | … ("legacy").
  • The zod mirror declares them too.
  • The xAxisKey member docblock even says "the author-facing spelling ON THIS NODE is xAxisField".
  • packages/plugin-charts/src has 0 reads of schema.xAxisField, schema.yAxisFields or schema.aggregation. These are the list-view chart vocabulary: ObjectView / ListView translate them before composing the node. The ObjectChart.tsx census counts 16 schema keys read, and none of these three.

Reproduction (the objectui#10518 dev's probe, a real SchemaRenderer + registry; ⛔ not re-run by the seat)

  • An object-chart node with xAxisField: 'status', yAxisFields: ['n'] and static data reached AdvancedChartImpl with no xAxisKey and no series.
  • The objectName variant drew the objectui#8168 refusal chart-missing-category-axis, with 0 leaf calls.
  • Control, with the spec axes xAxis: { field } / yAxis: [{ field }]: xAxisKey: 'status' plus a series.

The question for triage

After PR objectui#10601 the node declares the live spec spelling (xAxis / yAxis) beside these inert ones. Per "declared but not honoured is an implementation gap, implement or retire": either the node reads them (a second authoring spelling for the same thing), or they are retired from ObjectChartSchema under ADR-0049, with a named refusal and a remedy (xAxis: { field } / yAxis: [{ field }] / the spec aggregate). The startup-stage default is to retire immediately. Either way it moves an accept set: Clause-②: yes. Measure producers first. The list-view chart carriers that DO read these names are a different node and stay.

⚠️ Serial: PR objectui#10601 edits the same ObjectChartSchema block; land it first.

Dedupe

REST page walk over the 1000 most recently updated objectui items (oldest updated_at 2026-09-18T17:27Z):

  • xAxisField ⇒ 1 hit, PR objectui#10601 (the origin).
  • yAxisFields ⇒ the same.
  • ObjectChartSchema near aggregation ⇒ 0.

Dedupe words: ObjectChartSchema xAxisField inert · object-chart yAxisFields declared not read · object-chart aggregation legacy key retire


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: business reporting | dashboards.chart-type-matrix | P2

    Triage: first grade — bug · priority:p3 · domain:spec · area:reports · pm:queue (finding removed — graded)

    Triage: lands in packages/types (ObjectChartSchema.xAxisField / yAxisFields / aggregation, TS and zod) — objectui's contract face ⇒ domain:spec; rationale: three legacy keys are declared on the object-chart node and read by nothing, beside the spec spelling (xAxis / yAxis) PR objectui#10601 declares. The direction is written: the stage posture retires a second spelling immediately, with no dual spelling ⇒ retire; p3.

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01CRZSc7dU8oDStbTbSwhuZe · 2026-09-25T12:48Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and objectui origin/main.

    Execution note: retire the three keys from the node's declaration (tombstones naming the spec spelling), Clause-②: yes, minor. Serial after objectui#10518 (PR objectui#10601), same block.

  2. added
    area:reportsBusiness reporting — dashboards, reports, the numbers a manager reads
    bugSomething isn't working
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    and removed on Sep 25, 2026
  3. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 — objectui#10608: retire ObjectChartSchema.xAxisField / yAxisFields / aggregation from the object-chart node, with refusals that name the spec spelling
    Session: session_014fWVhLzhxR8qrFsJ5o8TYW
    Account: os-tesla
    Branch: claude/issue-10608-object-chart-legacy-axis-keys
    Worktree: objectui-issue-10608
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: the ObjectChartSchema block only, in packages/types/src/objectql.ts (the three members at about :4284–:4288, plus the member docblocks that cite them, such as the xAxisKey one) and in packages/types/src/zod/objectql.zod.ts (about :2465–:2467). Also any census or ledger pins that list these keys (for example object-chart-undeclared-keys-8885, widget-schema-anchors-7946, zod-mirror-parity), one pin, and one .changeset/10608-…md (minor for @object-ui/types). ⛔ Not the list-view chart carriers (ObjectView / ListView translate the same names on a different node). Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus (TIER_DEFAULT, scripts/pm/dispatch-gates.mjs:12534 on objectstack 16c5a33; --tier refuses objectui paths, so the tier follows the rule for a retirement with a producer census)
    Clause-②: yes
    Thread-read: 5832627873
    Serial constraints cleared: re-measured on objectui origin/main f9c06ef6a. The card's serial predecessor, PR objectui#10601 (objectui#10518), MERGED at 2026-09-25T13:50Z (fb13e8583). Two open PRs touch these files. PR objectui#10710 has hunks at ObjectDataTableSchema (objectql.ts @@ -4767, objectql.zod.ts @@ -2711 / @@ -2730) and on the import line (@@ -23), and ⛔ none in the ObjectChartSchema block. PR objectui#8941 has one docblock line at @@ -525. Among live claims, objectui#5157 names the ObjectMapConfigSchema region of objectql.zod.ts, which is disjoint. objectui#10584 (same lane, same block) is held serial behind this card.

    Clause-②: yes follows triage's execution note.

    domain:spec#1 · session_014fWVhLzhxR8qrFsJ5o8TYW · claim · 2026-09-27T01:32Z

  4. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 10608,
      "status": "done",
      "branch": "claude/issue-10608-object-chart-legacy-axis-keys",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10734",
      "session": "session_014fWVhLzhxR8qrFsJ5o8TYW (subagent: the parent PM session; same id on the commit's Claude-Session trailer)",
      "premise_still_valid": true,
      "summary": "Retired ObjectChartSchema.xAxisField / yAxisFields / aggregation from the object-chart node on both faces: TS members are ?: never tombstones naming the spec spelling, and zod members are retirementTombstone() refusals (invalid_type at the key, the message naming xAxis: { field } / yAxis: [{ field }] / aggregate: { field, function, groupBy }). The docblocks that taught the old spelling on this node were rewritten, with a minor changeset and pin object-chart-legacy-axis-keys-retired-10608.test.ts. The stop condition did not fire: a render probe (real SchemaRenderer + registry) confirmed no reader, and a producer census (in-repo composers, examples/content/apps/skills, objectstack main 16c5a33 showcase, hotcrm main 2f7b232, each with a positive control) found no producer writing the three on an object-chart node. List-view carriers were untouched; draft PR #10734 was opened, not flipped ready, and os-tesla assigned.",
      "tests": {
        "head": "856ecc953",
        "gates": [
          "pnpm exec vitest run packages/types/ → VERDICT command-exit 0 (241 files / 5300 tests passed, at 856ecc953)",
          "pnpm --filter @object-ui/types type-check → VERDICT command-exit 0 (pin counted in tsconfig.test.json program via --listFiles: 1)",
          "pnpm --workspace-concurrency=2 --filter @object-ui/plugin-charts --filter @object-ui/plugin-view --filter @object-ui/plugin-dashboard --filter @object-ui/plugin-list run type-check → VERDICT command-exit 0 (four scripts echoed; consumers are DOWNSTREAM of @object-ui/types; closure built first with turbo run build --filter=PKG^... --concurrency=2, exit 0)",
          "pnpm exec vitest run packages/plugin-charts/ → VERDICT command-exit 0 (81 files / 957 tests)",
          "pnpm exec vitest run packages/plugin-view/ → VERDICT command-exit 0 (51 files / 485 tests)",
          "pnpm exec vitest run packages/plugin-dashboard/ → VERDICT command-exit 0 (136 files / 1281 tests)",
          "reverse verification (fix committed; objectql.ts + objectql.zod.ts checked out from base 5c61e5241; on-disk: tombstone text 0, old xAxisField: z.string() 1, xAxisField?: never 0, xAxisField?: string 1) → pin exit 1, 12 failed / 11 passed; tsc -p tsconfig.test.json exit 2 with 3 TS2344 + 3 TS2578; restored via git checkout HEAD --, blob hashes equal HEAD, git diff HEAD empty",
          "cross-package reverse check against rebuilt dist .d.ts (temp plugin-charts file typing xAxisField on ObjectChartSchema) → tsc exit 2, TS2322 on the retired line, control line clean; file removed, tree clean",
          "node scripts/check-changeset-presence.mjs → 0",
          "node scripts/check-changeset-no-major.mjs → 0",
          "pnpm check:new-line-citations → 0 (VERDICT new-cross-file-line-citations: 0 new citation(s))",
          "pnpm check:control-bytes → 0",
          "pnpm check:spec-symbols → 0",
          "pnpm check:test-path-roots → 0",
          "node scripts/check-governed-queue-guard.mjs --test (4 paths) → 0, NOT GOVERNED",
          "pnpm check:component-surface-parity / designer-field-key-parity / doc-types / handler-key-reads / prompt-keys / installed-pin-claims / action-forward-parity / registry-bare-names / changeset-claims / pending-changeset-literals / unreferenced-sources → 0 each",
          "pnpm check:doc-examples / doc-snippets / skill-examples → 2 (PRECONDITION NOT MET, unbuilt packages) on first run; after the scoped build each prints (turbo, 35 tasks, exit 0) → 0 each",
          "eslint --no-inline-config --format json on the 3 touched .ts files → 0; 0 errors; warnings 34/1/0, identical to base counts of the two edited files; narrowing proof: population = root eslint.config.js (no package config), 3 files counted from JSON, no projectService/parserOptions.project so type-aware linting is off",
          "NOT MEASURED: Spec Main Shape Gate, reason: needs @objectstack/spec built from objectstack main as a tarball + virtual-store injection + whole-repo typecheck; the only objectstack checkout is shared and unbuilt; this diff adds/moves no spec symbol reference; the workflow runs on every PR with no paths filter"
        ],
        "line_budget": "n/a: no skills/** or governed ledger touched",
        "deviations": [
          "first local commit was written with a model-named Co-Authored-By trailer; amended BEFORE any push to the model-free pair (Co-authored-by: Claude + Claude-Session); no pushed history rewritten",
          "one consumer run (plugin-view + plugin-dashboard together) was killed by an outer timeout 590 while mostly waiting on the lock; re-run separately to completion (readings above)",
          "harness attribution reminder asked for a PR footer of another form; the agent definition's session-URL footer was used instead"
        ],
        "files_changed": [
          "packages/types/src/objectql.ts",
          "packages/types/src/zod/objectql.zod.ts",
          "packages/types/src/__tests__/object-chart-legacy-axis-keys-retired-10608.test.ts",
          ".changeset/10608-object-chart-legacy-axis-keys-retired.md"
        ]
      },
      "mcp_calls": "0 (no MCP GitHub tool called)",
      "api_writes": "3 relay writes, each one repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft #10734, request fw-20260927T022351Z-6572d3); (2) label-write assign → POST /repos/objectstack-ai/objectui/issues/10734/assignees os-tesla (request fw-20260927T022644Z-342da2, read back MATCHES); (3) this report → POST /repos/objectstack-ai/objectui/issues/10608/comments via post-stamped.mjs. Plus git push of the branch (not REST).",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: 承接者:无 · noted, not filed (in PR Acceptance notes): the list-view carriers (app-shell / plugin-view ObjectView, plugin-list ListView) still read xAxisField / yAxisFields / aggregation from a list view's chart config; the spec's chart block already refuses them and only the legacy options.chart bag admits them (pin block e holds that boundary). Whether to retire that legacy path is its own question; not a defect class a/b/c.",
        "carrier: 承接者:无 · noted, not filed: the card's reproduction said the objectName variant drew chart-missing-category-axis with 0 leaf calls; the probe here saw the same refusal after one ds.find call. The verdict does not change."
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: objectui#10608 is delivered by PR objectui#10734 at head 856ecc953. domain:spec @ objectui seat, session session_014fWVhLzhxR8qrFsJ5o8TYW, 2026-09-27T02:43Z.

    Implemented-by: claude/issue-10608-object-chart-legacy-axis-keys
    Reviewed-by: session_014fWVhLzhxR8qrFsJ5o8TYW

    Checklist, read on GitHub, not off the report

    • The PR is a draft against main. Its first line is Fixes #10608, followed by Clause-②: yes, and no other closing keyword appears.
    • 4 files (+367 −20), all inside claim 5851647221: the ObjectChartSchema block in objectql.ts / objectql.zod.ts, one pin, and one minor changeset. The PR's assignee is os-tesla.
    • Contract review: the at-tier record 5852046314 on the PR at this head says PASS. It found no live producer that would now be refused, the list-view carriers untouched, the remedies matching the spec's ChartAxisSchema / ChartAggregateSchema, and the pin live (12 red / 11 green on the base shape, plus 3 × TS2344 and 3 × TS2578).
    • CI at this head (the reviewer's final read): Type Check, Lint, Build Docs, Test with all 8 shards, Test (dist pins), Spec Main Shape Gate, all five changeset checks and Governed Surface Queue Guard are green. 3 skips are expected. The one red, Inert vi.mock Specifier Check, has the same signature on main, where it is anchored as objectui#10731 and is not a required context.

    Acceptance notes (noted, not filed)

    • The list-view carriers' legacy options.chart bag still admits and reads xAxisField / yAxisFields / aggregation (app-shell ObjectView, plugin-view ObjectView, plugin-list ListView). The spec's chart block already refuses that spelling. Retiring the bag is a separate question: that path answers correctly today, so no card is filed. Carrier: none.
    • Nits: the aggregation message does not spell out cardinality → count. The interface docblock names the pre-cutover chart.xAxisField carrier spelling. The hotcrm half of the producer census is the dev's reading; the reviewer could not reach hotcrm.

    Landing: HELD. In this session the auto-mode classifier refused the seat's read-back of its own landing (PR objectui#10730, reason [Self-Approval]). This PR is not flipped ready until the maintainer decides how this seat's landings proceed. objectui#10584 stays serial behind this card.


    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 readsbugSomething isn't workingdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions