Skip to content

docs(spec): trace 64 frontend methods to their spec, and sync the spec seven tags already pointed at - #471

Merged
rubenvdlinde merged 2 commits into
developmentfrom
docs/spec-coverage-frontend
Aug 9, 2026
Merged

docs(spec): trace 64 frontend methods to their spec, and sync the spec seven tags already pointed at#471
rubenvdlinde merged 2 commits into
developmentfrom
docs/spec-coverage-frontend

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

gate-16 spec-coverage: 64 → PASS. hydra-gates 651e5c5bb3ba8764903e5d6fc5bac5a208bd67fc, measured at the CI scope (--scope-to-diff --base origin/beta) — the scope a push to development actually runs. gate-46 spec-anchor-existence stays PASS, so every anchor added here resolves to a heading that exists.

The annotations

64 changed frontend methods across 24 files carried no @spec. Each now names the requirement it serves:

area spec
FacetedCatalogIndexView, facet store, facet service, save-view modal gemma-faceted-search
SbomComponentsPanel, sbomVulnerabilityMatch sbom-import
SuiteWizardDialog + its three steps, SuitesIndexView suite-wizard
portfolioReport.js, PortfolioReport.vue portfolio-rationalization-time
view.js store, GemmaViewIndex view-enrichment-api
SubmitReviewModal, ReviewsPanel catalog-ratings
EolSyncSettings eol-feed-integration
ComplianceMatrixView, complianceMatrix.js bio- / module-compliance-assessment

No tag was added without reading the method and the requirement it points at.

The real find: a spec that seven tags already referenced never existed

openspec/specs/realtime-updates-ui/ is new in this PR.

Change adopt-live-updates-ui declares "Affected specs: realtime-updates-ui (new)" and shipped src/composables/useLiveCollections.js plus its seven consumers — but the delta was never synced into openspec/specs/. Seven @spec tags across six source files have been pointing at a spec that does not exist:

src/composables/useLiveCollections.js
src/views/organisaties/OrganisatieIndex.vue
src/views/organisaties/PortfolioReport.vue
src/views/LicensePostureView.vue
src/views/LifecycleRoadmapView.vue
src/views/ComplianceMatrixView.vue
src/views/KwetsbaarhedenView.vue

gate-46 never caught it because gate-46 validates ANCHORS (#fragment), not bare file targets. An audit of every @spec openspec/specs/<x>/spec.md in src/ found this one — and only this one — dangling.

The delta is promoted verbatim: its requirement, its three scenarios and its author's reason-bearing @e2e exclude are unchanged. The only edits are the title line, the delta's ## ADDED Requirements heading becoming ## Requirements, and a Purpose recording where it came from. I did not author that exclusion — it is the original author's, quoted unaltered, and it is why this sync does not move gate-19.

I nearly made this worse

The first draft of this change copied the dangling tag onto useLiveCollections() itself — propagating a broken reference rather than fixing it. Checking that the target existed before trusting it is what turned that into a fix. The audit above exists because of that near-miss.

Can-fail proof

Reverting the 22 annotated files takes gate-16 from PASS back to 51; the run before any of this work reported 64 on the same package. The measured chain is 64 → 51 → 20 → 14 → 2 → PASS, every step on 651e5c5.

Other measurements

  • vitest215/215.
  • gate-46 — PASS before and after.
  • No other gate count moved.
  • Zero non-empty *.err files in the gate log directory, so no checker crashed into a false PASS.

Left alone deliberately

~100 @spec tags across lib/ point at openspec/changes/… rather than the canonical openspec/specs/… (mostly method-decomposition/tasks.md#task-N). That is a real rule violation — a change directory is not a spec's canonical home — but no gate enforces it, sweeping it touches ~20 backend files, and it deserves its own change rather than riding along here.

…c seven tags already pointed at

gate-16 spec-coverage 64 -> PASS, measured with hydra-gates 651e5c5 at the CI
scope (--scope-to-diff --base origin/beta). gate-46 spec-anchor-existence stays
PASS, so every anchor added here resolves to a heading that exists.

64 changed frontend methods across 24 files carried no @SPEC. Each now names the
requirement it serves — facet views and the facet store to gemma-faceted-search,
the SBOM panel to sbom-import, the suite wizard to suite-wizard, the portfolio
helpers to portfolio-rationalization-time, the view store to view-enrichment-api,
the review modals to catalog-ratings, and so on. No tag was added without
reading the method and the requirement it points at.

openspec/specs/realtime-updates-ui/ is NEW here, and that is the real find.
Change `adopt-live-updates-ui` declares "Affected specs: realtime-updates-ui
(new)" and shipped src/composables/useLiveCollections.js plus its seven
consumers — but the delta was never synced into openspec/specs/. SEVEN @SPEC
tags across six source files have been pointing at a spec that does not exist.
gate-46 never caught it because gate-46 validates ANCHORS (#fragment), not bare
file targets; an audit of every `@spec openspec/specs/<x>/spec.md` in src/ found
this one and only this one dangling. The delta is promoted verbatim — its
requirement, its three scenarios and its author's reason-bearing `@e2e exclude`
are unchanged; the only edits are the title line and the delta's
"## ADDED Requirements" heading becoming "## Requirements", plus a Purpose
recording where it came from. I did not author that exclusion.

I nearly made this worse: the first draft of this change copied the dangling
`@spec openspec/specs/realtime-updates-ui/spec.md` onto useLiveCollections()
itself. Checking the target existed before trusting it is what turned a
propagated broken reference into a fixed one.

Can-fail: reverting the 22 annotated files takes gate-16 from PASS back to 51;
the run before any of this work reported 64 on the same package.

vitest 215/215. gate-46 PASS. No other gate count moved.
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/softwarecatalog @ b86c299

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue-demi
test-l10n
composer ✅ 128/128
npm ✅ 718/718
PHPUnit
Newman ⏭️
Playwright
Hydra gates

Quality workflow — 2026-08-09 20:44 UTC

Download the full PDF report from the workflow artifacts.

…rage-frontend

# Conflicts:
#	src/views/FacetedCatalogIndexView.vue
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/softwarecatalog @ 2c090ef

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue-demi
test-l10n
composer ✅ 128/128
npm ✅ 718/718
PHPUnit
Newman ⏭️
Playwright
Hydra gates

Quality workflow — 2026-08-09 21:13 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 0020132 into development Aug 9, 2026
29 checks passed
@rubenvdlinde
rubenvdlinde deleted the docs/spec-coverage-frontend branch August 9, 2026 21:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant