Claude Code × Obsidian で作る個人ナレッジベース — 構築から運用まで完全ガイド
Claude Code × Obsidian で作る個人ナレッジベース — 構築から運用まで完全ガイド
[!info] この記事について
複数の仕事案件・学習テーマの情報を AI(Claude Code)から横断検索できる個人ナレッジベースを、コピペだけでゼロから構築し、日常運用に乗せるまでの完全ガイドです。
§3 のセットアッププロンプトを Claude Code に貼るだけで、規約ファイル・スクリプト・手順プロンプト・ダッシュボードの一式が再現されます。bash を自分で打つ必要はありません。
1. これは何か — 設計思想
何ができるようになるか
- 「この案件で決まったことを時系列で出して」「まだ決まっていない論点を全案件横断で一覧にして」と日本語で聞くだけで、出典付きの回答が返る
- 議事録・文字起こし・PDF・Excel を1つのフォルダに放り込むだけで、AI が適切な場所に振り分けて要点を抽出する
- AI との対話で生まれた良い回答・アイデアが自動的にナレッジとして蓄積され、二度同じ質問をしなくて済む
- Obsidian のダッシュボードで「知識の鮮度」「放置された論点」がひと目で分かる
中核となる設計原則
| 原則 | 内容 |
|---|---|
| 2層分離 | 生ログ(daily/)と確定知識(knowledge/)を分ける。生ログは溜め続け、定期的に「蒸留」して確定知識を最新化する |
| 人がレビュー、AI が作業 | AI の出力はすべて「提案」。ファイル移動や論点の終了など判断を伴う操作は人が承認してから実行する |
| 墓碑方式 | 終了した論点は削除せず、終了日・理由付きの1行を ARCHIVE に残す。「なぜ消えたか」を後から追跡できる |
| 鮮度の可視化 | 全ファイルに updated、全論点に last-touched を付け、陳腐化をダッシュボードで検出する |
| 複利の知識 | AI の良い回答を syn-*.md として書き戻す。回答が次の回答の材料になる |
4つのワークフロー
外部情報(議事録・資料・文字起こし)
│
▼
_inbox/ ──[① intake(取り込み)]──▶ 各案件/テーマのディレクトリへ配置
│
▼ daily/(生ログ)
[② distill(蒸留)]
│
▼ knowledge/(現在の正)
[③ synthesis(合成)] ◀── AI に質問したとき自動実行
│
▼ syn-*.md
[④ reconcile(棚卸し)]
│
▼ open-issues の掃除・整理
2. 前提環境
| ツール | 用途 | 入手先 |
|---|---|---|
| Claude Code | AI エージェント(構築・運用のすべての操作) | claude.com/claude-code |
| Obsidian | ノートビューア・ダッシュボード表示 | obsidian.md(Bases 機能対応の v1.9 以降) |
| Git | バージョン管理(AI の書き込み事故からの復旧線) | macOS は標準搭載 |
| Node.js (npx) | Obsidian スキルのインストールに使用 | nodejs.org |
| Python 3 | 全体マップ(Canvas)の自動生成に使用 | macOS は標準搭載 |
[!tip] Obsidian は「ビューア」
このナレッジベースの実体はただの Markdown ファイル群です。書き込みは主に Claude Code が行い、Obsidian は閲覧・ダッシュボード用。Obsidian なしでも運用自体は成立します。
3.【1回だけ】構築手順
手順
- ナレッジベースの置き場所にしたい空フォルダを作る(例:
~/knowledge-base) - そのフォルダで Claude Code を起動する
- 下のセットアッププロンプトを丸ごとコピーして貼り付ける
- 完了後、Obsidian でそのフォルダを Vault として開く
セットアッププロンプト(全文コピペ)
あなたはこれから、私が案件・テーマの情報を後から横断検索するための個人ナレッジベースを、
このカレントディレクトリ(= ルート)に構築します。以下を正確に実行してください。
# 1. 基本フォルダを作成
- cases/ … 顧客案件・プロジェクト
- topics/ … 学習・調査テーマ
- _inbox/ … 全ファイルの一時投入先(種類・所属を問わずここに入れる)
- prompts/ … 運用手順ファイル置き場
- dashboards/ … 横断ビュー(Obsidian Bases)置き場
- scripts/ … 補助スクリプト置き場
# 2. ルート規約ファイル CLAUDE.md を作成(内容は厳密に以下)
```
# ナレッジベース — 全体規約
案件・テーマの情報を Claude Code から横断検索するための個人ナレッジベース。
最上位は2層構成:
- cases/ … 顧客案件・プロジェクト(type: case)
- topics/ … 学習・調査テーマ(type: topic)
各 case/topic は <slug>/ に格納され、共通構造を持つ。
## 共通ディレクトリ構造
- <slug>/CLAUDE.md … 索引と現状サマリ(先頭 frontmatter に type)
- <slug>/knowledge/ … 統合された「現在の正」
- decisions.md … 決定/確定した理解(日付・理由・出典付き)
- open-issues.md … 論点。OPEN=未決 / PARKED=保留(解除条件付き)/ ACTION=宿題。終了分は ARCHIVE に墓碑を残す
- glossary.md … 用語・略語
- contacts.md … 登場人物(case のみ)
- syn-<topic>.md … 合成メモ(質問への回答・比較・分析など、価値ある回答を書き戻したもの)
- <slug>/daily/<YYYY-MM-DD>/ … 日次の生ログ(文字起こし・議事録)
- <slug>/references/ … 受領・外部資料
- <slug>/deliverables/ … 自作成果物(case は proposals/estimates/documents)
- <slug>/assets/ … CAD等の純バイナリ
## 取り込み(intake)
- 新規ファイルは種類・所属を問わず、ルートの _inbox/ にまとめて置く。
- prompts/route.md の手順で _inbox/ を読み、_routing-plan.md(振り分け計画)を作る。
- 人のレビュー後に実行し、結果を _inbox/_routing-log_<日付>.md に残す。
- バイナリ(docx/xlsx/pdf/CAD)は原本の横に同名コンパニオン .md(概要・要点・出典)を作る。
## 蒸留(distill)— daily → knowledge への反映
- daily/ は一次情報として溜まり続けるため、定期的に knowledge/ へ蒸留して「現在の正」を最新化する。
- prompts/distill.md の手順で、未蒸留の daily を読み、prompts/triage.md の4分類に従って decisions.md / open-issues.md / glossary.md / contacts.md を更新する。
- **重複防止(必須)**: OPEN/ACTION を起票する前に既存 open-issues を検索し、同一論点があれば新規作成せず既存 ID に追記する(似た言い回しの量産を防ぐ)。
- **失効チェック(必須)**: その daily の決定・スコープ変更が既存 OPEN を論理的に不要化していないか確認し、該当すれば SUPERSEDED 候補として提案する。
- 反映した OPEN/PARKED/ACTION には `last-touched`(最後に触れた daily 日付)を更新する。
- 反映したファイルは `updated` を当日に更新する。蒸留範囲は各 knowledge/ の記録で管理する。
## 合成・書き戻し(synthesis)— 回答を知識として自動蓄積
- 質問に答えたとき、**Claude が自動判断して自動保存**する。ユーザーへの確認は不要。保存した場合は回答末尾に `→ syn-xxx.md に保存しました` と1行通知するだけ。
- **自動保存する条件(1つ以上該当)**: 複数ファイルを読んで合成した / 矛盾・新しい関連を発見した / 回答が実質的(5文以上の説明・比較・整理)/ 「なぜ・どういう経緯・どう設計されているか」型の質問 / **「どうしたらいい・アイデアはあるか・修正するとしたら」など アイデア出し・検討型の対話**。
- **保存しない条件**: 単一事実の確認(「〇〇さんは誰?」「D-6はいつ決まった?」)/ 簡単なYes/No確認 / 軽い雑談。
- **仮案トリガー(CANDIDATE)**: 対話を通じてアイデアが固まりかけたとき(「それが良さそう」「試す価値ある」「その方向で考えてみる」など)、確認なしで以下を実行する:① syn-*.md に検討経緯を保存(問い・出たアイデア・有力案・選んだ理由)、② open-issues.md に `CANDIDATE` として追記(仮案の概要 + 次のバリデーション先)。決定と混同しないこと——外部確認(先方・上司・システム)が通るまでは CANDIDATE のまま置く。
- 保存先は `knowledge/syn-<kebab-topic>.md`。`#type/synthesis` タグを付け、参照した decisions / open-issues / daily へ wikilink で繋ぐ。
- **必ず Write ツールでファイルを実際に作成してから**「保存しました」と通知する。宣言だけして作成しないのは厳禁。
- cross-case/topic にまたがる合成は、どちらかの knowledge/ に置きスコープタグを両方付ける。
## 棚卸し(reconcile)— open-issues の整理・掃除
- distill は「追記」工程のため、放置すると失効した OPEN・立ち消えた ToDo・似た重複が溜まる。これを定期的に掃除する逆向き工程が reconcile。
- prompts/reconcile.md の手順で、全 OPEN/PARKED/ACTION を最新状態(decisions と最新 daily)と突き合わせ、close / merge / supersede / 陳腐化フラグを**提案**する(終了は判断を伴うため人レビュー必須)。
- 終了した論点は削除せず open-issues の ARCHIVE に1行の墓碑(終了日・状態・理由・出典/包含先)を残す。`last-touched` が古い OPEN は立ち消え候補として優先的に点検する。
## Obsidian フォーマット規約
- このナレッジベース内の .md ファイルを新規作成・編集する際は必ず obsidian-markdown スキル(`.agents/skills/obsidian-markdown/SKILL.md`)に従う
- knowledge/ 配下のファイルは callout(`> [!info]`, `> [!warning]`, `> [!tip]` 等)を活用して視認性を高める
- ナレッジベース内ファイルへの参照は `[[wikilink]]` 形式を使う(外部URLのみ `[text](url)`)
### frontmatter 規約(新規作成・編集時は必ず準拠)
すべての .md ファイルに以下の共通項目を付ける。内容を変更したら `updated` を必ず当日に更新する。
| 項目 | 必須 | 形式 | 説明 |
|------|------|------|------|
| `title` | ✅ | 文字列 | ノートのタイトル |
| `tags` | ✅ | リスト | 下記 taxonomy に従う |
| `updated` | ✅ | `YYYY-MM-DD` | 最終更新日 |
ファイル種別ごとに以下を追加する:
- **CLAUDE.md(case/topic 索引)**: `type`(`case` または `topic`), `slug`(ディレクトリ名)
- **バイナリ同名コンパニオン .md**: `received`(`_inbox/` に置かれた日付 `YYYY-MM-DD`)
> ※ 既存ファイルの遡及修正は行わない。本規約は今後の新規作成・編集分から適用する。
### タグ taxonomy
**種別タグ(必須・1つ)** — ファイルの役割を表す。Bases ダッシュボードのフィルタに使う:
`#type/index`(CLAUDE.md)/ `#type/decision` / `#type/issue` / `#type/glossary` / `#type/contact` / `#type/daily` / `#type/reference` / `#type/deliverable` / `#type/companion`(バイナリ随伴)/ `#type/prompt` / `#type/synthesis`(合成メモ `syn-*.md`)
**スコープタグ(推奨・1つ)** — どの case/topic に属するか: `#case/<slug>` または `#topic/<slug>`
※ open-issues 内の状態は frontmatter ではなく本文中のマーカーで管理する(従来どおり)。状態ラベルは次の通り:
- アクティブ: `OPEN`(未決・方向性も未定)/ `CANDIDATE`(AI検討で有力案あり・外部確認待ち)/ `PARKED`(保留・理由+解除条件)/ `ACTION`(宿題・担当/期限/状況)
- 終了(ARCHIVE へ墓碑を残す): `RESOLVED`(明示決定→decisions へ)/ `SUPERSEDED`(後の決定・スコープ変更で前提ごと失効・失効根拠を wikilink)/ `DROPPED`(立ち消え・推定根拠を明記)/ `CLOSED`(解決・出典/包含先を明示)
- 各アクティブ論点には `last-touched`(最後に触れた daily 日付)を添える。
- `CANDIDATE` には必ず「仮案の概要」「選んだ理由」「次のバリデーション先(誰に確認・何を検証)」を記載する。外部確認が通れば RESOLVED として decisions.md へ昇格させる。
## ダッシュボード(横断ビュー)
- `dashboards/` に Obsidian Bases(`.base`)で横断ビューを置く。`dashboards/README.md` から全ビューを一覧できる。
- `index.base`(case/topic 一覧)/ `freshness.base`(knowledge 鮮度・古い順。`syn-*.md` も自動表示)/ `open-issues.base`(未決・保留のありか・更新が古い順=棚卸し滞りを炙り出す)/ `deliverables.base`(成果物カタログ)
- 新しい case/topic・成果物は frontmatter 規約に従って作れば自動的に各ビューに載る。
## 手順書の同期(メンテナンス規約・必ず守る)
- このナレッジベースの「仕組み」を変更したら、**必ず同じ変更を運用手順書に反映する**: `topics/ナレッジベース運用手順/deliverables/ナレッジベース運用手順書.md`。
- 「仕組み」= このルート `CLAUDE.md` / `prompts/*.md` / `dashboards/*.base` / `dashboards/README.md` / `newcase.sh` / `newday.sh` / 必要スキルの追加・変更・削除。
- 手順書 §1 のセットアッププロンプトには上記ファイルの内容が**逐語的に埋め込まれている**。これは空フォルダから新環境を再現する唯一の自己完結ソースであり、ズレると変更が新環境に伝わらない。
- 仕組みを変えたら、手順書内の対応ブロックを同内容に直し、版数(vN)と frontmatter の `updated` を上げる。
## 横断検索のルール
- 「決定事項」→ 各 knowledge/decisions.md。「未決・保留」→ open-issues.md(OPEN/PARKED)。
- 回答には必ず出典(daily や原本のファイル)を添える。
- daily は一次情報。knowledge と矛盾する場合は新しい日付を優先し、相違を明示する。
- cases と topics を取り違えない。質問のスコープに応じて対象を限定する。
- ディレクトリ名・ファイル名は英数ケバブケース。日付は YYYY-MM-DD。
```
# 3. newcase.sh を作成(chmod +x まで実施。内容は厳密に以下)
```bash
#!/usr/bin/env bash
# newcase.sh — 新規の案件(case)またはテーマ(topic)を雛形から生成
# 実行場所に依らず、スクリプトと同じ階層の cases/ または topics/ に作成する
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TIER="${1:?Usage: newcase.sh <case|topic> <slug> [title]}"
SLUG="${2:?Usage: newcase.sh <case|topic> <slug> [title]}"
TITLE="${3:-$SLUG}"
TODAY="$(date +%F)"
case "$TIER" in
case) BASE="$ROOT/cases" ;;
topic) BASE="$ROOT/topics" ;;
*) echo "tier は case か topic を指定してください"; exit 1 ;;
esac
DIR="$BASE/$SLUG"
[ -e "$DIR" ] && { echo "already exists: $DIR"; exit 1; }
mkdir -p "$DIR"/{knowledge,daily,references,assets}
if [ "$TIER" = "case" ]; then
mkdir -p "$DIR"/deliverables/{proposals,estimates,documents}
else
mkdir -p "$DIR/deliverables"
fi
CONTACTS_LINE=""
[ "$TIER" = "case" ] && CONTACTS_LINE="- 登場人物: knowledge/contacts.md"
cat > "$DIR/CLAUDE.md" <<EOF
---
title: ${TITLE}
type: ${TIER}
slug: ${SLUG}
tags:
- type/index
- ${TIER}/${SLUG}
updated: ${TODAY}
created: ${TODAY}
---
# ${TITLE}
> この ${TIER} の索引。Claude Code が最初に読む前提。
## 現状サマリ(${TODAY} 時点)
- フェーズ:
- 直近の状況:
## 索引
- 決定/確定した理解: knowledge/decisions.md
- 論点・未決・保留: knowledge/open-issues.md
- 用語: knowledge/glossary.md
${CONTACTS_LINE}
- 日次ログ: daily/
- 受領・外部資料: references/
- 成果物: deliverables/
EOF
cat > "$DIR/knowledge/decisions.md" <<EOF
---
title: ${TITLE} — 決定/確定ログ
tags:
- type/decision
- ${TIER}/${SLUG}
updated: ${TODAY}
---
# 決定/確定ログ(${TITLE})
<!-- 新しい項目を上に追記。日付・内容・理由・関係者・出典 を必ず残す -->
EOF
cat > "$DIR/knowledge/open-issues.md" <<EOF
---
title: ${TITLE} — 論点・未決・保留
tags:
- type/issue
- ${TIER}/${SLUG}
updated: ${TODAY}
---
# 論点・未決・保留(${TITLE})
<!-- アクティブ: OPEN(未決・方向性も未定) / CANDIDATE(AI検討で有力案あり・外部確認待ち) / PARKED(保留・理由+解除条件) / ACTION(宿題・担当/期限/状況) -->
<!-- 終了は ARCHIVE に墓碑を残す: RESOLVED(決定->decisions) / SUPERSEDED(失効・根拠wikilink) / DROPPED(立ち消え・推定根拠) / CLOSED(解決・出典) -->
<!-- 各アクティブ論点には last-touched(最後に触れた daily 日付) を添える -->
<!-- CANDIDATE には「仮案の概要・選んだ理由・次のバリデーション先」を必ず記載 -->
## OPEN — 未決事項
## CANDIDATE — AI検討済み仮案(外部確認待ち)
## PARKED — 保留事項
## ACTION — 宿題/ToDo
## ARCHIVE — 終了した論点(墓場)
EOF
cat > "$DIR/knowledge/glossary.md" <<EOF
---
title: ${TITLE} — 用語・略語
tags:
- type/glossary
- ${TIER}/${SLUG}
updated: ${TODAY}
---
# 用語・略語(${TITLE})
| 用語 | 意味 | 備考 |
| --- | --- | --- |
EOF
if [ "$TIER" = "case" ]; then
cat > "$DIR/knowledge/contacts.md" <<EOF
---
title: ${TITLE} — 登場人物
tags:
- type/contact
- ${TIER}/${SLUG}
updated: ${TODAY}
---
# 登場人物(${TITLE})
| 氏名 | 所属 | 役割 | 備考 |
| --- | --- | --- | --- |
EOF
fi
echo "created: $DIR"
# ── map.canvas 自動更新 ───────────────────────────────────
echo ""
echo "🗂 map.canvas のグループを選んでください:"
python3 "$ROOT/scripts/update-canvas.py" --list-groups
echo ""
read -rp "番号を入力(Enter で未分類): " GNUM
GID=$(python3 "$ROOT/scripts/update-canvas.py" --get-group-id "${GNUM:-0}")
python3 "$ROOT/scripts/update-canvas.py" --add "$TIER" "$SLUG" "$TITLE" "$GID"
```
# 4. newday.sh を作成(chmod +x まで実施。内容は厳密に以下)
```bash
#!/usr/bin/env bash
# newday.sh — 指定 slug に当日(または指定日)の日次フォルダと議事録雛形を作成
# 通常はルーティングが自動で daily を作るため任意。会議中の手メモ用。
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SLUG="${1:?Usage: newday.sh <slug> [YYYY-MM-DD]}"
DAYDATE="${2:-$(date +%F)}"
DIR=""
for base in cases topics; do
[ -d "$ROOT/$base/$SLUG" ] && DIR="$ROOT/$base/$SLUG"
done
[ -n "$DIR" ] || { echo "no such slug under cases/ or topics/: $SLUG"; exit 1; }
DAY="$DIR/daily/$DAYDATE"
mkdir -p "$DAY"
MIN="$DAY/${DAYDATE}_minutes.md"
[ -f "$MIN" ] || cat > "$MIN" <<EOF
---
title: 議事録 $DAYDATE($SLUG)
slug: $SLUG
date: $DAYDATE
type: minutes
tags:
- type/daily
updated: $DAYDATE
---
# 議事録 $DAYDATE
## 出席者
## 議題
## メモ
EOF
echo "ready: $DAY"
```
# 5. 振り分け手順 prompts/route.md を作成(内容は厳密に以下)
```
---
title: 振り分け(ルーティング)手順
tags:
- prompts
- intake
- type/prompt
updated: 2026-07-04
---
# 振り分け(ルーティング)手順
_inbox/ にある全ファイルを読み込み、振り分け計画を _inbox/_routing-plan.md に出力する。
この段階ではファイルを移動・編集しない(人のレビュー前のため)。
各ファイルについて判定する:
1. 所属: cases/ topics/ 配下の各 CLAUDE.md・contacts.md・glossary.md と内容を照合し、
どの案件/テーマに属するか特定する。特定できなければ「要確認」に分類し、候補を挙げる。
該当する器が存在しなければ「新規 case/topic の候補」として slug 案を提示する。
2. 種別: transcript(文字起こし)/ minutes(議事録)/ deliverable(自作成果物)/
reference(受領資料)。ファイル名に mine_ があれば deliverable とみなす。
判断がつかなければ理由付きで「要確認」。
3. 配置先:
- transcript・minutes → <所属>/daily/<日付>/
- deliverable → <所属>/deliverables/(case は proposals/estimates/documents のいずれか)
- reference → <所属>/references/
4. 抽出: 内容に決定・未決・保留・ToDo が含まれる場合、prompts/triage.md の4分類に従い抽出案を併記。
5. docx/xlsx/pdf/CAD 等のバイナリには、同名のコンパニオン .md(概要・要点・出典)を作る予定として明記。
コンパニオン .md の frontmatter には必ず `received: <_inbox/ に置かれた日付>` を含める。
6. 日付: 文字起こし・議事録は内容中の開催日を優先。無ければファイル更新日。
出力フォーマット:
## 確実に振り分け可能
- <ファイル名> → <配置先パス>(種別 / 所属)|抽出: 決定n 未決n 保留n ToDo n
## 要確認(私の判断が必要)
- <ファイル名> | 理由 | 候補: ...
```
# 6. 仕分け手順 prompts/triage.md を作成(内容は厳密に以下)
```
---
title: トリアージ手順
tags:
- prompts
- intake
- type/prompt
updated: 2026-07-04
---
# トリアージ手順
対象の文字起こし・議事録・資料の内容を、knowledge/*.md と読み比べ、実質的な内容を
以下の4分類に仕分ける。本反映前は提案として出し、knowledge は編集しない。
- DECIDED(決定/確定): 確定した結論・理解
- OPEN(未決) : 決める/確認する必要があるが未確定の論点。次アクションを添える
- PARKED(保留) : 意図的な先送り。保留理由と解除条件を必ず明記
- ACTION(ToDo) : 誰が・いつまでに・何を
各項目に必須: 根拠の要旨 / 関係者 / 出典リンク [[該当ファイル]] /
既存 knowledge と相違がある場合は「既存: 〜 → 変更案: 〜」の差分。
```
# 7. 蒸留手順 prompts/distill.md を作成(内容は厳密に以下)
```
---
title: 蒸留(distill)手順
tags:
- prompts
- intake
- type/prompt
updated: 2026-07-04
---
# 蒸留(distill)手順
daily/ に溜まった一次情報(文字起こし・議事録)を読み、各 case/topic の knowledge/ を
「現在の正」に最新化する。route.md(取り込み)の下流工程にあたる。
> [!info] 位置づけ
> route.md = _inbox/ → 各ディレクトリへ**配置**する工程。
> distill.md = daily/ → knowledge/ へ**反映**する工程。
## 対象の特定
1. 対象の case/topic を1つ選ぶ。
2. その `knowledge/` の各ファイル冒頭の蒸留範囲メモ(`<!-- distilled: <最後に蒸留した日付> -->`)を確認する。
- 無ければ「未蒸留」とみなし、全 daily を対象にする。
3. `daily/<YYYY-MM-DD>/` のうち、蒸留範囲より新しい日付を対象に読む。
## 反映(triage の4分類に従う)
各 daily の実質的内容を prompts/triage.md の4分類で仕分け、knowledge へ反映する。
**本反映前は提案として出し、人のレビュー後に確定する。**
| 分類 | 反映先 |
|------|--------|
| DECIDED(決定/確定) | `knowledge/decisions.md` |
| OPEN(未決) | `knowledge/open-issues.md`(OPEN) |
| PARKED(保留) | `knowledge/open-issues.md`(PARKED・解除条件付き) |
| ACTION(ToDo) | `knowledge/open-issues.md`(ACTION・担当/期限/状況つき)または該当箇所に追記 |
あわせて:
- 新出の用語・略語 → `knowledge/glossary.md`
- 新出の人物(case のみ) → `knowledge/contacts.md`
## 重複防止・失効チェック(起票前に必ず実施)
- **重複防止**: OPEN/ACTION を新規起票する前に、既存 open-issues.md を検索して**同一・類似の論点**がないか確認する。あれば新規作成せず既存 ID に「更新」として追記する(似た言い回しの量産を防ぐ)。
- **失効チェック**: 今回の daily の決定・スコープ変更が、既存 OPEN/ACTION を論理的に不要化していないか確認する。該当すれば本文を勝手に消さず、`SUPERSEDED` 候補として失効根拠(wikilink)付きで提案する。
- **last-touched**: 追記・更新した OPEN/PARKED/ACTION の `last-touched` を当該 daily の日付に更新する。
## 整合性ルール
- daily が既存 knowledge と矛盾する場合は**新しい日付を優先**し、「既存: 〜 → 変更: 〜(出典 [[daily ファイル]]・日付)」の形で差分を明示する。
- すべての反映項目に**出典の wikilink**([[該当 daily ファイル]])と日付を添える。
- OPEN を解消した場合は open-issues.md から除去し、decisions.md に移す(経緯を1行残す)。
## 仕上げ
1. 反映した knowledge ファイルの frontmatter `updated` を当日に更新する。
2. 各ファイル冒頭の蒸留範囲メモを今回の最終 daily 日付に更新する(`<!-- distilled: <YYYY-MM-DD> -->`)。
3. 対象 case/topic の CLAUDE.md「現状サマリ」を必要に応じて更新する。
```
# 8. 横断質問・合成書き戻し手順 prompts/query.md を作成(内容は厳密に以下)
```
---
title: 横断質問・合成書き戻し手順
tags:
- type/prompt
- intake
updated: 2026-07-04
---
# 横断質問・合成書き戻し手順
質問に回答し、条件を満たす回答を **自動的に** `knowledge/syn-*.md` として保存する。
ユーザーへの確認は不要。保存した場合は末尾に1行通知するだけ。
> [!info] 基本方針
> ユーザーは普通にチャットするだけ。Claude が判断・保存まで行う。
> 「保存していいですか?」は聞かない。
## 回答の手順
1. 対象 case/topic の `CLAUDE.md`(索引)を読み、関連ファイルを特定する。
2. `knowledge/decisions.md`・`open-issues.md`・既存 `syn-*.md` を優先的に読む。
3. 必要なら `daily/` の一次情報も参照する。
4. 回答には**必ず出典 wikilink** を添える。
5. daily と knowledge に矛盾があれば新しい日付を優先し、相違を明示する。
## 自動保存の判断基準(Claude が判断する)
**保存する(1つ以上該当):**
- 複数ファイル(daily・decisions・open-issues など)を読んで合成した
- 矛盾・新しい関連性・見落とされていた繋がりを発見した
- 回答が実質的(5文以上の説明・比較・整理・分析)
- 「なぜ・どういう経緯・どう設計されているか・比較してほしい」型の質問
**保存しない:**
- 単一事実の確認(「〇〇さんは誰?」「D-6はいつ決まった?」)
- 簡単な Yes/No 確認
- 軽い雑談・次のアクションの確認
## 保存の形式
ファイル名: `knowledge/syn-<kebab-topic>.md`
frontmatter:
title: (回答のタイトル)
tags: [type/synthesis, case/<slug>]
updated: YYYY-MM-DD
query: "(元の質問を一文で)"
sources: ["[[decisions]]", "[[daily/YYYY-MM-DD/ファイル名]]"]
本文: 冒頭に「> [!info] 質問」callout で元の質問を記載し、回答本文では wikilink を積極的に使う。
## 保存後の処理
- 関連する `decisions.md` / `open-issues.md` に `関連: [[syn-xxx]]` を1行追加する。
- 新たな論点が発見されたら `open-issues.md` に追記する。
- アイデアが固まった場合は open-issues.md の CANDIDATE に追記し、次のバリデーション先を記載する。
- 回答末尾に `→ syn-xxx.md に保存しました` と1行だけ通知する。
## 既存 syn-*.md がある場合
同じテーマの `syn-*.md` がすでに存在すれば、新規作成せず**既存ファイルを更新**する。
`updated` を当日に更新し、変更箇所に注記を添える。
```
# 9. 棚卸し手順 prompts/reconcile.md を作成(内容は厳密に以下)
```
---
title: 棚卸し(reconcile)手順
tags:
- type/prompt
- intake
updated: 2026-07-04
---
# 棚卸し(reconcile)手順
open-issues.md に溜まった OPEN/PARKED/ACTION を最新状態と突き合わせ、**失効・立ち消え・重複を掃除**する。
distill.md(追記工程)の逆向きにあたる整理工程。
> [!info] 位置づけ
> distill.md = daily/ → knowledge/ へ**追記**する工程(前進)。
> reconcile.md = open-issues.md の全項目を最新状態と照合して**整理・終了**する工程(掃除)。
>
> distill が追記専用のため、放置すると「失効した OPEN」「立ち消えた ToDo」「似た言い回しの重複」が溜まる。これを定期的に解消する。
## いつ回すか
- 蒸留(distill)を一通り終えた後。
- 次回会議の前に論点を棚卸ししたいとき。
- `open-issues.base`(`last-touched` 古い順)で立ち消え候補が目立ってきたとき。
## 手順
1. 対象の case/topic を1つ選び、`knowledge/open-issues.md` の全項目(OPEN/PARKED/ACTION)を読む。
2. 突き合わせ材料として `knowledge/decisions.md` と、最新の `daily/` を読む。
3. 各項目について、以下の判定を**提案として**出す(**終了は判断を伴うため、本反映前は提案にとどめ、人のレビュー後に確定する**):
| 判定 | 条件 | 反映 |
|------|------|------|
| KEEP | まだ生きている論点 | 変更なし(必要なら文脈追記) |
| UPDATE | 一部が解決・前進した | 残件に縮小し、経緯を注記 |
| MERGE | 別 ID と実質同一(重複) | 正(canonical)の ID に畳み、重複側は ARCHIVE に統合の墓碑 |
| RESOLVED | 明示的に決定された | [[decisions]] へ移し、ARCHIVE に1行残す |
| SUPERSEDED | 後の決定・スコープ変更で前提ごと失効 | ARCHIVE へ。**失効根拠を wikilink** で明示 |
| DROPPED | 立ち消え(誰も中止と言わず放置)。`last-touched` が古く、次アクションの期限も過ぎている等 | ARCHIVE へ。**失効と推定した根拠**を明記(断定できなければ人に確認) |
| CLOSED | 解決済みだが決定ログ化するほどでない | ARCHIVE へ。出典または包含先を明示 |
## 重複(MERGE)の検出
- 言い回しが違うだけで実質同じ論点を意味ベースで探す。
- 正(canonical)を1つ決め、他をそこに畳む。重複側は本文を消さず ARCHIVE に「[[#正の ID]] に統合」の墓碑を残す。
## 立ち消え(DROPPED)の判断
- `last-touched` が古い(例: 直近2〜3 daily で言及なし)かつ次アクションの期限が過ぎている OPEN/ACTION を候補にする。
- 記録から失効が断定できない場合は、勝手に終了させず**人に1つだけ確認**する(解決済み/不要化/まだ生きている)。
## 仕上げ
1. 終了項目は削除せず ARCHIVE セクションに移し、**終了日・状態・理由・出典/包含先**を1行で残す。
2. 残った OPEN/PARKED/ACTION の `last-touched` を点検・更新する。
3. open-issues.md の frontmatter `updated` を当日に更新し、冒頭に `<!-- reconciled: <YYYY-MM-DD> -->` を残す。
4. 必要なら対象 case/topic の CLAUDE.md「現状サマリ」を更新する。
```
# 10. ダッシュボード dashboards/*.base を作成(各ファイル、内容は厳密に以下)
## dashboards/index.base
```yaml
filters:
and:
- file.name == "CLAUDE.md"
- file.path != "CLAUDE.md"
formulas:
days_old: if(updated, (today() - date(updated)).days, "")
properties:
note.type:
displayName: 種別
note.title:
displayName: タイトル
file.folder:
displayName: 場所
note.updated:
displayName: 更新日
formula.days_old:
displayName: 更新からの日数
views:
- type: table
name: case / topic 一覧
groupBy:
property: type
direction: ASC
order:
- file.folder
- type
- title
- updated
- formula.days_old
```
## dashboards/freshness.base
```yaml
filters:
and:
- file.folder.contains("knowledge")
- file.ext == "md"
formulas:
days_old: if(updated, (today() - date(updated)).days, (today() - file.mtime).days)
properties:
file.path:
displayName: ファイル
note.updated:
displayName: 更新日(frontmatter)
formula.days_old:
displayName: 更新からの日数
file.mtime:
displayName: 実更新(mtime)
views:
- type: table
name: knowledge 鮮度(古い順に確認)
order:
- file.path
- updated
- formula.days_old
- file.mtime
```
## dashboards/open-issues.base
```yaml
filters:
and:
- file.name == "open-issues.md"
formulas:
days_old: if(updated, (today() - date(updated)).days, (today() - file.mtime).days)
properties:
file.folder:
displayName: case / topic
note.updated:
displayName: 更新日
formula.days_old:
displayName: 更新からの日数
views:
- type: table
name: 未決・保留のありか(古い=棚卸し滞り)
order:
- file.folder
- updated
- formula.days_old
sort:
- property: formula.days_old
direction: DESC
```
## dashboards/deliverables.base
```yaml
filters:
and:
- file.folder.contains("deliverables")
formulas:
is_companion: if(file.ext == "md", "", "要コンパニオン.md")
properties:
file.folder:
displayName: 場所
file.name:
displayName: ファイル
file.ext:
displayName: 種別
note.updated:
displayName: 更新日
views:
- type: table
name: 成果物カタログ
groupBy:
property: file.folder
direction: ASC
order:
- file.folder
- file.name
- file.ext
- updated
```
# 11. dashboards/README.md を作成(内容は厳密に以下)
```
---
title: ダッシュボード
tags:
- type/index
- dashboard
updated: 2026-07-04
---
# ダッシュボード
ナレッジベース全体を横断するビュー。frontmatter 規約([[CLAUDE]] 参照)に従って
ファイルを作れば、自動的に各ビューへ反映される。
## 🗺 全体マップ(ビジュアル)
![[map.canvas]]
カードをクリックすると各案件・テーマの CLAUDE.md に直接ジャンプ。
Canvas を全画面で開くには [[map.canvas]] をクリック。
---
> [!tip] 使い方(表形式)
> 各表のヘッダーをクリックすると並べ替えできる。「更新からの日数」が大きい行は、
> daily からの蒸留([[distill]])が滞っているサイン。
## case / topic 一覧
各案件・テーマの索引(CLAUDE.md)を種別ごとに一覧する。
![[index.base]]
## knowledge 鮮度
`knowledge/` 配下を古い順に確認し、更新が滞っているものを炙り出す。
`syn-*.md`(合成メモ)も自動的にここに表示される。
![[freshness.base]]
## 未決・保留のありか
OPEN/PARKED/ACTION を抱える `open-issues.md` の一覧。更新が古い順に並ぶので、上にあるものは
棚卸し([[reconcile]])が滞っているサイン。中身(失効・立ち消え・重複)は各ファイルを開いて確認する。
![[open-issues.base]]
## 成果物カタログ
`deliverables/` 配下の自作成果物を一覧する。
![[deliverables.base]]
```
# 12. 全体マップ生成スクリプト scripts/update-canvas.py を作成(内容は厳密に以下)
```python
#!/usr/bin/env python3
"""
update-canvas.py — canvas-config.json から dashboards/map.canvas を自動生成する
使い方:
python3 scripts/update-canvas.py # 再生成のみ
python3 scripts/update-canvas.py --add <tier> <slug> <title> <group_id>
python3 scripts/update-canvas.py --list-groups # グループ一覧表示
python3 scripts/update-canvas.py --get-group-id <番号> # 番号→ID変換
"""
import hashlib
import json
import os
import sys
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
CONFIG_PATH = os.path.join(ROOT, "dashboards", "canvas-config.json")
CANVAS_PATH = os.path.join(ROOT, "dashboards", "map.canvas")
# ── レイアウト定数 ────────────────────────────────────────
TITLE_X, TITLE_Y, TITLE_W, TITLE_H = -700, -840, 500, 110
LEFT_X, LEFT_W = -700, 500
RIGHT_X, RIGHT_W = -150, 640
COLS_RIGHT = 2
ITEM_H = 70
COL_GAP = 20
ITEM_GAP_Y = 20
TOP_PAD = 40 # グループラベル + 上余白
BOT_PAD = 20
GROUP_GAP = 40
LEFT_START_Y = TITLE_Y + TITLE_H + 30
RIGHT_START_Y = TITLE_Y
def uid(seed: str) -> str:
return hashlib.md5(seed.encode()).hexdigest()[:16]
def group_height(n: int, cols: int) -> int:
rows = max(1, (n + cols - 1) // cols)
return TOP_PAD + rows * ITEM_H + (rows - 1) * ITEM_GAP_Y + BOT_PAD
def build_canvas(config: dict) -> dict:
labels = config.get("labels", {})
nodes = []
# タイトルカード
nodes.append({
"id": "title-node-main-01",
"type": "text",
"x": TITLE_X, "y": TITLE_Y,
"width": TITLE_W, "height": TITLE_H,
"text": (
"# 📚 ナレッジベース — 全体マップ\n"
"案件・テーマの一覧。タイトルをクリックで CLAUDE.md を開く。\n"
"→ [[dashboards/README|ダッシュボード(表形式)]]"
)
})
left_y = LEFT_START_Y
right_y = RIGHT_START_Y
for group in config["groups"]:
gid = group["id"]
items = group["items"]
side = group.get("side", "right")
# 空の「未分類」グループは非表示
if not items and gid == "uncategorized":
continue
if side == "left":
cols = 1
gx, gy = LEFT_X, left_y
gw = LEFT_W
item_w = LEFT_W - 60
else:
cols = COLS_RIGHT
gx, gy = RIGHT_X, right_y
gw = RIGHT_W
item_w = (RIGHT_W - 60 - COL_GAP) // COLS_RIGHT
gh = group_height(len(items), cols)
nodes.append({
"id": uid(f"g-{gid}"),
"type": "group",
"label": group["label"],
"x": gx, "y": gy,
"width": gw, "height": gh,
"color": group["color"]
})
for i, slug in enumerate(items):
info = labels.get(slug, {})
icon = info.get("icon", "📄")
title = info.get("title", slug)
subtitle = info.get("subtitle", "")
path = info.get("path", f"topics/{slug}/CLAUDE")
text = f"### [[{path}|{icon} {title}]]\n{subtitle}"
if side == "left":
ix = gx + 30
iy = gy + TOP_PAD + i * (ITEM_H + ITEM_GAP_Y)
else:
col = i % cols
row = i // cols
ix = gx + 30 + col * (item_w + COL_GAP)
iy = gy + TOP_PAD + row * (ITEM_H + ITEM_GAP_Y)
nodes.append({
"id": uid(f"item-{gid}-{slug}"),
"type": "text",
"x": ix, "y": iy,
"width": item_w, "height": ITEM_H,
"text": text
})
if side == "left":
left_y += gh + GROUP_GAP
else:
right_y += gh + GROUP_GAP
return {"nodes": nodes, "edges": []}
def add_item(config: dict, tier: str, slug: str, title: str, group_id: str):
tier_dir = "cases" if tier == "case" else "topics"
if slug not in config["labels"]:
config["labels"][slug] = {
"icon": "📄",
"title": title,
"subtitle": "",
"path": f"{tier_dir}/{slug}/CLAUDE"
}
for group in config["groups"]:
if group["id"] == group_id:
if slug not in group["items"]:
group["items"].append(slug)
return
# フォールバック: 未分類へ
for group in config["groups"]:
if group["id"] == "uncategorized":
if slug not in group["items"]:
group["items"].append(slug)
return
def list_groups(config: dict):
selectable = [g for g in config["groups"] if g["id"] != "uncategorized"]
for i, g in enumerate(selectable, 1):
print(f"{i}) {g['label']} (id: {g['id']})")
print(f"{len(selectable)+1}) 📌 未分類")
def get_group_id(config: dict, num: str) -> str:
selectable = [g for g in config["groups"] if g["id"] != "uncategorized"]
try:
idx = int(num) - 1
if 0 <= idx < len(selectable):
return selectable[idx]["id"]
except ValueError:
pass
return "uncategorized"
def main():
with open(CONFIG_PATH, encoding="utf-8") as f:
config = json.load(f)
args = sys.argv[1:]
if "--list-groups" in args:
list_groups(config)
return
if "--get-group-id" in args:
idx = args.index("--get-group-id")
print(get_group_id(config, args[idx + 1]))
return
if "--add" in args:
idx = args.index("--add")
tier = args[idx + 1]
slug = args[idx + 2]
title = args[idx + 3]
gid = args[idx + 4] if idx + 4 < len(args) else "uncategorized"
add_item(config, tier, slug, title, gid)
with open(CONFIG_PATH, "w", encoding="utf-8") as f:
json.dump(config, f, ensure_ascii=False, indent=2)
canvas = build_canvas(config)
with open(CANVAS_PATH, "w", encoding="utf-8") as f:
json.dump(canvas, f, ensure_ascii=False, indent="\t")
print(f"✅ map.canvas を更新しました({len(canvas['nodes'])} ノード)")
if __name__ == "__main__":
main()
```
# 13. マップ設定 dashboards/canvas-config.json を作成(内容は厳密に以下。グループは後で自由に編集可)
```json
{
"groups": [
{
"id": "cases",
"label": "📁 Cases(案件)",
"color": "3",
"side": "left",
"items": [
"example-case"
]
},
{
"id": "ops",
"label": "⚙️ 運用・管理",
"color": "2",
"side": "left",
"items": [
"ナレッジベース運用手順"
]
},
{
"id": "learning",
"label": "💻 学習テーマ",
"color": "5",
"side": "right",
"items": [
"sample-study"
]
},
{
"id": "uncategorized",
"label": "📌 未分類",
"color": "1",
"side": "left",
"items": []
}
],
"labels": {
"example-case": {
"icon": "📁",
"title": "example-case",
"subtitle": "サンプル案件",
"path": "cases/example-case/CLAUDE"
},
"ナレッジベース運用手順": {
"icon": "📖",
"title": "ナレッジベース運用手順",
"subtitle": "intake / distill / reconcile 手順",
"path": "topics/ナレッジベース運用手順/CLAUDE"
},
"sample-study": {
"icon": "📚",
"title": "サンプル学習テーマ",
"subtitle": "学習テーマの例",
"path": "topics/sample-study/CLAUDE"
}
}
}
```
# 14. Obsidian スキルをインストール
- 次のコマンドで kepano の obsidian-skills を導入する: `npx skills add https://github.com/kepano/obsidian-skills.git`
- これにより obsidian-markdown / obsidian-bases / obsidian-cli / json-canvas 等が `.agents/skills/` に入る。
- 注意: `.agents/` は .gitignore で除外するため、別環境では clone ではなくこのコマンドで再インストールする。
# 15. 動作確認用に case と topic を生成(newcase.sh は対話式のため、echo で未分類を指定して実行)
- `echo "" | ./newcase.sh case example-case "サンプル案件"` を実行
- `echo "" | ./newcase.sh topic sample-study "サンプル学習テーマ"` を実行
- `echo "" | ./newcase.sh topic ナレッジベース運用手順 "ナレッジベース運用手順"` を実行
- `python3 scripts/update-canvas.py` を実行して map.canvas を生成する
# 16. .gitignore を作成(内容は厳密に以下)
```
# macOS
.DS_Store
.AppleDouble
.LSOverride
# Skills(再インストール: npx skills add https://github.com/kepano/obsidian-skills.git)
.agents/
# バイナリ原本(コンパニオン .md を代わりにコミット)
*.pptx
*.docx
*.xlsx
*.pdf
*.cad
*.step
*.stp
*.dwg
*.dxf
# 大容量の受領生データはパス指定で追加除外する(knowledge/ の蒸留結果のみ追跡)
# 一時ファイル
*.tmp
*.temp
_inbox/_routing-plan.md
```
# 17. git 初期化
- `git init` を実行し、全ファイルをステージして「Initial commit: ナレッジベース セットアップ」でコミットする。
# 18. 最後に、作成したディレクトリツリーと、毎回やること(_inbox投入→計画→実行)の
# 流れを簡潔に出力して終了。
構築後の Obsidian 設定
- Obsidian で「保管庫としてフォルダーを開く」からこのフォルダを選ぶ
- 設定 →「コアプラグイン」で Bases を有効化する(v1.9 以降)
-
dashboards/README.mdを開き、表とマップが描画されることを確認する
[!tip] この記事自体を保存する
セットアップ完了後、この記事をtopics/ナレッジベース運用手順/deliverables/ナレッジベース運用手順書.mdとして保存してください。ルート CLAUDE.md の「手順書の同期」規約は、このファイルを新環境を再現する唯一の自己完結ソースとして維持することを求めています。以後、仕組み(CLAUDE.md / prompts / dashboards / スクリプト)を変えたら、必ずこの手順書の対応ブロックも同じ内容に更新します。
4. 運用手順 — 覚えるのは「頻度別の5操作」だけ
操作は「順番」ではなく頻度で覚えます。日常の主役は【毎回】のループだけです。
【たまに】 案件/テーマが増えたら … 器を作る(case か topic を1つ)
【毎回】 ファイルが出たら ……… _inbox に入れる → 計画 → 確認 → 実行
【ときどき】 蒸留する ……………… 溜まった daily を knowledge に反映して最新化
【ときどき】 棚卸しする …………… open-issues を整理(失効・立ち消え・重複を掃除)
【必要時】 横断で質問する ……… 出典付きで回答。価値ある回答は syn-*.md に自動蓄積
以降のプロンプトはすべて、ナレッジベースのルートで起動した Claude Code にそのまま貼るだけです。
4-1.【たまに】案件・テーマが始まったとき:器を作る
新しい案件やテーマが立ち上がった「最初の1回」だけ実行します。
顧客案件のとき(貼る例):
新しい案件「ACME社 PLM導入 STEP1」を作って。tier は case、
slug は英数ケバブケースで決めて newcase.sh で作成し、CLAUDE.md の現状サマリの叩き台も埋めて。
map.canvas のグループは Cases に入れて。
学習テーマのとき(貼る例):
新しいテーマ「ERPのデータ移行学習」を作って。tier は topic、
slug は英数ケバブケースで決めて newcase.sh で作成して。
[!tip] 器を作り忘れても大丈夫
いきなり_inboxに放り込んでも、次の「計画」で「新規案件の候補」として提示されます。「これを acme-plm-step1 として作って振り分けて」と返せば、器の作成と配置が一度に済みます。
4-2.【毎回】ファイルが出たら:_inbox → 計画 → 実行
日常の主役です。議事録・文字起こし・docx・xlsx・pdf・CAD、何でも _inbox/ に放り込んでから2ステップ。
ステップ1 — 振り分け計画を作る:
_inbox/ のファイルを prompts/route.md の手順で振り分けて、計画を _inbox/_routing-plan.md に
出力して。この段階ではまだファイルを動かさないで。
ステップ2 — 計画を見て OK なら実行する:
_routing-plan.md を確認したので実行して。
- 各ファイルを計画どおりの場所へ移動
- バイナリには同名コンパニオン .md(概要・要点・出典・received)を作成
- 文字起こし/議事録は原本を保持しつつ、決定→decisions.md・未決/保留→open-issues.md・
ToDo→該当箇所へ、出典リンク付きで反映
- 反映先の CLAUDE.md 現状サマリを更新
- 実行内容を _inbox/_routing-log_(今日の日付).md に記録
- 「要確認」のファイルは動かさず _inbox/ に残す
[!note] 人が判断するのは「要確認」だけ
ステップ1の後に出る「要確認(私の判断が必要)」リストにだけ答えれば OK。確実に振り分け可能なものはそのまま実行して問題ありません。自作成果物はファイル名にmine_を付けると自動判別され、要確認が減ります。
4-3.【ときどき】蒸留する:daily → knowledge
daily に生ログが溜まってきたら、knowledge(現在の正)を最新化します。自動では走りません。
prompts/distill.md の手順で「acme-plm-step1」を蒸留して。
未蒸留の daily を読み、決定→decisions.md・未決/保留→open-issues.md・用語→glossary・
人物→contacts に、出典リンク付きで反映して。反映したファイルの updated を今日に更新して。
[!tip] どれから蒸留するか
Obsidian の「knowledge 鮮度」ダッシュボード(freshness.base)で「更新からの日数」が大きい case/topic から優先的に蒸留すると効率的です。
4-4.【ときどき】棚卸しする:open-issues を掃除
蒸留は「追記」工程なので、放置すると失効した OPEN・立ち消えた ToDo・似た言い回しの重複が溜まります。次回会議の前や、蒸留の後に回すと効きます。
prompts/reconcile.md の手順で「acme-plm-step1」の open-issues を棚卸しして。
decisions と最新 daily と突き合わせて、各 OPEN/PARKED/ACTION を
KEEP / UPDATE / MERGE / RESOLVED / SUPERSEDED / DROPPED / CLOSED で判定し、提案を出して。
終了分は削除せず ARCHIVE に墓碑を残し、立ち消えが断定できないものは私に確認して。
[!note] 人が判断するのは「終了してよいか」だけ
重複の統合や文脈更新はそのまま実行で OK。失効・立ち消えの終了判断だけ AI が確認してきます。
4-5.【必要時】横断で質問する(回答は自動で知識になる)
普通に質問するだけです。書き戻しは Claude が自動判断します。
cases を横断して、いま OPEN な論点と次アクションを案件別に、出典付きで一覧にして。
(slug)の「(テーマ)」に関する決定/確定した理解を、理由と出典付きで時系列でまとめて。
(slug)で繰り返し議論されているが決まっていないことと、そのトレードオフをまとめて。
[!info] synthesis(合成・書き戻し)の動き
条件を満たす回答(複数ファイルの合成・矛盾の発見・実質的な説明・アイデア出し)は、確認なしにknowledge/syn-*.mdへ自動保存され、回答末尾に「→ syn-xxx.md に保存しました」と通知されます。
さらに対話でアイデアが固まりかけると(「それが良さそう」等)、検討経緯が syn-*.md に保存され、open-issues にCANDIDATE(仮案・外部確認待ち)として追記されます。外部確認が通ったら RESOLVED として decisions.md へ昇格させます。
5. シーン別の実務フロー
顧客案件の典型的なライフサイクル
案件が立ち上がった → 【器を作る】case を1つ作成(1回だけ)
キックオフ会議をやった → 文字起こし/議事録を _inbox へ → 【計画→実行】
客先から仕様書PDFが来た → _inbox へ → 【計画→実行】(references に入り、論点を open-issues へ)
要件Excelをもらった → _inbox へ → 【計画→実行】(reference + 抽出)
提案書・見積を自分で作った → ファイル名に mine_ を付けて _inbox へ → 【計画→実行】(deliverables へ)
CADを検討した → _inbox へ → 【計画→実行】(assets + コンパニオン .md)
daily が溜まってきた → 【蒸留】knowledge を最新化
次の会議の前 → 【横断質問】open-issues を一覧化して論点出し +【棚卸し】
何かが決定した → 次の【計画→実行】で decisions に反映、該当 open-issue は終了
「器を作る」のは最初の1回だけ。以降の出来事はすべて _inbox → 計画 → 実行 に乗ります。
学習テーマの典型的なライフサイクル
勉強する分野を決めた → 【器を作る】topic を1つ作成(1回だけ)
記事やドキュメントを調べた → メモ/URL要約/PDF を _inbox へ → 【計画→実行】
(daily に学習ログ、理解→decisions、疑問→open-issues(OPEN))
分からないことが出た → open-issues に OPEN(疑問) として残る
調べて理解できた → decisions(確定した理解) へ移動、open-issue は CLOSED
試験直前 → 【横断質問】まだ OPEN な疑問を全部出す=弱点リスト
チートシートを作った → _inbox へ(mine_ 付き)→ deliverables へ
学習テーマでは open-issues.md が「まだ理解できていないことリスト」として働くのが肝です。
学習ログを inbox 経由でなく直接記録したいとき:
topic「sample-study」に、今日調べた以下の内容を daily に学習ログとして記録して。
理解できた点は decisions.md(確定した理解)へ、まだ曖昧な点は open-issues.md に OPEN(疑問) として、
それぞれ出典付きで追記して。
--- 調べた内容 ---
(ここに貼り付け)
--- ここまで ---
疑問が解決したとき:
topic「sample-study」の open-issues にある「(解決した疑問)」について、
理解できた内容は「(要点)」。これを decisions.md に移して、open-issues 側は CLOSED にして。
6. ダッシュボードの見方
Obsidian で dashboards/README.md を開くと、全ビューを一覧できます。
| ビュー | 見るもの | サイン |
|---|---|---|
map.canvas |
全 case/topic のビジュアルマップ | カードクリックで各索引へジャンプ |
index.base |
case/topic 一覧 | — |
freshness.base |
knowledge の鮮度(古い順) | 上にある=蒸留が滞っている |
open-issues.base |
未決・保留のありか(古い順) | 上にある=棚卸しが滞っている |
deliverables.base |
成果物カタログ | .md 以外は「要コンパニオン.md」表示 |
新しい case/topic・成果物は frontmatter 規約に従って作れば自動的に各ビューへ載ります。ダッシュボード側の設定変更は不要です。
7. 運用のコツ・FAQ
-
覚えるのは3つ+掃除+書き戻し: 器を作る(たまに)、
_inbox→計画→実行(毎回)、蒸留(ときどき)。棚卸しで掃除し、良い回答は syn-*.md に自動蓄積される。 - syn-*.md の原則: 良い回答をチャット履歴に消さない。「同じ質問を二度したくない」と感じたら書き戻しのサイン(通常は自動で保存される。強制したいときは「syn-xxx.md に保存して」と言う)。
- 判断は最後に一回: 計画の「要確認」に挙がったものだけ直せば OK。ファイルごとの判断はしない。
-
誤配置に強い:
_routing-log_<日付>.mdに履歴が残るので、後から追跡・修正できる。 -
スクリプトは部品:
newcase.sh/newday.shは手で叩くものではなく、Claude Code が裏で呼ぶ確実な部品。frontmatter 規約に沿った雛形を確実に出す。 - 起動場所: 横断質問はルートで起動すると全体を見られる。特定の case/topic に集中するときはそのフォルダで起動すると速く・正確。
- git はこまめにコミット: AI がファイルを書き換える運用なので、git が最後の安全網。定期的に「今日の変更をコミットして」と頼むだけでよい。
- daily と knowledge が食い違ったら: 新しい日付が優先。AI は相違を明示するよう規約化されているので、矛盾に気づいたらその場で decisions を直させる。
- 仕組みを変えたら手順書も更新: CLAUDE.md / prompts / dashboards / スクリプトを変えたら、手順書(この記事を保存したファイル)の対応ブロックも同じに直し、版数を上げる。これを怠ると、次に新環境を作るとき変更が失われる。
よくある質問
[!question]- Obsidian を使わないと運用できない?
できます。実体はただの Markdown なので、Claude Code だけで intake / distill / reconcile / query のすべてが回ります。Obsidian は鮮度・論点のダッシュボード表示と、wikilink でのブラウジングに使います。
[!question]- case と topic はどう使い分ける?
顧客・相手がいて成果物を納める仕事は case、自分のための学習・調査・記録は topic。case にはcontacts.md(登場人物)とdeliverables/proposals|estimates|documentsが追加されます。迷ったら topic で始めて、仕事になったら case を作り直せば十分です。
[!question]- AI が勝手にファイルを消したりしない?
破壊的操作(ファイル移動・論点の終了・knowledge の書き換え)はすべて「提案 → 人のレビュー → 実行」の順に規約化されています。また終了した論点も削除せず ARCHIVE に墓碑を残すため、完全に消える情報は原則ありません。git のコミット履歴が最終防衛線です。
[!question]- スペース(case/topic)が増えて把握しきれなくなったら?
index.baseとmap.canvasが自動で全量を一覧します。終わった案件はディレクトリごと_archive/などへ移せばダッシュボードから消えます(wikilink は Obsidian が追跡します)。
8. まとめ — この仕組みが回る理由
-
入口が1つ(
_inbox/)だから、迷わない。分類は AI の仕事。 - 生ログと確定知識が分離しているから、情報が腐っても「現在の正」は守られる。
- AI の作業はすべて提案だから、安心して任せられる。人の判断は「要確認」と「終了してよいか」の2箇所だけ。
- 回答が知識に還流する(synthesis)から、使えば使うほど賢くなる。
- 鮮度が見える(freshness / open-issues / last-touched)から、メンテのサボりが可視化される。
このガイド1本で、同じ仕組みを何度でも・誰の環境でも再現できます。まずは §3 のプロンプトを空フォルダに貼るところから始めてください。
Discussion