argot docs GitHub ↗

Reading the output

Anatomy of a hit — severity tiers, sources, the reason, and the evidence line.

A check run groups hits by file. Here’s a complete one:

argot check · 2 hunks above threshold (1 foreign · 1 suspicious)
note: argot is a probabilistic style linter — verify before action.

src/utils/http-helpers.ts
  ●  L42-L48      8.21  foreign     · workdir · foreign import (import)
     ↳ axios — 0 of 47 module specifiers in repo
       common here: react (320×), express (88×), pg (47×)
  42 │ import axios from 'axios';
  43 │
  44 │ export async function fetchUserData(id: string) {

src/api/router.ts
  ◐  L102         5.89  suspicious  · staged · rare token sequence (bpe)
     ↳ startedAt (0×), _res (3×), use (88×)
  102 │ router.use((req, _res, next) => { req.startedAt = Date.now(); next(); });

Anatomy of a hit

Each hit line carries five things:

Severity tiers

Tiers are relative to the calibrated threshold t (stored in .argot/scorer-config.json):

TierRangeMeaning
unusualt ≤ score < t+0.5Borderline — worth a glance, don’t trust the call
suspicioust+0.5 ≤ score < t+1.5Likely worth a look
foreignscore ≥ t+1.5High-confidence anomaly

The evidence line

The line is the per-hunk evidence — why this hunk fired:

The score and reason are always printed, so a hit is never a black box.

Files argot stays silent on

argot won’t flag data-dominant files — modules that are ≥80% top-level array/object literals (locale tables, fixture arrays, generated lookups). Their string payloads look like foreign vocabulary, so without this gate the scorer would fire on every line. The same predicate runs at fit and check time, so the model trains and scores on the same scope.

Test files, config files, and a handful of conventional directories (docs/, examples/, migrations/, scripts/, build/, dist/) are skipped today as a placeholder default — these will move to user-configurable rules with the suppression surface.