* fix(#2415): close_phase_todos stages the pending/ deletion alongside completed/
Bug: the workflow step moved resolved todos from .planning/todos/pending/
to .planning/todos/completed/ with a plain 'mv', then committed listing
ONLY the destination directory in --files:
mv "$TODO_FILE" "$COMPLETED_DIR/"
gsd_run query commit '...' --files .planning/todos/completed/ .planning/STATE.md
Git's index still tracked the moved file at its old pending/<name>.md path.
The commit therefore only staged the new completed/<name>.md copy — the
deletion at pending/ was never staged, never committed, and lingered as an
unstaged deletion in git status indefinitely until some later broad
'git add -A' caught it. The phase genuinely closed the todo, but the
working tree was never clean.
Fix: add .planning/todos/pending/ to the --files list. 'git add' of that
directory (since git 2.0) stages deletions of tracked files in the pathspec,
so the moved-away file is staged as a deletion atomically with the new
completed/ copy in the same commit.
Chose plain mv + two-dir --files over 'git mv' because git mv FAILS on:
- untracked todos (new todo file not yet committed)
- non-git .planning dirs (worktree safety / pre-init projects)
Plain mv has neither failure mode.
Regression tests in tests/close-phase-todos-stage-deletion.test.cjs
(source-text-is-the-product: workflow .md text IS what the runtime loads)
cover:
- the commit --files list includes BOTH completed/ AND pending/
- the move uses plain 'mv' (not 'git mv') so untracked + non-git cases work
* chore(#2415): trim commit subject to keep execute-phase.md under byte ceiling
The fix added '.planning/todos/pending/' (~26 bytes) to the commit --files
list. To stay under the ADR-857 Phase 6 pre-phase-6 byte ceiling margin
(93400 bytes, hard ceiling 93600), shortened the commit subject from
'auto-close N todo(s) resolved by this phase' to 'close N resolved todo(s)'.
Net change vs origin/next: +6 bytes (93384 → 93390), well under the margin.
Also regenerates the golden-install-parity fixtures (execute-phase.md
content-hash update across all runtimes).
* chore(#2415): bump execute-phase.md workflow-size baseline (93384 → 93390)
The +pending/ fix added 6 net bytes (93384 → 93390), still well under the
ADR-857 Phase 6 pre-phase-6 byte ceiling margin (93400).
* chore(changeset): backfill pr:2447 in .changeset/sturdy-wasps-run.md
* fix(#2415): add issue ref to allow-test-rule annotation (ADR-456)
CI lint-allow-test-rule-refs failed on the prior commit — ADR-456 requires
'// allow-test-rule: <category> see #NNNN' so every exemption is traceable
to an issue. Added 'see #2415' to the source-text-is-the-product annotation.