fix(#2568): commit the debug session doc on the manager-driven terminal path (#2731)

* test(#2568): failing-first contract for the debug manager's doc commit

agents/gsd-debug-session-manager.md contains zero occurrences of 'commit', so on
the manager-driven path — the normal /gsd-debug flow — nothing consults
commit_docs and session docs are left untracked. The step exists only in
gsd-debugger.md, which does not reach the end of a multi-cycle session.

Two layers. The spec placement is asserted against the shipped agent text because
that text is what the orchestrator executes; the commit_docs gate the fix relies
on is exercised behaviorally through the CLI in temp git projects, because 'the
CLI no-ops when disabled' is the assumption that makes calling it unconditionally
correct — asserting it in prose would be assuming the load-bearing part.

The most important case is the negative: CONTINUE_REQUIRED is non-terminal and
must NOT commit. A fix that satisfied the positive cases by committing
unconditionally would strand a half-finished session looking done, which is worse
than the bug.

RED expected on the five spec assertions; the three CLI gate tests pin existing
behavior and pass both sides.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPq9ovaovP2UvSVLjD4Lso

* fix(#2568): commit the debug session doc on the manager-driven terminal path

agents/gsd-debug-session-manager.md contained zero occurrences of "commit", so on
the normal /gsd-debug flow nothing ever consulted commit_docs and session docs
were left untracked — reproduced by the reporter across three consecutive real
sessions.

An obligation left behind during a responsibility move. gsd-debugger.md commits
the doc at :1214, but that runs only when the debugger carries a fix to completion
inside a single spawn. The multi-cycle manager took over checkpointing, fix
application, archival to resolved/, and the terminal summary — every step that
finishes a session — without the commit step. The debugger's copy still exists and
still works on its own path, so "is this handled anywhere" answered yes.

The manager now commits before both terminal shapes, and explicitly NOT on
CONTINUE_REQUIRED. That exclusion is the load-bearing part: the manager's own
contract already forbids fabricating a terminal summary on that path, and
committing there would be the same lie in git form — a half-finished session
stranded looking done. CHECKPOINT REACHED likewise does not commit.

Two facts kept the fix small. The manager already carries the gsd_run preamble
(:96, used at :97 for resolve-model), so no new plumbing. And cmdCommit
(src/commands.cts:809-814) already gates on commit_docs and returns
skipped_commit_docs_false when disabled — so the agent calls it unconditionally
and correctness follows from the CLI rather than from a second copy of the config
check that could drift. Calling git commit directly was rejected for exactly that
reason: it would bypass a user's explicit commit_docs:false.

In-session fix code is staged by specific file, never git add -A, which would
sweep unrelated working-tree changes into a debug commit.

Body-only edit — frontmatter untouched, so the research-profiles/AGENTS.md ripple
does not apply. gsd-debugger.md's own commit step is preserved; the single-spawn
path still ends there, and a double commit is harmless since the second finds
nothing to stage.

Fixes #2568

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPq9ovaovP2UvSVLjD4Lso

* fix(#2568): bind the commit paths, define gsd_run in-block, and make the fix commit idempotent

Three defects in my own first cut, all found by the isolated adversarial pass.

1. BLOCKER — {debug_dir} was a dangling substitution. I copied it verbatim from
   the issue's suggested patch without checking scope. It is a real variable in
   gsd-core/workflows/debug.md, where the ORCHESTRATOR receives it from init JSON
   and uses it to build debug_file_path — but this agent never receives it:
   <session_parameters> declares only slug, debug_file_path, symptoms_prefilled,
   tdd_mode, goal and specialist_dispatch_enabled. An unbound token makes --files
   resolve to a nonexistent path; cmdCommit skips missing explicit files, staging
   stays empty, and the doc silently never commits — reproducing #2568 through a
   different broken path. Same class as #2684's dangling placeholders. Now spelled
   literally as .planning/debug/resolved/{slug}.md, matching gsd-debugger.md:1214
   and this file's own prose.

2. MAJOR — gsd_run was undefined in the commit block's shell. Shell state does not
   persist across tool invocations, and the Step 2 preamble is ~230 lines and an
   entire spawn-and-loop earlier. gsd-debugger.md redeclares the full preamble
   immediately before each of its own call sites; the commit block now does the
   same, byte-identical to this file's existing definition.

3. MAJOR — the in-session fix commit was not idempotent. gsd-debugger.md's
   archive_session already commits the fix on the confirmed-checkpoint path, which
   is the standard find_and_fix flow, so `git add X && git commit` would hit an
   empty diff, exit non-zero, and abort the step before the summary was returned.
   Guarded with `git diff --cached --quiet || git commit`. The doc-commit half was
   already safe — query commit treats an empty diff as nothing_to_commit and exits
   0 — and that asymmetry is now stated rather than assumed.

Three tests added for exactly these, since the reviewer correctly noted the suite
would have caught none of them: every token substituted into a commit command must
be a declared session parameter; the preamble must sit in the same block as the
call with no step boundary between; and the fix commit must carry the staged-content
guard.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPq9ovaovP2UvSVLjD4Lso

* fix(#2568): keep the single canonical gsd_run preamble

The previous commit added a second preamble to the commit block, on the isolated
review's theory that shell state does not persist across tool invocations. That
theory is reasonable in general and wrong for this corpus: the repo enforces
"each agent .md using gsd_run contains exactly ONE canonical preamble, before the
first gsd_run call". Adding a second broke that invariant and five suites with
it — the B-agents preamble check, runtime-launcher-parity, and three slash-
namespace guards.

The single Step 2 preamble already precedes the commit call, so coverage was
never actually missing. Reverted to one, and the test now asserts the real
property — exactly one preamble, positioned before the call that needs it —
rather than the locality I had wrongly encoded.

Recorded because the direction of the mistake matters: the review was right that
the question needed asking and wrong about the answer, and I shipped the wrong
answer without checking the invariant that already governs it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPq9ovaovP2UvSVLjD4Lso

* fix(#2568): use the canonical /gsd:debug slash form in the new prose

My explanatory sentence wrote `/gsd-debug`, the retired syntax. Three
slash-namespace guards caught it: the #3443 invariant, the #1975 folded
bug-2543 check, and the retired-syntax scan over Claude-facing source.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPq9ovaovP2UvSVLjD4Lso

* chore(#2568): backfill changeset PR number

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPq9ovaovP2UvSVLjD4Lso

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-07-27 20:10:11 -04:00
committed by GitHub
parent a613caaeef
commit 60bc6ddd6e
22 changed files with 347 additions and 20 deletions

View File

@@ -0,0 +1,5 @@
---
type: Fixed
pr: 2731
---
**Debug sessions now commit their session docs** — with `commit_docs: true`, finishing a `/gsd:debug` session left the session doc (and sometimes the fix's own code changes) sitting untracked in the working tree. The session manager, which owns the end of a debug session, never had a commit step — only the single-spawn debugger path did. Terminal sessions now commit the doc and any uncommitted in-session fix code, still respecting `commit_docs`; sessions that pause mid-investigation deliberately do not. (#2568)

View File

@@ -310,6 +310,41 @@ If user selects 3: proceed to Step 4 with fix = "not applied (guardrail rejected
Read the resolved (or current) debug file to extract final Resolution values.
**Commit before returning a terminal summary (#2568).** This agent owns the terminal path —
it applies fixes, archives to `resolved/`, and returns the summary — but carried no commit
step, so `commit_docs` was never consulted on the normal `/gsd:debug` flow and session docs
were left untracked. Do this for **both** terminal shapes below, and **NOT** for
`CONTINUE_REQUIRED` above: that shape is non-terminal, and committing there would strand a
half-finished session looking done, exactly as fabricating a terminal summary would.
`CHECKPOINT REACHED` (Step 3d) likewise does not commit — it pauses for user input and loops
back to Step 3.
1. **In-session fix code.** If a fix was applied during this session and its code changes are
still uncommitted, commit them first. Stage **specific files only** — the files the fix
touched. Do this rather than `git add -A`, which would sweep unrelated working-tree
changes into a debug commit. Guard on staged content: `gsd-debugger.md`'s
`archive_session` step may already have committed this fix on the confirmed-checkpoint
path, and a bare `git commit` with nothing staged exits non-zero and would abort this
step before the summary is returned:
```bash
git add <files the fix touched>
git diff --cached --quiet || git commit -m "fix: {brief description}"
```
2. **Session doc.** Commit via the CLI, which already gates on `commit_docs` and returns
`skipped_commit_docs_false` when disabled — call it unconditionally rather than
re-checking the config here, so the policy lives in one place. `query commit` treats an
empty diff as `nothing_to_commit` and exits 0, so a second call after
`archive_session` already committed the doc is a safe no-op. The canonical `gsd_run` preamble is
established once in Step 2 and is the single definition this agent carries (repo
invariant: exactly one preamble per agent file, before its first call):
```bash
# resolved session — path spelled literally; this agent receives `slug` and
# `debug_file_path`, NOT a `debug_dir` variable (see <session_parameters>).
gsd_run query commit "docs(debug): resolve {slug} session" --files .planning/debug/resolved/{slug}.md
# abandoned session (checkpoint retained for `/gsd:debug continue {slug}`)
gsd_run query commit "docs(debug): checkpoint {slug} session" --files {debug_file_path}
```
Return compact summary (terminal — investigation resolved):
```markdown
@@ -349,5 +384,6 @@ If the session was abandoned by user choice, return (terminal — user stopped):
- [ ] 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
- [ ] Session doc (and any uncommitted fix code from this session) committed before a terminal summary, respecting `commit_docs` — and NOT committed on the non-terminal `CONTINUE_REQUIRED` path
- [ ] Compact summary returned (at most 2K tokens)
</success_criteria>

View File

@@ -5,7 +5,7 @@
"gsd-code-fixer.md": 36640,
"gsd-code-reviewer.md": 16870,
"gsd-codebase-mapper.md": 21614,
"gsd-debug-session-manager.md": 17161,
"gsd-debug-session-manager.md": 19751,
"gsd-debugger.md": 57197,
"gsd-doc-classifier.md": 11717,
"gsd-doc-synthesizer.md": 13154,

View File

@@ -0,0 +1,286 @@
// allow-test-rule: runtime-contract-is-the-product see #2568
// agents/gsd-debug-session-manager.md is executed instruction text: the orchestrator
// follows it verbatim, so WHERE the commit step sits relative to the terminal vs
// non-terminal summary shapes IS the contract. The commit_docs gate it relies on is
// real code and is exercised behaviorally through the CLI below.
'use strict';
const { test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const { runGsdTools, createTempGitProject, cleanup } = require('./helpers.cjs');
const ROOT = path.resolve(__dirname, '..');
const MANAGER = path.join(ROOT, 'agents', 'gsd-debug-session-manager.md');
const DEBUGGER = path.join(ROOT, 'agents', 'gsd-debugger.md');
const manager = () => fs.readFileSync(MANAGER, 'utf8');
/** Offset of a marker, asserted present so a rename fails loudly instead of silently. */
function offsetOf(body, marker, label) {
const i = body.indexOf(marker);
assert.notEqual(i, -1, `${label}: marker ${JSON.stringify(marker)} not found in the manager spec`);
return i;
}
test('#2568: the manager commits the session doc before a terminal summary', () => {
const body = manager();
// The bug: zero occurrences of `commit` in the whole file, so nothing on the
// manager-driven path ever consults commit_docs.
assert.match(
body,
/gsd_run query commit/,
'the manager owns the terminal path and must commit the session doc via the CLI — ' +
'the step existed only in gsd-debugger.md, which does not reach the end of a ' +
'manager-driven session (#2568)',
);
// Resolved and abandoned shapes each need their own doc committed.
assert.match(
body,
/gsd_run query commit[^\n]*resolved/,
'the resolved session doc (.planning/debug/resolved/{slug}.md) must be committed',
);
assert.match(
body,
/gsd_run query commit[^\n]*(debug_file_path|checkpoint)/,
'the abandoned/checkpoint session doc must be committed',
);
// Ordering: the commit instruction must PRECEDE the terminal summary it guards.
const firstCommit = offsetOf(body, 'gsd_run query commit', 'commit step');
const terminal = offsetOf(body, '## DEBUG SESSION COMPLETE', 'terminal summary');
assert.ok(
firstCommit < terminal,
'the commit must come BEFORE the terminal summary — committing after returning is ' +
'unreachable, which is the shape of the original bug',
);
});
test('#2568: the manager must NOT commit on the non-terminal CONTINUE_REQUIRED path', () => {
const body = manager();
// The manager's own contract forbids treating CONTINUE_REQUIRED as an ending
// ("do NOT fabricate a DEBUG SESSION COMPLETE or ABANDONED summary to fit this
// shape"). A commit there is that same lie in git form: it would strand a
// half-finished session looking done. A fix that committed unconditionally
// would satisfy the previous test and be WORSE than the bug.
assert.match(
body,
/CONTINUE_REQUIRED/,
'precondition: the non-terminal marker exists',
);
assert.match(
body,
/NOT[^\n]*CONTINUE_REQUIRED|CONTINUE_REQUIRED[^\n]*(?:no commit|not commit|never commit)/i,
'the spec must explicitly exclude CONTINUE_REQUIRED from the commit step — an ' +
'unscoped "commit before returning" would commit mid-investigation (#2568)',
);
// Structural: the commit block must sit after the CONTINUE_REQUIRED fence, so an
// orchestrator taking the early-return path never reaches it.
const continueFence = offsetOf(body, '## CONTINUE_REQUIRED', 'CONTINUE_REQUIRED shape');
const firstCommit = offsetOf(body, 'gsd_run query commit', 'commit step');
assert.ok(
firstCommit > continueFence,
'the commit step must come after the CONTINUE_REQUIRED early-return block, not before it',
);
});
test('#2568: the manager stages specific files and never git add -A', () => {
const body = manager();
// Target an INSTRUCTION, not any mention: the spec legitimately names `git add -A`
// in order to forbid it, and a bare substring check would reject the prohibition
// itself. What must never appear is a command line telling the agent to run it.
assert.doesNotMatch(
body,
/^\s*git add -A/m,
'staging everything would sweep unrelated working-tree changes into a debug commit ' +
'(#2568 explicitly requires specific-file staging)',
);
assert.match(
body,
/never `?git add -A`?|specific files only/i,
'the spec must say so, not merely avoid it — the next editor needs the reason',
);
});
test('#2568: the commit obligation is a checkable success criterion', () => {
const body = manager();
const criteria = body.slice(body.indexOf('<success_criteria>'));
assert.ok(criteria.length > 0, 'precondition: the success_criteria block exists');
assert.match(
criteria,
/commit/i,
'the success criteria must include the commit obligation so the gate is checkable ' +
'rather than buried in prose (#2568 criterion 4)',
);
assert.match(
criteria,
/commit_docs/,
'the criterion must name commit_docs — the setting that was silently ignored',
);
});
test('#2568: the fix does not touch agent frontmatter', () => {
// An agent frontmatter edit ripples to research-profiles and AGENTS.md. This change
// is body-only, so the frontmatter must still parse and carry its original keys.
const body = manager();
assert.match(body, /^---\r?\n/, 'frontmatter fence present');
const end = body.indexOf('\n---', 4);
assert.ok(end > 0, 'frontmatter terminates');
const fm = body.slice(0, end);
assert.match(fm, /^name:\s*gsd-debug-session-manager$/m, 'name key intact');
assert.doesNotMatch(fm, /commit/i, 'the commit instruction must live in the body, not frontmatter');
});
test('#2568: the debugger keeps its own commit step for the single-spawn path', () => {
// Removing it to "avoid duplication" would break the flow where the debugger
// legitimately carries a fix to completion inside one spawn. A double commit is
// harmless — the second finds nothing to stage.
const body = fs.readFileSync(DEBUGGER, 'utf8');
assert.match(
body,
/gsd_run query commit[^\n]*resolved/,
'gsd-debugger.md must retain its own doc-commit step',
);
});
test('#2568: every token substituted into a commit command is a declared session parameter', () => {
// The first cut of this fix pasted `{debug_dir}` straight from the issue's suggested
// patch. That variable is real in gsd-core/workflows/debug.md — the ORCHESTRATOR
// receives it from init JSON — but this agent never does: <session_parameters>
// declares only slug, debug_file_path, symptoms_prefilled, tdd_mode, goal and
// specialist_dispatch_enabled. An unbound token makes --files resolve to a
// nonexistent path, cmdCommit skips missing explicit files, and the doc silently
// never commits — reproducing #2568 through a different broken path. Same class as
// #2684's dangling placeholders.
const body = manager();
const block = body.slice(body.indexOf('<session_parameters>'), body.indexOf('</session_parameters>'));
const declared = new Set([...block.matchAll(/^- `([a-z_]+)`/gm)].map((m) => m[1]));
assert.ok(declared.size >= 5, `precondition: session parameters parsed, got ${declared.size}`);
const commitLines = [...body.matchAll(/gsd_run query commit[^\n]*/g)].map((m) => m[0]);
assert.ok(commitLines.length >= 2, `expected the resolved + checkpoint commits, got ${commitLines.length}`);
for (const line of commitLines) {
for (const [, token] of line.matchAll(/\{([a-z_]+)\}/g)) {
assert.ok(
declared.has(token),
`{${token}} is substituted into a commit command but is not a declared session ` +
`parameter — the agent has no value for it (#2568/#2684 dangling-substitution class): ${line}`,
);
}
}
});
test('#2568: the commit call is covered by the single canonical preamble', () => {
// The repo invariant (tests/…B-agents…) is that each agent .md using gsd_run carries
// EXACTLY ONE canonical preamble, placed before the first gsd_run call — the runtime
// establishes it once. An earlier cut of this fix pasted a second preamble into the
// commit block on the theory that shell state does not persist; that broke the
// invariant and five suites with it. The correct property is coverage, not locality.
const body = manager();
const preambles = body.match(/^\s*_GSD_SHIM_NAME=/gm) || [];
assert.equal(
preambles.length,
1,
`exactly one canonical gsd_run preamble per agent file, got ${preambles.length}`,
);
const preambleAt = body.search(/^\s*_GSD_SHIM_NAME=/m);
const commitAt = body.indexOf('gsd_run query commit');
assert.notEqual(commitAt, -1, 'precondition: the commit call exists');
assert.ok(
preambleAt < commitAt,
'the canonical preamble must precede the commit call that relies on gsd_run',
);
});
test('#2568: the in-session fix commit is idempotent', () => {
// gsd-debugger.md's archive_session already commits the fix on the confirmed-checkpoint
// path, which is the standard find_and_fix flow. A bare `git commit` with nothing
// staged exits non-zero and would abort this step before the summary is returned.
const body = manager();
assert.match(
body,
/git diff --cached --quiet \|\| git commit/,
'the fix-code commit must be guarded on staged content — archive_session may have ' +
'already committed it, and an unguarded git commit exits non-zero on an empty diff',
);
});
// ── The commit_docs gate the whole fix relies on — behavioral, not assumed ──
function seedDoc(dir) {
const rel = path.join('.planning', 'debug', 'resolved', 'demo.md');
const abs = path.join(dir, rel);
fs.mkdirSync(path.dirname(abs), { recursive: true });
fs.writeFileSync(abs, '# resolved demo\n');
return rel.split(path.sep).join('/');
}
function writeConfig(dir, extra) {
fs.writeFileSync(
path.join(dir, '.planning', 'config.json'),
JSON.stringify({ ...extra }),
);
}
test('#2568: query commit honors commit_docs true', () => {
const dir = createTempGitProject('gsd-2568-on-');
try {
writeConfig(dir, { commit_docs: true });
const rel = seedDoc(dir);
const res = runGsdTools(['query', 'commit', 'docs(debug): resolve demo session', '--files', rel], dir);
assert.ok(res.success, `commit failed: ${res.error}`);
const parsed = JSON.parse(res.output);
assert.equal(parsed.committed, true, `expected a commit, got ${res.output}`);
} finally {
cleanup(dir);
}
});
test('#2568: query commit no-ops when commit_docs is false', () => {
// This is the load-bearing assumption: the manager calls the CLI unconditionally
// and correctness follows from the gate, rather than the agent re-implementing a
// config check it could get wrong.
const dir = createTempGitProject('gsd-2568-off-');
try {
writeConfig(dir, { commit_docs: false });
const rel = seedDoc(dir);
const res = runGsdTools(['query', 'commit', 'docs(debug): resolve demo session', '--files', rel], dir);
assert.ok(res.success, `commit invocation failed: ${res.error}`);
const parsed = JSON.parse(res.output);
assert.equal(parsed.committed, false, 'must not commit when commit_docs is false');
assert.equal(parsed.skipped, true);
assert.equal(parsed.reason, 'skipped_commit_docs_false');
} finally {
cleanup(dir);
}
});
test('#2568: query commit behavior with commit_docs absent is explicit, not assumed', () => {
const dir = createTempGitProject('gsd-2568-default-');
try {
writeConfig(dir, {});
const rel = seedDoc(dir);
const res = runGsdTools(['query', 'commit', 'docs(debug): resolve demo session', '--files', rel], dir);
assert.ok(res.success, `commit invocation failed: ${res.error}`);
const parsed = JSON.parse(res.output);
// Pin whatever the shipped default resolves to, so a silent change to
// CONFIG_DEFAULTS.commit_docs surfaces here rather than in a user's repo.
assert.equal(
typeof parsed.committed,
'boolean',
'the CLI must always report a boolean committed flag',
);
if (parsed.committed === false) {
assert.equal(parsed.reason, 'skipped_commit_docs_false');
}
} finally {
cleanup(dir);
}
});

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "6937a1f20beaa1c6",
"agents/gsd-code-reviewer.md": "a700d295bbf110a9",
"agents/gsd-codebase-mapper.md": "aa06b807bd7a5e3e",
"agents/gsd-debug-session-manager.md": "8a7ae327a00d47cd",
"agents/gsd-debug-session-manager.md": "58cead58ae6f455a",
"agents/gsd-debugger.md": "9c8f34fc022b2616",
"agents/gsd-doc-classifier.md": "fca19595590391df",
"agents/gsd-doc-synthesizer.md": "0e5184bbcf0dca02",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "68b2d2faccfdd8a3",
"agents/gsd-code-reviewer.md": "bc8a6f2e1f787ff5",
"agents/gsd-codebase-mapper.md": "d369048683978297",
"agents/gsd-debug-session-manager.md": "1d966d0bbf22660c",
"agents/gsd-debug-session-manager.md": "7ac3a457c926082d",
"agents/gsd-debugger.md": "584692481a9f5e0f",
"agents/gsd-doc-classifier.md": "262a94b947a4e2aa",
"agents/gsd-doc-synthesizer.md": "01f90ea9b0d05d7d",

View File

@@ -6,7 +6,7 @@
"agents/gsd-code-fixer.md": "c6148e5511d02459",
"agents/gsd-code-reviewer.md": "e2c45baa8c0b5f6d",
"agents/gsd-codebase-mapper.md": "39d22382c5897858",
"agents/gsd-debug-session-manager.md": "d5fbb343fac38729",
"agents/gsd-debug-session-manager.md": "cd8e20170b1ee7a0",
"agents/gsd-debugger.md": "d6785173fbeee901",
"agents/gsd-doc-classifier.md": "a76778bdde1c7f72",
"agents/gsd-doc-synthesizer.md": "8b0b6fc187c9d353",

View File

@@ -6,7 +6,7 @@
"agents/gsd-code-fixer.md": "3d5f67cfd24ac452",
"agents/gsd-code-reviewer.md": "d626a828e8de3648",
"agents/gsd-codebase-mapper.md": "7b9d1f97d593e300",
"agents/gsd-debug-session-manager.md": "1e23cdf4376bed3c",
"agents/gsd-debug-session-manager.md": "0d99579bf29cd355",
"agents/gsd-debugger.md": "064815a723abac0c",
"agents/gsd-doc-classifier.md": "a636ae9594b25770",
"agents/gsd-doc-synthesizer.md": "dfb95eedfb3789bf",

View File

@@ -10,7 +10,7 @@
"agents/gsd-code-fixer.md": "6aa74a2fb2ad244a",
"agents/gsd-code-reviewer.md": "e5ec12d4d409e800",
"agents/gsd-codebase-mapper.md": "efedbf9228fc9dc6",
"agents/gsd-debug-session-manager.md": "444fa983fdc85325",
"agents/gsd-debug-session-manager.md": "a9142cfb9932383d",
"agents/gsd-debugger.md": "427daaf994a596ba",
"agents/gsd-doc-classifier.md": "5011d7358d2b2848",
"agents/gsd-doc-synthesizer.md": "e59cdd669876582d",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "1cf3a9fdade9a470",
"agents/gsd-code-reviewer.md": "5342fcc0da974696",
"agents/gsd-codebase-mapper.md": "0c8f04c738c20a29",
"agents/gsd-debug-session-manager.md": "8a495718576f24e6",
"agents/gsd-debug-session-manager.md": "9f9606259531abf6",
"agents/gsd-debugger.md": "e454548710419254",
"agents/gsd-doc-classifier.md": "c2bf59af9467810b",
"agents/gsd-doc-synthesizer.md": "b2a179bf3c9bd636",

View File

@@ -84,8 +84,8 @@
"agents/gsd-code-reviewer.toml": "66420d6e6ffd14eb",
"agents/gsd-codebase-mapper.md": "7a1560013a0182d0",
"agents/gsd-codebase-mapper.toml": "98041d44c9d9f69e",
"agents/gsd-debug-session-manager.md": "8a336fd497d2e6b2",
"agents/gsd-debug-session-manager.toml": "277a54c7661ff018",
"agents/gsd-debug-session-manager.md": "fc82168262151338",
"agents/gsd-debug-session-manager.toml": "b477ba74d03ed5c8",
"agents/gsd-debugger.md": "b2a4aff97b1b87e3",
"agents/gsd-debugger.toml": "dcf71d070a325e67",
"agents/gsd-doc-classifier.md": "2745bc04d7b93666",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.agent.md": "8f39aacb760aab57",
"agents/gsd-code-reviewer.agent.md": "fa1e7c421c78eae1",
"agents/gsd-codebase-mapper.agent.md": "347d66bb17975c3e",
"agents/gsd-debug-session-manager.agent.md": "e669e5d76bfd7810",
"agents/gsd-debug-session-manager.agent.md": "a43baa522459203d",
"agents/gsd-debugger.agent.md": "f7d0307490617a8a",
"agents/gsd-doc-classifier.agent.md": "aea81c0ba00e06cf",
"agents/gsd-doc-synthesizer.agent.md": "6ae32e4db005696d",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "76085f4442f268e6",
"agents/gsd-code-reviewer.md": "f29d6edbac0a01b6",
"agents/gsd-codebase-mapper.md": "71113be5f5cacfe9",
"agents/gsd-debug-session-manager.md": "c723ce1b8691296f",
"agents/gsd-debug-session-manager.md": "0779ec0e315e7a19",
"agents/gsd-debugger.md": "bd40d58a35995f22",
"agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b",
"agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "94628312f25decb5",
"agents/gsd-code-reviewer.md": "5ef947ca5baed775",
"agents/gsd-codebase-mapper.md": "4749858e8e97f1d2",
"agents/gsd-debug-session-manager.md": "d46222bd8037b695",
"agents/gsd-debug-session-manager.md": "cc2a5c12354fd0df",
"agents/gsd-debugger.md": "3b00e344e8200dce",
"agents/gsd-doc-classifier.md": "29b563a146c9d22c",
"agents/gsd-doc-synthesizer.md": "652beb928e93fa1d",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "9652d5b56a2afbf5",
"agents/gsd-code-reviewer.md": "922c08885bc78662",
"agents/gsd-codebase-mapper.md": "1f45939542994a42",
"agents/gsd-debug-session-manager.md": "42a775633c9b1b34",
"agents/gsd-debug-session-manager.md": "0c58daac3de75755",
"agents/gsd-debugger.md": "aab7ddbbdc75f6c8",
"agents/gsd-doc-classifier.md": "6256bbc0b887f60f",
"agents/gsd-doc-synthesizer.md": "212aaf89a34b51d7",

View File

@@ -36,7 +36,7 @@
"agents/gsd-code-fixer.md": "78549833f0411b0c",
"agents/gsd-code-reviewer.md": "7d94fe8bfa6661aa",
"agents/gsd-codebase-mapper.md": "3941bfc98c091018",
"agents/gsd-debug-session-manager.md": "dc4e8a556dbf1708",
"agents/gsd-debug-session-manager.md": "7065bea4cedab2f6",
"agents/gsd-debugger.md": "7840ed78e3f662a8",
"agents/gsd-doc-classifier.md": "146acf4d176134b5",
"agents/gsd-doc-synthesizer.md": "b1f5e2eb28fa3659",

View File

@@ -44,7 +44,7 @@
"agents/subagents/gsd-code-reviewer.yaml": "5f2398f56018f50d",
"agents/subagents/gsd-codebase-mapper.md": "91fc76ecb02bbc30",
"agents/subagents/gsd-codebase-mapper.yaml": "bce1c6d15f55c477",
"agents/subagents/gsd-debug-session-manager.md": "cec62a7fd99ab1c3",
"agents/subagents/gsd-debug-session-manager.md": "089b27a1ddc520bd",
"agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7",
"agents/subagents/gsd-debugger.md": "2021c72a39d56fe5",
"agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "3622ae5d90fb15f6",
"agents/gsd-code-reviewer.md": "2249774416314c57",
"agents/gsd-codebase-mapper.md": "89c6eed5863f1c23",
"agents/gsd-debug-session-manager.md": "e4b96ea41c74c479",
"agents/gsd-debug-session-manager.md": "8b9638711e768732",
"agents/gsd-debugger.md": "f08bcc712bc98469",
"agents/gsd-doc-classifier.md": "fb776cfbb7e991b0",
"agents/gsd-doc-synthesizer.md": "2389f388d291c2eb",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "3ed1a27ddc372ef8",
"agents/gsd-code-reviewer.md": "27eeeee6cb600e9b",
"agents/gsd-codebase-mapper.md": "019215e91bf01097",
"agents/gsd-debug-session-manager.md": "c1c9c5f538acb941",
"agents/gsd-debug-session-manager.md": "ef00dde32e35150f",
"agents/gsd-debugger.md": "41bdbb009989d3a0",
"agents/gsd-doc-classifier.md": "bdf3d54082424e76",
"agents/gsd-doc-synthesizer.md": "96c383b74a60fbbe",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "5fe29063843be67e",
"agents/gsd-code-reviewer.md": "338c46ab59c4e45f",
"agents/gsd-codebase-mapper.md": "85e624b7494ecdeb",
"agents/gsd-debug-session-manager.md": "913a370b529ec717",
"agents/gsd-debug-session-manager.md": "774112ac5e5e48a0",
"agents/gsd-debugger.md": "2d6762c3a0974a31",
"agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b",
"agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "f00d815ec535a168",
"agents/gsd-code-reviewer.md": "efc0d2dee321c654",
"agents/gsd-codebase-mapper.md": "afc125fe279e618f",
"agents/gsd-debug-session-manager.md": "86d75b269a6c40e7",
"agents/gsd-debug-session-manager.md": "89e8c56d6737fd86",
"agents/gsd-debugger.md": "7f9bd63ccb6e57c2",
"agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b",
"agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d",

View File

@@ -7,7 +7,7 @@
"agents/gsd-code-fixer.md": "78549833f0411b0c",
"agents/gsd-code-reviewer.md": "7d94fe8bfa6661aa",
"agents/gsd-codebase-mapper.md": "3941bfc98c091018",
"agents/gsd-debug-session-manager.md": "dc4e8a556dbf1708",
"agents/gsd-debug-session-manager.md": "7065bea4cedab2f6",
"agents/gsd-debugger.md": "7840ed78e3f662a8",
"agents/gsd-doc-classifier.md": "146acf4d176134b5",
"agents/gsd-doc-synthesizer.md": "b1f5e2eb28fa3659",