Disclosure: I used an AI assistant to investigate this and draft the report. The repro below ran on my machine; the counts and quotes are verbatim from its output.
Summary
On the default core profile, two generated skills reference workflows core never installs. openspec-update-change names /openspec-continue-change 5 times and /openspec-new-change twice. openspec-apply-change names /openspec-continue-change once. CLI 1.11.0.
Same class as #963, #913 and #1409. The umbrella, #919, is still open.
Repro
openspec init --tools claude --profile core --no-animation --force
grep -c '/openspec-continue-change' .claude/skills/openspec-update-change/SKILL.md # 5
grep -c '/openspec-new-change' .claude/skills/openspec-update-change/SKILL.md # 2
grep -c '/openspec-continue-change' .claude/skills/openspec-apply-change/SKILL.md # 1
Skills written: openspec-propose, openspec-explore, openspec-apply-change, openspec-update-change, openspec-sync-specs, openspec-archive-change. No continue, no new.
The part that actually breaks
update-change refuses to create a missing artifact and hands off to a workflow that is not there.
line 74: Artifacts still missing -> suggest /openspec-continue-change to create them.
line 89: Do not advance the build frontier: no new artifacts, no new files under glob artifacts - that is /openspec-continue-change's job.
On core that is a closed loop. Line 19 does carry a fallback:
/openspec-continue-change is an optional workflow and may not be installed. Before suggesting it anywhere below, verify that it is available. If it is unavailable, openspec status ... shows the next artifact and openspec instructions ... explains how to create it.
One sentence, 70 lines above the two spots where the agent hits the wall, and it delegates the availability check to the model. Line 91 has the same shape for /openspec-new-change.
#1733 is adjacent but not a fix. It opens up the partially-populated-glob case and states: "An artifact with no existing output remains outside update and routes to continue."
Why the generator emits it
src/utils/command-references.ts exists for exactly this. Its own docstring:
Converts /opsx:<command> patterns to /openspec-<skill> so that generated skills do not reference commands that were never generated.
It branches on tool id and on delivery. It never branches on profile. COMMAND_TO_SKILL_NAME maps all 12 workflows, and getProfileWorkflows() from src/core/profiles.ts is not called anywhere in the module. So /opsx:continue in a template is rewritten to /openspec-continue-change regardless of whether continue was installed.
This is the same drift the file already warns about on the tool axis: "the list drifted and left 16 tools advertising commands their palettes never registered (#727, #1307)."
Prior art, and how each was settled
| Issue |
Instance |
Outcome |
| #963 |
apply-change -> continue-change |
Closed via #1437. Inline CLI fallback added, reference kept. That is why line 54 still reads as it does. |
| #913 |
archive-change -> sync-specs |
Settled the other way: sync was added to CORE_WORKFLOWS. |
| #1409 |
openspec update console output |
Fixed by making the output profile-aware. |
| #919 |
umbrella |
Open since April. Criteria: "Default profile workflows are self-sufficient. No required flow can call missing skills in default mode." |
Three instances, closed one at a time, three different remedies. update-change is the fourth.
Suggested fix
Filter at generation time. getTransformerForTool() already has the context to take the active workflow set; drop or rewrite references outside it rather than emitting them and asking the agent to re-check at runtime. That also closes #919.
Narrower option: apply the #963 treatment to update-change lines 62, 74 and 89, which at least removes the dead end.
Environment
@fission-ai/openspec 1.11.0
- profile
core, delivery skills
- tool:
claude
- macOS, Darwin 25.6.0
Disclosure: I used an AI assistant to investigate this and draft the report. The repro below ran on my machine; the counts and quotes are verbatim from its output.
Summary
On the default
coreprofile, two generated skills reference workflowscorenever installs.openspec-update-changenames/openspec-continue-change5 times and/openspec-new-changetwice.openspec-apply-changenames/openspec-continue-changeonce. CLI 1.11.0.Same class as #963, #913 and #1409. The umbrella, #919, is still open.
Repro
Skills written:
openspec-propose,openspec-explore,openspec-apply-change,openspec-update-change,openspec-sync-specs,openspec-archive-change. Nocontinue, nonew.The part that actually breaks
update-changerefuses to create a missing artifact and hands off to a workflow that is not there.On
corethat is a closed loop. Line 19 does carry a fallback:One sentence, 70 lines above the two spots where the agent hits the wall, and it delegates the availability check to the model. Line 91 has the same shape for
/openspec-new-change.#1733 is adjacent but not a fix. It opens up the partially-populated-glob case and states: "An artifact with no existing output remains outside update and routes to continue."
Why the generator emits it
src/utils/command-references.tsexists for exactly this. Its own docstring:It branches on tool id and on
delivery. It never branches onprofile.COMMAND_TO_SKILL_NAMEmaps all 12 workflows, andgetProfileWorkflows()fromsrc/core/profiles.tsis not called anywhere in the module. So/opsx:continuein a template is rewritten to/openspec-continue-changeregardless of whethercontinuewas installed.This is the same drift the file already warns about on the tool axis: "the list drifted and left 16 tools advertising commands their palettes never registered (#727, #1307)."
Prior art, and how each was settled
apply-change->continue-changearchive-change->sync-specssyncwas added toCORE_WORKFLOWS.openspec updateconsole outputThree instances, closed one at a time, three different remedies.
update-changeis the fourth.Suggested fix
Filter at generation time.
getTransformerForTool()already has the context to take the active workflow set; drop or rewrite references outside it rather than emitting them and asking the agent to re-check at runtime. That also closes #919.Narrower option: apply the #963 treatment to
update-changelines 62, 74 and 89, which at least removes the dead end.Environment
@fission-ai/openspec1.11.0core, deliveryskillsclaude