开源巴西制造

AI 写完了。 谁审过了?

AI 写的代码上得快,坑也来得快。CodeCorvus 在 merge 之前过一遍每个 pull request,告诉你哪里说不通、哪里会泄露、哪里会崩。

能编译,测试也过了。 但全是坑。

以前要写一天的东西,AI 几分钟就写完。跟着一起来的那些,谁也没空细看。谁都踩过。

密钥被 commit 了

src/billing/client.ts+3−0

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

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

codecorvusbot· 刚刚阻断

生产环境的密钥写进了代码。Gitleaks 当场拦下,评论里的值也会打码。

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

患者数据进了日志

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· 刚刚阻断

payload.patient 把姓名和身份证号写进了日志。只记报表 id 就行。

已验证

4343 throw error;

能编译,但逻辑错了

src/api/orders.ts+2−0

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

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

codecorvusbot· 刚刚重要

slice 的第二个参数是结束位置,不是条数。从第 2 页开始,列表就是空的。

2830}

业务规则被无视了

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· 刚刚重要

仓库里的规则写的是“60 岁及以上”。用了 >,刚好 60 岁的人就没折扣了。

1010}

PR #517 · 重构计费 · 47 个文件

巨型 PR,没人会认真看。

Corvus 一行行读,只在真有事的时候才开口。

Corvus 审查

corvus -b main

已审查 · 46s · 步骤 12

  • 1阻断
  • 2重要
  • 3建议

Merge 被拦下:1 个严重问题,已确认。

逐行审查。 只拦严重的。

读完整个 diff

PR 里的每个文件,连同仓库上下文。评论直接落在出问题的那一行。

讲清楚,再给出修法

告诉你为什么有问题,再把修复做成 Commit suggestion 递给你。点一下,搞定。

只拦严重的

阻断会拦下 merge。重要只是提醒。建议就只是建议,不强求。

行内评论、按严重程度的计分板,外加一枚徽章,来自那个想推翻结论却没成功的 AI。

github.com/acme/clinic-portal/pull/482

优化报表导出 #482

开启
对话4Commits3
codecorvus bot 审查了这些改动 · 2 分钟前

CodeCorvus 审查

🔴 1 阻断·🟡 2 重要·🔵 3 建议

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 · 2 分钟前

🔴 患者数据可能会进日志

payload.patient 里有姓名和身份证号。日志里只记报表 ID 就行。

已验证第二个 AI 试着推翻它,没成功。
建议的改动
42- logger.error("export failed", payload.patient);
42+ logger.error("export failed", { report: payload.id });
Commit suggestion

要带理由放行:/corvus ok 或 /corvus fp

Merge 被拦下了

有 1 个阻断问题,要么修掉,要么写明理由放行。

不会乱拦。 先让另一个 AI 挑刺。

拦之前,另一个 AI 会专门给这个结论挑毛病。挑出来了?不拦。挑不出来?打上“已验证”徽章,拦下 merge。

试试这个 Gate

拨一下开关,merge 结果马上跟着变。

diff 里有密钥吗?
问题严重吗?
第二个 AI 推翻它了吗?

不同意?发个 /corvus fp 附上理由,接着干活。都有记录。

  1. 发现严重问题
  2. 质疑试着推翻,没推翻

Merge 被拦下

已验证

问题打上“已验证”徽章,建议的修复直接落在那一行。

计分板是公开的。 审没审过,有据可查。

每个版本,Corvus 都要跑一遍由真实案例和埋点案例组成的 golden set,结果直接公开。这份来自 Grupo Mais Saúde 的案例。

golden set · 13 个案例
  • 100%阻断问题召回率严重问题一个没漏
  • 100%阻断问题精确率每次拦截都是真问题
  • 0误报拦下 merge 的次数没有 PR 被白白卡住

仅代表这套 13 个案例的 golden set 的结果,不保证适用于所有仓库。

下一个 PR 就能用上。 流程一点不用改。

.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

在你的 runner 上审查每个 PR。

终端
$ corvus -b main⠹ 46s · 步骤 12 · 正在读 src/report.js1阻断2重要3建议

开 PR 之前先跑一遍,实时看进度。

问题 · VS Code · Cursor
  • 患者数据进了日志src/report.js:42
  • 能编译,但逻辑错了src/api/orders.ts:29
  • 业务规则被无视了src/plans/discount.ts:9

问题直接出现在编辑器里。在 PR 里问一句就行:/corvus explica。

仅为示例。请按你的 CI 环境安装和配置 CLI。

Cloud · 即将上线还是那个 Corvus,不用 AI 密钥,外加一个仪表盘。

代码在你的 CI 里。 密钥不进仓库。

  • 跑在你的 runner 上workflow 跑在你的 GitHub Actions 里。代码从 runner 直接发给 AI 服务商。
  • 仓库里没有密钥通过 GitHub OIDC 拿短期会话。仓库里不放任何密钥,就这么简单。
  • AI 只读代码它只看 diff 和上下文。不执行命令,也不联网。
  • 密钥永远打码确定性的 Gitleaks,加上由 AI 确认的 Semgrep。
  • 为 LGPD 而生规则覆盖日志、payload 和响应里的巴西证件号和患者数据。

快问快答。

CodeCorvus 是什么?

一个开源的 AI 代码审查工具,跑在 GitHub Actions 里。它会读每一个 pull request,直接在对应的行上评论并给出修复建议;只有发现严重问题,而且第二个 AI 也推翻不了时,才会拦下 merge。

要花多少钱?

开源版免费:用你自己的 AI 密钥,或者在 CLI 里用你的订阅。Cloud 还没定价,很快就来。

我的代码会发到哪?

workflow 跑在你的 GitHub Actions runner 上。代码从那里直接发给你选的 AI 服务商。

会不会动不动就拦我的 merge?

不会。只有严重问题才会拦下 merge,而且要先让另一个 AI 试着推翻。不同意?/corvus ok 或 /corvus fp,附上理由,接着干。

支持 GitLab 吗?

暂时不支持。CI 集成针对的是 GitHub Actions 和 GitHub pull request。

对 LGPD 有帮助吗?

Corvus 自带规则,覆盖日志、payload 和响应里的巴西证件号和患者数据,还会记录审查证据。它不能代替法律意见。

还在等什么?

一个 workflow,一个 PR,搞定:Corvus 已经开始审了。

赶紧装上

开源免费。不用注册,没有套路。