When a new milestone reuses a phase number that exists in an archived milestone (e.g., v2.0 Phase 2 while v1.0-phases/02-old-feature exists), findPhaseInternal falls through to the archive and returns the old phase. init plan-phase and init execute-phase then emitted archived values for phase_dir, phase_slug, has_context, has_research, and *_path fields, while phase_req_ids came from the current ROADMAP — producing a silent inconsistency that pointed downstream agents at a shipped phase from a previous milestone. cmdInitPhaseOp already guarded against this (see lines 617-642); apply the same guard in cmdInitPlanPhase, cmdInitExecutePhase, and cmdInitVerifyWork: if findPhaseInternal returns an archived match and the current ROADMAP.md has the phase, discard the archived phaseInfo so the ROADMAP fallback path produces clean values. Adds three regression tests covering plan-phase, execute-phase, and verify-work under the shared-number scenario.
59 KiB
59 KiB