ADR-0007 — context injection (SessionStart + PreCompact、 Beads-inspired)

Status: accepted · Date: 2026-05-25 · folio v0.4.2-draft · forward (user 承認済、 実装は Track 2 spawn)

§1. Context

ADR-0003 §2.1 は SessionStart hook (inventory Tier 1 を agent に inject、 Beads pattern) と inject-inventory script を minimal scope に列挙し、 mechanism の詳細は「ADR-0007 候補」 として defer していた。 Track 1 (REQ-VER-010) で producer (folio inventory → inventory.json) を実装済。 本 ADR は consumer (注入) を設計する: 何を / いつ / どう inject するか、 inventory.json の staleness をどう扱うか

plugin-architecture-research §5.2 で Beads pattern を verified: {"SessionStart":[{"command":"bd prime"}], "PreCompact":[{"command":"bd prime --stealth"}]} — hook の command stdout が agent context に注入される (~1-2k tokens)。 CLI + hooks 方式は MCP より 10-50x context 効率 (ADR-0003 §4 案 D)。

§2. Decision

§2.1 mechanism = SessionStart hook → folio prime stdout (matcher 省略 = 全 source)

SessionStart hook が folio prime を実行し、 その stdout を agent context に注入する (Beads pattern、 stdout ベース、 MCP 不使用)。 matcher を省略するため SessionStart は startup / resume / clear / compact の全 source で発火し、 session 開始/再開時の初期注入に加え compaction 後 (compact source) の再注入も担う。

§2.2 注入内容 = Tier 1 inventory digest (compact text)

注入は relations.html §4.2 Tier 1 = inventory.json の各 spec entry (@id + title + summary + doc-type + status) を agent-readable な compact text digest (~1-2k tokens 目安) として出力する。 full inventory.json (全 relations 込み) は注入しない。 agent は digest で全体構造を把握し、 詳細 relations は inventory.json を、 spec 本文は各 file を on-demand で Read する (3-tier progressive disclosure)。 digest の具体 layout は HOW (folio-self-spec.html §9 Bindings)。

§2.3 folio prime CLI (Beads bd prime 相当)

folio prime は inventory.json を読み Tier 1 digest を stdout 出力する CLI subcommand。 hook から呼ばれる注入経路であると同時に、 user/architect が手動で実行する entry point でもある。 hook (inject-inventory) は folio prime を呼ぶ薄い wrapper、 または hooks.json から folio prime を直接 command 指定する。

§2.4 staleness = auto-regen

folio prime は inventory.json が 不在または stale (spec の追加・編集・削除が inventory 生成後にある) を検出したら、 folio inventory を自動実行して inventory.json を最新化してから digest を出力する。 注入される context が常に現在の spec 構造を反映することを保証する (scan コストは spec 数が小さいため許容、 user 承認 2026-05-25)。

§3. Consequences

Positive

Negative

Neutral

§4. Alternatives Considered

採用しなかった理由
案 A (採用): SessionStart hook (matcher 省略 = 全 source) → folio prime stdout → Tier 1 digest 注入Beads-inspired、 動的・compact・CLI+hooks 効率、 手動 prime 再利用可。 compact source で post-compaction も再注入 (e2e startup + compact 両 PASS)
案 F: PreCompact hook で stdout 再注入 (当初案、 2026-05-25 amend で却下)Claude Code docs 上 PreCompact stdout は context 注入されない (state 保存用)。 post-compaction 再注入は SessionStart:compact source が担う (2026-05-25 実 compaction で e2e PASS)
案 B: MCP server で context 提供ADR-0003 案 D で却下済: Beads CLI+hooks が MCP より 10-50x context 効率
案 C: 静的 CLAUDE.md に inventory を埋込動的でない (spec 追加・編集を反映できない)、 手動更新コスト
案 D: full inventory.json をそのまま注入token 過多 (~8KB+)、 Tier 1 compact digest の趣旨 (relations §4.2) を defeat
案 E: 注入なし (agent が手動で Read)architect priming の目的を defeat、 agent が spec 構造を毎回手動発見
staleness: warn+stale / fail-require-freshuser が auto-regen を選択 (2026-05-25): 注入 context の常時正確性を優先

§5. Trace