fix(spec): gate-46 — four tags named a Scenario as a Requirement, one named a change dir that never existed - #477
Merged
Conversation
…nt, and one named a change dir that never existed gate-46 (spec-anchor-existence) reported 5 unresolved findings from 4 distinct targets on the full-scope dispatch. They are two different mistakes, not one. FOUR of them, all in SbomRegisterShapeTest, are the same typo shape: #requirement-a-successful-import-records-provenance-on-the-version #requirement-existing-versions-are-unaffected-by-the-schema-addition #requirement-a-parsed-component-persists-with-its-moduleversie-relation Each of those strings is a real heading in openspec/specs/sbom-import/spec.md -- but it is a `#### Scenario:` heading, kebab-cased and then prefixed with `requirement-`. The requirement of that name does not exist and never did, so the tag resolved to nothing. The scenario is the more precise target anyway: each of these four test methods verifies exactly one scenario, so the tags now say `#scenario-...` and point at the heading they were always describing. The FIFTH is different in kind. RegisterFragmentMergeTest pointed at openspec/changes/modular-register-manifest-fragments/specs/modular-config/spec.md which is not merely archived -- it is absent from openspec/changes/, from openspec/changes/archive/, and from openspec/specs/ under any capability name, and `modular-config` is not a capability this repo has ever had. The gate resolves change-dir targets through the archive index and the capability index before reporting, so this is a target with no home rather than a stale path. Repointing a tag at a nearby requirement would have made the gate green while leaving the behaviour the test asserts unspecified, so instead the behaviour is now written down where it belongs: REQ-007 in openspec/specs/settings-service, the spec that owns SettingsService, covering the ADR-037 fragment deep-merge contract (disjoint fragments union; lists concatenate; scalars overwrite) with one scenario per test method. It explicitly defers to catalog-ratings for the `authorization` replace-on-merge carve-out rather than restating or overriding it. Both directions, measured with the gate's own checker: before 1 target-file-not-found + 4 anchor-not-found after exit 0, empty findings log gate [gate-46] spec-anchor-existence: FAIL -- 5 ... -> PASS Adding two scenarios did NOT add gate-19 debt: settings-service carries a file-level `@e2e exclude` (PHP backend, no UI surface), and the gate-19 finding list is byte-identical before and after (291 both times, diff empty). No other gate moved: 13/19/25/26 unchanged. phpcs scans lib/ only, so the tests/ docblocks are out of its scope; the spec change is markdown. PHPUnit on the two affected classes: 6/6 pass, 37 assertions.
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-10 20:32 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-46(spec-anchor-existence) reported 5 unresolved findings from 4 distinct targets on the full-scope dispatch (run 31416892690). They are two different mistakes, not one.Four of them: a Scenario addressed as a Requirement
SbomRegisterShapeTestcarried these anchors:Every one of those strings is a real heading in
openspec/specs/sbom-import/spec.md— but it is a#### Scenario:heading, kebab-cased and then prefixed withrequirement-. No requirement of that name exists. The scenario is the more precise target anyway: each of these four test methods verifies exactly one scenario. The tags now say#scenario-….The fifth: a target with no home
RegisterFragmentMergeTestpointed atThis is not a stale-but-archived path. It is absent from
openspec/changes/, fromopenspec/changes/archive/, and fromopenspec/specs/under any capability name — andmodular-configis not a capability this repo has ever had. gate-46 resolves change-dir targets through both the archive index and the capability index before reporting, so it had already tried every legitimate redirection.Repointing the tag at some nearby requirement would have turned the gate green while leaving the asserted behaviour unspecified. Instead the behaviour is now written down where it belongs: REQ-007 in
openspec/specs/settings-service, the spec that ownsSettingsService, covering the ADR-037 fragment deep-merge contract (disjoint fragments union, lists concatenate, scalars overwrite) with one scenario per test method. It explicitly defers tocatalog-ratingsfor theauthorizationreplace-on-merge carve-out rather than restating or overriding it.Both directions, measured with the gate's own checker
@spec target file not found+ 4 ×@spec anchor not found[gate-46] spec-anchor-existence: FAIL — 5 …→ PASSNo gate got worse
Adding two scenarios added zero gate-19 debt —
settings-servicecarries a file-level@e2e exclude(PHP backend, no UI surface). The gate-19 finding list is byte-identical before and after (291 both times,diffempty). Gates 13/25/26 unchanged.phpcsscanslib/only, so thetests/docblocks are out of scope; the spec change is markdown. PHPUnit on the two affected classes: 6/6 pass, 37 assertions.