Clean Code Gauntlet
Effort: heavy — echte Rechenzeit: Coverage- und Komplexitäts-Läufe plus ein begrenzter Mutations-Durchgang, dann ein Geschmacks-Modell; investier das in Änderungen, die ausgeliefert werden. Beseitigt: menschliches Zeile-für-Zeile-Review ganzer Diffs und die falsch-grünen Tests, hinter denen sich eine Regression versteckt.
Warum es das gibt
Unordentlicher Code lässt Agenten strampeln, und Regeln, die in einem langen
Prompt vergraben sind, verblassen mitten im Kontext — deterministische Checks
verblassen nie. Also fahre Clean Code als Spießrutenlauf, den der Code bestehen
muss, nicht als Prosa, die sich das Modell merken soll.
Messen, nicht reviewen. Gate auf Zahlen, die ein Tool berechnet: Coverage,
zyklomatische Komplexität (eine Zählung unabhängiger Pfade durch eine Funktion),
Modulgröße, Mutation-Kills. Menschen und Modelle auditieren Stichproben — nie
ganze Diffs.
Die Kette (in Reihenfolge fahren; jede Stufe stoppt laut bei Fehlschlag)
- Sniper-Tests grün. Fahre nur die Testdateien, die abdecken, was der Diff
berührt hat — siehe sniper-testing. Eine rote
Baseline heißt: stoppen und fixen; nie auf Rot mutieren oder bewerten.
- CRAP unter der Schwelle auf echten Coverage-Daten (siehe das Gate unten).
Riss → die Funktion herunter-refactoren oder voll abdecken. Nie die Latte
senken.
- Mutation-Testing: null Überlebende im Scope. Ein Überlebender überführt die
TESTS, nicht den Code — stärke den Test, der ihn hätte fangen müssen.
- Leichtes Geschmacks-Review — ein Modell beurteilt nur, was Zahlen nicht
können.
Tools, die das berechnen
| Stack |
Tools |
| Python |
coverage.py + radon + mutmut |
| JS/TS |
c8 (oder istanbul) + Stryker |
| Go |
go test -cover + gocyclo + go-mutesting |
| Rust |
cargo-tarpaulin + cargo-mutants |
| Java |
JaCoCo + PIT |
| Andere |
irgendein Coverage-% + irgendein Zähler für zyklomatische Komplexität |
Eine Befehlsform pro Stufe:
- Coverage:
coverage run -m pytest <sniper files> && coverage report (JS/TS: npx c8 vitest run <files>)
- Komplexität:
radon cc -s <changed files>
- Mutation:
mutmut run --paths-to-mutate <changed files> (JS/TS: npx stryker run --mutate "<glob>")
Das CRAP-Gate
CRAP(m) = comp(m)^2 * (1 - cov(m)/100)^3 + comp(m)
- Bei 100 % Coverage kollabiert der Score auf die Komplexität selbst.
- 30 ist die klassische „crappy“-Linie (Komplexität 5 bei null Coverage erreicht
sie).
- Menschen halten grob 4–5 Komplexität pro Funktion. Ein Agent darf 6–8 tragen,
NUR bei nahezu 100 % Coverage — die Coverage bezahlt den Spielraum.
- Eine Funktion mit hohem CRAP hat genau zwei Ausgänge: herunter-refactoren oder
voll abdecken. Nie die Schwelle senken, um zu bestehen.
Wessen Schulden sind das — AUTHORED / WORSENED / UNCHANGED
Ein absoluter Score versteckt, wessen Schulden es sind. Teile jedes Komplexitäts-
und CRAP-Delta gegen die Baseline vor der Änderung auf:
- AUTHORED — Funktionen, die diese Änderung erzeugt hat. Die volle Latte gilt.
- WORSENED — bestehende Funktionen, die diese Änderung verschlechtert hat. Das
Delta wird dieser Änderung angelastet; es muss zurück auf Baseline oder besser.
- UNCHANGED — bestehende Schulden, die die Änderung nie berührt hat. Berichten,
ablegen, nie dieser Änderung anlasten — und nie als Deckung nutzen, um den
Spießrutenlauf zu überspringen.
Mutations-Regeln (begrenzt, nie leichtsinnig)
- Nie der geteilte Working Tree. Mutiere in einem Scratch-Checkout, geschnitten
vom committeten HEAD. Schmutzige Ziel- oder Testdateien = verweigern; erst
committen.
- Kosten werden gemessen, nie angenommen. Stoppe die gescopte Suite einmal,
berichte ETA = Baseline x Mutantenzahl, BEVOR irgendetwas ausgegeben wird.
Biete einen Dry Run an.
- Begrenzt und wiederaufnehmbar. Deckle Mutanten und Minuten. Ein Budget-Stopp
ist eine Pause mit Checkpoint, kein Fehlschlag — wieder aufnehmen und fertig
machen.
- Coverage zuerst. Mutiere nur abgedeckte Zeilen; eine unabgedeckte Zeile ist
eine Coverage-Lücke, die das CRAP-Gate schon gefangen hat.
- Nur im Scope. Mutiere, was der Diff berührt hat, nie das ganze Repo.
- Ein wirklich äquivalenter Mutant darf widerlegt statt getötet werden — mit
aufgeschriebener Widerlegung, nie still übersprungen.
- Kein Mutation-Tool für deinen Stack? Halte das im Landing-Report fest und
stütze dich auf das CRAP-Gate — nie still überspringen.
Das Geschmacks-Review (zuletzt, und leicht)
Deterministische Gates zuerst; gib ein Modell nur dort aus, wo Denken das einzige
Werkzeug ist. Der Reviewer ist ein Modell aus einer anderen Familie als der
Builder — der Builder bewertet nie die eigene Arbeit. Er beurteilt nur Design und
Geschmack: Benennung, vermischte Belange, Interface-Breite und die sechs Gerüche —
Starrheit, Zerbrechlichkeit, Unbeweglichkeit, unnötige Komplexität, unnötige
Wiederholung, Undurchsichtigkeit. Die Arithmetik haben die Gates schon erledigt.
Der Handwerks-Boden, den das Review hält: Funktionen klein, tun eine Sache, wenige
Argumente, keine Flag-Argumente, ehrliche Namen; tiefe Module — ein kleines
Interface, das echte Logik verbirgt; Tests schnell, unabhängig, wiederholbar, ein
Verhalten pro Assertion.
Harte Regeln (eine gebrochen, und der Skill ist gescheitert)
- Nie eine Schwelle senken oder das Mutationsset schwächen, um einen Pass zu
erzwingen.
- Nie den geteilten Working Tree mutieren; nie unbegrenzt laufen.
- Nie UNCHANGED-Schulden der aktuellen Änderung anlasten.
- Ein Test, der nicht fehlschlagen kann, ist Theater — Mutation-Testing beweist,
welche Tests echt sind.
- Sag die echten Kosten — Maschinenzeit ist billig, Regressionen sind es nicht.
Nie Grün faken, um die Stunde zu sparen.
Passt gut zu
Gerüst-Credit: Robert C. Martin, Clean Code (2008); Alberto Savoia &
Bob Evans, die CRAP-Metrik (2007); John Ousterhout, deep modules
(A Philosophy of Software Design, 2018); Pocock, M., & Martin, R. C.
(2026, Aug 19). LIVE: Uncle Bob on Software Fundamentals in the Age of AI
[Video]. YouTube. https://www.youtube.com/watch?v=zcLPGC-tvgk — Quelle des
Agenten-CRAP-Bands und der Coverage-first-Mutation. Die Komposition und die
harten Regeln hier sind BACKS AIOS.
1---2name: clean-code-gauntlet-23description: Nutze das beim Härten oder Landen jedes Builds — Agent, Service, Library — wenn du eine deterministische Qualitätslatte willst statt eines Zeile-für-Zeile-Reviews. Fährt Sniper-Tests, den CRAP-Score (Komplexität x Coverage) und begrenztes Mutation-Testing, dann ein leichtes Geschmacks-Review. Trigger words: clean code, gauntlet, unc, uncle bob, crap score, crap, mutation testing, harden, complexity, coverage, quality bar, Spießrutenlauf, Qualitätslatte, Komplexität, Testabdeckung, härten.4license: MIT5---67# Clean Code Gauntlet8**Effort:** heavy — echte Rechenzeit: Coverage- und Komplexitäts-Läufe plus ein begrenzter Mutations-Durchgang, dann ein Geschmacks-Modell; investier das in Änderungen, die ausgeliefert werden. Beseitigt: menschliches Zeile-für-Zeile-Review ganzer Diffs und die falsch-grünen Tests, hinter denen sich eine Regression versteckt.910## Warum es das gibt1112Unordentlicher Code lässt Agenten strampeln, und Regeln, die in einem langen13Prompt vergraben sind, verblassen mitten im Kontext — deterministische Checks14verblassen nie. Also fahre Clean Code als **Spießrutenlauf, den der Code bestehen15muss**, nicht als Prosa, die sich das Modell merken soll.1617**Messen, nicht reviewen.** Gate auf Zahlen, die ein Tool berechnet: Coverage,18zyklomatische Komplexität (eine Zählung unabhängiger Pfade durch eine Funktion),19Modulgröße, Mutation-Kills. Menschen und Modelle auditieren Stichproben — nie20ganze Diffs.2122## Die Kette (in Reihenfolge fahren; jede Stufe stoppt laut bei Fehlschlag)23241. **Sniper-Tests grün.** Fahre nur die Testdateien, die abdecken, was der Diff25 berührt hat — siehe [sniper-testing](../sniper-testing/SKILL.md). Eine rote26 Baseline heißt: stoppen und fixen; nie auf Rot mutieren oder bewerten.272. **CRAP unter der Schwelle** auf echten Coverage-Daten (siehe das Gate unten).28 Riss → die Funktion herunter-refactoren oder voll abdecken. Nie die Latte29 senken.303. **Mutation-Testing: null Überlebende im Scope.** Ein Überlebender überführt die31 TESTS, nicht den Code — stärke den Test, der ihn hätte fangen müssen.324. **Leichtes Geschmacks-Review** — ein Modell beurteilt nur, was Zahlen nicht33 können.3435## Tools, die das berechnen3637| Stack | Tools |38| --- | --- |39| Python | coverage.py + radon + mutmut |40| JS/TS | c8 (oder istanbul) + Stryker |41| Go | go test -cover + gocyclo + go-mutesting |42| Rust | cargo-tarpaulin + cargo-mutants |43| Java | JaCoCo + PIT |44| Andere | irgendein Coverage-% + irgendein Zähler für zyklomatische Komplexität |4546Eine Befehlsform pro Stufe:47- Coverage: `coverage run -m pytest <sniper files> && coverage report` (JS/TS: `npx c8 vitest run <files>`)48- Komplexität: `radon cc -s <changed files>`49- Mutation: `mutmut run --paths-to-mutate <changed files>` (JS/TS: `npx stryker run --mutate "<glob>"`)5051## Das CRAP-Gate5253```54CRAP(m) = comp(m)^2 * (1 - cov(m)/100)^3 + comp(m)55```5657- Bei 100 % Coverage kollabiert der Score auf die Komplexität selbst.58- 30 ist die klassische „crappy“-Linie (Komplexität 5 bei null Coverage erreicht59 sie).60- Menschen halten grob 4–5 Komplexität pro Funktion. Ein Agent darf 6–8 tragen,61 NUR bei nahezu 100 % Coverage — die Coverage bezahlt den Spielraum.62- Eine Funktion mit hohem CRAP hat genau zwei Ausgänge: herunter-refactoren oder63 voll abdecken. **Nie die Schwelle senken, um zu bestehen.**6465## Wessen Schulden sind das — AUTHORED / WORSENED / UNCHANGED6667Ein absoluter Score versteckt, wessen Schulden es sind. Teile jedes Komplexitäts-68und CRAP-Delta gegen die Baseline vor der Änderung auf:6970- **AUTHORED** — Funktionen, die diese Änderung erzeugt hat. Die volle Latte gilt.71- **WORSENED** — bestehende Funktionen, die diese Änderung verschlechtert hat. Das72 Delta wird dieser Änderung angelastet; es muss zurück auf Baseline oder besser.73- **UNCHANGED** — bestehende Schulden, die die Änderung nie berührt hat. Berichten,74 ablegen, nie dieser Änderung anlasten — und nie als Deckung nutzen, um den75 Spießrutenlauf zu überspringen.7677## Mutations-Regeln (begrenzt, nie leichtsinnig)7879- **Nie der geteilte Working Tree.** Mutiere in einem Scratch-Checkout, geschnitten80 vom committeten HEAD. Schmutzige Ziel- oder Testdateien = verweigern; erst81 committen.82- **Kosten werden gemessen, nie angenommen.** Stoppe die gescopte Suite einmal,83 berichte ETA = Baseline x Mutantenzahl, BEVOR irgendetwas ausgegeben wird.84 Biete einen Dry Run an.85- **Begrenzt und wiederaufnehmbar.** Deckle Mutanten und Minuten. Ein Budget-Stopp86 ist eine Pause mit Checkpoint, kein Fehlschlag — wieder aufnehmen und fertig87 machen.88- **Coverage zuerst.** Mutiere nur abgedeckte Zeilen; eine unabgedeckte Zeile ist89 eine Coverage-Lücke, die das CRAP-Gate schon gefangen hat.90- **Nur im Scope.** Mutiere, was der Diff berührt hat, nie das ganze Repo.91- Ein wirklich äquivalenter Mutant darf widerlegt statt getötet werden — mit92 aufgeschriebener Widerlegung, nie still übersprungen.93- **Kein Mutation-Tool für deinen Stack?** Halte das im Landing-Report fest und94 stütze dich auf das CRAP-Gate — nie still überspringen.9596## Das Geschmacks-Review (zuletzt, und leicht)9798Deterministische Gates zuerst; gib ein Modell nur dort aus, wo Denken das einzige99Werkzeug ist. Der Reviewer ist ein Modell aus einer anderen Familie als der100Builder — der Builder bewertet nie die eigene Arbeit. Er beurteilt nur Design und101Geschmack: Benennung, vermischte Belange, Interface-Breite und die sechs Gerüche —102Starrheit, Zerbrechlichkeit, Unbeweglichkeit, unnötige Komplexität, unnötige103Wiederholung, Undurchsichtigkeit. Die Arithmetik haben die Gates schon erledigt.104105Der Handwerks-Boden, den das Review hält: Funktionen klein, tun eine Sache, wenige106Argumente, keine Flag-Argumente, ehrliche Namen; tiefe Module — ein kleines107Interface, das echte Logik verbirgt; Tests schnell, unabhängig, wiederholbar, ein108Verhalten pro Assertion.109110## Harte Regeln (eine gebrochen, und der Skill ist gescheitert)111112- Nie eine Schwelle senken oder das Mutationsset schwächen, um einen Pass zu113 erzwingen.114- Nie den geteilten Working Tree mutieren; nie unbegrenzt laufen.115- Nie UNCHANGED-Schulden der aktuellen Änderung anlasten.116- Ein Test, der nicht fehlschlagen kann, ist Theater — Mutation-Testing beweist,117 welche Tests echt sind.118- Sag die echten Kosten — Maschinenzeit ist billig, Regressionen sind es nicht.119 Nie Grün faken, um die Stunde zu sparen.120121## Passt gut zu122123- [sniper-testing](../sniper-testing/SKILL.md) — wählt den Test-Scope für Stufe 1124- [red-first](../red-first/SKILL.md) — der fehlschlagende Contract vor jedem Build125- [blind-eval](../blind-eval/SKILL.md) — Keep-or-Revert, wenn Geschmack die Frage ist126- [blind-tribunal](../blind-tribunal/SKILL.md) — ein volleres, benotetes Urteil vor dem Landen127128> Gerüst-Credit: Robert C. Martin, *Clean Code* (2008); Alberto Savoia &129> Bob Evans, die CRAP-Metrik (2007); John Ousterhout, deep modules130> (*A Philosophy of Software Design*, 2018); Pocock, M., & Martin, R. C.131> (2026, Aug 19). LIVE: Uncle Bob on Software Fundamentals in the Age of AI132> [Video]. YouTube. https://www.youtube.com/watch?v=zcLPGC-tvgk — Quelle des133> Agenten-CRAP-Bands und der Coverage-first-Mutation. Die Komposition und die134> harten Regeln hier sind BACKS AIOS.