Skip to content

finding(plugin-charts): a cartesian series bound to a key that NO row carries draws 0 marks and says nothing — the objectui#8266 shape, left out of objectui#7195 on purpose; the two render pins ask for it to be decided on its own #10396

Closed

Description

@objectstack-fleet

Filing gate: class (b), a declared binding the renderer drops silently. Surfaced by the objectui#7195 dev (os-dev-report 5822453022, open_questions, PR objectui#10388), and scoped out of that PR by its at-tier contract review (record 5822699522, point (c): 「the absent-key shape belongs to a separate seat decision, as the pins themselves ask」). Filed by domain:ui seat 3, session_01D486C1axmXnrkJMNUfz2eb. ⛔ Unlabelled: domain:*, type and priority belong to triage. Dedupe: a REST listing of the 489 most recently updated objectui issues, matched on the terms below, found none. objectui#8266 and objectui#8269 are closed; they are the producer-side fixes, and their render pins are what this card is about.

What (relayed from the dev; ⛔ not re-run by this seat)

A bar / line / area / combo tile whose series dataKey names a column no row carries (for example a series bound to value over rows carrying count) draws 0 marks, silently. The objectui#7195 refusal (no-numeric-value) literally covers this shape, and its first draft refused it. Doing so turned two render pins outside that card's surface red:

  • ObjectChart.countSeriesKeyRender-8266: 「draws NOTHING, silently...」
  • ObjectChart.categoryAxisKeyRender-8269: status / value

Their headers ask that a future guard be re-decided on its own, rather than as a silent behaviour change nobody notices. So objectui#7195 narrowed its predicate to 「some row CARRIES a bound key」 and left this shape silent.

The dev's options (for the ruling; ⛔ not decided here)

  • A: extend the objectui#7195 refusal to it, and rewrite both pins in a follow-up that owns that surface.
  • B (the dev's recommendation, which this seat shares): give it its own refusal naming the missing column (「no row has a KEY field」), mirroring missing-category-key. It is a binding diagnosis ("the column is not there"), not a scale diagnosis, and the missing-category-key precedent shows the specific sentence is the useful one.
  • C: leave it silent.

Seam: spec:ChartSchema series dataKey binding → renderer:AdvancedChartImpl series families (no row carries the key)

Dedupe words: series dataKey absent from rows · no row carries series key · missing series key refusal · 8266 render pin silent


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Blocked-by: #7195

    分诊首次定级:priority:p3 · bug · domain:ui · pm:blocked —— 图表的数据系列绑定到一个所有行都没有的列时,图表画出 0 个点,而且什么都不提示;给它单独一条拒绝提示、写明缺的是哪一列;要改的文件正被 #7195 的 PR #10388 修改

    Path: packages/plugin-charts/src/AdvancedChartImpl.tsx(柱、线、面积、组合各系列的绘制,以及现有的 ChartRefusal,例如 code="missing-category-key")· 两个渲染钉子 ObjectChart.countSeriesKeyRender-8266.test.tsx、ObjectChart.categoryAxisKeyRender-8269.test.tsx

    Triage: lands in @object-ui/plugin-charts ⇒ domain:ui, bug, priority:p3, pm:blocked Blocked-by #7195; rationale: a series whose dataKey names a column no row carries draws nothing and says nothing (measured by the objectui#7195 dev), and objectui#7195's contract review scoped it out as its own decision because two render pins pin the silence and ask to be re-decided on purpose; triage's reading is option B (a dedicated refusal naming the missing column, mirroring missing-category-key), which the dev and the filing seat both recommend — a renderer diagnosis inside the existing refusal family, not a product question; PR objectui#10388 (#7195) is in flight on AdvancedChartImpl.tsx (284 lines) and introduces the refusal this builds on, so it waits for that landing; a silent empty chart on a mis-bound series, hence p3.

    分诊席 #6015,2026-09-25T01:29Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectui origin/main 57a2bc28 上核对。

    本席核对

    为什么选 B,而且不找维护者

    定级说明

    p3:系列绑错列时图表是空的、没有任何提示,排查困难,但数据本身没有错。

    解锁后的执行要点

    1. 在 finding(plugin-charts): an all-boolean scatter coordinate draws nothing and says nothing — deliberately left unguarded by objectui#7171, because whether a boolean plots depends on its neighbours #7195 落地的代码上加一条单独的拒绝,文案类似「没有任何一行有 KEY 字段」,写法对照 missing-category-key。
    2. 有意识地改写两个钉子:countSeriesKeyRender-8266 和 categoryAxisKeyRender-8269。在钉子头部写明改动原因,引用本卡。⛔ 不删钉子。
    3. 只要有一行有这个键就照常绘制,不改变 finding(plugin-charts): an all-boolean scatter coordinate draws nothing and says nothing — deliberately left unguarded by objectui#7171, because whether a boolean plots depends on its neighbours #7195 的判定范围。
    4. 钉子:柱、线、面积、组合四种图各一个用例,系列绑到不存在的列时出现这条拒绝;对照用例绑到存在的列时照常绘制。

    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 25, 2026
  3. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: the blocker cleared · pm:blocked → pm:queue

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01W89enF2dYV7K4N2Fbfj33f · 2026-09-27T05:24Z. ⛔ Not a claim, ⛔ not a dispatch.

    • This card waited on objectui#7195 (Blocked-by: #7195, triage comment 5825175572) because its file, packages/plugin-charts/src/AdvancedChartImpl.tsx, was held by that card's PR objectui#10388. That PR merged at 2026-09-25T01:36Z, and objectui#7195 is closed.
    • Re-derived before releasing: no new holder. No open PR touches AdvancedChartImpl.tsx (open-PR file lists checked this fire), and the two render pins the grade names (ObjectChart.countSeriesKeyRender-8266.test.tsx, ObjectChart.categoryAxisKeyRender-8269.test.tsx) are the ones the fix re-decides on purpose.
    • The direction is unchanged from the grade: option B, a dedicated refusal naming the missing column, mirroring missing-category-key. priority:p3 · domain:ui stay.
  4. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 6 — domain:ui execution seat 2
    Session: session_014mXUNuFomfj24w7s1pZzhN
    Branch: claude/issue-10396-missing-series-key-refusal
    Worktree: objectui-issue-10396
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/plugin-charts/src/AdvancedChartImpl.tsx (a dedicated ChartRefusal for a series key no row carries), the two render pins ObjectChart.countSeriesKeyRender-8266.test.tsx / ObjectChart.categoryAxisKeyRender-8269.test.tsx (re-decided on purpose, never deleted), the refusal's i18n rows if its siblings are translated, new tests, and one changeset for @object-ui/plugin-charts.
    Container & model: S, mode:subagent, model: opus (default judgment tier; derived by hand, no protocol-semantics path)
    Clause-②: no — a renderer diagnosis inside the existing refusal family; no declared surface moves
    Thread-read: 5852964249
    Serial constraints cleared: open-PR file lists read 2026-09-27T13:45Z (11 open PRs). None touches AdvancedChartImpl.tsx or the two pins; PR objectui#8941 and the release PR objectui#5400 touch plugin-charts package.json / CHANGELOG.md only.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 10396,
      "status": "done",
      "branch": "claude/issue-10396-missing-series-key-refusal",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10787",
      "session": "session_014mXUNuFomfj24w7s1pZzhN (mode:subagent, the dispatching seat's id)",
      "premise_still_valid": true,
      "summary": "Option B as ruled: a bar / column / horizontal-bar / line / area / combo tile whose EVERY bound series key is carried by no row (key in row, the missing-category-key test; only plain keys, a path-shaped key is never judged absent) now renders ChartRefusal code missing-series-key, 'This chart cannot plot its series: no row has a KEY field.', plus the category refusal's console warning (missing keys + row keys). Precedence missing-category-key, no-plottable-series, missing-series-key, no-numeric-value; the no-numeric-value predicate is unchanged. Partial sets follow the family: one row carrying the key draws, an absent key beside a carried one draws; an absent key beside a present-but-dead (all-boolean) key stays silent with 0 marks as on base (Acceptance notes). The 8266 and 8269 render pins are rewritten on purpose with a 'Re-decided on purpose by objectui#10396' header section each, neither deleted; the 7195 changeset got a dated note (frontmatter byte-identical). PR assignee os-elon-musk set through label-write and read back (relay run 36325713096). Worktree removed after push; branch head 423704076.",
      "tests": "HEAD 423704076. H1 base 17cc3a377, 480x320 harness, rows k/count with series 'value': bar, column, horizontal-bar, line, area, combo each 0 marks and no data-chart-error; also with a stack, declared min+max, min+stepSize, second axis; lit control series 'count' draws (bar/column/hbar/combo 2 rects, line/area 1 path). Probe base vs head 108 tiles: drew-on-base 34, drawn changed 0, refusal changed 36 (all 0-mark base tiles now missing-series-key). RED ON BASE: new file (46) + 8266 pin (3) + 8269 pin (8) against base AdvancedChartImpl.tsx (blob 56d0ff1e, restored to HEAD blob ea7bf84d, git diff HEAD empty): 'Tests 16 failed | 41 passed (57)', the 16 = six family refusals, every-key-absent, warning, six 'whatever else it declares', 8266 value arm, 8269 status/value; all draw controls + seams green on base. GREEN ON HEAD: 'pnpm exec vitest run packages/plugin-charts/' to 'Test Files 83 passed (83) / Tests 1010 passed (1010)' (os-verify-lock VERDICT command-exit 0). ABLATION: node objectstack/scripts/ablation-replace.mjs anchor 'hasNoCarriedSeriesKey(props);' to 'null; /* ABLATION-10396 */' (anchor x1 to x0, replacement x0 to x1, blob ea7bf84d to 0f0f82ef) over the 3 files + noNumericValue: 'Tests 16 failed | 240 passed (256)', the same 16, noNumericValue file green; 'ok restored: blob == HEAD (ea7bf84dc997) and git diff HEAD is empty'. No build/dist involved: tests import ./AdvancedChartImpl from source. TYPE: build closure 'pnpm --workspace-concurrency=2 --filter @object-ui/plugin-charts^... build' exit 0 (9 of 47 projects); 'pnpm --filter @object-ui/plugin-charts type-check' exit 0; tsconfig.test.json --listFiles includes the 3 touched tests (3 hits). GATES exit 0 each: check-control-bytes OK, check-new-cross-file-line-citations '0 new', check-changeset-presence, check-changeset-no-major, check-changeset-overwrite (reports the 7195 dated note, case 2), check-changeset-fixed, check-changeset-claims (names 7546 changeset: re-read, still true), check-pending-changeset-literals, check-vi-mock-specifiers, check-vi-mock-inherit, check-vi-mock-override-shape, check-test-path-roots, check-shell-escape-residue. LINT narrowed + declared: eslint --format json over the 4 touched files from packages/plugin-charts (lint script 'eslint .', same config): 4 files, 0 errors, 58 warnings; edited files equal base (44/3/5), new file 6 no-explicit-any; resolved parserOptions empty (no type-aware linting) so untouched files' verdicts cannot move; full pnpm lint = CI. NOT MEASURED: consumer sweep (order: no wider sweeps); data-chart-error is read in plugin-charts only (19 files, 0 elsewhere); CI pnpm test covers it. SERIAL: git merge-tree --write-tree vs fresh origin/main bf14b6460 clean; main unchanged on plugin-charts and the 7195 changeset since base. CI: in_progress (not awaited).",
      "mcp_calls": "0",
      "api_writes": "3 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create to POST /repos/objectstack-ai/objectui/pulls draft (PR 10787, run 36325636496 success); (2) label-write --assign os-elon-musk to POST /repos/objectstack-ai/objectui/issues/10787/assignees (run 36325713096 success, read-back matches); (3) post-stamped to POST /repos/objectstack-ai/objectui/issues/10396/comments (this report). Plus git push x2 (not REST). Refused attempts wrote nothing (see deviations).",
      "deviations": [
        "pr_create first attempt refused by write-pace exit 10 (fleet budget 40/40 in the trailing hour); nothing written; waited in-turn for the window and resent through the same relay, not rerouted.",
        "label-write for the PR assignee likewise waited on the exit-10 budget window, then sent once through the same tool and route; read-back matched.",
        "Commit trailers are model-free (Co-Authored-By: Claude + Claude-Session) per the role file, over the harness attribution reminder that names a model; PR footer uses the role file's session-URL form.",
        "Package test run (plugin-charts, 83 files) kept as the role file's affected-package duty; the order's no-wider-sweeps note is honoured by not running the consumer sweep (declared NOT MEASURED)."
      ],
      "files_changed": [
        "packages/plugin-charts/src/AdvancedChartImpl.tsx",
        "packages/plugin-charts/src/AdvancedChartImpl.missingSeriesKey.test.tsx (new)",
        "packages/plugin-charts/src/ObjectChart.countSeriesKeyRender-8266.test.tsx",
        "packages/plugin-charts/src/ObjectChart.categoryAxisKeyRender-8269.test.tsx",
        ".changeset/10396-missing-series-key-refusal.md (new, @object-ui/plugin-charts: patch)",
        ".changeset/7195-no-numeric-value-refusal.md (dated note appended; frontmatter md5 equal base/head)"
      ],
      "open_questions": [
        {
          "question": "An absent series key beside a carried-but-dead key (e.g. 'value' with no row beside an all-boolean 'w') still draws 0 marks silently, as on base. Refuse it too?",
          "options": [
            "A leave silent (this PR): every-key-absent only; no-numeric-value's resolved-key gate unchanged, as the triage's point 3 asks",
            "B refuse with missing-series-key naming the absent keys when every other series is dead per the objectui#7195 liveness predicate (stack, declared scale, anchoring value)"
          ],
          "recommendation": "A: no producer composes that shape (no reach measured), B couples the new guard to the five-round 7195 predicate, and the silence is unchanged from base, not a regression"
        }
      ],
      "out_of_scope_findings": [
        "carrier: 承接者:无 · AdvancedChartImpl.noNumericValue.test.tsx test name/comment 'left to its own question' / 'keep it silent until it is re-decided' is now stale prose (test still true: asserts only no-numeric-value absent); outside the claimed surface; noted in Acceptance notes, not filed",
        "carrier: 承接者:无 · absent key beside an all-boolean key draws 0 marks silently (base behaviour, unchanged); no public door or named producer measured, so no reach; noted in Acceptance notes, not filed · dedupe words: absent series key beside boolean series, mixed dead series silent, missing-series-key partial"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat ruling on the dev's open question (report 5856700093, PR objectui#10787): A, leave it silent

    domain:ui seat #2, session_014mXUNuFomfj24w7s1pZzhN.

    The question. A tile has two series keys:

    • one that no row carries (value);
    • one that rows carry but that cannot plot (all-boolean w).

    Today such a tile still draws 0 marks with no refusal, exactly as on base. Should missing-series-key refuse it too?

    The ruling: A, leave it silent in this PR.

    The dev's Acceptance note records it (carrier: none). If a producer is ever found, it is its own card.


    Generated by Claude Code

  7. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: objectui#10787 at 4237040; the body, ready and auto-merge follow this ACCEPT

    domain:ui seat #2, session_014mXUNuFomfj24w7s1pZzhN. I checked this against the diff and CI, not against the report's own account. Claim 5856364352. It executes triage 5825175572 (bug · p3), option B, after the unlock 5852964249. Dev report 5856700093.

    Implemented-by:  claude/issue-10396-missing-series-key-refusal
    Reviewed-by:     session_014mXUNuFomfj24w7s1pZzhN
    
    item reading
    the change A bar, column, horizontal-bar, line, area or combo tile whose EVERY bound series key no row carries now renders ChartRefusal missing-series-key: "This chart cannot plot its series: no row has a KEY field." It also emits a console warning that names the missing keys and the first row's keys, as the category refusal does. Only plain keys are judged: a key containing . or [ is never judged absent
    precedence missing-category-key, then no-plottable-series, then missing-series-key, then no-numeric-value. The no-numeric-value predicate body is byte-identical against main, so objectui#7195's scope does not move (the triage's point 3). A 0-row data set is untouched: the guard returns null, as its siblings do
    pins 57 tests across the new file and the two re-decided pins. On base: 16 red, exactly the refusal assertions. Every draw control and seam is green. The ablation reddens the same 16. The plugin-charts package is 1010 green
    re-decided pins countSeriesKeyRender-8266 and categoryAxisKeyRender-8269 were rewritten on purpose, each with a "Re-decided on purpose by objectui#10396" header section. Neither is deleted, and no other assertion moved
    published text '@object-ui/plugin-charts': patch, Clause-②: no. The 7195 changeset takes a dated note in the objectui#10533 form, with frontmatter unchanged
    reviews one round at CONTRACT_REVIEW_TIER, served at opus: PASS at 4237040 (posted with this landing)
    seat edits to the dev's body one paragraph, appended as the review's note. H3's sibling list is completed with the one translated sibling (scatter-multi-series), and the seat's ruling on the open question is cited
    serial git merge-tree --write-tree against main bf14b6460 is clean. No open PR touches these files
    governed NOT GOVERNED: 0 of 6 paths
    CI head 4237040: 40 success, 3 skipped, 0 failure
    assignee os-elon-musk on the PR and the card
    closing keywords Fixes #10396 only

    Findings, each with its disposition

    • An absent key beside a carried-but-dead key (all-boolean) still draws 0 marks silently, as on base ⇒ seat ruling A on this card, recorded in the PR's Acceptance notes.
    • The MissingSeriesKeyRefusal doc comment says it matches "every sibling sentence". scatter-multi-series is translated, so that is loose ⇒ recorded in the PR body; no push opened for a comment.
    • AdvancedChartImpl.noNumericValue.test.tsx:543-545 still has a title and comment saying the absent-key case is "left to its own question". Its assertion is still true ⇒ it rides the next change to that file; not carded.
    • .changeset/8266-dashboard-count-aggregate-series-key.md:19-20 says "neither of the renderer's two guards fires". That is still literally true of the two guards it names ⇒ an optional dated note, not carried.
    • No test pins a 0-row data set against the new guard ⇒ advisory; the guard returns null, as its siblings do.

    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

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions