Open sourceFait au Brésil

L’IA l’a écrit. Qui l’a relu ?

Le code IA arrive vite. Les failles aussi. CodeCorvus relit chaque pull request avant le merge et te montre ce qui n’a pas de sens, ce qui fuit et ce qui casse.

Ça compile. Les tests passent. Et c’est plein de failles.

L’IA écrit en quelques minutes ce qui prenait une journée. Ce qui vient avec, personne n’a le temps de le lire. Ça arrive à tout le monde.

Secret commité

src/billing/client.ts+3−0

@@ -12,1 +12,4 @@

1212import Stripe from "stripe";
13const stripe = new Stripe("sk_live_••••••••");

codecorvusbot· maintenantbloquant

Une clé de prod dans le code. Gitleaks bloque direct, et la valeur est masquée dans le commentaire.

14export const charge = (amount: number) =>
15 stripe.charges.create({ amount });

Données patient dans les logs

src/report.js+1−1

@@ -41,3 +41,3 @@

4141} catch (error) {
42 logger.error("export failed", error.message);
42 logger.error("export failed", payload.patient);

codecorvusbot· maintenantbloquant

payload.patient envoie le nom et le numéro d’identité dans les logs. Logue seulement l’id du rapport.

validé

4343 throw error;

Ça compile, mais c’est faux

src/api/orders.ts+2−0

@@ -27,2 +27,4 @@

2727const size = 20;
28const start = (page - 1) * size;
29return orders.slice(start, size);

codecorvusbot· maintenantimportant

slice prend l’index de fin, pas un nombre d’éléments. À partir de la page 2, la liste revient vide.

2830}

Règle métier ignorée

src/plans/discount.ts+1−1

@@ -8,3 +8,3 @@

88export function seniorDiscount(age: number) {
9 return age >= 60 ? 0.3 : 0;
9 return age > 60 ? 0.3 : 0;

codecorvusbot· maintenantimportant

La règle du repo dit « à partir de 60 ans ». Avec >, ceux qui ont pile 60 ans perdent la réduction.

1010}

PR #517 · Refacto de la facturation · 47 fichiers

Une PR géante que personne ne lit vraiment.

Corvus lit chaque ligne et ne parle que quand ça compte.

Review Corvus

corvus -b main

Relu · 46s · étape 12

  • 1bloquant
  • 2importants
  • 3suggestions

Merge bloqué : 1 problème grave, confirmé.

Relit ligne par ligne. Bloque seulement le critique.

Lit tout le diff

Chaque fichier de la PR, avec le contexte du repo. Le commentaire tombe pile sur la ligne du problème.

Explique et propose le fix

Te dit pourquoi c’est un problème et te file le fix en Commit suggestion. Un clic, c’est réglé.

Bloque seulement le critique

Bloquant retient le merge. Important prévient, c’est tout. Une suggestion reste une suggestion, zéro pression.

Commentaires sur la ligne, tableau des sévérités et le badge de l’IA qui a tenté de réfuter le problème.

github.com/acme/portail-clinique/pull/482

Améliore l’export des rapports #482

Ouverte
Conversation4Commits3
codecorvus bot a relu ces changements · il y a 2 min

Review CodeCorvus

🔴 1 bloquant·🟡 2 importants·🔵 3 suggestions

src/report.js
4141 } catch (error) {
42- logger.error("export failed", error.message);
42+ logger.error("export failed", payload.patient);
4343 throw error;
codecorvus bot · il y a 2 min

🔴 Des données patient peuvent finir dans les logs

payload.patient contient le nom et le numéro d’identité. Logue seulement l’identifiant du rapport.

validéUne deuxième IA a tenté de le réfuter, sans succès.
Changement suggéré
42- logger.error("export failed", payload.patient);
42+ logger.error("export failed", { report: payload.id });
Commit suggestion

Pour libérer avec une raison : /corvus ok ou /corvus fp

Le merge est bloqué

1 problème bloquant doit être corrigé ou libéré avec une raison.

Ne bloque pas pour rien. Une autre IA vérifie avant.

Avant de bloquer, une autre IA cherche la faille dans le problème. Elle en trouve une ? Pas de blocage. Elle n’en trouve pas ? Il reçoit le badge « validé » et retient le merge.

Teste le gate

Joue avec les options. Le merge change direct.

Il y a un secret dans le diff ?
Le problème est critique ?
La deuxième IA l’a démonté ?

Pas d’accord ? Balance un /corvus fp avec la raison et passe à autre chose. C’est tracé.

  1. ProblèmeProblème critique
  2. ContestationA tenté de le démonter, sans succès

Merge bloqué

validé

Le problème reçoit le badge « validé », et le fix suggéré arrive sur la ligne.

Les scores sont publics. La preuve qu’il a relu.

À chaque release, Corvus passe sur un golden set de cas réels et plantés, et les résultats sont publiés. Celui-ci vient du cas Grupo Mais Saúde.

golden set · 13 cas
  • 100%recall sur les bloquantsa attrapé tous les problèmes critiques
  • 100%précision sur les bloquantschaque blocage était un vrai problème
  • 0faux positif bloquant un mergeaucune PR retenue pour rien

Résultats pour ce golden set de 13 cas, pas une garantie pour tous les repos.

Lance-toi sur ta prochaine PR. Ton flow ne change pas.

.github/workflows/corvus.ymlYAML
name: CodeCorvuson: [pull_request]permissions:  contents: read  pull-requests: write  id-token: write   # short-lived OIDC sessionjobs:  review:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - run: corvus review

Relit chaque PR sur ton runner.

terminal
$ corvus -b main⠹ 46s · étape 12 · Lecture src/report.js1bloquant2importants3suggestions

Lance-le avant d’ouvrir la PR et regarde-le bosser.

Problèmes · VS Code · Cursor
  • Données patient dans les logssrc/report.js:42
  • Ça compile, mais c’est fauxsrc/api/orders.ts:29
  • Règle métier ignoréesrc/plans/discount.ts:9

Les problèmes s’affichent dans ton éditeur. Dans la PR, demande juste : /corvus explica.

Exemple illustratif. Installe et configure le CLI pour ton environnement de CI.

Cloud · bientôtLe même Corvus, sans clé d’IA et avec un dashboard.

Ton code, dans ta CI. Ta clé, hors du repo.

  • Tourne sur ton runnerLe workflow tourne dans ton GitHub Actions. Le code va du runner direct au fournisseur d’IA.
  • Pas de clé dans le repoUne session courte via GitHub OIDC. Aucun secret qui traîne dans le repo. Point.
  • L’IA ne fait que lireElle relit le diff et son contexte. Elle ne lance aucune commande et n’accède pas au réseau.
  • Secrets toujours masquésGitleaks déterministe, et Semgrep confirmé par l’IA.
  • Pensé pour la LGPDRègles pour les identifiants brésiliens et les données patient dans les logs, payloads et réponses.

Réponses rapides.

C’est quoi, CodeCorvus ?

Un reviewer de code par IA, open source, qui tourne dans GitHub Actions. Il lit chaque pull request, commente sur la ligne avec le correctif et ne bloque le merge que pour un problème critique qu’une deuxième IA n’a pas réussi à démonter.

Ça coûte combien ?

L’open source est gratuit : tu utilises ta propre clé d’IA, ou ton abonnement dans le CLI. Le Cloud n’a pas encore de prix ; il arrive bientôt.

Où va mon code ?

Le workflow tourne sur ton runner GitHub Actions. Le code part de là direct vers le fournisseur d’IA que tu choisis.

Il va bloquer mon merge pour rien ?

Non. Seul un problème critique retient le merge, et seulement après qu’une autre IA a tenté de le démonter. Pas d’accord ? /corvus ok ou /corvus fp, avec la raison, et tu passes à autre chose.

Ça marche avec GitLab ?

Pas pour l’instant. L’intégration CI vise GitHub Actions et les pull requests GitHub.

Ça aide pour la LGPD ?

Corvus embarque des règles pour les identifiants brésiliens et les données patient dans les logs, payloads et réponses, et garde les preuves de review. Ça ne remplace pas un avis juridique.

Tu attends quoi ?

Un workflow, une PR, et c’est bon : Corvus relit déjà.

Vas-y, installe-le

Open source et gratuit. Sans inscription, sans piège.