Repository navigation
Closed
Labels
Description
Round 2 of the 18.0 release sweep for dashboards: re-judges on ba4afcc2 the clauses round 1 (#24573, subject 5b14b7f3) left unjudged and that this environment can drive (A class); every other verdict is carried forward from #24573 below. Supersedes #24573 under checklist-test SKILL §5. Wave anchor: #24579.
Environment fingerprint
- framework
ba4afcc2391922a86678bf5e47b1a0e4d2c87ff1(pinned; one commit after round 1's5b14b7f3, a release-script fix —git diff 5b14b7f3 ba4afcc2 -- docs/qa/platform-checklist/is empty, so every item revision is unchanged and carried verdicts stay revision-valid) - console
.objectui-sha4016370af3c9c9dafec2bc5299afd8e8079701b8, built withpnpm objectui:build(deps--concurrency=2);packages/console/dist/.objectui-shastamp equals the pin - app: showcase, canonical boot
OS_PORT=PORT pnpm -C examples/app-showcase exec objectstack dev --ui --seed-admin -p PORT -d file:/tmp/qa2/LABEL/ITEM.db; own port + file DB per runner/item; scratch app copies for metadata-writing items; seed--seed-admin+ showcase seed - browser: Playwright,
executablePath /opt/pw-browsers/chromium, one context per runner, form sign-in - timestamps 2026-10-19: environment prep 14:12–14:44 UTC (cold tree: install 39 s,
pnpm build10m20s, console build ~25 min); testing 15:35–15:45 UTC - execution: one browser runner sub-agent (one Playwright context) on :47571, form sign-in
Scope
- selector
dashboards— 10 items (resolver-runnable set; planned/blocked items as in QA run · dashboards (6/10) · 5b14b7f3 · 2026-10-19 · 4 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 4 NOT-RUN #24573). Revisions per item are those recorded in QA run · dashboards (6/10) · 5b14b7f3 · 2026-10-19 · 4 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 4 NOT-RUN #24573 (unchanged at ba4afcc). - Re-judged this round (A class):
dashboards.dataset-report-authoring— acceptance[2], [6], [7], negative[0], [1] (UI half)dashboards.empty-null-bucket-boundaries— acceptance[0], [5], negative[0], [1] (UI half)
Round-2 per-clause verdicts (ba4afcc)
Each line: item revN · clause · verdict · text oracle evidence.
- dashboards.dataset-report-authoring rev2 · acceptance[2] · pass ·
PUT /api/v1/meta/dashboard/qa_designer_probe?mode=draftwas layout-less (metric task_count, bar status, donut priority). It returned 200 state=draft, andPOST …/publishreturned 200 seq=2. Screenshot of/_console/apps/showcase_app/dashboard/qa_designer_probe: all 3 widgets are drawn in an auto-flowed grid. The tile reads "Total Tasks 10", the bar chart shows 5 status bars at 2 each, and the donut has 4 priority slices. These match the three livePOST /api/v1/analytics/dataset/queryanswers: task_count 10, 5×2, and High 3 / Low 1 / Medium 4 / Urgent 2. - dashboards.dataset-report-authoring rev2 · acceptance[6] · pass · Screenshot of "Hours by Status (Chart)": the bar heights are about 30, 36, 100, 54 and 24. They match the table under the chart (Backlog 30.0, To Do 36.0, In Progress 100.0, In Review 54.0, Done 24.0, Total 244.0). The page makes two queryDataset calls, a plain dimensions[status]×est_hours and a second one with totals, and both return the same rows.
- dashboards.dataset-report-authoring rev2 · acceptance[7] · pass · I captured one screenshot per variant, each with its query:
- summary (Hours by Status): 5 rows, total 244.0.
- matrix (Status × Priority): a true pivot with Low/Medium/High/Urgent columns, row and column totals, and a grand total of 244.0. The cells (e.g. In Progress×Urgent 60, Backlog×Low 12, In Review×High 54) equal the dimensions[status,priority] query rows.
- joined (Task Overview): both blocks render. "Open Tasks" is est_hours under runtimeFilter done:false, total 220.0. "Completed Tasks" is task_count under done:true, total 2.
- tabular: through the "Task List" nav node. It routes to
/_console/apps/com.example.showcase/showcase_task/view/tabularand the grid shows 10 records. Per the ADR-0021 Phase 2 rationale, tabular is a ListView lens, not a report.
- dashboards.dataset-report-authoring rev2 · negative[0] · pass ·
PUT /api/v1/meta/report/qa_bad_joined(both ?mode=draft and live) used the seeded joined shape with blocks[0].type='joined'. Both returned 422 INVALID_METADATA "blocks.0.type: Invalid option: expected one of "tabular"|"summary"|"matrix"", and the follow-up GET returned 404 (nothing saved). Control: the same body with valid block types returned 200. - dashboards.dataset-report-authoring rev2 · negative[1] · pass · A dangling binding never reaches a render. Draft saves are accepted (200), but publish refuses loudly:
- a dashboard with dataset 'qa_no_such_dataset' → 422
widget-dataset-unknown("does not resolve to a declared dataset", with the declared list as a hint); - a report → 422
chart-dataset-unknown("there is no data to render"); - unknown measure and dimension names → 422
widget-measure-unknownandwidget-dimension-unknown.
The console route for each then shows the designed "Dashboard Not Found" / "Report Not Found" state, not a blank widget. A direct dataset query for the name returns 404 NOT_FOUND.
- a dashboard with dataset 'qa_no_such_dataset' → 422
- dashboards.empty-null-bucket-boundaries rev1 · acceptance[0] · pass · On Delivery Operations I set a custom range of 2020-03-02 to 2020-03-08 through the calendar. Screenshot: all 4 KPI tiles read 0. Every chart and the table show the designed "No data yet — This widget loaded successfully and its query returned no records yet. Source: DATASET" state. There is no axis-only plot and no pre-filter value left over. After sign-in the console capture had no errors and no pageerror; the only two console errors were 401/404 resource loads on the pre-login shell.
- dashboards.empty-null-bucket-boundaries rev1 · acceptance[5] · pass (single-datapoint weakness noted) · I reset to the last 90 days and set Task Status = To Do. The trend query was runtimeFilter {created_at 2026-07-21..2026-10-19, status todo}, answering rows [{created_at:"2026-10", task_count:2}]. Screenshot: "Task Throughput (monthly)" draws one lone point at 2026-10, value 2, on a 0–4 axis. ⚠ single-datapoint: this proves the lone mark renders, not bucketing breadth.
- dashboards.empty-null-bucket-boundaries rev1 · negative[0] · pass · The default board's line_created query returned [{2026-09:3},{2026-10:7}]. That equals the seed ground truth: the GET /data created_at values span exactly 2026-09 and 2026-10. Screenshot: the line chart has 2 points, at 3 and 7, with x-labels 2026-09 and 2026-10. It is not collapsed. The seed is thin, though: only two months.
- dashboards.empty-null-bucket-boundaries rev1 · negative[1] · pass · The network trace shows every one of the 9 widget queries re-issued with the new bounds
created_at {$gte:"2020-03-02",$lte:"2020-03-08"}. There was an intermediate same-day query on the first click, then the full week. Responses were rows [] or 0, and the repaint shows those zeros and empty states. No widget kept its earlier value (2 / 1 / 2 / 1,090,000).
Reproduction rules (fails)
No round-2 clause scored fail.
Carried forward from #24573 (verdicts valid for 5b14b7f3, same item revisions)
Carried-forward: #24573 · dashboards.strict-widget-rejects-stray-keys · PASS
Carried-forward: #24573 · dashboards.chart-first-paint · NOT-RUN
Carried-forward: #24573 · dashboards.drill-through-range · NOT-RUN
Carried-forward: #24573 · dashboards.chart-type-matrix · PASS
Carried-forward: #24573 · dashboards.dataset-report-authoring · PARTIAL at 5b14b7f3 for every clause except those re-judged above
Carried-forward: #24573 · dashboards.empty-null-bucket-boundaries · PARTIAL at 5b14b7f3 for every clause except those re-judged above
Carried-forward: #24573 · dashboards.global-filters-rescope · PASS
Carried-forward: #24573 · dashboards.system-overview-live-counts · NOT-RUN
Carried-forward: #24573 · dashboards.cube-query · NOT-RUN
Carried-forward: #24573 · dashboards.analytics-exposure-gate-and-measure-aggregate · PASS
FAIL items carried forward keep their round-1 disposition and extraction lines on #24573 (re-point rows on #24579 §1, defect cards as listed there).
Derived item verdicts (round-2 clauses + carried clauses)
dashboards.strict-widget-rejects-stray-keys— PASSdashboards.chart-first-paint— NOT-RUNdashboards.drill-through-range— NOT-RUNdashboards.chart-type-matrix— PASSdashboards.dataset-report-authoring— PASS (changed: was PARTIAL)dashboards.empty-null-bucket-boundaries— PASS (changed: was PARTIAL)dashboards.global-filters-rescope— PASSdashboards.system-overview-live-counts— NOT-RUNdashboards.cube-query— NOT-RUNdashboards.analytics-exposure-gate-and-measure-aggregate— PASSdashboards.empty-null-bucket-boundariesacceptance[5] rests on a single datapoint (Task Status = To Do, one bucket 2026-10 value 2) —single-datapointtrap noted in the evidence; the seed spans two months only.
Product defects (extraction)
None extracted from this round.
Checklist-accuracy findings / fixture gaps
For the wave anchor #24579 (not extracted).
- dataset-report-authoring negative[1] — where the guard actually sits. Draft saves with a dangling dataset, measure or dimension are accepted (200). The refusal lands at publish (422 author-time rules widget-dataset-unknown, widget-measure-unknown, widget-dimension-unknown and chart-dataset-unknown), so "blank-without-error" cannot be reached through publish. Name the publish door as the place the negative is enforced.
- empty-null-bucket-boundaries steps[1] — setting a 2020 window is slow. The only way in is the calendar under "Custom…", which opens on the current month. Reaching March 2020 took 79 "Go to the Previous Month" clicks. Picking the first day fires an intermediate one-day query before the range completes.
- empty-null-bucket-boundaries — the seed is still thin. It spans 2 created_at months (2026-09: 3 tasks, 2026-10: 7). The single-bucket shape comes from Task Status = To Do or Backlog (both only in 2026-10).
- Console route spelling.
/_console/apps/showcase_app/...works for dashboards and reports. The Task List nav lands on/_console/apps/com.example.showcase/showcase_task/view/tabular, so both spellings resolve.
Handover (not judged on ba4afcc)
dashboards.chart-first-paint— NOT-RUN, Tier 3 deferred by the 18.0 sweep plan (carried from QA run · dashboards (6/10) · 5b14b7f3 · 2026-10-19 · 4 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 4 NOT-RUN #24573)dashboards.drill-through-range— NOT-RUN, Tier 3 deferred by the 18.0 sweep plan (carried from QA run · dashboards (6/10) · 5b14b7f3 · 2026-10-19 · 4 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 4 NOT-RUN #24573)dashboards.system-overview-live-counts— NOT-RUN, Tier 3 deferred by the 18.0 sweep plan (carried from QA run · dashboards (6/10) · 5b14b7f3 · 2026-10-19 · 4 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 4 NOT-RUN #24573)dashboards.cube-query— NOT-RUN, Tier 3 deferred by the 18.0 sweep plan (carried from QA run · dashboards (6/10) · 5b14b7f3 · 2026-10-19 · 4 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 4 NOT-RUN #24573)
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 19, 2026
Parked-on: #24579 · this record's checklist-accuracy findings, fixture gaps and B-class parked clauses (wave anchor §2–§4)
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Closed by: the 18.0 QA wave dispatch session
session_01CfRDy7SuTfUqaTu2AEH2Hi, on the maintainer's instruction there on 2026-10-19, verbatim 「qa-run的卡片处理完的是不是可以关闭」. Closure complete (checklist-test §5): every FAIL in this record has a disposition (theExtracted:/Parked-on:lines on this record), and its partial coverage gaps and not-run handover are parked on #24579.Generated by Claude Code