Summary
Two gate-19 refs in openspec/specs/dashboard-widget-icons/spec.md are addressable by only one anchor each while describing two different behaviours. Same defect class as doriath#215 / .github#354, now confirmed in a third and fourth app (larpingapp here, launchpad separately).
The collision
6: ### Requirement: KPI widget icon set (REQ-DWI-001)
9: #### Scenario: Configured icon name resolves to a supported icon
14: #### Scenario: Unknown or missing icon name renders no icon
19: ### Requirement: Recent-items widget icon set (REQ-DWI-002)
22: #### Scenario: Configured icon name resolves to a supported icon
27: #### Scenario: Unknown or missing icon name renders no icon
Two requirements — KPI widget and Recent-items widget — declare the same two scenario titles. Both collapse to:
dashboard-widget-icons::configured-icon-name-resolves-to-a-supported-icon
dashboard-widget-icons::unknown-or-missing-icon-name-renders-no-icon
No anchor can distinguish them, so a single @e2e on the KPI widget necessarily credits the Recent-items widget too — and vice versa.
How it surfaced
--mode report does not de-duplicate; --mode gate does. On development @ 3936113f:
| mode |
uncovered |
--mode report |
44 rows |
--mode gate (and CI) |
42 distinct |
The 2-row gap is the collision. Quoting either number alone hides it — which is exactly how doriath#215 was found, and the reason that lesson is worth re-running per app.
Fix
Rename the four scenarios so each names its widget (e.g. "KPI widget: configured icon name resolves to a supported icon").
⚠️ A rename changes the slug. Any @e2e / @spec anchor pointing at the old ref must move in the same change — a dangling anchor is not reported as an error by gate-19, so it will silently read as coverage loss rather than as a broken reference.
Summary
Two gate-19 refs in
openspec/specs/dashboard-widget-icons/spec.mdare addressable by only one anchor each while describing two different behaviours. Same defect class asdoriath#215/.github#354, now confirmed in a third and fourth app (larpingapphere,launchpadseparately).The collision
Two requirements — KPI widget and Recent-items widget — declare the same two scenario titles. Both collapse to:
No anchor can distinguish them, so a single
@e2eon the KPI widget necessarily credits the Recent-items widget too — and vice versa.How it surfaced
--mode reportdoes not de-duplicate;--mode gatedoes. Ondevelopment@3936113f:--mode report--mode gate(and CI)The 2-row gap is the collision. Quoting either number alone hides it — which is exactly how
doriath#215was found, and the reason that lesson is worth re-running per app.Fix
Rename the four scenarios so each names its widget (e.g. "KPI widget: configured icon name resolves to a supported icon").
@e2e/@specanchor pointing at the old ref must move in the same change — a dangling anchor is not reported as an error by gate-19, so it will silently read as coverage loss rather than as a broken reference.