feat: add workflow.discuss_mode assumptions config (#637)

Add codebase-first assumption-driven alternative to the interview-style
discuss-phase. New `workflow.discuss_mode: "assumptions"` config routes
to a separate workflow that spawns a gsd-assumptions-analyzer agent to
read 5-15 codebase files, surface assumptions with evidence, and ask
only for corrections (~2-4 interactions vs ~15-20).

- New gsd-assumptions-analyzer agent for deep codebase analysis
- New discuss-phase-assumptions.md workflow (15 steps)
- Command-level routing via dual @reference + process gate
- Identical CONTEXT.md output — downstream agents unaffected
- Existing discuss-phase.md workflow untouched (zero diff)
- Mode-aware plan-phase gate and progress display
- User documentation and integration tests
- Update agent count and list in copilot-install tests (17 → 18)

Closes #637

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-03-21 00:21:17 -04:00
parent df6fcf0033
commit 18bb0149c8
9 changed files with 951 additions and 5 deletions

View File

@@ -746,10 +746,10 @@ describe('Copilot agent conversion - real files', () => {
assert.ok(toolsLine.includes("'read'"), 'Read mapped');
});
test('all 17 agents convert without error', () => {
test('all 18 agents convert without error', () => {
const agents = fs.readdirSync(agentsSrc)
.filter(f => f.startsWith('gsd-') && f.endsWith('.md'));
assert.strictEqual(agents.length, 17, `expected 17 agents, got ${agents.length}`);
assert.strictEqual(agents.length, 18, `expected 18 agents, got ${agents.length}`);
for (const agentFile of agents) {
const content = fs.readFileSync(path.join(agentsSrc, agentFile), 'utf8');
@@ -1120,7 +1120,7 @@ const crypto = require('crypto');
const INSTALL_PATH = path.join(__dirname, '..', 'bin', 'install.js');
const EXPECTED_SKILLS = 53;
const EXPECTED_AGENTS = 17;
const EXPECTED_AGENTS = 18;
function runCopilotInstall(cwd) {
const env = { ...process.env };
@@ -1189,6 +1189,7 @@ describe('E2E: Copilot full install verification', () => {
const gsdAgents = files.filter(f => f.startsWith('gsd-') && f.endsWith('.agent.md')).sort();
const expected = [
'gsd-advisor-researcher.agent.md',
'gsd-assumptions-analyzer.agent.md',
'gsd-codebase-mapper.agent.md',
'gsd-debugger.agent.md',
'gsd-executor.agent.md',