diff --git a/get-shit-done/workflows/execute-phase.md b/get-shit-done/workflows/execute-phase.md index 552afb318..fdbc20e7d 100644 --- a/get-shit-done/workflows/execute-phase.md +++ b/get-shit-done/workflows/execute-phase.md @@ -9,15 +9,18 @@ Orchestrator coordinates, not executes. Each subagent loads the full execute-pla **Subagent spawning is runtime-specific:** - **Claude Code:** Uses `Task(subagent_type="gsd-executor", ...)` — blocks until complete, returns result -- **Copilot:** Uses `@gsd-executor` agent reference — if subagent spawning hangs or fails to return, - fall back to **sequential inline execution**: read and follow execute-plan.md directly for each plan - instead of spawning parallel agents. This is slower but reliable. +- **Copilot:** Subagent spawning does not reliably return completion signals. **Default to + sequential inline execution**: read and follow execute-plan.md directly for each plan + instead of spawning parallel agents. Only attempt parallel spawning if the user + explicitly requests it — and in that case, rely on the spot-check fallback in step 3 + to detect completion. - **Other runtimes (Gemini, Codex, OpenCode):** If Task/subagent API is unavailable, use sequential inline execution as the fallback. **Fallback rule:** If a spawned agent completes its work (commits visible, SUMMARY.md exists) but the orchestrator never receives the completion signal, treat it as successful based on spot-checks -and continue to the next wave/plan. +and continue to the next wave/plan. Never block indefinitely waiting for a signal — always verify +via filesystem and git state. @@ -60,6 +63,14 @@ Parse JSON for: `executor_model`, `verifier_model`, `commit_docs`, `parallelizat When `parallelization` is false, plans within a wave execute sequentially. +**Runtime detection for Copilot:** +Check if the current runtime is Copilot by testing for the `@gsd-executor` agent pattern +or absence of the `Task()` subagent API. If running under Copilot, force sequential inline +execution regardless of the `parallelization` setting — Copilot's subagent completion +signals are unreliable (see ``). Set `COPILOT_SEQUENTIAL=true` +internally and skip the `execute_waves` step in favor of `check_interactive_mode`'s +inline path for each plan. + **REQUIRED — Sync chain flag with intent.** If user invoked manually (no `--auto`), clear the ephemeral chain flag from any previous interrupted `--auto` chain. This prevents stale `_auto_chain_active: true` from causing unwanted auto-advance. This does NOT touch `workflow.auto_advance` (the user's persistent settings preference). You MUST execute this bash block before any config reads: ```bash # REQUIRED: prevents stale auto-chain from previous --auto runs @@ -250,6 +261,28 @@ Execute each wave in sequence. Within a wave: parallel if `PARALLELIZATION=true` 3. **Wait for all agents in wave to complete.** + **Completion signal fallback (Copilot and runtimes where Task() may not return):** + + If a spawned agent does not return a completion signal but appears to have finished + its work, do NOT block indefinitely. Instead, verify completion via spot-checks: + + ```bash + # For each plan in this wave, check if the executor finished: + SUMMARY_EXISTS=$(test -f "{phase_dir}/{plan_number}-{plan_padded}-SUMMARY.md" && echo "true" || echo "false") + COMMITS_FOUND=$(git log --oneline --all --grep="{phase_number}-{plan_padded}" --since="1 hour ago" | head -1) + ``` + + **If SUMMARY.md exists AND commits are found:** The agent completed successfully — + treat as done and proceed to step 4. Log: `"✓ {Plan ID} completed (verified via spot-check — completion signal not received)"` + + **If SUMMARY.md does NOT exist after a reasonable wait:** The agent may still be + running or may have failed silently. Check `git log --oneline -5` for recent + activity. If commits are still appearing, wait longer. If no activity, report + the plan as failed and route to the failure handler in step 5. + + **This fallback applies automatically to all runtimes.** Claude Code's Task() normally + returns synchronously, but the fallback ensures resilience if it doesn't. + 4. **Post-wave hook validation (parallel mode only):** When agents committed with `--no-verify`, run pre-commit hooks once after the wave: diff --git a/tests/agent-frontmatter.test.cjs b/tests/agent-frontmatter.test.cjs index a5aea5264..5308f4fad 100644 --- a/tests/agent-frontmatter.test.cjs +++ b/tests/agent-frontmatter.test.cjs @@ -151,6 +151,20 @@ describe('SPAWN: spawn type consistency', () => { 'diagnose-issues should spawn gsd-debugger, not general-purpose' ); }); + + test('execute-phase has Copilot sequential fallback in runtime_compatibility', () => { + const content = fs.readFileSync( + path.join(WORKFLOWS_DIR, 'execute-phase.md'), 'utf-8' + ); + assert.ok( + content.includes('sequential inline execution'), + 'execute-phase must document sequential inline execution as Copilot fallback' + ); + assert.ok( + content.includes('spot-check'), + 'execute-phase must have spot-check fallback for completion detection' + ); + }); }); // ─── Required Frontmatter Fields ─────────────────────────────────────────────