プロダクト

Intent Tree モデル

Intent ツリーは、実際にはディスク上の「YAML フロントマターつきの小さな markdown ファイルの集まり」として存在する、辿れる階層です。中心の 3 系統 ── Purpose(なぜ)/ User Context(誰が、いつ)/ Means(どうやって)── が「なぜ・誰のために・どう実現するか」を答え、その周りに rules / specs / execution / clarifications という 4 つの運用フォルダが置かれます。人間が育て、人間とエージェントの両方が読みます。

3 つの系統

Purpose

システムが存在する理由。Mission / Vision / Value / Product Goal。

User Context

誰が、どんな状況で使うか。Primary Actor / Usage Situation / Session Shape。

Means

どのやり方で解きたいか。Interaction Style / System Behavior Style / Abstraction Choice / 技術戦略。

実際のディレクトリ構成

本番で運用している Intent ツリーは、小さな markdown ファイルが集まった一つのフォルダです。3 系統は intent-tree/ の下に、その隣に rules / specs / execution / clarifications という 4 つの運用フォルダが並びます。ルートの 00-map.md が、人間(とエージェント)にどこから読み始めるかを示します。

intents/<domain>/
  intent-tree/
    00-map.md                   # 読み順と、各クラスタが受け持つ範囲
    purpose/
      01-mission.md
      02-vision.md
      03-value.md
      04-product-goal.md
    user-context/
      01-primary-actor.md
      02-usage-situation.md
      03-session-shape.md
    means/
      01-queue-topology.md
      02-tooling-strategy.md
      03-persistence-strategy.md
      ...
  rules/                        # 技術・運用ガードレール
  specs/                        # 下流の契約
  execution/                    # Issue にできるスライスと順序
  clarifications/               # 未解決の問い ── AI が出し、人間が答える
  design/                       # 判断の理由と代替案

実例: intent-cli 自身、加えて社内のプロダクト領域(現時点では非公開)。同じ形がプロダクト領域にも、インフラ領域にも、「このチームはどう判断するか」のようなメタ領域にも使えます。

最初のファイルはどこから来るのでしょうか。プロダクトの初期段階では Intent Storming を行います ── プロダクトオーナーとして技術と意図をまとめる作業で、チームでも、AI にヒアリングしてもらう一人作業でも進められます。出てきた答えはそのまま Purpose / User Context / Means の各ノードとしてツリーに書き込みます。 Intent Storming の詳細 →

ひとつの意図は、フロントマターつきの小さなファイル

各ノードは、固有 ID、状態、1 行の要約、依存する/支える他の意図へのリンクを持ちます。これがあるから、人間が grep できるただのフォルダでありながら、機械からも辿れる構造になります。

---
intent_id: ICL.M.TOPOLOGY
domain: intent-cli
intent_type: means
intent_state: canonical          # inferred → clarified → canonical
readiness: structured
summary: sub-issue を単位にした queue-aware supervisor と selective block を採る。
tags:
  - domain:intent-cli
  - intent:means
  - state:canonical
parent_intents: [ICL.P.MISSION]
related_intents: [ICL.M.TOOLING, ICL.M.WORKER]
source_concepts:
  - intents/rules/nonblocking-agent-loop.md
---

# 本文は普通の日本語/英語 ── なぜそうするか、どの選択肢を採ったか。

あとでこの意図から Issue を切り出すとき、このファイルと、ここからリンクされている関連意図がまとめて Issue の文脈になります。「分かりやすい Issue を書く」が苦行でなくなるのは、文脈が最初から構造化されて添付できる状態にあるからです。

意図が固まっていく 3 つの状態

意図がどれくらい固まっているかを「推測」ではなく「状態」として扱います。意図は次の 3 つの状態を順に通っていきます:

inferred  (推定)    ── エージェントが提案した状態。人間の確認待ち
   ↓
clarified (確定)    ── 人間が確認した状態。意味が固まる
   ↓
canonical (正式採用) ── 下流の spec を縛る基準として採用された状態

canonical(正式採用)の状態にある意図は、spec やコードレビューから「縛り」として参照できます。inferred(推定)のままの意図は参照できません。

昇格は手作業での編集ではなく、クラリフィケーションによって進みます。AI がツリーを継続的にレビューし、「ここはどうしますか?」という問いを推奨案つきで一括して提示します。人間はこだわりがない部分(多くの場合)は推奨案を採用し、こだわりたい部分(自分の判断が本当に効く場所)だけ自分で答える。受け入れた答えはその意図を一段昇格させます。サイクルを回すたびにツリーは厚くなり、最初に巨大な仕様書を書く必要はありません ── そして以後ツリーから切り出される Issue はすべて、その厚くなった文脈を受け継ぎます。

バグ報告も意図を強化する信号になる

Intent ツリーがしっかりしていても、実装は完璧にはなりません。リリース後にバグや調整事項が必ず出てきます ── これはループの「例外」ではなく、ループの一部です。Intent-System では、バグ報告ひとつひとつを次の 2 種類に分類しながら受け止めます:

  • 実装バグ. 意図は正しく書かれていたが、コードがそれを守れていなかったケース。コードを修正します。ツリーは変えません。
  • 意図の漏れがバグとして現れたケース. 意図が何も言っていなかった点について、実装者(人間でもエージェントでも)がそれらしい判断を独自に下し、結果として意図しない振る舞いになったケース。これは純粋なバグというよりも、現実から戻ってきたクラリフィケーション要求です。対応は、関連する意図を追加するか強化して、次回以降同じ点で違う判断が再発しないようにすることです。

この線を正しく引けることで、ツリーは「ただ膨らむ」のではなく「鍛えられて強くなっていく」ものになります。意図の漏れを「単なるコード修正」で済ませてしまうと、チームが本当は何を望んでいたかを記録する機会を失います。逆に、本当は実装ミスにすぎないものを「意図の漏れ」として扱うと、本来書く必要のなかったルールでツリーが汚れていきます。Intent-System は両方の流れを扱います ── コード修正は通常のレビュー・ループへ。クラリフィケーション扱いになったものはツリーを昇格させ、以後切り出される Issue はすべて、より鋭くなった意図を受け継ぎます。

運用上は、各報告は Intent-Bug Issue として起票され、ai-develop 上のエージェント修正ループに再投入されます。そこから main への昇格も、通常の Issue とまったく同じレビュー経路を通ります。 Git-AI-Flow ── 昇格経路を見る →

他の概念との違い

  • 要件定義. spec はスナップショットになります。intent は蓄積します。
  • ADR. ADR は決定を記録します。intent は将来の判断を駆動する理由を記録します。
  • ユーザストーリー. ストーリーは slice。intent はそれが育つツリー。
Intent-System を試す