2026年9月5日 土曜日
AI時短ラボ
検証· 約12

有償AIコードレビューをやめてローカル自作に切り替えた話──diffだけを見るPythonツール avouch

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

有償AIコードレビューをやめてローカル自作に切り替えた話──diffだけを見るPythonツール avouch
執筆・編集:
目次

3行まとめ

  1. avouchは「次のコミットで実際に触るPythonファイルだけ」をレビューするローカル完結型のコードレビューツール。対象範囲はgit diff HEAD+未追跡ファイルで決まり、リポジトリ全体は見ない。
  2. 解析は標準ライブラリのgit3コマンドとastモジュールだけで完結し、サーバー通信は一切ない。
  3. 開発者自身が「有償の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.Matchtomllibを使用)と、PATH上のgitが前提。インストールはpip install avouchのほか、ソースからpip install -e .でも可能。

ソースコードから読み取った全20ルールとデフォルトの制限値

READMEのavouch --docsを実行しないと分からない、としていたルール一覧を、公開ソースコード(src/avouch/analyzer.pysrc/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 subprocessshell=True
SCR020 dynamic_code evalexecなどの動的コード実行
(コード番号未確認) complexity(max_complexity) サイクロマティック複雑度が高すぎる 40

「デフォルト制限値」欄が「─」のルールは、はい/いいえで判定する種類(裸のexceptがあるかどうか、等)で、数値の上限を持たない。20ルールはすべてsrc/avouch/config/loader.pyDEFAULT_RULESでデフォルト有効(True)になっている。なお、SCR018に該当するルールは、今回確認した範囲のソースコードからは特定できなかった。

余談だが、avouch自身のリポジトリ直下にあるavouch.toml(開発チーム自身が自分たちのコードをレビューする際の設定)を見ると、max_parameters = 22max_nesting = 22max_function_lines = 1262など、上記のデフォルト値よりもかなり緩い制限になっていた。新規ユーザー向けのデフォルトは厳しめ(max_parameters = 5など)に設定しつつ、開発者自身は自分たちの既存コードに合わせて緩めた設定を使っている、という運用の違いがうかがえる。

pip installして実際に動かす検証はしていない

本記事はmukundzha/avouchのGitHub README、および公開されているPythonソースコード(analyzer.pyconfig/default.pyconfig/loader.pyrules/以下の各ファイル)を2026年8月29日にcurlで取得した内容にもとづく。実際にpip install avouchを実行し、自分のリポジトリの差分に対してどんな指摘が出るかまでは検証していない。ソースコードを読んで確認したのはルール名・SCRコード・デフォルト制限値であり、各ルールの検出ロジックの詳細な実装(astのどのノードをどう走査しているか)までは、この記事では踏み込んでいない。

「有償AIレビューへの不満から自作した」という文脈の紹介はない

Zenn・Qiitaともに実質的な言及はなかった(Zennはフォールバックのみ)。「有償AIレビューへの不満から自作した」という文脈のツールは、日本語圏ではまだ紹介されていない。

関連記事

シェア: ポスト はてブ

出典・参照資料

AIニュースの解説を動画でも

YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。

コメント

まだコメントはありません。最初のコメントを書いてみませんか?

AIについて聞きたいことはありますか?

質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。

質問箱を見る →

新しい記事をメールで受け取る

AIの新しい発表を、出典付きで整理して届けます。

関連記事

Claude Codeの「毎回ゼロから調べ直す」を止める「Graft」──SWE-benchで33/50 vs 27/50まで踏み込んだ数字の記事画像
検証09.04読了12

Claude Codeの「毎回ゼロから調べ直す」を止める「Graft」──SWE-benchで33/50 vs 27/50まで踏み込んだ数字

出典 ─ trailhq/Graft
Ollamaユーザー向けのデスクトップアプリ「ChatOSS」──ローカルモデルでコード・カンバン・独自アプリを1画面にまとめるの記事画像
検証09.05読了11

Ollamaユーザー向けのデスクトップアプリ「ChatOSS」──ローカルモデルでコード・カンバン・独自アプリを1画面にまとめる

出典 ─ ChatOSS 公式サイト(トップページ)
自分だけの検索エンジンを作る「Hister」──ブラウザ履歴もローカルファイルもMCP経由で検索対象にするの記事画像
検証09.05読了11

自分だけの検索エンジンを作る「Hister」──ブラウザ履歴もローカルファイルもMCP経由で検索対象にする

出典 ─ Hister | Your Own Sear
「hf CLIの使い方をAIエージェントに教えるスキル」が、CLIのインストーラーで自動配置されるようになったの記事画像
検証09.05読了11

「hf CLIの使い方をAIエージェントに教えるスキル」が、CLIのインストーラーで自動配置されるようになった

出典 ─ huggingface/huggingfac
MCP Python SDK v2安定版──FastMCPがMCPServerに、サーバーはクライアントを呼べなくなった代わりに何が変わったかの記事画像
検証09.05読了11

MCP Python SDK v2安定版──FastMCPがMCPServerに、サーバーはクライアントを呼べなくなった代わりに何が変わったか

出典 ─ modelcontextprotocol/p
1プロセスで4つのLoRA専門家を切り替えるMixture-of-LoRA Harness──748BのVentiと50BのTallを同じコードで動かすの記事画像
検証09.05読了12

1プロセスで4つのLoRA専門家を切り替えるMixture-of-LoRA Harness──748BのVentiと50BのTallを同じコードで動かす

出典 ─ MindLab-Research/Mixtu
Agent Client Protocol(ACP)とは──コーディングエージェントを「LSPのように」つなぐ標準規格の記事画像
検証09.04読了13

Agent Client Protocol(ACP)とは──コーディングエージェントを「LSPのように」つなぐ標準規格

出典 ─ Introduction(Agent Cli
AIエージェントの`rm -rf`を実行前に止める「Doberman」──自己申告ベンチマークを読むと見えてくる限界の記事画像
検証09.04読了12

AIエージェントの`rm -rf`を実行前に止める「Doberman」──自己申告ベンチマークを読むと見えてくる限界

出典 ─ fu351/Doberman-Core