Files
msd-core/gsd-core/templates
Tom Boucher b7917882bb fix(#4398): render the pending-todo bullet link repo-relative (#4416)
* test(#4384): failing-first regression rows for the macOS long-base todo-cap failure

The 240-char pending-todo bullet cap must be deterministic w.r.t. where the
repo is checked out. Deterministic long-base-path fixtures (a single 110-char
segment, no real macOS dependency) reproduce next's own macos shard 3/3
failure (run 34038716700) on every OS: with an absolute link the bullet
exceeds the cap and the documented needs-first truncation drops the
'Needs <solution>' clause. Rows cover the determinism property (byte-identical
bullets under short and long bases), the CLI surface, relative-path stability,
legacy no-projectRoot behavior, drop-order preservation, and adversarial
edges (outside-root, path===root, non-string path).

* fix(#4384): render the pending-todo bullet link repo-relative

renderPendingTodosMarkdown gains an optional projectRoot; when given and the
todo's path is absolute, the bullet's [todo file](…) target becomes
toPosixPath(path.relative(projectRoot, path)) — the idiom already used for
project_exists. cmdInitTodos passes cwd.

The JSON todos[].path field stays absolute (#2376). Only the rendered display
link changes: embedding the machine-variable absolute base let macOS's
/private/var/folders/… temp paths consume the 240-char budget and drop the
'Needs' clause on long-path machines only — next's own macos-latest shard 3/3
went red on exactly this (run 34038716700), Linux's short /tmp passed. The
240-char whole-bullet cap and the needs→title→area drop order are unchanged;
this matches PR #4384's own canonical example, docs, and unit tests, which all
show repo-relative links. Docs updated at all three surfaces that describe the
bullet (COMMANDS.md, templates/state.md, reference/state-md.md — the last was
still pre-#4384 'count and reference' prose).

Fixes the macOS regression introduced by #4384; next is red on its own CI.

* test(#4384): fix substring false positive in the outside-root regression row

The ../-form relative link legitimately contains the absolute path as a
substring, so !line.includes(absolutePath) fired on correct output (caught by
the first remote verify run, linux-node24 44018/44019). Assert the property
itself instead: extract the link target and require it to be non-absolute and
not equal to the absolute path.

* chore(#4398): backfill PR number in changeset

---------

Co-authored-by: sim <sim@local>
2026-09-06 13:23:26 -04:00
..

GSD Canonical Artifact Registry

This directory contains the template files for every artifact that GSD workflows officially produce. The table below is the authoritative index: if a .planning/ root file is not listed here, gsd-health will flag it as W019 (unrecognized artifact).

Agents should query this file before treating a .planning/ file as authoritative. If the file name does not appear below, it is not a canonical GSD artifact.


.planning/ Root Artifacts

These files live directly at .planning/ — not inside phase subdirectories.

File Template Produced by Purpose
PROJECT.md project.md /gsd:new-project Project identity, goals, requirements summary
ROADMAP.md roadmap.md /gsd:new-milestone, /gsd:new-project Phase plan with milestones and progress tracking
STATE.md state.md /gsd:new-project, /gsd:health --repair Current session state, active phase, last activity
REQUIREMENTS.md requirements.md /gsd:new-milestone Functional requirements with traceability
MILESTONES.md milestone.md /gsd:complete-milestone Log of completed milestones with accomplishments
BACKLOG.md (inline) /gsd-add-backlog Pending ideas and deferred work
LEARNINGS.md (inline) /gsd:extract-learnings, /gsd:execute-phase (gated: features.global_learnings) Phase retrospective learnings for future plans
THREADS.md (inline) /gsd:thread Persistent discussion threads
config.json config.json /gsd:new-project, /gsd:health --repair Project-specific GSD configuration
CLAUDE.md claude-md.md /gsd-profile Auto-assembled Claude Code context file
RETROSPECTIVE.md (inline) /gsd:complete-milestone Living milestone retrospective updated at each milestone close

Version-stamped artifacts (pattern: vX.Y-*.md)

Pattern Produced by Purpose
vX.Y-MILESTONE-AUDIT.md /gsd:audit-milestone Milestone audit report before archiving

These files are archived to .planning/milestones/ by /gsd:complete-milestone. Finding them at the .planning/ root after completion indicates the archive step was skipped.


Phase Subdirectory Artifacts (.planning/phases/NN-name/)

These files live inside a phase directory. They are NOT checked by W019 (which only inspects the .planning/ root).

File Pattern Template Produced by Purpose
NN-MM-PLAN.md phase-prompt.md /gsd:plan-phase Executable implementation plan
NN-MM-SUMMARY.md summary.md /gsd:execute-phase Post-execution summary with learnings
NN-CONTEXT.md context.md /gsd:discuss-phase Scoped discussion decisions for the phase
NN-RESEARCH.md research.md /gsd:plan-phase, /gsd:plan-phase --research-phase <N> Technical research for the phase
NN-VALIDATION.md VALIDATION.md /gsd:plan-phase (Nyquist) Validation architecture (Nyquist method)
NN-UAT.md UAT.md /gsd:validate-phase User acceptance test results
NN-PATTERNS.md (inline) /gsd:plan-phase (pattern mapper) Analog file mapping for the phase
NN-UI-SPEC.md UI-SPEC.md /gsd:ui-phase UI design contract
NN-SECURITY.md SECURITY.md /gsd:secure-phase Security threat model
NN-AI-SPEC.md AI-SPEC.md /gsd:ai-integration-phase AI integration spec with eval strategy
NN-DEBUG.md DEBUG.md /gsd:debug Debug session log
NN-REVIEWS.md (inline) /gsd:review Cross-AI review feedback

Milestone Archive (.planning/milestones/)

Files archived by /gsd:complete-milestone. These are never checked by W019.

File Pattern Source
vX.Y-ROADMAP.md Snapshot of ROADMAP.md at milestone close
vX.Y-REQUIREMENTS.md Snapshot of REQUIREMENTS.md at milestone close
vX.Y-MILESTONE-AUDIT.md Moved from .planning/ root
vX.Y-phases/ Archived phase directories (if --archive-phases used)

Adding a New Canonical Artifact

When a new workflow produces a .planning/ root file:

  1. Add the file name to CANONICAL_EXACT in gsd-core/bin/lib/artifacts.cjs
  2. Add a row to the .planning/ Root Artifacts table above
  3. Add the template to gsd-core/templates/ if one exists