Workflow templates: only update-change keeps a chosen artifact path inside changeRoot; continue, propose and ff do not
Los mantenedores suelen responder en 2 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 75/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- typescript
- Área
- tooling
Línea de trabajo
Empieza con la plantilla update-change, que ya incluye la frase de contención sobre directorios symlinked parent, y úsala como modelo. Luego busca los pasos de escritura con glob en src/core/templates/workflows/continue-change.ts (el paso de artefacto parcial y la rama ready), además de las plantillas propose y ff-change, y añade la misma regla antes de cualquier comparación o escritura. Está terminado cuando cada plantilla que convierte un glob en una ruta de escritura contiene esa regla, y al regenerar las skills con openspec update la frase aparece en cada SKILL.md afectado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What happened
When an artifact's output is a glob (spec-driven's specs/**/*.md), the agent picks the concrete file path itself, from the proposal's capability list. Only the update-change template bounds that choice:
Choose a concrete path inside
changeRootthat matchesartifactPaths.<id>.outputPathand does not already exist. Verify it remains insidechangeRootafter resolving any symlinked parent directories.
The other templates that write glob artifacts don't have that sentence:
- continue-change, the new "finish a partly written artifact" step (added in 1.14.1): "resolve each expected path against
changeRootbefore comparing path identity", then "write only the missing files". The path is resolved, but nothing says it has to stay insidechangeRoot. - continue-change, the "ready" branch: "If it is a glob pattern, choose the concrete file path using the schema instruction and the change's context"
- propose and ff-change: "If
resolvedOutputPathis a glob, followinstructionto choose the concrete file path"
A capability path such as ../../x, or a symlinked directory under specs/, resolves outside the change, and these templates would write there. The spec-driven schema already asks for kebab-case segments, so a well-behaved agent won't produce ... The concern is consistency: a protection that one workflow states is missing from the others that write the same kind of artifact.
I checked main just now: src/core/templates/workflows/continue-change.ts still has neither bullet bounded.
What you expected instead
Every template that turns a glob into a concrete write path should carry the same containment rule as update-change. That means: resolve the path against changeRoot, reject it if it lands outside changeRoot after resolving symlinked parent directories, and only then compare or write.
Minimal steps to reproduce
This is a template-text gap, so it shows up in the generated files without running anything:
- Run
openspec init, thenopenspec update, with 1.14.1 and the workflowspropose,continueandupdateenabled. - Search the generated Claude Code skills for
symlinked parent. It appears only inopenspec-update-change/SKILL.md. The equivalent glob-write steps inopenspec-continue-change/SKILL.md(both the partial-artifact step and the ready branch) andopenspec-propose/SKILL.mddon't have it.
OpenSpec version
1.14.1
Coding agent and model
Claude Code, Claude Opus 5.5. An AI code reviewer (CodeRabbit) flagged this on a PR that regenerated our skills. I confirmed it and drafted this issue with Claude Code.
OS and Node version
macOS 26.7.1, Node 24.15.0
- Lenguaje dominante
- TypeScript
- Estrellas
- 71.6k
- Forks
- 4.9k
- Merge medio
- 2 d 6 h
- PR fusionados (30 d)
- 82
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Fission-AI/OpenSpec
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Fission-AI/OpenSpec#2098 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Fission-AI/OpenSpec#1966 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
feat(schemas): open each proposal with a short review focusPosiblemente ocupada @GaoSSR la tomó hace 26 días. Abiertodesign-review
Dificultad 1/5 1-3 horas Aptitud para principiantes 90/100
Fission-AI/OpenSpec#1908 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 4/5 3-5 días Aptitud para principiantes 38/100
Fission-AI/OpenSpec#2088 ·
Los mantenedores suelen responder en 2 días
-
validate: a scenario with no WHEN/GIVEN or THEN step counts as a scenario and passesPosiblemente ocupada @artemasmith la tomó hace 2 días. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
Fission-AI/OpenSpec#2078 · 1 comentario ·
Los mantenedores suelen responder en 2 días
Todos los issues de Fission-AI/OpenSpec
Issues similares
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
juice-shop/juice-shop#3686 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
dsh-market/dsh-market#877 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
ScottKirvan/GOMAC#61 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
stellar/stellar-dev-skill#151 ·
Los mantenedores suelen responder en 1 día