* feat: Phase 2 caller migration — gsd-sdk query in workflows (#2122) Cherry-picked orchestration rewrites from feat/sdk-foundation (#2008, 4018fee) onto current main, resolving conflicts to keep upstream worktree guards and post-merge test gate. SDK stub registry omitted (out of Phase 2 scope per #2122). Refs: #2122 #2008 Made-with: Cursor * docs: add gsd-sdk query migration blurb Made-with: Cursor * docs(workflows): extend Phase 2 gsd-sdk query caller migration - Swap node gsd-tools.cjs for gsd-sdk query in review, plan-phase, execute-plan, ship, extract_learnings, ai-integration-phase, eval-review, next, thread - Document graphify CJS-only in gsd-planner; dual-path in CLI-TOOLS and ARCHITECTURE - Update tests: workstreams gsd-sdk path, thread frontmatter.get, workspace init.*, CRLF-safe autonomous frontmatter parse - CHANGELOG: Phase 2 caller migration scope Made-with: Cursor * docs(phase2): USER-GUIDE + remaining gsd-sdk query call sites - USER-GUIDE: dual-path CLI section; state validate/sync use full CJS path - Commands: debug (config-get+tdd), quick (security note), intel Task prompt - Agent: gsd-debug-session-manager resolve-model via jq - Workflows: milestone-summary, forensics, next, complete-milestone/verify-work (audit-open CJS notes), discuss-phase, progress, verify-phase, add/insert/remove phase, transition, manager, quick workflow; remove-phase commit without --files - Test: quick-session-management accepts frontmatter.get - CHANGELOG: Phase 2 follow-up bullet Made-with: Cursor * docs(phase2): align gsd-sdk query examples in commands and agents - init.* query names; frontmatter.get uses positional field name - state.* handlers use positional args; commit uses positional paths - CJS-only notes for from-gsd2 and graphify; learnings.query wording - CHANGELOG: Phase 2 orchestration doc pass Made-with: Cursor * docs(phase2): normalize gsd-sdk query commit to positional file paths - Strip --files from commit examples in workflows, references, commands - Keep commit-to-subrepo ... --files (separate handler) - git-planning-commit.md: document positional args - Tests: new-project commit line, state.record-session, gates CRLF, roadmap.analyze - CHANGELOG [Unreleased] Made-with: Cursor * feat(sdk): gsd-sdk query parity with gsd-tools and PR 2179 registry fixes - Route query via longest-prefix match and dotted single-token expansion; fall back to runGsdToolsQuery (same argv as node gsd-tools.cjs) for full CLI coverage. - Parse gsd-sdk query permissively so gsd-tools flags (--json, --verify, etc.) are not rejected by strict parseArgs. - resolveGsdToolsPath: honor GSD_TOOLS_PATH; prefer bundled get-shit-done copy over project .claude installs; export runGsdToolsQuery from the SDK. - Fix gsd-tools audit-open (core.output; pass object for --json JSON). - Register summary-extract as alias of summary.extract; fix audit-fix workflow to call audit-uat instead of invalid init.audit-uat (PR review). Updates QUERY-HANDLERS.md and CHANGELOG [Unreleased]. Made-with: Cursor * fix(sdk): Phase 2 scope — Trek-e review (#2179, #2122) - Remove gsd-sdk query passthrough to gsd-tools.cjs; drop GSD_TOOLS_PATH - Consolidate argv routing in resolveQueryArgv(); update USAGE and QUERY-HANDLERS - Surface @file: read failures in GSDTools.parseOutput - execute-plan: defer Task Commit Protocol to gsd-executor - stale-colon-refs: skip .planning/ and root CLAUDE.md (gitignored overlays) - CHANGELOG [Unreleased]: maintainer review and routing notes Made-with: Cursor
239 lines
7.4 KiB
Markdown
239 lines
7.4 KiB
Markdown
<purpose>
|
|
Orchestrate parallel debug agents to investigate UAT gaps and find root causes.
|
|
|
|
After UAT finds gaps, spawn one debug agent per gap. Each agent investigates autonomously with symptoms pre-filled from UAT. Collect root causes, update UAT.md gaps with diagnosis, then hand off to plan-phase --gaps with actual diagnoses.
|
|
|
|
Orchestrator stays lean: parse gaps, spawn agents, collect results, update UAT.
|
|
</purpose>
|
|
|
|
<available_agent_types>
|
|
Valid GSD subagent types (use exact names — do not fall back to 'general-purpose'):
|
|
- gsd-debugger — Diagnoses and fixes issues
|
|
</available_agent_types>
|
|
|
|
<paths>
|
|
DEBUG_DIR=.planning/debug
|
|
|
|
Debug files use the `.planning/debug/` path (hidden directory with leading dot).
|
|
</paths>
|
|
|
|
<core_principle>
|
|
**Diagnose before planning fixes.**
|
|
|
|
UAT tells us WHAT is broken (symptoms). Debug agents find WHY (root cause). plan-phase --gaps then creates targeted fixes based on actual causes, not guesses.
|
|
|
|
Without diagnosis: "Comment doesn't refresh" → guess at fix → maybe wrong
|
|
With diagnosis: "Comment doesn't refresh" → "useEffect missing dependency" → precise fix
|
|
</core_principle>
|
|
|
|
<process>
|
|
|
|
<step name="parse_gaps">
|
|
**Extract gaps from UAT.md:**
|
|
|
|
Read the "Gaps" section (YAML format):
|
|
```yaml
|
|
- truth: "Comment appears immediately after submission"
|
|
status: failed
|
|
reason: "User reported: works but doesn't show until I refresh the page"
|
|
severity: major
|
|
test: 2
|
|
artifacts: []
|
|
missing: []
|
|
```
|
|
|
|
For each gap, also read the corresponding test from "Tests" section to get full context.
|
|
|
|
Build gap list:
|
|
```
|
|
gaps = [
|
|
{truth: "Comment appears immediately...", severity: "major", test_num: 2, reason: "..."},
|
|
{truth: "Reply button positioned correctly...", severity: "minor", test_num: 5, reason: "..."},
|
|
...
|
|
]
|
|
```
|
|
</step>
|
|
|
|
<step name="report_plan">
|
|
**Read worktree config:**
|
|
|
|
```bash
|
|
USE_WORKTREES=$(gsd-sdk query config-get workflow.use_worktrees 2>/dev/null || echo "true")
|
|
```
|
|
|
|
**Report diagnosis plan to user:**
|
|
|
|
```
|
|
## Diagnosing {N} Gaps
|
|
|
|
Spawning parallel debug agents to investigate root causes:
|
|
|
|
| Gap (Truth) | Severity |
|
|
|-------------|----------|
|
|
| Comment appears immediately after submission | major |
|
|
| Reply button positioned correctly | minor |
|
|
| Delete removes comment | blocker |
|
|
|
|
Each agent will:
|
|
1. Create DEBUG-{slug}.md with symptoms pre-filled
|
|
2. Investigate autonomously (read code, form hypotheses, test)
|
|
3. Return root cause
|
|
|
|
This runs in parallel - all gaps investigated simultaneously.
|
|
```
|
|
</step>
|
|
|
|
<step name="spawn_agents">
|
|
**Load agent skills:**
|
|
|
|
```bash
|
|
AGENT_SKILLS_DEBUGGER=$(gsd-sdk query agent-skills gsd-debugger 2>/dev/null)
|
|
EXPECTED_BASE=$(git rev-parse HEAD)
|
|
```
|
|
|
|
**Spawn debug agents in parallel:**
|
|
|
|
For each gap, fill the debug-subagent-prompt template and spawn:
|
|
|
|
```
|
|
Task(
|
|
prompt=filled_debug_subagent_prompt + "\n\n<worktree_branch_check>\nFIRST ACTION: run git merge-base HEAD {EXPECTED_BASE} — if result differs from {EXPECTED_BASE}, run git reset --hard {EXPECTED_BASE} to correct the branch base (safe — runs before any agent work). Then verify: if [ \"$(git rev-parse HEAD)\" != \"{EXPECTED_BASE}\" ]; then echo \"ERROR: Could not correct worktree base\"; exit 1; fi. Fixes EnterWorktree creating branches from main on all platforms.\n</worktree_branch_check>\n\n<files_to_read>\n- {phase_dir}/{phase_num}-UAT.md\n- .planning/STATE.md\n</files_to_read>\n${AGENT_SKILLS_DEBUGGER}",
|
|
subagent_type="gsd-debugger",
|
|
${USE_WORKTREES !== "false" ? 'isolation="worktree",' : ''}
|
|
description="Debug: {truth_short}"
|
|
)
|
|
```
|
|
|
|
**All agents spawn in single message** (parallel execution).
|
|
|
|
Template placeholders:
|
|
- `{truth}`: The expected behavior that failed
|
|
- `{expected}`: From UAT test
|
|
- `{actual}`: Verbatim user description from reason field
|
|
- `{errors}`: Any error messages from UAT (or "None reported")
|
|
- `{reproduction}`: "Test {test_num} in UAT"
|
|
- `{timeline}`: "Discovered during UAT"
|
|
- `{goal}`: `find_root_cause_only` (UAT flow - plan-phase --gaps handles fixes)
|
|
- `{slug}`: Generated from truth
|
|
</step>
|
|
|
|
<step name="collect_results">
|
|
**Collect root causes from agents:**
|
|
|
|
Each agent returns with:
|
|
```
|
|
## ROOT CAUSE FOUND
|
|
|
|
**Debug Session:** ${DEBUG_DIR}/{slug}.md
|
|
|
|
**Root Cause:** {specific cause with evidence}
|
|
|
|
**Evidence Summary:**
|
|
- {key finding 1}
|
|
- {key finding 2}
|
|
- {key finding 3}
|
|
|
|
**Files Involved:**
|
|
- {file1}: {what's wrong}
|
|
- {file2}: {related issue}
|
|
|
|
**Suggested Fix Direction:** {brief hint for plan-phase --gaps}
|
|
```
|
|
|
|
Parse each return to extract:
|
|
- root_cause: The diagnosed cause
|
|
- files: Files involved
|
|
- debug_path: Path to debug session file
|
|
- suggested_fix: Hint for gap closure plan
|
|
|
|
If agent returns `## INVESTIGATION INCONCLUSIVE`:
|
|
- root_cause: "Investigation inconclusive - manual review needed"
|
|
- Note which issue needs manual attention
|
|
- Include remaining possibilities from agent return
|
|
</step>
|
|
|
|
<step name="update_uat">
|
|
**Update UAT.md gaps with diagnosis:**
|
|
|
|
For each gap in the Gaps section, add artifacts and missing fields:
|
|
|
|
```yaml
|
|
- truth: "Comment appears immediately after submission"
|
|
status: failed
|
|
reason: "User reported: works but doesn't show until I refresh the page"
|
|
severity: major
|
|
test: 2
|
|
root_cause: "useEffect in CommentList.tsx missing commentCount dependency"
|
|
artifacts:
|
|
- path: "src/components/CommentList.tsx"
|
|
issue: "useEffect missing dependency"
|
|
missing:
|
|
- "Add commentCount to useEffect dependency array"
|
|
- "Trigger re-render when new comment added"
|
|
debug_session: .planning/debug/comment-not-refreshing.md
|
|
```
|
|
|
|
Update status in frontmatter to "diagnosed".
|
|
|
|
Commit the updated UAT.md:
|
|
```bash
|
|
gsd-sdk query commit "docs({phase_num}): add root causes from diagnosis" ".planning/phases/XX-name/{phase_num}-UAT.md"
|
|
```
|
|
</step>
|
|
|
|
<step name="report_results">
|
|
**Report diagnosis results and hand off:**
|
|
|
|
Display:
|
|
```
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
GSD ► DIAGNOSIS COMPLETE
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
| Gap (Truth) | Root Cause | Files |
|
|
|-------------|------------|-------|
|
|
| Comment appears immediately | useEffect missing dependency | CommentList.tsx |
|
|
| Reply button positioned correctly | CSS flex order incorrect | ReplyButton.tsx |
|
|
| Delete removes comment | API missing auth header | api/comments.ts |
|
|
|
|
Debug sessions: ${DEBUG_DIR}/
|
|
|
|
Proceeding to plan fixes...
|
|
```
|
|
|
|
Return to verify-work orchestrator for automatic planning.
|
|
Do NOT offer manual next steps - verify-work handles the rest.
|
|
</step>
|
|
|
|
</process>
|
|
|
|
<context_efficiency>
|
|
Agents start with symptoms pre-filled from UAT (no symptom gathering).
|
|
Agents only diagnose—plan-phase --gaps handles fixes (no fix application).
|
|
</context_efficiency>
|
|
|
|
<failure_handling>
|
|
**Agent fails to find root cause:**
|
|
- Mark gap as "needs manual review"
|
|
- Continue with other gaps
|
|
- Report incomplete diagnosis
|
|
|
|
**Agent times out:**
|
|
- Check DEBUG-{slug}.md for partial progress
|
|
- Can resume with /gsd-debug
|
|
|
|
**All agents fail:**
|
|
- Something systemic (permissions, git, etc.)
|
|
- Report for manual investigation
|
|
- Fall back to plan-phase --gaps without root causes (less precise)
|
|
</failure_handling>
|
|
|
|
<success_criteria>
|
|
- [ ] Gaps parsed from UAT.md
|
|
- [ ] Debug agents spawned in parallel
|
|
- [ ] Root causes collected from all agents
|
|
- [ ] UAT.md gaps updated with artifacts and missing
|
|
- [ ] Debug sessions saved to ${DEBUG_DIR}/
|
|
- [ ] Hand off to verify-work for automatic planning
|
|
</success_criteria>
|