From c67f3018671b63cb6b20c17a58747e1d7a14806c Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Sat, 18 Jul 2026 17:38:54 -0400 Subject: [PATCH] feat(#1963): emit blameless-postmortem Prevention block at resolution (#2410) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test(#1963): add failing-first prevention/postmortem contract tests Epic #1957 Phase 3B. Source-text-is-the-product contract tests: blameless 5-Whys that BRANCHES per Phase 2A RCA (not a single-cause chain; treats agent error as 'why was that possible?'), the 'why wasn't this caught?' question, the recurrence-guard taxonomy (regression test / assertion / lint rule / KB pattern), the KB-entry why_not_caught + recurrence_guard fields with backward compat, the session-manager prevention summary line, and the Zawinski scope-boundary (a block, not a subsystem). Failing-first: reference, archive_session edit, KB schema extension, and session-manager summary do not yet exist. * feat(#1963): emit blameless-postmortem Prevention block at resolution Epic #1957 Phase 3B. At archive_session the debugger now produces a Prevention block with three blame-free components: a branching 5-Whys causal chain (branches per Phase 2A RCA, not a single chain; 'agent error' prompts 'why was that possible?', never blame), a 'why wasn't this caught?' answer naming the missed gate (test/typecheck/lint/review/verify), and a concrete recurrence guard (regression test / assertion / lint rule / KB pattern). The knowledge-base entry gains two structured fields (why_not_caught + recurrence_guard) so future Phase-0 recall surfaces the prior prevention, not just the prior fix. Additive: old entries without the fields still load. The session-manager compact summary surfaces a one-line prevention summary. Full rules extracted to gsd-core/references/debugger-prevention.md (slim archive_session step + 2 KB fields kept in the agent). INVENTORY + manifest + agent-size baseline + install-parity goldens + AGENTS.md updated. * fix(#1963): address orthogonal review (CRITICAL append-template drift + Phase-0 consumption + parity test) - CRITICAL: the archive_session KB append template omitted Why not caught + Recurrence guard (only the Entry Format had them) — the feature's core deliverable silently did not happen. Added both fields to the append template the agent actually follows (nearest-instruction wins). - HIGH: Phase 0 (KB read) only surfaced root_cause + fix; the new fields were dead data. Extended the Phase 0 Evidence line to consume why_not_caught + recurrence_guard when present (absent on old entries — backward compat holds). - MEDIUM: added a cross-section parity test (every Entry-Format field must also appear in the append template — the guard that would have caught the Critical) + a Phase-0-consumption assertion. - MEDIUM: the 'branches per Phase 2A' claim is now wired — reuses reasoning_checkpoint.candidate_causes across the four categories. - MEDIUM: recurrence-guard taxonomy gains type refinement + config-default change; LOW: added 'build' gate to both surfaces for parity. - NIT: compact-summary fallback shape ('no gate existed'); verify the guard artifact exists before recording it. * test(#1963): anchor Phase-0 consumption test on the specific heading The regex /Phase 0[\s\S]{0,1200}/ matched the first 'Phase 0' in the file (in knowledge_base_protocol prose), not the Phase 0 block in investigation_loop. Anchor on '**Phase 0: Check knowledge base**' and widen to 1500 chars. * chore(#1963): backfill changeset pr number (PR #2410) --- .changeset/1963-prevention-postmortem.md | 5 + agents/gsd-debug-session-manager.md | 1 + agents/gsd-debugger.md | 14 ++- docs/AGENTS.md | 1 + docs/INVENTORY-MANIFEST.json | 1 + docs/INVENTORY.md | 1 + gsd-core/references/debugger-prevention.md | 98 +++++++++++++++ tests/agent-size-baseline.json | 4 +- tests/debugger-prevention.test.cjs | 119 ++++++++++++++++++ .../golden-install-parity/antigravity.json | 5 +- .../golden-install-parity/augment.json | 5 +- .../golden-install-parity/claude-local.json | 5 +- .../golden-install-parity/claude.json | 5 +- .../fixtures/golden-install-parity/cline.json | 5 +- .../golden-install-parity/codebuddy.json | 5 +- .../fixtures/golden-install-parity/codex.json | 9 +- .../golden-install-parity/copilot.json | 5 +- .../golden-install-parity/cursor.json | 5 +- .../golden-install-parity/hermes.json | 5 +- .../fixtures/golden-install-parity/kilo.json | 5 +- .../fixtures/golden-install-parity/kimi.json | 5 +- .../golden-install-parity/opencode.json | 5 +- tests/fixtures/golden-install-parity/pi.json | 1 + .../fixtures/golden-install-parity/qwen.json | 5 +- .../fixtures/golden-install-parity/trae.json | 5 +- .../golden-install-parity/windsurf.json | 5 +- .../fixtures/golden-install-parity/zcode.json | 5 +- tests/fixtures/install-tree/antigravity.json | 1 + tests/fixtures/install-tree/augment.json | 1 + tests/fixtures/install-tree/claude-local.json | 1 + tests/fixtures/install-tree/claude.json | 1 + tests/fixtures/install-tree/cline.json | 1 + tests/fixtures/install-tree/codebuddy.json | 1 + tests/fixtures/install-tree/codex.json | 1 + tests/fixtures/install-tree/copilot.json | 1 + tests/fixtures/install-tree/cursor.json | 1 + tests/fixtures/install-tree/hermes.json | 1 + tests/fixtures/install-tree/kilo.json | 1 + tests/fixtures/install-tree/kimi.json | 1 + tests/fixtures/install-tree/opencode.json | 1 + tests/fixtures/install-tree/pi.json | 1 + tests/fixtures/install-tree/qwen.json | 1 + tests/fixtures/install-tree/trae.json | 1 + tests/fixtures/install-tree/windsurf.json | 1 + tests/fixtures/install-tree/zcode.json | 1 + 45 files changed, 311 insertions(+), 41 deletions(-) create mode 100644 .changeset/1963-prevention-postmortem.md create mode 100644 gsd-core/references/debugger-prevention.md create mode 100644 tests/debugger-prevention.test.cjs diff --git a/.changeset/1963-prevention-postmortem.md b/.changeset/1963-prevention-postmortem.md new file mode 100644 index 000000000..de018f481 --- /dev/null +++ b/.changeset/1963-prevention-postmortem.md @@ -0,0 +1,5 @@ +--- +type: Added +pr: 2410 +--- +**`gsd-debugger` now emits a blameless-postmortem Prevention block at resolution, closing the loop on bug-class prevention** — at `archive_session` the debugger produces three blame-free components: a **branching 5-Whys** causal chain (branching per the Phase 2A RCA discipline, not a single linear chain; "agent error" prompts "why was that error possible?", never blame), a **"why wasn't this caught?"** answer naming the existing gate (test/typecheck/lint/review/verify) that missed it, and a **concrete recurrence guard** (a regression test / assertion / lint rule / knowledge-base pattern). The knowledge-base entry gains two structured fields — `why_not_caught` and `recurrence_guard` — so a future Phase-0 recall surfaces not just the prior fix but the prior *prevention* (additive; old entries without the fields still load). The session-manager's compact summary surfaces a one-line prevention summary. Full rules live in `gsd-core/references/debugger-prevention.md`; kept minimal — a block, not an incident-management subsystem. (#1963) diff --git a/agents/gsd-debug-session-manager.md b/agents/gsd-debug-session-manager.md index 4d56fc625..a0c719de1 100644 --- a/agents/gsd-debug-session-manager.md +++ b/agents/gsd-debug-session-manager.md @@ -321,6 +321,7 @@ Return compact summary (terminal — investigation resolved): **Cycles:** {N} (investigation) + {M} (fix) **TDD:** {yes/no} **Specialist review:** {specialist_hint used, or "none"} +**Prevention:** {one-line from the blameless postmortem — "why not caught: ; guard: "} ``` If the session was abandoned by user choice, return (terminal — user stopped): diff --git a/agents/gsd-debugger.md b/agents/gsd-debugger.md index a19532f4e..cc6a75157 100644 --- a/agents/gsd-debugger.md +++ b/agents/gsd-debugger.md @@ -807,6 +807,8 @@ Each resolved session appends one entry: - **Root cause(s):** {from Resolution.root_cause — one cause, or a '; '-joined list when the AND-gate fired} - **Fix:** {from Resolution.fix} - **Files changed:** {from Resolution.files_changed} +- **Why not caught:** {which existing gate (test/typecheck/lint/review/verify/build) should have caught it — or "no gate existed for this class"} +- **Recurrence guard:** {the concrete artifact preventing this class from returning — regression test (path:name) / assertion / lint rule / type refinement / config-default change / KB pattern} --- ``` @@ -987,7 +989,7 @@ At investigation decision points, apply structured reasoning: - Scan knowledge base entries for 2+ keyword overlap (case-insensitive) - If match found: - Note in Current Focus: `known_pattern_candidate: "{matched slug} — {description}"` - - Add to Evidence: `found: Knowledge base match on [{keywords}] → Root cause was: {root_cause}. Fix was: {fix}.` + - Add to Evidence: `found: Knowledge base match on [{keywords}] → Root cause was: {root_cause}. Fix was: {fix}. Why not caught: {why_not_caught}. Recurrence guard: {recurrence_guard}.` (the last two are absent on old entries — that's fine; consume them when present) - Test this hypothesis FIRST in Phase 2 — but treat it as one hypothesis, not a certainty - If no match: proceed normally @@ -1212,9 +1214,13 @@ Then commit planning docs via CLI (respects `commit_docs` config automatically): gsd_run query commit "docs: resolve debug {slug}" --files .planning/debug/resolved/{slug}.md ``` -**Append to knowledge base:** +**Append to knowledge base (with the Prevention block):** -Read `.planning/debug/resolved/{slug}.md` to extract final `Resolution` values. Then append to `.planning/debug/knowledge-base.md` (create file with header if it doesn't exist): +Read `.planning/debug/resolved/{slug}.md` to extract final `Resolution` values. Then produce the **Prevention block** — a blameless postmortem (branching 5-Whys per RCA, "why wasn't this caught?", and a concrete recurrence guard): + +@~/.claude/gsd-core/references/debugger-prevention.md + +Then append to `.planning/debug/knowledge-base.md` (create file with header if it doesn't exist): If creating for the first time, write this header first: ```markdown @@ -1234,6 +1240,8 @@ Then append the entry: - **Root cause(s):** {Resolution.root_cause — joined as '; ' when multiple contributing causes were confirmed} - **Fix:** {Resolution.fix} - **Files changed:** {Resolution.files_changed joined as comma list} +- **Why not caught:** {which existing gate (test/typecheck/lint/review/verify/build) should have caught it — or "no gate existed for this class"} +- **Recurrence guard:** {concrete artifact preventing this class from returning — regression test (path:name) / assertion / lint rule / KB pattern / type refinement / config-default change} --- ``` diff --git a/docs/AGENTS.md b/docs/AGENTS.md index bf72e63e6..c31ac1ae4 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -405,6 +405,7 @@ runs its default whole-repo scan. - Branches root-cause analysis across ≥2 Ishikawa categories and applies an AND-gate check before committing root_cause (guards against 5-Whys single-cause bias); root_cause may hold a set when the AND-gate fires - Classifies each failure as Bohrbug / Heisenbug-Mandelbug / Concurrency at Phase 1.75 and routes the investigation technique accordingly (routes Bohrbugs to SBFL+bisect, Heisenbugs to record-replay/stability with SBFL skipped, Concurrency to the atomicity/order/deadlock checklist) - Hardens regression tests via PBT shrinking (minimized counterexample as the seed), explicit oracle classification (specified/derived/metamorphic/implicit), and boundary neighbors around the fixed equivalence class +- Emits a blameless-postmortem Prevention block at resolution (branching 5-Whys, why-wasn't-this-caught, a concrete recurrence guard) and records `why_not_caught` + `recurrence_guard` in the knowledge base so the same bug class is prevented, not just fixed - Appends to persistent knowledge base on resolution - Consults knowledge base on new sessions diff --git a/docs/INVENTORY-MANIFEST.json b/docs/INVENTORY-MANIFEST.json index 5845d2b0b..a25692e4a 100644 --- a/docs/INVENTORY-MANIFEST.json +++ b/docs/INVENTORY-MANIFEST.json @@ -217,6 +217,7 @@ "debugger-bug-taxonomy.md", "debugger-fix-acceptance.md", "debugger-philosophy.md", + "debugger-prevention.md", "debugger-rca-branching.md", "debugger-repro-hardening.md", "debugger-sbfl.md", diff --git a/docs/INVENTORY.md b/docs/INVENTORY.md index b09f1657c..6771e2ffb 100644 --- a/docs/INVENTORY.md +++ b/docs/INVENTORY.md @@ -299,6 +299,7 @@ Full roster at `gsd-core/references/*.md`. References are shared knowledge docum | `debugger-rca-branching.md` | RCA branching (fishbone + AND-gate) anti-single-cause discipline loaded by `gsd-debugger`. | | `debugger-bug-taxonomy.md` | Bug-taxonomy classification (Bohrbug/Heisenbug/Concurrency) + technique routing table loaded by `gsd-debugger`. | | `debugger-repro-hardening.md` | Regression-test hardening (PBT shrinking + oracle classification + boundary neighbors) loaded by `gsd-debugger`. | +| `debugger-prevention.md` | Prevention / blameless-postmortem output (5-Whys + why-not-caught + recurrence guard) loaded by `gsd-debugger`. | | `mandatory-initial-read.md` | Shared required-reading boilerplate injected into agent prompts. | | `agent-skills-bootstrap.md` | Shared agent_skills self-load contract (query + Read + dedup guard) injected into all 22 consumer agents. | | `project-skills-discovery.md` | Shared project-skills-discovery boilerplate injected into agent prompts. | diff --git a/gsd-core/references/debugger-prevention.md b/gsd-core/references/debugger-prevention.md new file mode 100644 index 000000000..25a21b894 --- /dev/null +++ b/gsd-core/references/debugger-prevention.md @@ -0,0 +1,98 @@ +# Prevention / Blameless-Postmortem Output + +Loaded by `gsd-debugger` via `@-include` from `archive_session`. Emits the +forward-looking half of a resolved debug session — not just *what* was wrong and +the fix, but **why it happened, why it wasn't caught, and the guard that +prevents its whole class from returning**. + +## Why this exists + +When a session resolves, the debugger records `root_cause` + `fix` and appends a +keyword entry to the knowledge base. What it did **not** produce is the +forward-looking half that industry incident practice (Google SRE Book, AWS COE) +treats as the whole point: a blameless postmortem / Correction of Error. The +bug gets fixed; the *class* of bug and the *reason it slipped through* are never +captured — so the same class recurs and no guardrail is added. This block closes +that gap. It reuses the existing debug file and knowledge base; it does not add a +new command or workflow. + +## The Prevention block (three blame-free components) + +At `archive_session`, after the fix is confirmed, emit a Prevention block and +fold its two structured fields (`why_not_caught`, `recurrence_guard`) into the +knowledge-base entry. + +### 1. Blameless 5-Whys that BRANCHES (per Phase 2A RCA) + +A causal chain — but **branch across ≥2 Ishikawa categories**, do not collapse to +a single linear "why" (the same single-cause bias Phase 2A guards the diagnosis +against applies to the postmortem). For each branch ask "why" until you reach an +actionable condition. + +**Reuse the diagnosis branches:** the `reasoning_checkpoint.candidate_causes` +recorded at Phase 2A already enumerated the candidate causes across the four +categories (**code / config / environment / data** — see +`debugger-rca-branching.md`); start the postmortem from those branches and the +AND-gate answer rather than re-deriving a chain from scratch. + +**Blame-free:** treat "agent error" / "human error" as a prompt for *"why was +that error possible?"* — not a terminal cause. A postmortem that stops at "the +engineer made a mistake" prevents nothing; one that asks "why was the mistake +possible / not caught" produces a guard. Never assign blame to a person. + +### 2. "Why wasn't this caught?" + +Name the **existing gate** that should have caught this bug class and didn't — +a test, a type check, a lint rule, code review, the verify step, the build. If +the honest answer is "no gate existed for this class," that itself is the finding +(and the recurrence guard below is "add the gate"). + +### 3. The recurrence guard + +The **concrete artifact** that prevents this class from returning. Choose the +strongest applicable: + +- a **regression test** (already produced by Test-First Debugging — reference it), +- an **assertion / precondition** (fail loud at runtime if the bad condition recurs), +- a **type refinement** (make the bad state unrepresentable — the strongest guard + in a typed codebase; e.g., a branded type / exhaustive union that rules out the + invalid value at compile time), +- a **config-default change** (eliminate the misconfiguration that enabled the + bug — flip the default so the unsafe path is opt-in, not the path of least resistance), +- a **lint rule / broken-window ledger entry** (fail the build / surface in review), +- a **knowledge-base pattern** — this very entry, so a future Phase-0 recall + surfaces the prior guard when a similar symptom appears. + +State the guard concretely (which file, which rule, which test name) — not "add +a test" but "the regression test at `tests/foo.test.cjs:42` now covers this +class." **Verify the artifact exists before recording it** (the test passes, the +type compiles, the lint rule is registered) — a stale or unverified path is worse +than none, since a future Phase-0 match would surface it as if it were real. + +## Knowledge-base entry: the two structured fields + +The KB entry gains two fields (additive — see backward-compat below): + +- **Why not caught:** {the existing gate that should have caught it, or "no gate existed for this class"} +- **Recurrence guard:** {the concrete artifact — regression test / assertion / lint rule / KB pattern — with its location} + +These ride alongside the existing `Error patterns` / `Root cause(s)` / `Fix` / +`Files changed` fields so a future Phase-0 match surfaces not just the prior fix +but the prior *prevention*. + +## Backward compatibility (additive — no format break) + +Old knowledge-base entries without `why_not_caught` / `recurrence_guard` +**still load** unchanged. The matcher reads the `Error patterns` field (which +every entry has); the two new fields are consumed when present and ignored when +absent. A knowledge base with a mix of old and new entries works correctly — +there is no migration, no schema version bump. + +## Scope boundary (Zawinski's Law) + +A **block**, not an incident-management subsystem. It reuses the existing debug +file's `archive_session` step and the existing knowledge base; it adds two +fields and three prompt-level questions. It is not a new command, not a +reporting framework, not a metrics pipeline. Where a bug is trivial and the +postmortem would add nothing, a one-line recurrence guard suffices — the +discipline scales down. diff --git a/tests/agent-size-baseline.json b/tests/agent-size-baseline.json index 3ec5970a3..baf41a51b 100644 --- a/tests/agent-size-baseline.json +++ b/tests/agent-size-baseline.json @@ -5,8 +5,8 @@ "gsd-code-fixer.md": 36640, "gsd-code-reviewer.md": 16870, "gsd-codebase-mapper.md": 21485, - "gsd-debug-session-manager.md": 17012, - "gsd-debugger.md": 55758, + "gsd-debug-session-manager.md": 17161, + "gsd-debugger.md": 56835, "gsd-doc-classifier.md": 11717, "gsd-doc-synthesizer.md": 13154, "gsd-doc-verifier.md": 12403, diff --git a/tests/debugger-prevention.test.cjs b/tests/debugger-prevention.test.cjs new file mode 100644 index 000000000..34295569a --- /dev/null +++ b/tests/debugger-prevention.test.cjs @@ -0,0 +1,119 @@ +// allow-test-rule: source-text-is-the-product (see #1963) +// Agent .md + reference .md files — their text IS what the runtime loads. +// Testing text content tests the deployed prevention/postmortem contract. +// Per CONTRIBUTING.md exception matrix. Covers epic #1957 Phase 3B (#1963). +'use strict'; + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const ROOT = process.cwd(); +const AGENT = path.join(ROOT, 'agents/gsd-debugger.md'); +const SESSION_MGR = path.join(ROOT, 'agents/gsd-debug-session-manager.md'); +const REFERENCE = path.join(ROOT, 'gsd-core/references/debugger-prevention.md'); + +describe('prevention / blameless-postmortem output (#1963, epic #1957 Phase 3B)', () => { + describe('reference extract exists and is wired into archive_session', () => { + test('gsd-core/references/debugger-prevention.md exists', () => { + assert.ok(fs.existsSync(REFERENCE), 'debugger-prevention.md reference must exist'); + }); + + test('gsd-debugger.md @-includes the prevention reference', () => { + const content = fs.readFileSync(AGENT, 'utf8'); + assert.ok( + content.includes('@~/.claude/gsd-core/references/debugger-prevention.md'), + 'gsd-debugger.md must @-include the prevention reference from archive_session' + ); + }); + }); + + describe('the Prevention block has three blame-free components (criterion 1)', () => { + test('reference documents a blameless 5-Whys causal chain', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/5-?\s*whys|five whys|causal chain/i.test(content), 'must document a 5-Whys causal chain'); + assert.ok(/blame|blameless|blame-free/i.test(content), 'must state the chain is blame-free/blameless'); + }); + + test('the 5-Whys branches per RCA (Phase 2A), not a single-cause chain', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/branch/i.test(content), 'the postmortem must branch (not chain) per the Phase 2A RCA discipline'); + assert.ok(/single[\s-]?cause|agent error|why was that (?:error|possible)/i.test(content), + 'must treat "agent error" as a prompt for "why was that error possible?" (blame-free), not a terminal cause'); + }); + + test('reference documents the "why wasn\'t this caught?" question', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/why (?:wasn'?t|was not|didn'?t).*(?:caught|prevent)/i.test(content) || /why[\s-]?not[\s-]?caught/i.test(content), + 'must document the "why wasn\'t this caught?" question (which existing gate missed it)'); + }); + + test('reference documents the recurrence-guard taxonomy', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/recurrence guard|recurrence-guard/i.test(content), 'must name the recurrence guard'); + // The concrete artifact options from the issue + assert.ok(/regression test/i.test(content), 'guard option: regression test'); + assert.ok(/lint rule|assertion|precondition/i.test(content), 'guard option: lint rule / assertion / precondition'); + }); + }); + + describe('knowledge-base entry stores the prevention fields (criterion 2)', () => { + test('KB entry format in gsd-debugger.md includes why_not_caught + recurrence_guard', () => { + const content = fs.readFileSync(AGENT, 'utf8'); + assert.ok(/why.not.caught/i.test(content), 'KB entry format must include a why_not_caught field'); + assert.ok(/recurrence.guard/i.test(content), 'KB entry format must include a recurrence_guard field'); + }); + + test('reference documents backward compatibility (old entries without the fields still load)', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/backward|back.compat|old entries|without.*fields.*load|absent.*field/i.test(content), + 'must document that old KB entries without the new fields still load (additive, no format break)'); + }); + }); + + describe('session-manager compact return surfaces the prevention summary (criterion 3)', () => { + test('gsd-debug-session-manager.md compact summary includes a prevention line', () => { + const content = fs.readFileSync(SESSION_MGR, 'utf8'); + assert.ok(/prevention|recurrence guard|why not caught/i.test(content), + 'session-manager compact summary must surface the prevention summary (recurrence guard / why-not-caught)'); + }); + }); + + describe('scope boundary (Zawinski) — a block, not an incident-management subsystem', () => { + test('reference states the prevention block reuses existing structures and adds no subsystem', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/reuse|existing|no(?:t| new).*(?:subsystem|framework|command)|block, not/i.test(content), + 'must state the prevention block reuses the existing debug file + knowledge base (no new subsystem)'); + }); + }); + + describe('cross-section parity (guards the Critical: Entry-Format fields must also appear in the archive append template)', () => { + test('every Entry-Format KB field appears in the archive_session append template', () => { + // DEFECT.GENERATIVE-FIX guard: the Entry Format + // and the archive_session append template are two parallel surfaces that + // must agree. A field declared in one but not the other is dead data. + const content = fs.readFileSync(AGENT, 'utf8'); + const requiredFields = ['Date', 'Error patterns', 'Root cause', 'Fix', 'Files changed', 'Why not caught', 'Recurrence guard']; + for (const field of requiredFields) { + const re = new RegExp(`\\*\\*${field}`, 'i'); + const matches = content.match(new RegExp(`\\*\\*${field}`, 'gi')); + assert.ok( + matches && matches.length >= 2, + `KB field "${field}" must appear in BOTH the Entry Format and the archive append template (found ${matches ? matches.length : 0} occurrence(s)) — parallel-surface drift` + ); + } + }); + + test('Phase 0 consumes the prevention fields (why_not_caught + recurrence_guard) when present', () => { + const content = fs.readFileSync(AGENT, 'utf8'); + // Anchor on the specific Phase 0 heading in investigation_loop (the + // string "Phase 0" also appears in knowledge_base_protocol prose, which + // would match the wrong region). + const phase0Block = content.match(/\*\*Phase 0: Check knowledge base\*\*[\s\S]{0,1500}/); + assert.ok(phase0Block, 'a Phase 0: Check knowledge base block must exist in investigation_loop'); + assert.ok(/why.?not.?caught/i.test(phase0Block[0]) && /recurrence.?guard/i.test(phase0Block[0]), + 'the Phase 0 Evidence line must include why_not_caught + recurrence_guard (consume when present, absent on old entries)'); + }); + }); +}); diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 5adadd7c3..a32277971 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "6937a1f20beaa1c6", "agents/gsd-code-reviewer.md": "a700d295bbf110a9", "agents/gsd-codebase-mapper.md": "afdae82284cb21b4", - "agents/gsd-debug-session-manager.md": "523f28a1ed8a4536", - "agents/gsd-debugger.md": "a4ea87f55b1c9718", + "agents/gsd-debug-session-manager.md": "8a7ae327a00d47cd", + "agents/gsd-debugger.md": "b4d6a994d6c433c4", "agents/gsd-doc-classifier.md": "fca19595590391df", "agents/gsd-doc-synthesizer.md": "0e5184bbcf0dca02", "agents/gsd-doc-verifier.md": "888c6ac870cb91a6", @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "4c13da220b6a4261", "gsd-core/references/debugger-fix-acceptance.md": "87d367e4e864910e", "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "745e517012e03d23", "gsd-core/references/debugger-sbfl.md": "de9cd1bd0e1485c6", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index 3b1a6f188..1b8f07a07 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "68b2d2faccfdd8a3", "agents/gsd-code-reviewer.md": "bc8a6f2e1f787ff5", "agents/gsd-codebase-mapper.md": "85ea778ad9cf7e66", - "agents/gsd-debug-session-manager.md": "d2b983f774816e9a", - "agents/gsd-debugger.md": "714649ac8c7fabce", + "agents/gsd-debug-session-manager.md": "1d966d0bbf22660c", + "agents/gsd-debugger.md": "7141e0c61747befe", "agents/gsd-doc-classifier.md": "262a94b947a4e2aa", "agents/gsd-doc-synthesizer.md": "01f90ea9b0d05d7d", "agents/gsd-doc-verifier.md": "b3433e0db51e1c60", @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index b7619fd45..38ca4e85a 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -6,8 +6,8 @@ "agents/gsd-code-fixer.md": "c6148e5511d02459", "agents/gsd-code-reviewer.md": "e2c45baa8c0b5f6d", "agents/gsd-codebase-mapper.md": "f96958e5f85b93fb", - "agents/gsd-debug-session-manager.md": "11afaabc2a749f32", - "agents/gsd-debugger.md": "76e3f9b0ccdeb4db", + "agents/gsd-debug-session-manager.md": "d5fbb343fac38729", + "agents/gsd-debugger.md": "13cfdb9e8caa78d9", "agents/gsd-doc-classifier.md": "a76778bdde1c7f72", "agents/gsd-doc-synthesizer.md": "8b0b6fc187c9d353", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", @@ -133,6 +133,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index e9741459d..8177bdb95 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -6,8 +6,8 @@ "agents/gsd-code-fixer.md": "3d5f67cfd24ac452", "agents/gsd-code-reviewer.md": "d626a828e8de3648", "agents/gsd-codebase-mapper.md": "8c2e9f2ce3aedf78", - "agents/gsd-debug-session-manager.md": "3a6614424653612b", - "agents/gsd-debugger.md": "f6323235d733c990", + "agents/gsd-debug-session-manager.md": "1e23cdf4376bed3c", + "agents/gsd-debugger.md": "54cb91f574d020ed", "agents/gsd-doc-classifier.md": "a636ae9594b25770", "agents/gsd-doc-synthesizer.md": "dfb95eedfb3789bf", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", @@ -62,6 +62,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index bf6f79055..88b662785 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -10,8 +10,8 @@ "agents/gsd-code-fixer.md": "6aa74a2fb2ad244a", "agents/gsd-code-reviewer.md": "e5ec12d4d409e800", "agents/gsd-codebase-mapper.md": "e5b7941bdda53c91", - "agents/gsd-debug-session-manager.md": "55788b44fdfc4375", - "agents/gsd-debugger.md": "51f39ada470339ff", + "agents/gsd-debug-session-manager.md": "444fa983fdc85325", + "agents/gsd-debugger.md": "815a2b65d85c29dd", "agents/gsd-doc-classifier.md": "5011d7358d2b2848", "agents/gsd-doc-synthesizer.md": "e59cdd669876582d", "agents/gsd-doc-verifier.md": "b60290c9d9f6d8d2", @@ -66,6 +66,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "63521aea0206d4ac", "gsd-core/references/debugger-fix-acceptance.md": "1057d70f7f2d654a", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "98872822b7f1ef08", "gsd-core/references/debugger-sbfl.md": "6e4975ee50973c23", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 4ed3e49a7..f9a529536 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "1cf3a9fdade9a470", "agents/gsd-code-reviewer.md": "5342fcc0da974696", "agents/gsd-codebase-mapper.md": "b995bf01af0193d2", - "agents/gsd-debug-session-manager.md": "9f56455afb580275", - "agents/gsd-debugger.md": "0dd86ecf4e9e3ee9", + "agents/gsd-debug-session-manager.md": "8a495718576f24e6", + "agents/gsd-debugger.md": "dbf1b89a5ef6a7ea", "agents/gsd-doc-classifier.md": "c2bf59af9467810b", "agents/gsd-doc-synthesizer.md": "b2a179bf3c9bd636", "agents/gsd-doc-verifier.md": "e74d930905a782ea", @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 1096cdec5..68b2c120c 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -84,10 +84,10 @@ "agents/gsd-code-reviewer.toml": "66420d6e6ffd14eb", "agents/gsd-codebase-mapper.md": "cf8f8550b44aec35", "agents/gsd-codebase-mapper.toml": "a4609f3ac66c2081", - "agents/gsd-debug-session-manager.md": "c2b615fce5adc13e", - "agents/gsd-debug-session-manager.toml": "4420cb596ad6b183", - "agents/gsd-debugger.md": "8b40ec1a784b1c84", - "agents/gsd-debugger.toml": "9ade5b336aae9a91", + "agents/gsd-debug-session-manager.md": "8a336fd497d2e6b2", + "agents/gsd-debug-session-manager.toml": "277a54c7661ff018", + "agents/gsd-debugger.md": "ad9aa9530c891872", + "agents/gsd-debugger.toml": "b05785c9a4dad6f6", "agents/gsd-doc-classifier.md": "2745bc04d7b93666", "agents/gsd-doc-classifier.toml": "3fe5ec83f62b586e", "agents/gsd-doc-synthesizer.md": "4f545f2e916458ad", @@ -169,6 +169,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "49f94fe75cabba52", "gsd-core/references/debugger-fix-acceptance.md": "b2732420bdbcadcd", "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "097c2da83d697566", "gsd-core/references/debugger-sbfl.md": "391e732abf32786a", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index b7a4f7168..7a67178e8 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -7,8 +7,8 @@ "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": "77ee029f0f81c09d", - "agents/gsd-debugger.agent.md": "943af322184a1479", + "agents/gsd-debug-session-manager.agent.md": "e669e5d76bfd7810", + "agents/gsd-debugger.agent.md": "1f5cd5c6d3d7d1aa", "agents/gsd-doc-classifier.agent.md": "aea81c0ba00e06cf", "agents/gsd-doc-synthesizer.agent.md": "6ae32e4db005696d", "agents/gsd-doc-verifier.agent.md": "0230208ae7ab1a08", @@ -64,6 +64,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "ddfb2bbc1f3de50a", "gsd-core/references/debugger-fix-acceptance.md": "812922e2b5db9410", "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "62089f91dfa470bd", "gsd-core/references/debugger-sbfl.md": "5bb65a8653bf2e06", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index b28e7cf14..240a6b7ae 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "76085f4442f268e6", "agents/gsd-code-reviewer.md": "f29d6edbac0a01b6", "agents/gsd-codebase-mapper.md": "d49c91fdab4efc70", - "agents/gsd-debug-session-manager.md": "5e47d7b36e262219", - "agents/gsd-debugger.md": "327fe2ec83e46205", + "agents/gsd-debug-session-manager.md": "c723ce1b8691296f", + "agents/gsd-debugger.md": "3a568af40765db29", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "9934ec11845d41c3", @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "63c03b8afbd21b8a", "gsd-core/references/debugger-fix-acceptance.md": "86b7cbde0171fafd", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "d5f1796cde97e7d2", "gsd-core/references/debugger-sbfl.md": "838445590aab52e3", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 6097693c7..4b2235f42 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "94628312f25decb5", "agents/gsd-code-reviewer.md": "5ef947ca5baed775", "agents/gsd-codebase-mapper.md": "feccaeeacd05e34b", - "agents/gsd-debug-session-manager.md": "de03d1f43295518f", - "agents/gsd-debugger.md": "1912fdfe312b3482", + "agents/gsd-debug-session-manager.md": "d46222bd8037b695", + "agents/gsd-debugger.md": "ef869f69333fdcd9", "agents/gsd-doc-classifier.md": "29b563a146c9d22c", "agents/gsd-doc-synthesizer.md": "652beb928e93fa1d", "agents/gsd-doc-verifier.md": "d3d8457bdd44bf10", @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "fd9b10fffb3bd052", "gsd-core/references/debugger-fix-acceptance.md": "b04b913d5ea0ac90", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "8318008696c1e0b2", "gsd-core/references/debugger-sbfl.md": "70e699200f6197e0", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index d56663c63..ab851bf7a 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "9652d5b56a2afbf5", "agents/gsd-code-reviewer.md": "922c08885bc78662", "agents/gsd-codebase-mapper.md": "0ccbf6a685804979", - "agents/gsd-debug-session-manager.md": "59191275e650f655", - "agents/gsd-debugger.md": "5dfaadd8e26b5d57", + "agents/gsd-debug-session-manager.md": "42a775633c9b1b34", + "agents/gsd-debugger.md": "753165cedae67dd6", "agents/gsd-doc-classifier.md": "6256bbc0b887f60f", "agents/gsd-doc-synthesizer.md": "212aaf89a34b51d7", "agents/gsd-doc-verifier.md": "8016f792d0766b77", @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "49f94fe75cabba52", "gsd-core/references/debugger-fix-acceptance.md": "b2732420bdbcadcd", "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "097c2da83d697566", "gsd-core/references/debugger-sbfl.md": "391e732abf32786a", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 49c325639..eb3dd33a6 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -43,9 +43,9 @@ "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": "c71b4debebaa978e", + "agents/subagents/gsd-debug-session-manager.md": "cec62a7fd99ab1c3", "agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7", - "agents/subagents/gsd-debugger.md": "9302c5c4b7d5a2b7", + "agents/subagents/gsd-debugger.md": "ce8ab001fde869cb", "agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43", "agents/subagents/gsd-doc-classifier.md": "632dc6c61bafa63e", "agents/subagents/gsd-doc-classifier.yaml": "a4e9cf7025b57503", @@ -127,6 +127,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index 22fd1729c..c287a411f 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "3622ae5d90fb15f6", "agents/gsd-code-reviewer.md": "2249774416314c57", "agents/gsd-codebase-mapper.md": "948612acd505e87f", - "agents/gsd-debug-session-manager.md": "b5a39dcf10210cbb", - "agents/gsd-debugger.md": "2cb64b4cac666e81", + "agents/gsd-debug-session-manager.md": "e4b96ea41c74c479", + "agents/gsd-debugger.md": "e7f3e6c558756918", "agents/gsd-doc-classifier.md": "fb776cfbb7e991b0", "agents/gsd-doc-synthesizer.md": "2389f388d291c2eb", "agents/gsd-doc-verifier.md": "65bbc2ae6b9ace29", @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "49f94fe75cabba52", "gsd-core/references/debugger-fix-acceptance.md": "b2732420bdbcadcd", "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "097c2da83d697566", "gsd-core/references/debugger-sbfl.md": "391e732abf32786a", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index d3fac7bac..813d5cef0 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -30,6 +30,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 1d47fbdc2..f0d62358c 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "3ed1a27ddc372ef8", "agents/gsd-code-reviewer.md": "27eeeee6cb600e9b", "agents/gsd-codebase-mapper.md": "032ff8ac55466a74", - "agents/gsd-debug-session-manager.md": "afe383b6483d4097", - "agents/gsd-debugger.md": "620e92debfaa906c", + "agents/gsd-debug-session-manager.md": "c1c9c5f538acb941", + "agents/gsd-debugger.md": "2a6bf0bb1a964771", "agents/gsd-doc-classifier.md": "bdf3d54082424e76", "agents/gsd-doc-synthesizer.md": "96c383b74a60fbbe", "agents/gsd-doc-verifier.md": "da9ab6f3ec27778a", @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "47e7929972c06378", "gsd-core/references/debugger-fix-acceptance.md": "ab6a1cce253944f4", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "07ad93b8bcad3c34", "gsd-core/references/debugger-sbfl.md": "061b719c754a12d3", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 8ed95b69d..1ae706265 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "5fe29063843be67e", "agents/gsd-code-reviewer.md": "338c46ab59c4e45f", "agents/gsd-codebase-mapper.md": "8529d8a1ede8bbfb", - "agents/gsd-debug-session-manager.md": "ada53877ba56d894", - "agents/gsd-debugger.md": "c2dea41cd878723c", + "agents/gsd-debug-session-manager.md": "913a370b529ec717", + "agents/gsd-debugger.md": "7a2fd82d5f328d23", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "e51e50892963ccc7", @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "d0458c690c4487c9", "gsd-core/references/debugger-fix-acceptance.md": "134f83886c343733", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "4bf1af239ae875f3", "gsd-core/references/debugger-sbfl.md": "23d7a3bb15bc8b7c", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index 61f6de7e8..a3dab3fe9 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "f00d815ec535a168", "agents/gsd-code-reviewer.md": "efc0d2dee321c654", "agents/gsd-codebase-mapper.md": "cfa2bbfaf264e1fd", - "agents/gsd-debug-session-manager.md": "b7d57cd8ed9103d3", - "agents/gsd-debugger.md": "8d91db51d9fe1959", + "agents/gsd-debug-session-manager.md": "86d75b269a6c40e7", + "agents/gsd-debugger.md": "77a2f8edc9193e54", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "ede2f297b73b5a86", @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "5d8c0a266a6d61f8", "gsd-core/references/debugger-fix-acceptance.md": "ddd00cbd78dd3fdf", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "b5d7c4a5804327c3", "gsd-core/references/debugger-sbfl.md": "071651eaf7414a4c", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 21ec880f8..b3749a62b 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -7,8 +7,8 @@ "agents/gsd-code-fixer.md": "78549833f0411b0c", "agents/gsd-code-reviewer.md": "7d94fe8bfa6661aa", "agents/gsd-codebase-mapper.md": "7cc9d387f29c46e1", - "agents/gsd-debug-session-manager.md": "baf23c3834eb36ba", - "agents/gsd-debugger.md": "240cb56fcb4fa4a7", + "agents/gsd-debug-session-manager.md": "dc4e8a556dbf1708", + "agents/gsd-debugger.md": "95854ad0457494f2", "agents/gsd-doc-classifier.md": "146acf4d176134b5", "agents/gsd-doc-synthesizer.md": "b1f5e2eb28fa3659", "agents/gsd-doc-verifier.md": "7ed4d9611f678a95", @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-prevention.md": "74b6c5556a428efd", "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", diff --git a/tests/fixtures/install-tree/antigravity.json b/tests/fixtures/install-tree/antigravity.json index 056a34045..217154cd2 100644 --- a/tests/fixtures/install-tree/antigravity.json +++ b/tests/fixtures/install-tree/antigravity.json @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/augment.json b/tests/fixtures/install-tree/augment.json index dd6bb50db..43edd9e6e 100644 --- a/tests/fixtures/install-tree/augment.json +++ b/tests/fixtures/install-tree/augment.json @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/claude-local.json b/tests/fixtures/install-tree/claude-local.json index a500a74f9..4f415d9c5 100644 --- a/tests/fixtures/install-tree/claude-local.json +++ b/tests/fixtures/install-tree/claude-local.json @@ -133,6 +133,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/claude.json b/tests/fixtures/install-tree/claude.json index 023979bae..c16839311 100644 --- a/tests/fixtures/install-tree/claude.json +++ b/tests/fixtures/install-tree/claude.json @@ -62,6 +62,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/cline.json b/tests/fixtures/install-tree/cline.json index c179099f9..5dfb31b1e 100644 --- a/tests/fixtures/install-tree/cline.json +++ b/tests/fixtures/install-tree/cline.json @@ -66,6 +66,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/codebuddy.json b/tests/fixtures/install-tree/codebuddy.json index 886a5fb3b..fb466af3d 100644 --- a/tests/fixtures/install-tree/codebuddy.json +++ b/tests/fixtures/install-tree/codebuddy.json @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/codex.json b/tests/fixtures/install-tree/codex.json index 4ad4bb26a..65f058430 100644 --- a/tests/fixtures/install-tree/codex.json +++ b/tests/fixtures/install-tree/codex.json @@ -169,6 +169,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/copilot.json b/tests/fixtures/install-tree/copilot.json index decb5d741..22fa6e8ef 100644 --- a/tests/fixtures/install-tree/copilot.json +++ b/tests/fixtures/install-tree/copilot.json @@ -64,6 +64,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/cursor.json b/tests/fixtures/install-tree/cursor.json index e6388db79..da2e15654 100644 --- a/tests/fixtures/install-tree/cursor.json +++ b/tests/fixtures/install-tree/cursor.json @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/hermes.json b/tests/fixtures/install-tree/hermes.json index 497be17f4..841716d98 100644 --- a/tests/fixtures/install-tree/hermes.json +++ b/tests/fixtures/install-tree/hermes.json @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/kilo.json b/tests/fixtures/install-tree/kilo.json index 8869ad014..585f773d5 100644 --- a/tests/fixtures/install-tree/kilo.json +++ b/tests/fixtures/install-tree/kilo.json @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/kimi.json b/tests/fixtures/install-tree/kimi.json index 25cbb5871..55e7347a7 100644 --- a/tests/fixtures/install-tree/kimi.json +++ b/tests/fixtures/install-tree/kimi.json @@ -127,6 +127,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/opencode.json b/tests/fixtures/install-tree/opencode.json index 56f76f6a6..e27c1ad56 100644 --- a/tests/fixtures/install-tree/opencode.json +++ b/tests/fixtures/install-tree/opencode.json @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/pi.json b/tests/fixtures/install-tree/pi.json index b4213098c..e490bdf86 100644 --- a/tests/fixtures/install-tree/pi.json +++ b/tests/fixtures/install-tree/pi.json @@ -30,6 +30,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/qwen.json b/tests/fixtures/install-tree/qwen.json index 783f6a90e..12b22a379 100644 --- a/tests/fixtures/install-tree/qwen.json +++ b/tests/fixtures/install-tree/qwen.json @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/trae.json b/tests/fixtures/install-tree/trae.json index 1647b64a5..b0724a520 100644 --- a/tests/fixtures/install-tree/trae.json +++ b/tests/fixtures/install-tree/trae.json @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/windsurf.json b/tests/fixtures/install-tree/windsurf.json index b460ef790..0a6b36d35 100644 --- a/tests/fixtures/install-tree/windsurf.json +++ b/tests/fixtures/install-tree/windsurf.json @@ -63,6 +63,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md", diff --git a/tests/fixtures/install-tree/zcode.json b/tests/fixtures/install-tree/zcode.json index a4bc0647d..472031595 100644 --- a/tests/fixtures/install-tree/zcode.json +++ b/tests/fixtures/install-tree/zcode.json @@ -134,6 +134,7 @@ "gsd-core/references/debugger-bug-taxonomy.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-prevention.md", "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-repro-hardening.md", "gsd-core/references/debugger-sbfl.md",