tk3.biz
ブログ一覧に戻る

dev-orchestra のレビューだけを使って、手元の変更を複数のAIに見せてみた

はじめに

前回は、最後に変更全体をもう一度レビューさせました。

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 ライセンス)。役に立ちそうと思ったら、スターを付けてもらえるとうれしいです。

→ github.com/istb16/dev-orchestra

試した環境

項目内容
dev-orchestra1.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 Code2.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 かロール>一部のレビュアーだけを走らせる。人数を減らす仕組みも効かなくなる
--sequential1 人ずつ順に走らせる。どのレビュアーが止まっているかを調べるとき
--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」の一覧でまとめて読めます。

関連記事