Watchdog finder det. Din agent retter det. Næste scanning beviser det.
Watchdog er den uafhængige kodebase-assurance-landmåler — den måler, den retter aldrig. Den er read-only af doktrin, så i stedet for at røre din kode serverer den hvert fund til din egen kodningsagent over en Model Context Protocol-server: prioriteret efter effekt, briefet med den regel der udløste, og den nøjagtige fil og linje, og verificeret af næste scanning. Hånden på din kode er altid din egen.
Virker med enhver MCP-klient — Claude Code, GitHub Copilot, Cursor, opencode. C#/.NET · en måling, ikke en mening.
Mål → ret → bevis, i en sløjfe.
Watchdog scanner i din kadence og gør fundene til en rangordnet, briefet opgaveliste. Din agent arbejder på det punkt med størst løftekraft i dit eget repo og registrerer en foreløbig rettelse. Den næste scanning genmåler og afgør: fundet krediteres kun som rettet, når det reelt holder op med at udløse. Intet, som agenten påstår, flytter nogensinde scoren.
En rangordnet, briefet opgaveliste — ikke en mur af fund.
Peg en agent mod repoet, og den begynder med audit() — repo-sundhed, hver linse-score og
en remedieringsplan rangordnet efter effekt ÷ indsats: hvad der faktisk flytter karakteren, i rækkefølge.
next_task() giver det enkelte punkt med størst løftekraft tilbage, fuldt briefet i ét objekt;
get_task("D34") henter hele pakken for én dimension. Ingen rundrejser, ingen gætteri.
- Dimension — D34 · Knowledge Freshness (Maturity-linse)
- Score nu 6.1 / 10 · Est. gevinst +1.8 · Indsats Middel
- Hvad der skal gøres — genaktivér de forældreløse billing-moduler: tilføj karakteriseringstest og en navngiven ejer før næste ændring.
- Forekomster —
a1b2c3src/Billing/LegacyInvoicer.cs:212 ·d4e5f6src/Billing/TaxRules.cs:88
Illustrativt — din rigtige opgaveliste genereres ud fra den seneste scanning.
Hver opgavepakke bærer hvad dimensionen måler, den aktuelle score, den estimerede point-gevinst og indsats, remedieringsbriefet og hver åben forekomst med dens fingeraftryk og fil:linje. Agenten læser ét objekt og går i gang.
Planen rangordner hele dimensioner efter effekt ÷ indsats — "løft D34 fra 6 til 8 for +1.8" — så agenten arbejder på det, der flytter karakteren, i stedet for at rydde hundrede Info-niveau-fund i et område, der allerede er stærkt.
Hvert fund er content-addressed — et stabilt fingeraftryk plus nøjagtig fil og linje. Agenten opfinder aldrig en placering, og den kan diffe to scanninger (eller to SARIF-kørsler) og få de samme tilføjelser og fjernelser, som Watchdog rapporterer.
Når en dimension ikke kan måles — coverage på en suite, der ikke vil køre, en npm-scanning på et Python-repo — returnerer den ikke-målt med begrundelsen, aldrig et fantom-0. Agenten retter aldrig et problem, der ikke er der.
Scores er fastlåst til en frossen rubrik-version, så en agent, der verificerer sin egen rettelse, altid sammenligner mod den samme målestok. Fund leveres også som SARIF — helpUri til reglens hensigt, partialFingerprints for stabil identitet på tværs af værktøjer, sikkerhedsfund tagget med deres CWE — så dine code-scanning-værktøjer også læser dem.
Det vi fanger, som linje-scannere lader passere.
Fejltilstanden i hurtig kode med stort volumen er ikke dårlig syntaks — det fanger en linter. Det er kode, der ser færdig ud og ikke gør noget: stubbe under selvsikre navne, test der intet asserterer, fejl der stilfærdigt sluges. Den type-checker, den læses som færdig, den sejler forbi en linje-scanner. Watchdog måler selve hulheden — efter form, deterministisk.
| Signatur | Hvordan det ser ud | Hvorfor en linje-scanner lader det passere |
|---|---|---|
| Stubbe der ser implementerede ud IC1 | En metode med navnet CalculateTax, der bare return 0;; en async-metode der aldrig awaiter; skelet-typer halvfyldte med huller; død if(false)-grene. |
Det er gyldig C#, det type-checker, det læses som færdigt. En scanner ser en metode; vi ser en hul en — og vægter en enkelt stub anderledes end gennemgribende stillads. |
| Test der intet asserterer D10 | Grønne test uden assertions; oversprungne test klædt ud som coverage. | Coverage tæller testfilen; den spørger aldrig, om testen faktisk tjekker et resultat. |
| Fejl gjort usynlige X3 | Tom catch {}, der sluger undtagelsen; bar throw;, der mister stack-tracet. |
Undtagelsestypen er fanget, så type-baserede tjek passerer. Stilheden er ikke synlig for dem. |
| Usporet gæld & død kode D17 | TODO / FIXME / HACK, generelle suppressions, udkommenteret kode, ureferencerede symboler. | Talt råt i bedste fald — ikke vægtet efter, om gælden er sporet, og død kode i genererede stier eller teststier overses. |
| Copy-paste, aldrig parametriseret D4 | Nær-duplikerede blokke — templateret generering, der aldrig blev individualiseret. | Klon-detektion er dyr og ofte sprunget over; vores er type-bevidst og scoret efter tæthed på tværs af kodebasen. |
Genscanningen er en skralde — scoren er fortjent, ikke talt op.
At afdække slop er kun det halve arbejde; den anden halvdel er at sikre, at en "rettelse" er ægte. Fordi målingen er deterministisk, og den næste scanning kører den igen, kan et fund ikke pyntes på eller churnes væk — det holder enten op med at udløse, eller også gør det ikke. Dette gælder ved hver planlagt scanning, med eller uden en agent.
Et funds identitet er et hash af dets dimension, titel og fil — aldrig linjenummeret. Omformatér, omdøb en variabel, flyt blokken: fundet bliver, hvor det er. Du kan ikke churne dig ud af det.
En agents "løst" er en påstand, ikke en dom. Den næste scanning genmåler og krediterer det kun, når fingeraftrykket reelt er væk — og genåbner det, hvis reglen stadig udløser. Ingen selvrapporterede rettelser.
Gentagelser af samme problem aftager — hver koster det halve af den forrige — og hver kategori har et gulv, så du kan ikke oversvømme en fil med kosmetiske fund for at spille systemet, eller bortforklare en score under stregen. Samme commit ind, samme score ud.
Tolv værktøjer, fire opgaver — og en måde at sige fra på.
Alt kører over ét HTTPS-endpoint (/mcp), Bearer-token-scoped til ét enkelt repo.
Der er intet skriv-til-repo-værktøj — ingen commit, intet push, ingen åbn-PR. Agenten læser,
arbejder i dit miljø, registrerer foreløbige rettelser, og — når den er uenig — siger fra gennem
ærlige kanaler, hvor et menneske, ikke agenten, afgør.
| Opgave | Værktøj | Hvad det gør |
|---|---|---|
| Læs & planlæg | audit | Repo-sundhed, hver linse-score og en remedieringsplan rangordnet efter effekt ÷ indsats. Start her. |
next_task | Det enkelte punkt med størst løftekraft, fuldt briefet: hvad det måler, gevinsten, indsatsen, hvad der skal gøres, hver forekomst. | |
get_task | Hele arbejdspakken for én dimension, du vælger (f.eks. D34). | |
list_findings | Den seneste scannings fund — fingeraftryk, dimension, niveau, fil:linje. | |
get_finding | Ét fund efter fingeraftryk. | |
| Arbejd på rettelsen | claim_finding | Tag en kort lease (≈45 min), så to agenter ikke kolliderer på samme fund. |
release_finding | Giv det tilbage til den åbne kø. | |
resolve_finding | Registrér en foreløbig rettelse — den næste scanning bekræfter den via fingeraftryks-delta. | |
| Sig fra | dispute_finding | Markér et scoret fund som falsk positiv → routet til menneskelig triage (Rettet / Afvist). |
flag_advisory | Markér en rådgivende (LLM-bedømt) note som uhjælpsom — en separat kanal, der aldrig rører scoren. | |
report_detector_gap | Rapportér noget, Watchdog overså → forbedrer detektoren, aldrig dit repos score. | |
| Verificér | request_rescan | Bed om en verificerende genscanning (opt-in pr. repo; tæller med i dit scannings-budget). |
Hånden på din kode er altid din egen.
Watchdog kører mod en engangsklon og eksponerer ingen måde at skrive til dit repo på. Det er bevidst: en måler, der også omskriver det, den bedømmer, kan ikke forblive neutral, og du ville miste chain-of-custody på hver ændring. Værktøjer, der auto-refaktorerer inde i deres egen motor, laver den modsatte handel. Watchdog forbliver instrumentet; din agent — hvilken end du allerede kører — forbliver hånden.
Serverer prioriterede, briefede fund over MCP; registrerer en foreløbig resolve; genmåler ved næste scanning og beviser, hvad der reelt flyttede sig. Den overdrager intelligensen til din agent.
Redigerer, committer, pusher eller åbner en PR; flytter scoren på en agents ord; rører dit working tree. Ændringen — og æren, og chain-of-custody — er altid din.
Peg enhver MCP-klient mod dit repo.
Hvert repository har et MCP-endpoint og et scoped bearer-token. Tilføj dem til din agents MCP- konfiguration — Claude Code, GitHub Copilot, Cursor, opencode eller din egen — og opgavelisten er live. Verificér-nu-genscanninger er opt-in pr. repo (slået fra som standard) og tæller med i dit scannings-budget; ellers er den næste planlagte scanning dommeren.
{
"mcpServers": {
"watchdog": {
"url": "https://<your-watchdog-host>/mcp",
"headers": { "Authorization": "Bearer <repo-token>" }
}
}
}
Det nøjagtige endpoint-URL og pr.-repo-tokenet vises for hvert repository, når det først er landmålt.
Hold op med at triagere fund i hånden. Overdrag dem til din agent.
Log ind med GitHub · intet kort · C#/.NET · den første fulde rapport er €0.