はじめに
前回は、最後に変更全体をもう一度レビューさせました。
dev-orchestra は、1 文の依頼から設計・実装・テスト・複数の AI によるレビュー・修正までを回す、Claude Code / Codex / Antigravity のプラグインです。
ただ、「設計から全部任せる」のは、試すには少し大きい一歩です。手元に書きかけの変更があって、それを何人かの AI に見てほしいだけ、ということもよくあります。
dev-orchestra のレビューは、ほかの工程とは別に、単独で使えます。今回は、レビューだけを使う手順を紹介します。
- 3 つのコマンド:
review snapshot→review run→review show - snapshot が何を固めるのか、
.ai/に何が残るのか - よく使うオプションと、PR のブランチを見せるときの
--baseの選び方 - コードではなく文章(このブログの記事)をレビューさせる例
dev-orchestra は GitHub で公開しています(MIT ライセンス)。役に立ちそうと思ったら、スターを付けてもらえるとうれしいです。
試した環境
| 項目 | 内容 |
|---|---|
| dev-orchestra | 1.3.0、プリセット standard(optimization.level は既定の balanced) |
| レビュアー | claude-general(Claude Opus)、codex-general(Codex CLI 0.163.0、gpt-6.1-sol)、claude-security(Claude Sonnet)、claude-test(Claude Sonnet) |
| Claude Code | 2.1.312 |
| 環境 | Windows 11、Git Bash、Python 3.14.7、Git 2.55.0。設定は普段とは別のフォルダ(DEV_ORCHESTRA_HOME)に置いた |
dev-orchestra を入れる手順は、Claude Code の回と Codex の回にあります。レビューだけを使う場合も、入れ方と初期設定は同じです。
題材:クーポンを足したブランチ
作業用に、小さな Python のパッケージ shopcart を作りました。main にはカートの小計を出す関数だけがあり、ブランチ feature/coupon でクーポンの関数を足しています。
PERCENT_OFF = {"SAVE10": 10, "SAVE20": 20}
AMOUNT_OFF = {"SAVE500": (500, 3000)} # code: (yen off, minimum subtotal)
def apply_coupon(amount, code):
"""Return the amount to pay after applying the coupon `code`."""
if code in PERCENT_OFF:
discount = amount * PERCENT_OFF[code] // 100
return amount - discount
off, minimum = AMOUNT_OFF[code]
if amount > minimum:
return amount - off
return amount
README には「SAVE500 は小計が 3,000 円以上のとき 500 円引き」「知らないコードなら金額は変えない」「コードの大文字と小文字は区別する(わざと)」と書きました。つまりこのコードには、わざと 2 つの不具合を入れてあります(> は >= のはず、知らないコードで KeyError になる)。クーポンのテスト 3 件(カートのテストと合わせて 5 件)は、どれも通ります。
1. 変更を固める(review snapshot)
ブランチを切った元(main)からの変更を固めます。
dev-orchestra review snapshot --base main
Snapshot: .ai/workflows/b1627574daa6/reviews/review-target.diff
strategy: git diff main
files: 4
size: 2249 bytes (sha256 27ff110afa0b)
snapshot は、レビューする差分を1 つのファイルに固めて、すべてのレビュアーに同じものを見せるための工程です。固めたあとにファイルを直しても、そのラウンドのレビュアーが見る差分は変わりません。--base を付けないと、作業ツリーと HEAD の差(まだ commit していない変更)を固めます。commit していない新しいファイルも、既定で入ります。
固めた内容は .ai/ の下に残ります。
| ファイル | 中身 |
|---|---|
review-target.diff | レビュアーに見せる差分そのもの |
review-target.json | 差分の元(base・base_commit・head)、変更したファイルの一覧、追加と削除の行数、差分の sha256、送らなかったファイル(withheld) |
state.json | この作業(workflow)の記録 |
sha256 は、各レビュアーの報告にも書き込まれます。「全員が同じ差分を見た」ことを、あとから確かめられます。
.ai/ には * だけを書いた .gitignore が自動で置かれるので、うっかり commit することはありません。
設定で
review.context.surrounding: enclosingにすると、差分のまわりの関数やクラスも一緒に固めて、レビュアーに渡せます(既定はnone)。詳しくは references/reviews.md にあります。
2. レビューさせる(review run)
dev-orchestra review run
ok claude-general claude opus 3 finding(s)
1 successful, 0 failed
Consolidated: .ai/workflows/b1627574daa6/reviews/consolidated.md
note: claude-test (when: relevance) added: shopcart/__init__.py is not documentation
note: no test result recorded for this change, so the review is running unchecked. `state record test ok` before `review run` lets this stop a review of a red tree.
note: low-risk change (4 file(s), 49 line(s)): 1 reviewer instead of the full panel (claude-general). Cross-model disagreement is what a second reviewer buys; raise optimization.level or the low_risk thresholds to keep it.
17 秒で終わりました。ただし、レビューしたのは 1 人だけです。1 つ目の note: は、テストの観点のレビュアー claude-test を「ドキュメントだけの変更ではない」ので候補に入れた、という知らせです。それでも走ったのは claude-general だけでした。最後の note: のとおり、balanced では小さく高リスクのパスにも触れない変更(今回は 4 ファイル・49 行)は、レビュアーを 1 人に減らします。計測の回でも同じことが起きました。
2 つ目の note: は、テストの結果を記録していないという知らせです。レビューだけを使うときは気にしなくてかまいません。テストが落ちている変更をレビューさせたくないなら、先に dev-orchestra state record test ok(または failed)を記録しておくと、failed のときにレビューを止めてくれます。
3. 結果を見る(review show)
dev-orchestra review show
出力の最初と、1 件目の指摘はこうでした(以降は省略)。
Source: .ai/workflows/b1627574daa6/reviews/consolidated.json
# Consolidated review
- Generated: 2026-10-29T13:19:24Z
- Iteration: 1
- Snapshot: 27ff110afa0b
- Reviewers: 1 ok / 1 total
- Coverage: round complete, change complete
- Findings: 3 (0 duplicate report(s) merged)
## Reviewers
- ok [general] claude-general / claude / opus -- 3 finding(s)
## Findings
### F1 [HIGH] correctness
- Location: `shopcart/coupon.py`:12
- Reported by: claude-general
- Possible duplicate of: none
- Triage: needs-triage
- Problem: Any code missing from `PERCENT_OFF` drops through to `AMOUNT_OFF[code]`, so an unknown code raises `KeyError`. The README says an unknown code should leave the amount unchanged.
- Impact: Checkout crashes when a user enters a mistyped or lowercase code like `save10`. The README calls out lowercase codes as invalid on purpose, so this input is expected.
- Evidence: `off, minimum = AMOUNT_OFF[code]`
- Recommended fix: Add `if code not in AMOUNT_OFF: return amount` before the lookup, or use `AMOUNT_OFF.get(code)` and return `amount` when it is `None`.
指摘は 3 件で、仕込んだ 2 つの不具合(F1 の KeyError、F2 の >)と、境界のテストが無いという F3 でした。指摘には重大度・場所・問題・影響・根拠・直し方が、決まった形で並びます。
--json を付けると同じ内容を JSON で出せるので、ほかのツールに渡すこともできます。
4. 複数の AI に見せる(—only)
1 人に減らされたままでは「複数の AI」になりません。--only でレビュアーを名指しすると、人数は減らされません。同じ snapshot に、残りの 3 人を足しました。
dev-orchestra review run --only codex-general claude-security claude-test
ok codex-general codex gpt-6.1-sol 2 finding(s)
ok claude-security claude sonnet 4 finding(s)
ok claude-test claude sonnet 5 finding(s)
3 successful, 0 failed
Consolidated: .ai/workflows/b1627574daa6/reviews/consolidated.md
note: claude-test (when: relevance) added: named by --only
note: no test result recorded for this change, so the review is running unchecked. `state record test ok` before `review run` lets this stop a review of a red tree.
3 人は並列に走り、19 秒で終わりました。--only で一部だけを走らせても、まとめ(consolidated)にはほかのレビュアーのこの snapshot への報告も入ります。review show を見ると、4 人・14 件の指摘になっていました。
- Reviewers: 4 ok / 4 total
- Coverage: round complete, change complete
- Findings: 14 (0 duplicate report(s) merged)
仕込んだ 2 つの不具合は、どちらも 3 人が別々に不具合として指摘し、claude-test も「それを確かめるテストが無い」という形で触れていました。14 件のうちどれを採用し、どれを重複や却下にするかは、次の回で扱います。
最初から 4 人に見せたいなら、--only に 4 人を並べるか、optimization.level を上げます。ロール名(general・security など)でも名指しできます。
5. よく使うオプション
| オプション | 使いどころ |
|---|---|
--only <id かロール> | 一部のレビュアーだけを走らせる。人数を減らす仕組みも効かなくなる |
--sequential | 1 人ずつ順に走らせる。どのレビュアーが止まっているかを調べるとき |
--context "…" | すべてのレビュアーに同じ前提を渡す(「README が仕様」「これは記事」など) |
--timeout <秒> | 1 人あたりの制限時間を、この実行だけ変える |
まとめて使うとこうなります。この節と次の節は、題材のリポジトリを複製した場所で試しました。workflow の名前は、環境変数 DEV_ORCHESTRA_WORKFLOW で pr-check と決めています(決めないと、b1627574daa6 のような名前が自動で付きます)。
dev-orchestra review run --only claude-general codex-general --sequential --timeout 300 --context "This is a pull request that adds coupons. The README is the spec."
ok claude-general claude opus 3 finding(s)
ok codex-general codex gpt-6.1-sol 2 finding(s)
2 successful, 0 failed
Consolidated: .ai/workflows/pr-check/reviews/consolidated.md
note: no test result recorded for this change, so the review is running unchecked. `state record test ok` before `review run` lets this stop a review of a red tree.
順に走らせたので 27 秒かかりました。
6. PR のブランチを見せるときの —base
--base main は、main と今の作業ツリーの差を取ります(strategy: git diff main)。ブランチを切ったあとに main が進んでいると、main で増えた変更が、このブランチで消したように差分に入ります。
試しに、ブランチを切ったあとの main に README の 1 行を足す commit をして、もう一度 --base main で固めました。差分にはこの行が入っていました。
-- `subtotal` ignores nothing: every item counts
このブランチでは触っていない行が、「消した行」としてレビュアーに見せられています。ブランチの分かれ目(merge-base)を --base に渡すと、この行は入りませんでした。
dev-orchestra review snapshot --base $(git merge-base main HEAD)
Snapshot: .ai/workflows/pr-check/reviews/review-target.diff
strategy: git diff 77d4296d87f869eb4af4d5cf1ca41b135cef2b31
files: 4
size: 2249 bytes (sha256 27ff110afa0b)
sha256 が、main が進む前に取った最初の snapshot と同じになっています。GitHub の PR が見せる差分も分かれ目からの差なので、PR のブランチを見せるときは merge-base を渡すのがおすすめです。リモートの main と比べるなら、git fetch のあとに origin/main との merge-base を使います(今回はローカルの main で試しました)。
7. lockfile の中身は送らない(review.exclude)
依存関係を上げると、lockfile に何百行もの差分が出ます。人が書いたものではないのに、レビュアーの人数分トークンを使ってしまいます。dev-orchestra は既定で、lockfile・dist/・vendor/・node_modules/・圧縮した JS や CSS・source map・*.snap の差分の中身を送りません(review.exclude)。
試しに、題材の複製に、npm の lockfile に見立てた 306 行の package-lock.json(commit していない新しいファイル)を置き、cart.py にもコメントを 1 行足して、--base を付けずに固めました(workflow の名前は excl)。
Snapshot: .ai/workflows/excl/reviews/review-target.diff
strategy: git diff HEAD
files: 1
size: 311 bytes (sha256 a42cd872c7e8)
withheld: 1 file(s), 306 changed line(s) not sent to reviewers
package-lock.json (package-lock.json)
reviewers are told these changed; --no-exclude sends them in full
ファイルの名前と変わった行数はレビュアーに伝わるので、隠すわけではありません。すべて送りたいときは --no-exclude を付けます。トークンとコストの話は、連載の 17 本目(2026 年 11 月 23 日公開予定)にまとめました。
8. コードでなく文章にも使える
レビューする差分は、コードでなくてもかまいません。このブログでは、公開する前の記事を review run でレビューさせています(docs/blog/series.md の「レビュー」)。この記事も、次の回の記事と一緒に、書き終えたあとで次のようにレビューさせました。
dev-orchestra review snapshot
dev-orchestra review run --only claude-general codex-general --context "These are two Japanese blog posts (a series on dev-orchestra), not code. Review facts, not style: check that every command, option, output and behaviour described matches dev-orchestra 1.3.0, whose docs are in C:/Projects/dev-orchestra (references/reviews.md, references/cli.md, references/workflow.md) and ~/.claude/plugins/cache/dev-orchestra/dev-orchestra/1.3.0. The outputs quoted were captured from real runs against a small sample repo; flag any claim that contradicts the docs, any internal inconsistency between the two posts, and anything misleading to a reader. Repository rules for posts are in CLAUDE.md and docs/blog/writing.md."
レビュアーには、コードをレビューするように頼んでいます。そこで --context で「コードではなく記事であること」と「事実を確かめる先」を伝えています。--context を付けずに記事をレビューさせたことは無いので、付けないとどうなるかは試していません(コマンドの中のホームのパスは ~ に置き換えました)。
この記事と次の回の記事をまとめてレビューさせると、claude-general と codex-general から 6 件の指摘が出ました。翻訳がまだ無いという指摘(書いている途中だったため)のほかに、「テストの数が 2 本の記事で合わない(3 件 + 5 件のはずが 10 件)」「不具合を見つけた人数が 2 本の記事で食い違う」といった、記事どうしの数字の食い違いが見つかり、すべて直しました。
デメリットも書いておく
- 差分は、登録したレビュアーの各ベンダーに送られます。 4 人の構成なら、Anthropic と OpenAI の両方に送られました。レビュアーは読み取り専用でまわりのファイルも読めるので、送られるのは差分だけとは限りません。社外に出せないコードは、ローカル LLM をレビュアーにする方法を使ってください
- 小さな変更では、既定で 1 人に減ります。 複数の AI に見せたいなら、
--onlyかoptimization.levelで人数を決めておく必要があります - 指摘は主張であって、事実ではありません。 4 人に見せると 14 件出ましたが、中身が重なっているものが多く、そのまま直すと同じ修正を何度も頼むことになります
- トークンは人数に比例して増えます。 レビュアーは並列に走るので時間はそれほど延びませんが、費用は人数分かかります
まとめ
- dev-orchestra のレビューは、設計や実装の工程を使わずに単独で使える
review snapshotで差分を固め、review runでレビューさせ、review showで読む- 固めた差分と結果は
.ai/に残り、.gitignoreで commit からは外れる - 小さな変更は既定で 1 人に減る。複数の AI に見せるなら
--onlyで名指しする - PR のブランチを見せるときは、
--baseに merge-base を渡す - lockfile などの中身は既定で送らない。コードでなく記事のレビューにも使える
次回(2026 年 11 月 13 日公開予定)は、今回出た 14 件の指摘を、採用・却下・重複に仕分けて、修正役に直させます。
GitHub: istb16/dev-orchestra(スターを付けてもらえると励みになります)
この連載の記事は、「dev-orchestra」の一覧でまとめて読めます。
関連記事
dev-orchestra で、最後に変更全体をもう一度レビューさせてみた
dev-orchestra 1.3.0 で入った「最後に変更全体をレビューする」(review.whole_change_recheck)を、小さな Python のパッケージで試しました。修正だけを見た回が 0 件で終わったあと、全体の回が修正と前の変更の食い違いを 1 件見つけました。わざとぶつかる修正では、修正だけの回が先に見つけました。
dev-orchestra の所要時間と、レビュアーの人数ごとの指摘数を測ってみた
dev-orchestra 1.2.1 で小さな機能追加を1件依頼し、かかった時間(承認待ちを除いて約6分)と、レビュアーを1人・2人・4人にしたときの指摘数と採用数を測りました。人数を増やすと採用できる指摘は増えましたが、増えたのはテストの指摘でした。
dev-orchestra で役割ごとに決まった指示を渡してみた
dev-orchestra 1.2.1 で入った instructions を試しました。implementer やレビュアーへの決まった指示をリポジトリに書いておくと、毎回のプロンプトに入ります。どう表示され、どこに入り、指示を変える変更がどう扱われるかを、実際の出力で確かめます。