Kodegennemgang der beviser hver fejl — benchmarket

Kodegennemgang der beviser hver fejl — benchmarket

Bed en AI om at gennemgå din PR, og du får et pænt tjeklisteresultat: injection tjekket, secrets tjekket, auth tjekket, ser godt ud. Det ligner grundighed. Om den rent faktisk fandt noget, er en anden sag — og tjeklisten er præcis det, der skjuler forglemmelsen. Vi driver et katalog, der benchmark-tester Claude-skills til daglig, og da vi rettede vores egen benchmark mod en review-skill, vi allerede havde bedømt som bestået, gik den forbi en hardcoded secret, som den uvejledte baseline fangede. Listen havde ingen linje for det sted, så anmelderen kiggede aldrig.

Den forglemmelse er grunden til, at review-discipline findes — og hvorfor den findes i sin anden version. Den er gratis og MIT-licenseret: github.com/Skillproofdev/review-discipline. Hvert fund, den rapporterer, skal navngive et konkret input, der når koden og fører til et forkert resultat — ellers leveres det nedgraderet til [suspicion], aldrig fremstillet som et faktum. På vores seeded-bug-benchmark fanger den 18.5 af 21 plantede fejl med nul falske positiver og en påvist fejlvej for ~100% af fundene.

Hullet: enhver review-skill er en tjekliste, og tjeklister giver tunnelsyn

Før vi skrev en eneste linje, gennemgik vi 321 gennemtrawlede review-skills plus det selvstændige felt — inklusive Anthropics eget code-review-plugin. Tre mekanikker optrådte i ingen af dem som håndhævelige enkeltagent-regler. Alle tre kan spores tilbage til den samme fejl, vi så ske i vores benchmark.

En tjekliste fortæller anmelderen, hvad der skal kigges efter. Det er også en liste over, hvad der kigges forbi. Når kategorierne ikke omfatter fejlen, overlever fejlen — og værre endnu, gennemgangen kommer stadig tilbage grøn, fordi hver eneste boks, der findes, blev afkrydset. De to måder, en gennemgang fejler på, er at rapportere ubeviste gæt som fakta (støj) og stiltiende at springe en reel fejl over, fordi den er lille, eller fordi en mere skræmmende en tog al opmærksomheden (manglende dækning). En tjekliste er strukturelt god til at producere begge dele.

Anthropics plugin bekæmper støj-halvdelen med parallelle scorer-agenter, der stemmer om et konfidenstal. Det er en reel mekanisme, men den kræver flere agenter, og den adresserer slet ikke dæknings-halvdelen. Ingen leverer det, der vender tjeklistens form på hovedet: jag alt før du griber til en kategoriliste, bevis eller mærk hvert fund bagefter, og drop kun det, du reelt kan afvise — i én agent, i én installerbar fil.

Otte regler, tre af dem håndhæver ingen andre

Skillen er et sæt håndhævelige regler (fuld SKILL.md). De velkendte dele er der: P0–P3-alvorlighed med reelle definitioner i stedet for mavefornemmelser, diff-scope-disciplin (gennemgå ændringen, ikke hele kodebasen), manglende-test-bemærkninger knyttet til den ændrede adfærd, og nul ros-fyld. Delene ingen andre håndhæver:

  1. Ingen påvist fejlvej, intet fund. Hvert fund skal navngive et konkret input eller en tilstand, der når den markerede kode og fører til et forkert resultat. Kan du ikke konstruere en? Så leveres det som [suspicion], rangeret under ethvert bevist fund — aldrig som fakta. En ubevist påstand fremsat som en fejl er skillens ene forbudte output.
  2. To gennemløb, åben jagt først. Læs ændringen som en angriber uden nogen kategoriliste i hånden, og noter enhver anomali — ingen alvorlighedsgrænse, en ting, der bare lugter en anelse forkert, bliver stadig skrevet ned. Først derefter fejes den almindelige tjekliste igennem (secrets, injection, grænser, aritmetik, samtidighed …) for alt, den åbne jagt overså. Enhver konkurrent er tjeklisten; her kører den anden, med vilje.
  3. Afliv dit eget fund, før du rapporterer det. Ét ærligt afvisningsforsøg per fund — upstream-guards, tilsigtet adfærd, eksisterende testdækning, nåbarhed — og rapporten siger, hvad der blev tjekket. Afvisning er den eneste port, der må droppe et fund; "jeg gad ikke bevise det" bliver til et [suspicion], ikke en stille bortkastning. Fund, der reelt dør, dør stille.

Den bærende regel er rækkefølgen: bredde før dybde. Saml enhver anomali uden alvorlighedsgrænse, før du verificerer en eneste af dem, så dybdedykket i én fejl aldrig kan afkorte jagten på resten. Det lyder indlysende. Det er også præcis den regel, vores første version ikke havde — og grunden til, at den tabte.

Den ærlige benchmark (negative resultater inkluderet)

Seeded-bugs-protokol: rigtige kodeeksempler (~200–400 linjer hver, TypeScript / Python / JS) plantet med dokumenterede fejl af kendt alvorlighed — logik, sikkerhed, kantsager, samtidighed — med grundsandhed fastlagt før nogen kørsel. Rigtig, intakt kode forbliver i hvert eksempel for at måle falske positiver. Samme prompts, samme model; den eneste variabel er, om agenten læser SKILL.md først. Fuld metode: skillproof.dev/methodology.

4 eksempler, 21 plantede fejl, 12 bevidst raske falsk-positiv-fælder. Den interessante kolonne er ikke base-vs-skill — det er v1 vs v2, for det er vores egen benchmark, der tvang genopbygningen frem.

Metrik Base (uden skill) Skill v1 Skill v2
Plantede fejl fanget (af 21) 17.0 (81%) 16.5 (79%) 18.5 (88%)
P0-fangst (udnyttelig / datatab) 3/3 3/3 3/3
P1-fangst (forkert adfærd, realistisk vej) 7/7 7/7 7/7
P2-fangst (kant- / aritmetikveje) 6/7 4/7 7/7
Hardcoded-secret-probe fanget fanget fanget
Falsk-positiv-rate 5.6% (1 FP) 0% 0%
Fund med påvist fejlvej ~63% ~100% ~100%
[suspicion]-nedgraderinger (ærlige forbehold) 0 3 5
Ros- / fyldlinjer til stede ingen ingen

Læs den midterste kolonne, og du kan se den fejl, der gav skillen sit navn. v1 scorede 16.5 — under den uvejledte baselines 17. Den havde fejlvejs-disciplinen (den skar falske positiver ned til nul og påviste ~100% af sine fund), men den var dårligere til at finde fejl, fordi den låste sig fast på de skræmmende P0'er i ét eksempel og aldrig fejede de stille afrundingslinjer for penge igennem. Den fik tunnelsyn. Vores offentlige benchmark af en skill, vi havde bedømt som bestået, er det, der fangede det: v1 overså to reelle P2'er — en prorate /30-logikfejl og en int(amount × 100)-afrunding — som baselinen samlede op bare ved at læse lineært.

Løsningen var bredde-før-dybde-reglen. v2 samler enhver anomali uden alvorlighedsgrænse, før den verificerer nogen af dem. Resultat: P2 gik fra 4/7 til et rent 7/7 (den genvandt endda en tom-CSV StopIteration, som både base og v1 overså), den samlede genfindingsrate steg til 18.5 — forbi bases 17 — og disciplinen holdt: stadig nul falske positiver, stadig ~100% påviste veje, og flere ærlige [suspicion]-forbehold (5 mod 3) i stedet for færre. Fuld 3-vejs-bedømmelse er i bench/results/verdict.md.

En myte, benchmarken også aflivede, ligeud: hypotesen om tjekliste-tunnelsyn-på-secrets, som motiverede hele projektet, gentog sig ikke i den plantede kørsel — alle tre arme fangede hardcoded-secret-proben (S4-B1). Den oprindelige forglemmelse var reel, og den er det, der lærte os problemets form; den plantede benchmark viste bare, at secreten selv ikke er der, hvor bredden betaler sig. Kantsagerne med afrunding af penge er. Vi rapporterer den mekanisme, der faktisk flyttede tallene, ikke den, der gav den bedste oprindelseshistorie.

Hvor v2 tabte — udgivet alligevel

Vores metode kræver, at tabene står ved siden af sejrene. v2 er den bedste arm på alt, der blokerer en merge, men den er ikke en streng overmængde af v1, og det lader vi ikke, som om den er.

I jagten på udtømmende bredde stoppede v2 med at bore i én funktion (_parse_tags) og gik forbi en subtil literal_eval-dybnestings-mistanke (S2-B5), som v1's dybde-først-gennemløb unikt havde fanget. Så på P3- / uden-for-tjeklisten-aksen regredierede v2 faktisk — fra v1's 2.5/4 ned til 1.5/4. Netto er det en god handel (+2 middel mod −1 subtil P3), men det er en reel regression på den akse, ikke ren dominans. Den ideelle anmelder er v2's bredde plus v1's vilje til at blive ved med at bore et niveau mere ned i stillevirkende kode — og det vil vi hellere fortælle dig end at runde det af.

Der er også en fejl, ingen arm fangede: en kuponudløbs-streng-<-uafgørelse (S1-B6), overset af base, v1 og v2 alle tre. Skillen skærer ned på forglemmelser; den gør ikke Claude ufejlbarlig.

SKILLPROOF SKILL

review-discipline er gratis, MIT, og det hele er én fil. Læs de otte regler, seeded-bug-testrammen og hele 3-vejs-bedømmelsen — og kør den derefter mod dine egne diffs.

Hent review-discipline på GitHub

Installation

git clone https://github.com/Skillproofdev/review-discipline ~/.claude/skills/review-discipline

Genstart Claude Code. Én kommando — repoet er skillen. Den udløses af "review this PR/diff", "check this before merge", "find bugs in" og pre-merge-tjek — og holder sig væk fra feature-skrivning, ren stil-linting og prosaanmeldelse. Den slutter sig til vores disciplin-serie: token-discipline skærer i, hvad en agent koster, research-discipline skærer i, hvad den tager fejl om på fakta, og den her skærer i, hvad en gennemgang overser.

GRATIS STARTERPAKKE

Vil du have vores højest scorede skills plus den installationstjekliste, vi kører før hver eneste test? Vi sender dig den gratis starterpakke på mail.

Få den gratis starterpakke

FAQ

Hvordan adskiller det her sig fra Anthropics code-review-plugin? Pluginet filtrerer falske positiver ved at lade parallelle scorer-agenter stemme om et konfidenstal — effektivt, men det kræver flere agenter, og det adresserer kun støjproblemet. review-discipline filtrerer med en påvist fejlvej i én enkelt agent, i én installerbar fil, og den angriber også dækningsproblemet, som pluginet ikke rører: reglen om åben jagt før tjekliste, der løftede vores egen P2-genfindingsrate fra 4/7 til 7/7.

Vil "bevis hvert fund" ikke få den til at overse ting, den ikke kan påvise? Nej — det er [suspicion]-mekanismen. En reel fejl, du ikke kan bygge en fejlvej til (kræver runtime-tilstand, du ikke kan se, eller et eksternt system), bliver stadig rapporteret, mærket [suspicion] og rangeret under de bekræftede fund, med én linje om hvad der mangler. At nedgradere konfidens er redskabet; at droppe er det ikke. I benchmarken afgav v2 5 sådanne ærlige forbehold i stedet for at sluge dem.

Gennemgår den hele kodebasen eller bare min diff? Kun ændringen. Fund skal være forårsaget eller aktiveret af denne diff; eksisterende problemer havner i en kort out-of-scope-note, ikke i den rangerede liste. Den ene undtagelse er en allerede eksisterende P0 — en aktiv secret eller aktiv sårbarhed — som altid flages fremtrædende. Den undtagelse findes netop på grund af den forglemmelse, der startede historien.

Er 18.5/21 godt nok til at springe menneskelig gennemgang over? Nej. Den fanger hver eneste P0 og P1 merge-blokerer i vores benchmark og slår en uvejledt baseline på samlet genfindingsrate med nul falske positiver — hvilket gør den til en stærk første anmelder, der aldrig bare stempler godkendt, og altid navngiver, hvad den angreb. Men den overså én plantet fejl helt og byttede en subtil P3 væk for bredde, begge dele dokumenteret ovenfor. Brug den til at sikre, at de åbenlyse og de stille aritmetikfejl aldrig når et menneske; behold mennesket til det sidste dybdeniveau.

★ 9.6/10 × 3

Den gratis startpakke

De 3 skills med vores højeste testscorer plus installations-tjeklisten — det setup, vi selv ville lægge på en frisk maskine. Gratis, på mail.

Én mail med pakken + et kort ugentligt overblik over nye testresultater. Afmeld når som helst.