Skip to content

fix(spec): 18 @spec tags pointed at files that do not exist - #440

Merged
rubenvdlinde merged 1 commit into
developmentfrom
fix/spec-anchors-0809
Aug 9, 2026
Merged

fix(spec): 18 @spec tags pointed at files that do not exist#440
rubenvdlinde merged 1 commit into
developmentfrom
fix/spec-anchors-0809

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Measured at gate package 365fa31, NODE_PATH set, 0-byte .err, 0 gates SKIPPED(wiring).

gate before after
46 spec-anchor-existence 18 findings / 13 targets 4 findings / 1 target

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.

@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. 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 retargeted to the canonical spec that survived its change, verified to exist on disk:

dangling change target canonical spec
publish-decisions-via-opencatalogi specs/public-publication
meeting-transcription-ai-minutes specs/meeting-transcription
citizen-participation specs/citizen-participation
authorizedadminsetting-fix-fleet ×2 specs/admin-settings
board-meeting-resolutions specs/decision-management
retrofit-2026-05-26-preferences-api ×2 specs/user-settings
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 in the repo's history. 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.

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

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.
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/decidesk @ 6bf8775

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.

@rubenvdlinde
rubenvdlinde merged commit c3f2c4c into development Aug 9, 2026
28 of 31 checks passed
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.

2 participants