Code-Audit für KI-generierte CodebasesCode audit for AI-generated codebases

Dein Modell hat es geschrieben.
Jemand sollte es lesen.
Your model wrote it.
Somebody should read it.

In vier Tagen weißt du, was in deiner Codebase steckt: Architektur, Code-Qualität, Performance, Code Health und die Security-Basics. Du bekommst einen Report, Fix-Prompts für jeden Fund und ein Harness, das die Checks danach dauerhaft weiterfährt. In four days you know what is in your codebase: architecture, code quality, performance, code health and the security basics. You get a report, fix prompts for every finding, and a harness that keeps running the checks afterwards.

loki@dev:~$

»read-only snapshotread-only snapshotok
»stack erkanntstack detectedpython · typescript · docker
»architekturgrenzenarchitecture boundaries3 verletzt
»performance-pfadeperformance paths6 n+1-queries
»security-basics, owasp top 10security basics, owasp top 1014 funde
»secrets im verlaufsecrets in history1 gültig
»testverhältnistest ratio0.04
»report + fix-promptsreport + fix prompts23
»harness konfiguriertharness configuredok
2 kritischcritical 5 hochhigh 7 mittelmedium beispiellauf, ein repo, vier tageexample run, one repo, four days
anfrage per mailask by mail

Zwei Sätze reichen. Du bekommst eine kurze Fragenliste zurück und danach einen Festpreis, beides schriftlich und kostenlos. Two sentences is enough. You get a short list of questions back and then a fixed price, both in writing and free of charge.

loki@dev:~$ whoami --target

für wenwho it is for

Teams, die mit Claude Code, Cursor, Copilot oder Codex schnell etwas gebaut haben und vor dem Launch wissen wollen, wo es weh tut. Prototypen, die zu Produkten geworden sind. Codebases, in denen seit Monaten niemand mehr systematisch gelesen hat, was das Modell abgeliefert hat. Teams who built something fast with Claude Code, Cursor, Copilot or Codex and want to know where it hurts before launch. Prototypes that turned into products. Codebases where nobody has systematically read what the model shipped in months.

Wenn dein Code seit fünf Jahren von einem eingespielten Team gepflegt wird und du eine ISO-27001-Zertifizierung brauchst, bin ich der falsche Ansprechpartner. Schreib es mir trotzdem, dann sage ich dir, wen du stattdessen brauchst. If your code has been maintained by a settled team for five years and you need an ISO 27001 certification, I am the wrong person. Write to me anyway and I will tell you who you actually need.

loki@dev:~$ vibe-check --list-checks

was ich prüfewhat I check

architekturarchitecture

  • Wo liegen die Grenzen, und halten sieWhere the boundaries are and whether they hold
  • Kopplung zwischen Services und ModulenCoupling between services and modules
  • Duplikate, die auseinandergedriftet sindDuplicates that have drifted apart
  • Datenmodell und ZuständigkeitenData model and ownership
  • Build- und Deploy-Kette, baut es offlineBuild and deploy chain, does it build offline

code-qualitätcode quality

  • Komplexität und God-KlassenComplexity and god classes
  • Lint-Befunde, und wie viele davon automatisch behebbar sindLint findings, and how many are auto-fixable
  • Fehlerbehandlung: wo werden Exceptions geschlucktError handling: where exceptions get swallowed
  • Namensgebung und Lesbarkeit an den heißen StellenNaming and readability in the hot spots
  • Toter Code und Copy-Paste aus dem ModellDead code and copy-paste from the model

performanceperformance

  • N+1-Abfragen und Queries in SchleifenN+1 queries and queries inside loops
  • Fehlende Indizes auf Spalten, die gefiltert werdenMissing indexes on columns that get filtered
  • Blockierendes IO auf heißen PfadenBlocking IO on hot paths
  • Unbegrenzte Ergebnismengen, fehlende PaginationUnbounded result sets, missing pagination
  • Caching: gibt es eins, und greift esCaching: does it exist, and does it hit
  • Algorithmische Ausrutscher, die mit den Daten wachsenAlgorithmic slips that grow with your data

Ich lese das im Code. Lasttest und Profiling in Produktion sind nicht dabei, ich sage dir aber, an welchen Stellen sich beides lohnt. I read this in the code. Load testing and production profiling are not included, but I tell you at which points both would pay off.

code healthcode health

  • Testverhältnis und Coverage, und ob es in CI durchgesetzt wirdTest ratio and coverage, and whether CI enforces it
  • Abhängigkeiten: was hängt drin, was ist verwundbar, was wird gescanntDependencies: what is pulled in, what is vulnerable, what gets scanned
  • Dokumentation: reicht sie, um jemanden neu anzusetzenDocumentation: enough to onboard somebody new
  • Bus-Faktor: wie viel Code gehört Leuten, die weg sindBus factor: how much code is owned by people who left
  • CI/CD: welche Gates existieren, welche sind abgeschaltetCI/CD: which gates exist, which are switched off

security-basicssecurity basics

  • OWASP Top 10, Kategorie für Kategorie durchgegangenOWASP Top 10, walked category by category
  • Authentifizierung und Autorisierung: wer darf was, und wo wird es vergessenAuthentication and authorisation: who may do what, and where it gets forgotten
  • Secrets im Repo und in der Git-HistorieSecrets in the repo and in the git history
  • Injection, Deserialisierung, Upload-Pfade, TLSInjection, deserialisation, upload paths, TLS
  • Konfiguration und Deployment: offene Endpunkte, Defaults, die in Produktion stehen bleibenConfiguration and deployment: open endpoints, defaults left in production

Das sind die Basics, und die sitzen in KI-generiertem Code erfahrungsgemäß am schlechtesten. Einen vollständigen Penetrationstest macht jemand anderes, dafür gibt es Spezialisten mit anderem Werkzeug. Mein Teil findet die Probleme, die vorher im Code stehen, und macht den Pentest danach günstiger. These are the basics, and in AI-generated code they are usually the weakest part. A full penetration test is somebody else's job, there are specialists with different tooling for that. My part finds the problems that sit in the code beforehand, which makes that pentest cheaper.

loki@dev:~$ vibe-check --show-toolchain

wie ich arbeitehow I work

Ich fahre mehrere Werkzeuge parallel, prüfe jeden Treffer von Hand nach und setze daraus ein Bild zusammen. I run several tools in parallel, verify every hit by hand, and assemble one picture out of it.

toolchainread-only, reproduzierbarread-only, reproducible
  • Klassische statische Analyse.Classic static analysis. Linter, Komplexitätsmessung, Dependency- und Container-Scanner, je nach Stack. Etablierte Werkzeuge, deren Aussagen jemand anders nachprüfen kann.Linters, complexity metrics, dependency and container scanners, depending on the stack. Established tools whose output somebody else can check.
  • Git-Archäologie.Git archaeology. Wer hat was geschrieben, was ändert sich ständig, wo liegt Wissen fest. Das steht in keinem Linter-Report.Who wrote what, what churns constantly, where knowledge is stuck. No linter report shows that.
  • Handarbeit.Manual reading. Die kritischen Pfade lese ich selbst: Anmeldung, Rechteprüfung, Datenzugriff, Upload, Deployment. Genau dort sind Werkzeuge blind.I read the critical paths myself: login, permission checks, data access, upload, deployment. That is exactly where tools are blind.
  • Architekturmethodik.Architecture method. Grenzen, Kopplung, Abhängigkeitsrichtung, Datenhoheit. Handwerk, keine Messung.Boundaries, coupling, dependency direction, data ownership. Craft, not measurement.
  • KI-Werkzeuge, optional.AI tooling, optional. Als Beschleuniger beim Lesen großer Codebases, nie als einzige Quelle, und nur mit deiner Freigabe. Jeder Fund landet erst im Report, nachdem ich ihn selbst im Code gesehen habe.As an accelerator for reading large codebases, never as the only source, and only with your sign-off. No finding enters the report before I have seen it in the code myself.

Ein Werkzeug allein liefert Zahlen, und Zahlen sortieren sich nicht selbst. Ein Lint-Befund wird erst wichtig, wenn er auf einem Pfad sitzt, der auch Rechte prüft. Eine langsame Abfrage wird erst dringend, wenn dieselbe Tabelle im nächsten Quartal das Zehnfache an Zeilen hat. Diese Verbindungen herzustellen ist die Arbeit, für die du mich bezahlst. One tool on its own produces numbers, and numbers do not sort themselves. A lint finding only matters once it sits on a path that also checks permissions. A slow query only becomes urgent once the same table holds ten times the rows next quarter. Making those connections is the work you are paying me for.

loki@dev:~$ cat report/scorecard.txt

so sieht ein ergebnis auswhat a result looks like

Jede Dimension bekommt eine Zahl von 0 bis 10 und ihre Begründung. Fahr über eine Zeile oder klick auf [?], dann siehst du ein echtes Beispiel für die Art Problem, die dahinter steckt. Every dimension gets a number from 0 to 10 and its justification. Hover a row or hit [?] to see a real example of the kind of problem behind it.

scorecard 0 … 10 [?] = beispiel[?] = example
security-basicssecurity basics 5/10
architekturarchitecture 4/10
performance 4/10
code-qualitätcode quality 6/10
tests & CItests & CI 3/10
abhängigkeitendependencies 4/10
dokumentationdocumentation 5/10
bus-faktorbus factor 3/10

Beispielwerte aus einem echten Lauf, anonymisiert. Deine Zahlen werden anders aussehen, die Aufschlüsselung ist dieselbe. Example values from a real run, anonymised. Your numbers will look different, the breakdown is the same.

loki@dev:~$ tree ./vibe-check-report/

was du bekommstwhat you get

Vier Dinge: den Report, die Deep Dives, einen Fix-Prompt pro Fund und ein Harness, das die Checks danach dauerhaft weiterfährt. Four things: the report, the deep dives, one fix prompt per finding, and a harness that keeps running the checks afterwards.

.
├── 00-ONEPAGER.pdf              eine Seite für die Budgetfreigabeone page for the budget decision
├── 01-REPORT.md                 der Hauptreport, mit Scorecardthe main report, with scorecard
├── 01-REPORT.docx               derselbe Report, weiterreichbarthe same report, forwardable
├── reports/                     ein Deep Dive pro Themaone deep dive per topic
│   ├── ARCHITECTURE.md
│   ├── CODE-QUALITY.md
│   ├── PERFORMANCE.md
│   ├── SECURITY-BASICS.md       pro OWASP-Kategorie, mit Datei und Zeileper OWASP category, with file and line
│   └── TESTS-AND-CI.md
├── fixes/                       ← spart dir die Nacharbeit← saves you the rework
│   ├── 001-authz-luecke-preview.md
│   ├── 002-endpunkt-oeffentlich.md
│   └── … 21 weitere, nach Schwere sortiert… 21 more, sorted by severity
├── harness/                     ← läuft danach immer weiter← keeps running afterwards
│   ├── README.md
│   ├── prompts/
│   └── ci/
└── scripts/                     jede Zahl selbst nachrechenbarevery number recomputable yourself

Der Report ist das Kernstück.The report is the centrepiece. Executive-Zusammenfassung, Scorecard mit Begründung pro Dimension, jeder Fund mit Schwere, Datei und Zeile, und eine nach Aufwand und Wirkung sortierte Empfehlungsliste. Als Markdown und als Word-Dokument, damit du es intern weiterreichen kannst, ohne es neu zu schreiben. Executive summary, scorecard with a justification per dimension, every finding with severity, file and line, and a recommendation list sorted by effort and impact. As Markdown and as a Word document, so you can pass it on internally without rewriting it.

Jede Kennzahl nennt das Skript, das sie erzeugt hat, und die Rohdaten liegen dabei. Du kannst jede Zahl im Report nachrechnen, ohne mir glauben zu müssen, und dein Team kann es in sechs Monaten auch noch. Every metric names the script that produced it, and the raw data ships with it. You can recompute every number in the report without taking my word for it, and your team can still do that in six months.

loki@dev:~$ claude -p "$(cat fixes/001-authz-luecke-preview.md)"

die fix-promptsthe fix prompts

Ein Report sagt dir, was kaputt ist, und lässt dich dann damit allein. Deshalb liegt pro Fund ein Prompt dabei: Kontext, die konkreten Dateipfade, der Fix und ein Verifikationsschritt. Du wirfst ihn in dein Agent-Setup und arbeitest die Liste ab, in der Reihenfolge, die im Report steht. A report tells you what is broken and then leaves you alone with it. So every finding comes with a prompt: context, the actual file paths, the fix and a verification step. Drop it into your agent setup and work the list, in the order the report gives you.

fixes/001-authz-luecke-preview.mdkritischcritical
## BefundFinding
Der Preview-Endpunkt prüft eine Tenant-Berechtigung, seine drei
Geschwister-Endpunkte prüfen eine Admin-Rolle. Jeder Nutzer mit
Leserecht auf einen Mandanten erreicht damit den Renderer.The preview endpoint checks a tenant permission, its three sibling
endpoints check an admin role. Any user with read access to a single
tenant therefore reaches the renderer.

## DateienFiles
  src/report/preview.controller.ts:44
  src/report/render.service.ts:120

## Fix
- requireTenantPermission(ctx, "report:read")
+ requireAdminRole(ctx)

## VerifikationVerification
Test: Nutzer ohne Admin-Rolle bekommt 403 auf /preview.
Prüfe zusätzlich, dass alle vier Endpunkte dieselbe Guard-Funktion
verwenden, und nicht vier Kopien davon.Test: a user without the admin role gets 403 on /preview.
Also check that all four endpoints use the same guard function,
and not four copies of it.

Beispiel, generisch gehalten. Echte Prompts nennen deine Pfade und deine Zeilennummern. Example, kept generic. Real prompts name your paths and your line numbers.

loki@dev:~$ cat harness/README.md | head -20

was danach läuftwhat runs afterwards

Ein Audit beschreibt den Stand an einem Tag. Drei Monate später stimmt die Hälfte nicht mehr, weil weiter generiert wurde. Deshalb liefere ich eine Anleitung und die Konfiguration für ein AI-Harness, das die Checks aus diesem Audit regelmäßig selbst fährt. An audit describes the state on one day. Three months later half of it is wrong again, because generation continued. So I deliver instructions and the configuration for an AI harness that runs the checks from this audit on a schedule, by itself.

harness/läuft bei dir, ohne michruns on your side, without me
  • Vor dem Commit.Before the commit. Hooks, die Formatierung, Linting und Secret-Scanning erledigen, bevor etwas ins Repo kommt.Hooks that handle formatting, linting and secret scanning before anything lands in the repo.
  • In der Pipeline.In the pipeline. Die Gates, die bei dir fehlen oder abgeschaltet sind, als fertige Konfiguration mit sinnvollen Schwellwerten.The gates you are missing or have switched off, as ready configuration with sensible thresholds.
  • Wöchentlich.Weekly. Ein Prompt-Set für deinen Coding-Agenten, das Architektur, Performance und Security-Basics erneut prüft und einen kurzen Diff zum letzten Lauf schreibt.A prompt set for your coding agent that re-checks architecture, performance and security basics and writes a short diff against the last run.
  • Für neue Features.For new features. Regeln für dein Agent-Setup, damit die gefundenen Muster nicht sofort wieder neu generiert werden.Rules for your agent setup, so the patterns I found do not get generated right back in.

Wie so ein Harness aussieht, habe ich im Blog aufgeschrieben. Was du bekommst, ist die auf deinen Stack angepasste Variante davon. I have written up what such a harness looks like. What you get is that, adapted to your stack.

loki@dev:~$ vibe-check --explain --offline

ablaufhow it runs

deine mailyour mail fragenlistequestion list festpreisfixed price übergabehandover lesen & messenread & measure lieferungdelivery rückfragenfollow-up questions

Bei einem einzelnen Repository normalerweise innerhalb einer Woche. For a single repository usually inside a week.

Alles läuft schriftlich.Everything runs in writing. Ich arbeite asynchron, per Mail. Das Scoping ist eine Fragenliste, die du beantwortest wenn es dir passt, und die Rückfragen zum Report laufen genauso. Kein Termin, den wir drei Mal verschieben, und du hast alles schwarz auf weiß, auch in sechs Monaten noch. Wenn du an einer Stelle lieber telefonieren willst, machen wir das, es ist nur nirgends nötig. I work asynchronously, by mail. Scoping is a list of questions you answer when it suits you, and follow-up questions on the report work the same way. No meeting we reschedule three times, and you have everything in writing, still readable in six months. If you would rather talk at some point we can, it is just never required.

dein code und deine datenyour code and your data

Das ist der Teil, an dem die meisten Audits unangenehm werden. Deshalb steht er hier vor dem Preis. This is the part where most audits get uncomfortable. That is why it sits before the price.

Rein offline, rein lesend.Offline only, read only. Ich bekomme ein Archiv oder einen read-only Zugang, sonst nichts. Deine Systeme sehe ich nie von innen, und in deiner Produktion läuft nichts von mir. Im Repo verändere ich keine Zeile, alle Skripte lesen nur. I get an archive or read-only access, nothing else. I never see your systems from the inside, and nothing of mine runs in your production. I change no line in the repo, every script only reads.

Der Code bleibt auf verschlüsselten Rechnern.The code stays on encrypted machines. Vollverschlüsselte Datenträger, kein Sync in eine Cloud, keine Weitergabe an Dritte, keine Subunternehmer. Full-disk encryption, no cloud sync, no sharing with third parties, no subcontractors.

Sprachmodelle nur nach deiner Freigabe.Language models only with your sign-off. Ich arbeite mit KI-Werkzeugen. Wenn dabei Teile deines Codes an einen Anbieter gehen, sage ich dir vorher welcher, wir halten es schriftlich fest, und du kannst es ablehnen. Dann läuft die Analyse lokal, mit denselben Skripten und etwas mehr Zeit für das Lesen. I work with AI tooling. If parts of your code would go to a provider, I tell you which one up front, we put it in writing, and you can say no. Then the analysis runs locally, with the same scripts and a little more reading time.

Löschung mit Bestätigung.Deletion, confirmed in writing. 14 Tage nach der Abnahme lösche ich Arbeitskopien und Rohdaten und schicke dir die Bestätigung. Was ich behalte, sind die Skripte, und die kennen deinen Code nicht. 14 days after sign-off I delete working copies and raw data and send you the confirmation. What I keep are the scripts, and they know nothing about your code.

NDA und AVV gehören dazu.NDA and a DPA are part of it. NDA selbstverständlich, Auftragsverarbeitungsvertrag auf Wunsch. Wenn im Repo personenbezogene Daten liegen, etwa Dumps oder echte Testdaten, sage ich es dir, und wir klären die Rechtsgrundlage bevor ich anfange. NDA as a matter of course, a data processing agreement on request. If the repo contains personal data, dumps or real test data for instance, I tell you, and we settle the legal basis before I start.

Keine Namen im Report.No names in the report. Der Bus-Faktor steht ohne Personennamen drin. Eine Auswertung pro Person liefere ich nur, wenn du sie ausdrücklich willst, weil sie mitbestimmungsrelevant sein kann. Bus factor is reported without personal names. A per-person breakdown only if you explicitly ask for it, because it can trigger works council co-determination.

Der Offline-Ansatz ist eine bewusste Entscheidung. Ein dynamischer Test braucht Freigaben, die du in einer Woche nicht bekommst. Statisch komme ich in vier Tagen an die Funde, die in KI-generiertem Code ohnehin am häufigsten sind. The offline approach is a deliberate decision. A dynamic test needs sign-offs you will not get inside a week. Statically I reach the findings that dominate AI-generated code in four days.

loki@dev:~$ vibe-check --limits

wo mein audit aufhörtwhere my audit stops

Ich sage dir das lieber jetzt als in der Rechnung. I would rather tell you now than in the invoice.

Kein Penetrationstest.Not a penetration test. Ich lese Code, ich greife kein laufendes System an. Keine Exploits gegen deine Umgebung, keine Infrastrukturtests. Wenn ein Kunde oder ein Auditor einen Pentest verlangt, brauchst du einen Pentest, und ich sage dir, was er nach meinem Durchgang noch finden sollte. I read code, I do not attack a running system. No exploits against your environment, no infrastructure testing. If a customer or an auditor demands a pentest, you need a pentest, and I will tell you what it should still find after my pass.

Kein Lasttest.No load test. Performance lese ich im Code. Was deine Datenbank unter echter Last macht, zeigt nur eine Messung in deiner Umgebung. I read performance in the code. What your database does under real load only shows up in a measurement in your environment.

Keine Zertifizierung, kein Testat.No certification, no attestation. Du bekommst einen Report von einem Software-Architekten, der beruflich fremden Code liest. Kein Siegel, das du an einen Auditor weitergeben kannst. You get a report from a software architect who reads other people's code for a living. Not a seal you can hand to an auditor.

loki@dev:~$ vibe-check --help | grep -A5 SCOPE

preisepricing

Fixpreis, gestaffelt nach Größe. Keine Stundenzettel, keine Überraschung auf der Rechnung. Fixed price, banded by size. No timesheets, no surprise on the invoice.
SCOPE FIXPREISFIXED PRICE
--repos=1 --loc<20k1.200 €
--repos<=3 --loc<60k2.500 €
--repos=* nach der Fragenlisteafter the question listangebotquote
--no-ai rein lokal, ohne KI-Werkzeugefully local, no AI tooling+ 30 %

--no-ai Wenn dein Code kein Sprachmodell sehen darf, egal welches, dann läuft der ganze Durchgang rein lokal. Die Skripte sind dieselben und die Zahlen kommen identisch heraus, aber ich lese die kritischen Pfade komplett von Hand. Das dauert etwa ein Drittel länger, deshalb der Aufschlag. Das Ergebnis ist dasselbe, es kostet mich nur mehr Zeit. If no language model may see your code, whichever one, the whole pass runs fully local. The scripts are the same and the numbers come out identical, but I read the critical paths entirely by hand. That takes roughly a third longer, hence the surcharge. The result is the same, it just costs me more time.

Report, Deep Dives, Fix-Prompts und Harness sind immer dabei, nie als Aufpreis. Das Scoping kostet nichts, und wenn ich aus deinen Antworten sehe, dass sich das Audit für dich nicht lohnt, schreibe ich dir das statt ein Angebot zu schicken. Report, deep dives, fix prompts and harness are always included, never an add-on. Scoping costs nothing, and if your answers tell me the audit is not worth it for you, I write you that instead of sending an offer.

loki@dev:~$ cat checkliste.txt

was ich brauchewhat I need

  • Eine schriftliche Freigabe von dem, dem der Code gehört.Written authorisation from whoever owns the code. Nicht von dir, wenn du ihn nur betreust.Not from you, if you only maintain it.
  • Das Archiv oder den read-only Zugang.The archive or the read-only access.
  • Eine Mailadresse für die zwei oder drei Fragen, die sich beim Lesen nicht klären lassen. Antwort innerhalb von zwei Werktagen reicht mir.One mail address for the two or three questions reading alone will not answer. An answer within two working days is enough for me.
  • Eine Entscheidung vorab:One decision up front: Was passiert, wenn ich ein gültiges Credential im Repo finde? Wen rufe ich an, und wie schnell? Frag mich das nicht erst, wenn es passiert ist. Mir ist genau das schon in einem Repository begegnet, mitten in der Git-Historie.what happens if I find a live credential in the repo? Who do I call, and how fast? Do not ask me that once it has already happened. I have run into exactly this in a repository, sitting in the git history.

kontaktcontact

Zwei Sätze zum Projekt reichen: welcher Stack, wie viele Repositories, und was dir Sorgen macht. Du bekommst innerhalb eines Werktags eine Antwort mit der Fragenliste, und danach den Festpreis. Ohne Termin, ohne Kalenderlink. Two sentences about the project is enough: which stack, how many repositories, and what worries you. You get a reply within one working day with the question list, and the fixed price after that. No meeting, no calendar link.

loki@dev:~$ mail -s "vibe check" blog@loki.dev

Torsten Zielke, Software-Architekt und Tech-Lead. Ich lese beruflich fremden Code und schreibe auf, was drin steht. Torsten Zielke, software architect and tech lead. I read other people's code for a living and write down what is in it.

Beispiel: security-basicsExample: security basics

Ein Debug-Endpunkt des Frameworks stand auf permitAll und war über den öffentlichen Ingress erreichbar. Ein Aufruf ohne Login rendert Datenbankpasswort, Client-Secret und den Schlüssel für die Feldverschlüsselung.A framework debug endpoint was set to permitAll and reachable through the public ingress. One unauthenticated call renders the database password, the client secret and the field encryption key.

Beispiel: architekturExample: architecture

Dasselbe Handler-Framework lag als Kopie in vier Services. Alle vier Kopien hatten unterschiedliche Checksummen, waren also längst auseinandergedriftet. Ein Fix an der Filterlogik muss vier Mal von Hand gemacht werden.The same handler framework existed as a copy in four services. All four copies had different checksums, so they had long drifted apart. A fix to the filter logic has to be applied by hand four times.

Beispiel: performanceExample: performance

Eine Listenansicht lud pro Zeile den Besitzer einzeln nach. Bei 500 Zeilen sind das 501 Abfragen. Dazu eine Filterspalte ohne Index, die bei jedem Aufruf einen vollen Tabellenscan auslöst.A list view loaded the owner separately for every row. At 500 rows that is 501 queries. Plus a filter column without an index, triggering a full table scan on every call.

Beispiel: code-qualitätExample: code quality

Eine Klasse mit über 2.000 Zeilen, die Validierung, Persistenz und Rechteprüfung gleichzeitig macht. Daneben 1.100 Lint-Befunde, die ein einziger Formatierungslauf beheben würde, und die niemand ausführt.A class of over 2,000 lines doing validation, persistence and permission checks at once. Alongside it 1,100 lint findings that a single formatting run would fix, which nobody runs.

Beispiel: tests & CIExample: tests & CI

Testverhältnis 0.04, also ein Zeile Test auf 25 Zeilen Code. Coverage wird gemessen und nirgends erzwungen. Die statische Analyse war in der Pipeline vorhanden, aber jeder Aufruf war auskommentiert.Test ratio 0.04, one line of test per 25 lines of code. Coverage is measured and enforced nowhere. Static analysis existed in the pipeline, but every invocation was commented out.

Beispiel: abhängigkeitenExample: dependencies

Ein gültiges Registry-Token lag im Repository, auffindbar in der Historie. Container-Images werden nirgends gescannt, eine eingebettete Laufzeit ist seit über einem Jahr ohne Sicherheitsupdates.A live registry token sat in the repository, findable in the history. Container images are scanned nowhere, and an embedded runtime has been without security updates for over a year.

Beispiel: dokumentationExample: documentation

Der neueste Service hatte Architekturentscheidungen dokumentiert und war in einem Tag zu verstehen. Der wichtigste und größte Service hatte eine README mit Build-Befehl. Genau dort sitzt das Geschäftsmodell.The newest service had its architecture decisions documented and was understandable in a day. The most important and largest service had a README with a build command. That is exactly where the business logic lives.

Beispiel: bus-faktorExample: bus factor

45 Prozent des lebenden Codes gehörten Leuten, die seit zwölf Monaten nichts mehr committet haben. Drei Personen verantworten über die Hälfte, und acht von elf Repositories haben genau einen Hauptautor.45 percent of the surviving code was owned by people who had not committed in twelve months. Three people account for over half, and eight of eleven repositories have exactly one majority author.