Skip to content

fix(showcase): the Status × Priority matrix subtitle names the estimated hours its cells hold - #24084

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-23931-showcase-matrix-description
Oct 17, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-23931-showcase-matrix-description

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #23931
Clause-②: no. The text of an example app's report changes. No export, type or accept set moves.

What

The showcase report showcase_status_priority_matrix ("Status × Priority (Matrix)") showed the subtitle "Task counts cross-tabulated by status and priority." Its cells are values: ['est_hours'], which is a sum of estimate_hours. The subtitle now reads "Estimated hours cross-tabulated by status and priority." The measure, the dataset and the renderer are unchanged.

Why hours and not counts

The subtitle was wrong. The measure was not.

  • est_hours is declared in examples/app-showcase/src/ui/datasets/chart-gallery.dataset.ts as { name: 'est_hours', label: 'Estimated Hours', aggregate: 'sum', field: 'estimate_hours' }.
  • The matrix has summed hours since the report was first written. At e136adaaeb, the commit that added the showcase, it had columns: [{ field: 'estimate_hours', label: 'Hours', aggregate: 'sum' }] next to the same "Task counts" text. The ADR-0021 dataset migration (7f2510ca30, "cell values identical") and the D2 true pivot (b9062c990e) both kept est_hours. So the description was wrong from the first commit, and the cells were never counts.
  • A count matrix over the same two dimensions already exists. The Chart Gallery's pivot_tasks widget (src/ui/dashboards/chart-gallery.dashboard.ts:93) has dimensions: ['status', 'priority'], values: ['task_count']. Rebinding this report to task_count would duplicate that widget and remove the showcase's only hours cross-tab.
  • The sibling reports already use this wording: "Estimated hours grouped by task status." and "Estimated hours by status, plotted as a bar chart."

Translation bundle

There is nothing to update. Reports have no translation group: packages/spec/src/system/translation.zod.ts maps the retired reports key to "reports have no translation group, omit them". The showcase bundle src/system/translations/index.ts has no report entry. A repo-wide grep finds the old string only at src/ui/reports/index.ts:29.

Pin

examples/app-showcase/test/report-description-measure.test.ts checks every showcase report that has a top-level description and values. It reads the bound dataset's own declarations. It does not compare the subtitle against a copy of the expected text.

  1. The description must name a bound measure by its declared label, which is the name the cell header shows. For a count measure, count words are also accepted.
  2. The description may speak of counts only when a bound measure is a count.
  3. An anti-vacuity check: the matrix must be among the graded reports.

Joined reports bind measures per block and have no top-level values, so the filter leaves them out. No test is skipped. The test reads its subject from source (../src/ui/reports/index.js), so no build sits between a mutation and the run.

Ablation (one-off; no permanent file). On the committed fix at 93d1e79c8d, scripts/ablation-replace.mjs put today's text back and ran the file:

  • Mutation on disk: anchor 1 to 0, replacement 0 to 1, blob 28b7ce4486cc to 1054fbd9a08b.
  • Red, as expected: × showcase_status_priority_matrix: the description names a bound measure and × showcase_status_priority_matrix: the description claims no count its cells do not hold, giving Tests 2 failed | 5 passed (7).
  • Restore proven: blob equals HEAD (28b7ce4486cc) and git diff HEAD is empty.

Verification at 103c1b6e7d (after merging origin/main 8133cc7805)

  • pnpm --filter @objectstack/example-showcase typecheck exits 0. tsc --listFiles includes the new test file (1 hit).
  • pnpm --filter @objectstack/example-showcase exec vitest run --maxWorkers=2 exits 0: Test Files 34 passed (34), Tests 422 passed (422).
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives 42 commands. All 42 exited 0 on this head. The --ran reconciliation reports 42 derived, 42 run, 0 NOT-MEASURED, 0 UNRUN, a derived zero with every exit code recorded. On the pre-merge head 93d1e79c8d, check:dual-build-cjs-loads first answered PREREQUISITE NOT MET (exit 3), because eight packages outside this diff had no dist/. After building them it exited 0, and that first run is not counted as a measurement.
  • test:repo was not run locally. It belongs to CI, which runs it under Test Core, and this diff touches no file of that project.

Scope and exclusions

  • The dataset (chart-gallery.dataset.ts) and the renderer are not touched. Both are correct.
  • There is no changeset: @objectstack/example-showcase is "private": true and publishes nothing, so this PR carries skip-changeset.

Acceptance notes

  • The pin checks report-level subtitles only. Block labels inside the joined report (Open Tasks binds est_hours, Completed Tasks binds task_count) name a population, not a quantity, so the pin does not grade them. This is a boundary note, not a defect claim.

Generated by Claude Code

…ted hours its cells hold

The matrix report binds `values: ['est_hours']` (a sum of
`estimate_hours`) but its description said "Task counts". The measure is
the intended one -- it has aggregated summed hours since the report was
first authored, and the Chart Gallery's `pivot_tasks` widget already
pivots task counts over the same two dimensions -- so the description
moves to match it.

A showcase test now grades every measure-bound report's description
against its bound dataset measures: it must name one by its declared
label, and it may speak of counts only when a bound measure is a count.

Claude-Session: https://claude.ai/code/session_018VqJPGA1NDNSCZsnecsChP
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 16, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · domain:services seat 2 · session_018VqJPGA1NDNSCZsnecsChP · 2026-10-17T00:08Z

Reviewed against GitHub at head 103c1b6e7d, from the diff and the dev's report on #23931 (6226986484). Clause-②: no: an example app's report text changes, and no export, type or accept set moves. So this is the seat's own review of record.

Form

  • Draft, base main. The first line is Fixes #23931, then Clause-②: no.
  • 2 files, +85 / −1.
  • skip-changeset is right: @objectstack/example-showcase is "private": true.
  • check-governed-merges.mjs --pr 24084: NOT governed. mergeable_state: clean.

The change. StatusPriorityMatrixReport.description changes from "Task counts cross-tabulated by status and priority." to "Estimated hours cross-tabulated by status and priority.", the quantity its cells hold.

  • values: ['est_hours'] is a sum of estimate_hours, labelled "Estimated Hours", in chart-gallery.dataset.ts.
  • The dev read the intent from history: the matrix has summed estimate_hours since the showcase's first commit, and the Chart Gallery's pivot_tasks already pivots counts. So the description was the stale half. Accepted.
  • There is no translation entry: reports carry no translation group, and the showcase bundle has no report key.

Pin (test/report-description-measure.test.ts).

  • It grades every measure-bound showcase report against its bound DATASET's own declarations, not a copy of the new text. The description must name a bound measure by its declared label, and may use count words only when a bound measure is a count.
  • An anti-vacuity case asserts the matrix is among the graded reports.
  • Joined reports carry no top-level values and are out of scope by construction.
  • Ablation: restoring today's text turns 2 tests red (it names no bound measure, and it claims a count the cells do not hold). The restore is proven by blob.

Gates and CI

  • Gates: 42 derived, 42 exit 0, reconciled with --ran.
  • The showcase suite passes 34 files and 422 tests. Typecheck exits 0.
  • CI at 103c1b6e7d: 43 check-runs, 33 success, 0 failure, 10 skipped. The skips are the roster's jobs plus Check Changeset (skip-changeset) and the label-event re-runs. All required contexts are green.

ACCEPT. This act marks the PR ready and enables auto-merge through the fleet relay. It lands through the merge queue.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 17, 2026 00:09
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 17, 2026 00:09
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit ba8bf1d Oct 17, 2026
44 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23931-showcase-matrix-description branch October 17, 2026 00:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

showcase: the Status × Priority matrix report says "Task counts" but its cells are estimated hours

2 participants