Skip to content
Agents & MCP · remedieringssløjfen

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.

Den lukkede sløjfe

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.

Watchdog scanner i din kadence Prioriterede opgaver serveret over MCP Din agent retter i dit eget repo Genscanning verificerer fingeraftryks-delta sløjfen gentages — næste scanning er dommeren; ingen agentpåstand flytter nogensinde scoren
Read-only hele vejen igennem: Watchdog måler og serverer opgaverne; din agent foretager hver ændring. Fingeraftryks-deltaet ved næste scanning er det, der markerer et fund som rettet — aldrig agentens ord.
Bygget til at en agent kan handle på det

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.

next_task() · illustrativt svar
  • 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.
  • Forekomstera1b2c3 src/Billing/LegacyInvoicer.cs:212 · d4e5f6 src/Billing/TaxRules.cs:88

Illustrativt — din rigtige opgaveliste genereres ud fra den seneste scanning.

Ét kald, alt det nødvendige

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.

Rangordnet efter løftekraft, ikke støj

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.

Ingen hallucinerede placeringer

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.

Ærlig fravær

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.

Den hule kode, der kompilerer

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.
Én signatur, uanset hvem der skrev den. Vi gætter ikke på, om en maskine tastede den — stilometrisk "AI-detektion" er en troværdighedsfælde, og vi fremsætter ikke påstanden. Vi måler hulheden efter form, så et forhastet menneske og en ivrig model frembringer det samme fund og den samme rettelse. Og det akkumulerer: hver signatur fodrer en kvalitetslæsning pr. fil med aftagende afkast og gulve, så én tilfældig stub knap registreres, mens en fil fuld af stillads falder under stregen — den "én stub mod hundrede stubbe"-distinktion, en flad regel ikke kan lave.
Hvorfor det ikke kan dækkes over

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.

Linje-uafhængig identitet

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.

Foreløbig indtil bevist

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.

Deterministisk scoring med gulv

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.

Dette kører ens, uanset om koden kom fra en kodningsassistent, en konsulent eller en hotfix kl. 2 om natten. Den deterministiske genscanning er skralden under det hele: tallet modstår kosmetisk spil og kan ikke dækkes over med linje-churn — det kan kun fortjenes af kode, der reelt klarer barren.
MCP-overfladen

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.

OpgaveVærktøjHvad det gør
Læs & planlægauditRepo-sundhed, hver linse-score og en remedieringsplan rangordnet efter effekt ÷ indsats. Start her.
next_taskDet enkelte punkt med størst løftekraft, fuldt briefet: hvad det måler, gevinsten, indsatsen, hvad der skal gøres, hver forekomst.
get_taskHele arbejdspakken for én dimension, du vælger (f.eks. D34).
list_findingsDen seneste scannings fund — fingeraftryk, dimension, niveau, fil:linje.
get_findingÉt fund efter fingeraftryk.
Arbejd på rettelsenclaim_findingTag en kort lease (≈45 min), så to agenter ikke kolliderer på samme fund.
release_findingGiv det tilbage til den åbne kø.
resolve_findingRegistrér en foreløbig rettelse — den næste scanning bekræfter den via fingeraftryks-delta.
Sig fradispute_findingMarkér et scoret fund som falsk positiv → routet til menneskelig triage (Rettet / Afvist).
flag_advisoryMarkér en rådgivende (LLM-bedømt) note som uhjælpsom — en separat kanal, der aldrig rører scoren.
report_detector_gapRapportér noget, Watchdog overså → forbedrer detektoren, aldrig dit repos score.
Verificérrequest_rescanBed om en verificerende genscanning (opt-in pr. repo; tæller med i dit scannings-budget).
Agenten foreslår; målingen afgør. Ingen dispute, claim eller resolve flytter nogensinde scoren eller sletter et fund. En dispute går til et menneske — og hvis den afvises, bærer fundet en vedligeholders note, der forklarer, hvorfor det står ved magt, så det samme ikke genforhandles ved næste scanning. Uenighed er et førsteklasses signal; det er bare ikke en bagdør til tallet.
Åben, ikke lukket

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.

Hvad Watchdog gør

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.

Hvad den aldrig gør

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.

Forbind en agent

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.

MCP-klientkonfiguration · form
{
  "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.