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개 테스트 케이스. ILP 자체를 .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 듀얼 라이선스.