From 56a5c6404c4cc7554d8fd898f668e06531cd557b Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Sat, 18 Jul 2026 07:55:28 -0400 Subject: [PATCH] feat(#1959): add spectrum-based fault localization (Ochiai) pre-filter to gsd-debugger (#2403) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test(#1959): add failing-first SBFL contract + Ochiai correctness tests Epic #1957 Phase 1B. Source-text-is-the-product contract tests (Ochiai formula documented, Tarantula fallback, top-N seeding, no-coverage skip logged, ranking->Evidence, Bohrbug gating) plus a behavioral Ochiai formula-correctness section: bound [0,1], max-score invariant, a known-fault fixture proving the fault ranks #1 (criterion 2), clean degradation on zero failing tests, and two fast-check properties. Failing-first: reference file and agent routing do not yet exist. * feat(#1959): add spectrum-based fault localization (Ochiai) pre-filter to gsd-debugger Epic #1957 Phase 1B. When a runnable test suite with per-test coverage exists (>=1 failing AND >=1 passing test), the debugger computes an Ochiai suspiciousness ranking over the coverage spectrum and seeds the top-N suspicious locations into Evidence as first-class hypothesis candidates, narrowing the search space deterministically before LLM reasoning. Tarantula documented as fallback. Degrades cleanly (logged, never silent) when there is no test suite, no failing tests, or no per-test coverage, and is explicitly not trusted on flaky/Heisenbug spectra (pairs with Phase 2B bug-taxonomy). Full rules extracted to gsd-core/references/debugger-sbfl.md (slim Phase 1.25 routing kept in the agent to respect the size cap). No new coverage framework — reuses the project's existing test/coverage runner. INVENTORY + manifest + agent-size baseline + install-parity goldens + AGENTS.md updated. * test(#1959): bound property generators to valid coverage counts The [0,1] property generated failedExec independently of totalFailed, but Ochiai's score is only bounded by 1 under the coverage invariant failedExec <= totalFailed (a failing test that executed s is one of the totalFailed failing tests). Out-of-domain inputs (failedExec=100, totalFailed=5) make the formula correctly return >1. Bound failedExec by totalFailed via fc.chain so the property tests the real domain. Also cleaned up the ranking property (removed dead code). * fix(#1959): address orthogonal review (monotonicity property, degradation row, coverage bounding) - Replace vacuous ranking property (true-by-sort-construction) with a non-trivial monotonicity property: holding totalFailed + passedExec fixed, ochiai is non-decreasing in failedExec. An inverted formula would fail it. - Add the missing 'no passing tests' degradation row (preconditions require >=1 passing test; Tarantula would divide by totalPassed=0). - Bound the coverage subprocess (CLAUDE.md gauntlet): cap the coverage run, degrade-to-skip on timeout, never hang the debug session. - Reword 'discard the ranking' -> 'mark the Evidence entry as revoked (do not delete)' per Kernighan auditability. * test(#1959): bound monotonicity-property generator to valid coverage (failedExecA <= totalFailed) * chore(#1959): backfill changeset pr number (PR #2403) --- .changeset/1959-sbfl-fault-localization.md | 5 + agents/gsd-debugger.md | 7 + docs/AGENTS.md | 1 + docs/INVENTORY-MANIFEST.json | 1 + docs/INVENTORY.md | 1 + gsd-core/references/debugger-sbfl.md | 110 ++++++++++ tests/agent-size-baseline.json | 2 +- tests/debugger-sbfl.test.cjs | 198 ++++++++++++++++++ .../golden-install-parity/antigravity.json | 3 +- .../golden-install-parity/augment.json | 3 +- .../golden-install-parity/claude-local.json | 3 +- .../golden-install-parity/claude.json | 3 +- .../fixtures/golden-install-parity/cline.json | 3 +- .../golden-install-parity/codebuddy.json | 3 +- .../fixtures/golden-install-parity/codex.json | 5 +- .../golden-install-parity/copilot.json | 3 +- .../golden-install-parity/cursor.json | 3 +- .../golden-install-parity/hermes.json | 3 +- .../fixtures/golden-install-parity/kilo.json | 3 +- .../fixtures/golden-install-parity/kimi.json | 3 +- .../golden-install-parity/opencode.json | 3 +- tests/fixtures/golden-install-parity/pi.json | 1 + .../fixtures/golden-install-parity/qwen.json | 3 +- .../fixtures/golden-install-parity/trae.json | 3 +- .../golden-install-parity/windsurf.json | 3 +- .../fixtures/golden-install-parity/zcode.json | 3 +- 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 + 44 files changed, 378 insertions(+), 19 deletions(-) create mode 100644 .changeset/1959-sbfl-fault-localization.md create mode 100644 gsd-core/references/debugger-sbfl.md create mode 100644 tests/debugger-sbfl.test.cjs diff --git a/.changeset/1959-sbfl-fault-localization.md b/.changeset/1959-sbfl-fault-localization.md new file mode 100644 index 000000000..e01ce733c --- /dev/null +++ b/.changeset/1959-sbfl-fault-localization.md @@ -0,0 +1,5 @@ +--- +type: Added +pr: 2403 +--- +**`gsd-debugger` now ranks suspect code by Ochiai suspiciousness before forming hypotheses** — when a runnable test suite with per-test coverage exists (≥1 failing and ≥1 passing test), the debugger computes a spectrum-based fault-localization (Ochiai) ranking over the coverage and seeds the top-N suspicious locations into the Evidence section as first-class hypothesis candidates, narrowing the search space deterministically before any LLM reasoning. Tarantula is documented as a fallback formula. The step degrades cleanly (logged, never a silent pass) when there is no test suite, no failing tests, or no per-test coverage, and it is explicitly not trusted on flaky/Heisenbug spectra (pairs with the Phase 2B bug-taxonomy routing). Full rules live in `gsd-core/references/debugger-sbfl.md`. (#1959) diff --git a/agents/gsd-debugger.md b/agents/gsd-debugger.md index d4a8884ec..cbd11ac11 100644 --- a/agents/gsd-debugger.md +++ b/agents/gsd-debugger.md @@ -983,6 +983,13 @@ At investigation decision points, apply structured reasoning: - Run app/tests to observe behavior - APPEND to Evidence after each finding +**Phase 1.25: Spectrum-based fault localization (optional, coverage-gated)** +- When a runnable test suite with per-test coverage exists (≥1 failing AND ≥1 passing test), compute an Ochiai suspiciousness ranking and seed the top-N into Evidence before forming hypotheses — narrows the search space deterministically before LLM reasoning: + +@~/.claude/gsd-core/references/debugger-sbfl.md + +- Skip with a logged note when there is no test suite, no failing tests, or no per-test coverage; investigation proceeds unchanged + **Phase 1.5: Check common bug patterns** - Read @~/.claude/gsd-core/references/common-bug-patterns.md - Match symptoms to pattern categories using the Symptom-to-Category Quick Map diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 5b4d268f4..8751711c1 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -401,6 +401,7 @@ runs its default whole-repo scan. - State persists across context resets - 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 - 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 d0123c9f9..54e8df122 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-sbfl.md", "decimal-phase-calculation.md", "doc-conflict-engine.md", "domain-probes.md", diff --git a/docs/INVENTORY.md b/docs/INVENTORY.md index 30ee818b7..0d6da296a 100644 --- a/docs/INVENTORY.md +++ b/docs/INVENTORY.md @@ -295,6 +295,7 @@ Full roster at `gsd-core/references/*.md`. References are shared knowledge docum | `common-bug-patterns.md` | Common bug patterns for code review and verification. | | `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`. | | `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-sbfl.md b/gsd-core/references/debugger-sbfl.md new file mode 100644 index 000000000..ddd542f9d --- /dev/null +++ b/gsd-core/references/debugger-sbfl.md @@ -0,0 +1,110 @@ +# Spectrum-Based Fault Localization (SBFL) Pre-filter + +Loaded by `gsd-debugger` via `@-include`. A deterministic ranked "where to look +first" list derived from existing test pass/fail coverage, computed before LLM +reasoning over an unranked search space. + +## Why this exists + +`investigation_loop` Phase 1 searches the codebase and reads files to seed +hypotheses via (expensive, non-deterministic) LLM reasoning over an unranked +space. When a runnable test suite with per-test coverage exists, there is a +cheap, deterministic signal being left on the table: which code is +disproportionately executed by **failing** vs **passing** tests. SBFL turns +that coverage spectrum into a suspiciousness ranking. The agent currently has no +fault-localization step at all. + +## When to run it (Phase 1.25 — after initial evidence, before hypothesis formation) + +Run only when ALL hold: +- A runnable test suite exists for the failing area. +- At least one failing test AND at least one passing test exist (a spectrum + requires both). +- Per-test coverage is available (which tests executed which code + element — function, line, or branch). + +If any precondition fails, **skip** this step with a logged note (see +Degradation) and proceed with Phase 1's normal evidence gathering unchanged. + +## The Ochiai formula + +For each code element `s` executed by the test suite: + +``` +ochiai(s) = failed(s) / sqrt(totalFailed × (failed(s) + passed(s))) +``` + +where: +- `failed(s)` = number of **failing** tests that executed `s` +- `passed(s)` = number of **passing** tests that executed `s` +- `totalFailed` = total number of failing tests in the suite + +The score is in `[0, 1]`. An element executed by every failing test and no +passing test scores `1.0` (maximum suspiciousness). An element touched only by +passing tests scores `0`. Ochiai is empirically stronger than Tarantula across +the SBFL literature; **Tarantula** is the documented fallback formula +(`tarantula(s) = (failed(s)/totalFailed) / ((failed(s)/totalFailed) + (passed(s)/totalPassed))`) +if a comparison or secondary signal is wanted. + +## Output — top-N shortlist seeded into the hypothesis space + +Rank all executed elements by descending Ochiai score and take the **top-N** +(N is judgment — 5–10 is typical; bounded by what narrows the search without +flooding it). Append each top-N element to the debug file's **Evidence** +section as a first-class hypothesis candidate: + +``` +- timestamp: + checked: SBFL Ochiai ranking (Phase 1.25) + found: top-N suspicious locations — + 1. path/to/file.cts:LINE (score 0.89) — + 2. path/to/other.cts:LINE (score 0.77) — + ... + implication: investigate these before forming broader hypotheses +``` + +This narrows the search space by orders of magnitude before any LLM tokens are +spent forming hypotheses. Each top-N entry becomes a candidate for Phase 2 +hypothesis formation, ranked ahead of un-evidenced guesses. + +## Degradation (Gall's Law — optional step, degrades onto the working agent) + +This step is **purely additive**. Every miss degrades to today's behavior; a +skipped step is logged, never a silent pass (Kernighan — the debugger stays +auditable). + +| Condition | Behavior | +|---|---| +| No test suite for the failing area | **skip** with a logged note in Evidence ("SBFL skipped: no test suite"); Phase 1 proceeds unchanged | +| Test suite but no failing tests | **skip** with a logged note ("SBFL skipped: no failing tests — no spectrum"); Phase 1 proceeds unchanged | +| Test suite but no passing tests | **skip** with a logged note ("SBFL skipped: no spectrum — no passing tests"); Phase 1 proceeds unchanged (Tarantula would divide by `totalPassed=0`; do not run it) | +| Test suite but no per-test coverage | **skip** with a logged note ("SBFL skipped: no per-test coverage available"); Phase 1 proceeds unchanged | +| Coverage exists but is coarse (file-level, not line/function) | run anyway, rank at the available granularity, and note the granularity in Evidence | + +## Bug-class gating (pairs with Phase 2B bug-taxonomy routing) + +SBFL is the go-to pre-filter for **deterministic failures (Bohrbugs)** — bugs +that reproduce reliably. It is explicitly **not trusted** on +**Heisenbug/Mandelbug** spectra (timing, races, environment-dependent failures): +a flaky suite pollutes the spectrum (a "failing" test that sometimes passes +poisons `failed(s)`), so the ranking becomes noise. When the failure is +non-deterministic (Phase 2B classifies it), **skip SBFL** and route to +record-replay or stability-stress instead. If SBFL has already run before +classification and the class later resolves to Heisenbug/Mandelbug, mark the +prior SBFL Evidence entry as revoked (do not delete it — Kernighan +auditability) and note why in Evidence. + +## Scope boundary (Zawinski's Law) + +This is a deterministic pre-filter that reuses the project's existing +test/coverage runner — it adds **no new coverage framework** and no new +subsystem. It narrows the LLM's search space; it does not replace hypothesis +formation, fix-and-verify, or the knowledge base. Coverage acquisition is the +agent's adaptive job (use whatever coverage the project produces); the formula +above is the canonical ranking. + +**Bound the coverage run** (CLAUDE.md gauntlet — unbounded subprocess): a +coverage run is often 2–3× slower than a plain test run due to instrumentation, +so cap it (60s for npm-tier suites; scale with suite size) and **degrade to +skip with a logged note on timeout** — never let coverage acquisition hang the +debug session. diff --git a/tests/agent-size-baseline.json b/tests/agent-size-baseline.json index f532f9a11..2d0c7ffe1 100644 --- a/tests/agent-size-baseline.json +++ b/tests/agent-size-baseline.json @@ -6,7 +6,7 @@ "gsd-code-reviewer.md": 16870, "gsd-codebase-mapper.md": 21485, "gsd-debug-session-manager.md": 16850, - "gsd-debugger.md": 52209, + "gsd-debugger.md": 52734, "gsd-doc-classifier.md": 11717, "gsd-doc-synthesizer.md": 13154, "gsd-doc-verifier.md": 12403, diff --git a/tests/debugger-sbfl.test.cjs b/tests/debugger-sbfl.test.cjs new file mode 100644 index 000000000..a22c5cb77 --- /dev/null +++ b/tests/debugger-sbfl.test.cjs @@ -0,0 +1,198 @@ +// allow-test-rule: source-text-is-the-product (see #1959) +// Agent .md + reference .md files — their text IS what the runtime loads. +// Testing text content tests the deployed SBFL contract. The pure-JS Ochiai +// tests below validate the formula the reference documents (criterion 2: +// known-faulty location in top-N). Per CONTRIBUTING.md exception matrix. +// Covers epic #1957 Phase 1B (#1959). +'use strict'; + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +let fc; +try { + fc = require('fast-check'); +} catch { + fc = null; +} + +const ROOT = process.cwd(); +const AGENT = path.join(ROOT, 'agents/gsd-debugger.md'); +const REFERENCE = path.join(ROOT, 'gsd-core/references/debugger-sbfl.md'); + +// In-test canonical Ochiai implementation — validates the formula the reference +// documents. If the reference's formula drifts from real Ochiai, the contract +// tests (Ochiai named + formula shape) flag the drift, and these correctness +// tests pin what "correct Ochiai" means. +function ochiai(failedExec, passedExec, totalFailed) { + if (totalFailed <= 0) return 0; + const denom = Math.sqrt(totalFailed * (failedExec + passedExec)); + return denom === 0 ? 0 : failedExec / denom; +} + +function rankByOchiai(elements, totalFailed) { + return elements + .map((e) => ({ element: e.element, score: ochiai(e.failedExec, e.passedExec, totalFailed) })) + .sort((a, b) => b.score - a.score); +} + +describe('spectrum-based fault localization (#1959, epic #1957 Phase 1B)', () => { + describe('reference extract exists and is wired into the agent', () => { + test('gsd-core/references/debugger-sbfl.md exists', () => { + assert.ok(fs.existsSync(REFERENCE), 'debugger-sbfl.md reference must exist'); + }); + + test('gsd-debugger.md @-includes the SBFL reference', () => { + const content = fs.readFileSync(AGENT, 'utf8'); + assert.ok( + content.includes('@~/.claude/gsd-core/references/debugger-sbfl.md'), + 'gsd-debugger.md must @-include the SBFL reference' + ); + }); + }); + + describe('Ochiai contract documented (criterion 1)', () => { + test('reference names Ochiai and documents the formula', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/ochiai/i.test(content), 'reference must name the Ochiai formula'); + assert.ok(/sqrt/i.test(content), 'reference must document the sqrt-based formula'); + assert.ok(/failed/i.test(content) && /passed/i.test(content), + 'reference must reference failed(s) and passed(s) terms'); + }); + + test('reference documents Tarantula as a fallback', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/tarantula/i.test(content), 'reference must mention Tarantula as a documented fallback'); + }); + + test('reference documents top-N seeding into the hypothesis space', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/top-?n/i.test(content), 'reference must document top-N shortlist seeding'); + }); + }); + + describe('graceful degradation (criterion 3)', () => { + test('reference documents skip when no coverage / no test suite', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/no coverage|no test suite|coverage (?:is )?(?:absent|unavailable)/i.test(content), + 'must document the no-coverage skip path'); + assert.ok(/skip.*log|log.*skip|skip.*note|note.*skip/i.test(content), + 'skip must be logged (not a silent pass) — Kernighan auditability'); + }); + }); + + describe('ranking written to the debug file as seed evidence (criterion 4)', () => { + test('reference documents recording the ranking under Evidence', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/evidence/i.test(content), + 'reference must document that the ranking lands in the Evidence section of the debug file'); + }); + }); + + describe('pairs with Phase 2B bug-taxonomy routing', () => { + test('reference notes SBFL is gated for deterministic (Bohrbug) failures', () => { + const content = fs.readFileSync(REFERENCE, 'utf8'); + assert.ok(/bohrbug|deterministic|flaky|heisenbug|mandelbug/i.test(content), + 'reference must note SBFL suits deterministic bugs and is not trusted on flaky spectra (pairs with Phase 2B)'); + }); + }); + + describe('Ochiai formula correctness — behavioral (criterion 2: known-faulty location in top-N)', () => { + test('score is always in [0, 1] for any non-negative inputs (totalFailed > 0)', () => { + const fixture = [ + { failedExec: 0, passedExec: 10, totalFailed: 5 }, + { failedExec: 5, passedExec: 0, totalFailed: 5 }, + { failedExec: 3, passedExec: 7, totalFailed: 5 }, + { failedExec: 5, passedExec: 100, totalFailed: 5 }, + ]; + for (const f of fixture) { + const s = ochiai(f.failedExec, f.passedExec, f.totalFailed); + assert.ok(s >= 0 && s <= 1, `score ${s} out of [0,1] for failedExec=${f.failedExec} passedExec=${f.passedExec} totalFailed=${f.totalFailed}`); + } + }); + + test('an element hit by all failing tests and no passing tests scores the maximum (1.0)', () => { + assert.strictEqual(ochiai(5, 0, 5), 1); + assert.strictEqual(ochiai(1, 0, 1), 1); + }); + + test('a known-faulty element ranks in the top-N of a representative fixture', () => { + // Representative fixture: 5 tests (3 failing, 2 passing), 4 code elements. + // Element "bug" is executed by all 3 failing tests and 0 passing → Ochiai 1.0 → rank #1. + const totalFailed = 3; + const elements = [ + { element: 'unrelated-a', failedExec: 1, passedExec: 2 }, + { element: 'bug', failedExec: 3, passedExec: 0 }, // the known fault + { element: 'unrelated-b', failedExec: 2, passedExec: 2 }, + { element: 'unrelated-c', failedExec: 0, passedExec: 2 }, + ]; + const ranked = rankByOchiai(elements, totalFailed); + const topN = ranked.slice(0, Math.min(3, ranked.length)); + assert.ok(topN.length > 0, 'ranking must be non-empty'); + assert.strictEqual(ranked[0].element, 'bug', 'the known-faulty element must rank #1'); + assert.ok(topN.some((r) => r.element === 'bug'), + 'the known-faulty element must appear in the top-N (criterion 2)'); + // ranking is non-increasing + for (let i = 1; i < ranked.length; i++) { + assert.ok(ranked[i - 1].score >= ranked[i].score, 'ranking must be non-increasing'); + } + }); + + test('degrades cleanly when there are no failing tests (totalFailed = 0 → all scores 0)', () => { + const elements = [ + { element: 'a', failedExec: 0, passedExec: 5 }, + { element: 'b', failedExec: 0, passedExec: 3 }, + ]; + const ranked = rankByOchiai(elements, 0); + for (const r of ranked) { + assert.strictEqual(r.score, 0, 'no failing tests → every suspiciousness score is 0 (clean degradation)'); + } + }); + + if (fc) { + test('property: ochiai ∈ [0, 1] for valid coverage counts (failedExec ≤ totalFailed)', () => { + // Ochiai is defined over coverage counts where failedExec is bounded by + // totalFailed (a failing test that executed s is one of the totalFailed + // failing tests) and passedExec is bounded by totalPassed. Generate + // in-domain inputs via chain. + const validCoverage = fc.integer({ min: 1, max: 30 }).chain((totalFailed) => + fc.record({ + totalFailed: fc.constant(totalFailed), + failedExec: fc.integer({ min: 0, max: totalFailed }), + passedExec: fc.nat(30), + }) + ); + fc.assert( + fc.property(validCoverage, ({ totalFailed, failedExec, passedExec }) => { + const s = ochiai(failedExec, passedExec, totalFailed); + return s >= 0 && s <= 1 + 1e-9; + }), + { numRuns: 200 } + ); + }); + + test('property: ochiai is non-decreasing in failedExec (holding totalFailed + passedExec fixed)', () => { + // Non-trivial: a correct Ochiai must not penalize an element for being + // hit by MORE failing tests. An inverted numerator/denominator would fail this. + // failedExecA is bounded by totalFailed (coverage invariant) via chain. + const validStart = fc.integer({ min: 1, max: 30 }).chain((totalFailed) => + fc.record({ + totalFailed: fc.constant(totalFailed), + passedExec: fc.nat(30), + failedExecA: fc.integer({ min: 0, max: totalFailed }), + }) + ); + fc.assert( + fc.property(validStart, ({ totalFailed, passedExec, failedExecA }) => { + const failedExecB = Math.min(totalFailed, failedExecA + 1); + if (failedExecB === failedExecA) return true; // A already at totalFailed + return ochiai(failedExecB, passedExec, totalFailed) >= ochiai(failedExecA, passedExec, totalFailed) - 1e-9; + }), + { numRuns: 300 } + ); + }); + } + }); +}); diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 9f009f92d..fc6d54c8a 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "a700d295bbf110a9", "agents/gsd-codebase-mapper.md": "afdae82284cb21b4", "agents/gsd-debug-session-manager.md": "95441545abeab3f5", - "agents/gsd-debugger.md": "c4420686f490d948", + "agents/gsd-debugger.md": "a41ea4bc59ea744f", "agents/gsd-doc-classifier.md": "fca19595590391df", "agents/gsd-doc-synthesizer.md": "0e5184bbcf0dca02", "agents/gsd-doc-verifier.md": "888c6ac870cb91a6", @@ -62,6 +62,7 @@ "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-sbfl.md": "de9cd1bd0e1485c6", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index a48446310..acf08f35c 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "bc8a6f2e1f787ff5", "agents/gsd-codebase-mapper.md": "85ea778ad9cf7e66", "agents/gsd-debug-session-manager.md": "2f775ae4ab8855a0", - "agents/gsd-debugger.md": "a21c4e8d29b0eaee", + "agents/gsd-debugger.md": "a0ec84b507f2e036", "agents/gsd-doc-classifier.md": "262a94b947a4e2aa", "agents/gsd-doc-synthesizer.md": "01f90ea9b0d05d7d", "agents/gsd-doc-verifier.md": "b3433e0db51e1c60", @@ -133,6 +133,7 @@ "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-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", "gsd-core/references/domain-probes.md": "62d23ed1992c48a9", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index 68536223f..060db57c6 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -7,7 +7,7 @@ "agents/gsd-code-reviewer.md": "e2c45baa8c0b5f6d", "agents/gsd-codebase-mapper.md": "f96958e5f85b93fb", "agents/gsd-debug-session-manager.md": "7e08652ad1c48efb", - "agents/gsd-debugger.md": "a3643fb51b054988", + "agents/gsd-debugger.md": "3c0526872ae337d7", "agents/gsd-doc-classifier.md": "a76778bdde1c7f72", "agents/gsd-doc-synthesizer.md": "8b0b6fc187c9d353", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", @@ -132,6 +132,7 @@ "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-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 29a38707e..f460f1f48 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -7,7 +7,7 @@ "agents/gsd-code-reviewer.md": "d626a828e8de3648", "agents/gsd-codebase-mapper.md": "8c2e9f2ce3aedf78", "agents/gsd-debug-session-manager.md": "a813e6b226b2be58", - "agents/gsd-debugger.md": "dd4baf1337cebe09", + "agents/gsd-debugger.md": "fc975cf160dfee7a", "agents/gsd-doc-classifier.md": "a636ae9594b25770", "agents/gsd-doc-synthesizer.md": "dfb95eedfb3789bf", "agents/gsd-doc-verifier.md": "4232dcf9076e3566", @@ -61,6 +61,7 @@ "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-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index 5b66305c2..c38f677e0 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -11,7 +11,7 @@ "agents/gsd-code-reviewer.md": "e5ec12d4d409e800", "agents/gsd-codebase-mapper.md": "e5b7941bdda53c91", "agents/gsd-debug-session-manager.md": "dd70329c06ec5b79", - "agents/gsd-debugger.md": "8709cc2721688ea9", + "agents/gsd-debugger.md": "706cc2c87a8da251", "agents/gsd-doc-classifier.md": "5011d7358d2b2848", "agents/gsd-doc-synthesizer.md": "e59cdd669876582d", "agents/gsd-doc-verifier.md": "b60290c9d9f6d8d2", @@ -65,6 +65,7 @@ "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-sbfl.md": "6e4975ee50973c23", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", "gsd-core/references/domain-probes.md": "62d23ed1992c48a9", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index d0b80a49e..a7d023273 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "5342fcc0da974696", "agents/gsd-codebase-mapper.md": "b995bf01af0193d2", "agents/gsd-debug-session-manager.md": "6dc05c3ac8a3f2cc", - "agents/gsd-debugger.md": "5549e84b9b576d9b", + "agents/gsd-debugger.md": "54ab502a6b751680", "agents/gsd-doc-classifier.md": "c2bf59af9467810b", "agents/gsd-doc-synthesizer.md": "b2a179bf3c9bd636", "agents/gsd-doc-verifier.md": "e74d930905a782ea", @@ -133,6 +133,7 @@ "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-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", "gsd-core/references/domain-probes.md": "62d23ed1992c48a9", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index cd77bb4bf..7910f70c2 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -86,8 +86,8 @@ "agents/gsd-codebase-mapper.toml": "a4609f3ac66c2081", "agents/gsd-debug-session-manager.md": "5c7af4adccaa9597", "agents/gsd-debug-session-manager.toml": "e3b962d5478f2b46", - "agents/gsd-debugger.md": "aec67e757771e460", - "agents/gsd-debugger.toml": "99a17d121197cfa5", + "agents/gsd-debugger.md": "fefd9d1a59661bff", + "agents/gsd-debugger.toml": "83dbb27716668d91", "agents/gsd-doc-classifier.md": "2745bc04d7b93666", "agents/gsd-doc-classifier.toml": "3fe5ec83f62b586e", "agents/gsd-doc-synthesizer.md": "4f545f2e916458ad", @@ -168,6 +168,7 @@ "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-sbfl.md": "391e732abf32786a", "gsd-core/references/decimal-phase-calculation.md": "ee363ec47be68922", "gsd-core/references/doc-conflict-engine.md": "257aba80c93854d4", "gsd-core/references/domain-probes.md": "4901deac8eac0f49", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index 93063cfee..99f5266d2 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -8,7 +8,7 @@ "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": "92ba32ed5042d76d", + "agents/gsd-debugger.agent.md": "358b4c70a38b4341", "agents/gsd-doc-classifier.agent.md": "aea81c0ba00e06cf", "agents/gsd-doc-synthesizer.agent.md": "6ae32e4db005696d", "agents/gsd-doc-verifier.agent.md": "0230208ae7ab1a08", @@ -63,6 +63,7 @@ "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-sbfl.md": "5bb65a8653bf2e06", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 672977db8..1d11089fe 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "f29d6edbac0a01b6", "agents/gsd-codebase-mapper.md": "d49c91fdab4efc70", "agents/gsd-debug-session-manager.md": "69a051432e54f9a5", - "agents/gsd-debugger.md": "3fb544d8fce11aea", + "agents/gsd-debugger.md": "ac61fdd3129770c5", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "9934ec11845d41c3", @@ -133,6 +133,7 @@ "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-sbfl.md": "838445590aab52e3", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 733fee395..e83e24ea2 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "5ef947ca5baed775", "agents/gsd-codebase-mapper.md": "feccaeeacd05e34b", "agents/gsd-debug-session-manager.md": "60945a8dcfb7e3d7", - "agents/gsd-debugger.md": "0489cee92e1361a7", + "agents/gsd-debugger.md": "8a375259b81d8adf", "agents/gsd-doc-classifier.md": "29b563a146c9d22c", "agents/gsd-doc-synthesizer.md": "652beb928e93fa1d", "agents/gsd-doc-verifier.md": "d3d8457bdd44bf10", @@ -62,6 +62,7 @@ "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-sbfl.md": "70e699200f6197e0", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index a03c1af36..55a43199a 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "922c08885bc78662", "agents/gsd-codebase-mapper.md": "0ccbf6a685804979", "agents/gsd-debug-session-manager.md": "621c4c28af4f7b01", - "agents/gsd-debugger.md": "75c345b1ae4a86d2", + "agents/gsd-debugger.md": "c9fcb57e5f6e6ee7", "agents/gsd-doc-classifier.md": "6256bbc0b887f60f", "agents/gsd-doc-synthesizer.md": "212aaf89a34b51d7", "agents/gsd-doc-verifier.md": "8016f792d0766b77", @@ -133,6 +133,7 @@ "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-sbfl.md": "391e732abf32786a", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index a5e446a8a..6ddc71261 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -45,7 +45,7 @@ "agents/subagents/gsd-codebase-mapper.yaml": "bce1c6d15f55c477", "agents/subagents/gsd-debug-session-manager.md": "69b3083e7e29c435", "agents/subagents/gsd-debug-session-manager.yaml": "aab147717b5082e7", - "agents/subagents/gsd-debugger.md": "3e9607a7ba92cec5", + "agents/subagents/gsd-debugger.md": "a2f38433646baffc", "agents/subagents/gsd-debugger.yaml": "6d02d7feb90cad43", "agents/subagents/gsd-doc-classifier.md": "632dc6c61bafa63e", "agents/subagents/gsd-doc-classifier.yaml": "a4e9cf7025b57503", @@ -126,6 +126,7 @@ "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-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", "gsd-core/references/domain-probes.md": "62d23ed1992c48a9", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index b24ca55ac..9a6fb216b 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "2249774416314c57", "agents/gsd-codebase-mapper.md": "948612acd505e87f", "agents/gsd-debug-session-manager.md": "cb64aa404849be60", - "agents/gsd-debugger.md": "60df2107066b0006", + "agents/gsd-debugger.md": "1653f7447e3fa8a8", "agents/gsd-doc-classifier.md": "fb776cfbb7e991b0", "agents/gsd-doc-synthesizer.md": "2389f388d291c2eb", "agents/gsd-doc-verifier.md": "65bbc2ae6b9ace29", @@ -133,6 +133,7 @@ "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-sbfl.md": "391e732abf32786a", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index 4ac403d0d..867f181a3 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -29,6 +29,7 @@ "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-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", "gsd-core/references/domain-probes.md": "62d23ed1992c48a9", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 12892cb7c..0988c71cf 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "27eeeee6cb600e9b", "agents/gsd-codebase-mapper.md": "032ff8ac55466a74", "agents/gsd-debug-session-manager.md": "e4db798b5a536a2c", - "agents/gsd-debugger.md": "8448c971f713412f", + "agents/gsd-debugger.md": "a93dd835d97836c7", "agents/gsd-doc-classifier.md": "bdf3d54082424e76", "agents/gsd-doc-synthesizer.md": "96c383b74a60fbbe", "agents/gsd-doc-verifier.md": "da9ab6f3ec27778a", @@ -62,6 +62,7 @@ "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-sbfl.md": "061b719c754a12d3", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index bbbecfd7e..16b8eb1b3 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "338c46ab59c4e45f", "agents/gsd-codebase-mapper.md": "8529d8a1ede8bbfb", "agents/gsd-debug-session-manager.md": "5e64d23321942c1c", - "agents/gsd-debugger.md": "d7fc667ae590dd6f", + "agents/gsd-debugger.md": "1839444836892ffe", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "e51e50892963ccc7", @@ -62,6 +62,7 @@ "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-sbfl.md": "23d7a3bb15bc8b7c", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index 18feb7adb..de7340f16 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "efc0d2dee321c654", "agents/gsd-codebase-mapper.md": "cfa2bbfaf264e1fd", "agents/gsd-debug-session-manager.md": "7ea9975264a99b2c", - "agents/gsd-debugger.md": "778496a47881df83", + "agents/gsd-debugger.md": "520dbc9408761e2e", "agents/gsd-doc-classifier.md": "a6ab02b8f45f9d0b", "agents/gsd-doc-synthesizer.md": "fd3c18addbc8265d", "agents/gsd-doc-verifier.md": "ede2f297b73b5a86", @@ -62,6 +62,7 @@ "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-sbfl.md": "071651eaf7414a4c", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "883d0a1b9d9ff96e", "gsd-core/references/domain-probes.md": "762b965e84035b72", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index fb88e1a66..3ef40c8db 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -8,7 +8,7 @@ "agents/gsd-code-reviewer.md": "7d94fe8bfa6661aa", "agents/gsd-codebase-mapper.md": "7cc9d387f29c46e1", "agents/gsd-debug-session-manager.md": "716e31255a94e0ce", - "agents/gsd-debugger.md": "be00f854f4b0a6c9", + "agents/gsd-debugger.md": "376cb361acbafafd", "agents/gsd-doc-classifier.md": "146acf4d176134b5", "agents/gsd-doc-synthesizer.md": "b1f5e2eb28fa3659", "agents/gsd-doc-verifier.md": "7ed4d9611f678a95", @@ -133,6 +133,7 @@ "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-sbfl.md": "a7d0cd5940d6d2cd", "gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474", "gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934", "gsd-core/references/domain-probes.md": "62d23ed1992c48a9", diff --git a/tests/fixtures/install-tree/antigravity.json b/tests/fixtures/install-tree/antigravity.json index 087ad7905..d10828ff7 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/augment.json b/tests/fixtures/install-tree/augment.json index ffe7d8d10..8f3c7a9e7 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/claude-local.json b/tests/fixtures/install-tree/claude-local.json index e876f542e..531a4eb0c 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/claude.json b/tests/fixtures/install-tree/claude.json index 475259c19..3f7e4746e 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/cline.json b/tests/fixtures/install-tree/cline.json index 8a2a76c8d..018cdcf26 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/codebuddy.json b/tests/fixtures/install-tree/codebuddy.json index f5c919960..14e8f1a87 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/codex.json b/tests/fixtures/install-tree/codex.json index fa1ab2eaa..99e756335 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/copilot.json b/tests/fixtures/install-tree/copilot.json index 201b73f6c..6fcf66339 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/cursor.json b/tests/fixtures/install-tree/cursor.json index d8484dc83..c11bd418e 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/hermes.json b/tests/fixtures/install-tree/hermes.json index 997964f6c..5b3d192e6 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/kilo.json b/tests/fixtures/install-tree/kilo.json index 70b883846..01d454ef8 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/kimi.json b/tests/fixtures/install-tree/kimi.json index 6e19b8b8b..410bd83eb 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/opencode.json b/tests/fixtures/install-tree/opencode.json index 7b2a4fc03..bbd7223ea 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/pi.json b/tests/fixtures/install-tree/pi.json index 06e7dcb07..a41a00c29 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/qwen.json b/tests/fixtures/install-tree/qwen.json index 5535bfb7b..eb66d94f8 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/trae.json b/tests/fixtures/install-tree/trae.json index 57cb21e7d..d4762326e 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/windsurf.json b/tests/fixtures/install-tree/windsurf.json index b6dd1fb8d..7c4c36870 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md", diff --git a/tests/fixtures/install-tree/zcode.json b/tests/fixtures/install-tree/zcode.json index ef56440b9..ce7ab9262 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-sbfl.md", "gsd-core/references/decimal-phase-calculation.md", "gsd-core/references/doc-conflict-engine.md", "gsd-core/references/domain-probes.md",