docs(spec): trace 64 frontend methods to their spec, and sync the spec seven tags already pointed at - #471
Merged
Conversation
…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.
Contributor
Quality Report — ConductionNL/softwarecatalog @
|
| 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
Contributor
Quality Report — ConductionNL/softwarecatalog @
|
| 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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
gate-16 spec-coverage: 64 → PASS. hydra-gates
651e5c5bb3ba8764903e5d6fc5bac5a208bd67fc, measured at the CI scope (--scope-to-diff --base origin/beta) — the scope a push todevelopmentactually 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:FacetedCatalogIndexView, facet store, facet service, save-view modalgemma-faceted-searchSbomComponentsPanel,sbomVulnerabilityMatchsbom-importSuiteWizardDialog+ its three steps,SuitesIndexViewsuite-wizardportfolioReport.js,PortfolioReport.vueportfolio-rationalization-timeview.jsstore,GemmaViewIndexview-enrichment-apiSubmitReviewModal,ReviewsPanelcatalog-ratingsEolSyncSettingseol-feed-integrationComplianceMatrixView,complianceMatrix.jsbio-/module-compliance-assessmentNo 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-uideclares "Affected specs:realtime-updates-ui(new)" and shippedsrc/composables/useLiveCollections.jsplus its seven consumers — but the delta was never synced intoopenspec/specs/. Seven@spectags 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.mdinsrc/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 excludeare unchanged. The only edits are the title line, the delta's## ADDED Requirementsheading 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
vitest— 215/215.*.errfiles in the gate log directory, so no checker crashed into a false PASS.Left alone deliberately
~100
@spectags acrosslib/point atopenspec/changes/…rather than the canonicalopenspec/specs/…(mostlymethod-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.