diff --git a/.changeset/1960-rca-branching.md b/.changeset/1960-rca-branching.md new file mode 100644 index 000000000..0409ece55 --- /dev/null +++ b/.changeset/1960-rca-branching.md @@ -0,0 +1,5 @@ +--- +type: Added +pr: 2405 +--- +**`gsd-debugger` now branches root-cause analysis instead of chaining, guarding against 5-Whys single-cause bias** — before committing `root_cause`, the debugger enumerates candidate causes across ≥2 Ishikawa categories (code / config / environment / data) rather than a single linear "why" chain, and explicitly answers an AND-gate question ("could this failure require more than one contributing condition simultaneously?"). When the AND-gate fires, every contributing cause is recorded — so a multi-cause fix no longer recurs via the unaddressed second cause. `Resolution.root_cause` may now hold one OR a small set of contributing causes (additive; a single-cause session still records exactly one root_cause while the reasoning_checkpoint gains two RCA fields populated in every session). The Structured Reasoning Checkpoint gains `candidate_causes` + `and_gate` fields, and `debugger-philosophy.md` adds the single-cause-bias trap to its cognitive-bias table. Full rules live in `gsd-core/references/debugger-rca-branching.md`. (#1960) diff --git a/agents/gsd-debug-session-manager.md b/agents/gsd-debug-session-manager.md index f80799ed7..4d56fc625 100644 --- a/agents/gsd-debug-session-manager.md +++ b/agents/gsd-debug-session-manager.md @@ -316,7 +316,7 @@ Return compact summary (terminal — investigation resolved): ## DEBUG SESSION COMPLETE **Session:** {final path — resolved/ if archived, otherwise debug_file_path} -**Root Cause:** {one sentence from Resolution.root_cause, or "not determined"} +**Root Cause:** {one sentence, or a '; '-joined list when the AND-gate identified multiple contributing causes, from Resolution.root_cause; or "not determined"} **Fix:** {one sentence from Resolution.fix, or "not applied"} **Cycles:** {N} (investigation) + {M} (fix) **TDD:** {yes/no} @@ -329,7 +329,7 @@ If the session was abandoned by user choice, return (terminal — user stopped): ## DEBUG SESSION COMPLETE **Session:** {debug_file_path} -**Root Cause:** {one sentence if found, or "not determined"} +**Root Cause:** {one sentence if found (or a '; '-joined list if the AND-gate identified multiple contributing causes), or "not determined"} **Fix:** not applied **Cycles:** {N} **TDD:** {yes/no} diff --git a/agents/gsd-debugger.md b/agents/gsd-debugger.md index cbd11ac11..ddfda6312 100644 --- a/agents/gsd-debugger.md +++ b/agents/gsd-debugger.md @@ -253,6 +253,10 @@ reasoning_checkpoint: falsification_test: "[what specific observation would prove this hypothesis wrong]" fix_rationale: "[why the proposed fix addresses the root cause — not just the symptom]" blind_spots: "[what you haven't tested that could invalidate this hypothesis]" + candidate_causes: + - "[cause in category: code|config|environment|data]" + - "[cause in a DIFFERENT category — single-category is not a branch]" + and_gate: "[could this failure require >1 contributing condition simultaneously? yes/no + why — see RCA branching]" ``` **Check before proceeding:** @@ -260,8 +264,9 @@ reasoning_checkpoint: - Is the confirming evidence direct observation, not inference? - Does the fix address the root cause or a symptom? - Have you documented your blind spots honestly? +- **Did you branch across ≥2 categories and answer the AND-gate?** (Single-cause is fine when the AND-gate is no — but you must have checked.) -If you cannot fill all five fields with specific, concrete answers — you do not have a confirmed root cause yet. Return to investigation_loop. +If you cannot fill all seven fields with specific, concrete answers — you do not have a confirmed root cause yet. Return to investigation_loop. ## Minimal Reproduction @@ -788,7 +793,7 @@ Each resolved session appends one entry: ## {slug} — {one-line description} - **Date:** {ISO date} - **Error patterns:** {comma-separated keywords extracted from symptoms.errors and symptoms.actual} -- **Root cause:** {from Resolution.root_cause} +- **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} --- @@ -998,6 +1003,10 @@ At investigation decision points, apply structured reasoning: **Phase 2: Form hypothesis** - Based on evidence AND common pattern matches, form SPECIFIC, FALSIFIABLE hypothesis +- **Branch, don't chain** — at hypothesis formation (so it's done before the Phase 4 commit), enumerate candidate causes across ≥2 Ishikawa categories (code / config / environment / data) and answer the AND-gate check; `root_cause` may hold a set when the AND-gate fires: + +@~/.claude/gsd-core/references/debugger-rca-branching.md + - Update Current Focus with hypothesis, test, expecting, next_action **Phase 3: Test hypothesis** @@ -1050,7 +1059,7 @@ Return structured diagnosis: **Debug Session:** .planning/debug/{slug}.md -**Root Cause:** {from Resolution.root_cause} +**Root Cause:** {from Resolution.root_cause — one cause, or a '; '-joined list when the AND-gate identified multiple contributing causes} **Evidence Summary:** - {key finding 1} @@ -1090,7 +1099,7 @@ Update status to "fixing". **0. Structured Reasoning Checkpoint (MANDATORY)** - Write the `reasoning_checkpoint` block to Current Focus (see Structured Reasoning Checkpoint in investigation_techniques) -- Verify all five fields can be filled with specific, concrete answers +- Verify every field can be filled with specific, concrete answers — including the RCA `candidate_causes` (≥2 categories) and `and_gate` fields - If any field is vague or empty: return to investigation_loop — root cause is not confirmed **1. Implement minimal fix** @@ -1204,7 +1213,7 @@ Then append the entry: ## {slug} — {one-line description of the bug} - **Date:** {ISO date} - **Error patterns:** {comma-separated keywords from Symptoms.errors + Symptoms.actual} -- **Root cause:** {Resolution.root_cause} +- **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} --- @@ -1309,7 +1318,7 @@ Orchestrator presents checkpoint to user, gets response, spawns fresh continuati **Debug Session:** .planning/debug/{slug}.md -**Root Cause:** {specific cause with evidence} +**Root Cause:** {specific cause with evidence — one cause, or a '; '-joined list when the AND-gate identified multiple contributing causes} **Evidence Summary:** - {key finding 1} diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 8751711c1..c7fbbada3 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -402,6 +402,7 @@ runs its default whole-repo scan. - Requires human verification before marking resolved - Runs a multi-signal fix-acceptance guardrail (mutation check, no-op/deletion detector, adjacent tests, revert-and-reconfirm) before accepting a fix; degrades gracefully when Stryker or a test suite is absent - Ranks suspect code by Ochiai suspiciousness from test pass/fail coverage (spectrum-based fault localization) before forming hypotheses; skips cleanly when no coverage exists +- 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 - 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 54e8df122..01aa984bb 100644 --- a/docs/INVENTORY-MANIFEST.json +++ b/docs/INVENTORY-MANIFEST.json @@ -216,6 +216,7 @@ "continuation-format.md", "debugger-fix-acceptance.md", "debugger-philosophy.md", + "debugger-rca-branching.md", "debugger-sbfl.md", "decimal-phase-calculation.md", "doc-conflict-engine.md", diff --git a/docs/INVENTORY.md b/docs/INVENTORY.md index 0d6da296a..5aae1e458 100644 --- a/docs/INVENTORY.md +++ b/docs/INVENTORY.md @@ -296,6 +296,7 @@ Full roster at `gsd-core/references/*.md`. References are shared knowledge docum | `debugger-philosophy.md` | Evergreen debugging disciplines loaded by `gsd-debugger`. | | `debugger-fix-acceptance.md` | Multi-signal fix-acceptance guardrail (anti-overfitting) loaded by `gsd-debugger`. | | `debugger-sbfl.md` | Spectrum-based fault localization (Ochiai) pre-filter loaded by `gsd-debugger`. | +| `debugger-rca-branching.md` | RCA branching (fishbone + AND-gate) anti-single-cause discipline 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-philosophy.md b/gsd-core/references/debugger-philosophy.md index 23ee967b8..c5689e5b6 100644 --- a/gsd-core/references/debugger-philosophy.md +++ b/gsd-core/references/debugger-philosophy.md @@ -50,6 +50,7 @@ When debugging, return to foundational truths: | **Anchoring** | First explanation becomes your anchor | Generate 3+ independent hypotheses before investigating any | | **Availability** | Recent bugs → assume similar cause | Treat each bug as novel until evidence suggests otherwise | | **Sunk Cost** | Spent 2 hours on one path, keep going despite evidence | Every 30 min: "If I started fresh, is this still the path I'd take?" | +| **Single-cause (5-Whys) bias** | A linear "why → why → why" chain stops at ONE cause; multi-cause failures recur via the unaddressed second cause | Branch across ≥2 Ishikawa categories and answer the AND-gate before committing `root_cause` (see `debugger-rca-branching.md`) | ## Systematic Investigation Disciplines diff --git a/gsd-core/references/debugger-rca-branching.md b/gsd-core/references/debugger-rca-branching.md new file mode 100644 index 000000000..a527888e6 --- /dev/null +++ b/gsd-core/references/debugger-rca-branching.md @@ -0,0 +1,98 @@ +# RCA Branching — Anti-Single-Cause Bias + +Loaded by `gsd-debugger` via `@-include` from Phase 2 (form hypothesis) and the +pre-fix Structured Reasoning Checkpoint. A lightweight discipline that guards +against the best-known Root-Cause-Analysis failure mode: **5-Whys single-cause +bias** — a linear "why → why → why" chain tends to isolate ONE cause and stop, +even when a failure has several independent contributing causes. + +## Why this exists + +The agent already warns against confirmation bias and encourages "multiple +competing hypotheses." But the resolution still commits to a single +`Resolution.root_cause`, and there is no explicit guard against stopping at the +first plausible cause. A single-cause fix on a multi-cause failure passes +verification and then **recurs via the unaddressed second cause** — wasting a +whole future debug cycle. The fix is a few sentences of prompt discipline reusing +the existing hypothesis machinery and debug-file sections; it is **not** a +Fault-Tree-Analysis subsystem. + +## The discipline + +### 1. Branch, don't chain + +Before committing `root_cause`, enumerate candidate causes across **≥2 +Ishikawa (fishbone) categories** — not a single linear chain. The four +categories: + +- **code** — logic error, off-by-one, wrong branch, missing null check, race in the code under investigation +- **config** — configuration value, feature flag, schema/migration, index/capacity setting +- **environment** — runtime version, OS/platform, timezone, network, dependencies, resource limits +- **data** — input shape, corrupt/partial record, ordering/encoding, volume/scale + +A race or timing bug often **bridges categories** (e.g., a code race amplified by environment load, or by a config-driven scan window) — enumerate it in every category it spans, not just one. That cross-category enumeration is exactly what the AND-gate is designed to surface. + +Record each candidate branch in `Current Focus` (under the `reasoning_checkpoint.candidate_causes` field). Two+ categories is the minimum bar — if every candidate lands in the same category, you have not branched; generate at least one candidate from a different category before proceeding. + +### 2. AND-gate check (Fault Tree Analysis) + +Explicitly answer one question before collapsing: + +> **Could this failure require more than one contributing condition simultaneously?** + +Record the answer in `reasoning_checkpoint.and_gate`. If **yes** (an AND-gate — +the symptom only manifests when two or more conditions co-occur), **every +contributing cause is recorded**, not just the most salient. If **no**, the +single confirmed cause suffices. + +### 3. Collapse + +Collapse to the confirmed `root_cause` — which may now be **one cause OR a small +set of contributing causes**. Append the eliminated branches to the `Eliminated` +section (never delete them — Kernighan auditability). The recorded set must be +non-empty (at least one confirmed cause) and disjoint from `Eliminated`. + +**Self-consistency with the AND-gate:** the confirmed set must agree with the +AND-gate answer. If `and_gate: yes` (the failure requires ≥2 simultaneous +conditions), a single confirmed cause **cannot** fully account for the symptom — +investigation is incomplete; **return to Phase 3** and find the missing +co-occurring cause(s) before collapsing. If `and_gate: no`, the confirmed set +holds exactly one cause. + +## Worked examples + +**Single-cause (AND-gate no):** a counter shows 3 when clicked once. Candidate +branches: code (event handler fires twice) · config (none) · environment (none) +· data (none). AND-gate: no — the double-fire alone fully accounts for the +symptom. Collapse to one root cause: `event handler bound twice`. Recorded shape: +`root_causes: [double-fire]`. **Identical to today** — single-cause sessions are +byte-for-byte unchanged. + +**Multi-cause (AND-gate yes):** intermittent database corruption under load. +Candidate branches: code (two async writers, no lock) · config (missing index → +full-table scan amplifies the race window) · environment (none) · data (none). +AND-gate: **yes** — the corruption only occurs when a writer races AND the scan +holds the read transaction open long enough for the interleaving. Collapse to a +set: `root_causes: [missing async lock, missing index]`. Eliminated: timezone +(reproduced in UTC), env-var (unset in repro). The fix must address BOTH; +addressing only the lock leaves the index-driven amplification, and the +corruption recurs under load. + +## Backward compatibility + +`Resolution.root_cause` may now hold one OR a small set of contributing causes. +For a single-cause session it still holds exactly one cause (shape unchanged); +the `reasoning_checkpoint` block gains two RCA fields (`candidate_causes`, +`and_gate`) that are populated in **every** session regardless of cause count. +There is no file-format break — readers that handled one cause continue to work +(a single-element set is the same shape as a lone value to a reader that +iterates). + +## Scope boundary (Zawinski's Law) + +This is a few sentences of prompt discipline. It is **not** a full FTA tree, not +an incident-management system, and not a new debug-file section — it reuses the +existing `Current Focus`, `Eliminated`, and `Resolution` sections and the +existing `reasoning_checkpoint` block. Where a bug genuinely has one cause, the +discipline costs two extra sentences (the empty non-code branches + an AND-gate +"no"); where it has many, it prevents a recurrence. diff --git a/gsd-core/templates/DEBUG.md b/gsd-core/templates/DEBUG.md index 8702126ce..922ca619c 100644 --- a/gsd-core/templates/DEBUG.md +++ b/gsd-core/templates/DEBUG.md @@ -51,7 +51,7 @@ started: [when it broke / always broken] ## Resolution -root_cause: [empty until found] +root_cause: [empty until found — may hold one OR a small set of contributing causes when the AND-gate fires; see gsd-core/references/debugger-rca-branching.md] fix: [empty until applied] verification: [empty until verified — holds the nested per-signal fix-acceptance guardrail record (map shape) when active; see gsd-core/references/debugger-fix-acceptance.md] files_changed: [] @@ -73,7 +73,7 @@ files_changed: [] - If Claude reads this after /clear, it knows exactly where to resume - Fields: hypothesis, test, expecting, next_action, reasoning_checkpoint, tdd_checkpoint - `next_action`: must be concrete and actionable — bad: "continue investigating"; good: "Add logging at line 47 of auth.js to observe token value before jwt.verify()" -- `reasoning_checkpoint`: OVERWRITE before every fix_and_verify — five-field structured reasoning record (hypothesis, confirming_evidence, falsification_test, fix_rationale, blind_spots) +- `reasoning_checkpoint`: OVERWRITE before every fix_and_verify — seven-field structured reasoning record (hypothesis, confirming_evidence, falsification_test, fix_rationale, blind_spots, candidate_causes, and_gate) — see `gsd-debugger.md` Structured Reasoning Checkpoint - `tdd_checkpoint`: OVERWRITE during TDD red/green phases — test file, name, status, failure output **Symptoms:** diff --git a/tests/agent-size-baseline.json b/tests/agent-size-baseline.json index 2d0c7ffe1..8ba5d10ec 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": 16850, - "gsd-debugger.md": 52734, + "gsd-debug-session-manager.md": 17012, + "gsd-debugger.md": 53893, "gsd-doc-classifier.md": 11717, "gsd-doc-synthesizer.md": 13154, "gsd-doc-verifier.md": 12403, diff --git a/tests/debug-session-management.test.cjs b/tests/debug-session-management.test.cjs index d4944c3d6..962ea5384 100644 --- a/tests/debug-session-management.test.cjs +++ b/tests/debug-session-management.test.cjs @@ -187,8 +187,37 @@ describe('debug skill dispatch and sub-orchestrator (#2148, #2151)', () => { }); test('debug.md delegates to gsd-debug-session-manager', () => { - const content = fs.readFileSync(path.join(process.cwd(), 'gsd-core/workflows/debug.md'), 'utf8'); + const content = fs.readFileSync(path.join(process.cwd(), 'gsd-core', 'workflows', 'debug.md'), 'utf8'); assert.ok(content.includes('gsd-debug-session-manager'), 'debug.md does not delegate to session manager'); }); + + test('DEBUG.md reasoning_checkpoint field-count claim matches gsd-debugger.md YAML keys (parity)', () => { + // Parallel-surface drift guard (DEFECT.GENERATIVE-FIX): the field-count + // claim in the DEBUG.md section_rules prose must equal the number of keys + // enumerated in the gsd-debugger.md reasoning_checkpoint YAML block. + // CRLF-safe regex/split per DEFECT.WINDOWS-TEST-PORTABILITY. Accepts either + // digit ("7-field") or word ("seven-field") count form. + const NUMWORDS = { one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9, ten: 10 }; + const debugContent = fs.readFileSync(path.join(process.cwd(), 'gsd-core', 'templates', 'DEBUG.md'), 'utf8'); + const agentContent = fs.readFileSync(path.join(process.cwd(), 'agents', 'gsd-debugger.md'), 'utf8'); + const debugMatch = debugContent.match(/reasoning_checkpoint[^.\r\n]*?(\d+|one|two|three|four|five|six|seven|eight|nine|ten)-field structured reasoning record/i); + assert.ok(debugMatch, 'DEBUG.md must state a "N-field structured reasoning record" claim for reasoning_checkpoint'); + const claimedCount = /^\d+$/.test(debugMatch[1]) ? parseInt(debugMatch[1], 10) : NUMWORDS[debugMatch[1].toLowerCase()]; + assert.ok(typeof claimedCount === 'number', `unrecognized field-count token: ${debugMatch[1]}`); + const yamlBlock = agentContent.match(/reasoning_checkpoint:\s*\r?\n([\s\S]*?)```/); + assert.ok(yamlBlock, 'gsd-debugger.md must define a fenced reasoning_checkpoint YAML block'); + const keys = new Set(); + for (const line of yamlBlock[1].split(/\r?\n/)) { + // Match 2-space-indented YAML keys (with OR without an inline value — + // array-valued keys like confirming_evidence: have no trailing space). + const m = line.match(/^ {2}([a-z_]+):/); + if (m) keys.add(m[1]); + } + assert.strictEqual( + keys.size, + claimedCount, + `parity drift: DEBUG.md claims ${claimedCount}-field but gsd-debugger.md enumerates ${keys.size} keys (${[...keys].join(', ')}). Update BOTH surfaces together.` + ); + }); }); diff --git a/tests/debugger-rca-branching.test.cjs b/tests/debugger-rca-branching.test.cjs new file mode 100644 index 000000000..3b96c282e --- /dev/null +++ b/tests/debugger-rca-branching.test.cjs @@ -0,0 +1,182 @@ +// allow-test-rule: source-text-is-the-product (see #1960) +// Agent .md + reference .md + template .md files — their text IS what the +// runtime loads. Testing text content tests the deployed RCA-branching +// contract. The pure-JS schema-invariant checks below validate the data model +// the agent records (root_cause may hold a set when the AND-gate fires). +// Per CONTRIBUTING.md exception matrix. Covers epic #1957 Phase 2A (#1960). +'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 REFERENCE = path.join(ROOT, 'gsd-core/references/debugger-rca-branching.md'); +const PHILOSOPHY = path.join(ROOT, 'gsd-core/references/debugger-philosophy.md'); +const DEBUG_TEMPLATE = path.join(ROOT, 'gsd-core/templates/DEBUG.md'); + +// Validated data-model invariant: the RCA-branching output the agent records. +// root_causes holds every CONFIRMED candidate (one OR a small set — the AND-gate +// decides whether >1 is kept); eliminated holds the rest. The two never overlap +// and every candidate lands in exactly one bucket. +function assertRcaSchemaInvariants(output) { + assert.ok(Array.isArray(output.root_causes), 'root_causes must be a list (set-valued)'); + assert.ok(Array.isArray(output.eliminated), 'eliminated must be a list'); + assert.ok(output.root_causes.length >= 1, 'at least one confirmed root cause is required'); + const rootIds = new Set(output.root_causes.map((c) => c.id)); + const elimIds = new Set(output.eliminated.map((c) => c.id)); + for (const id of rootIds) { + assert.ok(!elimIds.has(id), `cause ${id} appears in BOTH root_causes and eliminated (must be disjoint)`); + } + // AND-gate self-consistency: if the gate fired (yes — failure requires >=2 + // simultaneous conditions), a single confirmed cause cannot fully account for + // the symptom; investigation is incomplete. + const andGateYes = /^yes\b/i.test(String(output.and_gate || '').trim()); + if (andGateYes) { + assert.ok( + output.root_causes.length >= 2, + `and_gate=yes requires >=2 confirmed causes (got ${output.root_causes.length}) — single-cause with AND-gate=yes means investigation is incomplete` + ); + } +} + +describe('RCA branching — anti-single-cause bias (#1960, epic #1957 Phase 2A)', () => { + describe('reference extract exists and is wired into Phase 2', () => { + test('gsd-core/references/debugger-rca-branching.md exists', () => { + assert.ok(fs.existsSync(REFERENCE), 'debugger-rca-branching.md reference must exist'); + }); + + test('gsd-debugger.md Phase 2 @-includes the RCA-branching reference', () => { + const content = fs.readFileSync(AGENT, 'utf8'); + assert.ok( + content.includes('@~/.claude/gsd-core/references/debugger-rca-branching.md'), + 'gsd-debugger.md must @-include the RCA-branching reference from Phase 2 (or the reasoning checkpoint)' + ); + }); + }); + + describe('branch-don\'t-chain: fishbone across >=2 categories', () => { + test('reference documents the four Ishikawa categories', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/code/i.test(content), 'category: code'); + assert.ok(/config/i.test(content), 'category: config'); + assert.ok(/environment/i.test(content), 'category: environment'); + assert.ok(/data/i.test(content), 'category: data'); + assert.ok(/fishbone|ishikawa|\b>=?\s*2\s+categor/i.test(content), + 'must require branching across >=2 categories (Ishikawa/fishbone)'); + }); + + test('reference contrasts branching with a single linear 5-Whys chain', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/5-?\s*whys|five whys|linear chain|single[\s-]?cause/i.test(content), + 'must name the 5-Whys / single-cause-bias failure mode being guarded against'); + }); + }); + + describe('AND-gate check (Fault Tree Analysis)', () => { + test('reference documents the AND-gate question', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/and[\s-]?gate/i.test(content), 'must name the AND-gate check'); + assert.ok(/more than one|multiple|simultaneous/i.test(content), + 'must ask whether the failure requires multiple contributing conditions simultaneously'); + }); + }); + + describe('root_cause may hold a set; single-cause sessions unaffected (backward compat)', () => { + test('reference documents that root_cause can record multiple contributing causes', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/root_cause|root cause/i.test(content)); + assert.ok(/multiple|set|more than one|all contributing/i.test(content), + 'must document that root_cause can hold multiple contributing causes when the AND-gate fires'); + }); + + test('reference documents single-cause backward compatibility', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/single[\s-]?cause|backward|identical|unchanged/i.test(content), + 'must document that single-cause sessions are unaffected (backward compatible)'); + }); + + test('DEBUG.md template root_cause field notes it may hold a set', () => { + const content = fs.readFileSync(DEBUG_TEMPLATE, 'utf8'); + assert.ok(/root_cause/.test(content), 'template must still have the root_cause field'); + assert.ok(/set|multiple|contributing|one or more/i.test(content), + 'DEBUG.md root_cause must note it may hold one or more contributing causes (per RCA branching)'); + }); + }); + + describe('Structured Reasoning Checkpoint gains the RCA fields', () => { + test('reasoning_checkpoint YAML includes candidate_causes + and_gate', () => { + const content = fs.readFileSync(AGENT, 'utf8'); + assert.ok(/candidate_causes/.test(content), + 'reasoning_checkpoint must include a candidate_causes field (the >=2-category branches)'); + assert.ok(/and_gate/.test(content), + 'reasoning_checkpoint must include an and_gate field (the AND-gate answer)'); + }); + }); + + describe('debugger-philosophy.md notes the single-cause-bias trap', () => { + test('philosophy reference calls out single-cause bias', () => { + const content = fs.readFileSync(PHILOSOPHY, 'utf8'); + assert.ok(/single[\s-]?cause|5-?\s*whys|root[\s-]?cause bias/i.test(content), + 'debugger-philosophy.md must note the single-cause-bias / 5-Whys trap alongside the existing cognitive-bias guidance'); + }); + }); + + describe('RCA output schema — invariant specification (agent-output conformance enforced by the source-text contract tests above)', () => { + // The fixtures below exercise the documented data model. They are a + // *specification* of the schema invariants (not a test of production code, + // which is prompt-level); the Tier-1 source-text contract tests carry the + // real enforcement that the agent records conformant output. + + test('fixture A — two contributing causes (AND-gate yes): both recorded in root_causes', () => { + const output = { + // The agent confirmed BOTH causes (AND-gate fired — both required simultaneously). + root_causes: [ + { id: 'race-condition', category: 'code', evidence: 'two async writers, no lock' }, + { id: 'missing-index', category: 'config', evidence: 'full-table scan under load amplifies the race window' }, + ], + eliminated: [{ id: 'timezone', category: 'environment', evidence: 'reproduced in UTC too' }], + and_gate: 'yes — both the race AND the missing index are required to produce the observed corruption', + }; + assertRcaSchemaInvariants(output); + assert.strictEqual(output.root_causes.length, 2, 'both contributing causes must be recorded (criterion 1)'); + const cats = new Set(output.root_causes.map((c) => c.category)); + assert.ok(cats.size >= 2, 'the confirmed causes span >=2 categories (branching is real)'); + }); + + test('fixture B — single-cause (AND-gate no): one root_cause, identical to today (criterion 2)', () => { + const output = { + root_causes: [ + { id: 'off-by-one', category: 'code', evidence: 'loop bound < instead of <=' }, + ], + eliminated: [ + { id: 'config-default', category: 'config', evidence: 'unchanged in repro' }, + { id: 'env-var', category: 'environment', evidence: 'unset in repro' }, + ], + and_gate: 'no — the off-by-one alone fully accounts for the symptom', + }; + assertRcaSchemaInvariants(output); + assert.strictEqual(output.root_causes.length, 1, 'single-cause session records exactly one root cause (criterion 2: unaffected)'); + }); + + test('invariant: a confirmed cause can never also appear in eliminated', () => { + const bad = { + root_causes: [{ id: 'x', category: 'code', evidence: 'e' }], + eliminated: [{ id: 'x', category: 'code', evidence: 'e' }], + and_gate: 'no', + }; + assert.throws(() => assertRcaSchemaInvariants(bad), /disjoint/); + }); + + test('invariant: AND-gate=yes with a single confirmed cause is flagged as incomplete', () => { + const incomplete = { + root_causes: [{ id: 'only-one', category: 'code', evidence: 'e' }], + eliminated: [], + and_gate: 'yes — two conditions required simultaneously', + }; + assert.throws(() => assertRcaSchemaInvariants(incomplete), />=2/); + }); + }); +}); diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index fc6d54c8a..ce4cf8730 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": "95441545abeab3f5", - "agents/gsd-debugger.md": "a41ea4bc59ea744f", + "agents/gsd-debug-session-manager.md": "523f28a1ed8a4536", + "agents/gsd-debugger.md": "71beaf5bd92bac6e", "agents/gsd-doc-classifier.md": "fca19595590391df", "agents/gsd-doc-synthesizer.md": "0e5184bbcf0dca02", "agents/gsd-doc-verifier.md": "888c6ac870cb91a6", @@ -61,7 +61,8 @@ "gsd-core/references/context-budget.md": "177520ead2ae3a23", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "87d367e4e864910e", - "gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88", + "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "de9cd1bd0e1485c6", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -153,7 +154,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "88e8753b4296b586", + "gsd-core/templates/DEBUG.md": "0df505199f1c248b", "gsd-core/templates/README.md": "28160dd8b0631652", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index acf08f35c..21db1646e 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": "2f775ae4ab8855a0", - "agents/gsd-debugger.md": "a0ec84b507f2e036", + "agents/gsd-debug-session-manager.md": "d2b983f774816e9a", + "agents/gsd-debugger.md": "10bc326f43c3ce13", "agents/gsd-doc-classifier.md": "262a94b947a4e2aa", "agents/gsd-doc-synthesizer.md": "01f90ea9b0d05d7d", "agents/gsd-doc-verifier.md": "b3433e0db51e1c60", @@ -132,7 +132,8 @@ "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", @@ -224,7 +225,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", - "gsd-core/templates/DEBUG.md": "81b60f25e9e7c9a3", + "gsd-core/templates/DEBUG.md": "f85918715fef9743", "gsd-core/templates/README.md": "93d3426fc64e2c12", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index 060db57c6..42509c52a 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": "7e08652ad1c48efb", - "agents/gsd-debugger.md": "3c0526872ae337d7", + "agents/gsd-debug-session-manager.md": "11afaabc2a749f32", + "agents/gsd-debugger.md": "b3910b8cc38d167e", "agents/gsd-doc-classifier.md": "a76778bdde1c7f72", "agents/gsd-doc-synthesizer.md": "8b0b6fc187c9d353", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", @@ -131,7 +131,8 @@ "gsd-core/references/context-budget.md": "6bfac08025ea3106", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -223,7 +224,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "50062753f2f0c24c", + "gsd-core/templates/DEBUG.md": "ba1d879f05b7ee2e", "gsd-core/templates/README.md": "90d2617778373147", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index f460f1f48..06a5c37da 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": "a813e6b226b2be58", - "agents/gsd-debugger.md": "fc975cf160dfee7a", + "agents/gsd-debug-session-manager.md": "3a6614424653612b", + "agents/gsd-debugger.md": "bd5e2b010ca6bb0b", "agents/gsd-doc-classifier.md": "a636ae9594b25770", "agents/gsd-doc-synthesizer.md": "dfb95eedfb3789bf", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", @@ -60,7 +60,8 @@ "gsd-core/references/context-budget.md": "533eae480bfc4bb8", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -152,7 +153,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "50062753f2f0c24c", + "gsd-core/templates/DEBUG.md": "ba1d879f05b7ee2e", "gsd-core/templates/README.md": "90d2617778373147", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index c38f677e0..53c9e25f6 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": "dd70329c06ec5b79", - "agents/gsd-debugger.md": "706cc2c87a8da251", + "agents/gsd-debug-session-manager.md": "55788b44fdfc4375", + "agents/gsd-debugger.md": "7773cd1a65b723bf", "agents/gsd-doc-classifier.md": "5011d7358d2b2848", "agents/gsd-doc-synthesizer.md": "e59cdd669876582d", "agents/gsd-doc-verifier.md": "b60290c9d9f6d8d2", @@ -64,7 +64,8 @@ "gsd-core/references/context-budget.md": "c154ba00dbbf4477", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", "gsd-core/references/debugger-fix-acceptance.md": "1057d70f7f2d654a", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "6e4975ee50973c23", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", @@ -156,7 +157,7 @@ "gsd-core/references/worktree-branch-check.md": "46882ad61f3f9075", "gsd-core/references/worktree-path-safety.md": "8e5b4d542d2d9853", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", - "gsd-core/templates/DEBUG.md": "81b60f25e9e7c9a3", + "gsd-core/templates/DEBUG.md": "f85918715fef9743", "gsd-core/templates/README.md": "004c355d4b02b145", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index a7d023273..c9ad14f0d 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": "6dc05c3ac8a3f2cc", - "agents/gsd-debugger.md": "54ab502a6b751680", + "agents/gsd-debug-session-manager.md": "9f56455afb580275", + "agents/gsd-debugger.md": "dd19b31e62f3d052", "agents/gsd-doc-classifier.md": "c2bf59af9467810b", "agents/gsd-doc-synthesizer.md": "b2a179bf3c9bd636", "agents/gsd-doc-verifier.md": "e74d930905a782ea", @@ -132,7 +132,8 @@ "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", @@ -224,7 +225,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", - "gsd-core/templates/DEBUG.md": "81b60f25e9e7c9a3", + "gsd-core/templates/DEBUG.md": "f85918715fef9743", "gsd-core/templates/README.md": "93d3426fc64e2c12", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 7910f70c2..fac721a86 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": "5c7af4adccaa9597", - "agents/gsd-debug-session-manager.toml": "e3b962d5478f2b46", - "agents/gsd-debugger.md": "fefd9d1a59661bff", - "agents/gsd-debugger.toml": "83dbb27716668d91", + "agents/gsd-debug-session-manager.md": "c2b615fce5adc13e", + "agents/gsd-debug-session-manager.toml": "4420cb596ad6b183", + "agents/gsd-debugger.md": "75dbb44988dc6c27", + "agents/gsd-debugger.toml": "793203a40a0c5a26", "agents/gsd-doc-classifier.md": "2745bc04d7b93666", "agents/gsd-doc-classifier.toml": "3fe5ec83f62b586e", "agents/gsd-doc-synthesizer.md": "4f545f2e916458ad", @@ -167,7 +167,8 @@ "gsd-core/references/context-budget.md": "0b67ea1d5db4bc08", "gsd-core/references/continuation-format.md": "e64c0da2b3d0f2f0", "gsd-core/references/debugger-fix-acceptance.md": "b2732420bdbcadcd", - "gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88", + "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "391e732abf32786a", "gsd-core/references/decimal-phase-calculation.md": "ee363ec47be68922", "gsd-core/references/doc-conflict-engine.md": "257aba80c93854d4", @@ -259,7 +260,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "6411a4789f481c15", - "gsd-core/templates/DEBUG.md": "0b3251208f63b437", + "gsd-core/templates/DEBUG.md": "f6d2f4365490e5ad", "gsd-core/templates/README.md": "dc13994dabe139a2", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "59a3d4f6c4afbfc9", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index 99f5266d2..17a0618af 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": "bbea35c986c88ce6", - "agents/gsd-debugger.agent.md": "358b4c70a38b4341", + "agents/gsd-debug-session-manager.agent.md": "77ee029f0f81c09d", + "agents/gsd-debugger.agent.md": "e467c0235e5002f9", "agents/gsd-doc-classifier.agent.md": "aea81c0ba00e06cf", "agents/gsd-doc-synthesizer.agent.md": "6ae32e4db005696d", "agents/gsd-doc-verifier.agent.md": "0230208ae7ab1a08", @@ -62,7 +62,8 @@ "gsd-core/references/context-budget.md": "435474d5e10be65a", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "812922e2b5db9410", - "gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88", + "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "5bb65a8653bf2e06", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -154,7 +155,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "88e8753b4296b586", + "gsd-core/templates/DEBUG.md": "0df505199f1c248b", "gsd-core/templates/README.md": "da29c64b438065b3", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 1d11089fe..47a8c1a5f 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": "69a051432e54f9a5", - "agents/gsd-debugger.md": "ac61fdd3129770c5", + "agents/gsd-debug-session-manager.md": "5e47d7b36e262219", + "agents/gsd-debugger.md": "8d3a21e3f8e3f059", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "9934ec11845d41c3", @@ -132,7 +132,8 @@ "gsd-core/references/context-budget.md": "304dcdab82a27623", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "86b7cbde0171fafd", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "838445590aab52e3", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -224,7 +225,7 @@ "gsd-core/references/worktree-branch-check.md": "ab004404d028cc0d", "gsd-core/references/worktree-path-safety.md": "66de0b35266c807d", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "50062753f2f0c24c", + "gsd-core/templates/DEBUG.md": "ba1d879f05b7ee2e", "gsd-core/templates/README.md": "83a3d5b593587e83", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index e83e24ea2..e17b5c70e 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": "60945a8dcfb7e3d7", - "agents/gsd-debugger.md": "8a375259b81d8adf", + "agents/gsd-debug-session-manager.md": "de03d1f43295518f", + "agents/gsd-debugger.md": "904b45639181d8cb", "agents/gsd-doc-classifier.md": "29b563a146c9d22c", "agents/gsd-doc-synthesizer.md": "652beb928e93fa1d", "agents/gsd-doc-verifier.md": "d3d8457bdd44bf10", @@ -61,7 +61,8 @@ "gsd-core/references/context-budget.md": "b93e9f47aa1b1753", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "b04b913d5ea0ac90", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "70e699200f6197e0", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -153,7 +154,7 @@ "gsd-core/references/worktree-branch-check.md": "5d79e26e3b51d9ae", "gsd-core/references/worktree-path-safety.md": "fa79fcdff2aaa5f0", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "50062753f2f0c24c", + "gsd-core/templates/DEBUG.md": "ba1d879f05b7ee2e", "gsd-core/templates/README.md": "89560317a9097a05", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index 21081a03d..03eb4c07e 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": "621c4c28af4f7b01", - "agents/gsd-debugger.md": "c9fcb57e5f6e6ee7", + "agents/gsd-debug-session-manager.md": "59191275e650f655", + "agents/gsd-debugger.md": "a661848ce5505080", "agents/gsd-doc-classifier.md": "6256bbc0b887f60f", "agents/gsd-doc-synthesizer.md": "212aaf89a34b51d7", "agents/gsd-doc-verifier.md": "8016f792d0766b77", @@ -132,7 +132,8 @@ "gsd-core/references/context-budget.md": "533eae480bfc4bb8", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "b2732420bdbcadcd", - "gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88", + "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "391e732abf32786a", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -224,7 +225,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "88e8753b4296b586", + "gsd-core/templates/DEBUG.md": "0df505199f1c248b", "gsd-core/templates/README.md": "73d3c9689b6efbc9", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 6ddc71261..5e64d9911 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": "69b3083e7e29c435", + "agents/subagents/gsd-debug-session-manager.md": "c71b4debebaa978e", "agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7", - "agents/subagents/gsd-debugger.md": "a2f38433646baffc", + "agents/subagents/gsd-debugger.md": "176aa5bfdde031e5", "agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43", "agents/subagents/gsd-doc-classifier.md": "632dc6c61bafa63e", "agents/subagents/gsd-doc-classifier.yaml": "a4e9cf7025b57503", @@ -125,7 +125,8 @@ "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", @@ -217,7 +218,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", - "gsd-core/templates/DEBUG.md": "81b60f25e9e7c9a3", + "gsd-core/templates/DEBUG.md": "f85918715fef9743", "gsd-core/templates/README.md": "93d3426fc64e2c12", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index b93a4abf8..b8636a87b 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": "cb64aa404849be60", - "agents/gsd-debugger.md": "1653f7447e3fa8a8", + "agents/gsd-debug-session-manager.md": "b5a39dcf10210cbb", + "agents/gsd-debugger.md": "739bfe544f55f191", "agents/gsd-doc-classifier.md": "fb776cfbb7e991b0", "agents/gsd-doc-synthesizer.md": "2389f388d291c2eb", "agents/gsd-doc-verifier.md": "65bbc2ae6b9ace29", @@ -132,7 +132,8 @@ "gsd-core/references/context-budget.md": "355826e667f9ccd1", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "b2732420bdbcadcd", - "gsd-core/references/debugger-philosophy.md": "1cb61d4565081c88", + "gsd-core/references/debugger-philosophy.md": "459a8ac647c4ce9c", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "391e732abf32786a", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -224,7 +225,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "88e8753b4296b586", + "gsd-core/templates/DEBUG.md": "0df505199f1c248b", "gsd-core/templates/README.md": "73d3c9689b6efbc9", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index 867f181a3..6f10a0992 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -28,7 +28,8 @@ "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", @@ -120,7 +121,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", - "gsd-core/templates/DEBUG.md": "81b60f25e9e7c9a3", + "gsd-core/templates/DEBUG.md": "f85918715fef9743", "gsd-core/templates/README.md": "93d3426fc64e2c12", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 0988c71cf..30d78e947 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": "e4db798b5a536a2c", - "agents/gsd-debugger.md": "a93dd835d97836c7", + "agents/gsd-debug-session-manager.md": "afe383b6483d4097", + "agents/gsd-debugger.md": "3500269dc9e4fd88", "agents/gsd-doc-classifier.md": "bdf3d54082424e76", "agents/gsd-doc-synthesizer.md": "96c383b74a60fbbe", "agents/gsd-doc-verifier.md": "da9ab6f3ec27778a", @@ -61,7 +61,8 @@ "gsd-core/references/context-budget.md": "a1351dd40ef8691f", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "ab6a1cce253944f4", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "061b719c754a12d3", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -153,7 +154,7 @@ "gsd-core/references/worktree-branch-check.md": "3fc21ae9462c35c8", "gsd-core/references/worktree-path-safety.md": "b4111595eabec186", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "50062753f2f0c24c", + "gsd-core/templates/DEBUG.md": "ba1d879f05b7ee2e", "gsd-core/templates/README.md": "f4825d4fa594f2b1", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 16b8eb1b3..f810e1a8e 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": "5e64d23321942c1c", - "agents/gsd-debugger.md": "1839444836892ffe", + "agents/gsd-debug-session-manager.md": "ada53877ba56d894", + "agents/gsd-debugger.md": "768876bab90cb1e1", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "e51e50892963ccc7", @@ -61,7 +61,8 @@ "gsd-core/references/context-budget.md": "b7e9640063775c98", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "134f83886c343733", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "23d7a3bb15bc8b7c", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -153,7 +154,7 @@ "gsd-core/references/worktree-branch-check.md": "8de8075d76ff71cd", "gsd-core/references/worktree-path-safety.md": "34689482908229bc", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "50062753f2f0c24c", + "gsd-core/templates/DEBUG.md": "ba1d879f05b7ee2e", "gsd-core/templates/README.md": "332f65072c3f03ae", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index de7340f16..0703a96e8 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": "7ea9975264a99b2c", - "agents/gsd-debugger.md": "520dbc9408761e2e", + "agents/gsd-debug-session-manager.md": "b7d57cd8ed9103d3", + "agents/gsd-debugger.md": "eff6469d58661c73", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "ede2f297b73b5a86", @@ -61,7 +61,8 @@ "gsd-core/references/context-budget.md": "ff843cd6139c8564", "gsd-core/references/continuation-format.md": "580287399ad3ba68", "gsd-core/references/debugger-fix-acceptance.md": "ddd00cbd78dd3fdf", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "071651eaf7414a4c", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", @@ -153,7 +154,7 @@ "gsd-core/references/worktree-branch-check.md": "f6018dddf15bc1cb", "gsd-core/references/worktree-path-safety.md": "0e8a26b9b3424974", "gsd-core/templates/AI-SPEC.md": "24df5fe5ba34e367", - "gsd-core/templates/DEBUG.md": "50062753f2f0c24c", + "gsd-core/templates/DEBUG.md": "ba1d879f05b7ee2e", "gsd-core/templates/README.md": "ee35799bf08677f3", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 3ef40c8db..4cfbded69 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": "716e31255a94e0ce", - "agents/gsd-debugger.md": "376cb361acbafafd", + "agents/gsd-debug-session-manager.md": "baf23c3834eb36ba", + "agents/gsd-debugger.md": "113f31a0c3c1d075", "agents/gsd-doc-classifier.md": "146acf4d176134b5", "agents/gsd-doc-synthesizer.md": "b1f5e2eb28fa3659", "agents/gsd-doc-verifier.md": "7ed4d9611f678a95", @@ -132,7 +132,8 @@ "gsd-core/references/context-budget.md": "f1ce57bf418824af", "gsd-core/references/continuation-format.md": "ce73e57d053ab8a7", "gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436", - "gsd-core/references/debugger-philosophy.md": "0466f95a3d6bfcd3", + "gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33", + "gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250", "gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", @@ -224,7 +225,7 @@ "gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93", "gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8", "gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b", - "gsd-core/templates/DEBUG.md": "81b60f25e9e7c9a3", + "gsd-core/templates/DEBUG.md": "f85918715fef9743", "gsd-core/templates/README.md": "93d3426fc64e2c12", "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", diff --git a/tests/fixtures/install-tree/antigravity.json b/tests/fixtures/install-tree/antigravity.json index d10828ff7..b8e253801 100644 --- a/tests/fixtures/install-tree/antigravity.json +++ b/tests/fixtures/install-tree/antigravity.json @@ -62,6 +62,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/augment.json b/tests/fixtures/install-tree/augment.json index 8f3c7a9e7..a0904e84d 100644 --- a/tests/fixtures/install-tree/augment.json +++ b/tests/fixtures/install-tree/augment.json @@ -133,6 +133,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/claude-local.json b/tests/fixtures/install-tree/claude-local.json index 531a4eb0c..d42ae203f 100644 --- a/tests/fixtures/install-tree/claude-local.json +++ b/tests/fixtures/install-tree/claude-local.json @@ -132,6 +132,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/claude.json b/tests/fixtures/install-tree/claude.json index 3f7e4746e..3f2d4921a 100644 --- a/tests/fixtures/install-tree/claude.json +++ b/tests/fixtures/install-tree/claude.json @@ -61,6 +61,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/cline.json b/tests/fixtures/install-tree/cline.json index 018cdcf26..aa7fd02eb 100644 --- a/tests/fixtures/install-tree/cline.json +++ b/tests/fixtures/install-tree/cline.json @@ -65,6 +65,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/codebuddy.json b/tests/fixtures/install-tree/codebuddy.json index 14e8f1a87..9b9fb9a8f 100644 --- a/tests/fixtures/install-tree/codebuddy.json +++ b/tests/fixtures/install-tree/codebuddy.json @@ -133,6 +133,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/codex.json b/tests/fixtures/install-tree/codex.json index 99e756335..9dfd28e75 100644 --- a/tests/fixtures/install-tree/codex.json +++ b/tests/fixtures/install-tree/codex.json @@ -168,6 +168,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/copilot.json b/tests/fixtures/install-tree/copilot.json index 6fcf66339..b25882399 100644 --- a/tests/fixtures/install-tree/copilot.json +++ b/tests/fixtures/install-tree/copilot.json @@ -63,6 +63,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/cursor.json b/tests/fixtures/install-tree/cursor.json index c11bd418e..fbebea281 100644 --- a/tests/fixtures/install-tree/cursor.json +++ b/tests/fixtures/install-tree/cursor.json @@ -133,6 +133,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/hermes.json b/tests/fixtures/install-tree/hermes.json index 5b3d192e6..e1bab1222 100644 --- a/tests/fixtures/install-tree/hermes.json +++ b/tests/fixtures/install-tree/hermes.json @@ -62,6 +62,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/kilo.json b/tests/fixtures/install-tree/kilo.json index 3d19558cd..774ee36bf 100644 --- a/tests/fixtures/install-tree/kilo.json +++ b/tests/fixtures/install-tree/kilo.json @@ -133,6 +133,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/kimi.json b/tests/fixtures/install-tree/kimi.json index 410bd83eb..beb675b4a 100644 --- a/tests/fixtures/install-tree/kimi.json +++ b/tests/fixtures/install-tree/kimi.json @@ -126,6 +126,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/opencode.json b/tests/fixtures/install-tree/opencode.json index bbd7223ea..124bc4f1a 100644 --- a/tests/fixtures/install-tree/opencode.json +++ b/tests/fixtures/install-tree/opencode.json @@ -133,6 +133,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/pi.json b/tests/fixtures/install-tree/pi.json index a41a00c29..513793944 100644 --- a/tests/fixtures/install-tree/pi.json +++ b/tests/fixtures/install-tree/pi.json @@ -29,6 +29,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/qwen.json b/tests/fixtures/install-tree/qwen.json index eb66d94f8..7e57beaa1 100644 --- a/tests/fixtures/install-tree/qwen.json +++ b/tests/fixtures/install-tree/qwen.json @@ -62,6 +62,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/trae.json b/tests/fixtures/install-tree/trae.json index d4762326e..3a86d8e37 100644 --- a/tests/fixtures/install-tree/trae.json +++ b/tests/fixtures/install-tree/trae.json @@ -62,6 +62,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/windsurf.json b/tests/fixtures/install-tree/windsurf.json index 7c4c36870..4dc29f21e 100644 --- a/tests/fixtures/install-tree/windsurf.json +++ b/tests/fixtures/install-tree/windsurf.json @@ -62,6 +62,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", diff --git a/tests/fixtures/install-tree/zcode.json b/tests/fixtures/install-tree/zcode.json index ce7ab9262..d2db6a217 100644 --- a/tests/fixtures/install-tree/zcode.json +++ b/tests/fixtures/install-tree/zcode.json @@ -133,6 +133,7 @@ "gsd-core/references/continuation-format.md", "gsd-core/references/debugger-fix-acceptance.md", "gsd-core/references/debugger-philosophy.md", + "gsd-core/references/debugger-rca-branching.md", "gsd-core/references/debugger-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md",