Copier-coller de LLM
Un bloc dont le style s’écarte nettement du fichier qui l’entoure — fluide dans la voix moyenne de tous les dépôts publics, pas la vôtre.
argot apprend la voix de votre dépôt à partir de son propre historique git, puis signale les passages qui ne ressemblent à personne de votre équipe. Aucun modèle. Aucun cloud. Aucun GPU.
MIT · macOS & Linux · calibré en secondes, scoré en millisecondes
La deuxième question
Les linters et type-checkers répondent à « est-ce valide ? ». Ils ne savent pas répondre à « est-ce ainsi que cette équipe écrit ? ». Cela vivait dans la revue de code — jusqu’à ce qu’un LLM puisse l’enterrer sous cent PR propres et bien typées en une après-midi. argot est la couche qui repose la question.
@router.get("/{user_id}", response_model=UserResponse)
async def get_user(user_id: int, db=Depends(get_db)) -> UserResponse:
user = db.get(user_id)
if user is None:
raise ValueError(f"User {user_id} not found")
return user argot check · 1 hunk above threshold (1 foreign) note: argot is a probabilistic style linter — verify before action. routers/users.py ● L11-L14 8.21 foreign · workdir · wrong exception type (bpe) ↳ ValueError (0×) — repo raises HTTPException (214×) 11 │ user = db.get(user_id) 12 │ if user is None: 13 │ raise ValueError(f"User {user_id} not found") 14 │ return user
Décorateurs, Depends, le retour typé — tout est idiomatique en FastAPI. Le seul écart : un ValueError nu là où ce dépôt lève toujours HTTPException. mypy est content. Le linter n’a rien à dire. argot signale la ligne.
Ce qu’il détecte
argot ne remplace ni ESLint, ni ruff, ni votre type-checker. Il attrape ce qu’ils ne savent pas formuler — les conventions que votre équipe a adoptées par répétition, jamais par écrit.
Un bloc dont le style s’écarte nettement du fichier qui l’entoure — fluide dans la voix moyenne de tous les dépôts publics, pas la vôtre.
Gestion d’erreurs, journalisation ou formes de contrôle de flux qui ne correspondent pas au reste du code.
De la POO à base de classes lâchée dans un code fonctionnel. Un def synchrone sur un chemin async critique. Le mauvais import.
Du code correct, typé, sans erreur de lint — mais qui ne ressemble à personne de cette équipe.
Comment il reste honnête
argot construit deux distributions de tokens — une depuis votre dépôt, une depuis une référence open-source générique — et signale les passages bien plus probables sous la générique. C’est tout le modèle. Il se calibre sur CPU en secondes et embarque son seuil par dépôt.
Aucun GPU, aucun cloud, aucune télémétrie. Le modèle, ce sont deux tables de fréquence et un log-ratio max — calibré en secondes, scoré en millisecondes.
Le seuil est fixé à partir de votre propre code : « normal » veut dire normal ici — pas la moyenne de tous les dépôts publics d’un modèle.
Un tokenizer tree-sitter analyse les passages partiels et invalides. Python et TypeScript d’emblée ; les monorepos mixtes ont un seuil par langage.
Chaque signalement nomme les tokens qui ont porté le score, leur fréquence dans votre dépôt, et le vocabulaire habituel ici à la place.
Pourquoi argot
argot check tourne à chaque commit, groupe les hits par fichier et sort en non-zéro dès qu’un passage s’écarte. Câblez-le comme ESLint.
Pointez-le sur un dépôt, lancez extract → fit une fois, puis check à l’infini. Aucune annotation, aucune config pour démarrer.
Chaque hit montre les tokens fautifs et leur attestation — startedAt (0×) vs use (88×) — et le vocabulaire habituel du dépôt à la place.
unusual · suspicious · foreign, relatifs au seuil calibré. Filtrez le bruit avec --min-severity.
Un monorepo Python + TypeScript reçoit un seuil par langage, dispatché par extension. Aucune distribution n’écrase l’autre.
Des benchmarks publics, un journal de recherche de 35 docs, et un avertissement linter probabiliste imprimé à chaque run. Vérifiez avant d’agir.
argot est MIT et en alpha. Calibrez-le sur votre dépôt en deux minutes, puis voyez ce qu’il signale.