diff --git a/.changeset/fierce-koalas-climb.md b/.changeset/fierce-koalas-climb.md new file mode 100644 index 000000000..8aedb02b0 --- /dev/null +++ b/.changeset/fierce-koalas-climb.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 4391 +--- +**A working executor is no longer interrupted or told to "Finalize immediately"** — execute-phase's stall threshold now measures time without progress rather than total runtime, an executor with commits and recent activity is left alone until its SUMMARY lands, and a missing local test/build process no longer counts as idleness. (#4218) diff --git a/docs/INVENTORY-MANIFEST.json b/docs/INVENTORY-MANIFEST.json index 8d46675fd..421097462 100644 --- a/docs/INVENTORY-MANIFEST.json +++ b/docs/INVENTORY-MANIFEST.json @@ -617,6 +617,7 @@ "docs-update/steps/dispatch-monorepo-packages.md", "execute-phase/steps/codebase-drift-gate.md", "execute-phase/steps/executor-isolation-dispatch.md", + "execute-phase/steps/executor-progress-policy.md", "execute-phase/steps/gap-closure-artifacts.md", "execute-phase/steps/partial-wave.md", "execute-phase/steps/per-plan-executor-routing.md", diff --git a/gsd-core/workflows/execute-phase.md b/gsd-core/workflows/execute-phase.md index b7a3a6d79..025b34a63 100644 --- a/gsd-core/workflows/execute-phase.md +++ b/gsd-core/workflows/execute-phase.md @@ -878,7 +878,9 @@ increases monotonically across waves. `{status}` is `complete` (success), ask for one recovery path: `continue waiting`, `kill and retry`, or `kill and switch to inline execution`. - If the stalled executor ran in an isolated worktree, `kill and switch to inline execution` edits the primary checkout — see worktree recovery policy (`execute-phase/steps/worktree-recovery-policy.md`). Prefer `kill and retry` in a fresh worktree; inline execution requires explicit confirmation, never the default. + **A working executor is never steered (#4218).** The threshold measures time WITHOUT + PROGRESS, not total runtime. Before treating an executor as stalled — and before sending it + any message — read and execute `execute-phase/steps/executor-progress-policy.md`. **This fallback applies to all runtimes.** Claude Code's Agent() backgrounds by default: the completion signal may never arrive. Verify, never wait. diff --git a/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md b/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md new file mode 100644 index 000000000..49b0d309a --- /dev/null +++ b/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md @@ -0,0 +1,43 @@ +Apply response_language to all user-facing prose — narration between tool calls, status updates, progress notes, and findings included; preserve code, paths, and identifiers. + +# Executor Progress Policy (#4218) + +Read this before treating any executor as stalled. + +## A working executor is never steered + +The stall threshold measures a period **without meaningful progress**. It is not a maximum +total runtime, and it is not a budget the executor has to finish inside. A plan with a long +verification or closeout tail legitimately spends many minutes between its last commit and +its SUMMARY. + +Reconcile activity as well as artifacts: + +- **Commits exist and SUMMARY.md is missing, with recent meaningful activity → KEEP + WAITING.** Do not steer it, do not interrupt it, do not re-dispatch it. Recent + RED/GREEN/REFACTOR commits, passing verification, or ongoing reasoning/tool telemetry + from the child are all meaningful activity. +- **Only after `${EXECUTOR_STALL_THRESHOLD_MINUTES}` of no meaningful progress** — measured + from the LAST sign of progress, not from dispatch — may the pause in step 3 fire, and it + asks the user; it does not act on its own. + +## Never inject urgency or finalization instructions into a live executor + +Messages of the "Finalize immediately", "wrap up now", "you are taking too long" family are +forbidden: they arrive mid-verification and turn a correct run into a truncated one. If an +executor must be stopped, the pause in step 3 is the only route, and `kill and retry` is a +clean restart — not a nudge. + +## The absence of a local OS test/build process is NOT idleness + +The orchestrator cannot see the child's work that way. A native subagent runs in the +runtime's own session, not as a visible local process, and an executor between two tool +calls — reasoning, reading a file, waiting on a runtime round-trip — shows no process at +all. Judge progress ONLY by the signals this workflow names: commits on the expected +branch, the SUMMARY, and the child's own activity. A process listing is not one of them. + +## If a stalled executor ran in an isolated worktree + +`kill and switch to inline execution` edits the primary checkout — see worktree recovery +policy (`execute-phase/steps/worktree-recovery-policy.md`). Prefer `kill and retry` in a +fresh worktree; inline execution requires explicit confirmation, never the default. diff --git a/tests/execute-phase-wave.test.cjs b/tests/execute-phase-wave.test.cjs index b23582afa..b86f8312f 100644 --- a/tests/execute-phase-wave.test.cjs +++ b/tests/execute-phase-wave.test.cjs @@ -1182,3 +1182,88 @@ describe('execute-phase workflow: #3684 review findings — join normalization', } }); }); + +// ── #4218: a live executor must not be steered or cut short ────────────────── +// +// allow-test-rule: source-text-is-the-product (#4218) — the workflow .md IS +// the instruction the orchestrator executes; its text is the artifact under test. +// +// Reported on Codex: an executor with recent RED/GREEN/REFACTOR commits and +// passing verification had not yet written its SUMMARY because it was finishing +// closeout. The parent saw no local OS test/build process, inferred an "idle +// tail", and sent "Finalize immediately" into a working child. In CLI runs the +// same inference interrupted an executor before GREEN, leaving a RED commit and +// an uncommitted edit. +// +// The policy lives in a step fragment: execute-phase.md is 77 bytes under the +// frozen #1168 ceiling, and "extract, not bump" is the repo's stated remedy. +describe('execute-phase: stall surveillance must not steer a working executor (#4218)', () => { + const workflow = fs.readFileSync(WORKFLOW_PATH, 'utf-8'); + const FRAGMENT_PATH = path.join( + __dirname, '..', 'gsd-core', 'workflows', 'execute-phase', 'steps', 'executor-progress-policy.md'); + const fragment = fs.existsSync(FRAGMENT_PATH) ? fs.readFileSync(FRAGMENT_PATH, 'utf-8') : ''; + + test('the host routes to the policy before treating an executor as stalled', () => { + assert.match(workflow, /A working executor is never steered \(#4218\)/, + 'the verdict must be visible where the orchestrator decides, not only in the fragment'); + assert.match(workflow, /time WITHOUT\s{1,10}PROGRESS, not total runtime/, + 'the threshold definition is the correction — it belongs in the host'); + assert.match(workflow, /before sending it\s{1,10}any message/, + 'the steering prohibition must be reachable before a message is sent, not after'); + assert.match(workflow, /execute-phase\/steps\/executor-progress-policy\.md/, + 'the host must point at the policy fragment'); + }); + + test('the stall threshold is a period without progress, not a maximum runtime', () => { + assert.ok(fragment.length > 0, 'execute-phase/steps/executor-progress-policy.md must exist'); + assert.match(fragment, /period \*\*without meaningful progress\*\*/, + 'the threshold must be defined by absence of progress'); + assert.match(fragment, /not a maximum\s{1,10}total runtime/, + 'a long-but-progressing plan must not be treated as stalled'); + assert.match(fragment, /from the LAST sign of progress, not from dispatch/, + 'measuring from dispatch is what turns a slow plan into a false stall'); + }); + + test('commits + missing SUMMARY + recent activity resolves to KEEP WAITING', () => { + assert.match(fragment, /KEEP\s{1,10}WAITING/, 'the verdict for a working executor must be explicit'); + assert.match(fragment, /Do not steer it, do not interrupt it, do not re-dispatch it/, + 'all three interventions the report describes must be named and forbidden'); + }); + + test('urgency and finalization messages are forbidden outright', () => { + assert.match(fragment, /Never inject urgency or finalization instructions into a live executor/, + 'the prohibition must be stated as a rule, not implied'); + assert.match(fragment, /Finalize immediately/, + 'the reported message must be named so it cannot be read as permitted'); + }); + + test('a missing local OS process is not evidence of idleness', () => { + assert.match(fragment, /absence of a local OS test\/build process is NOT idleness/, + 'the false signal the orchestrator acted on must be ruled out by name'); + assert.match(fragment, /A process listing is not one of them/, + 'the workflow must say which signals DO count, and that a process listing is not one'); + }); + + test('the only sanctioned stop is the existing user-facing pause', () => { + assert.match(fragment, /the pause in step 3 is the only route/, + 'stopping an executor must stay a user decision, not an orchestrator nudge'); + assert.match(fragment, /`kill and retry` is a\s{1,10}clean restart — not a nudge/, + 'the distinction between restarting and steering must be explicit'); + }); + + test('the worktree-recovery arm moved with the policy, not left duplicated', () => { + assert.match(fragment, /If a stalled executor ran in an isolated worktree/, + 'the recovery arm belongs with the stop policy it qualifies'); + assert.match(fragment, /worktree-recovery-policy\.md/, + 'it must still hand off to the worktree policy'); + assert.ok( + !/kill and switch to inline execution` edits the primary checkout/.test(workflow), + 'the host must not keep a second copy of the arm that moved', + ); + // The #3212 recovery options themselves stay in the host — tests/config.test.cjs + // pins them there. + for (const option of ['continue waiting', 'kill and retry', 'kill and switch to inline execution']) { + assert.ok(workflow.includes(option), `the host must still offer "${option}"`); + } + }); +}); diff --git a/tests/fixtures/install-tree/antigravity.json b/tests/fixtures/install-tree/antigravity.json index 1053ba05f..e8a7e42de 100644 --- a/tests/fixtures/install-tree/antigravity.json +++ b/tests/fixtures/install-tree/antigravity.json @@ -384,6 +384,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/augment.json b/tests/fixtures/install-tree/augment.json index e94cf8efc..1e5d20c0a 100644 --- a/tests/fixtures/install-tree/augment.json +++ b/tests/fixtures/install-tree/augment.json @@ -456,6 +456,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/claude-local.json b/tests/fixtures/install-tree/claude-local.json index 0de1554f6..4778a6df5 100644 --- a/tests/fixtures/install-tree/claude-local.json +++ b/tests/fixtures/install-tree/claude-local.json @@ -349,6 +349,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/claude.json b/tests/fixtures/install-tree/claude.json index 89ffa04f0..a2f013c83 100644 --- a/tests/fixtures/install-tree/claude.json +++ b/tests/fixtures/install-tree/claude.json @@ -384,6 +384,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/cline.json b/tests/fixtures/install-tree/cline.json index 5fa6c7c27..d9899d85a 100644 --- a/tests/fixtures/install-tree/cline.json +++ b/tests/fixtures/install-tree/cline.json @@ -386,6 +386,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/codebuddy.json b/tests/fixtures/install-tree/codebuddy.json index eae7b37fc..d51cf2b3a 100644 --- a/tests/fixtures/install-tree/codebuddy.json +++ b/tests/fixtures/install-tree/codebuddy.json @@ -456,6 +456,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/codex.json b/tests/fixtures/install-tree/codex.json index 863e061c5..89bef7a38 100644 --- a/tests/fixtures/install-tree/codex.json +++ b/tests/fixtures/install-tree/codex.json @@ -420,6 +420,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/copilot.json b/tests/fixtures/install-tree/copilot.json index 49fec394f..1cb27a87c 100644 --- a/tests/fixtures/install-tree/copilot.json +++ b/tests/fixtures/install-tree/copilot.json @@ -385,6 +385,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/cursor.json b/tests/fixtures/install-tree/cursor.json index 24e453c37..f54509b21 100644 --- a/tests/fixtures/install-tree/cursor.json +++ b/tests/fixtures/install-tree/cursor.json @@ -384,6 +384,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/hermes.json b/tests/fixtures/install-tree/hermes.json index 4cf935f9d..0e7ba27f5 100644 --- a/tests/fixtures/install-tree/hermes.json +++ b/tests/fixtures/install-tree/hermes.json @@ -384,6 +384,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/kilo.json b/tests/fixtures/install-tree/kilo.json index abf3fbd8a..7b6df1af2 100644 --- a/tests/fixtures/install-tree/kilo.json +++ b/tests/fixtures/install-tree/kilo.json @@ -456,6 +456,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/kimi-code.json b/tests/fixtures/install-tree/kimi-code.json index 0c89dc91a..71a4948b6 100644 --- a/tests/fixtures/install-tree/kimi-code.json +++ b/tests/fixtures/install-tree/kimi-code.json @@ -385,6 +385,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/kimi.json b/tests/fixtures/install-tree/kimi.json index fe38de7ea..951b389f2 100644 --- a/tests/fixtures/install-tree/kimi.json +++ b/tests/fixtures/install-tree/kimi.json @@ -421,6 +421,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/opencode.json b/tests/fixtures/install-tree/opencode.json index 08896f64c..863d5be00 100644 --- a/tests/fixtures/install-tree/opencode.json +++ b/tests/fixtures/install-tree/opencode.json @@ -456,6 +456,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/pi.json b/tests/fixtures/install-tree/pi.json index 6dc5cf674..17ab254b6 100644 --- a/tests/fixtures/install-tree/pi.json +++ b/tests/fixtures/install-tree/pi.json @@ -244,6 +244,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/qwen.json b/tests/fixtures/install-tree/qwen.json index bbf1a8179..1989d7bce 100644 --- a/tests/fixtures/install-tree/qwen.json +++ b/tests/fixtures/install-tree/qwen.json @@ -384,6 +384,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/trae.json b/tests/fixtures/install-tree/trae.json index 2736df347..78368cd79 100644 --- a/tests/fixtures/install-tree/trae.json +++ b/tests/fixtures/install-tree/trae.json @@ -384,6 +384,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/windsurf.json b/tests/fixtures/install-tree/windsurf.json index 9d1aacaf2..0257661eb 100644 --- a/tests/fixtures/install-tree/windsurf.json +++ b/tests/fixtures/install-tree/windsurf.json @@ -312,6 +312,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md", diff --git a/tests/fixtures/install-tree/zcode.json b/tests/fixtures/install-tree/zcode.json index 9d8d555e1..b117fe29b 100644 --- a/tests/fixtures/install-tree/zcode.json +++ b/tests/fixtures/install-tree/zcode.json @@ -456,6 +456,7 @@ "gsd-core/workflows/execute-phase.md", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md", "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md", + "gsd-core/workflows/execute-phase/steps/executor-progress-policy.md", "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md", "gsd-core/workflows/execute-phase/steps/partial-wave.md", "gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md",