feat: add a dedicated Security Auditor agent with veto power

Security was one section among seven in the QA Engineer. That is structurally
weak: the agent that wants to recommend "production ready: YES" also judged
security, and as a subsection it competes for attention with acceptance
criteria, regression and test authoring.

The new agent:
- has no Write/Edit tools, so "never fix what you find" is enforced by the tool
  list rather than by instruction — it cannot launder a finding into a patch
- reports PASS / FAIL / UNVERIFIED, and UNVERIFIED must reach the spec; an audit
  that omits what it could not check reads as all-clear
- audits against .claude/rules/security.md, the same standard the developer
  agents are held to, so every mandatory item gets a verdict
- holds a veto: BLOCK stops /deploy regardless of functional test results

/qa now runs both agents in parallel and keeps the verdicts separate. The QA
Engineer is explicitly forbidden from speaking for security.
This commit is contained in:
Florian Wilde
2026-08-09 01:22:05 +02:00
parent 75e99f75c6
commit f432122abf
6 changed files with 281 additions and 39 deletions
+55 -6
View File
@@ -15,7 +15,7 @@ liest sich jede Skill selbst wieder ein.
- [Schnellstart](#schnellstart)
- [Der Workflow im Überblick](#der-workflow-im-überblick)
- [Die neun Skills](#die-neun-skills)
- [Die drei Sub-Agents](#die-drei-sub-agents)
- [Die vier Sub-Agents](#die-vier-sub-agents)
- [Die vier Rules](#die-vier-rules)
- [Kontext-Ebenen](#kontext-ebenen)
- [Das Feature-System](#das-feature-system)
@@ -166,7 +166,7 @@ Status-Spalte, gewinnen die Dateien und es sagt dir das.
---
## Die drei Sub-Agents
## Die vier Sub-Agents
`/frontend`, `/backend` und `/qa` führen Interview und Review mit dir im Hauptgespräch
und geben die eigentliche Dateiarbeit ab. Der Sub-Agent arbeitet in eigenem Kontext und
@@ -198,11 +198,59 @@ sequenceDiagram
|-------|-------|-----------|---------|-----------|
| **Frontend Developer** | `.claude/agents/frontend-dev.md` | Read, Write, Edit, Bash, Glob, Grep | UI umsetzen | shadcn vor Eigenbau; Lint, Typecheck und Build müssen grün sein |
| **Backend Developer** | `.claude/agents/backend-dev.md` | Read, Write, Edit, Bash, Glob, Grep | Routen, Daten, Auth | **Stoppt und meldet zurück**, wenn der Daten-Layer noch nicht entschieden ist |
| **QA Engineer** | `.claude/agents/qa-engineer.md` | Read, Write, Edit, Bash, Glob, Grep | Testen, Security-Audit | **Behebt niemals selbst einen Bug** — nur finden, dokumentieren, priorisieren |
| **QA Engineer** | `.claude/agents/qa-engineer.md` | Read, Write, Edit, Bash, Glob, Grep | Funktion gegen die Spec testen | **Behebt niemals selbst einen Bug**. Spricht **nicht** über Sicherheit |
| **Security Auditor** | `.claude/agents/security-auditor.md` | Read, Grep, Glob, Bash — **kein Write/Edit** | Sicherheit, adversarial | Hat ein **Veto** über `/deploy`. Findet er Critical oder High: BLOCK |
Keiner der drei fasst `features/INDEX.md` an. Tracking gehört der aufrufenden Skill —
Keiner der vier fasst `features/INDEX.md` an. Tracking gehört der aufrufenden Skill —
so kann es keine zwei Wahrheiten über den Status geben.
### Der Skeptiker
`/qa` startet **zwei** Agenten parallel, weil sie verschiedene Fragen beantworten:
*Tut es, was die Spec verspricht?* und *Ist es sicher genug fürs offene Internet?*
Das ist bewusst getrennt. Derselbe Agent, der „Produktionsreif: JA" empfehlen will,
sollte nicht auch über Sicherheit urteilen — er hat ein Motiv, grün zu melden. Und
als Unterpunkt neben Acceptance Criteria, Regression und Testschreiben fällt Security
bei knappem Kontext zuerst hinten runter.
Der Security Auditor arbeitet nach drei Prinzipien:
- **Unsicher bis zum Beweis des Gegenteils.** Eine plausible Erklärung zählt nicht;
er muss die Kontrolle im Code gesehen haben und Datei plus Zeile nennen können.
- **Drei Verdikte, Schweigen ist keines davon:** PASS, FAIL oder **UNGEPRÜFT**.
Was er nicht prüfen konnte, steht als UNGEPRÜFT in der Spec — ein Audit, das
Ungeprüftes weglässt, liest sich wie Entwarnung und ist schlimmer als keins.
- **Kein Write- oder Edit-Werkzeug.** Er *kann* nicht beheben, was er findet. Damit
ist „niemals selbst fixen" strukturell erzwungen statt nur angewiesen — er kann
einen Befund nicht still wegpatchen.
Seine Checkliste ist `.claude/rules/security.md`, also derselbe Standard, an den sich
die Entwickler-Agenten halten müssen. Jeder Pflichtpunkt darin braucht ein Verdikt.
```mermaid
flowchart TB
QA["/qa PROJ-X"] --> A["QA Engineer<br/><i>Tut es, was die Spec verspricht?</i>"]
QA --> B["Security Auditor<br/><i>Ist es sicher fürs offene Internet?</i>"]
A --> AV{"Critical oder<br/>High Bugs?"}
B --> BV{"Verdikt"}
AV -->|ja| R["Status bleibt<br/><b>In Review</b>"]
BV -->|"BLOCK"| R
AV -->|nein| G(("&nbsp;"))
BV -->|"PASS"| G
G --> OK["Status <b>Approved</b><br/>→ /deploy"]
R --> FIX["/frontend oder /backend<br/>beheben, dann erneut /qa"]
style B stroke-width:3px
style R stroke-width:3px
```
Beide müssen grün sein. Ein sauberer Funktionstest hebt ein `BLOCK` nicht auf, und
`/deploy` verweigert den Start, wenn das Security-Verdikt fehlt oder blockiert.
---
## Die vier Rules
@@ -546,7 +594,8 @@ README.md Dieses Dokument
agents/
frontend-dev.md Sub-Agent für UI
backend-dev.md Sub-Agent für Server
qa-engineer.md Sub-Agent für Tests und Audit
qa-engineer.md Sub-Agent für Funktionstests
security-auditor.md Sub-Agent für Sicherheit — Veto über /deploy
docs/
PRD.md Füllt /init im Interview
DEPLOYMENT.md Docker-Betrieb, Proxy, DB nachrüsten, Troubleshooting
@@ -576,7 +625,7 @@ playwright.config.ts postcss.config.mjs vitest.config.mts
components.json tsconfig.json package.json
```
55 Dateien im Repo.
56 Dateien im Repo.
---