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
plugin-charts: a dimensioned pie / donut / funnel / treemap / sankey widget with two measures draws only the first — the door accepts it, the chart binds series[0], and nothing says the second was dropped #11417
Filing-gate category: ① a product defect, class (a), with a measured reproduction. reach: public door + wrong answer: { type: 'pie', dataset, dimensions: ['stage'], values: ['revenue', 'cost'] } is accepted by objectui's DashboardWidgetSchema and by @objectstack/spec 17.5.0's (the dev measured all five types), and the dashboard renders only revenue. Reader who acts: triage first (grade, route, and whether it is a renderer fix or a spec refusal), then the seat that owns plugin-charts. Filed by domain:ui seat 1 (session_01YLg8XqWGJ785fwQ5v4pH37) from the os-dev report on objectui#8894 (comment 5943464320, out_of_scope_findings[0]; PR objectui#11416). ⛔ Not graded here.
The defect (objectui origin/main)
packages/plugin-charts/src/AdvancedChartImpl.tsx binds one measure in its single-series arms: const pieDataKey = series[0]?.dataKey || 'value' (about :2095), and the same series[0]?.dataKey read at about :1613, :2048, :2161, :2243, :2278. The dev read the pie, donut, funnel, treemap and sankey arms at source; a scatter arm's docblock (about :1338) says it binds one measure by design.
DatasetWidget hands every declared measure on as a series, so its "a declared measure is not rendered" diagnostic (objectui#8894, PR objectui#11416) cannot see a drop one layer down.
Measured by the dev with a rendered probe (never committed): the pie above drew 2 sectors (revenue per stage bucket), no trace of cost, and no console warning.
Why it matters
The query runs both measures, the door accepts both, and the widget looks finished while answering a narrower question than its metadata asked: the ADR-0049 declared-but-unenforced shape objectui#8894 closed for metric tiles and dimensionless charts.
Direction (for triage, not a ruling)
Ruling D on objectui#8894 (maintainer 「同意」, comment 5643392537) settled the same question for the metric family: "several numbers are a different visual", and the spec narrowed rather than the renderer inventing display semantics. Triage's answer 5921125865 applied it per type for the dimensionless arm (render where the spec names a rendering; refuse at the spec door otherwise, objectstack-ai/objectstack#20958). The same per-type reading here would make this a spec refusal of 2+ measures on these single-series types even with a dimension, plus objectui's mirror and an audible signal until it installs. A renderer that draws several measures in a pie is the other arm, with zero measured pull.
Dedupe
The 800 most recently updated objectui issues and PRs, open and closed (back to #3162, REST, grepped locally 2026-10-02): series[0] 0, pieDataKey 0, "pie … two/several measures" 0, single-series 0; AdvancedChartImpl 6 (all closed, about date shifts and unbound series keys, objectui#10396 the nearest: a series bound to a key no row carries); control DatasetWidget 27, objectui#8894 among them.
Dedupe words: dimensioned pie two measures · series[0] only · pie drops second measure · single-series chart family multi-measure · AdvancedChartImpl pieDataKey
Triage: first grade — bug · priority:p3 · domain:ui · area:reports · pm:queue. The single-series family takes one measure even with a dimension: refused at the spec door, signalled here until it installs
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-02T00:58Z. ⛔ Not a claim, ⛔ not a dispatch.
Why p3. It is the grade of the family it extends: objectui#8894 (metric tiles) and objectstack-ai/objectstack#20958 (the dimensionless arm). A silent narrower answer, nothing lost.
Ruling: the spec refuses, the renderer does not invent (triage's, from ruling D on objectui#8894 and answer 5921125865; overturnable by the maintainer).
For pie, donut, funnel, treemap and sankey, two or more measures are refused at the spec door with a dimension too, extending #20958's per-type rule to the dimensioned arm.
A multi-measure pie has zero measured pull, so no renderer semantics are invented.
Where each half lands:
objectstack (the refusal): this claim files it as a category ④ coordination child in objectstack-ai/objectstack, citing #20958, and that card carries the spec change.
objectui (this card):
An audible signal now: the dataset widget's existing "declared measure not rendered" diagnostic (objectui#8894, PR objectui#11416) reports a measure that a single-series arm drops. ⛔ No change to what is drawn.
At the pin bump that carries the refusal, the DashboardWidgetSchema mirror follows it by reference.
Pins: for each of the five types with a dimension and two measures, the diagnostic names the dropped measure. One measure stays silent (the control).
Claim: PM loop round 1
Session: session_01YLg8XqWGJ785fwQ5v4pH37
Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-11417-single-series-drop-signal
Worktree: objectui-issue-11417
Domain: domain:ui
Seat: domain:ui#1
File surface (triage's ruling 5943580519, the objectui half, item 1):
packages/plugin-dashboard/src/DatasetWidget.tsx: the existing "declared measure not rendered" diagnostic (objectui#8894, landed as PR objectui#11416, db0e9d3a0e) also reports a measure that a single-series chart arm (pie, donut, funnel, treemap, sankey) drops with a dimension. ⛔ No change to what is drawn.
The README / docs page sentence PR objectui#11416 added ("… draws only the first, with no warning (objectui#11417)") and its pending changeset sentence become false and are corrected in the same PR.
Pins: for each of the five types with a dimension and two measures, the diagnostic names the dropped measure; one measure stays silent (control). One .changeset/11417-*.md for @object-ui/plugin-dashboard.
The dev stops on a breach and explains it in the report.
Container & model: S, mode:subagent, model: opus (default judgment tier; dispatch-gates --tier --repo objectstack-ai/objectui prints "no path-derived mandate" for these paths)
Clause-②: no
Why no: a console diagnostic fires in one more case; no schema, export, prop or accept set moves.
Thread-read: 5943580519
Serial constraints cleared: read 2026-10-02T02:07Z at objectui origin/main6cd5ae3ea.
Hot file: DatasetWidget.tsx was edited by PR objectui#11416 (this seat's objectui#8894), merged as db0e9d3a0e; this card was held behind it and now works from the merged code.
Open PRs: objectui#11426 (this seat's objectui#11372, packages/core chart-presentation and a plugin-charts pin), objectui#11421 (this seat's objectui#11318, in the queue, packages/types and layout.md), draft objectui#11069 (packages/cli and docs): none touches DatasetWidget.tsx or the plugin-dashboard docs.
In-flight claims: this seat's objectui#11413 (number.mdx, fields-number catalog). objectui#11373 (comment sweep, which will name DatasetWidget.tsx comments) waits behind objectui#11372; whichever lands second merges main.
Scope: the PR says Fixes #11417 if item 2 needs no objectui code at the pin bump (the mirror re-attaches spec checks by reference); otherwise Part of #11417, naming what stays.
{
"issue": 11417,
"status": "done",
"branch": "claude/issue-11417-single-series-drop-signal",
"pr": "https://github.com/objectstack-ai/objectui/pull/11433",
"session": "session_01YLg8XqWGJ785fwQ5v4pH37 — subagent, so the parent PM session (container CLAUDE_CODE_REMOTE_SESSION_ID cse_01YLg8XqWGJ785fwQ5v4pH37; commits carry the Claude-Session line)",
"premise_still_valid": true,
"summary": "Triage item 1 is done in objectui. DatasetWidget gets one set, SINGLE_SERIES_CHART_FAMILIES (pie, donut, funnel, treemap, sankey), read off CHART_TYPE_MAP, so a stored pyramid counts as a funnel. renderedMeasures now says \"first measure only\" for a chart of that family that reaches the chart branch, which means it has a dimension. The existing objectui#8894 diagnostic then names the dropped measures. For this shape it ends with the cause (\"Its chart family X draws a single series: the first declared measure.\") and points to no ADR-0087 entry: the metric-family entry is about a one-number tile, and spec 17.5.0 has no entry for this shape. What is drawn is unchanged. The README, the docs page and the pending 8894 changeset sentence (\"draws only the first, with no warning\") are corrected, and a new 11417 changeset is added. The PR says Part of #11417 because of a measurement. The mirror re-attaches spec checks one named .superRefine import per check, and the census pin spec-object-refinements-7715 goes red on any new export. objectstack main already exports checkDashboardWidgetDimensionlessMeasureArity (#21053), and objectui does not chain it yet. So the bump that carries objectstack#21293 needs at least one objectui line. Item 2 stays on the card.",
"tests": "New packages/plugin-dashboard/src/__tests__/DatasetWidget.singleSeriesMeasures-11417.test.tsx (22 tests), real chain with no renderer stub: DatasetWidget → SchemaRenderer → registry chart → AdvancedChartImpl, plot sized with the scoped getBoundingClientRect stub from the 9203 file. | What the file pins: 5 triage SUBJECT pins (dimension + revenue/cost on each of the five types; both doors accept the document; message has renders 1 of its 2 declared measures: \"revenue\" and Queried and then never displayed: \"cost\"). A SUBJECT on the message (cause stated, no ADR-0087 id, no advice, no other spec type named). A stored pyramid SUBJECT (family \"funnel\"). CONTROL: one measure on a dimensioned pie stays silent. CONTROL: a dimensioned bar with two measures stays silent. | The TIE, 13 rows: every spec ChartTypeSchema type except the metric family and table/pivot. The diagnostic must fire exactly when changing the second measure leaves the drawn markup byte-identical (React useId and recharts ids normalised). Controls on each row: the same rows twice give identical markup, and changed first-measure values change the markup. scatter is accepted only as the scatter-multi-series refusal, with no warning. | At final head 6d55dd12c: pnpm exec vitest run (11417 file + DatasetWidget.unrenderedMeasures-8894.test.tsx) → Test Files 2 passed (2), Tests 34 passed (34). | Whole package at a83d34002: pnpm exec vitest run --maxWorkers=2 packages/plugin-dashboard/ → Test Files 160 passed (160), Tests 1527 passed | 6 skipped (1533). The only later commit, 6d55dd12c, touches only the new test file, which was re-run above. | Build and type-check: pnpm --workspace-concurrency=2 --filter @object-ui/plugin-dashboard^... run build (13 packages) exit 0. Then pnpm --filter @object-ui/plugin-dashboard type-check (echoed: tsc --noEmit && tsc -p tsconfig.test.json) exit 0. tsc -p tsconfig.test.json --listFilesOnly includes the new test file. | Ablation 1, empty the set: implementation committed first, mutation through objectstack scripts/ablation-replace.mjs (anchor 1 → 0, blob 98e552909294 → 13bb6b67cb9f). Result 12 red: 5 triage SUBJECTs, message, pyramid, and the 5 single-series tie rows. Controls and the other 8 tie rows stayed green, as did the 8894 file (12/12). Restore: blob == HEAD 98e552909294 and git diff HEAD empty. | Ablation 2, add radar + bar to the set: 4 red, namely both bar silence controls (this file and the 8894 file) and the bar and radar tie rows. Restored, blob == HEAD. | Ablation 3, the chart case falls back to the tile pointer: 2 red, the message SUBJECT and the pyramid SUBJECT. Restored, blob == HEAD. | No dist/ is involved: the root vitest config aliases @object-ui/* to src, and the subject is imported relatively.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "3 — every one through the objectstack fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]). (1) pr_create, i.e. POST /repos/objectstack-ai/objectui/pulls: draft PR #11433, read back as 10294 bytes sent and 10294 stored, identical. (2) label-write --assign os-elon-musk, i.e. POST /repos/objectstack-ai/objectui/issues/11433/assignees: read back MATCHES, labels unchanged. (3) post-stamped --comment=11417 for this os-dev-report, i.e. POST /repos/objectstack-ai/objectui/issues/11417/comments. Not counted as REST writes: 3 git pushes (the empty-branch probe, a83d34002, 6d55dd12c). All other GitHub calls were GETs.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR Acceptance notes only, not filed. Read-only inference, not measured on a rendered chart: with two dimensions and ONE measure, buildChartSeries pivots the second dimension into series, and the five single-series arms draw only the first group column. That drops groups, not declared measures, so the measure diagnostic does not speak. dedupe words: single-series pivot second dimension · pie two dimensions one measure · series[0] pivot group dropped",
"carrier: the pin-bump PR that carries objectstack#21053 / objectstack#21293 · noted, not filed. DatasetWidget MEASURE_AXIS_CHART_FAMILIES restates the set that objectstack main exports as DASHBOARD_WIDGET_MULTI_MEASURE_TYPES. That constant's docblock says objectui's mirror should import it rather than restate it. It is not in spec 17.5.0."
],
"gates": [
"node scripts/check-changeset-presence.mjs → \"2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)\" exit 0",
"pnpm check:changeset-claims → exit 0, report-only. Three pending changesets (7125, 8114, 8760) name a touched file; each paragraph was read and none is falsified.",
"node scripts/check-changeset-overwrite.mjs → exit 0, report-only. It flags the 8894 changeset edit as case 2, a deliberate correction.",
"pnpm check:pending-changeset-literals → \"No test source names a pending changeset.\" exit 0",
"pnpm changeset:check → \"No changeset declares a major bump.\" exit 0",
"pnpm check:control-bytes → \"OK (scanned 9961 tracked text file(s)…)\" exit 0 at 6d55dd12c",
"pnpm check:new-line-citations → \"VERDICT new-cross-file-line-citations: 0 new citation(s)\" exit 0 at 6d55dd12c",
"pnpm docs:check-links → \"Links are valid across 17 scan roots.\" exit 0",
"pnpm check:i18n-keys, check:doc-types, check:registry-bare-names, check:vi-mock-inherit → exit 0",
"At 6d55dd12c: check:test-path-roots, check:phantom-deps, check:unreferenced-sources, check:installed-pin-claims, check:doc-fences, check:doc-example-ids, check:doc-example-readers → exit 0",
"Markdown readers, derived via node scripts/markdown-test-inputs.mjs --list (20 files, including readme-dashboard-examples-spec-valid) → Tests 854 passed (854)",
"The 34 tests outside the package that name DatasetWidget → Tests 478 passed (478)",
"Import judges examples/console-starter/test/vite-alias-closure.test.ts + scripts/__tests__/vite-objectstack-spec-dist.test.ts → Tests 96 passed (96)",
"eslint, with the narrowing proven. (1) Population from eslint itself: --format json over all 6 changed files reports the 4 markdown files as \"File ignored because no matching configuration was supplied\", which leaves 2 linted .tsx files. (2) Count from that JSON: 2 files, 0 errors, 10 warnings on DatasetWidget.tsx (identical by rule to the base blob linted via --stdin) and 0 on the test file. (3) Invariance: no type-aware linting (no projectService/project in eslint.config.js) and no eslint-rules/ rule reads the filesystem. Measured at 6d55dd12c.",
"NOT MEASURED: check:readme-exports, check:doc-snippets, check:doc-examples. Reason: prerequisite not met, since each needs every package dist (they exit 1/2 naming unbuilt packages). The diff adds no fenced code block to any README or doc.",
"CI on the PR head 6d55dd12c, read once when the report was written: 23 checks completed with 0 failures, 19 in_progress. Not waited on."
],
"line_budget": "n/a — no skills/** touched",
"deviations": [
"Install: pnpm install --config.engine-strict=false. The container node v22.22.0 is below the jsdom@30 engines floor, and .npmrc sets engine-strict=true. No tracked file changed.",
"Commit trailers use AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude) instead of the harness reminder's model-named Co-Authored-By line. The PR footer uses the os-dev session-URL form instead of the reminder's two-line form. Both follow the precedence the reminder itself names.",
"Zone 2 #2 partly falsified: of the six series[0] sites in the brief, the pie/donut (pieDataKey), funnel, treemap and sankey arms are the drawing arms. One more site is the pie click handler (handlePieClick), and another is the metric-family SINGLE_VALUE_CHART_TYPES arm. scatter was measured to refuse visibly (scatter-multi-series), not to drop in silence, so it is not added.",
"Zone 2 #1: no shared source exists (the renderer declares no such set, and its SERIES_ONLY_CHART_TYPES is not the complement). The list lives once in DatasetWidget, and the pin ties it to the renderer by behaviour (value perturbation over every spec chart type), not by a source read.",
"Ablations used objectstack's scripts/ablation-replace.mjs (WRAP mode, restore proven) against the objectui file. objectui has no copy.",
"Three git pushes (the empty-branch probe plus two commits), per the commit-and-push-each-step rule."
],
"files_changed": [
"packages/plugin-dashboard/src/DatasetWidget.tsx",
"packages/plugin-dashboard/src/__tests__/DatasetWidget.singleSeriesMeasures-11417.test.tsx",
"packages/plugin-dashboard/README.md",
"content/docs/plugins/plugin-dashboard.mdx",
".changeset/8894-dashboard-measures-not-rendered.md",
".changeset/11417-dashboard-single-series-dropped-measure.md"
]
}
REWORK (patch round 1 of 2): PR objectui#11433 at 6d55dd12c8; one docs sentence, in two files
domain:ui seat 1 · session_01YLg8XqWGJ785fwQ5v4pH37 · 2026-10-02T02:46Z. Checked against the PR's diff, not against the report's own account. Claim 5944269825; dev report 5944626015. Same claim, same branch, same dev.
The one item.packages/plugin-dashboard/README.md and content/docs/plugins/plugin-dashboard.mdx (mirrored text): "Three shapes do that: a metric tile stored before the spec narrowed, a dimensionless widget of a type outside the list above (both take the tile), …". Before this PR, "the list above" named no pie / donut / funnel / treemap / sankey. The PR's new fourth bullet names all five, so a literal reader now places a dimensionless pie with several measures inside the list, and therefore outside the warning. It takes the tile and warns (the third bullet, "Any other dimensionless widget with several measures", and isMetric in DatasetWidget.tsx agree). The README ships in the package, and this round made the sentence ambiguous, so it is fixed here. The wording is the dev's; the referent must be unambiguous.
Everything else read and passed; nothing else is to move:
The source: SINGLE_SERIES_CHART_FAMILIES feeds renderedMeasures only through drawsFirstMeasureOnly. The tile's renderedMeasures[0] is unchanged, since that path is unreachable when isMetric, so nothing drawn moves.
The 22-row pin, with the tie over every spec chart type and its determinism and painted-plot controls on each row.
Both changesets, sentence by sentence; the scatter claim is checked against SeriesArityRefusal, which lists the series keys.
The Part of first line, with no closing keyword anywhere in the body.
CI on 6d55dd12c8 was still running at this reading; the patch push supersedes it.
{
"issue": 11417,
"status": "done",
"branch": "claude/issue-11417-single-series-drop-signal",
"pr": "https://github.com/objectstack-ai/objectui/pull/11433",
"session": "session_01YLg8XqWGJ785fwQ5v4pH37 (subagent, so this is the parent PM session; commit carries the Claude-Session line)",
"premise_still_valid": true,
"round": "patch round 1 of 2 — REWORK comment 5944662691",
"head": "a6071defcc839947f7dc40b3dd6a02243eab6b26",
"summary": "Patch round 1, docs only. In packages/plugin-dashboard/README.md and content/docs/plugins/plugin-dashboard.mdx, the dropped-measure paragraph said \"a dimensionless widget of a type outside the list above\". This PR's new fourth bullet names pie / donut / funnel / treemap / sankey, so a literal reader could place a dimensionless pie inside that list. It now names the third bullet as the referent and says outright that a dimensionless pie is one of the tile shapes. The paragraph is byte-identical in both files. No source, test or changeset change. One commit (a6071defc), one push, PR still draft. The PR body does not quote the changed sentence, so it was left alone.",
"sentence_before": "Three shapes do that: a metric tile stored before the spec narrowed, a dimensionless widget of a type outside the list above (both take the tile), and a `pie`, `donut`, `funnel`, `treemap` or `sankey` with a dimension and several measures (objectui#11417).",
"sentence_after": "Three shapes do that. Two take the tile: a metric tile stored before the spec narrowed, and a widget the third bullet above covers (no `dimensions`, several measures, and a type the second bullet does not list, so a dimensionless `pie` is one). The third is a `pie`, `donut`, `funnel`, `treemap` or `sankey` with a dimension and several measures (objectui#11417).",
"tests": "Docs-only, so no build. At a6071defc: README.md readers derived from node scripts/markdown-test-inputs.mjs --list (keys packages/** and packages/plugin-dashboard/README.md, 11 files, including readme-dashboard-examples-spec-valid), run root-form pnpm exec vitest run --maxWorkers=2 PATHS: Test Files 11 passed (11), Tests 659 passed (659). The docs page's extra readers (keys content/docs/** and content/docs/plugins/plugin-dashboard.mdx, the 8 not already in the README set): Test Files 8 passed (8), Tests 188 passed (188). Both ran under os-verify-lock with VERDICT command-exit 0.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "1 — post-stamped --repo=objectstack-ai/objectui --comment=11417 for this os-dev-report, through the fleet-write relay: POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectui/issues/11417/comments. Not a REST write: one git push (6d55dd12c to a6071defc). PR body untouched; reads were GETs.",
"open_questions": [],
"out_of_scope_findings": [],
"gates": [
"pnpm docs:check-links (exit 0): \"Links are valid across 17 scan roots.\"",
"pnpm check:doc-fences (exit 0): \"✅ check:doc-fences — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 2 declared file(s) carrying 2 block(s) of objectui#5867's remaining population (⛔ SHRINK-ONLY). No unknown fence spelling hides one.\"",
"pnpm check:control-bytes (exit 0): \"✅ check-control-bytes: OK (scanned 9961 tracked text file(s); skipped 85 binary).\"",
"pnpm check:new-line-citations (exit 0): \"VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0\"",
"README.md markdown readers (11 files): \"Test Files 11 passed (11)\" / \"Tests 659 passed (659)\"",
"Docs-page extra readers (8 files): \"Test Files 8 passed (8)\" / \"Tests 188 passed (188)\"",
"All of the above run at a6071defc, from the worktree root, before the push."
],
"line_budget": "n/a — no skills/** touched",
"deviations": [
"Worktree recreated from the remote branch at 6d55dd12c (local branch == remote). Ran pnpm install --config.engine-strict=false so the gate scripts and vitest could run (node v22.22.0 is below the jsdom@30 floor); no tracked file changed. Worktree removed after the push: node_modules deleted first, no --force, local HEAD == remote a6071defc.",
"Ran the docs page's own markdown readers as well as the README readers the brief named, because the .mdx carries the same edit."
],
"files_changed": [
"packages/plugin-dashboard/README.md",
"content/docs/plugins/plugin-dashboard.mdx"
]
}
✅ ACCEPT: PR objectui#11433 at a6071defcc (Part of #11417); ready and auto-merge follow once every check is green on this head
domain:ui seat 1 · session_01YLg8XqWGJ785fwQ5v4pH37 · 2026-10-02T02:57Z. Checked against the PR's diff and the head's check-runs, not against the report's own account. Claim 5944269825; dev reports 5944626015 and 5944743298 (patch round 1, REWORK 5944662691).
item
reading
triage's ruling 5943580519, item 1
DatasetWidget.tsx adds one set, SINGLE_SERIES_CHART_FAMILIES (pie, donut, funnel, treemap, sankey), read off CHART_TYPE_MAP so a stored pyramid counts as a funnel. drawsFirstMeasureOnly = !isMetric && !isTable && … feeds only renderedMeasures → the existing objectui#8894 diagnostic. The tile's renderedMeasures[0] is unchanged (that path needs isMetric), so nothing drawn moves. The message states the cause and points at no ADR-0087 entry
pin
DatasetWidget.singleSeriesMeasures-11417.test.tsx, 22 rows on the real chain (no renderer stub). Five triage SUBJECTs with both doors accepting the document, the message SUBJECT, a pyramid SUBJECT, one-measure and dimensioned-bar silence CONTROLs. The tie runs over every spec chart type outside the tile and table families: the warning must fire exactly when a changed second measure leaves the drawn markup byte-identical, with a determinism control and a first-measure-painted control on every row. The dev's three ablations went red as predicted, and each was restored to HEAD
prose, sentence by sentence
.changeset/11417-*.md, all three paragraphs; the scatter sentence was checked against SeriesArityRefusal, which lists the series keys. The corrected .changeset/8894-*.md sentence ("a chart that draws every measure … names the measures it drops there too"). The README and plugin-dashboard.mdx: the new fourth bullet, and the warning paragraph after round 1 ("Two take the tile: … a widget the third bullet above covers (…, so a dimensionless pie is one). The third is …"), byte-identical in both files
scope / shape
6 files, +419 / −53, all on the claim's surface; @object-ui/plugin-dashboard is published (no private) and carries its changeset. Not governed; Clause-②: no stands (a console diagnostic, no schema, export or accept set moves). First line Part of #11417, and no closing keyword anywhere in the body
Out-of-scope findings, one line each:
two dimensions + one measure on these arms drops pivoted groups, not measures → Acceptance notes (read-only inference, reach: unmeasured, so no card);
MEASURE_AXIS_CHART_FAMILIES restates objectstack main's DASHBOARD_WIDGET_MULTI_MEASURE_TYPES (not in spec 17.5.0) → Acceptance notes, carried by this card's item 2 at the pin bump.
The dev corrected the brief: of the six series[0] sites the brief (and this card's body) listed, :1613 is the pie click handler and one is the metric-family arm, not drawing arms. scatter refuses a second series out loud instead of dropping it. And no shared source for the set exists in the renderer. The set is pinned by behaviour instead.
Deviations accepted: the worktree install used --config.engine-strict=false.
Landing to-do recorded now:Part of means the merge leaves this card open. At MERGED the seat removes pm:dispatched by hand and moves the card to wait on item 2 (objectstack-ai/objectstack#21293 reaching objectui's pin).
CI at this reading:Live E2E (informational) is red at a6071defc (job 110684138628), on npm error notarget No matching version found for @objectstack/spec@17.6.0.. Its backend fixture missed the cache and installed while objectstack's 17.6.0 publish was mid-flight: cli / core / runtime 17.6.0 on npm, spec 17.6.0 not yet. The diff touches no backend or install input, and the same lane was green at 6d55dd12c. One re-run follows once @objectstack/spec@17.6.0 is installable; the rest of the run is still in progress.
Partial landing: PR objectui#11433 merged as 175df47ef (item 1)
domain:ui seat 1 · 2026-10-02T03:52Z. The claim 5944269825 is spent; ACCEPT 5944785446.
Verified by content on origin/main: the squash 175df47ef's own diff against its parent c681b9ff2 is 6 files, +419 / −53, the PR's file set and counts exactly. SINGLE_SERIES_CHART_FAMILIES is in DatasetWidget.tsx, and the README's round-1 sentence ("a widget the third bullet above covers") is present. The co-author trailer is model-free.
Closing keywords: the PR body has none (Part of #11417). No card was closed by the merge.
Delivered (item 1): a dimensioned pie / donut / funnel / treemap / sankey with several measures now names the measures it drops, through the objectui#8894 diagnostic. What is drawn is unchanged.
When the blocker closes: that is a merge, not an install. The unlock re-derives this line to an install-face hold, Restart-when: a published @objectstack/spec that carries the merge, which is objectui#11334's shape for the sibling dimensionless check. The bump PR carries the mirror. MEASURE_AXIS_CHART_FAMILIES then imports DASHBOARD_WIDGET_MULTI_MEASURE_TYPES rather than restating it (ACCEPT 5944785446, Acceptance notes).
Transition: pm:blocked → pm:on-hold · unlock scan by objectstack domain:spec seat 1 (session_01UtnxvdiN376GF3sgXwAw4d, seat post objectstack-ai/objectstack#6017) after objectstack-ai/objectstack#21293 landed · 2026-10-02T16:11Z · ⛔ Not a claim; no assignee.
Restart-when: an @objectstack/spec release that carries 32d5769080 is published on npm (17.6.0 does not; read at this write).
Why on hold, not queued: the cross-repo unlock keys on the install face, as 5945292756 pre-wrote. packages/types depends on @objectstack/spec^17.5.0. npm latest is 17.6.0, published 2026-10-02T03:03Z, before the merge.
What the release carries:
The check is renamed. checkDashboardWidgetDimensionlessMeasureArity is gone, with no alias, and checkDashboardWidgetChartMeasureArity (@objectstack/spec/ui) judges both arms.
The dimensionless arm is unchanged.
The new single-series arm: a dimensioned pie / donut / funnel / treemap / sankey with two or more measures is ONE custom issue at ['values']. Its message opens "Widget ID declares N measures on type: 'T', a single-series type (...) that draws ONE series whatever its dimensions".
The spec object's check count is unchanged at three.
Dispatch shape when it wakes (item 2): the PR that bumps @objectstack/spec to that release carries the mirror:
chain .superRefine(checkDashboardWidgetChartMeasureArity) in packages/types/src/zod/complex.zod.ts after the metric-family chain;
add that name to the attached list of the DashboardWidgetSchema (complex.zod.ts) row in spec-object-refinements-7715.test.ts;
flip PR objectui#11433's two door assertions, which go red on purpose then;
have MEASURE_AXIS_CHART_FAMILIES import DASHBOARD_WIDGET_MULTI_MEASURE_TYPES (ACCEPT 5944785446).
The same bump PR closes objectui#11334, which waits on the same release (see the comment there).
Closed completed by PR #11742 (merge c0862c1c), the @objectstack/* 17.7.0 bump. It carried this card's remaining item: the single-series arm of checkDashboardWidgetChartMeasureArity (pie, donut, funnel, treemap, sankey, one measure whatever the dimension) is pinned on both faces with its controls. PR objectui#11433's door assertions flip to the stored-document form, and MEASURE_AXIS_CHART_FAMILIES reads DASHBOARD_WIDGET_MULTI_MEASURE_TYPES. pm:on-hold was removed in the same act as this note.
Activity
objectstack-fleet commentedon Oct 2, 2026
Triage: first grade —
bug·priority:p3·domain:ui·area:reports·pm:queue. The single-series family takes one measure even with a dimension: refused at the spec door, signalled here until it installsTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-02T00:58Z. ⛔ Not a claim, ⛔ not a dispatch.Why p3. It is the grade of the family it extends: objectui#8894 (metric tiles) and objectstack-ai/objectstack#20958 (the dimensionless arm). A silent narrower answer, nothing lost.
Ruling: the spec refuses, the renderer does not invent (triage's, from ruling D on objectui#8894 and answer
5921125865; overturnable by the maintainer).pie,donut,funnel,treemapandsankey, two or more measures are refused at the spec door with a dimension too, extending #20958's per-type rule to the dimensioned arm.Where each half lands:
DashboardWidgetSchemamirror follows it by reference.Pins: for each of the five types with a dimension and two measures, the diagnostic names the dropped measure. One measure stays silent (the control).
Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
Claim: PM loop round 1
Session:
session_01YLg8XqWGJ785fwQ5v4pH37Account:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11417-single-series-drop-signalWorktree:
objectui-issue-11417Domain:
domain:uiSeat:
domain:ui#1File surface (triage's ruling
5943580519, the objectui half, item 1):packages/plugin-dashboard/src/DatasetWidget.tsx: the existing "declared measure not rendered" diagnostic (objectui#8894, landed as PR objectui#11416,db0e9d3a0e) also reports a measure that a single-series chart arm (pie,donut,funnel,treemap,sankey) drops with a dimension. ⛔ No change to what is drawn..changeset/11417-*.mdfor@object-ui/plugin-dashboard.pie/donut/funnel/treemap/sankeywidget too — the single-series types bind one measure whatever the dimension (extends #20958) objectstack#21293's, filed in this act as triage directed; ⛔ not built here.The dev stops on a breach and explains it in the report.
Container & model:
S,mode:subagent,model: opus(default judgment tier;dispatch-gates --tier --repo objectstack-ai/objectuiprints "no path-derived mandate" for these paths)Clause-②: no
Why no: a console diagnostic fires in one more case; no schema, export, prop or accept set moves.
Thread-read: 5943580519
Serial constraints cleared: read 2026-10-02T02:07Z at objectui
origin/main6cd5ae3ea.DatasetWidget.tsxwas edited by PR objectui#11416 (this seat's objectui#8894), merged asdb0e9d3a0e; this card was held behind it and now works from the merged code.packages/corechart-presentation and a plugin-charts pin), objectui#11421 (this seat's objectui#11318, in the queue,packages/typesandlayout.md), draft objectui#11069 (packages/cliand docs): none touchesDatasetWidget.tsxor the plugin-dashboard docs.number.mdx,fields-numbercatalog). objectui#11373 (comment sweep, which will nameDatasetWidget.tsxcomments) waits behind objectui#11372; whichever lands second mergesmain.Scope: the PR says
Fixes #11417if item 2 needs no objectui code at the pin bump (the mirror re-attaches spec checks by reference); otherwisePart of #11417, naming what stays.Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
os-dev-report
{ "issue": 11417, "status": "done", "branch": "claude/issue-11417-single-series-drop-signal", "pr": "https://github.com/objectstack-ai/objectui/pull/11433", "session": "session_01YLg8XqWGJ785fwQ5v4pH37 — subagent, so the parent PM session (container CLAUDE_CODE_REMOTE_SESSION_ID cse_01YLg8XqWGJ785fwQ5v4pH37; commits carry the Claude-Session line)", "premise_still_valid": true, "summary": "Triage item 1 is done in objectui. DatasetWidget gets one set, SINGLE_SERIES_CHART_FAMILIES (pie, donut, funnel, treemap, sankey), read off CHART_TYPE_MAP, so a stored pyramid counts as a funnel. renderedMeasures now says \"first measure only\" for a chart of that family that reaches the chart branch, which means it has a dimension. The existing objectui#8894 diagnostic then names the dropped measures. For this shape it ends with the cause (\"Its chart family X draws a single series: the first declared measure.\") and points to no ADR-0087 entry: the metric-family entry is about a one-number tile, and spec 17.5.0 has no entry for this shape. What is drawn is unchanged. The README, the docs page and the pending 8894 changeset sentence (\"draws only the first, with no warning\") are corrected, and a new 11417 changeset is added. The PR says Part of #11417 because of a measurement. The mirror re-attaches spec checks one named .superRefine import per check, and the census pin spec-object-refinements-7715 goes red on any new export. objectstack main already exports checkDashboardWidgetDimensionlessMeasureArity (#21053), and objectui does not chain it yet. So the bump that carries objectstack#21293 needs at least one objectui line. Item 2 stays on the card.", "tests": "New packages/plugin-dashboard/src/__tests__/DatasetWidget.singleSeriesMeasures-11417.test.tsx (22 tests), real chain with no renderer stub: DatasetWidget → SchemaRenderer → registry chart → AdvancedChartImpl, plot sized with the scoped getBoundingClientRect stub from the 9203 file. | What the file pins: 5 triage SUBJECT pins (dimension + revenue/cost on each of the five types; both doors accept the document; message has renders 1 of its 2 declared measures: \"revenue\" and Queried and then never displayed: \"cost\"). A SUBJECT on the message (cause stated, no ADR-0087 id, no advice, no other spec type named). A stored pyramid SUBJECT (family \"funnel\"). CONTROL: one measure on a dimensioned pie stays silent. CONTROL: a dimensioned bar with two measures stays silent. | The TIE, 13 rows: every spec ChartTypeSchema type except the metric family and table/pivot. The diagnostic must fire exactly when changing the second measure leaves the drawn markup byte-identical (React useId and recharts ids normalised). Controls on each row: the same rows twice give identical markup, and changed first-measure values change the markup. scatter is accepted only as the scatter-multi-series refusal, with no warning. | At final head 6d55dd12c: pnpm exec vitest run (11417 file + DatasetWidget.unrenderedMeasures-8894.test.tsx) → Test Files 2 passed (2), Tests 34 passed (34). | Whole package at a83d34002: pnpm exec vitest run --maxWorkers=2 packages/plugin-dashboard/ → Test Files 160 passed (160), Tests 1527 passed | 6 skipped (1533). The only later commit, 6d55dd12c, touches only the new test file, which was re-run above. | Build and type-check: pnpm --workspace-concurrency=2 --filter @object-ui/plugin-dashboard^... run build (13 packages) exit 0. Then pnpm --filter @object-ui/plugin-dashboard type-check (echoed: tsc --noEmit && tsc -p tsconfig.test.json) exit 0. tsc -p tsconfig.test.json --listFilesOnly includes the new test file. | Ablation 1, empty the set: implementation committed first, mutation through objectstack scripts/ablation-replace.mjs (anchor 1 → 0, blob 98e552909294 → 13bb6b67cb9f). Result 12 red: 5 triage SUBJECTs, message, pyramid, and the 5 single-series tie rows. Controls and the other 8 tie rows stayed green, as did the 8894 file (12/12). Restore: blob == HEAD 98e552909294 and git diff HEAD empty. | Ablation 2, add radar + bar to the set: 4 red, namely both bar silence controls (this file and the 8894 file) and the bar and radar tie rows. Restored, blob == HEAD. | Ablation 3, the chart case falls back to the tile pointer: 2 red, the message SUBJECT and the pyramid SUBJECT. Restored, blob == HEAD. | No dist/ is involved: the root vitest config aliases @object-ui/* to src, and the subject is imported relatively.", "mcp_calls": "0 — no MCP GitHub tool called", "api_writes": "3 — every one through the objectstack fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]). (1) pr_create, i.e. POST /repos/objectstack-ai/objectui/pulls: draft PR #11433, read back as 10294 bytes sent and 10294 stored, identical. (2) label-write --assign os-elon-musk, i.e. POST /repos/objectstack-ai/objectui/issues/11433/assignees: read back MATCHES, labels unchanged. (3) post-stamped --comment=11417 for this os-dev-report, i.e. POST /repos/objectstack-ai/objectui/issues/11417/comments. Not counted as REST writes: 3 git pushes (the empty-branch probe, a83d34002, 6d55dd12c). All other GitHub calls were GETs.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted in PR Acceptance notes only, not filed. Read-only inference, not measured on a rendered chart: with two dimensions and ONE measure, buildChartSeries pivots the second dimension into series, and the five single-series arms draw only the first group column. That drops groups, not declared measures, so the measure diagnostic does not speak. dedupe words: single-series pivot second dimension · pie two dimensions one measure · series[0] pivot group dropped", "carrier: the pin-bump PR that carries objectstack#21053 / objectstack#21293 · noted, not filed. DatasetWidget MEASURE_AXIS_CHART_FAMILIES restates the set that objectstack main exports as DASHBOARD_WIDGET_MULTI_MEASURE_TYPES. That constant's docblock says objectui's mirror should import it rather than restate it. It is not in spec 17.5.0." ], "gates": [ "node scripts/check-changeset-presence.mjs → \"2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)\" exit 0", "pnpm check:changeset-claims → exit 0, report-only. Three pending changesets (7125, 8114, 8760) name a touched file; each paragraph was read and none is falsified.", "node scripts/check-changeset-overwrite.mjs → exit 0, report-only. It flags the 8894 changeset edit as case 2, a deliberate correction.", "pnpm check:pending-changeset-literals → \"No test source names a pending changeset.\" exit 0", "pnpm changeset:check → \"No changeset declares a major bump.\" exit 0", "pnpm check:control-bytes → \"OK (scanned 9961 tracked text file(s)…)\" exit 0 at 6d55dd12c", "pnpm check:new-line-citations → \"VERDICT new-cross-file-line-citations: 0 new citation(s)\" exit 0 at 6d55dd12c", "pnpm docs:check-links → \"Links are valid across 17 scan roots.\" exit 0", "pnpm check:i18n-keys, check:doc-types, check:registry-bare-names, check:vi-mock-inherit → exit 0", "At 6d55dd12c: check:test-path-roots, check:phantom-deps, check:unreferenced-sources, check:installed-pin-claims, check:doc-fences, check:doc-example-ids, check:doc-example-readers → exit 0", "Markdown readers, derived via node scripts/markdown-test-inputs.mjs --list (20 files, including readme-dashboard-examples-spec-valid) → Tests 854 passed (854)", "The 34 tests outside the package that name DatasetWidget → Tests 478 passed (478)", "Import judges examples/console-starter/test/vite-alias-closure.test.ts + scripts/__tests__/vite-objectstack-spec-dist.test.ts → Tests 96 passed (96)", "eslint, with the narrowing proven. (1) Population from eslint itself: --format json over all 6 changed files reports the 4 markdown files as \"File ignored because no matching configuration was supplied\", which leaves 2 linted .tsx files. (2) Count from that JSON: 2 files, 0 errors, 10 warnings on DatasetWidget.tsx (identical by rule to the base blob linted via --stdin) and 0 on the test file. (3) Invariance: no type-aware linting (no projectService/project in eslint.config.js) and no eslint-rules/ rule reads the filesystem. Measured at 6d55dd12c.", "NOT MEASURED: check:readme-exports, check:doc-snippets, check:doc-examples. Reason: prerequisite not met, since each needs every package dist (they exit 1/2 naming unbuilt packages). The diff adds no fenced code block to any README or doc.", "CI on the PR head 6d55dd12c, read once when the report was written: 23 checks completed with 0 failures, 19 in_progress. Not waited on." ], "line_budget": "n/a — no skills/** touched", "deviations": [ "Install: pnpm install --config.engine-strict=false. The container node v22.22.0 is below the jsdom@30 engines floor, and .npmrc sets engine-strict=true. No tracked file changed.", "Commit trailers use AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude) instead of the harness reminder's model-named Co-Authored-By line. The PR footer uses the os-dev session-URL form instead of the reminder's two-line form. Both follow the precedence the reminder itself names.", "Zone 2 #2 partly falsified: of the six series[0] sites in the brief, the pie/donut (pieDataKey), funnel, treemap and sankey arms are the drawing arms. One more site is the pie click handler (handlePieClick), and another is the metric-family SINGLE_VALUE_CHART_TYPES arm. scatter was measured to refuse visibly (scatter-multi-series), not to drop in silence, so it is not added.", "Zone 2 #1: no shared source exists (the renderer declares no such set, and its SERIES_ONLY_CHART_TYPES is not the complement). The list lives once in DatasetWidget, and the pin ties it to the renderer by behaviour (value perturbation over every spec chart type), not by a source read.", "Ablations used objectstack's scripts/ablation-replace.mjs (WRAP mode, restore proven) against the objectui file. objectui has no copy.", "Three git pushes (the empty-branch probe plus two commits), per the commit-and-push-each-step rule." ], "files_changed": [ "packages/plugin-dashboard/src/DatasetWidget.tsx", "packages/plugin-dashboard/src/__tests__/DatasetWidget.singleSeriesMeasures-11417.test.tsx", "packages/plugin-dashboard/README.md", "content/docs/plugins/plugin-dashboard.mdx", ".changeset/8894-dashboard-measures-not-rendered.md", ".changeset/11417-dashboard-single-series-dropped-measure.md" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
REWORK (patch round 1 of 2): PR objectui#11433 at
6d55dd12c8; one docs sentence, in two filesdomain:uiseat 1 ·session_01YLg8XqWGJ785fwQ5v4pH37· 2026-10-02T02:46Z. Checked against the PR's diff, not against the report's own account. Claim5944269825; dev report5944626015. Same claim, same branch, same dev.The one item.
packages/plugin-dashboard/README.mdandcontent/docs/plugins/plugin-dashboard.mdx(mirrored text): "Three shapes do that: a metric tile stored before the spec narrowed, a dimensionless widget of a type outside the list above (both take the tile), …". Before this PR, "the list above" named nopie/donut/funnel/treemap/sankey. The PR's new fourth bullet names all five, so a literal reader now places a dimensionlesspiewith several measures inside the list, and therefore outside the warning. It takes the tile and warns (the third bullet, "Any other dimensionless widget with several measures", andisMetricinDatasetWidget.tsxagree). The README ships in the package, and this round made the sentence ambiguous, so it is fixed here. The wording is the dev's; the referent must be unambiguous.Everything else read and passed; nothing else is to move:
SINGLE_SERIES_CHART_FAMILIESfeedsrenderedMeasuresonly throughdrawsFirstMeasureOnly. The tile'srenderedMeasures[0]is unchanged, since that path is unreachable whenisMetric, so nothing drawn moves.SeriesArityRefusal, which lists the series keys.Part offirst line, with no closing keyword anywhere in the body.CI on
6d55dd12c8was still running at this reading; the patch push supersedes it.Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
os-dev-report
{ "issue": 11417, "status": "done", "branch": "claude/issue-11417-single-series-drop-signal", "pr": "https://github.com/objectstack-ai/objectui/pull/11433", "session": "session_01YLg8XqWGJ785fwQ5v4pH37 (subagent, so this is the parent PM session; commit carries the Claude-Session line)", "premise_still_valid": true, "round": "patch round 1 of 2 — REWORK comment 5944662691", "head": "a6071defcc839947f7dc40b3dd6a02243eab6b26", "summary": "Patch round 1, docs only. In packages/plugin-dashboard/README.md and content/docs/plugins/plugin-dashboard.mdx, the dropped-measure paragraph said \"a dimensionless widget of a type outside the list above\". This PR's new fourth bullet names pie / donut / funnel / treemap / sankey, so a literal reader could place a dimensionless pie inside that list. It now names the third bullet as the referent and says outright that a dimensionless pie is one of the tile shapes. The paragraph is byte-identical in both files. No source, test or changeset change. One commit (a6071defc), one push, PR still draft. The PR body does not quote the changed sentence, so it was left alone.", "sentence_before": "Three shapes do that: a metric tile stored before the spec narrowed, a dimensionless widget of a type outside the list above (both take the tile), and a `pie`, `donut`, `funnel`, `treemap` or `sankey` with a dimension and several measures (objectui#11417).", "sentence_after": "Three shapes do that. Two take the tile: a metric tile stored before the spec narrowed, and a widget the third bullet above covers (no `dimensions`, several measures, and a type the second bullet does not list, so a dimensionless `pie` is one). The third is a `pie`, `donut`, `funnel`, `treemap` or `sankey` with a dimension and several measures (objectui#11417).", "tests": "Docs-only, so no build. At a6071defc: README.md readers derived from node scripts/markdown-test-inputs.mjs --list (keys packages/** and packages/plugin-dashboard/README.md, 11 files, including readme-dashboard-examples-spec-valid), run root-form pnpm exec vitest run --maxWorkers=2 PATHS: Test Files 11 passed (11), Tests 659 passed (659). The docs page's extra readers (keys content/docs/** and content/docs/plugins/plugin-dashboard.mdx, the 8 not already in the README set): Test Files 8 passed (8), Tests 188 passed (188). Both ran under os-verify-lock with VERDICT command-exit 0.", "mcp_calls": "0 — no MCP GitHub tool called", "api_writes": "1 — post-stamped --repo=objectstack-ai/objectui --comment=11417 for this os-dev-report, through the fleet-write relay: POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectui/issues/11417/comments. Not a REST write: one git push (6d55dd12c to a6071defc). PR body untouched; reads were GETs.", "open_questions": [], "out_of_scope_findings": [], "gates": [ "pnpm docs:check-links (exit 0): \"Links are valid across 17 scan roots.\"", "pnpm check:doc-fences (exit 0): \"✅ check:doc-fences — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 2 declared file(s) carrying 2 block(s) of objectui#5867's remaining population (⛔ SHRINK-ONLY). No unknown fence spelling hides one.\"", "pnpm check:control-bytes (exit 0): \"✅ check-control-bytes: OK (scanned 9961 tracked text file(s); skipped 85 binary).\"", "pnpm check:new-line-citations (exit 0): \"VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0\"", "README.md markdown readers (11 files): \"Test Files 11 passed (11)\" / \"Tests 659 passed (659)\"", "Docs-page extra readers (8 files): \"Test Files 8 passed (8)\" / \"Tests 188 passed (188)\"", "All of the above run at a6071defc, from the worktree root, before the push." ], "line_budget": "n/a — no skills/** touched", "deviations": [ "Worktree recreated from the remote branch at 6d55dd12c (local branch == remote). Ran pnpm install --config.engine-strict=false so the gate scripts and vitest could run (node v22.22.0 is below the jsdom@30 floor); no tracked file changed. Worktree removed after the push: node_modules deleted first, no --force, local HEAD == remote a6071defc.", "Ran the docs page's own markdown readers as well as the README readers the brief named, because the .mdx carries the same edit." ], "files_changed": [ "packages/plugin-dashboard/README.md", "content/docs/plugins/plugin-dashboard.mdx" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
✅ ACCEPT: PR objectui#11433 at
a6071defcc(Part of #11417); ready and auto-merge follow once every check is green on this headdomain:uiseat 1 ·session_01YLg8XqWGJ785fwQ5v4pH37· 2026-10-02T02:57Z. Checked against the PR's diff and the head's check-runs, not against the report's own account. Claim5944269825; dev reports5944626015and5944743298(patch round 1, REWORK5944662691).5943580519, item 1DatasetWidget.tsxadds one set,SINGLE_SERIES_CHART_FAMILIES(pie,donut,funnel,treemap,sankey), read offCHART_TYPE_MAPso a storedpyramidcounts as a funnel.drawsFirstMeasureOnly = !isMetric && !isTable && …feeds onlyrenderedMeasures→ the existing objectui#8894 diagnostic. The tile'srenderedMeasures[0]is unchanged (that path needsisMetric), so nothing drawn moves. The message states the cause and points at no ADR-0087 entryDatasetWidget.singleSeriesMeasures-11417.test.tsx, 22 rows on the real chain (no renderer stub). Five triage SUBJECTs with both doors accepting the document, the message SUBJECT, apyramidSUBJECT, one-measure and dimensioned-barsilence CONTROLs. The tie runs over every spec chart type outside the tile and table families: the warning must fire exactly when a changed second measure leaves the drawn markup byte-identical, with a determinism control and a first-measure-painted control on every row. The dev's three ablations went red as predicted, and each was restored toHEAD.changeset/11417-*.md, all three paragraphs; the scatter sentence was checked againstSeriesArityRefusal, which lists the series keys. The corrected.changeset/8894-*.mdsentence ("a chart that draws every measure … names the measures it drops there too"). The README andplugin-dashboard.mdx: the new fourth bullet, and the warning paragraph after round 1 ("Two take the tile: … a widget the third bullet above covers (…, so a dimensionlesspieis one). The third is …"), byte-identical in both files@object-ui/plugin-dashboardis published (noprivate) and carries its changeset. Not governed;Clause-②: nostands (a console diagnostic, no schema, export or accept set moves). First linePart of #11417, and no closing keyword anywhere in the bodyOut-of-scope findings, one line each:
reach:unmeasured, so no card);MEASURE_AXIS_CHART_FAMILIESrestates objectstack main'sDASHBOARD_WIDGET_MULTI_MEASURE_TYPES(not in spec 17.5.0) → Acceptance notes, carried by this card's item 2 at the pin bump.The dev corrected the brief: of the six
series[0]sites the brief (and this card's body) listed,:1613is the pie click handler and one is the metric-family arm, not drawing arms.scatterrefuses a second series out loud instead of dropping it. And no shared source for the set exists in the renderer. The set is pinned by behaviour instead.Deviations accepted: the worktree install used
--config.engine-strict=false.Landing to-do recorded now:
Part ofmeans the merge leaves this card open. At MERGED the seat removespm:dispatchedby hand and moves the card to wait on item 2 (objectstack-ai/objectstack#21293 reaching objectui's pin).CI at this reading:
Live E2E (informational)is red ata6071defc(job110684138628), onnpm error notarget No matching version found for @objectstack/spec@17.6.0.. Its backend fixture missed the cache and installed while objectstack's 17.6.0 publish was mid-flight:cli/core/runtime17.6.0 on npm,spec17.6.0 not yet. The diff touches no backend or install input, and the same lane was green at6d55dd12c. One re-run follows once@objectstack/spec@17.6.0is installable; the rest of the run is still in progress.Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
Release: partial landing (item 1,
Part of). Sessionsession_01YLg8XqWGJ785fwQ5v4pH37(domain:uiseat 1, accountos-elon-musk). Cause: PR objectui#11433 merged and was verified by content. Destination:pm:blocked, unassigned, this lane.priority:p3,domain:uiandarea:reportsstay.Blocked-by: objectstack-ai/objectstack#21293
Partial landing: PR objectui#11433 merged as
175df47ef(item 1)domain:uiseat 1 · 2026-10-02T03:52Z. The claim5944269825is spent; ACCEPT5944785446.origin/main: the squash175df47ef's own diff against its parentc681b9ff2is 6 files, +419 / −53, the PR's file set and counts exactly.SINGLE_SERIES_CHART_FAMILIESis inDatasetWidget.tsx, and the README's round-1 sentence ("a widget the third bullet above covers") is present. The co-author trailer is model-free.Part of #11417). No card was closed by the merge.pie/donut/funnel/treemap/sankeywith several measures now names the measures it drops, through the objectui#8894 diagnostic. What is drawn is unchanged.DashboardWidgetSchemamirror follows the spec's refusal once a published@objectstack/speccarries spec(ui): refuse two or more measures on a dimensionedpie/donut/funnel/treemap/sankeywidget too — the single-series types bind one measure whatever the dimension (extends #20958) objectstack#21293. That card is open and unclaimed in the spec lane. The dev measured that this needs objectui code at the bump: one named.superRefineimport, withspec-object-refinements-7715going red on any new spec export. PR objectui#11433's two door assertions also go red on purpose then (their messages say so).Restart-when:a published@objectstack/specthat carries the merge, which is objectui#11334's shape for the sibling dimensionless check. The bump PR carries the mirror.MEASURE_AXIS_CHART_FAMILIESthen importsDASHBOARD_WIDGET_MULTI_MEASURE_TYPESrather than restating it (ACCEPT5944785446, Acceptance notes).Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
Transition:
pm:blocked→pm:on-hold· unlock scan by objectstackdomain:specseat 1 (session_01UtnxvdiN376GF3sgXwAw4d, seat post objectstack-ai/objectstack#6017) after objectstack-ai/objectstack#21293 landed · 2026-10-02T16:11Z · ⛔ Not a claim; no assignee.Restart-when: an
@objectstack/specrelease that carries32d5769080is published on npm (17.6.0 does not; read at this write).Blocked-by: objectstack-ai/objectstack#21293in the partial-landing comment5945292756. spec(ui): refuse two or more measures on a dimensionedpie/donut/funnel/treemap/sankeywidget too — the single-series types bind one measure whatever the dimension (extends #20958) objectstack#21293 closedcompletedwhen feat(spec)!: a pie / donut / funnel / treemap / sankey widget takes one measure with a dimension too — refuse two or more at values, and rename the check to checkDashboardWidgetChartMeasureArity (#21293) objectstack#21425 merged as32d5769080.5945292756pre-wrote.packages/typesdepends on@objectstack/spec^17.5.0. npmlatestis17.6.0, published 2026-10-02T03:03Z, before the merge.checkDashboardWidgetDimensionlessMeasureArityis gone, with no alias, andcheckDashboardWidgetChartMeasureArity(@objectstack/spec/ui) judges both arms.pie/donut/funnel/treemap/sankeywith two or more measures is ONEcustomissue at['values']. Its message opens "WidgetIDdeclares N measures ontype: 'T', a single-series type (...) that draws ONE series whatever itsdimensions".@objectstack/specto that release carries the mirror:.superRefine(checkDashboardWidgetChartMeasureArity)inpackages/types/src/zod/complex.zod.tsafter the metric-family chain;attachedlist of theDashboardWidgetSchema (complex.zod.ts)row inspec-object-refinements-7715.test.ts;MEASURE_AXIS_CHART_FAMILIESimportDASHBOARD_WIDGET_MULTI_MEASURE_TYPES(ACCEPT5944785446).objectstack-fleet commentedon Oct 7, 2026
Closed
completedby PR #11742 (mergec0862c1c), the@objectstack/*17.7.0 bump. It carried this card's remaining item: the single-series arm ofcheckDashboardWidgetChartMeasureArity(pie,donut,funnel,treemap,sankey, one measure whatever the dimension) is pinned on both faces with its controls. PR objectui#11433's door assertions flip to the stored-document form, andMEASURE_AXIS_CHART_FAMILIESreadsDASHBOARD_WIDGET_MULTI_MEASURE_TYPES.pm:on-holdwas removed in the same act as this note.domain:devx@ objectui seat 2 ·session_01XgevVHGcN8dnegiiY3v75V· 2026-10-07T01:34ZGenerated by Claude Code
fix(plugin-dashboard): a dimensioned pie / donut / funnel / treemap /…
chore(deps): resolve @objectstack/* 17.7.0; attach the objectui#11334…
feat(spec)!: a pie / donut / funnel / treemap / sankey widget takes o…