ILP: Intent Lineage Protocol

コードの「なぜ」を追跡可能にする CLI ツール。作って、すぐに理想ではなくなった話。

rustclideveloper-tools

出発点: 最高のプログラミング言語を作ろうとした

2月の初め、一つの問いから始まった。

2026年、AI がコードを書ける時代に、人間が本当に書くべきものは何か?

最初に考えたのは、プログラミング言語だった。AI 時代に最適化された、意図と仕様を記述できる新しい言語。型システム、契約、形式検証。設計ドキュメントを8本書いて、文法も PEG で定義した。

でも途中で気づいた。人間が書くべきなのはコードではない。意思決定の連鎖だ。

Git は「何が変わったか」を記録する。でも「なぜそう決めたか」は記録しない。AI が生成したコードで溢れる世界では、コードの量ではなく決定の質と追跡可能性が価値になる。

そこで方針を変えた。プログラミング言語ではなく、プロトコルを作ることにした。意図(Intent)から実装(Code)までの連鎖を形式的に記録し、いつでも辿れるようにする。それが ILP になった。

仕組み

.spec ファイルに、意図から仕様までを階層的に記述する。

intent "なぜECサイトにチェックアウト機能が必要か" {
  @id intent:checkout
  ユーザーが商品を購入できるようにする
}

spec calculate_total {
  @id spec:calc-total
  @links intent:checkout

  fn calculate_total(items: List<Item>) -> Money

  example "空カートは0円" {
    calculate_total([]) == Money(0)
  }

  requires { items.all(|i| i.price > 0) }
  ensures  { result >= Money(0) }
}

各要素は @id で識別され、@links で上位の要素と紐づく。これにより Intent → Spec → Code の DAG(有向非巡回グラフ)が構築される。

できること

コマンド機能
ilp check.spec ファイルの静的解析(重複ID、リンク切れ検出)
ilp lineage任意の要素から上流・下流を探索
ilp generatespec の example/property からテストコードを生成
ilp verifyテスト実行 → 信頼レベルの算出
ilp driftgit 履歴から spec と code の乖離を検出
ilp retroactive既存コードから spec の雛形を逆生成

LSP サーバーと MCP サーバーも実装した。エディタ上での diagnostics や、Claude から spec の読み書きができる。Rust 製、11サブコマンド、30のテストケース。自分自身を .spec で記述するセルフホスティングまでやった。

作った日に気づいたこと

実装しつつ気付いていたことだが、完成した直後に、違和感が生まれた。

.spec を手で書くのは、AI の速度と矛盾している。

AI とのセッションで一瞬で決まったことを、わざわざ .spec ファイルに手動で書き起こす。これは「AIが速すぎて人間が追いつかない」問題を解決するつもりが、逆に人間の手作業を増やしている。

CLAUDE.md や Cursor Rules のように、各ツールが独自にコンテキスト管理を始めていた。仕様と実装の二重管理問題も根深い。作ったものが、完成した瞬間に理想ではなくなっていた。

方向転換: 「書く」から「勝手に残る」へ

本当に必要だったのは、人間が仕様を書くツールではなく、意図が勝手に記録される仕組みだった。

  • AI との対話ログから意図と決定を自動抽出する
  • git commit などのフックで操作の文脈を自動キャプチャする
  • コードの変更から仕様を自動生成・更新する
  • 人間は書くのではなく、確認・承認するだけ

ILP の着眼点 — 意図の追跡可能性 — は正しかった。間違えたのは「人間が書く」という手段の部分だった。

得られた教訓

人間に追加の作業を求めるシステムは、AI時代には全て同じ欠点を持つ。 「勝手に残る」「透明に動く」ものだけが生き残る。

この原則は、ILP の後に作ったこのサイトの設計にも影響している。毎日の記録から自動でコンテンツが生まれる仕組みにしたのは、ILP で学んだことの直接的な応用だ。

ILP の資産

ILP 自体は「手動で .spec を書くツール」としては理想ではなくなったが、作った部品は次に活きる。

  • .spec のパーサーと AST → 出力フォーマットとして再利用可能
  • lineage DAG → 自動キャプチャした意図の関係性管理
  • drift 検出 → 変更トリガーとして使える
  • MCP サーバー → AI 側からの呼び出し口

ソースコードは GitHub で公開している。Rust 製、MIT/Apache-2.0 デュアルライセンス。

← Back to Notes