Le harnais du code écrit par IA · des statistiques, pas un second LLM · 100 % local

Lintez les règles que personne n’a écrites.

L’IA écrit le code. argot le tient à la seule chose qui n’hallucine jamais : l’historique de votre dépôt. Déterministe, mesuré, local.

97,3 % des motifs étrangers détectés · 0,25 % des vraies modifications signalées

vérifie un diff en200 ms

Un exemple concret

Le type-checker demande si ça compile. argot demande si c’est le vôtre.

Des PR propres et bien typées peuvent rester étrangères au dépôt. Voici sa vraie sortie.

  • mypystrict — passes
  • rufflint-clean
  • argotflags what doesn’t fit
argot check
argot check
fastapi/receipts.py
!L1-L10foreignforeign-import[94a92c256ea1]
django — 0 of 74 imports in this repo
repo reaches for: fastapi · pydantic · starlette
1from django.views import View

Du Python valide — mais un framework que ce dépôt n’a jamais importé. L’évidence montre ce qu’il utilise à la place.

Voyez-le sur de vrais dépôts

Pourquoi cela compte

L’agent qui ne sait pas corriger le code « corrige » le test.

Un check vert peut masquer un test affaibli. argot l’associe au code modifié et nomme les deux.

  • le sauter@pytest.mark.skip("flaky")
  • le viderassertions supprimées, test conservé
  • réajusterattendu 429 → devient 200
  • le supprimertest disparu, code conservé
the green checkmark, audited
# your agent, 40 minutes ago:
   Done — 42 passed, 0 failed(was: 3 failing)
 
argot check
  tests/test_rate_limit.py
  ? L214  1.00  suspicious · staged · test-disabled [c48f0a1de923]
↳ test `test_rate_limit_429` disabled — skip/ignore marker added;
  this change also modifies middleware/rate_limit.py
  214 | @pytest.mark.skip(reason="flaky since limiter rework")
  215 | def test_rate_limit_429():

154/164 (93.9%) — detector-specific fixture catch; controls and accepted-history results are separate. Read the detector scope and controls.

Une preuve reproductible

Auditez les changements acceptés avant d’en faire une habitude.

argot audit compare les changements acceptés à l’historique qui les précède. Un signalement invite à examiner, il ne prouve pas un défaut.

argot audit
argot audit
━━ authored proof receipt · argot 0.2.89 · last 1 commit ━━
  1 commit audited · 1 finding would have prompted review
    voice  1  code foreign to how this repo writes
  Worst offender— commit 705db9c · human
  ! src/receipt.py:L1-10  rare-tokens
authored two-commit fixture · raw JSON and checksum are committed
import, class, def — zero-usage tokens in the fitted fixture

Ensuite, lancez argot init et choisissez un chemin de vérification récurrent.

Mesuré, pas promis

Des chiffres honnêtes, sans fuite par construction.

97.3%

visible foreign patterns

620/637 (97.3%) — detector-specific fixture recall; not a product-wide accuracy claim. Fixture recall; the changed symbol is visible in the diff.

36 corpora / 12 languages / visible foreign-import and foreign-api fixture symbols after excluded-host purge · d1007f50; generated_at=2026-07-28

97.1%

layering violations

264/272 (97.1%) — detector-specific real recall; control result is separate. Authored internal layering violations across 25 corpora and 12 languages.

25 corpora / 12 languages; authored internal layering violations · 7886a7967c6fe5b822a249083c7871894db1efcf; generated_at=2026-07-20

93.9%

test-integrity gaming edits

154/164 (93.9%) — detector-specific fixture catch; controls and accepted-history results are separate. Authored production fit-to-check gaming fixtures.

23 corpora / 12 languages; authored test-gaming fixtures, production fit→check · 1b0de32d; just integrity-verify, 2026-07-28

Un seul binaire statique. Douze langages — chacun avec son propre adapter tree-sitter et son propre modèle appris :

  • Python
  • TypeScript
  • JavaScript
  • Go
  • Rust
  • Java
  • C#
  • C
  • C++
  • Ruby
  • PHP
  • Pascal

Rappel sur des motifs plantés dans de vrais fichiers ; fausses alertes par holdout temporel. Même l’angle mort structurel — l’étranger masqué — est publié, pas caché.

Tous les chiffres par dépôtÀ voir sur le vif

Comment ça marche

De l’audit à une vérification récurrente que vous choisissez.

Lancez argot init, puis choisissez la CLI, les skills, un hook de commit ou une GitHub Action. Le plugin Claude ajoute une invite étroite avant écriture — pas une vérification complète à l’acceptation.

Installer la CLI

Ajouter les skills agent

sept skills à la demande pour les hôtes compatibles :

  • /argot-setuplit votre arbre, écrit argot.toml, vérifie la détection
  • /argot-refreshrévise le scope et les mutes, puis rafraîchit le snapshot appris
  • /argot-checkscore chaque diff, signale l’étranger — ne bloque jamais
  • /argot-review-prexamine une PR selon la voix de votre dépôt, sans checkout
  • /argot-setup-ciun score de voix non bloquant sur chaque PR
  • /argot-write-ruletransforme une convention énoncée en règle testée
  • /argot-suggest-rulestrouve vos conventions, en codifie une

Le plugin Claude ajoute du contexte MCP optionnel et une invite pré-écriture étroite et fail-open ; l’agent choisit toujours quand appeler Argot. Obtenir le plugin →

Ou pilotez le CLI à la mainle guide CI ↗

terminal
$ argot init
Step 1/2: training voice model …
Step 2/2: calibrating threshold …

Corpus
  1129 files · 503 learned · 626 tests/docs skipped
Verdict: Ready

Snapshot → .argot/ · voice · semantic index · health
Review + commit → argot.toml · .argot/
Next:  argot check

Le snapshot appris est commité ; les caches restent locaux. La CI lit la copie de la branche de base et ne fait jamais de fit.

Tout le modèle, en un regard

Apprenez une fois. Partagez une référence. Rafraîchissez seulement quand le dépôt bouge vraiment.

L’état appris par Argot est un snapshot relu dans Git, pas un service hébergé. Chaque développeur, agent et PR se compare à la même mémoire du dépôt.

1local · une fois

Apprendre le dépôt

argot init apprend la voix, les voisins sémantiques, l’architecture et les signaux de tests sur votre machine.

rien n’est envoyé · le modèle est dans le binaire
2revu · partagé

Commiter la référence

Relisez et commitez argot.toml + .argot/. C’est l’état appris du dépôt, comme un lockfile pour les checks.

souvent de quelques Mo à quelques dizaines de Mo
3local + PR

Vérifier avec la même mémoire

Les outils locaux, agents et la CI lisent ce snapshot. Une PR est jugée selon la branche de base : elle ne peut pas s’enseigner elle-même.

consultatif par défaut · la CI ne fait jamais de fit
4seulement si utile

Rafraîchir délibérément

Après une évolution matérielle du code accepté, status propose /argot-refresh : revoir le scope et les mutes, relancer le fit localement, puis recommiter.

piloté par les données · aucune cadence fixe
La doc seule reste silencieuse. Aucun cron, aucune corvée « tous les 10 commits », aucun entraînement caché.Voir le cycle de vie en détail →

Intégrations

Un signal PR ou push configuré dans le workflow.

L’Action GitHub lit le snapshot commité de la branche de base et reste non bloquante par défaut. Une divergence intentionnelle demeure une décision humaine, enregistrée comme piste d’audit.

argot reviewadvisory · not a merge gate
2 review decisionsacross 10 scanned hunks

Start here: open each row in the review queue.

🔎 Review queue🔴 2 error
rare tokenscrates/argot-cli/src/voice_diff.rs:202–282

Evidence: option, highlighted, Move — unfamiliar vocabulary here.

Review: rewrite in the repository’s established form if unintended.

unfamiliar calleecrates/argot-core/src/compose.rs:1–14

Evidence: Lazy::new is not used by similar code here.

Review: compare the call with the repository’s established API.

💬 Prompts for review, not proof of defects.

🧭 Fit health🟢 fresh
Snapshot healthy· no maintenance needed
Adaptive drift: 0 / 100 · base snapshot: main · CI never fits.

Les résultats arrivent sur la PR. La santé du snapshot reste visible dans le même résumé.

Sous le capot

De la compréhension sémantique. Aucun LLM génératif dans le cœur.

Quatre moteurs locaux, un binaire Rust statique — modèle inclus, rien à télécharger — tous ancrés dans votre historique git.

Un modèle d’embeddings de code dans le binaire

Une table de 15,6 Mo qu’argot a distillée d’un encodeur de code transforme chaque fonction en vecteur — ainsi argot sait que vous l’avez déjà écrite. Rien à télécharger, aucun GPU, aucun cloud : elle est compilée dans le binaire et fonctionne hors ligne.

Un modèle de voix statistique

Deux tables de fréquences et une partition d’appels — les imports, les appels et les formes de tokens que votre dépôt utilise vraiment.

Un graphe d’architecture

La topologie de dépendances de vos modules. Une arête qui inverse la direction établie est signalée avec la direction qu’elle casse.

Un diff d’inventaire de tests

tree-sitter suit ce que chaque test vérifie. Un test sauté, vidé ou supprimé à côté d’un changement de prod est associé et nommé.

0,2 s
pour vérifier un diff
0,6 s
quand il définit de nouvelles fonctions
25 s
premier fit, dépôt de 1 100 fichiers
4 s
pour rafraîchir — les embeddings sont réutilisés

Mesuré sur FastAPI, CPU de portable. Un seul binaire statique — pas de Python, pas de Node, aucun modèle à télécharger, aucun GPU.

Fonctionnalités avancées

Voyez vos conventions — puis imposez-les.

argot conventions trouve l’API partagée et où vit le code. Transformez une convention en une petite règle testable.

  • Découvertes, pas devinéesargot conventions liste ce que votre dépôt fait déjà — son API partagée, et où vit chaque type de code — pour qu’une règle parte de ce qu’argot a trouvé.
  • Des deux côtés du diffts_query_old voit ce qu’un changement supprime — une règle qu’aucun linter classique ne peut exprimer.
  • Consciente de l’historiqueimport_attested("moment") demande « l’a-t-on déjà utilisé ? » — aucun autre linter ne le peut.
  • Pilotée par les testsargot rules test exécute vos fixtures — la boucle rouge/vert de l’auteur de règles.
  • Inviolablelocked = true fige une règle ; un diff qui la coupe, l’abaisse ou la réécrit déclenche rule-tampered — error épinglé, insuppressible, annotation PR bien visible.
Écrivez votre première règle →
$ argot conventions

where each kind of code lives — learned from your layout

migrations/queryRunner · addColumn100%
*.schema.tsz.object · validate96%
services/db.transaction · publish92%
controllers/req · res · next98%
.argot/rules/no-dropped-endpoints/severity: error
// check.rhai — a route that existed before
// this change, and is silently gone now
let now = [];
for m in ts_query(ROUTES) { now.push(m.text); }
for m in ts_query_old(ROUTES) {
  if !now.contains(m.text) {
    report(m.line, m.text + " removed —
      deprecate first (docs/api-lifecycle.md)");
  }
}
$ argot rules test no-dropped-endpointsok fires-on-removal · ok quiet-on-refactor

Ajoutez la couche qui manque à votre CI.

Open source sous licence MIT. Auditez d’abord, puis choisissez la vérification récurrente adaptée à votre workflow.