* test(#2649): failing-first — diagnose-issues + execute-plan must run base-check before worktree dispatch
* fix(#2649): diagnose-issues + execute-plan run worktree.base-check before dispatch
diagnose-issues.md spawn_agents and execute-plan.md Pattern A spawned
worktree-isolated subagents (gsd-debugger / gsd-executor) without the
pre-dispatch worktree.base-check gate that execute-phase (#683/#1369) and
quick (#1941) already run. Claude Code's isolation="worktree" forks from
origin/HEAD, not live local HEAD; without the gate, the documented GSD steady
state (commit every step locally, push only on request) hits the verify-only
worktree_branch_check guard's exit-42 halt mid-investigation with no auto-degrade.
Mirror the quick.md #1941 pattern: before dispatch, run
`gsd_run query worktree.base-check --pick shouldDegrade`; if true, print its
message + a #2649 warning to stderr and set USE_WORKTREES=false (sequential
main-tree dispatch). The verify-only guard stays as a backstop in both cases.
Per the triage and #2649 acceptance criterion 5, execute-plan.md's Pattern A
(identified as a second site with the identical gap) is fixed in the SAME change
— same bug class, same one-line gate, two workflow files — rather than filed as
a separate follow-up.
* fix(#2649): ack the diagnose-issues + execute-plan growth (per-PR fragment)
The two workflow files grew vs next (diagnose-issues.md +1381, execute-plan.md
+905) adding the #2649 base-check gate. emitted-attribution requires an ack;
this is a per-PR fragment under tests/emitted-drift-acks/ (#2914 mechanism,
replacing the legacy shared emitted-drift-ack.json).
* test(#2649): tighten base-check ordering assertion + guard backstop survival
Address code-review minors:
- the ordering assertion was a loose disjunction that passed even if the
base-check moved AFTER the dispatch; tighten to assert base-check < Agent()
(the real invariant).
- add a test that the verify-only <worktree_branch_check> backstop remains
embedded in the Agent() prompt (acceptance criterion 4 — the base-check is a
pre-dispatch degrade, the guard is a post-fork fail-closed backstop; both
layers must survive).
* changeset(#2649): diagnose-issues + execute-plan auto-degrade on stale worktree base
* changeset(#2649): backfill PR number 2955
---------
Co-authored-by: sim <sim@users.noreply.github.com>