* fix(#3374): phase.complete stops harvesting stale body stopped_at
Variant A: cmdPhaseComplete's adapter calls syncStateFrontmatter directly
(deliberately - STATE.md commits atomically with ROADMAP/REQUIREMENTS),
which also bypassed the #948/#1230 preservation pass every RMW write gets.
A stale body 'Stopped at:' line then silently clobbered a fresher
frontmatter stopped_at on every phase completion, with warnings: [].
Three layers close it without reversing #3517's refresh expectation:
- completePhaseCore now refreshes the body continuity line it implies
('Phase N complete, ready to plan Phase N+1'; ADR-2207 phrasing on the
last phase), session-scoped via the new stateReplaceFieldInSession seam
so a decoy bold Stopped-at line in an unrelated section cannot absorb
the refresh. Replace-only - a layout with no session line keeps its
shape and its frontmatter value survives via the preservation delta.
- the RMW post-sync preservation chunk (snapshots + table-driven
applyStatePreservation + #2736 re-assert, full bodyDeltas wired) is
extracted into the shared applyPostSyncPreservation helper; the
phase.complete adapter and writeStateMd (milestone complete / state
sync - the gap the closed PR #3442 review flagged) now run it too.
- cmdStateRecordSession pushed 'Stopped At' onto updated[] on any label
MATCH, including a value already on disk - reporting a write that never
changed a byte. It now reports only on real change, and the match is
tracked separately so an identical value does not arm the #944 DWIM
section rewrite (which would reset an executor-authored resume file to
None).
* docs(#3374): backfill changeset pr field to 3491
* fix(#3374): drop the writeStateMd preservation pass - state sync's #905 contract is body-wins
CI on this PR caught what the closed PR #3442 review's MAJOR remediation
option (a) would have broken: state sync's #905 contract ('body annotation
beats existing frontmatter when both are present') is the opposite by
design - sync exists to re-derive frontmatter from the body. A blanket
applyStatePreservation pass on writeStateMd re-locked stale frontmatter
(current_phase 3 over the body's 5) on every sync.
Take the review's sanctioned option (b) instead: the scope claim is
accurate (phase.complete only) and the milestone complete / state sync
exposure is tracked as follow-up issue #3492.
---------
Co-authored-by: sim <sim@local>