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) <noreply@anthropic.com>
This commit is contained in:
5
.changeset/nimble-ravens-dart.md
Normal file
5
.changeset/nimble-ravens-dart.md
Normal file
@@ -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)
|
||||
@@ -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)
|
||||
</success_criteria>
|
||||
|
||||
@@ -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.
|
||||
|
||||
</process>
|
||||
|
||||
@@ -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
|
||||
</success_criteria>
|
||||
|
||||
@@ -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,
|
||||
|
||||
138
tests/fix-2257-debug-nonterminal-resume.test.cjs
Normal file
138
tests/fix-2257-debug-nonterminal-resume.test.cjs
Normal file
@@ -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`);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
2
tests/fixtures/golden-install-parity/pi.json
vendored
2
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user