meat

boldsoftware/meat · reading diff for senior review

1 — 概要

meat は、git の unified diff を「reading diff」に圧縮する Go ツールです。モデルにスタイルや nil-check を再レビューさせるのではなく、概念・アルゴリズム・アーキテクチャを確認するための変更だけを残します。

400 KB1 回のモデル実行
4 MB全体入力上限
24既定の最大ターン
Go 1.24標準ライブラリ中心
出力の契約: 結果は適用用パッチではありません。unified diff の形を保ったまま、レビュー用に行を省略した表示です。
2 — 処理の流れ
01 INPUTHEAD・範囲・staged・stdin
02 CONTEXTread_file / grep で周辺を確認
03 PLANremove / replace / fold
04 COMPILE元の行番号へ検証・適用
05 OUTPUT要約 + 読解用 diff

CLI はまず差分を決め、同じ差分・モデル名・rubric/compiler のハッシュからキャッシュキーを作ります。キャッシュミスのときだけモデルを生成するため、再実行では認証情報やネットワークに触れずに結果を表示できます。

CLI は現在の git root を RepoRoot として渡します。モデルの read_file と grep はそのルート内に閉じ、絶対パスと .. による脱出を拒否します。

モデルは完成済みの diff を書きません。番号付きの元 diff に対する計画を tool call で提出し、ローカルのコンパイラが最終表示を作ります。

3 — 編集計画と検証
操作対象コンパイラが守ること
remove元 diff の inclusive 行範囲座標は常に元の番号。重複範囲・範囲外を拒否。
replace1 行の一部old は一意に一致し、省略部分は ... / … で可視化。
fold同じ極性の連続した変更行インデントを保つ 1 行の省略マーカーへ変換。import を跨ぐ fold は拒否。

自動で削除される機械的ノイズ

  • import / include / require / use 宣言(複数行や埋め込みソース内も対象)
  • 同一ブロックの exact move は両側を同じ扱いにする
  • ファイル・hunk ヘッダーは、本文を残すときだけ一緒に残す
  • 元の diff を変更せず、候補を検証してから SmartDiff を生成する

大きな計画はまず preview_plan に送り、保持行数・fold 数・省略量を確認します。最終 submit では 1 行の summary も検証し、非対称な move、壊れた hunk 構造、空の計画をエラーにします。

4 — 大きな差分の扱い

番号付き diff が 1 回の予算に収まらない場合、meat はファイル・hunk・言語構造の境界を使って分割します。1 つの巨大ファイルを文字数だけで切らず、文字列リテラルや Python の owner/body、import ブロックを途中で切らないようにします。

1 回の予算400 KB
全体の上限4 MB
最大 chunk 数32

各 chunk の結果はファイルメタデータを重複排除して結合します。全体で検出した move は、両側が同じ chunk に収まる場合だけ座標を写して強制します。chunk をまたぐ move は、設計上の既知の境界です。

conceptual output shape
raw unified diff
  └─ structural splitter (file → hunk → language-safe unit)
       ├─ model run: chunk 1
       ├─ model run: chunk 2
       └─ ...
            └─ merge metadata + summaries → reading diff
5 — CLI・プロバイダ・キャッシュ
呼び出し読むもの
meat現在の HEAD
meat REV単一 revision
meat A..Bcommit range
meat -staged / -windex / working tree
git diff | meatstdin の unified diff
選択経路
既定gpt-5.6-sol / OpenAI Responses
claude-*Anthropic Messages
MEAT_MODEL明示指定がない場合の環境変数
埋め込みModel interface を実装

キャッシュは SHA-256(rubric + model + diff) で命名した JSON を ~/.meat に保存します。rubric はプロンプトだけでなく、編集計画コンパイラがモデルに見せる静的 surface とバージョンを含むため、仕様変更時に古い結果を再利用しません。書き込みは一時ファイルから rename する best-effort です。

install / use
go install meat.dev/cmd/meat@latest
meat                 # latest commit
meat -w              # unstaged changes
git show HEAD | meat # any unified diff
6 — 実測例

リポジトリに同梱された 2026-08-02 の評価では、実際のモデル実行で反復変更を 2 変更行まで圧縮した例が記録されています。これは「どの diff でも最小化できる」という保証ではなく、生成コードや同じ修正が多くの hunk に広がるケースでの測定結果です。

言語 / 例入力の変更行Meat 出力省略率残る意味
Go / DNS エラー16287.5%8 つの同型エラー経路から代表 1 箇所
Python / Transformers18288.9%生成コピーではなく modular source の修正
Rust / Helix LSP22290.9%ordered → unordered の concurrency choice
読み方: 評価レポート自身も Django / Flask / pytest の大きな差分では保持量が多く、テスト刺激の選び方に改善余地があると記録しています。出力を盲信せず、読解の起点として使う位置づけです。