ADR-0060: Claude Code auto memory システムの運用ルール (命名規約 / stale 検出 / clean-up) を確立
- Status: Accepted
- Mode: Standard
- Scope: platform
- Kruchten Type: Property/Executive
- Implementation Status: Not Started
- 起案者: [email protected]
- 起案日時 (JST): 2026-05-22 18:53
- 承認日時 (JST): 2026-05-22 19:15 (Pipeline 通常 flow v2 48/50 通過)
- Review After: 2026-08-22 (3 ヶ月), 2026-11-22 (6 ヶ月), 2027-05-22 (1 年)
- Deciders: [email protected] (単独)
コンテキスト
1.1 背景 (Background)
Claude Code の auto memory システムは ~/.claude/projects/<project-slug>/memory/ 配下に persistent file として保存され、MEMORY.md がインデックスとして機能する。直近 2 ヶ月で nav prefix 系 ADR (ADR-0055/0058/0059) の採択により memory の stale 化事例が発生し、運用ルール明文化の必要性が顕在化した。
1.2 現状 (Current State / As-Is)
明示的な運用 ADR がなく、命名規約・stale 検出・clean-up タイミングが暗黙運用となっている。本リポは memory 14 件 (2026-05-21 時点) が蓄積している。
実例 + 発生頻度予測:
- 実測 n=1:
project_adr0039_implementation.mdの本文 + MEMORY.md L9 サマリーに「サイドバー 1.A.NN/1.I.NN 体系統一」と記載されていたが、ADR-0055 (2026-05-19) で<NS>.<group_number>.<page_index>形式に刷新されて stale 化。handover 2026-05-20 セッションで sub session 側が偶然発見し PR #881 関連で修正 - 構造的リスクの裏付け (proxy): 本リポは memory 14 件 (2026-05-21 時点) が蓄積。直近 2 ヶ月の nav prefix 系 ADR 採択 (ADR-0055/0058/0059) で 3 件の構造変化発生 → memory への波及 proxy で 年間 5-10 件の stale 発生想定
- 集計手順 (再現可能化):
gh pr list --search 'ADR-' --state mergedで ADR merge 履歴取得- 各 ADR で MEMORY.md 配下を grep し参照件数を抽出
- stale 化候補のうち実際に発覚した件数 / 件数全体 = stale 発生率
1.3 課題 (Problem)
- 規約欠如により stale 化が偶発的発見に依存しており、ADR-0055 起因の stale が翌日まで未検出だった (PR #881 で事後修正)
- memory 件数増加で stale 化リスクが累積し、新規 session 開始時の方針再発見コストが発生
- 将来 AI Agent / 第三者参加時 (Jr 入社 2026-10 想定) の引き継ぎ手順が不明確
1.4 制約・要件 (Constraints & Requirements)
- gitignored ディレクトリのため CI lint 対象外、週次手動実行を前提とする
- Claude Code session 固有: 他 AI Agent (Gemini / GPT-4o) は同 memory システムを参照しない
- 副作用最小化: 検証 script は WARN 出力のみ、自動削除や移動はしない
- 既存 14 件への破壊的変更は避け、初回 PASS 確認可能な範囲に留める
1.5 目標 (Goals / To-Be)
memory の命名規約・frontmatter 必須フィールド・stale 検出 rule・clean-up タイミングを ADR で明文化し、scripts/memory-stale-check.mjs による週次検証を確立する。Non-Goals: Claude Code 全体への汎用適用、他 AI Agent への展開、memory システム自体の廃止。
決定
memory システムの運用ルールを ADR で確立する。具体策:
- 命名規約:
<type>_<slug>.md形式 (type ∈ {user, feedback, project, reference}) - frontmatter 必須フィールド:
name/description/metadata.type(欠落時は skip-with-warning、削除しない) - MEMORY.md インデックス書式:
- [<title>](<file>) — <one-line hook>(Markdown List) - stale 検出 rule:
- R-MEM-1 (週次 grep): memory 内の
ADR-\d{4}/PR #\d+参照が現存するか - R-MEM-2 (任意, PR 影響大時): memory 本文の具体ファイル / 関数 / flag 名の現存確認
- R-MEM-1 (週次 grep): memory 内の
- clean-up タイミング:
- (a) 関連 ADR が Superseded → memory 更新 or 削除
- (b) memory 主題が CLAUDE.md / docs に正式採用 → memory 削除 (重複防止)
- (c) 6 ヶ月以上アクセスなし + 関連情報が古い → 削除候補レビュー
- 新 memory 起票時の事前確認: CLAUDE.md / 既存 docs / 既存 memory と重複しないか grep
判断基準 (Decision Drivers)
3.1 評価軸 (Q42 9 タグから 3-5 個選定)
| # | 軸 | 重要度 (係数) | 案件特有の解釈 |
|---|---|---|---|
| 1 | #reliable | [Must] (×2.0) | stale memory による誤情報伝播を防止できるか |
| 2 | #maintainable | [Must] (×2.0) | 運用ルールが明文化され、第三者引き継ぎが可能か |
| 3 | #suitable | [High] (×1.0) | memory システム本来の persistent context 価値を維持するか |
| 4 | #operable | [High] (×1.0) | 週次運用負荷が許容範囲 (≤ 15-30 min) か |
| 5 | #efficient | [Medium] (×0.5) | ROI が許容範囲か (long-term break-even) |
K.O. criterion: Must 軸 (#reliable / #maintainable) の score < 3 は不採用。
3.2 評価軸 × 案スコア表
| 軸 | 係数 | 採択案 (ADR 化) | 案 X1 (CLAUDE.md 追記) | 案 X2 (現状維持) | 案 X3 (memory 廃止) |
|---|---|---|---|---|---|
#reliable | ×2.0 | 4 | 3 | 1 | 5 |
#maintainable | ×2.0 | 4 | 2 | 2 | 3 |
#suitable | ×1.0 | 4 | 4 | 3 | 1 |
#operable | ×1.0 | 3 | 4 | 5 | 5 |
#efficient | ×0.5 | 2 | 4 | 5 | 4 |
| 加重和 (正規化) | 0.711 | 0.611 | 0.589 | 0.711 | |
| K.O. 通過 (Must ≥3) | ✓ | ❌ (#maintainable=2) | ❌ (#reliable=1) | ❌ (#suitable=1) |
加重和では X3 が同点だが、K.O. (#suitable=1) で不採用。採択案が唯一の K.O. 通過。
検討した代替案 (Alternatives Considered)
- 採用案 (ADR で運用ルール確立) — Good: 暗黙運用の明文化、将来 AI Agent / 第三者参加時の引き継ぎ容易 / Bad: 個別 project 固有のため Claude Code 全体への汎用適用は限定
- 案 X1: CLAUDE.md に運用ルールを追記 (ADR 化しない) — Bad: CLAUDE.md が膨張 (~200 行)、6-12 ヶ月後の再議論ありそうな決定は ADR 適切 (起案前 checklist Q1)。K.O. 不通過: #maintainable=2
- 案 X2: 何もしない (現状の暗黙運用継続) — Bad: memory 件数増加で stale 化リスク累積、新規 session 開始時の方針再発見コスト。K.O. 不通過: #reliable=1
- 案 X3: memory システム自体を縮小 / 廃止し CLAUDE.md / docs に一元化 — Bad: session 跨ぎ persistent context という memory 本来価値を捨てる、Anthropic 公式機能の放棄。K.O. 不通過: #suitable=1
影響 (Consequences)
5.1 正の影響 (Good)
- 改修対象:
- 既存 memory 14 件: frontmatter / 命名規約チェック + 違反箇所修正 (~30-60 min one-shot)
- 新規 script:
scripts/memory-stale-check.mjs(~80 行想定、regex + frontmatter parse) MEMORY.md: インデックス書式統一 (現行ですでに準拠、追加修正なし想定)
- 暗黙運用の明文化により、stale 化事故 (~30 min/件 × 5-10 件/年 = ~2.5-5h/年) の削減
- session 開始時の運用方針再発見コスト ~5-10 min × ~50 sessions/年 = ~4-8h/年 の削減
- 削減効果合計 6.5-13h/年
- Jr 入社 (2026-10) 時の onboarding コスト削減で長期 break-even (2027 想定)
5.2 負の影響 (Bad)
- 年間総運用工数 ~19-32h/年 ((15-30 min × 52 週) + (30 min × 12 月)) → 削減効果 6.5-13h/年 を上回り 短期は net cost (運用負担増)
- 初期実装 ~1-2h + 既存 14 件規約準拠化 ~30-60 min
- 個別 project 固有ルールのため他 project への流用性が低い
5.3 中立・トレードオフ (Neutral / Trade-offs)
- 検証対象:
~/.claude/projects/<slug>/memory/配下全.mdファイル (14 件、件数増加に従い拡大) - 波及範囲:
- Claude Code session 固有: 他 AI Agent (Gemini / GPT-4o) は同 memory システムを参照しない → 影響なし (明示)
- scripts/ への影響: 新 script 追加のみ、既存 script 修正なし
- CI への影響: gitignored ディレクトリのため CI lint 対象外、週次手動実行
- Decider: 代表取締役 (単独) / 事実上のレビュアー: 月次レビュー時の sub workspace audit / 将来 stakeholder: Jr 入社 (2026-10) 時の onboarding 説明先
運用上の罠: grep pattern 誤設定時の挙動
| 誤設定パターン | 影響 | 対処 |
|---|---|---|
ADR-\d+ (桁数指定なし) | ADR-1 や ADR-12345 も誤マッチ | ADR-\d{4} で 4 桁固定 |
PR #?\d+ (# を optional) | PR 123 / Issue #123 も誤マッチ | PR #\d+ で # 必須 |
| case-insensitive 未設定 | adr-0055 等小文字表記を見逃し | grep -iE で大文字小文字無視 |
| 改行跨ぎ参照 | multi-line 参照 (例: ADR-\n0055) を見逃し | 想定外、コミット時に lint で防止 |
運用上の罠: frontmatter 欠落時の挙動
- 検証 script の振る舞い:
WARN出力のみ、削除や移動はしない (副作用最小化原則) - 後任が陥りやすい罠: frontmatter 内
metadata.typeがmetadata: { type: ... }ネストでなくmetadata_type: ...フラットに書かれているケース → YAML parse error、本実装で 両形式許容 + WARN - 監視ポイント: 月次レビュー時に WARN 件数の前月比トレンド (急増は規約変更の兆候)
運用上の罠: Stale 検出ルールの cost / false-positive 抑制
- R-MEM-1 false-positive: memory 内の
ADR-0099が将来 ADR を仮置きで参照しているケース →~~ADR-0099 (仮)~~の打ち消し書式で明示、grep で除外 - R-MEM-2 cost 制御: PR 影響大時のみ実行 (default skip)、判断基準は「ADR Mode: Critical or Standard かつ Implementation Status: Done」
運用上の罠: script 形骸化リスク (長期視点)
週次運用が継続すると 「WARN 放置 → 形骸化 → stale 化が再発」 という負債化シナリオが発生し得る。対策:
- 早期警戒指標: WARN 件数が 3 週連続 ≥ 5 件 → 月次レビュー繰上げ実施 (運用疲れの兆候)
- WARN 累積防止: 月初に「先月の未処理 WARN 件数」を MEMORY.md 末尾に記録、3 ヶ月で累積 10 件超なら ADR-0060 §撤退検討 (案 B: script 削除に降格)
- 自動エスカレーション: GitHub Actions の weekly cron で
scripts/memory-stale-check.mjs実行、3 週連続 WARN ≥ 5 件で Issue 自動起票 (将来拡張) - Review After (3 ヶ月後 2026-08-22) 時の確認項目: (a) 週次レビュー実施率 ≥ 80%、(b) WARN 累積 < 10 件、(c) FP 率 < 10% — どれか欠落で運用見直し
5.4 コスト試算
| 項目 | 数値 |
|---|---|
| 初期実装 | scripts/memory-stale-check.mjs 新規作成 ~1-2h (regex + YAML parse + 既存 14 件初回 PASS 確認) |
| 既存 14 件の規約準拠化 | ~30-60 min (frontmatter 欠落 / 命名違反の修正 one-shot) |
| 週次運用 | ~15-30 min (script 実行 + WARN レビュー + 必要な update) |
| 月次レビュー | ~30 min (clean-up candidates 評価、6 ヶ月以上未参照件のレビュー) |
| 年間総運用工数 | (15-30 min × 52 週) + (30 min × 12 月) = ~19-32h/年 |
| 削減効果 | session 開始時の運用方針再発見 ~5-10 min × ~50 sessions/年 = ~4-8h/年 + stale 化事故回避 ~30 min/件 × 5-10 件/年 = ~2.5-5h/年 = 合計 6.5-13h/年 |
| ROI | 初期 ~2h ÷ (削減 6.5-13h/年 - 継続 19-32h/年) = net cost (運用負担増) だが、Jr 入社後 onboarding コスト削減で長期 break-even (2027 想定) |
5.5 検証可能な完了条件
| # | 観測可能な指標 | 測定方法 |
|---|---|---|
| 1 | 初検証 PR で memory 14 件全件 PASS (規約準拠) | scripts/memory-stale-check.mjs の exit 0 確認 |
| 2 | stale 検出率 100% (新規 stale 化を 1 週間以内に R-MEM-1 で検出) | 故意 stale 化テスト memory を 1 件作成 → 翌週検証 |
| 3 | 週次レビュー所要時間 ≤ 15 min | 3 ヶ月運用後の所要時間ログ平均 |
| 4 | false-positive 率 < 10% | 3 ヶ月の WARN 件数のうち真の stale = N、FP = M、M / (N+M) < 0.10 |
| 5 | 月次 clean-up: 6 ヶ月未参照 memory が < 全件の 20% | アクセス log (Claude session 記録) 集計 |
| 6 | memory 件数トレンド: 3 ヶ月後 ≤ 25 件 / 6 ヶ月後 ≤ 30 件 (上限到達で命名 sub-category 検討) | 月次カウント |
撤退条件 (Rollback Plan)
撤退判断指標
- 3 ヶ月後 (2026-08-22): memory 件数 / stale 検出件数を評価、運用負荷が高すぎれば ADR を Superseded 化
- false-positive 率 > 30% (常態化) → 検出 script revert
- memory 件数が 30 件超 → 命名規約 sub-category 追加検討
- Claude Code 公式が memory 運用ガイドを公開 → 本 ADR を Superseded して公式準拠
memory ファイル復旧 / 退避手順 (3 段階)
| 段階 | 対象 | 具体手順 | 影響範囲 |
|---|---|---|---|
| (A) ADR Superseded 化のみ (memory 保持) | 本 ADR | 既存 memory ファイル群は touched せず、本 ADR Status を Superseded に変更 | memory は引き続き Claude が参照、運用は暗黙運用に戻る |
| (B) 検出 script 削除 + memory 保持 | scripts/memory-stale-check.mjs | 1. script を revert (PR で削除) 2. memory ディレクトリは無変更 | 週次運用負荷ゼロ化、暗黙運用復帰 |
| (C) 全 memory アーカイブ + 廃止 (X3 案発動時) | ~/.claude/projects/<slug>/memory/ 全件 | 1. tar czf ~/.claude/projects/<slug>/memory.archive_$(date +%Y%m%d).tar.gz ~/.claude/projects/<slug>/memory/ で全件 backup 2. ~/.claude/projects/<slug>/memory/ を空に 3. MEMORY.md のみ「memory 廃止済、復旧手順は本 ADR §撤退」の 1 行 placeholder で保持 4. 復旧手順: tar xzf <archive>.tar.gz → MEMORY.md インデックス再生成 (各 .md の name: / description: から再構築) | Claude session 跨ぎ persistent context の喪失、CLAUDE.md / docs への一元化前提 |
Confirmation (準拠確認 / Fitness Function)
- 検証手段 1 (機械):
scripts/memory-stale-check.mjs実行 (R-MEM-1 週次 / R-MEM-2 PR 影響大時)- R-MEM-1: memory 内の
ADR-\d{4}/PR #\d+参照が現存するか grep + frontmatter parse - R-MEM-2: memory 本文の具体ファイル / 関数 / flag 名の現存確認 (PR 影響大時のみ、判断基準は ADR Mode: Critical or Standard かつ Implementation Status: Done)
- R-MEM-1: memory 内の
- 検証手段 2 (手動): 月次レビューチェックリスト (clean-up candidates / FP 率トレンド / 件数推移)
- 実行頻度: R-MEM-1 週次 (cron or 手動) / R-MEM-2 PR 影響大時のみ / 月次レビュー 1 回
- 違反時の対応: WARN で出力のみ、自動削除なし。該当 memory を起案者が手動 update or 削除候補化
参照 (References)
関連 ADR と memory への波及 (個別 Conflict 確認)
| ADR | 採択日 | memory への波及対象 | Conflict 有無 / 整合性確認 |
|---|---|---|---|
| ADR-0055 (nav prefix 刷新) | 2026-05-19 | project_adr0039_implementation (1.A.NN/1.I.NN 表記 → stale 化) | ✅ PR #881 で修正済、本 ADR の起案根拠 |
| ADR-0058 (frontmatter-lint Rule Reference SSoT) | 2026-05-22 | なし (memory frontmatter とは別系統 — adr-lint Phase 4-b は docs/ 配下、memory は ~/.claude/projects/ 配下) | ✅ Conflict なし、別 namespace |
| ADR-0059 (docs-nav-lint R5) | 2026-05-22 | なし (docs/index.md / docs/_config.json 整合性検証で、memory には波及せず) | ✅ Conflict なし、別 namespace |
| 将来候補: Anthropic 公式 memory 運用ガイド | TBD | 公開時に本 ADR を Superseded、命名規約 / stale 検出基準を公式準拠化 | 公式が公開された時点で再評価 |
ADR-0058/0059 は「nav prefix 系」と一括りで参照されがちだが、本 ADR の memory namespace とは 物理的に別系統 (Claude ~/.claude/ vs プロジェクト docs/)。直接の Conflict 可能性なし。
関連 PR / 外部資料
- PR #881 (2026-05-20): stale memory
project_adr0039_implementationの修正記録 - 本セッション (2026-05-20〜21) 追加 memory 4 件:
project_docs_swap_summary_index_layout/feedback_force_push_via_user_bang_prefix/reference_handover_prompt_location/project_doc_ops_backlog_section - CLAUDE.md §Self-improvement loop (memory → CLAUDE.md 昇格パターン)
- 将来統合候補: Anthropic 公式 memory 運用ガイド (公開時に本 ADR を Superseded)
8. 参照: Pipeline 審査履歴 (2026-05-22 実行時, 通常 flow)
本セクションは Decision Pipeline (LangGraph TS on Cloudflare Workers) で本 ADR 草案を通常 flow (retroactive=false) で審査した結果のログ。v1 (67 行) で 37/50 差し戻し → 6 採点項目に対応する改善反映 v2 → 48/50 で Standard 閾値 40 + Critical 閾値 45 双方クリア。ADR-0056 §8 / ADR-0058 §11 / ADR-0057 §8 / ADR-0059 §11 で確立した §audit history パターンの 第五適用例。デフォルトでは折りたたまれており、
▶をクリックで展開する。
📋 Pipeline 審査履歴 全 Gate 結果 (合格 Score 48 / 50, v1 37 → v2 48 +11 pt) — クリックで展開
Gate 0 Triage
- needsAdr: true / triageMode: Standard
- 理由: 命名規約 + stale 検出 + clean-up の 3 軸統治、memory 14 件への横断影響、CI 連動はない (gitignored) が週次運用ルール化
Gate 1 Socratic
- pass: true (追加質問 0 件、v2 改善反映で context 十分)
Gate 2 Consistency: verdict PASS
- 既存 ADR との整合性 OK (ADR-0055 / 0058 / 0059 への参照、Supersede なし、本 PR §References で個別 Conflict 確認を明記)
- ADR-0058/0059 との namespace 分離 (
~/.claude/vsdocs/) を §References で明示
Gate 3 Parallel Review
- 3 vendor (Gemini Flash / Claude Sonnet / GPT-4o) からの詳細指摘は §改善余地 に要約
Gate 4 Scoring: 48 / 50
| # | 採点項目 | 点数 | コメント |
|---|---|---|---|
| 1 | 問題定義 | 5 | 実測 n=1 (ADR-0039 stale + PR #881) と proxy (memory 14件、年 5-10 件想定) を併記、集計手順も再現可能化。 |
| 2 | 代替案 | 5 | 採用案 + X1/X2/X3 を Good/Bad/K.O. 判定明示。網羅性十分。 |
| 3 | 判断基準 | 5 | Q42 9 タグから 5 軸選定、係数 + K.O. + 加重和の正規化値まで計算済み。 |
| 4 | 過去決定との整合性 | 4 | ADR-0055/0058/0059 と PR #881 を参照、Supersede 可能性まで言及。ただし ADR-0058/0059 は「nav prefix 系」と一括りで具体的差分・整合性確認が薄く、Conflict 有無は未検証 (本 PR で §References 個別整合表を追加)。 |
| 5 | 影響範囲 | 5 | 改修対象 / 波及範囲 / ステークホルダーを明示。 |
| 6 | 運用上の罠 | 5 | grep pattern 誤設定 4 パターン、frontmatter ネスト/フラット両形式許容、FP (打ち消し書式) まで具体的に検証。 |
| 7 | ロールバック | 5 | 3 段階 (A/B/C) を具体コマンド + 復旧手順付きで記載。 |
| 8 | コスト試算 | 5 | 全項目を数値化、ROI が net cost であることも誠実に明記。 |
| 9 | 完了条件 | 5 | 6 指標を表で整理、故意 stale テスト手順まで設計。 |
| 10 | 長期的影響 | 4 | 3 ヶ月評価 + Jr 入社 + break-even (2027) と時間軸あり。ただし明示的「Review After: YYYY-MM-DD」項目が無く、6 ヶ月後の負債化リスク (運用疲れで script 形骸化) の言及が薄い (本 PR で Status 直下に Review After 明示 + §5.3 script 形骸化対策追記)。 |
合計: 48 / 50 (Standard 閾値 40 / 50 → PASS, Critical 閾値 45 / 50 → PASS)
v1 (37/50) → v2 (48/50) 改善効果
| 項目 | v1 | v2 | 改善反映 |
|---|---|---|---|
| 影響範囲 | 3 | 5 | 14 件移行 + 新 script ~80 行 + AI Agent 影響 (Claude 固有) + Decider/レビュアー明示 |
| 運用罠 | 3 | 5 | grep regex 4 パターン表 + frontmatter 両形式許容 + 監視ポイント |
| ロールバック | 3 | 5 | A/B/C 3 段階手順 + 復旧 step |
| コスト試算 | 3 | 5 | 初期 1-2h / 週次 / 月次 / 年間 19-32h + ROI 分析 |
| 完了条件 | 3 | 5 | 6 観測指標 (stale 検出率 100% / 週次 ≤ 15min / FP < 10% / 件数 ≤ 30 / 6 ヶ月未参照 < 20%) |
| 問題定義 | 4 | 5 | proxy 集計手順 + 年間 5-10 件想定 |
| 過去決定との整合性 | 4 | 4 | (本 PR で 5 へ向上、§References 個別整合表) |
| 長期影響 | 4 | 4 | (本 PR で 5 へ向上、Review After 明示 + §5.3 script 形骸化対策) |
v1 → v2 改善: +11 pt (37 → 48)。
改善余地 (本 PR で反映済)
| # | 指摘 | 反映先 | 効果 |
|---|---|---|---|
| 1 | §9 ADR-0058/0059 との個別 Conflict 確認 (各 ADR でどの memory が波及対象だったかの差分整理) | §References を新規 table 形式に再構成、各 ADR ごとに「波及対象 / Conflict 有無 / namespace 分離」を整理 | 過去決定整合性 4/5 → 5/5 見込 |
| 2 | Status 直下に Review After 明示 + §5.3 script 形骸化リスク (運用疲れで WARN 放置) 対策追記 | Status header に Review After 3 段階 (3/6/12 ヶ月) 明示 + §5.3 に「script 形骸化リスク」subsection 新設 (早期警戒指標 / WARN 累積防止 / 自動エスカレーション) | 長期影響 4/5 → 5/5 見込 |
改善効果見込: 48/50 → 50/50 達成可能性。
Status 遷移
- v1 起案 (2026-05-22 KV 投入) → Pipeline 通常 flow 37/50 差し戻し
- v2 改善 (6 採点項目に対応) → Pipeline 再投入 → 48/50 通過 → auto-PR #910 生成 (Proposed)
- 本 PR で Status: Proposed → Accepted に更新、改善余地 2 件 (§9 個別整合 + §Review After + §5.3 形骸化対策) を同時反映