Praktische Hinweise: Hören Sie auf, Ihren Programmier-Assistenten zu beobachten – entwickeln Sie ein System, dem Sie vertrauen können.
Schritt-für-Schritt-Anleitung zu den Praktischen Hinweisen: Hören Sie auf, Ihren Programmier-Assistenten zu beobachten – bauen Sie ein System, dem Sie vertrauen können: Verträge, Überprüfungen sowie Code-Blöcke für Teams, die dieses Muster einsetzen.
Nutzen Sie dies als für Operator zugängliche Neuformulierung der Ideen aus „Stop Watching Your Coding Agent: Build a System You Can Trust“: klare Phasen, geordnete Codeabschnitte sowie Wiederherstellungshinweise, die auch bei Übergaben erhalten bleiben. Die Überblicksphase funktioniert am besten, wenn sie als messbarer Rahmen betrachtet wird. Erfassen Sie vor der Erweiterung des Umfangs ein „goldenes“ Transkript, einen Fehlerfall sowie die Notizen zur Rücksetzung. Ziehen Sie kleine, testbare Einheiten vor großen Skripten vor. Wenn ein Schritt fehlschlägt, sollte der Fehler auf eine einzige Verantwortung verweisen und nicht auf ein verworrenes Ablaufverfahren.
Das Problem: Sie erledigen vermutlich immer noch nur die Hälfte der Arbeit
Für die aktuelle Phase des Problems sollten Sie die Eingaben, den Verantwortlichen für den jeweiligen Schritt sowie die Abbruchkriterien definieren, bevor Sie Code ändern. Die Operator sollten in der Lage sein, den Schritt von einem bekannten Checkpoint aus erneut auszuführen, ohne auf versteckte Zustände schließen zu müssen. Betrachten Sie diese Phase als Vertrag zwischen den Eingaben und den validierten Ausgaben. Benennen Sie die Artefakte, definieren Sie Erfolgskontrollen und lehnen Sie stille, unvollständige Abschlüsse ab. Setzen Sie menschliche Freigabe für Schritte ein, die Geld kosten oder Produktionsdaten ändern. Eine Kompilierzeit-Verkabelung entspricht nicht der Geschäftsabschlussfähigkeit.
You: Fix the login bug.
Agent: Done.
You: opens browser
You: It still doesn't work.
Agent: Ah. I found the problem.
You: No, that's not it.
Agent: You're right. I found the REAL problem.
You: sends screenshot
Agent: Ah...
1. Geben Sie dem Agenten einen einzigen Befehl für „erledigt“
Zur Phase „1 – Agent bereitstellen“ sollten vor dem Codeändern die Eingaben, der Verantwortliche für den Schritt sowie die Abbruchkriterien definiert werden. Die Operator sollten in der Lage sein, den Schritt von einem bekannten Checkpoint aus erneut auszuführen, ohne auf versteckte Zustände schließen zu müssen. Erfassen Sie neben den funktionalen Ergebnissen auch die Dauer sowie die Kosten für Tokens oder Abfragen. Eine frühzeitige Sichtbarkeit der Kosten verhindert überraschende Rechnungen, wenn der Weg von einer Demo-Umgebung in gemeinsam genutzte Umgebungen wechselt. Setzen Sie menschliche Freigabe für Schritte voraus, die Geld kosten oder Produktionsdaten ändern. Eine Verkabelung zur Kompilierzeit bedeutet nicht automatisch vollständige Geschäftsabdeckung.
scripts/verify.sh
#!/usr/bin/env bash
set -euo pipefail
echo "== Python lint =="
uv run ruff check backend
echo "== Python types =="
uv run mypy backend
echo "== Python tests =="
uv run pytest -q
echo "== Frontend lint =="
npm --prefix frontend run lint
echo "== Frontend tests =="
npm --prefix frontend test -- --run
echo "Verification passed."
#!/usr/bin/env bash
set -euo pipefail
echo "== Python lint =="
python -m ruff check backend
echo "== Python types =="
python -m mypy backend
echo "== Python tests =="
python -m pytest -q
echo "== Frontend lint =="
npm --prefix frontend run lint
echo "== Frontend tests =="
npm --prefix frontend test -- --run
echo "Verification passed."
chmod +x scripts/verify.sh
verify:
./scripts/verify.sh
make verify
inspect
↓
change code
↓
verify
↓
failure
↓
inspect
↓
change code
↓
verify
2. Bei Fehlern: Fordern Sie vor der Behebung Beweise an
Zur Phase der Fehlerbehebung bei 2 For sollten die Eingaben, der Verantwortliche für den Schritt sowie die Abbruchkriterien vor dem Codeändern definiert werden. Die Operator sollten in der Lage sein, den Schritt von einem bekannten Checkpoint aus erneut auszuführen, ohne auf verborgene Zustände schließen zu müssen. Bewahren Sie die Konfiguration außerhalb des Anwendungscode auf. Umgebungsdateien, Geheimdatenspeicher und Feature-Flags sollten an einem Ort zusammengefasst sein, den die Operator überprüfen können, ohne den gesamten Ablauf durchlesen zu müssen. Setzen Sie menschliche Freigabe für Schritte ein, die Geld ausgeben oder Produktionsdaten ändern. Eine Verkabelung zur Kompilierzeit bedeutet nicht automatisch vollständige Geschäftsabdeckung. Zur Phase der Fehlerbehebung bei 2 For sollten die Eingaben, der Verantwortliche für den Schritt sowie die Abbruchkriterien vor dem Codeändern definiert werden. Die Operator sollten in der Lage sein, den Schritt von einem bekannten Checkpoint aus erneut auszuführen, ohne auf verborgene Zustände schließen zu müssen. Ziehen Sie kleine, testbare Einheiten vor großen, komplexen Skripten vor. Wenn ein Schritt fehlschlägt, sollte der Fehler auf eine einzige Verantwortung verweisen und nicht auf einen verworrenen Ablauf.
def parse_timeout(value: str) -> float:
if value.endswith("s"):
return float(value[:-1])
if value.endswith("m"):
return float(value[:-1]) * 60
return float(value)
250ms is interpreted incorrectly.
def test_parse_timeout_milliseconds():
assert parse_timeout("250ms") == 0.25
uv run pytest tests/test_timeout.py -q
python -m pytest tests/test_timeout.py -q
def parse_timeout(value: str) -> float:
if value.endswith("ms"):
return float(value[:-2]) / 1000
if value.endswith("s"):
return float(value[:-1])
if value.endswith("m"):
return float(value[:-1]) * 60
return float(value)
reported bug
↓
observed failure
↓
code change
↓
observed success
3. Geben Sie dem Agenten ein Onboarding-Manual
Während der Phase „Geben Sie dem Agenten“ sollten Sie zunächst den Vertrag aufschreiben: erforderliche Eingaben, Erfolgsindikatoren sowie das Vorgehen bei teilweisen Fehlern. Diese Checkliste sorgt dafür, dass spätere Codeänderungen transparent bleiben. Betrachten Sie diese Phase als Vertrag zwischen Eingaben und validierten Ausgaben. Benennen Sie die relevanten Dokumente, definieren Sie Erfolgskontrollen und lehnen Sie stille, teilweise abgeschlossene Abläufe ab. Legen Sie nach teuren Schritten Kontrollpunkte an. Das System sollte bei erneuten Versuchen eines Operators keine doppelten Abrechnungen für denselben LLM-Aufruf erstellen.
# Project
FastAPI backend + React frontend.
Python dependencies are managed with uv.
## Important directories
backend/app/api/ HTTP endpoints
backend/app/services/ business logic
frontend/src/features/ feature code
tests/ backend tests
## Commands
Fast Python tests:
uv run pytest -q tests/unit
Full verification:
make verify
Development:
make dev
## Working rules
Before editing:
1. Reproduce the problem.
2. Inspect the implementation involved.
3. Find similar existing code before creating a new pattern.
4. Identify or add a test.
Before completion:
1. Run relevant tests.
2. Run `make verify`.
3. Inspect `git diff`.
4. Report exactly what was verified.
Fast Python tests:
python -m pytest -q tests/unit
4. Wandeln Sie wiederkehrende Lektionen in Fähigkeiten um
Während der Bearbeitung der 4-fach wiederkehrenden Lektionen sollten Sie zunächst den Vertrag aufschreiben: erforderliche Eingaben, Erfolgsindikator sowie das Vorgehen bei teilweisen Fehlern. Diese Checkliste sorgt dafür, dass spätere Codeänderungen transparent bleiben. Notieren Sie die Laufzeiten sowie die Kosten für Token oder Abfragen neben den funktionalen Ergebnissen. Eine frühzeitige Sichtbarkeit der Kosten verhindert überraschende Rechnungen, wenn der Prozess von einer Demo-Umgebung in gemeinsam genutzte Umgebungen übergeht. Legen Sie nach aufwändigen Schritten einen Kontrollpunkt an. Das Fortsetzen des Prozesses sollte keine erneuten Gebühren für denselben LLM-Aufruf verursachen, wenn ein Operator einen späteren Knoten erneut ausführt.
skills/debug-with-evidence/SKILL.md
# Debug with evidence
Before modifying production code:
1. Capture the exact symptom.
2. Reproduce it.
3. Find the narrowest failing case.
4. Inspect the code actually executed.
5. Form hypotheses only after gathering evidence.
6. Prefer experiments that distinguish competing explanations.
7. Add a regression test when practical.
8. Make the smallest justified fix.
9. Rerun the reproduction.
10. Run full verification.
For Python projects managed by uv, run Python tools with `uv run`.
Report:
- observed failure
- root cause
- evidence
- files changed
- verification performed
#!/usr/bin/env bash
set -euo pipefail
echo "=== STATUS ==="
git status --short
echo
echo "=== RECENT COMMITS ==="
git log --oneline -10
echo
echo "=== DIFF ==="
git diff --stat
echo
echo "=== TESTS ==="
uv run pytest -q --tb=short
python -m pytest -q --tb=short
if rg 'app\.database' frontend/src
then
echo "Frontend may not import app.database"
exit 1
fi
"Don't import X here."
→ dependency check
"Every endpoint needs authorization."
→ middleware + test
"Don't forget to regenerate the schema."
→ CI check
"Every bug fix needs a regression test."
→ workflow rule
"Don't modify generated files."
→ generated-file check
uv run ruff check .
uv run mypy .
uv run pytest
python -m ruff check .
python -m mypy .
python -m pytest
6. Machen Sie die einfachste Lösung zur richtigen Lösung
Beim Bearbeiten der Phase „6 Make the easiest“ sollten Sie zunächst den Vertrag aufschreiben: erforderliche Eingaben, Erfolgszeichen sowie das Vorgehen bei teilweisen Fehlern. Diese Checkliste sorgt dafür, dass spätere Codeänderungen transparent bleiben. Bewahren Sie die Konfiguration außerhalb des Anwendungscode auf. Umgebungsdateien, Geheimdatenspeicher und Feature-Flags sollten an einem Ort gesammelt sein, den Operator ohne das Durchlesen des gesamten Systems überprüfen können. Erstellen Sie Zwischenkontrollpunkte nach aufwändigen Schritten. Das Wiederaufnehmen des Vorgangs sollte keine doppelten Abrechnungen für denselben LLM-Aufruf verursachen, wenn ein Operator einen späteren Schritt erneut ausführt. Beim Bearbeiten der Phase „6 Make the easiest“ sollten Sie zunächst den Vertrag aufschreiben: erforderliche Eingaben, Erfolgszeichen sowie das Vorgehen bei teilweisen Fehlern. Diese Checkliste sorgt dafür, dass spätere Codeänderungen transparent bleiben. Ziehen Sie kleine, testbare Einheiten vor großen, komplexen Skripten. Wenn ein Schritt fehlschlägt, sollte der Fehler auf eine einzige Verantwortungsbereich verweisen und nicht auf ein verworrenes Ablaufschema.
components/
services/
hooks/
types/
validation/
screens/
features/
├── billing/
│ ├── api.ts
│ ├── model.ts
│ ├── BillingPage.tsx
│ └── BillingPage.test.tsx
│
└── login/
├── api.ts
├── model.ts
├── LoginPage.tsx
└── LoginPage.test.tsx
7. Verwenden Sie einen neuen Agenten als Prüfer
Die Phase „Verwenden Sie einen neuen Agenten“ funktioniert am besten, wenn sie als messbarer Prozess betrachtet wird. Erfassen Sie ein erfolgreiches Beispiel, einen Fehlfall sowie eine Notiz zur Rücksetzung, bevor Sie den Umfang erweitern. Betrachten Sie diese Phase als Vertrag zwischen Eingaben und validierten Ausgaben. Benennen Sie die Ergebnisdokumente, definieren Sie Erfolgskontrollen und lehnen Sie stille, unvollständige Abschlüsse ab. Halten Sie den Zustand der Graphen einfach und typisiert. Verschachtelte Datenblöcke verbergen, welcher Knoten welches Feld geschrieben hat, und führen zu Unterbrechungen beim Fortsetzen der Verarbeitung.
Agent A
↓
implements
↓
Agent B
↓
reviews from fresh context
Check:
1. Does the change actually satisfy the task?
2. Can you reproduce the original bug?
3. Are edge cases missing?
4. Were tests weakened?
5. Is there unnecessary complexity?
6. Are architectural boundaries violated?
7. Is existing functionality duplicated?
8. Do the tests verify behavior?
For Python changes, run the relevant checks yourself:
uv run ruff check .
uv run mypy .
uv run pytest
python -m ruff check .
python -m mypy .
python -m pytest
confirmed defect
plausible concern
stylistic preference
8. Parallelisieren Sie mit Worktrees – nicht im Chaos
Die Phase „8 Parallelisierung mit Worktrees“ funktioniert am besten, wenn sie als messbare Größe betrachtet wird. Erfassen Sie vor Erweiterung des Umfangs ein „goldenes“ Transkript, einen Fehlerfall sowie eine Notiz zur Rücksetzung. Erfassen Sie außerdem die Laufzeiten sowie die Kosten für Tokens oder Abfragen neben den funktionalen Ergebnissen. Eine frühzeitige Sichtbarkeit der Kosten verhindert überraschende Rechnungen, wenn der Prozess von einer Demo in gemeinsame Umgebungen übergeht. Halten Sie den Zustand des Graphen flach und typisiert – verschachtelte Datenstrukturen verbergen, welcher Knoten welches Feld geschrieben hat, und führen zu Unterbrechungen beim Fortsetzen der Verarbeitung.
git worktree add ../app-auth -b agent/auth
git worktree add ../app-search -b agent/search
git worktree add ../app-billing -b agent/billing
app-auth/
app-search/
app-billing/
uv sync
uv run pytest
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python -m pytest
Agent 1: investigate authentication bug
Agent 2: implement CSV export
Agent 3: profile search performance
Agent 1: refactor authentication
Agent 2: refactor authentication differently
Agent 3: rename files both others are editing
9. Behandeln Sie jede menschliche Korrektur als Daten
The 9 Treat every human stage works best when treated as a messbarer Bereich. Erfassen Sie ein „goldenes Transkript“, einen Fehlerfall sowie eine Notiz zur Rücksetzung, bevor Sie den Umfang erweitern. Bewahren Sie die Konfiguration außerhalb des Anwendungscode auf. Umgebungsdateien, Geheimdatenspeicher und Feature-Flags sollten an einem Ort gesammelt sein, den Betreuer ohne Durchsicht des gesamten Graphen prüfen können. Halten Sie den Zustand des Graphen flach und typisiert. Verschachtelte Datenblöcke verbergen, welcher Knoten welches Feld geschrieben hat, und führen zu Unterbrechungen bei der Fortsetzung der Ausführung. The 9 Treat every human stage works best when treated as a messbarer Bereich. Erfassen Sie ein „goldenes Transkript“, einen Fehlerfall sowie eine Notiz zur Rücksetzung, bevor Sie den Umfang erweitern. Ziehen Sie kleine, testbare Einheiten vor großen, komplexen Skripten vor. Wenn ein Schritt fehlschlägt, sollte der Fehler auf eine einzige Verantwortung verweisen und nicht auf einen verworrenen Ablauf.
Agent lacked project knowledge?
→ improve AGENTS.md
Agent didn't know the procedure?
→ create a Skill
Bug escaped?
→ regression test
Same architectural mistake again?
→ CI/static rule
Task was ambiguous?
→ improve task template
Agent trusted its own solution too easily?
→ independent reviewer
agent makes mistake
↓
human understands why
↓
lesson becomes process
↓
process becomes Skill/test/CI
↓
future agent avoids whole category of mistake
Die Einrichtung, die Sie zuerst erstellen würden
Für die zu implementierende Konfiguration sollten Sie vor dem Ändern des Codes die Eingaben, den Verantwortlichen für den jeweiligen Schritt sowie die Abbruchkriterien definieren. Die Operator sollten in der Lage sein, den Schritt von einem bekannten Checkpoint aus erneut auszuführen, ohne auf versteckte Zustände schließen zu müssen. Betrachten Sie diese Phase als Vertrag zwischen den Eingaben und den validierten Ausgaben. Benennen Sie die Artefakte, definieren Sie Erfolgskontrollen und lehnen Sie stille, unvollständige Abschlüsse ab. Setzen Sie menschliche Freigabe für Schritte ein, die Geld ausgeben oder Produktionsdaten ändern. Eine Kompilierzeit-Verkabelung entspricht nicht der Geschäftsabschlussfähigkeit.
pyproject.toml
uv.lock
AGENTS.md
Makefile
scripts/verify.sh
skills/debug-with-evidence/SKILL.md
skills/review-change/SKILL.md
uv init
uv sync
uv add --dev pytest ruff mypy
uv run pytest
uv run ruff check .
uv run mypy .
pip install pytest ruff mypy
python -m pytest
python -m ruff check .
python -m mypy .
1. Investigate.
2. Reproduce.
3. Write failing test.
4. Implement smallest fix.
5. Run fast tests.
6. Run full verification.
7. Fresh agent reviews diff.
8. Human corrections become permanent rules.
Own this task end to end.
Before editing:
- inspect the relevant implementation,
- reproduce the problem,
- examine similar existing code.
During implementation:
- make the smallest coherent change,
- add or update tests,
- use `uv run` for Python tools,
- verify while iterating.
Before completion:
- run full verification,
- inspect the final diff,
- independently check the original requirement.
Report what changed, what was verified,
and any remaining uncertainty.
Die größere Idee
In der Phase „Größeres Konzept“ sollten vor dem Ändern des Codes die Eingaben, der Verantwortliche für den Schritt sowie die Abbruchkriterien definiert werden. Die Operator sollten in der Lage sein, den Schritt von einem bekannten Checkpoint aus erneut auszuführen, ohne auf versteckte Zustände schließen zu müssen. Erfassen Sie die Laufzeiten sowie die Kosten für Token oder Abfragen zusammen mit den funktionalen Ergebnissen. Eine frühzeitige Sichtbarkeit der Kosten verhindert überraschende Rechnungen, wenn der Prozess von einer Demo-Umgebung in gemeinsam genutzte Umgebungen übergeht. Setzen Sie menschliche Freigabe für Schritte voraus, die Geld kosten oder Produktionsdaten ändern. Eine Verkabelung zur Kompilierzeit bedeutet nicht automatisch vollständige Geschäftsabdeckung.
prompt → code
requirement
↓
agent
↓
code
↓
execution
↓
verification
↓
review
↓
feedback
↓
better Skills / tests / architecture
↺
uv run pytest tests/test_bug.py -q
uv run ruff check .
uv run mypy .
make verify
python -m pytest tests/test_bug.py -q
python -m ruff check .
python -m mypy .
make verify
Operative Kontrollliste
Während der Bearbeitung der operativen Kontrollliste sollten Sie zunächst den Vertrag aufschreiben: erforderliche Eingaben, Erfolgsindikatoren sowie das Vorgehen bei teilweisen Fehlern. Diese Kontrollliste sorgt dafür, dass spätere Codeänderungen transparent bleiben.
Dokumentieren Sie den erfolgreichen Ablauf sowie den Wiederherstellungsprozess gemeinsam. Versuche, menschliche Eingriffe und die Handhabung von Fehlern gehören zum Produkt selbst, nicht zu späteren Optimierungen.
Erstellen Sie Checkpoints nach kostspieligen Schritten. Das Fortsetzen des Vorgangs sollte keine erneute Abrechnung für denselben LLM-Aufruf vornehmen, wenn ein Operator einen späteren Knoten erneut versucht.
Pinnen Sie Abhängigkeitsversionen fest und dokumentieren Sie den Image-Digest, mit dem die Demo ausgeführt wurde. Reproduzierbarkeit ist besser als „stammesbezogenes Wissen“.
Ziehen Sie kleine, testbare Einheiten vor großen Skripten vor. Wenn ein Schritt fehlschlägt, sollte der Fehler auf eine einzige Verantwortung verweisen und nicht auf einen verworrenen Ablauf.
Erstellen Sie Checkpoints nach kostspieligen Schritten. Das Fortsetzen des Vorgangs sollte keine erneute Abrechnung für denselben LLM-Aufruf vornehmen, wenn ein Operator einen späteren Knoten erneut versucht.
Vor der Einführung des Stacks sollten Versionen eingefroren werden, ein „goldener“ Transkript für den kritischen Pfad erstellt und die Rollback-Schritte bestätigt werden. Gemeinsam genutzte Umgebungen benötigen Rate Limits, Überprüfungen der Nutzerrechte sowie einen klaren Verantwortlichen für die Rotation von Geheimnissen. Man sollte langweilige Zuverlässigkeit vor cleveren, einmaligen Demonstrationen bevorzugen.
Batch-Hinweis für 780e678b0ae3: Halten Sie die Provider-Schlüssel außerhalb des Repositories, legen Sie eine Obergrenze für Tokens pro Sitzung fest und speichern Sie die Transkripte neben den Evaluierungs-Dateien, damit spätere Modellwechsel vergleichbar bleiben.