Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Workflow templates: only update-change keeps a chosen artifact path inside changeRoot; continue, propose and ff do not

Abierto Apto para principiantes
#2,099 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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

bug needs-triage
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 changeRoot that matches artifactPaths.<id>.outputPath and does not already exist. Verify it remains inside changeRoot after 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 changeRoot before comparing path identity", then "write only the missing files". The path is resolved, but nothing says it has to stay inside changeRoot.
  • 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 resolvedOutputPath is a glob, follow instruction to 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:

  1. Run openspec init, then openspec update, with 1.14.1 and the workflows propose, continue and update enabled.
  2. Search the generated Claude Code skills for symlinked parent. It appears only in openspec-update-change/SKILL.md. The equivalent glob-write steps in openspec-continue-change/SKILL.md (both the partial-artifact step and the ready branch) and openspec-propose/SKILL.md don'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

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Fission-AI/OpenSpec

Todos los issues de Fission-AI/OpenSpec

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.