* test(#1960): add failing-first RCA-branching contract + schema-invariant tests Epic #1957 Phase 2A. Source-text-is-the-product contract tests (fishbone >=2 categories, AND-gate, multi-cause root_cause, backward compat, reasoning checkpoint candidate_causes+and_gate fields, debugger-philosophy single-cause note, DEBUG template) plus behavioral schema-invariant checks on two fixtures: two contributing causes (AND-gate yes) -> both recorded; single-cause (AND-gate no) -> one root_cause, identical to today. Failing-first: reference, agent edits, and template note do not yet exist. * feat(#1960): add RCA branching (fishbone + AND-gate) to gsd-debugger Epic #1957 Phase 2A. Guards against 5-Whys single-cause bias: before committing root_cause, the debugger enumerates candidate causes across >=2 Ishikawa categories (code/config/environment/data) and explicitly answers an AND-gate question. 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 hold one OR a small set (additive; single-cause sessions are byte-identical to today). The Structured Reasoning Checkpoint gains candidate_causes + and_gate fields; debugger-philosophy.md adds the single-cause-bias trap. Full rules extracted to gsd-core/references/debugger-rca-branching.md (slim Phase 2 routing + 2 checkpoint fields kept in the agent). INVENTORY + manifest + agent-size baseline + install-parity goldens + AGENTS.md + DEBUG template updated. * fix(#1960): address orthogonal review (AND-gate self-consistency, parity guard, narrowed claim, ripples) - Reference: the collapse rule now enforces AND-gate self-consistency — and_gate=yes with a single confirmed cause is flagged as incomplete (return to Phase 3); a race/timing note clarifies such bugs bridge categories; the 'byte-identical' backward-compat claim narrowed to 'root_cause shape unchanged; reasoning_checkpoint gains 2 fields in every session'. - DEBUG.md: stale 'five-field' mirror prose -> seven-field (parallel-surface drift the reviewer flagged); new debug-session-management parity test pins the field-count claim to the gsd-debugger.md YAML keys (CRLF-safe). - Scalar-assuming consumers of set-valued root_cause updated: session-manager compact summaries (319/332), diagnose-only return (1062), archive entry (1216), ROOT CAUSE FOUND return (1322). - Test: added the AND-gate-yes/single-cause invariant + fixture; rephrased the fixture describe block honestly as a schema-invariant specification. - Phase 2 bullet phrasing clarified ('at hypothesis formation, before the Phase 4 commit'). * test(#1960): parity regex accepts word-form count ('seven-field' or '7-field') * test(#1960): parity regex counts array-valued YAML keys (no inline value) * chore(#1960): backfill changeset pr number (PR #2405)
This commit is contained in:
5
.changeset/1960-rca-branching.md
Normal file
5
.changeset/1960-rca-branching.md
Normal file
@@ -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)
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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. |
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
98
gsd-core/references/debugger-rca-branching.md
Normal file
98
gsd-core/references/debugger-rca-branching.md
Normal file
@@ -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.
|
||||
@@ -51,7 +51,7 @@ started: [when it broke / always broken]
|
||||
## Resolution
|
||||
<!-- OVERWRITE as understanding evolves -->
|
||||
|
||||
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:**
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.`
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
182
tests/debugger-rca-branching.test.cjs
Normal file
182
tests/debugger-rca-branching.test.cjs
Normal file
@@ -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/);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
13
tests/fixtures/golden-install-parity/codex.json
vendored
13
tests/fixtures/golden-install-parity/codex.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
5
tests/fixtures/golden-install-parity/pi.json
vendored
5
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/antigravity.json
vendored
1
tests/fixtures/install-tree/antigravity.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/augment.json
vendored
1
tests/fixtures/install-tree/augment.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/claude.json
vendored
1
tests/fixtures/install-tree/claude.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/cline.json
vendored
1
tests/fixtures/install-tree/cline.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/codebuddy.json
vendored
1
tests/fixtures/install-tree/codebuddy.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/codex.json
vendored
1
tests/fixtures/install-tree/codex.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/copilot.json
vendored
1
tests/fixtures/install-tree/copilot.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/cursor.json
vendored
1
tests/fixtures/install-tree/cursor.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/hermes.json
vendored
1
tests/fixtures/install-tree/hermes.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/kilo.json
vendored
1
tests/fixtures/install-tree/kilo.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/kimi.json
vendored
1
tests/fixtures/install-tree/kimi.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/opencode.json
vendored
1
tests/fixtures/install-tree/opencode.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/pi.json
vendored
1
tests/fixtures/install-tree/pi.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/qwen.json
vendored
1
tests/fixtures/install-tree/qwen.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/trae.json
vendored
1
tests/fixtures/install-tree/trae.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/windsurf.json
vendored
1
tests/fixtures/install-tree/windsurf.json
vendored
@@ -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",
|
||||
|
||||
1
tests/fixtures/install-tree/zcode.json
vendored
1
tests/fixtures/install-tree/zcode.json
vendored
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user