ANTIGRAVITY LABEN
記事一覧/Editor View
Editor View/2026-07-11中級

エージェントが足した行だけを見たい — 変更行スコープの規約リンターで、レガシーの警告に埋もれない

エージェントに小さな修正を頼んだら、古いファイルに触れた瞬間に警告が13件出て、どれがエージェントの仕業か分からなくなりました。変更行だけに規約を当てるリンターを組んだら、13件が3件へ、約77%減りました。差分から追加行を取り出し、そこだけを検品する仕組みを、動くコードでまとめています。

Antigravity321AGENTS.md10コードレビュー8リンター差分

プレミアム記事

エージェントに「削除APIを一本足しておいてください」と頼みました。返ってきた差分は、関数がひとつ増えただけの、素直な変更です。念のため保存前のリントを走らせて、手が止まりました。

警告が13件。

画面を上から追っても、そのほとんどが数年前に自分で書いた console.logvar でした。エージェントが今回足した行は、そのうちのどれなのか。ひとつずつ照合して、ようやく「新しく混ざった違反は3件」だと分かった頃には、レビューする気力の半分が削られていました。

問題はエージェントではありません。ファイル全体にリントを当てているから、警告の数が「変更の大きさ」ではなく「そのファイルが抱える負債の量」に比例してしまう。その比例を断ち切る小さな仕組みを、ここで組んでいきます。エージェントが触れた行だけを検品する、変更行スコープのリンターです。個人開発でエージェントに編集を任せる場面が増えるほど、この一手は効いてきます。

なぜ「ファイル全体」ではなく「変更行」なのか

エージェント時代のコードレビューには、以前と違う手触りがあります。人間が一行ずつ書いていた頃は、変更とファイルの範囲がだいたい一致していました。新しく書いたファイルには新しい規約が最初から効いていて、古いファイルは古いまま、境界がはっきりしていた。

エージェントはその境界を軽々と越えます。「この関数の隣に一本足して」という指示だけで、10年もののレガシーファイルにためらいなく手を入れる。結果として、5行の追加に対して、そのファイルが積み上げてきた数百行分の古い違反が一緒に画面へ流れ込みます。

ここで全体リントを回すと、レビュアーは二つの損をします。ひとつは、本当に見るべきエージェントの追加行が、既存違反のノイズに埋もれること。もうひとつは、「ついでだから古い違反も直そう」という誘惑に負けて、頼んでいない範囲までエージェントに書き換えさせ、差分が肥大化することです。

変更行スコープは、この両方をほどきます。判定の対象を「今回の差分で追加された行」に限定する。レガシーの負債はそのまま残しますが、少なくとも新しく足された違反は一件残らず捕まえられます。負債を増やさないことに専念する、という割り切りです。

差分から「追加された行」を取り出す

仕組みの心臓は、git diff の出力から追加行を行番号つきで拾うことです。ポイントは --unified=0 を指定して、前後のコンテキスト行を出させないこと。コンテキストが混ざると「変更していない行」まで対象に入ってしまい、スコープを絞る意味が薄れます。

ハンクヘッダ @@ -a,b +c,d @@+c が、新しいファイルでの開始行番号です。そこから + で始まる行を数えていけば、追加行の実際の行番号が分かります。

import re, subprocess
 
def added_lines(path):
    """差分で追加された (新しい行番号, テキスト) の一覧を返す"""
    out = subprocess.run(
        ["git", "--no-pager", "diff", "--unified=0", path],
        capture_output=True, text=True).stdout
    added, newno = [], None
    for ln in out.splitlines():
        m = re.match(r'@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@', ln)
        if m:
            newno = int(m.group(1))
            continue
        if newno is None:
            continue
        if ln.startswith('+') and not ln.startswith('+++'):
            added.append((newno, ln[1:]))
            newno += 1
        elif not ln.startswith('-'):
            newno += 1
    return added

- で始まる削除行は新しいファイルには存在しないので、行番号を進めません。削除行を数えてしまうと、以降の行番号が全部ずれます。ここが地味に事故りやすい落とし穴です。

複数のハンク(ファイルの離れた場所を二箇所いじった、など)も、ハンクヘッダを見るたびに newno を貼り替えるので、そのまま正しく追従します。私自身、手元で上下二箇所を編集した差分に当てて、上の追加行と下の追加行の両方を、それぞれ正しい行番号で拾えることを確かめました。

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

この記事の続きを読む

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

この記事で得られること
git diff から「追加された行」だけを行番号つきで取り出す差分パーサ
変更行だけに規約を当てるリンターの実装と、13件から3件へ約77%減る実測
AGENTS.md の助言レイヤーと決定的ゲートを二段構えで噛み合わせる運用
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

Editor View2026-06-26
Antigravity が一気に書いた巨大な差分を、意味単位のコミットに分け直す
エージェントが書いた数百行の差分を、そのままコミットしていませんか。レビューできない一括コミットを、関心ごとに分け直すための実践的なワークフローとスクリプトを紹介します。
Editor View2026-06-22
入れ子になったAGENTS.mdの優先順位 — 複数プロジェクトを一つのワークスペースで束ねる合流設計
一つのワークスペースに複数のプロジェクトを置き、それぞれにAGENTS.mdを持たせると、エージェントはどの指示に従うのか曖昧になります。ルートと各プロジェクトの指示が静かに衝突し、片方だけが効いたり両方が混ざったりします。「近いほど強い」を基本則に、上書きと追記を区別して合流させる設計を、動くPython実装と運用の所感つきでまとめました。
Editor View2026-04-13
Gemma 4 × Antigravity:機密コードを外部に送らないローカル AI コードレビュー環境の構築
Gemma 4をローカルで動かし、Antigravityのコードレビュー機能と組み合わせることで、機密コードを一切外部送信せずにAIレビューを実現する方法を解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →