ILP: Intent Lineage Protocol
コードの「なぜ」を追跡可能にする CLI ツール。作って、すぐに理想ではなくなった話。
出発点: 最高のプログラミング言語を作ろうとした
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 generate | spec の example/property からテストコードを生成 |
ilp verify | テスト実行 → 信頼レベルの算出 |
ilp drift | git 履歴から 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 デュアルライセンス。