Follow-on to #10454. Once the two metadata read-door defects were confirmed fixed on 17.1.0, the clauses they had been blocking became testable for the first time. This round drives exactly those. All four items now pass; no fail.
Companions: #10224 · #10225 · #10233 · #10245 · #10248 · #10257 · #10342 · #10454. Anchor: #10236.
Trigger
Re-test trigger #2 — a fix landed. #10454 confirmed R-1 (runtime-authored dashboard served by no read door) and R-2 (same on view) are fixed. Those two defects carried four downstream verdicts in the 2026-08-18 wave that were never about the items themselves:
dashboards.chart-type-matrix c0/c4/c7 — blocked(product-bug → R-1)dashboards.strict-widget-rejects-stray-keys c5 — fail, via R-1dashboards.global-filters-rescope c6 — fail, via R-1's overlay variantstudio-authoring.view-authoring-live c2/c4 — blocked(dependency) on its own failed c3, which was R-2
Environment
framework 19f98fa1 (17.1.0) · objectui pin + console stamp 9a3daf8d37ad, check:console-sha ✓ · showcase on 3456, fresh file DB · 2026-08-20 21:16–21:45 UTC. Browser via executablePath=/opt/pw-browsers/chromium. Execution mode: SEQUENTIAL, declared.
Results
| item | rev | prior (e4e5c6e3) | now |
|---|
dashboards.chart-type-matrix | 3 | PARTIAL — 16/20 variants | pass — 20/20 |
dashboards.strict-widget-rejects-stray-keys | 2 | FAIL (c5) | pass |
dashboards.global-filters-rescope | 2 | FAIL (c6) | pass |
studio-authoring.view-authoring-live | 1 | FAIL (c3) | pass |
chart-type-matrix — the matrix closes at 20/20
The four variants that were unreachable (kpi / gauge / solid-gauge / bullet) need a scratch dashboard, which R-1 made unrenderable. Re-authored as qa_single_value_gallery:
PUT /api/v1/meta/dashboard/qa_single_value_gallery → 200 {success:true, seq:1, state:"active"}
GET by-name → 200, item present, widget types = [kpi, gauge, solid-gauge, bullet]
GET /api/v1/meta/dashboard → 200, list includes it
browser /_console/apps/com.example.showcase/dashboard/qa_single_value_gallery
→ no "Dashboard Not Found", 0 pageerror, all four widget titles present
Screenshot oracle consulted, not just the DOM: all four tiles render a value of 10, and showcase_task holds exactly 10 rows — the displayed value is server truth, not a placeholder.
Worth recording so the next runner does not read it as a defect: the four tiles are visually identical (plain numeric cards, no gauge arc or bullet track). The clause calls them "four single-value synonyms", so one shared renderer is what the wording describes.
c7 (compareTo): first attempt answered 422 naming the schema — compareTo.kind accepts only previousPeriod | previousYear, and I had sent {period:'previous'}. My payload, not a defect. With the prescribed shape: 200, read back as {"kind":"previousPeriod"}, list includes it, and the dashboard renders with 0 pageerror.
strict-widget-rejects-stray-keys — c5
Prior: the corrected widget published {success:true, seq:3} and then rendered "Dashboard Not Found". Now:
PUT qa_stray_key_probe (dataset + dimensions:[status] + values:[task_count]) → 200 seq:3
GET by-name → 200, item present, widgets = 1
browser → no "Dashboard Not Found", 0 pageerror, title "Tasks by Status" present,
5 .recharts-rectangle marks
5 marks = 5 distinct statuses, matching the wave's own ground truth — so the widget did not merely mount, it bound to the data.
Non-regression control on the same item: re-sent a widget carrying the pre-ADR-0021 inline analytics keys (object + categoryField + valueField + aggregate) → 422 invalid_metadata, still refused. The read-door fix did not loosen the authoring gate that c0–c4 pin.
global-filters-rescope — c6
The overlay half was verified in #10454: re-PUT of the shipped showcase_revenue_pulse with kpi_new_accounts.filterBindings.dateRange → created_at and kpi_invoices.filterBindings → {region:false} now reads back as authored (prior: 200 receipt, re-read still returned the code values). c0–c5 and c7 passed in the prior wave and were not re-driven — no trigger.
Scope honesty: the clause says "Studio inspector authors filterBindings". This round proved the persistence and read-back through the metadata door, not the inspector UI path. The mechanism the clause depends on is fixed; the console-driven half is not re-verified here.
view-authoring-live — c2 and c4 unblocked
Full draft → publish → edit → re-publish cycle, all through the consumer door:
PUT /meta/view/showcase_task.qa_live_<id>?mode=draft → 200 {state:"draft"}
GET by-name while drafted → 404 (c1: no draft leakage, still holds)
publish (PUT without ?mode=draft) → 200
GET by-name → 200, columns = [title, status] (c2)
edit + re-publish (label V2, +priority column) → 200
GET by-name → 200, label "QA Live V2",
columns = [title, status, priority] (c4)
One item deliberately NOT re-run
platform-core.builtin-apps-nav-render (P0) was this round's originally planned target. After reading #9453 I dropped it, and the reason is worth recording rather than leaving as a silent gap:
That wave walked Setup 43/43 and Account 7/7 destinations — 50/50 ok, screenshot-first then DOM, zero pageerror. Its c0/c1/c2 are blocked(fixture) for one reason only: Studio is not installed on the showcase. rev 2 still names three built-in apps, so the ceiling on stock fixtures is unchanged, and c3–c6 already passed there (I independently reproduced c3 in #10257). Re-running it would consume a browser round to reproduce the same partial. It needs a fixture decision — install Studio, or reword the item for a two-app showcase — not another run. That decision is already on #10236.
Gaps for the anchor
Parked-on: #10236 · global-filters-rescope c6 — mechanism verified via the metadata door;
the Studio-inspector UI path remains unverified
Parked-on: #10236 · chart-type-matrix — record in the item that the four single-value
synonyms share one renderer, so identical tiles are expected
Follow-on to #10454. Once the two metadata read-door defects were confirmed fixed on 17.1.0, the clauses they had been blocking became testable for the first time. This round drives exactly those. All four items now pass; no
fail.Companions: #10224 · #10225 · #10233 · #10245 · #10248 · #10257 · #10342 · #10454. Anchor: #10236.
Trigger
Re-test trigger #2 — a fix landed. #10454 confirmed R-1 (runtime-authored
dashboardserved by no read door) and R-2 (same onview) are fixed. Those two defects carried four downstream verdicts in the 2026-08-18 wave that were never about the items themselves:dashboards.chart-type-matrixc0/c4/c7 —blocked(product-bug → R-1)dashboards.strict-widget-rejects-stray-keysc5 —fail, via R-1dashboards.global-filters-rescopec6 —fail, via R-1's overlay variantstudio-authoring.view-authoring-livec2/c4 —blocked(dependency)on its own failed c3, which was R-2Environment
framework
19f98fa1(17.1.0) · objectui pin + console stamp9a3daf8d37ad,check:console-sha✓ · showcase on 3456, fresh file DB · 2026-08-20 21:16–21:45 UTC. Browser viaexecutablePath=/opt/pw-browsers/chromium. Execution mode: SEQUENTIAL, declared.Results
e4e5c6e3)dashboards.chart-type-matrixdashboards.strict-widget-rejects-stray-keysdashboards.global-filters-rescopestudio-authoring.view-authoring-livechart-type-matrix— the matrix closes at 20/20The four variants that were unreachable (
kpi/gauge/solid-gauge/bullet) need a scratch dashboard, which R-1 made unrenderable. Re-authored asqa_single_value_gallery:Screenshot oracle consulted, not just the DOM: all four tiles render a value of 10, and
showcase_taskholds exactly 10 rows — the displayed value is server truth, not a placeholder.Worth recording so the next runner does not read it as a defect: the four tiles are visually identical (plain numeric cards, no gauge arc or bullet track). The clause calls them "four single-value synonyms", so one shared renderer is what the wording describes.
c7 (
compareTo): first attempt answered 422 naming the schema —compareTo.kindaccepts onlypreviousPeriod|previousYear, and I had sent{period:'previous'}. My payload, not a defect. With the prescribed shape: 200, read back as{"kind":"previousPeriod"}, list includes it, and the dashboard renders with 0 pageerror.strict-widget-rejects-stray-keys— c5Prior: the corrected widget published
{success:true, seq:3}and then rendered "Dashboard Not Found". Now:5 marks = 5 distinct statuses, matching the wave's own ground truth — so the widget did not merely mount, it bound to the data.
Non-regression control on the same item: re-sent a widget carrying the pre-ADR-0021 inline analytics keys (
object+categoryField+valueField+aggregate) → 422invalid_metadata, still refused. The read-door fix did not loosen the authoring gate that c0–c4 pin.global-filters-rescope— c6The overlay half was verified in #10454: re-
PUTof the shippedshowcase_revenue_pulsewithkpi_new_accounts.filterBindings.dateRange→created_atandkpi_invoices.filterBindings→{region:false}now reads back as authored (prior: 200 receipt, re-read still returned the code values). c0–c5 and c7 passed in the prior wave and were not re-driven — no trigger.Scope honesty: the clause says "Studio inspector authors
filterBindings". This round proved the persistence and read-back through the metadata door, not the inspector UI path. The mechanism the clause depends on is fixed; the console-driven half is not re-verified here.view-authoring-live— c2 and c4 unblockedFull draft → publish → edit → re-publish cycle, all through the consumer door:
One item deliberately NOT re-run
platform-core.builtin-apps-nav-render(P0) was this round's originally planned target. After reading #9453 I dropped it, and the reason is worth recording rather than leaving as a silent gap:That wave walked Setup 43/43 and Account 7/7 destinations — 50/50
ok, screenshot-first then DOM, zero pageerror. Its c0/c1/c2 areblocked(fixture)for one reason only: Studio is not installed on the showcase. rev 2 still names three built-in apps, so the ceiling on stock fixtures is unchanged, and c3–c6 already passed there (I independently reproduced c3 in #10257). Re-running it would consume a browser round to reproduce the same partial. It needs a fixture decision — install Studio, or reword the item for a two-app showcase — not another run. That decision is already on #10236.Gaps for the anchor