dualform-labs/review-audit-pro

GitHub: dualform-labs/review-audit-pro

一款 Claude Code 只读代码审计技能,通过多 Agent 扇出、对抗性验证和实时自我校准,在 AI 声明审查「通过」前以可量化的检测率证明其可靠性。

Stars: 0 | Forks: 0

review-audit-pro

终结“大概没问题”。
「たぶん大丈夫」を、終わりにする。
全面且多 agent 的审查级别。如需日常的低 token 检查,请查看配套的 review-audit

License Claude Code skill benchmark One file, zero dependencies Recall 95.6% Hallucination 2.5%

一个只读、全维度的代码审计 Claude Code 技能
旨在阻止 AI 轻易相信自己的“已完成”。下方的每一个数字都是可复现的——并且每次提交都会由 CI 重新检查。

dualform-labs 构建并维护 · English · 日本語

## 概览 | | | 验证方法 | |---|---|---| | **检测率 (recall) 95.6%** | 90 个植入缺陷中捕获了 86 个 | `python3 benchmark/score.py benchmark/results.json` | | **幻觉率 2.5%** | 280 项发现中有 7 项在事实上是错误的 | `python3 benchmark/score_fp.py` | | **6 大维度,一次只读审查** | bug · 接线 · 安全 · 测试 · 规范 · 回归 | `skills/review-audit-pro/SKILL.md` | | **单次运行的检测证明** | 植入已知缺陷,测量是否能捕获它们 | 见下文的“实时自我校准” | | **1 个文件,0 依赖** | 整个技能就是一个 prompt | `skills/review-audit-pro/SKILL.md` | ## English ### 与众不同之处 大多数 AI 审查者都有一个共同的盲点:**它们无法告诉你它们在“你的”代码上表现得多好。** 检测质量依赖于模型且未被测量,因此一个干净的“PASS”可能意味着“没有 bug”——或者“我没有仔细看”。你无法区分是哪种情况。 `review-audit-pro` 通过一项所有调查过的竞争对手都不提供的功能(CodeRabbit、Greptile、Graphite、Snyk、Qodo、DeepSource、Anthropic 的 Ultra Review,以及公开的 Claude-Code review subagents —— 于 2026-06 检查)填补了这一空白:**在相信其结论之前,它会在此次运行的代码上测量自身的检测能力。** ### 审计运行方式 一次只读审查涵盖六个维度。每一项发现都必须经受住一个试图推翻它的新反驳者的考验——误报会在你看到它们之前被丢弃。一个没有真正被检查的维度绝不能成为 `PASS` 的一部分。 ``` flowchart TD T["target
read-only snapshot"] --> P["plan — 6 axes, all ON by default"] P --> F["fan-out: one fresh agent per axis
bugs · wiring · security · tests · spec · regression"] F --> V{"adversarial verify
a fresh refuter tries to DISPROVE each finding"} V -->|DISPROVED| D["dropped — logged, never silent"] V -->|"CONFIRMED / UNRESOLVED"| M["merge + sort by severity"] M --> CAL["live self-calibration
see below"] CAL --> J{"verdict"} J -->|"a CONFIRMED high exists"| FAIL["FAIL — must-fix"] J -->|"every axis audited AND proven"| PASS["PASS"] J -->|"an axis unaudited or unproven"| INC["INCOMPLETE"] ``` - **对抗性验证** —— 每一项发现都会交给一个新的反驳者(一个独立的 agent),它必须使用*自己的证据*进行反驳(DISPROVE)、确认(CONFIRM)或标记为未解决(UNRESOLVED)。只有幸存下来的发现才会被返回。 - **覆盖率诚实度** —— 每个维度都会报告 `audited / partial / not-audited / n-a`(已审计 / 部分 / 未审计 / 不适用)。“我没检查”是一个一等输出;未检查的维度不能成为 `PASS` 的一部分。 - **始终只读** —— 它提出修复建议,但从不应用。审计前后的 checksum 证明你的代码树未被触碰。 ### 实时自我校准:检查它是否真的能发现 bug 在相信其自身的结论之前,审计会将**已知的缺陷植入到你代码的一次性副本中,并检查是否能够捕获它们**——就在此处,在这个代码库和这次运行中。结果是针对单次运行的数字。如果某个维度无法证明其检测能力,该维度就**不能被标记为 PASS**——它会降级为 `INCOMPLETE`。 ``` flowchart LR S["your source
never touched"] -->|copy| K["throwaway copy"] K --> PL["plant known defects
one per axis"] PL --> AU["run the same audit
on the copy"] AU --> SC["caught / planted
per axis"] SC --> G{"detection ≥ 90%?"} G -->|yes| OK["axis may claim PASS"] G -->|no| DEG["DEGRADED → axis INCOMPLETE
cannot claim PASS"] ``` 这将“检测质量”从一个未测量的假设转变为一个已测量的、针对单次运行的结果:**我可以证明我本可以捕获它。** 该副本被修改了;你的真实源码永远不会被触碰(已通过审计前后的 checksum 验证)。 ``` ### live self-calibration (per-run detection power) | axis | planted | caught | detect | verdict | | bug | 1 | 1 | 100% | OK | | wiring | 1 | 0 | 0% | DEGRADED → axis INCOMPLETE | ``` ### 基准测试 —— 每个数字都是可复现的 在随 [`benchmark/`](benchmark/) 附带的 90 缺陷语料库(Python + JS/TS,6 个类别)上测量,使用**当前前沿的 Claude 模型**(2026-06): | 指标 | 数值 | 方式 | |---|---|---| | **检测率 (recall)** | **95.6%** (86/90) | `python3 benchmark/score.py benchmark/results.json` —— 确定性的(最大二分匹配) | | **幻觉率** | **2.5%** (280 项发现中有 7 项在事实上是错误的) | `python3 benchmark/score_fp.py` —— 对三阶段裁定([RESULTS.md](benchmark/RESULTS.md))的确定性汇总 | | 过度标记 (真实但次要) | 14.6% (41/280) | 已披露,不作为基准线 —— 见注意事项 | ``` python3 benchmark/score.py benchmark/results.json # OVERALL detection (recall) 95.6% (86/90) [max bipartite matching] # detection bar (>= 95%): PASS python3 benchmark/score_fp.py # => factually-false (true hallucinations): 7 # FP rate = 7/280 = 2.5% bar (FP <= 5%): PASS ``` **诚实的注意事项**([完整方法论](benchmark/RESULTS.md) 毫无保留): - 两个主要数字都是确定性汇总的。*不可按位复现* 的是重新生成底层的发现/判断——审计及其评判者是由 LLM 驱动的,因此一次新的运行会产生*可比较的*而非完全相同的输入。在任何固定的运行之上进行评分是精确的。 - 14.6% 的“过度标记”主要是接线维度将单文件测试 fixture 中的 public-API 函数标记为“未调用”(这些 fixture 在设计上没有调用者)。在真实的 repo 中,它们是有调用者的——这部分是 fixture 的产物,部分是真实的倾向。已披露,不隐瞒。 - 检测质量依赖于模型。语料库很小且是自建的。这些是如实的测量结果,**不是**对普遍优越性的声明。 ### 它是什么与不是什么 **是**:一个严格的*自我审计*套件,供自主 agent 在声明 `done` 之前检查自己的工作——可验证的检测能力、丢弃的误报、没有静默的漏报、只读。 **不是**:人类审查、PR/CI 门禁或专业 SAST 的替代品。它不能在深度数据流漏洞分析方面与 CodeQL/Snyk 匹敌,没有 PR 集成,并且比每次提交的 linter 更重/更慢。请在严谨性比速度更重要的场合使用它。 ### 安装 它是一个 prompt 文件——一个 Claude Code 技能,没有运行时依赖。 ``` git clone https://github.com/dualform-labs/review-audit-pro.git cp -r review-audit-pro/skills/review-audit-pro ~/.claude/skills/ ``` 然后在 Claude Code 中:运行 `/review-audit-pro [target]`,以便在发布 / 高风险更改 / 最终门禁之前进行详尽的审计。 #### 选择报告语言 默认情况下,审计报告(发现的正文、覆盖率标签、结论)遵循**你对话的语言**(`auto`)。要固定为日语或英语,请编辑 `skills/review-audit-pro/config.yml` 中的一行: ``` output_language: en # auto (default) | ja | en ``` 无论此设置如何,`file:line`、命令、grep/exec 输出、代码和 slug 始终保持为英语。 ### 两个级别 —— 默认轻量级,关键时刻使用 pro ``` flowchart LR DEV["before you call it done"] --> RA["review-audit
1 pass · low token"] RA -->|"everyday: clean"| SHIP["ship"] RA -->|"release / high-risk /
need detection proof"| RAP["review-audit-pro
fan-out + adversarial verify
+ live self-calibration"] RAP --> GATE["final gate"] ``` | | [**review-audit**](https://github.com/dualform-labs/review-audit) (配套版) | **review-audit-pro** (本仓库) | |---|---|---| | 适用时机 | 日常的“在我说完成之前” | 发布 / 高风险 / 最终门禁 | | 成本 | 低 token,单次审查 | 繁重,多 agent 扇出 | | 方法 | 你自己检查这 6 个维度 | 每个维度使用新 agent + 对抗性验证 | | 检测证明 | — | **实时自我校准(针对单次运行)** | | 基准测试数字 | 不继承 | 本页面上的数字 | 较轻的单次审查配套版 [`review-audit`](https://github.com/dualform-labs/review-audit) 会在需要深度或单次运行检测能力证明时升级为 pro。此处的基准测试数字属于 **pro** 流水线;轻量级版本不继承它们。 **可选集成(全部都能优雅降级——均非必需):** - `wiring-auditor` subagent —— 深化接线维度。缺失 → 回退到内联的 grep-the-call-sites。 - `semgrep`(MCP 或 CLI)—— 加强安全维度。缺失 → 手动 grep,维度标记为“部分”。 - `codex`(openai-codex 插件)—— 可选的外部审查者,**仅**在你明确要求时使用;从不自动启动。 ### 许可证 [Apache License 2.0](LICENSE) · 见 [NOTICE](NOTICE)。 ## 日本語 ### 何が違うのか ほとんどの AI レビュアーには共通の盲点があります。**「あなたのコードに対して、自分がどれだけ良い仕事をしたか」を言えない**こと。検出の質はモデル依存で、測られていない。だから綺麗な「PASS」が「バグがない」のか「真剣に探していなかった」のか、区別がつきません。 `review-audit-pro` は、調査した競合(CodeRabbit / Greptile / Graphite / Snyk / Qodo / DeepSource / Anthropic Ultra Review / 公開されている Claude-Code レビュー subagent、2026-06 時点で確認)のどれも提供していない機能で、その穴を塞ぎます。**自分の判定を信じる前に、今回・このコード上で、自分の検出力を測る**のです。 ### 監査の流れ 6観点を1回の read-only パスで。すべての finding は、それを反証しようとする fresh な反証エージェントを生き残らなければ返されません。偽陽性は、あなたが見る前に落とされます。本当に調べていない観点は、決して `PASS` の一部になれません。 ``` flowchart TD T["対象
read-only スナップショット"] --> P["計画(6観点・既定で全部ON)"] P --> F["fan-out: 観点ごとに fresh エージェント
バグ・配線・セキュリティ・テスト・spec・回帰"] F --> V{"敵対検証
fresh な反証者が各 finding を反証しようとする"} V -->|反証成立| D["除外(ログに残す・黙過しない)"] V -->|"確認 / 未解決"| M["統合 + severity 順に整列"] M --> CAL["ライブ自己校正
下記参照"] CAL --> J{"判定"} J -->|"確認済 high が1件以上"| FAIL["FAIL — must-fix"] J -->|"全観点が監査済かつ実証済"| PASS["PASS"] J -->|"未監査/未実証の観点あり"| INC["INCOMPLETE"] ``` - **敵対検証**: すべての finding は fresh な反証エージェント(別個体)に渡され、自分の証拠で DISPROVED / CONFIRMED / UNRESOLVED を判定させます。生き残ったものだけを返します。 - **カバレッジの正直さ**: 各観点が `監査済 / 部分 / 未監査 / 対象外` を報告します。「調べなかった」は一級の出力で、調べていない観点は `PASS` の一部になれません。 - **常に read-only**: 修正案は出しますが、適用はしません。監査前後の checksum で、あなたのツリーが無傷だと証明します。 ### ライブ自己校正: バグを見つけられることを実際に確かめる 自分の判定を信じる前に、監査は **あなたのコードの使い捨てコピーに既知の欠陥を植え、それを捕まえられるか確かめます**。今ここ、このコードベース、この実行で。結果は per-run の数値です。検出力を示せない観点は、`PASS` を名乗れず `INCOMPLETE` に降格します。 ``` flowchart LR S["あなたのソース
一切触らない"] -->|コピー| K["使い捨てコピー"] K --> PL["既知の欠陥を植える
観点ごとに1つ"] PL --> AU["同じ監査を
コピーに対して走らせる"] AU --> SC["捕捉 / 植えた数
観点ごと"] SC --> G{"検出力 ≥ 90%?"} G -->|はい| OK["その観点は PASS を名乗れる"] G -->|いいえ| DEG["DEGRADED → 観点 INCOMPLETE
PASS を名乗れない"] ``` これは「検出の質」を、測られない仮定から、測られた per-run の結果に変えます。「**捕まえられたと実証できる**」という状態にします。コピーは変異させますが、あなたの本物のソースは1バイトも触りません(監査前後の checksum で検証)。 ### ベンチマーク: すべての数値は再現可能 [`benchmark/`](benchmark/) に同梱した 90 欠陥のコーパス(Python + JS/TS、6カテゴリ)上で、**現行の最前線 Claude モデル**(2026-06)で計測: | 指標 | 値 | 確かめ方 | |---|---|---| | **検出率(recall)** | **95.6%**(86/90) | `python3 benchmark/score.py benchmark/results.json`。決定的(最大二部マッチング) | | **誤検出(hallucination)率** | **2.5%**(280 findings 中 7 が事実誤認) | `python3 benchmark/score_fp.py`。3段階裁定の決定的集計([RESULTS.md](benchmark/RESULTS.md))| 過剰フラグ(真だが些末) | 14.6%(41/280) | 隠さず開示。バーではない(下記の但し書き参照) | **正直な但し書き**([全方法論](benchmark/RESULTS.md)は何も隠しません): - どちらの主要数値も決定的に集計されます。*ビット単位で再現できない*のは、その下にある findings/裁定の再生成です。監査もその判定者も LLM 駆動なので、新しい実行は *同等*(同一ではない)の入力を生みます。任意の固定された実行の上での採点は厳密です。 - 14.6% の「過剰フラグ」の多くは、配線観点が単一ファイルのテスト用 fixture(設計上 caller がない)の public API 関数を「未呼び出し」と指摘したものです。実際のリポでは caller があります。一部は fixture の副産物、一部は本物の傾向です。隠さず開示します。 - 検出の質はモデル依存です。コーパスは小さく自作です。これらは正直な実測であり、**普遍的な優位の主張ではありません**。 ### これであるもの・ないもの **ある**: 自律エージェントが `done` を宣言する前に自分の仕事を点検する、厳格な *自己監査* ハーネス。検証可能な検出力・落とされた偽陽性・黙った見逃しなし・read-only。 **ない**: 人間レビュー・PR/CI ゲート・専門 SAST の代替ではありません。深いデータフロー脆弱性解析で CodeQL/Snyk に並ぶものではなく、PR 統合もなく、コミット毎の linter より重く遅い。速さより厳格さが要る場面で使ってください。 ### インストール プロンプトファイル1つ。Claude Code の skill で、実行依存はありません。 ``` git clone https://github.com/dualform-labs/review-audit-pro.git cp -r review-audit-pro/skills/review-audit-pro ~/.claude/skills/ ``` あとは Claude Code で `/review-audit-pro [対象]`。リリース前 / 高リスク変更 / 最終ゲートでの徹底監査に使います。 #### レポートの言語を選ぶ 既定では、監査レポート(findings の地の文・カバレッジのラベル・判定)は **会話の言語**(`auto`)に従います。日本語か英語に固定したいときは、`skills/review-audit-pro/config.yml` の1行を編集します: ``` output_language: ja # auto(既定)| ja | en ``` `file:line`・コマンド・grep/実行出力・コード・slug は、この設定に関わらず常に英語です。 ### 2つの階層: 既定は軽量、要所で pro ``` flowchart LR DEV["done と言う前に"] --> RA["review-audit
1パス・低トークン"] RA -->|"日常: 問題なし"| SHIP["出荷"] RA -->|"リリース / 高リスク /
検出力の実証が要る"| RAP["review-audit-pro
fan-out + 敵対検証
+ ライブ自己校正"] RAP --> GATE["最終ゲート"] ``` | | [**review-audit**](https://github.com/dualform-labs/review-audit)(companion) | **review-audit-pro**(本リポ) | |---|---|---| | いつ | 日常の「done と言う前」 | リリース / 高リスク / 最終ゲート | | コスト | 低トークン・1パス | 重い・多エージェント fan-out | | 方法 | 自分で6観点を当てる | 観点ごとに fresh エージェント + 敵対検証 | | 検出力の実証 | — | **ライブ自己校正(per-run)** | | ベンチ数値 | 継承しない | このページの数値 | 軽量な1パスの companion [`review-audit`](https://github.com/dualform-labs/review-audit) は、深さや per-run の検出力実証が要るとき pro にエスカレーションします。ここのベンチ数値は **pro** パイプラインのもので、軽量版は継承しません。 **任意の連携(すべて無くても穏やかに縮退・必須ではない):** - `wiring-auditor` subagent: 配線観点を深める。無ければ inline の grep-call-sites にフォールバック。 - `semgrep`(MCP または CLI): セキュリティ観点を強める。無ければ手動 grep で観点は「部分」。 - `codex`(openai-codex プラグイン): 任意の外部レビュアー。**明示的に頼んだときだけ**で、無断起動はしない。 ### ライセンス [Apache License 2.0](LICENSE) · [NOTICE](NOTICE) を参照。
标签:AI代码审查, AI编程助手, Claude Code, 云安全监控, 多智能体, 逆向工具, 防御框架, 静态分析