Repository navigation
Description
Class: b (a public door gives a wrong answer). The author declares a chart, the protocol accepts it, and nothing is drawn.
Reach, measured:
- Spec. A
ReportSchemawithtype: 'matrix', a non-emptycolumnsand achartparses successfully, both at the merge base of PR fix(spec): a joined report draws no chart — retire blocks[].chart and refuse a joined container chart (#20161) #20238 and at its head. PR fix(spec): a joined report draws no chart — retire blocks[].chart and refuse a joined container chart (#20161) #20238 ([finding] a joined report'schart— container andblocks[].chart— parses and is never drawn, while the liveness ledger names the joined branch as its reader #20161) retireschartonly on the JOINED arm and leaves this accept set unchanged. Measured by the at-tier review of PR fix(spec): a joined report draws no chart — retire blocks[].chart and refuse a joined container chart (#20161) #20238, record5856458831, non-blocking item 1. - Renderer, at the objectui pin
f8a9d0fb. InDatasetReportRenderer.tsx, the matrix cross-tab branch returns theDatasetMatrixTableat about :1533. That is before the onlyreport.chartread, at about :1557, so a matrix report with columns never reaches the chart. Measured by the [finding] a joined report'schart— container andblocks[].chart— parses and is never drawn, while the liveness ledger names the joined branch as its reader #20161 dev in the PR fix(spec): a joined report draws no chart — retire blocks[].chart and refuse a joined container chart (#20161) #20238 round-2 report (5858814205, out-of-scope finding 1). NOT re-measured by this seat.
Seam: spec:ReportSchema.chart (matrix with columns) → renderer:DatasetReportRenderer (the matrix cross-tab branch). This is the same family as #20161, which removed the joined arm's never-drawn chart.
What triage decides: the direction under ADR-0049 enforce-or-remove. Either the renderer draws the chart for a matrix report with columns, or the spec refuses chart on that shape with a prescription, as the joined arm now does. Measure real pull first: a matrix report with columns and a chart in examples/**, the showcase, or HotCRM.
Dedupe words: matrix report chart never rendered · DatasetMatrixTable chart ignored · matrix columns chart not drawn.
Filed by the domain:spec seat 4 PM (session_01CiCTczDo7tGhafXjf61dUJ), from the out-of-scope findings of the #20161 round. The dedupe search over this board's issues for "matrix report chart" found no open card.
Activity
objectstack-fleet commentedon Sep 27, 2026
Path: business objects, records and views | 缺项 (no item authors a matrix report with
columnsand achart) | P2Triage: first grade —
bug·priority:p3·domain:spec·area:reports·pm:queue. Verdict: ENFORCE (draw the chart), by the maintainer's criterion, after the pull censusTriage: seam
spec:ReportSchema.chart(matrix withcolumns) → objectuiDatasetReportRenderer(the matrix cross-tab branch returns at about :1533, before the onlyreport.chartread at about :1557) ⇒domain:specparent, dispatched vertically (ruling A′ ②). Rationale: the author declares a chart, the protocol accepts it, and nothing is drawn. That is class (b), with no measured author yet ⇒ p3.Triage seat (objectstack-wide, seat post #6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T20:25Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments), #20161 (closed) and PR #20238 (merged).Verdict. Mainstream matrix reports carry a chart (a Salesforce matrix report with its chart, a Power BI matrix beside a visual). By the criterion (#18900,
5727134555) ⇒ ENFORCE: the renderer draws the chart for a matrix report with columns. This is not #20161's disposition by analogy. That card retired the joined arm's chart, a different shape, and it does not bind this one.Execution notes.
columnsand achartinexamples/**, the showcase or hotcrm. Record the count.fix(spec): a joined report draws no chart — retire blocks[].chart and…
objectstack-fleet commentedon Sep 28, 2026
Dispatch per triage
5859529768: the renderer half is filed as objectstack-ai/objectui#10964, and this card movespm:queue→pm:blockedbehind it ·domain:specseat 1 (session_01B3TqpoQbTAfG7G74GMDWNW) · 2026-09-28T11:24ZDatasetReportRenderer, and the spec seat's part is to file that sub-issue at dispatch. There is noClaim:here, because nothing inpackages/specis edited.origin/main50e273fd:columnsand achart: 0;showcase_status_priority_matrixhascolumnsand nochart;time_trackinghas neither;origin/main95a7c8d38: the matrix-with-columnsbranch returnsDatasetMatrixTableat about :1616, before the chart read at about :1641. The defect stands onmain.Unlock-action: re-check #20293 when label pm:blocked absentis not needed; the standard unlock scan reads the line below.Blocked-by: objectstack-ai/objectui#10964
fix(plugin-report): a matrix report with columns draws its declared c…
objectstack-fleet commentedon Sep 29, 2026
Cross-repo note from the objectui
domain:uiseat 2 (session_011p7ikEivgXefNDaE5S5Uec) · 2026-09-29T04:27Z. ⛔ Not a claim, ⛔ no state change.The renderer half is ACCEPTed and queued: PR objectstack-ai/objectui#11043 (objectstack-ai/objectui#10964) draws a matrix report's declared chart below the cross-tab when the report declares
columns, through the summary arm'schart.xAxis/yAxisbinding; no new binding rule was needed, so note 3's stop valve did not fire. Contract review5883631267on that PR: PASS.One doc-comment word for this card's wrap-up:
packages/spec/src/ui/report.zod.ts, theReportSchema.chartdoc comment, says the chart is plotted "above the report's table". That stays true fortabular/summaryand for a matrix withoutcolumns; for a matrix withcolumnsthe chart now draws below the cross-tab. Doc comment only; the accept set does not change.Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
Restart-when:
.objectui-shaon objectstackmainnames an objectui commit that contains PR objectstack-ai/objectui#11043's merge (objectui#10964)Unlock scan:
pm:blocked→pm:on-hold. The objectui fix has merged, but it is not yet carried by this repo's pinTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-29T06:11Z. ⛔ Not a claim, ⛔ not a dispatch.bug· p3 ·domain:spec·area:reportsunchanged.5868903397):Blocked-by: objectstack-ai/objectui#10964, and the remainder is 「confirm that the pin carrying the fix has moved, and close」.completedat 2026-09-29T04:42Z with PR objectui#11043, which draws a matrix report's declared chart below the cross-tab when the report declarescolumns..objectui-shaisdd3f7e1be356, from before that merge. A cross-repo unlock means the fix is carried here, so the card holds on the line above. This is the treatment spec(object-timeline):itemsstill says "the author owns the item shape" — objectui#6356 declared the timeline element (feed | gantt, judged byvariant) #20283 and sdui-parser (save gate):bindandhiddenjoinBASE_PROPS, the port of objectui#11008, so the save gate stops calling two declared BaseSchema keys unknown #20578 had.At restart (the whole remainder):
5883648783):ReportSchema.chart's comment inpackages/spec/src/ui/report.zod.tssays the chart is drawn 「above the report's table」. That stays true fortabular/summaryand for a matrix withoutcolumns, but a matrix withcolumnsnow draws below the cross-tab.5 remaining items
objectstack-fleet commentedon Sep 30, 2026
Unlock (restart probe run):
pm:on-hold→pm:queue· triage on the maintainer's order · 2026-09-30T06:06ZSession
session_014EJ1ED8X4MMrT18BhVx4tx(os-tesla). ⛔ Not a claim, ⛔ not a dispatch.Restart-when:line in5884723430asks for a pin that contains PR objectui#11043's merge (objectui#10964). RESTcompare 49f76725aa...db11afd4967canswersahead,behind_by 0: met..objectui-shaonmainisdb11afd4967cd9d39381c5e21dc2deec9d706204, since PR chore(objectui): bump the console pin to db11afd4967c (carries objectui#11119, the objectui#11105 fix) #20706 (Bump .objectui-sha past objectui a5841be351 (objectui#11028), which also carries objectui#11008 and objectui#10964 — the one pin move #20287, #20578 and #20293 wait on #20638) landed asa3d7588b56.5884723430's. Fix the one doc-comment word the objectui seat flagged (5883648783):ReportSchema.chart's comment inpackages/spec/src/ui/report.zod.tssays the chart is drawn 「above the report's table」, which is no longer true for a matrix withcolumns(drawn below the cross-tab). Then close. The accept set does not change. The comment edit is on a review face (packages/spec/src/**), so it owes an at-tier record on its landing head (the director's reminder5904102495on [PM seat] domain:spec · seat 2 — ⏳ vacant #18549).pm:on-hold→pm:queue, unassigned. The body's staleBlocked-by: objectstack-ai/objectui#10964line is removed. p3,domain:spec, unchanged.Provenance (whose instruction / verbatim / where): the maintainer, in session
session_014EJ1ED8X4MMrT18BhVx4tx's chat: 「等这个 pin 的 6 张卡(#20287、#20578、#20293、#20313、#20299、#20694)现在可以跑各自的重启探针了。你负责处理」, clarified as 「不是让你派发」「你是让你处理这几个卡的分诊」.Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Claim: PM loop round 21 (the remainder named by the restart probe
5905191024: one doc comment, then close) · 2026-09-30T09:11ZSession:
session_01Sfe5YjBLwB9J3y8fvm2xq1Account:
os-justin(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-20293-matrix-chart-doc-commentWorktree:
objectstack-issue-20293Domain:
domain:specSeat:
domain:spec#5(seat post #19357)Clause-②: no (a doc comment; the accept set does not change)
Remainder:
packages/spec/src/ui/report.zod.ts:465, theReportSchema.chartdoc comment, says the chart is plotted "above the report's table". At the pindb11afd4967c, objectui#11043 draws a matrix report's chart BELOW the cross-tab when the report declarescolumns(the objectui seat's note5883648783). The comment should say what holds for each shape and nothing more. The dev checks it against the renderer at the pin.File surface (stop on breach and explain it in the report):
packages/spec/src/ui/report.zod.ts: that one doc comment.packages/spec/liveness/report.json: thechartrow, only if its evidence or note is now false about the matrix branch..changeset/: one@objectstack/specpatch, because the comment ships in the published types.Container & model:
S,mode:subagent,model: opus.Review: an at-tier contract review is owed (a doc comment an author reads).
Thread-read: 5905191024
Serial constraints cleared: read at this stamp, 12 PRs are open and none touches
report.zod.tsorliveness/report.json.Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
os-dev-report
{ "issue": 20293, "status": "done", "branch": "claude/issue-20293-matrix-chart-doc-comment", "pr": "https://github.com/objectstack-ai/objectstack/pull/20837", "session": "session_01Sfe5YjBLwB9J3y8fvm2xq1", "premise_still_valid": true, "summary": "Rewrote the ReportSchema.chart doc comment (packages/spec/src/ui/report.zod.ts:463-470) so that each shape states only what DatasetReportRenderer does at the pin: above the table for tabular, summary and a matrix without columns, below it for a matrix with columns, and refused on joined. The prose went from 54 words / 328 chars to 52 / 316, with the same 6 comment lines. Offsetting the added clause meant dropping the joined sentence's past-tense \"so a chart there parsed and plotted nothing\", which no longer holds because the key is refused today. Also added one @objectstack/spec patch changeset (.changeset/report-chart-matrix-placement-comment.md, no tracker number, Clause-②: no). No generated artifact and no liveness row changed. Correction to the premise wording \"the comment ships with the published types\": the TSDoc lands in none of the .d.ts files (0 of the 18 dist hits). It ships in files[] src/**/*.zod.ts and in the dist JS bundles, so the patch changeset is still owed. The branch merged origin/main 73155fedca (4 commits; 22 spec liveness JSONs, not report.json) before the PR opened. Labels: none written, because the dispatch named none and skip-changeset does not apply. The PR now carries documentation, size/s, tooling and protocol:ui, all from the labeler, and assignee os-justin (mine). The at-tier contract review the restart probe names is still owed on the landing head. It is the seat's.", "pin_checks": { "ancestry": "git -C objectui merge-base --is-ancestor 49f76725aa db11afd4967c: exit 0. A positive answer proves itself even on this shallow clone. .objectui-sha on the branch = db11afd4967cd9d39381c5e21dc2deec9d706204.", "tabular": "objectui packages/plugin-report/src/DatasetReportRenderer.tsx at the pin db11afd4967c: resolveReportPresentation :727 maps it to 'tabular'. crossTab (:1621) is false, so the JSX at :1687-1688 renders chart then table: chart ABOVE DatasetReportTable.", "summary": "objectui packages/plugin-report/src/DatasetReportRenderer.tsx at the pin db11afd4967c: same path as tabular (withTotals :1672): chart ABOVE the grouped table.", "matrix_without_columns": "objectui packages/plugin-report/src/DatasetReportRenderer.tsx at the pin db11afd4967c: crossTab = presentation === 'matrix' && across.length > 0 (:1621) is false. It degrades to DatasetReportTable withTotals (:1672), and the chart sits ABOVE it (:1687-1688).", "matrix_with_columns": "objectui packages/plugin-report/src/DatasetReportRenderer.tsx at the pin db11afd4967c: crossTab is true, and :1687-1688 renders DatasetMatrixTable then the chart: chart BELOW the cross-tab. The header doc :29-31 says the same, and the pin test DatasetReportRenderer.matrixChart-10964.test.tsx:102 asserts the chart follows the cross-tab (compareDocumentPosition, :99).", "joined": "objectui packages/plugin-report/src/DatasetReportRenderer.tsx at the pin db11afd4967c: the joined branch (:1550) returns the block stack before the only report.chart read (chartCfg :1634-1636). No block reads a chart. The spec refuses container chart on joined (report.zod.ts superRefine, JOINED_CONTAINER_CHART_REFUSED) and a block has no chart key." }, "comment_before": "Visualization — an embedded chart plotted from the bound dataset (`xAxis` names a dimension, `yAxis` a measure) above the report's table. / Refused on a `joined` report (#20161): a joined report draws each block as a table and never reads `chart`, and a block has no `chart` key — so a chart there parsed and plotted nothing.", "comment_after": "Visualization — an embedded chart plotted from the bound dataset (`xAxis` names a dimension, `yAxis` a measure) above the report's table, or below it for a `matrix` report with `columns`. / Refused on a `joined` report (#20161), which draws each block as a table and never reads `chart`; a block has no `chart` key.", "generated_artifacts": "None changed. The TSDoc feeds neither the reference docs nor the JSON schema; both take .describe(), which is unchanged. git grep for the old phrase hit only report.zod.ts. I ran the repo's own generators, pnpm --filter @objectstack/spec gen:schema && gen:docs (VERDICT command-exit 0, \"Generated 226 files\"), and git status was empty afterwards. check:generated reported \"All 15 generated artifacts are up to date\" at both e57c38f375 and e974c16441. The only built change is the comment text inside 18 dist JS bundles (build output, not tracked).", "liveness_report_json": "Unchanged. The chart row has no evidence field, and its note says nothing about the matrix branch. It says the chart is live on NON-joined reports only, and that the one report.chart read at DatasetReportRenderer.tsx:1557 sits after the joined return :1462-1524 at the explicitly named pin f8a9d0fb. I re-read that pin: the joined branch is at :1462, and the chartCfg read at :1557-1558. At db11afd4967c every non-joined shape draws the chart, so \"live on NON-joined reports only\" still holds.", "tests": "Every heavy run went through os-verify-lock (VERDICT lines quoted). At e57c38f375: pnpm --filter @objectstack/spec build, VERDICT command-exit 0. check:generated, VERDICT 0, 15/15 up to date. gen:schema && gen:docs, VERDICT 0, zero diff. typecheck (tsc --noEmit + check:scripts-typecheck + check:test-typecheck), VERDICT 0, \"check:test-typecheck: OK\". vitest over 8 report-related files, \"Test Files 8 passed (8) / Tests 554 passed (554)\". Full spec vitest, \"Test Files 578 passed (578) / Tests 17065 passed | 1 todo\". After the merge, at e974c16441 (the final head): build + check:generated, VERDICT 0, 15/15 up to date. Full spec vitest, VERDICT command-exit 0, \"Test Files 578 passed (578) / Tests 17065 passed | 1 todo (17066)\". The typecheck was not re-run after the merge: the merge brought only 22 JSON files into packages/spec, and no .ts. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 78 commands, the same list at both heads. All 78 ran at e974c16441 with exit codes captured before any pipe: 75 exit 0 (check:nul-bytes and check:liveness among them). 3 exit 3 are PREREQUISITE NOT MET, recorded as NOT MEASURED: check:doc-formula-expressions (@objectstack/formula not built), check:dual-build-cjs-loads (no dist for 80+ packages, needs pnpm build) and check:lean-entry-closure (objectql dist absent). None of those three reads the spec source this diff edits. The reconciliation, dispatch-gates --ran, reads \"78 derived famil(ies) accounted for — 75 run, 3 NOT-MEASURED (3 DERIVED from a recorded exit 3)\". Ablation or reverse verification: not applicable, because a doc comment has no behaviour to invert.", "ci": "Check runs on e974c16441, deduped by name, read at 2026-09-30T10:21Z: 32 names in total. 12 success: Auto Label, Check Changeset, Check Documentation Links, Check PR Size, Flag docs affected by code changes, Governed Surface Queue Guard, the three claim/closing guards, Part-of PR must not also close its card, Spec property liveness, filter. 3 skipped: Build Docs (ci.yml filter output docs is false for these paths), Console Pin Gate (filter output console is false: no pin or console path touched) and Packed-tarball smoke (opt-in) (it runs only with the needs:pack-smoke label, which is absent). 17 in_progress, recorded honestly and not waited on: Build Core, Dogfood Regression Gate 1-3/3, Dogfood Verify CLI, Lint & Repo Gates, Temporal Conformance (live PG + MySQL), Test Core 1-6/6, and Type Check (consumer gates, debt ledger, source gates, workspace).", "mcp_calls": "0", "api_writes": "3. Each is one POST /repos/objectstack-ai/objectstack/dispatches through the fleet-write relay, executed as objectstack-fleet[bot]. (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls, which opened #20837 as a draft; the body read back identical, 1238/1238 bytes. (2) assign via label-write.mjs → POST /repos/objectstack-ai/objectstack/issues/20837/assignees [os-justin]; the read-back MATCHES. (3) comment → POST /repos/objectstack-ai/objectstack/issues/20293/comments, which is this report. Also 3 git pushes (empty branch, commit, merge), which are not REST.", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed. Observation, not class a/b/c: at the pin, planReportChart (DatasetReportRenderer.tsx:~800) maps the chart types table and pivot to kind tabular, and DatasetReportChart returns null for that kind (:1040), because the report's own table IS the rendering. So for those two chart types nothing is drawn above or below the table. The doc comment speaks of report shapes, not chart types, and the renderer documents this by design. Dedupe words: report chart type table pivot draws nothing · planReportChart tabular kind" ] }Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Ruling on the report
5909299626· 2026-09-30T10:23Zdomain:specseat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1), holder of claim5908002130. Draft PR #20837 ate974c16441.Accepted as delivered:
DatasetReportRendererat the pindb11afd4967c. The chart is above the table fortabular,summary, and amatrixwithoutcolumns, and below the table for amatrixwithcolumns.joinedis refused. The comment is two words shorter, and it drops the past-tense clause that no longer holds.report.json: unchanged, correctly. Itschartrow says "live on non-joined reports only", which still holds..d.tsfiles. It ships in thesrc/**/*.zod.tsfiles the package publishes, and in the dist bundles, so thepatchchangeset is still owed.Next:
needs:contract-reviewgoes on the PR and this card, and the at-tier review runs once CI is green.Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Landed: PR #20837 →
1741c5dcb6; the remainder is done and the card closes · 2026-09-30T11:16Zdomain:specseat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1), holder of claim5908002130.1741c5dcb6, with one parent,93e9e4263c.git patch-id --stableas the reviewed heade974c16441against its merge base73155fedca.5909680409was taken ate974c16441, which is the head that landed.ReportSchema.chartdoc comment says where each shape draws its chart, asDatasetReportRendererdoes at the pindb11afd4967c:tabular,summaryand amatrixwithoutcolumns;matrixwithcolumns(objectui#11043);joined.5905191024named.Closes #20293did not close it through the merge queue.Generated by Claude Code
fix(plugin-report): a matrix report with columns draws its declared c…
docs(spec): ReportSchema.chart says the chart draws below a matrix cr…