Skip to content

[finding] A type: 'matrix' report with columns and a chart parses, and the pinned renderer never draws the chart #20293

Closed

Description

@objectstack-fleet

Class: b (a public door gives a wrong answer). The author declares a chart, the protocol accepts it, and nothing is drawn.

Reach, measured:

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

  1. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: business objects, records and views | 缺项 (no item authors a matrix report with columns and a chart) | P2

    Triage: first grade — bug · priority:p3 · domain:spec · area:reports · pm:queue. Verdict: ENFORCE (draw the chart), by the maintainer's criterion, after the pull census

    Triage: seam spec:ReportSchema.chart (matrix with columns) → objectui DatasetReportRenderer (the matrix cross-tab branch returns at about :1533, before the only report.chart read at about :1557) ⇒ domain:spec parent, 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.

    1. Take the pull census first, as the card asks: a matrix report with columns and a chart in examples/**, the showcase or hotcrm. Record the count.
    2. The objectui renderer draws the chart beside or below the cross-tab. The spec seat files the objectui sub-issue at dispatch, and the spec's accept set does not change.
    3. ⛔ Stop valve: if the renderer cannot draw a chart for a cross-tab without a new chart-binding rule, stop and report here; do not invent one.
  2. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch per triage 5859529768: the renderer half is filed as objectstack-ai/objectui#10964, and this card moves pm:queue → pm:blocked behind it · domain:spec seat 1 (session_01B3TqpoQbTAfG7G74GMDWNW) · 2026-09-28T11:24Z

    • Why no spec dispatch. Triage's note 2 reads: 「the spec's accept set does not change」. The ENFORCE lands in objectui's DatasetReportRenderer, and the spec seat's part is to file that sub-issue at dispatch. There is no Claim: here, because nothing in packages/spec is edited.
    • Pull census (triage's note 1), on objectstack origin/main 50e273fd:
      • matrix reports with both columns and a chart: 0;
      • showcase_status_priority_matrix has columns and no chart;
      • app-todo's time_tracking has neither;
      • the control: 6 and 5 other report-type literals in the same two files;
      • hotcrm: NOT MEASURED (not reachable from this seat).
    • Re-measured on objectui origin/main 95a7c8d38: the matrix-with-columns branch returns DatasetMatrixTable at about :1616, before the chart read at about :1641. The defect stands on main.
    • Unlock: when objectui#10964 closes, this card's remainder is to confirm that the pin carrying the fix has moved, and close. Unlock-action: re-check #20293 when label pm:blocked absent is not needed; the standard unlock scan reads the line below.

    Blocked-by: objectstack-ai/objectui#10964

  3. objectstack-fleet commented on Sep 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-repo note from the objectui domain:ui seat 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's chart.xAxis / yAxis binding; no new binding rule was needed, so note 3's stop valve did not fire. Contract review 5883631267 on that PR: PASS.

    One doc-comment word for this card's wrap-up: packages/spec/src/ui/report.zod.ts, the ReportSchema.chart doc comment, says the chart is plotted "above the report's table". That stays true for tabular / summary and for a matrix without columns; for a matrix with columns the chart now draws below the cross-tab. Doc comment only; the accept set does not change.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Restart-when: .objectui-sha on objectstack main names 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 pin

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-29T06:11Z. ⛔ Not a claim, ⛔ not a dispatch. bug · p3 · domain:spec · area:reports unchanged.

    At restart (the whole remainder):

    • Confirm that the pin contains the merge.
    • Fix the one doc-comment word the objectui seat flagged (5883648783): ReportSchema.chart's comment in packages/spec/src/ui/report.zod.ts says the chart is drawn 「above the report's table」. That stays true for tabular / summary and for a matrix without columns, but a matrix with columns now draws below the cross-tab.
    • Then close. The accept set does not change.
  5. 5 remaining items

  6. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock (restart probe run): pm:on-hold → pm:queue · triage on the maintainer's order · 2026-09-30T06:06Z

    Session session_014EJ1ED8X4MMrT18BhVx4tx (os-tesla). ⛔ Not a claim, ⛔ not a dispatch.

    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

  7. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 21 (the remainder named by the restart probe 5905191024: one doc comment, then close) · 2026-09-30T09:11Z
    Session: session_01Sfe5YjBLwB9J3y8fvm2xq1
    Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-20293-matrix-chart-doc-comment
    Worktree: objectstack-issue-20293
    Domain: domain:spec
    Seat: 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, the ReportSchema.chart doc comment, says the chart is plotted "above the report's table". At the pin db11afd4967c, objectui#11043 draws a matrix report's chart BELOW the cross-tab when the report declares columns (the objectui seat's note 5883648783). 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.
    • Anything generated from it (the reference docs, JSON schema descriptions), regenerated only.
    • packages/spec/liveness/report.json: the chart row, only if its evidence or note is now false about the matrix branch.
    • .changeset/: one @objectstack/spec patch, 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.ts or liveness/report.json.

    Generated by Claude Code

  8. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  9. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling on the report 5909299626 · 2026-09-30T10:23Z

    domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1), holder of claim 5908002130. Draft PR #20837 at e974c16441.

    Accepted as delivered:

    • The comment: each report shape is checked against DatasetReportRenderer at the pin db11afd4967c. The chart is above the table for tabular, summary, and a matrix without columns, and below the table for a matrix with columns. joined is refused. The comment is two words shorter, and it drops the past-tense clause that no longer holds.
    • report.json: unchanged, correctly. Its chart row says "live on non-joined reports only", which still holds.
    • The claim's premise, corrected: the TSDoc is not in the .d.ts files. It ships in the src/**/*.zod.ts files the package publishes, and in the dist bundles, so the patch changeset is still owed.

    Next: needs:contract-review goes on the PR and this card, and the at-tier review runs once CI is green.


    Generated by Claude Code

  10. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #20837 → 1741c5dcb6; the remainder is done and the card closes · 2026-09-30T11:16Z

    domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1), holder of claim 5908002130.

    • Landed: PR docs(spec): ReportSchema.chart says the chart draws below a matrix cross-tab #20837 merged through the merge queue at 2026-09-30T11:15Z as 1741c5dcb6, with one parent, 93e9e4263c.
    • Content check: both files have the same git patch-id --stable as the reviewed head e974c16441 against its merge base 73155fedca.
    • Review: the at-tier PASS 5909680409 was taken at e974c16441, which is the head that landed.
    • Delivered: the ReportSchema.chart doc comment says where each shape draws its chart, as DatasetReportRenderer does at the pin db11afd4967c:
      • above the table for tabular, summary and a matrix without columns;
      • below the cross-tab for a matrix with columns (objectui#11043);
      • refused on joined.
    • Card state: the ENFORCE half (objectui#10964) was already carried by the pin. This was the last remainder the restart probe 5905191024 named.
    • Why the seat closes the card: the PR's Closes #20293 did not close it through the merge queue.

    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

No one assigned

    Labels

    area:reportsBusiness reporting — dashboards, reports, the numbers a manager readsbugSomething isn't workingdomain:specpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions