From f74442310d6835dbb176db4b7bb16ae3bd70e528 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Wed, 15 Jul 2026 12:55:38 -0400 Subject: [PATCH] fix(#2257): auto-resume debug on non-terminal session-manager return (#2300) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The /gsd-debug orchestrator handled the gsd-debug-session-manager return with only two literal-string checks (DEBUG SESSION COMPLETE, ABANDONED) and no else branch, so a usable-but-non-terminal progress summary (the manager's own turn/context budget exhausted mid-loop, with a valid on-disk checkpoint) fell through to the user as if the debug were complete. Same gap at the continue subcommand. Callee side (agents/gsd-debug-session-manager.md): add an explicit non-terminal CONTINUE_REQUIRED return marker, distinct from the two terminal shapes and from a genuine user-input checkpoint. Orchestrator (gsd-core/workflows/debug.md Sections 4 and 1c): classify returns exhaustively — recognized terminal markers behave as before, anything else is non-terminal and auto-resumes by re-spawning the session manager from the same slug/checkpoint. Anti-loop guard: after two consecutive no-progress resumes (unchanged next_action/updated), emit a blocker report instead of looping. Regression test (source-text contract guard, fix-2196 idiom) asserts both sections' non-terminal/auto-resume branch, the CONTINUE_REQUIRED marker, and the anti-loop bound. Co-authored-by: Claude Opus 4.8 (1M context) --- .changeset/nimble-ravens-dart.md | 5 + agents/gsd-debug-session-manager.md | 18 ++- gsd-core/workflows/debug.md | 20 ++- tests/agent-size-baseline.json | 2 +- ...fix-2257-debug-nonterminal-resume.test.cjs | 138 ++++++++++++++++++ .../golden-install-parity/antigravity.json | 4 +- .../golden-install-parity/augment.json | 4 +- .../golden-install-parity/claude-local.json | 4 +- .../golden-install-parity/claude.json | 4 +- .../fixtures/golden-install-parity/cline.json | 4 +- .../golden-install-parity/codebuddy.json | 4 +- .../fixtures/golden-install-parity/codex.json | 6 +- .../golden-install-parity/copilot.json | 4 +- .../golden-install-parity/cursor.json | 4 +- .../golden-install-parity/hermes.json | 4 +- .../fixtures/golden-install-parity/kilo.json | 4 +- .../fixtures/golden-install-parity/kimi.json | 4 +- .../golden-install-parity/opencode.json | 4 +- tests/fixtures/golden-install-parity/pi.json | 2 +- .../fixtures/golden-install-parity/qwen.json | 4 +- .../fixtures/golden-install-parity/trae.json | 4 +- .../golden-install-parity/windsurf.json | 4 +- .../fixtures/golden-install-parity/zcode.json | 4 +- tests/workflow-size-baseline.json | 2 +- 24 files changed, 215 insertions(+), 42 deletions(-) create mode 100644 .changeset/nimble-ravens-dart.md create mode 100644 tests/fix-2257-debug-nonterminal-resume.test.cjs diff --git a/.changeset/nimble-ravens-dart.md b/.changeset/nimble-ravens-dart.md new file mode 100644 index 000000000..f854ef145 --- /dev/null +++ b/.changeset/nimble-ravens-dart.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 2300 +--- +**`/gsd-debug` now auto-resumes instead of stopping mid-investigation** — when the debug session-manager's own turn ended before the investigation was complete, the orchestrator treated the intermediate progress summary as completion and returned control to the user. It now recognizes a non-terminal `CONTINUE_REQUIRED` return, auto-resumes from the on-disk checkpoint, and only stops for genuine terminal conditions (with a no-progress anti-loop guard). (#2257) diff --git a/agents/gsd-debug-session-manager.md b/agents/gsd-debug-session-manager.md index f3128591d..842e48201 100644 --- a/agents/gsd-debug-session-manager.md +++ b/agents/gsd-debug-session-manager.md @@ -272,9 +272,22 @@ If user selects 3: proceed to Step 4 with fix = "not applied". ## Step 4: Return Compact Summary +**Non-terminal early stop — check this FIRST.** Before returning any summary below, ask: is your own turn/context budget exhausted while the debugger (`gsd-debugger`) is still investigating — i.e. you have NOT reached `DEBUG COMPLETE`, a user-chosen `ABANDONED`, or exhausted the `INVESTIGATION INCONCLUSIVE` options? If so, do NOT fabricate a `DEBUG SESSION COMPLETE` or `ABANDONED` summary to fit this shape. Return the non-terminal marker instead: + +```markdown +## CONTINUE_REQUIRED + +**Session:** {debug_file_path} +**Status:** {status from frontmatter, e.g. investigating} +**Next action:** {next_action from Current Focus} +**Reason:** session-manager turn/context budget exhausted — investigation still in progress +``` + +`CONTINUE_REQUIRED` is distinct from both terminal shapes below AND from `## CHECKPOINT REACHED` (Step 3d): a `CHECKPOINT REACHED` is a genuine user-input/approval checkpoint that already correctly pauses via `AskUserQuestion` before looping back to Step 3 — it is not returned to the orchestrator. `CONTINUE_REQUIRED` is emitted only when no checkpoint is pending and the loop simply cannot proceed further in this turn. The orchestrator resumes by re-spawning this agent with the SAME `slug`/`debug_file_path` — the on-disk checkpoint at `.planning/debug/{slug}.md` (its `status` and `next_action`) is the source of truth for where to pick up. Never return control to the user as if the session were complete when it is not. + Read the resolved (or current) debug file to extract final Resolution values. -Return compact summary: +Return compact summary (terminal — investigation resolved): ```markdown ## DEBUG SESSION COMPLETE @@ -287,7 +300,7 @@ Return compact summary: **Specialist review:** {specialist_hint used, or "none"} ``` -If the session was abandoned by user choice, return: +If the session was abandoned by user choice, return (terminal — user stopped): ```markdown ## DEBUG SESSION COMPLETE @@ -311,5 +324,6 @@ If the session was abandoned by user choice, return: - [ ] Specialist dispatch executed when specialist_dispatch_enabled and hint maps to a skill - [ ] TDD gate applied when tdd_mode=true and ROOT CAUSE FOUND - [ ] Loop continues until DEBUG COMPLETE, ABANDONED, or user stops +- [ ] Non-terminal `CONTINUE_REQUIRED` (not a fabricated terminal summary) returned when the manager's own turn/context budget is exhausted mid-investigation - [ ] Compact summary returned (at most 2K tokens) diff --git a/gsd-core/workflows/debug.md b/gsd-core/workflows/debug.md index 7bd7a78d4..2f61e2098 100644 --- a/gsd-core/workflows/debug.md +++ b/gsd-core/workflows/debug.md @@ -137,6 +137,10 @@ specialist_dispatch_enabled: true Display the compact summary returned by the session manager. +**Return handling — exhaustive, no fallthrough (#2257).** Apply the same three-way classification as Section 4 "Session Management" below: `DEBUG SESSION COMPLETE` and `ABANDONED` are the only two terminal shapes. ANYTHING ELSE — including the explicit `## CONTINUE_REQUIRED` marker and any unrecognized or malformed summary that is not one of the two terminal markers — is non-terminal. Read `.planning/debug/{SLUG}.md` for the current `status`/`next_action` and AUTO-RESUME by re-spawning `gsd-debug-session-manager` with the SAME `SLUG`/checkpoint (identical `session_params` as the spawn above) — do NOT return control to the user, and do NOT report the session as complete. + +**Anti-loop guard.** Same two-stop policy as Section 4 "Session Management": (1) a no-progress heuristic keyed on `next_action` ALONE from `.planning/debug/{SLUG}.md` — never `updated`, which is overwritten on every checkpoint write (`agents/gsd-debugger.md`: "Update the file BEFORE taking action"), so it changes every cycle and can never signal no-progress. Two consecutive auto-resumes with `next_action` UNCHANGED stop the loop and print a blocker report to the user (checkpoint path, status, next_action, "N auto-resumes made no progress"). And (2) an absolute hard cap, independent of content: the orchestrator tracks a running total of auto-resume spawns for this `SLUG` within the current `/gsd:debug` invocation; after **3** total auto-resumes for the slug, STOP auto-resuming and emit the blocker report REGARDLESS of whether `next_action` changed. The hard cap is the guaranteed termination bound; the no-progress heuristic is only a faster early exit before the cap is reached. + ## 1d. Check Active Sessions (SUBCMD=debug) When SUBCMD=debug: @@ -222,8 +226,18 @@ specialist_dispatch_enabled: true Display the compact summary returned by the session manager. -If summary shows `DEBUG SESSION COMPLETE`: done. -If summary shows `ABANDONED`: note session saved at `.planning/debug/{slug}.md` for later `/gsd:debug continue {slug}`. +**Return handling — exhaustive, no fallthrough (#2257).** Every return from the session manager falls into exactly one of three buckets. Do not treat "not recognized" as "complete." + +1. **Terminal — complete.** Summary shows `DEBUG SESSION COMPLETE` (without an `ABANDONED` status line): the session is finished. Stop. +2. **Terminal — abandoned.** Summary shows `ABANDONED`: note session saved at `.planning/debug/{slug}.md` for later `/gsd:debug continue {slug}`. Stop. +3. **Non-terminal — auto-resume.** ANYTHING ELSE — including the explicit `## CONTINUE_REQUIRED` marker and any unrecognized or malformed summary that is not one of the two terminal markers above — is non-terminal. Read `.planning/debug/{slug}.md` for the current `status` and `next_action`, then AUTO-RESUME by re-spawning `gsd-debug-session-manager` with the SAME `slug`/`debug_file_path` and identical `session_params` as the spawn above. Do NOT return control to the user; do NOT report the session as complete. + +**Anti-loop guard.** Two independent stops apply; the orchestrator honors whichever trips first: + +1. **No-progress heuristic (fast early-stop).** Before each auto-resume, record the checkpoint's `next_action` from `.planning/debug/{slug}.md`. Do NOT key this off `updated` — the session manager overwrites `updated` on every checkpoint write (`agents/gsd-debugger.md`: "Update the file BEFORE taking action"), so it changes every cycle and can never signal no-progress; an AND-condition on `updated` is permanently false and makes the guard dead. After the resumed spawn returns, compare `next_action` against the pre-spawn value. If two consecutive auto-resumes complete with `next_action` UNCHANGED, STOP auto-resuming: print a blocker report to the user — checkpoint path, status, next_action, and "N auto-resumes made no progress" — and return control. +2. **Absolute hard cap (real termination bound).** Independent of content: the orchestrator tracks a running total of auto-resume spawns for this `slug` within the current `/gsd:debug` invocation. After **3** total auto-resumes for the slug, STOP auto-resuming and emit the blocker report REGARDLESS of whether `next_action` changed. This hard cap is the guaranteed termination bound; the no-progress heuristic above is only a faster early exit before the cap is reached. + +**Note — session-manager-internal pause points.** Genuine user input / architectural decisions, destructive-action approvals, unresolved blockers, unrepairable gate failures, and readiness-for-native-UAT are all handled INSIDE `gsd-debug-session-manager` via `AskUserQuestion` (Step 3d `CHECKPOINT REACHED`) — the manager pauses, collects the response, and loops internally; it does not return to the orchestrator for these. The orchestrator only ever sees the two terminal markers (`DEBUG SESSION COMPLETE`, `ABANDONED`) or a non-terminal return that triggers auto-resume — the classification above stays strictly terminal-vs-non-terminal, with no third orchestrator-visible "stop for user" return type. @@ -236,4 +250,6 @@ If summary shows `ABANDONED`: note session saved at `.planning/debug/{slug}.md` - [ ] gsd-debug-session-manager spawned with security-hardened session_params - [ ] Session manager handles full checkpoint/continuation loop in isolated context - [ ] Compact summary displayed to user after session manager returns +- [ ] Non-terminal returns (`CONTINUE_REQUIRED` or unrecognized) auto-resume from the checkpoint instead of being treated as complete +- [ ] Anti-loop guard stops auto-resume after repeated no-progress cycles and reports a blocker diff --git a/tests/agent-size-baseline.json b/tests/agent-size-baseline.json index afcc1cdad..ec04abba3 100644 --- a/tests/agent-size-baseline.json +++ b/tests/agent-size-baseline.json @@ -5,7 +5,7 @@ "gsd-code-fixer.md": 36640, "gsd-code-reviewer.md": 16870, "gsd-codebase-mapper.md": 21485, - "gsd-debug-session-manager.md": 14203, + "gsd-debug-session-manager.md": 15887, "gsd-debugger.md": 51354, "gsd-doc-classifier.md": 11717, "gsd-doc-synthesizer.md": 13154, diff --git a/tests/fix-2257-debug-nonterminal-resume.test.cjs b/tests/fix-2257-debug-nonterminal-resume.test.cjs new file mode 100644 index 000000000..775d4442b --- /dev/null +++ b/tests/fix-2257-debug-nonterminal-resume.test.cjs @@ -0,0 +1,138 @@ +'use strict'; + +/** + * #2257: the /gsd-debug orchestrator had no contract for a foreground + * gsd-debug-session-manager return that is usable but non-terminal. Section 4 + * "Session Management" (and the `continue` subcommand's return handling in + * Section 1c) recognized only two literal-string returns — `DEBUG SESSION + * COMPLETE` and `ABANDONED` — with no else branch. Any other return (e.g. a + * mid-investigation progress summary emitted when the manager's own + * turn/context budget runs out) matched neither and fell through to the user + * as if the debug session were complete, silently abandoning the + * investigation mid-flight. + * + * The fix defines an explicit non-terminal marker, `CONTINUE_REQUIRED`, that + * the session manager emits when it must stop before reaching a terminal + * state (distinct from the two terminal returns and from a genuine + * user-input/approval `CHECKPOINT REACHED`, which already correctly pauses + * via AskUserQuestion). The orchestrator treats anything that is not one of + * the two terminal markers as non-terminal and auto-resumes by re-spawning + * the session manager from the on-disk checkpoint, bounded by an anti-loop + * guard. + * + * Correction (orthogonal review): the first cut of the anti-loop guard + * required BOTH `next_action` AND `updated` to be unchanged across two + * resumes to detect no-progress — but `agents/gsd-debugger.md` overwrites + * `updated` on every checkpoint write ("Update the file BEFORE taking + * action"), so `updated` changes every cycle and the AND-condition could + * never be true, making the guard dead (unbounded auto-resume / DoS + * regression). The corrected guard keys no-progress detection off + * `next_action` ALONE and adds an absolute, content-independent hard cap of + * 3 total auto-resumes per slug per `/gsd:debug` invocation as the real + * termination bound. + * + * debug.md and gsd-debug-session-manager.md ARE the product the runtime + * loads, so this asserts the deployed text carries the contract — the + * sanctioned source-text/contract-guard idiom (see + * tests/fix-2196-debug-agent-handoff.test.cjs). + */ + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const DEBUG_MD = path.join(__dirname, '..', 'gsd-core', 'workflows', 'debug.md'); +const SESSION_MANAGER_MD = path.join(__dirname, '..', 'agents', 'gsd-debug-session-manager.md'); + +describe('#2257 debug non-terminal session-manager return contract', () => { + // allow-test-rule: workflow/agent prose IS the runtime contract under test #2257 + const debugContent = fs.readFileSync(DEBUG_MD, 'utf-8'); + // allow-test-rule: workflow/agent prose IS the runtime contract under test #2257 + const managerContent = fs.readFileSync(SESSION_MANAGER_MD, 'utf-8'); + + const section4Start = debugContent.indexOf('## 4. Session Management'); + const section4 = section4Start !== -1 ? debugContent.slice(section4Start) : ''; + + const section1cStart = debugContent.indexOf('## 1c. CONTINUE subcommand'); + const section1dStart = debugContent.indexOf('## 1d. Check Active Sessions'); + const section1c = + section1cStart !== -1 && section1dStart !== -1 + ? debugContent.slice(section1cStart, section1dStart) + : ''; + + test('debug.md has Section 4 (Session Management) and Section 1c (CONTINUE subcommand)', () => { + assert.notEqual(section4Start, -1, 'debug.md must contain Section 4 Session Management'); + assert.notEqual(section1cStart, -1, 'debug.md must contain Section 1c CONTINUE subcommand'); + }); + + test('Section 4 has an exhaustive non-terminal branch that auto-resumes from the checkpoint', () => { + assert.ok(/CONTINUE_REQUIRED/.test(section4), + 'Section 4 must reference the CONTINUE_REQUIRED non-terminal marker'); + assert.ok(/ANYTHING ELSE/i.test(section4), + 'Section 4 must exhaustively catch any return that is not one of the two terminal markers'); + assert.ok(/AUTO-RESUME/i.test(section4) && /re-spawning/i.test(section4), + 'Section 4 must auto-resume by re-spawning the session manager, not return control to the user'); + assert.ok(/same.{0,20}slug/i.test(section4), + 'Section 4 auto-resume must use the SAME slug/checkpoint as the original spawn'); + }); + + test('Section 1c has the same exhaustive non-terminal auto-resume branch (not just the two literals)', () => { + assert.ok(/CONTINUE_REQUIRED/.test(section1c), + 'Section 1c must reference the CONTINUE_REQUIRED non-terminal marker'); + assert.ok(/ANYTHING ELSE/i.test(section1c), + 'Section 1c must exhaustively catch any return that is not one of the two terminal markers'); + assert.ok(/AUTO-RESUME/i.test(section1c) && /re-spawning/i.test(section1c), + 'Section 1c must auto-resume by re-spawning the session manager, not return control to the user'); + assert.ok(/same.{0,20}slug/i.test(section1c), + 'Section 1c auto-resume must use the SAME slug/checkpoint as the original spawn (symmetric with Section 4)'); + }); + + test('gsd-debug-session-manager.md defines CONTINUE_REQUIRED distinct from the two terminal formats', () => { + assert.ok(/## CONTINUE_REQUIRED/.test(managerContent), + 'the agent must define an explicit ## CONTINUE_REQUIRED return heading'); + assert.ok(/## DEBUG SESSION COMPLETE/.test(managerContent), + 'the terminal DEBUG SESSION COMPLETE format must still be present'); + assert.ok(/ABANDONED/.test(managerContent), + 'the terminal ABANDONED format must still be present'); + assert.ok(/non-terminal/i.test(managerContent), + 'the agent must characterize CONTINUE_REQUIRED as non-terminal'); + assert.ok(/CHECKPOINT REACHED/.test(managerContent) && /distinct from/i.test(managerContent), + 'CONTINUE_REQUIRED must be explicitly distinguished from the genuine user-input CHECKPOINT REACHED shape'); + assert.ok(/\.planning\/debug\/\{slug\}\.md/.test(managerContent), + 'CONTINUE_REQUIRED must reference the on-disk checkpoint path'); + assert.ok(/next_action/.test(managerContent) && /status/.test(managerContent), + 'CONTINUE_REQUIRED must reference the checkpoint status/next_action fields'); + }); + + test('an anti-loop bound exists so repeated no-progress auto-resumes do not loop indefinitely', () => { + assert.ok(/anti-loop guard/i.test(section4), + 'Section 4 must name an anti-loop guard'); + assert.ok(/blocker report/i.test(section4), + 'Section 4 must emit a blocker report to the user once the bound is exceeded, instead of looping forever'); + + assert.ok(/anti-loop guard/i.test(section1c), + 'Section 1c must name an anti-loop guard'); + }); + + test('the anti-loop guard has an absolute hard cap independent of no-progress detection (#2257 correction)', () => { + for (const [label, section] of [['Section 4', section4], ['Section 1c', section1c]]) { + assert.ok(/hard cap/i.test(section), `${label} must name an absolute hard cap`); + assert.ok(/\b3\b/.test(section) && /total auto-resumes/i.test(section), + `${label} must encode a concrete numeric cap of 3 total auto-resumes`); + assert.ok(/regardless/i.test(section), + `${label} hard cap must trip regardless of whether next_action changed (content-independent)`); + } + }); + + test('no-progress detection keys off next_action alone, never the always-changing updated timestamp (#2257 correction)', () => { + for (const [label, section] of [['Section 4', section4], ['Section 1c', section1c]]) { + assert.ok(/next_action/.test(section), + `${label} no-progress heuristic must reference next_action`); + assert.ok(/(do not|never).{0,40}updated/i.test(section), + `${label} must explicitly forbid keying no-progress detection off updated`); + assert.ok(/changes every cycle/i.test(section), + `${label} must state WHY updated cannot be used: it is overwritten/changes every checkpoint cycle`); + } + }); +}); diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 51ca81c9a..3089db641 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "6937a1f20beaa1c6", "agents/gsd-code-reviewer.md": "a700d295bbf110a9", "agents/gsd-codebase-mapper.md": "afdae82284cb21b4", - "agents/gsd-debug-session-manager.md": "5ea82765fc041ad7", + "agents/gsd-debug-session-manager.md": "a2ca059d2ebf0858", "agents/gsd-debugger.md": "7439166a1770521c", "agents/gsd-doc-classifier.md": "fca19595590391df", "agents/gsd-doc-synthesizer.md": "0e5184bbcf0dca02", @@ -211,7 +211,7 @@ "gsd-core/workflows/code-review-fix.md": "60640e633b0a124b", "gsd-core/workflows/code-review.md": "5c40505c01871153", "gsd-core/workflows/complete-milestone.md": "aaf272074acec69d", - "gsd-core/workflows/debug.md": "af2d1ae03b24fc71", + "gsd-core/workflows/debug.md": "0b802b267d0ca2d1", "gsd-core/workflows/diagnose-issues.md": "c8c41993c277363c", "gsd-core/workflows/discovery-phase.md": "3de990caffdde4f8", "gsd-core/workflows/discuss-phase-assumptions.md": "8581fd77def7ce84", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index c630aa354..c3f16592a 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "68b2d2faccfdd8a3", "agents/gsd-code-reviewer.md": "bc8a6f2e1f787ff5", "agents/gsd-codebase-mapper.md": "85ea778ad9cf7e66", - "agents/gsd-debug-session-manager.md": "0d388fcee3eba770", + "agents/gsd-debug-session-manager.md": "cf7f235f6d32c0b9", "agents/gsd-debugger.md": "2c8234c76c5d15c1", "agents/gsd-doc-classifier.md": "262a94b947a4e2aa", "agents/gsd-doc-synthesizer.md": "01f90ea9b0d05d7d", @@ -282,7 +282,7 @@ "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", "gsd-core/workflows/code-review.md": "334c90c401f291f8", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "c581e89aa9d9d71e", + "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "6cc3900891dfb927", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", "gsd-core/workflows/discuss-phase-assumptions.md": "f5b765d33eba4f88", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index bdc8ffa22..331e1817b 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -6,7 +6,7 @@ "agents/gsd-code-fixer.md": "c6148e5511d02459", "agents/gsd-code-reviewer.md": "e2c45baa8c0b5f6d", "agents/gsd-codebase-mapper.md": "f96958e5f85b93fb", - "agents/gsd-debug-session-manager.md": "ec9ca0011a1aab75", + "agents/gsd-debug-session-manager.md": "368d88502df7ac5f", "agents/gsd-debugger.md": "9f35a91f8b3a918e", "agents/gsd-doc-classifier.md": "a76778bdde1c7f72", "agents/gsd-doc-synthesizer.md": "8b0b6fc187c9d353", @@ -281,7 +281,7 @@ "gsd-core/workflows/code-review-fix.md": "78c716068ccdf820", "gsd-core/workflows/code-review.md": "2d21452eb0449fdd", "gsd-core/workflows/complete-milestone.md": "9962377cddee50d7", - "gsd-core/workflows/debug.md": "18c97b804f2dd5dd", + "gsd-core/workflows/debug.md": "80c413b3a9877433", "gsd-core/workflows/diagnose-issues.md": "db6a599674efbc4d", "gsd-core/workflows/discovery-phase.md": "a20dfb32adec51de", "gsd-core/workflows/discuss-phase-assumptions.md": "35a3b2d1285565d8", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 6bd374f4c..cfc788311 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -6,7 +6,7 @@ "agents/gsd-code-fixer.md": "3d5f67cfd24ac452", "agents/gsd-code-reviewer.md": "d626a828e8de3648", "agents/gsd-codebase-mapper.md": "8c2e9f2ce3aedf78", - "agents/gsd-debug-session-manager.md": "767c0f43d47e89ad", + "agents/gsd-debug-session-manager.md": "93bbc34d0d1cfdef", "agents/gsd-debugger.md": "4d8a618121c8056a", "agents/gsd-doc-classifier.md": "a636ae9594b25770", "agents/gsd-doc-synthesizer.md": "dfb95eedfb3789bf", @@ -210,7 +210,7 @@ "gsd-core/workflows/code-review-fix.md": "722416b71b31c5fc", "gsd-core/workflows/code-review.md": "506412604f767adc", "gsd-core/workflows/complete-milestone.md": "dcf1182398efb1ca", - "gsd-core/workflows/debug.md": "7183935f8e145a01", + "gsd-core/workflows/debug.md": "b4c658c9608d08e2", "gsd-core/workflows/diagnose-issues.md": "75ffc381ac3059ff", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", "gsd-core/workflows/discuss-phase-assumptions.md": "a8cd1db094fefd35", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index f2dc8db96..a782fa2b0 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -10,7 +10,7 @@ "agents/gsd-code-fixer.md": "6aa74a2fb2ad244a", "agents/gsd-code-reviewer.md": "e5ec12d4d409e800", "agents/gsd-codebase-mapper.md": "e5b7941bdda53c91", - "agents/gsd-debug-session-manager.md": "a9d4e43e4d2e327a", + "agents/gsd-debug-session-manager.md": "60f3b42d4aa7f90f", "agents/gsd-debugger.md": "b1f3af91f0e651c8", "agents/gsd-doc-classifier.md": "5011d7358d2b2848", "agents/gsd-doc-synthesizer.md": "e59cdd669876582d", @@ -214,7 +214,7 @@ "gsd-core/workflows/code-review-fix.md": "e4549af672e74e6f", "gsd-core/workflows/code-review.md": "a65e3e869508f89e", "gsd-core/workflows/complete-milestone.md": "c0808127038a8f86", - "gsd-core/workflows/debug.md": "337fc2076e7fc449", + "gsd-core/workflows/debug.md": "870682af53182a6c", "gsd-core/workflows/diagnose-issues.md": "e616d0d730328d68", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", "gsd-core/workflows/discuss-phase-assumptions.md": "9efcb2ef6a9245b3", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 6c20489a2..7b7a4123a 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "1cf3a9fdade9a470", "agents/gsd-code-reviewer.md": "5342fcc0da974696", "agents/gsd-codebase-mapper.md": "b995bf01af0193d2", - "agents/gsd-debug-session-manager.md": "a5649998f68812d5", + "agents/gsd-debug-session-manager.md": "a13fdb7f466dd5ff", "agents/gsd-debugger.md": "a63306f54bdc63bf", "agents/gsd-doc-classifier.md": "c2bf59af9467810b", "agents/gsd-doc-synthesizer.md": "b2a179bf3c9bd636", @@ -282,7 +282,7 @@ "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", "gsd-core/workflows/code-review.md": "334c90c401f291f8", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "c581e89aa9d9d71e", + "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "77d98ac07c4a26ff", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", "gsd-core/workflows/discuss-phase-assumptions.md": "f5b765d33eba4f88", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 22763e40e..203fae673 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -84,8 +84,8 @@ "agents/gsd-code-reviewer.toml": "66420d6e6ffd14eb", "agents/gsd-codebase-mapper.md": "cf8f8550b44aec35", "agents/gsd-codebase-mapper.toml": "a4609f3ac66c2081", - "agents/gsd-debug-session-manager.md": "3d4779f94c6cfb14", - "agents/gsd-debug-session-manager.toml": "c8d894c734e97256", + "agents/gsd-debug-session-manager.md": "22afb03c62b19298", + "agents/gsd-debug-session-manager.toml": "6abd110e0c7f62d1", "agents/gsd-debugger.md": "cb8a103ed221ca7c", "agents/gsd-debugger.toml": "b31333b83a8fed0a", "agents/gsd-doc-classifier.md": "2745bc04d7b93666", @@ -317,7 +317,7 @@ "gsd-core/workflows/code-review-fix.md": "ae7f9c6b39a23c12", "gsd-core/workflows/code-review.md": "eadada9e0a89adf2", "gsd-core/workflows/complete-milestone.md": "017df7443bd08da5", - "gsd-core/workflows/debug.md": "7c3b407470762585", + "gsd-core/workflows/debug.md": "63691293c0bc0294", "gsd-core/workflows/diagnose-issues.md": "e38bb21d06dff077", "gsd-core/workflows/discovery-phase.md": "71a4b78ff876a854", "gsd-core/workflows/discuss-phase-assumptions.md": "0d936ec25299917c", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index 4698f94b1..b640f22ef 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.agent.md": "8f39aacb760aab57", "agents/gsd-code-reviewer.agent.md": "fa1e7c421c78eae1", "agents/gsd-codebase-mapper.agent.md": "949bc73f2a7ea44d", - "agents/gsd-debug-session-manager.agent.md": "558683230ba311ba", + "agents/gsd-debug-session-manager.agent.md": "b34b7d3f7e7035ca", "agents/gsd-debugger.agent.md": "d31e32f73cd1e0dc", "agents/gsd-doc-classifier.agent.md": "aea81c0ba00e06cf", "agents/gsd-doc-synthesizer.agent.md": "6ae32e4db005696d", @@ -212,7 +212,7 @@ "gsd-core/workflows/code-review-fix.md": "fda53892ae4b17fc", "gsd-core/workflows/code-review.md": "f1c045ec4d33abc8", "gsd-core/workflows/complete-milestone.md": "470cf39261400ee2", - "gsd-core/workflows/debug.md": "505ed67d48b1fa9d", + "gsd-core/workflows/debug.md": "37c900b9f6c11663", "gsd-core/workflows/diagnose-issues.md": "42acbe2a43fc886e", "gsd-core/workflows/discovery-phase.md": "8e99da61fb2b7074", "gsd-core/workflows/discuss-phase-assumptions.md": "ab0c432b84038681", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index aac33baf2..53b311f03 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "76085f4442f268e6", "agents/gsd-code-reviewer.md": "f29d6edbac0a01b6", "agents/gsd-codebase-mapper.md": "d49c91fdab4efc70", - "agents/gsd-debug-session-manager.md": "d6e799fdeb1fadde", + "agents/gsd-debug-session-manager.md": "284d49a7fbe4a040", "agents/gsd-debugger.md": "79bccf33fa2b4272", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", @@ -282,7 +282,7 @@ "gsd-core/workflows/code-review-fix.md": "c57af378033b1b58", "gsd-core/workflows/code-review.md": "32c37bcbec8b8698", "gsd-core/workflows/complete-milestone.md": "1400a4856f592f3e", - "gsd-core/workflows/debug.md": "c02dec84c8a346b9", + "gsd-core/workflows/debug.md": "fb9e5ecb5027b98e", "gsd-core/workflows/diagnose-issues.md": "cd582747131726e3", "gsd-core/workflows/discovery-phase.md": "7dcf150998559c11", "gsd-core/workflows/discuss-phase-assumptions.md": "c25c6a6c633d71b6", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 794efde0a..282104f14 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "94628312f25decb5", "agents/gsd-code-reviewer.md": "5ef947ca5baed775", "agents/gsd-codebase-mapper.md": "feccaeeacd05e34b", - "agents/gsd-debug-session-manager.md": "e0bdc1947db579c4", + "agents/gsd-debug-session-manager.md": "ac81c11d0fd3292a", "agents/gsd-debugger.md": "ec4f796f5c39504a", "agents/gsd-doc-classifier.md": "29b563a146c9d22c", "agents/gsd-doc-synthesizer.md": "652beb928e93fa1d", @@ -211,7 +211,7 @@ "gsd-core/workflows/code-review-fix.md": "e829d3baf9901b54", "gsd-core/workflows/code-review.md": "50a05ab8957bd05f", "gsd-core/workflows/complete-milestone.md": "f1866541148dc291", - "gsd-core/workflows/debug.md": "639348c8657e7147", + "gsd-core/workflows/debug.md": "0289d3caa7252779", "gsd-core/workflows/diagnose-issues.md": "16f2d2a85335641f", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", "gsd-core/workflows/discuss-phase-assumptions.md": "3a1e215890d2b3f4", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index 38c54f963..2bf982251 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "9652d5b56a2afbf5", "agents/gsd-code-reviewer.md": "922c08885bc78662", "agents/gsd-codebase-mapper.md": "0ccbf6a685804979", - "agents/gsd-debug-session-manager.md": "828335b15a46b324", + "agents/gsd-debug-session-manager.md": "56719239e1e06145", "agents/gsd-debugger.md": "b59cda547363e617", "agents/gsd-doc-classifier.md": "6256bbc0b887f60f", "agents/gsd-doc-synthesizer.md": "212aaf89a34b51d7", @@ -282,7 +282,7 @@ "gsd-core/workflows/code-review-fix.md": "722416b71b31c5fc", "gsd-core/workflows/code-review.md": "506412604f767adc", "gsd-core/workflows/complete-milestone.md": "59753bf44d4300da", - "gsd-core/workflows/debug.md": "28c964bceb6f03af", + "gsd-core/workflows/debug.md": "e88c2d430c3625b6", "gsd-core/workflows/diagnose-issues.md": "210b5b313e8a559a", "gsd-core/workflows/discovery-phase.md": "ca7b2be46e59e862", "gsd-core/workflows/discuss-phase-assumptions.md": "3ef1df313e715387", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 4c842e300..a92fab751 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -43,7 +43,7 @@ "agents/subagents/gsd-code-reviewer.yaml": "5f2398f56018f50d", "agents/subagents/gsd-codebase-mapper.md": "04c7528a13fa3de7", "agents/subagents/gsd-codebase-mapper.yaml": "bce1c6d15f55c477", - "agents/subagents/gsd-debug-session-manager.md": "be5653e631bbd006", + "agents/subagents/gsd-debug-session-manager.md": "feb32f5c184db47b", "agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7", "agents/subagents/gsd-debugger.md": "528ad732ccff4485", "agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43", @@ -275,7 +275,7 @@ "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", "gsd-core/workflows/code-review.md": "334c90c401f291f8", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "c581e89aa9d9d71e", + "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "67c058fc7ae6026b", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", "gsd-core/workflows/discuss-phase-assumptions.md": "f5b765d33eba4f88", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index cbf284a6e..8fc769d81 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "3622ae5d90fb15f6", "agents/gsd-code-reviewer.md": "2249774416314c57", "agents/gsd-codebase-mapper.md": "948612acd505e87f", - "agents/gsd-debug-session-manager.md": "0a0483c6470df4d1", + "agents/gsd-debug-session-manager.md": "373b4c83cc19595d", "agents/gsd-debugger.md": "a83427bd5a0406fc", "agents/gsd-doc-classifier.md": "fb776cfbb7e991b0", "agents/gsd-doc-synthesizer.md": "2389f388d291c2eb", @@ -282,7 +282,7 @@ "gsd-core/workflows/code-review-fix.md": "adb9388bb157610c", "gsd-core/workflows/code-review.md": "ae6bcbd1575aeec4", "gsd-core/workflows/complete-milestone.md": "614299b2c08e66c3", - "gsd-core/workflows/debug.md": "437b47e14eba8786", + "gsd-core/workflows/debug.md": "161be2a77ffce47a", "gsd-core/workflows/diagnose-issues.md": "2971c699d52f1b85", "gsd-core/workflows/discovery-phase.md": "724408336596c50c", "gsd-core/workflows/discuss-phase-assumptions.md": "92e43cd12200c610", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index 1e92570d1..0e472f916 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -178,7 +178,7 @@ "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", "gsd-core/workflows/code-review.md": "334c90c401f291f8", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "c581e89aa9d9d71e", + "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "d6d978fddfd5da8d", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", "gsd-core/workflows/discuss-phase-assumptions.md": "f5b765d33eba4f88", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 23377c86c..cb99c2bae 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "3ed1a27ddc372ef8", "agents/gsd-code-reviewer.md": "27eeeee6cb600e9b", "agents/gsd-codebase-mapper.md": "032ff8ac55466a74", - "agents/gsd-debug-session-manager.md": "9f64af6513b8ec9e", + "agents/gsd-debug-session-manager.md": "72e3f4c60d282873", "agents/gsd-debugger.md": "d0a1e6a1b1cfd9e6", "agents/gsd-doc-classifier.md": "bdf3d54082424e76", "agents/gsd-doc-synthesizer.md": "96c383b74a60fbbe", @@ -211,7 +211,7 @@ "gsd-core/workflows/code-review-fix.md": "f3725ae9d685bed2", "gsd-core/workflows/code-review.md": "29125604bed2c467", "gsd-core/workflows/complete-milestone.md": "40085d32b15805c8", - "gsd-core/workflows/debug.md": "a4e4c2f6d004460e", + "gsd-core/workflows/debug.md": "09b6bad63939bb82", "gsd-core/workflows/diagnose-issues.md": "652ae26975f82242", "gsd-core/workflows/discovery-phase.md": "6161c60d752d0058", "gsd-core/workflows/discuss-phase-assumptions.md": "18712f78bb960ec8", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 7edeb68ef..bb088279a 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "5fe29063843be67e", "agents/gsd-code-reviewer.md": "338c46ab59c4e45f", "agents/gsd-codebase-mapper.md": "8529d8a1ede8bbfb", - "agents/gsd-debug-session-manager.md": "69aa7eae3a23f6a9", + "agents/gsd-debug-session-manager.md": "1519818b8efb2385", "agents/gsd-debugger.md": "704eb4e94b4d1212", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", @@ -211,7 +211,7 @@ "gsd-core/workflows/code-review-fix.md": "f2761f7f8c4a5674", "gsd-core/workflows/code-review.md": "47663a2922756c5e", "gsd-core/workflows/complete-milestone.md": "6e918b72bd885426", - "gsd-core/workflows/debug.md": "7783c3cb81fef70d", + "gsd-core/workflows/debug.md": "04b29e0ba18603b6", "gsd-core/workflows/diagnose-issues.md": "9274b11a3db98c65", "gsd-core/workflows/discovery-phase.md": "b32b6197b66c9a13", "gsd-core/workflows/discuss-phase-assumptions.md": "e376b1cf29379df4", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index 9e15bcb5d..04f2d6ba6 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "f00d815ec535a168", "agents/gsd-code-reviewer.md": "efc0d2dee321c654", "agents/gsd-codebase-mapper.md": "cfa2bbfaf264e1fd", - "agents/gsd-debug-session-manager.md": "793d9a80778d1080", + "agents/gsd-debug-session-manager.md": "a31a327a82f37af1", "agents/gsd-debugger.md": "6b28c99a37402200", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", @@ -211,7 +211,7 @@ "gsd-core/workflows/code-review-fix.md": "b99b1f20bb27c291", "gsd-core/workflows/code-review.md": "faa87faf07ae765a", "gsd-core/workflows/complete-milestone.md": "f463bf4e86ac26f6", - "gsd-core/workflows/debug.md": "d0ee63e547f4d997", + "gsd-core/workflows/debug.md": "830c309b48c35c8c", "gsd-core/workflows/diagnose-issues.md": "447072aa72385271", "gsd-core/workflows/discovery-phase.md": "7dcf150998559c11", "gsd-core/workflows/discuss-phase-assumptions.md": "b091b3d3e580dd29", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 7d04a71cb..9bf8e5a85 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -7,7 +7,7 @@ "agents/gsd-code-fixer.md": "78549833f0411b0c", "agents/gsd-code-reviewer.md": "7d94fe8bfa6661aa", "agents/gsd-codebase-mapper.md": "7cc9d387f29c46e1", - "agents/gsd-debug-session-manager.md": "30651d0b4a465263", + "agents/gsd-debug-session-manager.md": "4d3b1d31c6242e3a", "agents/gsd-debugger.md": "fc76a617817be610", "agents/gsd-doc-classifier.md": "146acf4d176134b5", "agents/gsd-doc-synthesizer.md": "b1f5e2eb28fa3659", @@ -282,7 +282,7 @@ "gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075", "gsd-core/workflows/code-review.md": "334c90c401f291f8", "gsd-core/workflows/complete-milestone.md": "c1f91b77f4ace7f2", - "gsd-core/workflows/debug.md": "c581e89aa9d9d71e", + "gsd-core/workflows/debug.md": "98c8ed5af882ef8f", "gsd-core/workflows/diagnose-issues.md": "aa8d787db8f3c46c", "gsd-core/workflows/discovery-phase.md": "3ba7cfb89fb1e761", "gsd-core/workflows/discuss-phase-assumptions.md": "f5b765d33eba4f88", diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index 507083645..801761198 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -14,7 +14,7 @@ "code-review-fix.md": 24320, "code-review.md": 31916, "complete-milestone.md": 31071, - "debug.md": 14241, + "debug.md": 19031, "diagnose-issues.md": 12864, "discovery-phase.md": 8651, "discuss-phase-assumptions.md": 27302,