ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-07-10上級

半年前にエージェントが書いた行の意図を追えるようにする — コミット粒度と来歴トレーラの設計

エージェントが 14 ファイル 800 行を 1 コミットに詰め込むと、半年後の git blame は何も語ってくれません。コミットを意図の単位に割り、Git trailer に来歴を機械可読で残し、blame から設計判断まで逆引きする仕組みを、動くコードとともにまとめます。

Antigravity318エージェント55Git6コミット設計2来歴管理長期運用3

プレミアム記事

半年前に自分のリポジトリで git blame を実行し、手が止まりました。

修正しようとしていた 3 行の担当者は、私自身の名前になっています。日付は 1 月。コミットメッセージは「Refactor cache layer and update tests」。変更されたファイルは 14 個、差分は 800 行を超えていました。

その 3 行は、エージェントが書いたものでした。当時の私は計画を承認し、diff をざっと眺め、まとめて 1 コミットにして push しています。半年後の私に残されたのは、800 行の海に浮かぶ 3 行と、何も語らない一文だけでした。

なぜこの条件分岐が必要だったのか。どのエラーを踏んで、この順序に落ち着いたのか。手がかりは、すでにどこにもありません。

コミットは「作業の単位」ではなく「意図の単位」

人間が手で書いていた頃、コミットの粒度は自然に制御されていました。1 時間かけて 1 つのことを直し、それをコミットする。作業時間そのものが粒度の上限として働いていたわけです。

エージェントに委ねると、この上限が消えます。1 回のセッションで計画が 6 ステップ進み、14 ファイルが書き換わる。それを 1 コミットにまとめてしまうのは、単に「セッションの区切り」がコミットの区切りに見えるからです。

しかし後から履歴を読む人間にとって、セッションの区切りには何の意味もありません。意味を持つのは意図の区切りです。

コミットの割り方半年後の git blame が返すもの差分の平均行数
1 セッション = 1 コミット「Refactor cache layer and update tests」400〜900 行
1 計画ステップ = 1 コミット「Add TTL guard to cache read path」30〜120 行
1 ファイル = 1 コミットファイル名の再掲。意図は失われたまま10〜60 行

3 行目に注意していただきたいのです。粒度を細かくすれば良いという話ではありません。ファイル単位で割っても、なぜその変更が必要だったのかは記録されません。

基準は行数ではなく、その変更を単独で説明できるかです。Antigravity のエージェントは計画(plan)を明示的に持ちます。計画の 1 ステップは、定義上「単独で説明できる変更」に対応しています。ここをコミット境界にするのが、個人開発で 4 サイトの記事生成を自動化するうちに落ち着いた形です。

レビュー担当が私自身しかいない環境では、履歴の読みやすさがそのまま将来の修正速度になります。

エージェントに計画ステップ単位でコミットさせる

実装は素朴で構いません。エージェントに「全部終わったらコミットして」と伝えるのをやめ、ステップの完了ごとにコミットさせます。

# .agent/commit-step.sh
# 使い方: commit-step.sh <step-id> <要約>
set -euo pipefail
 
STEP_ID="$1"; shift
SUMMARY="$*"
 
# ステージされた変更がなければ何もしない(空コミットを作らない)
if git diff --cached --quiet; then
  echo "step ${STEP_ID}: staged changes なし。コミットをスキップします。"
  exit 0
fi
 
FILES=$(git diff --cached --name-only | wc -l | tr -d ' ')
LINES=$(git diff --cached --numstat | awk '{ add += $1; del += $2 } END { print add + del }')
 
# 意図の単位を逸脱しつつある兆候を、その場で警告する
if [ "${FILES}" -gt 8 ] || [ "${LINES}" -gt 300 ]; then
  echo "⚠️ step ${STEP_ID}: ${FILES} ファイル / ${LINES} 行。計画ステップが大きすぎる可能性があります。" >&2
fi
 
git commit -m "${SUMMARY}" \
  -m "Agent-Run-Id: ${AGENT_RUN_ID}" \
  -m "Agent-Step: ${STEP_ID}" \
  -m "Agent-Model: ${AGENT_MODEL}" \
  -m "Agent-Plan-Sha: ${AGENT_PLAN_SHA}"

git commit-m を複数渡すと、2 番目以降が本文の段落として積まれます。末尾の段落が Key: Value の形だけで構成されていれば、Git はそれをトレーラ(trailer)として扱います。つまり git interpret-trailers --parsegit log --format='%(trailers:key=Agent-Run-Id,valueonly)' で機械的に取り出せる、ということです。

コミットメッセージに散文で「エージェントが生成」と書くのとは、まったく意味が違います。散文は読めますが、検索も集計もできません。

AGENT_PLAN_SHA は、承認した計画テキストのハッシュです。計画そのものはセッションに紐づいて消えますが、ハッシュがあれば「この 3 コミットは同じ計画から生まれた」ことは後から確定できます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
エージェント由来コミットに Git trailer で来歴を刻み、任意の行から「なぜこう書かれたか」まで逆引きするスクリプトを動くコードで示します
「1 セッション 1 コミット」をやめ、計画のステップ境界でコミットを割る判断基準と、pre-commit で機械的に強制する方法をお伝えします
アーティファクトは消えるという前提に立ち、検証記録の要旨だけをリポジトリ内に凍結して保存する設計と、その容量見積もりを共有します
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Agents & Manager2026-07-10
エージェントが書いたファイルが .gitignore に飲まれる — commit 前に気づくための検出ゲート
エージェントが生成したファイルが .gitignore に一致していると、差分レビューでは正常に見えるのに commit には含まれません。ignored な生成物を push 前に検出するゲートスクリプトと、その運用調整をまとめました。
Agents & Manager2026-07-01
Guide スキルとコードの乖離を検出して直す仕組み
組み込み Guide スキルに手順を固定すると、後からコードが変わったとき手順だけが取り残されます。参照先の実体を機械照合して乖離を早めに見つけ、Guide を薄く保つ運用設計をまとめます。
Agents & Manager2026-07-01
モデルがフォールバックしても命名と書式をぶらさない — エージェント出力の一貫性を保つ契約
エージェントの実行中にモデルがフォールバックすると、コードの命名規約や書式が静かにぶれます。モデルに依存しないスタイル契約と正規化パスで、出力の一貫性を保つ実装をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →