Files
msd-core/.changeset/archived/3489-complete-phase-idempotent.md
Tom Boucher 8616839cab chore: archive 463 shipped changeset fragments before wiring render (#714)
CHANGELOG promotion was a manual operator step that was never run, so 463
fragments for work already shipped in <=1.3.1 accumulated in .changeset/.
Their notes were already hand-curated into the dated [1.2.0]/[1.3.0]/[1.3.1]
CHANGELOG sections (#690 backfill, PR #694). Rendering them now would
duplicate and mis-attribute shipped work.

Move them to .changeset/archived/ (read non-recursively by all changeset
tooling, so never rendered), keeping only the 3 genuinely-unreleased
fragments at the top level. Prep for wiring `render` into the release
finalize job (#690 follow-up).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 14:53:17 -04:00

967 B

type, pr
type pr
Fixed 3489

state complete-phase is now idempotent — re-invocation no longer rolls STATE.md back. Previously, running gsd-sdk query state.complete-phase --phase <N> (or gsd state complete-phase --phase <N>) a second time on a phase that was already marked complete silently rewound STATE.md to that phase's moment-of-completion, clobbering Status, Last Activity, Last Activity Description, and the ## Current Position body. Any downstream consumer trusting STATE.md (/gsd-progress, planner, the next phase's discuss-phase context loader) was routed back to the rolled-back phase. The handler now reads STATE.md before writing: if the canonical Current Phase field already names a phase distinct from the one being completed, the project has clearly advanced past it and the handler returns a no-op ({ updated: [], phase: "<N>", idempotent: true, note: "phase already superseded; no-op" }) without touching STATE.md. (#3489)