有償AIコードレビューをやめてローカル自作に切り替えた話──diffだけを見るPythonツール avouch
OSSツールavouchは、次のコミットで変更するPythonファイルだけをgitとastモジュールでレビューするローカル完結型のツール。開発者が「有償AIレビューは自分が書いてもいないレガシーコードのレビューに時間を割きすぎる」という不満から自作したもので、Hacker Newsで23pt・32コメントの反応を集めた。

目次
3行まとめ
- avouchは「次のコミットで実際に触るPythonファイルだけ」をレビューするローカル完結型のコードレビューツール。対象範囲は
git diff HEAD+未追跡ファイルで決まり、リポジトリ全体は見ない。- 解析は標準ライブラリの
git3コマンドとastモジュールだけで完結し、サーバー通信は一切ない。- 開発者自身が「有償のAIレビューは自分が書いてもいないレガシーコードのレビューに半分の報告を割き、他人のdiffの後ろに自分のキューが並ぶことへの不満」から自作したと明かしている。Hacker Newsでは23pt・32コメントの反応があった。
「継承したコードではなく、自分が変えたコードだけ」
READMEの1行目に書かれているコンセプトがそのままツール名の由来にもなっている——「Review the Python you changed, not the Python you inherited.」。avouchはPython専用のコードレビューツールで、次のコミットで実際に触れるファイルだけを対象にする。gitに変更ファイルの一覧を尋ね、変更された各.pyを標準のastモジュールでパースし、avouch.tomlで設定した制限に照らして構造的な問題(bare except、パラメータ過多など)を報告する。
pip install avouch
avouch
デーモンも常駐プロセスもなく、インストール以外に何かを立ち上げる必要はない。git pushの直前に実行する使い方が想定されている。
動機はREADMEに率直に書かれている
「なぜ作ったか」のセクションは短く、率直だ。「有償のAIレビューは、自分が書いてすらいないレガシーコードのレビューに報告の半分を無駄にし、自分のdiffは他の全員のdiffの後ろに並ばされた。git push直前に実行できて、費用がかからず、自分の変更だけを見せてくれる、ローカルのdiff限定チェックが欲しかったので、自分で作った」。この投稿(Show HN: I canceled my AI code reviewer and wrote a free local one、news.ycombinator.com/item?id=49345154)はHacker Newsで23ポイント・32コメントを集めた(2026年9月4日にHN Algolia APIで確認)。
READMEが強調する3つの性質は「diff-only(レビュー対象はgit diff HEAD+未追跡ファイルであり、リポジトリ全体ではない)」「local(git呼び出し3回+astだけで、サーバーなし)」「yours(ベースラインが既存コードを隠すので、報告される問題はすべて自分のdiffに帰属する)」の3つだ。
実行結果の見え方
READMEに掲載されているサンプル出力は次のような、コンパイラのエラー出力に似た体裁になっている。
$ avouch
AVOUCH · 2 FILES · 4 WARN
────────────────────────────────────────────────
bad.py:1: SCR002: Bare except detected.
│
1 │ def connect(host, port, ...):
│ ^^^^^^^ SCR002
2 │ try:
BY RULE SCR002 Bare except 1
SCR014 Too many parameters 1
PASSED ✓ src/util.py
ファイル:行番号+ルールコード+メッセージ、薄く表示されたコンテキスト、該当箇所を指すキャレット、ルールごとの集計、上限付きの「PASSED」一覧が並ぶ。同じ(コンポーネント, ルール)の重複はファイルごとに集約される。終了コードは0(クリーン)・1(指摘あり)・2(エラー)の3種類で、色付けはTTY接続時のみ、パイプ経由ではプレーンテキストになる。
デフォルトのレビュー範囲は「HEADとの差分+未追跡」で、追加・変更された行にソース範囲が重なる関数・クラスに指摘が限定される(ファイル単位の指摘は変更ファイル全体に適用)。--list-changedは変更ファイルの一覧だけを出力するスクリプト向けオプション、--display FILEはシンタックスハイライト付きのページャ表示、--all-filesと--not-gitはファイル全体を対象にする例外的なモード、として用意されている。
動作条件
Python 3.10以上(ast.Match・tomllibを使用)と、PATH上のgitが前提。インストールはpip install avouchのほか、ソースからpip install -e .でも可能。
ソースコードから読み取った全20ルールとデフォルトの制限値
READMEのavouch --docsを実行しないと分からない、としていたルール一覧を、公開ソースコード(src/avouch/analyzer.pyとsrc/avouch/rules/以下の各ファイル)を直接読むことで確認できた。デフォルトで有効な20ルールと、初回インストール時点の制限値(src/avouch/config/default.py)は次の通り。
| ルールコード | ルール名(コード上の識別子) | 内容 | デフォルト制限値 |
|---|---|---|---|
| SCR001 | async_without_await | asyncなのにawaitがない関数 | ─ |
| SCR002 | bare_except | 裸のexcept:(例外の握りつぶし) |
─ |
| SCR003 | boolean_complexity(max_boolean_conditions) | 条件式のブール演算が多すぎる | 5 |
| SCR004 | detect_duplicateb | 重複したコードブロック | ─ |
| SCR005 | detect_large_comprehensions | 巨大な内包表記 | 40 |
| SCR006 | empty_except | 空のexceptブロック |
─ |
| SCR007 | if_else_chain(max_if_chain) | if/elifの連鎖が長すぎる | 5 |
| SCR008 | large_lambda(max_lambda_nodes) | 複雑すぎるラムダ式 | 10 |
| SCR009 | local_variables(max_local_variables) | ローカル変数が多すぎる | 30 |
| SCR010 | max_class_lines | クラスの行数が多すぎる | 200 |
| SCR011 | max_file_lines | ファイルの行数が多すぎる | 1,000 |
| SCR012 | max_function_lines | 関数の行数が多すぎる | 300 |
| SCR013 | max_nesting | ネストが深すぎる | 5 |
| SCR014 | max_parameters | 引数が多すぎる | 5 |
| SCR015 | nested_function | 関数の中に関数が入れ子になっている | ─ |
| SCR016 | return_statements(max_return_statements) | return文が多すぎる | 6 |
| SCR017 | mutable_default_args | ミュータブルなデフォルト引数(def f(x=[])など) |
─ |
| SCR019 | shell_true | subprocessのshell=True |
─ |
| SCR020 | dynamic_code | eval・execなどの動的コード実行 |
─ |
| (コード番号未確認) | complexity(max_complexity) | サイクロマティック複雑度が高すぎる | 40 |
「デフォルト制限値」欄が「─」のルールは、はい/いいえで判定する種類(裸のexceptがあるかどうか、等)で、数値の上限を持たない。20ルールはすべてsrc/avouch/config/loader.pyのDEFAULT_RULESでデフォルト有効(True)になっている。なお、SCR018に該当するルールは、今回確認した範囲のソースコードからは特定できなかった。
余談だが、avouch自身のリポジトリ直下にあるavouch.toml(開発チーム自身が自分たちのコードをレビューする際の設定)を見ると、max_parameters = 22・max_nesting = 22・max_function_lines = 1262など、上記のデフォルト値よりもかなり緩い制限になっていた。新規ユーザー向けのデフォルトは厳しめ(max_parameters = 5など)に設定しつつ、開発者自身は自分たちの既存コードに合わせて緩めた設定を使っている、という運用の違いがうかがえる。
pip installして実際に動かす検証はしていない
本記事はmukundzha/avouchのGitHub README、および公開されているPythonソースコード(analyzer.py・config/default.py・config/loader.py・rules/以下の各ファイル)を2026年8月29日にcurlで取得した内容にもとづく。実際にpip install avouchを実行し、自分のリポジトリの差分に対してどんな指摘が出るかまでは検証していない。ソースコードを読んで確認したのはルール名・SCRコード・デフォルト制限値であり、各ルールの検出ロジックの詳細な実装(astのどのノードをどう走査しているか)までは、この記事では踏み込んでいない。
「有償AIレビューへの不満から自作した」という文脈の紹介はない
Zenn・Qiitaともに実質的な言及はなかった(Zennはフォールバックのみ)。「有償AIレビューへの不満から自作した」という文脈のツールは、日本語圏ではまだ紹介されていない。
関連記事
出典・参照資料
AIニュースの解説を動画でも
YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。
コメント
まだコメントはありません。最初のコメントを書いてみませんか?
AIについて聞きたいことはありますか?
質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。
質問箱を見る →新しい記事をメールで受け取る
AIの新しい発表を、出典付きで整理して届けます。