Product bug — surfaced by enabling e2e (#17)
The petstore Dashboard renders four stats-block KPI widgets as the "Widget unavailable" placeholder instead of the KPIs. Nothing currently fails when this happens.
Evidence
Accessibility-tree snapshot captured from the page at failure time in a real CI run (NC stable31, run 30858571784), playwright-report/data/*.md:
- main:
- heading "Dashboard" [level=2]
- paragraph: Daily overview of pets, orders and categories
- note "This widget is unavailable": Widget unavailable stats-block
- note "This widget is unavailable": Widget unavailable stats-block
- note "This widget is unavailable": Widget unavailable stats-block
- note "This widget is unavailable": Widget unavailable stats-block
The page shell, the in-app navigation and the app-content region all render correctly — only the widgets fail to resolve. src/manifest.json declares these at lines 79, 110, 140 and 170 with "widgetKey": "stats-block".
Why no test caught it
This is the failure mode worth noting. dashboard.spec.ts asserts:
- that the in-app navigation renders its route links, and
- that the app-content region
toBeAttached()
Both are true on a dashboard whose every widget is a placeholder. The spec's own comment explains the reasoning — widget bodies are data-driven and render empty when unseeded, so seed-dependent widget copy was deliberately not asserted. That is a defensible call, but the consequence is that "the widget did not resolve at all" and "the widget resolved and had no data" are indistinguishable to the suite. A widget that fails to resolve is a different defect from a widget with nothing to show, and the dashboard currently cannot tell you which one you have.
Compare nextcloud-app-template, whose app-shell.spec.ts:68 asserts exactly this: "no built-in widget resolves to the 'Widget unavailable' placeholder". petstore has no equivalent.
Suggested work
- Diagnose why the built-in
stats-block widget does not resolve on the Dashboard. stats-block is a built-in (per ADR-049 it needs no registry entry and no Vue file), so this is resolution in the manifest shell, not a missing src/registry.js entry. Note the same stats-block type is also used on the pet-detail (pet-stats) and category-detail (category-stats-*) pages — check whether those resolve, since a working instance elsewhere localises the fault.
- Add a spec asserting no built-in widget resolves to the placeholder, mirroring app-template's
:68. That closes the gap that let four dead widgets ship green.
Scope note
Found while landing the e2e gate in #17 and filed rather than fixed there — #17 is scoped to making the gate honest, and this needs a manifest-shell diagnosis of its own. It is a genuine product defect, not a test-harness artefact.
Product bug — surfaced by enabling e2e (#17)
The petstore Dashboard renders four
stats-blockKPI widgets as the "Widget unavailable" placeholder instead of the KPIs. Nothing currently fails when this happens.Evidence
Accessibility-tree snapshot captured from the page at failure time in a real CI run (NC stable31, run 30858571784),
playwright-report/data/*.md:The page shell, the in-app navigation and the app-content region all render correctly — only the widgets fail to resolve.
src/manifest.jsondeclares these at lines 79, 110, 140 and 170 with"widgetKey": "stats-block".Why no test caught it
This is the failure mode worth noting.
dashboard.spec.tsasserts:toBeAttached()Both are true on a dashboard whose every widget is a placeholder. The spec's own comment explains the reasoning — widget bodies are data-driven and render empty when unseeded, so seed-dependent widget copy was deliberately not asserted. That is a defensible call, but the consequence is that "the widget did not resolve at all" and "the widget resolved and had no data" are indistinguishable to the suite. A widget that fails to resolve is a different defect from a widget with nothing to show, and the dashboard currently cannot tell you which one you have.
Compare
nextcloud-app-template, whoseapp-shell.spec.ts:68asserts exactly this: "no built-in widget resolves to the 'Widget unavailable' placeholder". petstore has no equivalent.Suggested work
stats-blockwidget does not resolve on the Dashboard.stats-blockis a built-in (per ADR-049 it needs no registry entry and no Vue file), so this is resolution in the manifest shell, not a missingsrc/registry.jsentry. Note the samestats-blocktype is also used on the pet-detail (pet-stats) and category-detail (category-stats-*) pages — check whether those resolve, since a working instance elsewhere localises the fault.:68. That closes the gap that let four dead widgets ship green.Scope note
Found while landing the e2e gate in #17 and filed rather than fixed there — #17 is scoped to making the gate honest, and this needs a manifest-shell diagnosis of its own. It is a genuine product defect, not a test-harness artefact.