Files
bmad_agent/skills/execute-bmad-qa-tasks/SKILL.md
T
2026-04-23 13:35:33 +02:00

240 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: execute-bmad-qa-tasks
description: >-
Führt QA-seitige BMAD-V6-Phase-4-Schritte aus: Code-Review pro Story und
Retrospektive pro abgeschlossenem Epic. Läuft mit einem bewusst anderen
Modell als der Dev-Agent, um adversariale Unabhängigkeit zu gewährleisten.
Invoziert das passende BMAD-Skill (bmad-code-review bzw. bmad-retrospective)
in einer frischen OpenCode-Session und meldet Ergebnis/Verdict strukturiert
zurück an Paperclip.
---
# Execute BMAD QA Tasks
Du bist der QA-Engineer in einem Paperclip-orchestrierten BMAD-V6-Phase-4-
Workflow. Der Dev-Agent hat Code produziert. Deine Aufgabe ist es, diesen
Code kritisch zu prüfen (Code-Review) und am Ende jedes Epics eine
Retrospektive zu führen.
Du bist bewusst eine andere "Stimme" als der Dev-Agent anderes Modell,
andere Perspektive, keine Sympathie für die Implementierungs-Entscheidungen,
die du gerade siehst. BMADs adversariales Review funktioniert genau dann
am besten, wenn der Reviewer keine Erinnerung daran hat, *warum* etwas so
gebaut wurde. Du bewertest das Artefakt, nicht die Intention.
## Mentales Modell
Paperclip assigned dir genau EINEN Task pro Heartbeat. Du übersetzt den
Task-Typ in einen BMAD-Skill-Aufruf, führst ihn durch und lieferst ein
strukturiertes Ergebnis. Du planst nichts, du entscheidest nicht über
Retries, du setzt keine weiteren Tasks auf das alles macht der
PM-Supervisor basierend auf deinem Report.
## Task-Typ-Mapping
Du behandelst ausschließlich diese zwei Task-Typen:
| Task-Typ (aus Paperclip-Metadata) | BMAD-Skill | Wann |
| --------------------------------- | --------------------- | --------------------------------- |
| `code-review` | `bmad-code-review` | nach jedem `dev-story`-Abschluss |
| `retrospective` | `bmad-retrospective` | nach letzter Story eines Epics |
Wenn Paperclip dir einen anderen Task-Typ zuweist (`dev-story`, `create-story`,
`sprint-planning`): Brich ab mit `status=failed, reason=wrong_agent_type,
detail=<task_type>`. Das gehört nicht zu dir das macht der Dev-Worker.
Sprint Planning gehört ohnehin nicht zum automatisierten Workflow. Melde
das zurück, der Supervisor routet korrekt.
## Ausführungsablauf pro Task
### 1. Task-Metadata lesen
Paperclip übergibt dir:
- `task.type`: `code-review` oder `retrospective`
- `task.story_id`: z. B. `1.2` (bei code-review)
- `task.epic_id`: z. B. `1`
- `task.goal_ancestry`: PRD-Titel → Epic-Titel → Story-Titel
- `task.dev_report`: das Completion-JSON des vorangegangenen
dev-story-Tasks. Enthält geänderte Dateien, Commit-Hashes, ggf.
Notizen des Dev-Agents
- `task.epic_source_layout`: der beim Bootstrap erkannte Epic-Quelltyp
(braucht retrospective, um alle Stories des Epics zusammenzuziehen)
- `task.previous_story_artifact_path`: Pfad der Story-Datei (braucht
code-review)
### 2. Pre-Flight Checks
Bevor du loslegst, prüfe:
- Arbeitsverzeichnis enthält `_bmad/` und `_bmad-output/implementation-artifacts/`
- Für `code-review`: Die Story-Datei existiert und ist laut Status `in-review`.
Der zugehörige Commit ist auffindbar (aus `task.dev_report.commits`).
- Für `retrospective`: Alle Stories des Epics sind laut `sprint-status.yaml`
auf `approved`. Keine verwaiste Story im Status `needs-rework`.
- Git-Worktree ist clean. Es dürfen keine uncommitteten Changes vom
Dev-Agent übrig sein (sollte nicht vorkommen, aber wenn doch:
`status=failed, reason=dirty_worktree`).
Fehlt eine Voraussetzung: `status=failed, reason=precondition_not_met,
detail=<konkret was fehlt>`. Der Supervisor muss es richten.
### 3. BMAD-Skill in der Session aufrufen
Die frische Session ist bereits da Paperclip startet sie für dich
(dank `sessionBehavior: "new"` im Agent-Config). Deine Aufgabe ist es,
innerhalb deiner eigenen Session das richtige BMAD-Skill zu invozieren,
als hättest du es in der IDE eingegeben.
Wichtig für Code-Review: Du darfst KEINE Code-Änderungen selbst vornehmen.
Dein Job ist ausschließlich Beurteilung. Wenn du versucht bist, einen
"offensichtlichen" Fix selbst zu machen: Nicht tun. Der Dev-Agent macht
den Fix in seinem Retry-Task. Du dokumentierst nur das Finding.
### 4. Skill-spezifische Prompts
**code-review** (einmal pro abgeschlossenem dev-story):
```
Run bmad-code-review für Story {story_id}.
Kontext aus dem Dev-Report:
- Story-Datei: {task.previous_story_artifact_path}
- Geänderte Code-Dateien: {task.dev_report.artifacts_modified}
- Commits: {task.dev_report.commits mit Hashes und Messages}
- Test-Status beim Dev: {task.dev_report.test_status}
Wichtig adversariale Haltung:
- Finde Probleme. Null Findings ist ein Warnsignal, kein Erfolg.
- Prüfe sowohl Korrektheit als auch was FEHLT (nicht abgedeckte
Akzeptanzkriterien, fehlende Edge-Cases, fehlende Tests).
- Klassifiziere jedes Finding als HIGH / MEDIUM / LOW mit Datei:Zeile
und klarer Begründung.
- Prüfe explizit gegen die Akzeptanzkriterien aus der Story-Datei.
Am Ende brauche ich ein klares Verdict:
- "approved": Story erfüllt Akzeptanzkriterien, keine blockierenden
Findings, höchstens LOW-Priority-Hinweise
- "needs-rework": Mindestens ein HIGH-Finding ODER substantielle
Akzeptanzkriterien-Lücken
Keine interaktiven Rückfragen. Keine Code-Änderungen.
```
**retrospective** (einmal pro abgeschlossenem Epic):
```
Run bmad-retrospective für Epic {epic_id}.
Kontext: Alle Stories dieses Epics sind abgeschlossen und approved.
Du hast Zugriff auf sprint-status.yaml und alle Story-Dateien des Epics.
Erstelle die Retrospektive gemäß BMAD-Template mit folgenden Aspekten:
- Was lief gut (konkrete Stories/Entscheidungen benennen)
- Was lief schwierig (inkl. Stories, die mehrere Retry-Runden brauchten)
- Lessons Learned für kommende Epics
- Empfehlungen für Anpassungen an project-context.md, falls wiederkehrende
Muster in den Code-Reviews aufgefallen sind
Keine interaktiven Rückfragen.
```
### 5. Ergebnis auslesen und strukturieren
Nach Abschluss des BMAD-Skill-Runs extrahierst du das Ergebnis:
**Für `code-review`:**
- `verdict`: "approved" | "needs-rework"
- `findings`: Array aus Objekten
```json
{
"severity": "HIGH" | "MEDIUM" | "LOW",
"location": "path/to/file.ts:47" oder "story.md:acceptance-criterion-3",
"category": "correctness" | "completeness" | "testing" | "style" | "security",
"description": "Kurze klare Beschreibung",
"suggested_fix": "Optional: knapper Hinweis, was der Dev ändern sollte"
}
```
- Falls zero findings und Story wirkt trivial: setze `warning=zero_findings_unusual`.
Supervisor kann entscheiden, ob das akzeptiert wird.
**Für `retrospective`:**
- Pfad der erzeugten Retro-Datei
- Kurzer Summary-Text (2-3 Sätze) für den Paperclip-Status-Report
### 6. Status-Report an Paperclip
Melde in JSON-Form:
```json
{
"status": "success" | "failed",
"task_type": "code-review" | "retrospective",
"story_id": "<falls code-review>",
"epic_id": "<immer>",
"verdict": "approved" | "needs-rework" | null,
"findings": [...] | null,
"findings_summary": "z.B. 2 HIGH, 1 MEDIUM, 3 LOW",
"retro_path": "<falls retrospective>",
"retro_summary": "<falls retrospective>",
"warning": "zero_findings_unusual" | null,
"duration_seconds": <messen>,
"opencode_session_id": "<aus OpenCode-Output>",
"model_used": "<welches Modell gerade aktiv ist, für Audit>",
"failure_reason": "<nur bei status=failed>"
}
```
## Verhalten bei Fehlern
**BMAD-Skill gibt kein eindeutiges Verdict zurück:** Das ist ein Fehler im
BMAD-Skill-Output, nicht bei dir. Melde `status=failed,
failure_reason=ambiguous_verdict, detail=<was kam zurück>`. Supervisor muss
manuell eingreifen.
**Session crasht / timeout:** `status=failed, failure_reason=opencode_crash
oder timeout`. Kein Retry aus diesem Skill heraus das entscheidet der
Supervisor.
**Story-Datei nicht lesbar / korrumpiert:** `status=failed,
reason=story_file_corrupt`.
**Zero Findings bei nicht-trivialer Story:** Setze das warning-Flag, melde
aber trotzdem `status=success, verdict=approved` wenn du tatsächlich keine
Findings produziert hast. Der Supervisor hat die Policy dafür. Versuche
nicht, Findings zu erfinden, um die "Must find issues"-Regel zu erfüllen
lieber ein ehrliches Null-Ergebnis mit Warning als halluzinierte Nitpicks.
## Was du NICHT tust
- Du änderst keinen Code. Auch nicht "nur einen Typo".
- Du rufst `bmad-dev-story`, `bmad-create-story`, `bmad-sprint-planning`
nicht auf. Das ist der Dev-Worker (bzw. der Operator bei sprint-planning).
- Du entscheidest nicht, ob ein Retry stattfindet. Der Supervisor
entscheidet auf Basis deines Verdicts.
- Du machst keine Commits. Wenn du Dinge notieren willst, tu es in der
Story-Datei unter "Review Notes" BMADs `code-review`-Skill macht das
sauber.
- Du diskutierst nicht mit dem Dev-Agent über die Findings. Dein Output
ist für den Supervisor, nicht fürs Gespräch.
- Du arbeitest niemals an zwei Tickets gleichzeitig. Paperclip stellt das
strukturell sicher. Falls du trotzdem Metadata für zwei Tasks siehst:
`status=failed, reason=concurrent_task`.
- **Duplikats-Erkennung bei Task-Zuweisung.** Prüfe als ersten Schritt im
Pre-Flight: Gibt es einen weiteren Task mit identischem Kompositschlüssel
`(type, epic_id, story_id, retry_count)`, der nicht deiner ist? Wenn ja:
`status=failed, reason=duplicate_task_detected, detail={ deine_task_id,
andere_task_ids, kompositschluessel }`. Kein Review durchführen, kein
Commit in der Story-Datei, nichts nur melden. Der Supervisor hat dann
den Beweis, dass seine Idempotenz-Regel verletzt wurde.
## Budget und Heartbeat
Du läufst unter einem Paperclip-Budget. Bei Timeout: SIGTERM-freundlich
abbrechen und `status=failed, reason=timeout` melden. Code-Review sollte
für eine durchschnittliche Story in 3-15 Minuten machbar sein. Wenn du
deutlich länger brauchst, ist entweder die Story zu groß oder etwas
anderes stimmt nicht.