* test(#3777): add failing-first coverage for concurrent per-plan planner dispatch Extracts and executes the real bash blocks this PR is about to add to plan-phase.md and chunked-planning-mode.md (CHUNKED_PARALLEL resolution and the BATCH_PLAN_IDS dedup guard), plus config-set/config-get coverage for the new planning.chunked_parallel key. Expected RED against the current shipped workflow text — the extraction anchors do not exist yet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * feat(#3777): dispatch chunked mode's per-plan planners concurrently within a Wave Adds opt-in planning.chunked_parallel (default false, byte-identical to the existing serial loop). When true and the runtime's negotiated dispatch capacity (dispatch-capacity, #3673) is greater than 1, chunked planning's per-plan Tasks that share one outline Wave are issued together instead of one at a time; a later Wave still waits for the current one to be verified on disk and committed. A host with no declared maxConcurrency (most non-Claude runtimes today) stays serial regardless of the setting. Resolution and the Plan-ID dedup guard live in chunked-planning-mode.md itself (gated on the section's own CHUNKED_MODE skip-check) rather than in plan-phase.md, so a non-chunked run pays no extra gsd_run calls. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * test(#3777): repoint extraction at chunked-planning-mode.md after the move CHUNKED_PARALLEL resolution moved out of plan-phase.md into chunked-planning-mode.md itself (see the preceding commit); update the test's extraction path and header comment to match. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(#3777): relocate the canonical runtime-launcher preamble before its first use The CHUNKED_PARALLEL resolution block's two gsd_run calls landed earlier in the file than the sole existing preamble (in the commit step), which tests/runtime-launcher-parity.test.cjs's (B) check requires to precede every gsd_run call in the file. Move the preamble (not duplicate it) to the top of the resolution block; the commit step's fenced block now just calls gsd_run directly. Caught by the GREEN checkpoint gsd-test run before push. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(#3777): strip the canonical preamble from the extracted resolution block The CHUNKED_PARALLEL resolution fence now carries the relocated runtime-launcher preamble as its first line (previous commit). Extracting the whole fence and running it after the test's own gsd_run stub let the embedded preamble's own resolver logic `unset -f gsd_run` and exit 1 before reaching the resolution logic, since no real gsd-tools.cjs exists in the temp script dir — every test calling runChunkedParallelResolution() failed. Strip the preamble (sourced from gsd-core/workflows/_runtime-launcher.snippet.sh, the same file scripts/sync-runtime-launcher.cjs treats as canonical) before splicing in the stub, so this suite tests only the resolution logic it is actually about. Caught by the post-rebase gsd-test run before push. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * docs(#3777): add the How-To page the phase gate requires Enablement is 2 commands (config-set, then --chunked), which this repo's own doc-quadrant gate flags as how-to-owed: a reference table cannot carry a sequence. Covers enablement, the dispatch-capacity gate's honest "most runtimes today: no effect" case, and the two accepted trade-offs. An earlier reasoning pass (recorded in .gsd/phase/.../70-docs.json before this commit) had incorrectly claimed #3034 shipped with no equivalent how-to page, as precedent for skipping one here. That claim was false — docs/how-to/enable-parallel-reviewer-lanes.md exists and is indexed. The phase gate caught the omission before merge; corrected here. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * docs(#3777): backfill changeset PR number Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: sim <sim@local> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
54 lines
1.9 KiB
Markdown
54 lines
1.9 KiB
Markdown
# Chunked Mode Return Formats
|
|
|
|
Used when `plan-phase` spawns `gsd-planner` with `CHUNKED_MODE=true` (triggered by `--chunked`
|
|
flag or `workflow.plan_chunked: true` config). Splits the single long-lived planner Task into
|
|
shorter-lived Tasks to bound the blast radius of Windows stdio hangs.
|
|
|
|
## Modes
|
|
|
|
### outline-only
|
|
|
|
Write **only** `{PHASE_DIR}/{PADDED_PHASE}-PLAN-OUTLINE.md`. Do not write any PLAN.md files.
|
|
Return:
|
|
|
|
```markdown
|
|
## OUTLINE COMPLETE
|
|
|
|
**Phase:** {phase-name}
|
|
**Plans:** {N} plan(s) in {M} wave(s)
|
|
|
|
| Plan ID | Objective | Wave | Depends On | Requirements |
|
|
|---------|-----------|------|-----------|-------------|
|
|
| {padded_phase}-01 | [brief objective] | 1 | none | REQ-001, REQ-002 |
|
|
| {padded_phase}-02 | [brief objective] | 1 | none | REQ-003 |
|
|
```
|
|
|
|
The orchestrator reads this table, groups rows by `Wave` (ascending, blank treated as `1`), then
|
|
spawns one single-plan Task per row — one Wave at a time, serially across Waves. Within a Wave,
|
|
Tasks are spawned one at a time by default, or together (`run_in_background=true` on each, issued
|
|
in one message) when `planning.chunked_parallel: true` and the host's negotiated dispatch capacity
|
|
supports it (#3777; see `gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md` §8.5.2).
|
|
|
|
### single-plan
|
|
|
|
Write **exactly one** `{PHASE_DIR}/{plan_id}-PLAN.md`. Do not write any other plan files.
|
|
Return:
|
|
|
|
```markdown
|
|
## PLAN COMPLETE
|
|
|
|
**Plan:** {plan-id}
|
|
**Objective:** {brief}
|
|
**File:** {PHASE_DIR}/{plan-id}-PLAN.md
|
|
**Tasks:** {N}
|
|
```
|
|
|
|
The orchestrator verifies the file exists on disk after each return, commits it, then moves
|
|
to the next plan entry from the outline.
|
|
|
|
## Resume Behaviour
|
|
|
|
If the orchestrator detects that `PLAN-OUTLINE.md` already exists (from a prior interrupted
|
|
run), it skips the outline-only Task and goes directly to single-plan Tasks, skipping any
|
|
`{plan_id}-PLAN.md` files that already exist on disk.
|