fix(spec): 18 @spec tags pointed at files that do not exist - #440
Merged
Conversation
Measured at gate package 365fa31, NODE_PATH set, 0-byte .err, 0 gates SKIPPED(wiring): gate-46 spec-anchor-existence 18 -> 4, and the last 4 live in lib/BackgroundJob/OverdueActionItemsJob.php, which #438 deletes — so the pair takes this gate to 0. Three distinct causes, none of them "the tag was missing": **A trailing full stop swallowed into the path — 6 tags.** `@spec openspec/specs/decision-management/spec.md.` resolves to a filename ending in a dot. All three targets exist; only the sentence punctuation was wrong. This is the cheapest possible defect and it had made three real, current, canonical specs unreachable. **Tags pointing INTO archived changes — 8 tags.** `@spec` targets the canonical `openspec/specs/`, never a change directory: a change is archived once it lands, and the tag then dangles. Each was retargeted to the canonical spec that survived its change, verified to exist on disk: publish-decisions-via-opencatalogi -> specs/public-publication meeting-transcription-ai-minutes -> specs/meeting-transcription citizen-participation -> specs/citizen-participation authorizedadminsetting-fix-fleet x2 -> specs/admin-settings board-meeting-resolutions -> specs/decision-management retrofit-2026-05-26-preferences-api -> specs/user-settings (x2) pluggable-integration-registry -> specs/nextcloud-integration **A path that was never valid and a placeholder anchor — 4 tags.** MeetingService carried `openspec/changes/spec/tasks.md#task-1` three times — a directory literally named "spec" that has never existed, so this tag could not have resolved on any commit. Retargeted to specs/meeting-management. ActionItemController and actionItemApi.js carried `#task-2.x`, an anchor with a literal "x" placeholder in it; both now point at specs/action-item-board-via-deck-leaf, whose requirements they implement. No spec file was created to make an anchor resolve. Every target was checked to exist before the tag was pointed at it, and where a canonical spec genuinely did not exist the tag was moved to the one that describes the code rather than to an invented file.
rubenvdlinde
requested review from
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
August 9, 2026 21:18
Contributor
Quality Report — ConductionNL/decidesk @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 549/549 | |||
| PHPUnit | ✅ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-09 21:52 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.
Measured at gate package
365fa31,NODE_PATHset, 0-byte.err, 0 gates SKIPPED(wiring).The last 4 all live in
lib/BackgroundJob/OverdueActionItemsJob.php, which #438 deletes — so this PR and #438 together take gate-46 to 0.Three distinct causes, none of them "the tag was missing"
A trailing full stop swallowed into the path — 6 tags.
…resolves to a filename ending in a dot. All three targets exist; only the sentence punctuation was wrong. The cheapest possible defect, and it had made three real, current, canonical specs unreachable.
Tags pointing INTO archived changes — 8 tags.
@spectargets the canonicalopenspec/specs/, never a change directory: a change is archived once it lands, and the tag then dangles. Each retargeted to the canonical spec that survived its change, verified to exist on disk:publish-decisions-via-opencatalogispecs/public-publicationmeeting-transcription-ai-minutesspecs/meeting-transcriptioncitizen-participationspecs/citizen-participationauthorizedadminsetting-fix-fleet×2specs/admin-settingsboard-meeting-resolutionsspecs/decision-managementretrofit-2026-05-26-preferences-api×2specs/user-settingspluggable-integration-registryspecs/nextcloud-integrationA path that was never valid, and a placeholder anchor — 4 tags.
MeetingServicecarriedopenspec/changes/spec/tasks.md#task-1three times — a directory literally namedspecthat has never existed, so this tag could not have resolved on any commit in the repo's history. Retargeted tospecs/meeting-management.ActionItemControllerandactionItemApi.jscarried#task-2.x— an anchor with a literalxplaceholder in it. Both now point atspecs/action-item-board-via-deck-leaf, whose requirements they implement.What was deliberately not done
No spec file was created to make an anchor resolve. Every target was checked to exist before a tag was pointed at it, and where a canonical spec genuinely did not exist the tag was moved to the one that actually describes the code rather than to an invented stub. Creating empty spec files to satisfy the checker is comment-satisfaction and would have made the gate green over nothing.
🤖 Generated with Claude Code