---
name: qa-session
description: "Interactive QA: user reports bugs conversationally, agent files GitHub issues. Triggers: QA session, report bug, file issue, conversational QA, bug intake."
user-invocable: true
effort: high
argument-hint: "[area to QA or first bug report]"
allowed-tools: Read, Grep, Glob, Bash, Agent
---

# QA Session

$ARGUMENTS

Interactive QA session. User describes problems, agent clarifies, explores codebase, and files GitHub issues.

## Usage

```
/qa-session [area to QA or first bug report]
```

## What This Command Does

1. **Listens** to user's bug report
2. **Clarifies** with 2-3 focused questions max
3. **Explores** codebase in background for context and domain language
4. **Assesses** scope — single issue or breakdown
5. **Files** GitHub issues via `gh issue create`
6. **Continues** until user says done

## For Each Issue

### 1. Listen and Lightly Clarify

Let user describe the problem. Ask **at most 2-3 short questions** on:
- Expected vs actual behavior
- Steps to reproduce
- Consistent or intermittent

Don't over-interview. If clear enough, move on.

### 2. Explore Codebase in Background

Kick off Agent (subagent_type=Explore) in background to:
- Learn domain language (check UBIQUITOUS_LANGUAGE.md)
- Understand what the feature should do
- Identify behavior boundaries

This helps write better issues — but issues must NOT reference files/lines.

### 3. Assess Scope

| Decision | When |
|----------|------|
| **Single issue** | One behavior wrong in one place |
| **Breakdown** | Multiple independent areas, separable concerns, distinct failure modes |

### 4. File GitHub Issues

Use `gh issue create`. Do NOT ask to review — file and share URLs.

**Single issue template:**

```
## What happened
[Actual behavior in plain language]

## What I expected
[Expected behavior]

## Steps to reproduce
1. [Concrete numbered steps]
2. [Use domain terms, not module names]

## Additional context
[Extra observations using domain language]
```

**Breakdown template** (for each sub-issue):

```
## Parent issue
#{parent-issue-number} or "Reported during QA session"

## What's wrong
[This specific behavior problem]

## What I expected
[Expected behavior for this slice]

## Steps to reproduce
1. [Steps specific to THIS issue]

## Blocked by
- #{issue-number} or "None — can start immediately"
```

### 5. Continue Session

After filing, share URLs and ask: "Next issue, or are we done?"

## Rules

- **MUST** use the project's domain language from `UBIQUITOUS_LANGUAGE.md` — framework jargon in issues excludes non-engineering stakeholders
- **MUST** describe behaviors, not code — "sync service fails to apply patch" not "applyPatch() throws"
- **MUST** include reproduction steps — if they are not clear, ask the user rather than guess
- **NEVER** include file paths, line numbers, or function names in issue bodies — they go stale before triage
- **NEVER** over-interview. Cap clarifying questions at 2-3 per bug; more than that is signal the bug needs a QA session with a product owner, not more questions.
- **CRITICAL**: the developer who picks up the issue should understand it in 30 seconds. Wall-of-text reports get reopened for clarification.
- **MANDATORY**: when breaking one report into multiple issues, file them in dependency order so blockers have real issue numbers to reference

## Gotchas

- Domain language in `UBIQUITOUS_LANGUAGE.md` may be out of date. If it was last updated months ago and new features have shipped, the glossary is an input hint, not a source of truth — confirm terms with the user when unsure.
- "Intermittent" reports are often environmental (one user's browser, one region's data) rather than truly random. Always ask for "how often" and "when did it start" before labeling as race condition.
- `gh issue create` opens `$EDITOR` without `--body`. In automation this hangs — always pass the body file or inline body.
- Users often describe the **workaround** as if it were the bug ("I have to refresh the page"). Drill to the underlying behavior — "what fails before the refresh?" — otherwise the fix targets the symptom.
- Independent sub-issues from one bug report can duplicate work if each gets a different developer. Mention the parent QA session in every sub-issue so reviewers notice the pattern.

## When NOT to Use

- For triaging a **single** known bug with a proposed fix — use `/triage-issue`
- For creating issues from a PRD — use `/prd-to-issues`
- For debugging a reproducible error — use `/debug`
- For code review of a PR that addresses a bug — use `/review`
- For architecture-level problems — use `/architecture-audit`, not bug reports
