adversarial-qa · git:20260726.3115fd3 · 2026-07-26 · sha256 e8c1e791348d2c7f

adversarial-qa git:20260726.3115fd3A

Immutable. This exact content never changes and is served at /api/v1/blob/e8c1e791348d2c7f.

---
name: adversarial-qa
description: >
  Exploratory, adversarial QA: drive the running feature in a browser and
  surface UX issues and edge cases the plan and committed tests did not
  anticipate — not a re-verification of the spec. Invoked as /adversarial-qa
  for an ad-hoc session, or applied by the adversarial-qa sub-agent in the
  /feature workflow.
---

# /adversarial-qa — Exploratory QA

Exercise a feature in the running app and surface anything that looks wrong,
confusing, or likely to bite a real user. This is exploratory and adversarial,
not a re-verification of the spec — committed end-to-end tests encode the plan's
Requirements deterministically. Your job is to go beyond them.

If a plan was provided (inline or by path), read the Requirements section only
to understand what the feature does — not as a checklist to tick through.

---

## What to do

1. Start the local dev server with the project's dev-server command and
   drive the feature at the documented app URL (both in `AGENTS.md` →
   *Commands*) in a browser via the Playwright MCP. When you are done, stop
   it with the documented stop command —
   never `kill` by PID or hunt processes with `lsof`. If the
   server will not start or Playwright is unavailable, STOP and report the
   blocker. Do not substitute curl, SQL, or any other workaround for browser
   exploration — those answer different questions.

2. Probe beyond the happy path. Try things the planner likely did not
   enumerate: narrow viewports, keyboard-only navigation, browser back button,
   multiple tabs on the same form, paste of weird/long/XSS content, reloading
   mid-edit, error-toast timing, interactions with unrelated UI on the same
   page, stale state after a failed submit.

3. Surface anything that looks off — even if it is not part of this feature's
   plan. Do not act "smart" by working around issues, inferring intent, or
   deciding a bug is "probably expected". Report it and let the developer
   decide.

4. Before writing the report, list the known deferred issues with
   `gh issue list --label known-issue --state open` and compare them against
   what you found. A finding that matches an open `known-issue` goes in the
   *Known issues* section of the report (cite the issue number), NOT in
   Findings — the developer has already triaged it once and should not have
   to re-triage it on every QA pass. If the observed behaviour is worse than
   or different from what the issue describes, that difference IS a finding.

---

## Evidence

Save screenshots under `.qa-evidence/` at the repo root (gitignored). Every
finding in the report MUST cite at least one screenshot there, with a
one-sentence description of what it shows.

---

## Output Format

```
### Findings
- [Short description] — [evidence path] — [severity: bug / concern / nit]

### Known issues (already deferred — no action needed)
- [#issue-number] [title] — [still present / not observed on this pass]

### Blockers (if any)
[Anything that prevented you from exploring — server won't start, Playwright
unavailable, credentials needed, etc.]
```

An empty `Findings` section is a valid output if you genuinely probed the
feature and found nothing worth flagging. An empty output because you "ran out
of ideas" is not.