対象読者: 非エンジニア(専門用語は初出時に括弧で解説) 作成日: 2026-04-08 ステータス: 提案(Codex adversarial review 済み)
Second-Brain は「AI非依存の外部記憶」として設計されている。核となる思想は3つ:
Second-Brain/(2,885ファイル、37.9MB)
├── YYYY-MM-DD_タイトル.md ← ChatGPT由来(1,375件)
├── YYYY-MM-DD_タイトル_8桁hex.md ← Claude Code/Codex由来(1,503件)
├── telegram-outbound-YYYY-MM-DD.md ← Telegram送信ログ(少数)
├── README.md
└── _generated/wiki/topics/ ← Karpathy式KB(5トピック、Phase 1完了)
| フィールド | 内容 | 件数 |
|---|---|---|
date |
日付 | 2,858 |
title |
タイトル | 2,853 |
source |
記録元(ChatGPT/Codex/Claude Code) | 2,850 |
tags |
タグ | 2,858 |
session_id |
セッション識別子 | 1,627 |
msg_count |
会話ターン数(Codexのみ) | 897 |
注目すべき不在: セッションの「種別」(対話なのか作業なのか)を示すフィールドが存在しない。
sync-recall-to-obsidian.sh が SessionEnd hook(セッション終了時に自動実行)と cron(定期実行)で動くrecall read コマンドでセッション内容を取得 → Markdown に変換 → Obsidian に書き出し現在のSecond-Brainには2種類のセッションが混在しているが、区別する手段がない:
| セッション種別 | 目的 | 検索時に答えたい問い |
|---|---|---|
| ユーザー対話 | 秘書とのTelegram経由の意思決定会話 | 「なぜそう決めたか」 |
| エージェント作業 | 秘書がdispatchした実装タスク | 「どうなったか」 |
1. 検索ノイズの増大 「なぜあの設計にしたか」を探したいのに、関連する実装作業ログが大量にヒットする。逆に「あの実装どうなった?」を探すと意思決定の議論が混入する。2,885件の時点で既に発生しており、年間1,600件ペースで増加中。
2. 情報源優先順位の形骸化
秘書設計書では レジストリ → tmux → Second-Brain → memory → recall の優先順位が定義されているが、Second-Brain 内部が未分化なので、参照時点でノイズの塊になる。優先順位があっても、層内の選別が弱いと意味がない。
3. Karpathy式KB(wiki compile)への悪影響
compile-wiki.sh が全ファイルを原材料として知識を蒸留する際、対話ログと作業ログの区別がつかないため、wiki トピックの品質に影響する可能性がある。「決定の根拠」と「作業の詳細」は蒸留の仕方が異なるべき。
4. 将来の再編コストの先送り 10,000件を超えてから分類を導入すると、過去分の後付け変換(retrofitting)が最もコスト高になる。今やるのが最も安い。
5. 「全部記録している安心感」と「使える知識」は別 蓄積量が多いほど賢くなるのではない。取り出し単位が設計されているほど賢くなる(Codex指摘)。
| 提案 | 却下理由 | 教訓 |
|---|---|---|
| frontmatter type + サマリーのみ記録 | サマリー生成でLLMコンテキストを消費する | 記録時にLLM推論を要求してはいけない |
| 作業ログはSecond-Brain記録スキップ | 「思想から考え直せ」 | 記録を減らすのではなく、記録の意味を分けるべき |
Codex が最も鋭く指摘した核心を採用する:
「保存フォーマット(Markdown + frontmatter)の統一」と「記録の意味分類」は別物。形式は統一したまま、意味分類だけ追加する。
record_kind フィールドを追加し、記録の種別を機械的に分類する---
date: 2026-04-08
title: "秘書との転職方針の相談"
source: "Claude Code"
session_id: "abc12345-..."
record_kind: dialogue # ← 新規追加
tags:
- "claude"
---
record_kind の値| 値 | 意味 | 判定方法 |
|---|---|---|
dialogue |
ユーザーとの対話(意思決定・相談) | Telegram起点のsecretaryセッション |
agent_work |
dispatchされた実装タスク | secretary が task dispatch で生成したセッション |
interactive |
ユーザーが直接Claude Codeを操作 | Telegram以外の直接操作セッション |
codex_review |
Codexによるレビュー | source: Codex |
chatgpt |
ChatGPTとの会話 | source: ChatGPT |
ゼロ追加コストの分類方法:
dialogue、agent runner 由来 → agent_worksync-recall-to-obsidian.sh を呼ぶ側で RECORD_KIND=dialogue を渡すsource フィールド(ChatGPT → chatgpt、Codex → codex_review)RECORD_KIND=agent_work を設定記録層(変更なし) 検索層(新規)
┌────────────────┐ ┌────────────────────────┐
│ 全セッションを │ │ record_kind で絞り込み │
│ 生ログのまま │ ──→ │ │
│ 完全保存 │ │ dialogue → 意思決定検索 │
│ │ │ agent_work → 作業結果検索│
│ 要約しない │ │ 両方 → wiki compile │
│ 省略しない │ └────────────────────────┘
└────────────────┘
ポイント: 記録は完全保存のまま。検索時に record_kind で用途別に絞る。これにより:
record_kind: dialogue で greprecord_kind: agent_work で grepCodex(GPT-5.4)による adversarial review で、以下の分析が得られた:
「本当の問題は『dialogue と work が区別できないこと』ではない。『記録システムが retrieval requirements(取り出し要件)から逆算されていないこと』だ。」
この指摘を踏まえ、提案は「取り出し要件から逆算した最小限の構造化」に焦点を当てている。
| 評価軸 | 案1(サマリー) | 案2(スキップ) | 本提案(record_kind) |
|---|---|---|---|
| context効率 | サマリー生成でLLM消費 | 消費なし | 消費なし(機械分類) |
| 情報の完全性 | サマリーは原本の劣化コピー | 作業ログが消える | 全て完全保存 |
| 検索性 | サマリーの品質次第 | 存在しないものは検索不能 | frontmatterでフィルタ可能 |
| 保守コスト | サマリー品質の管理が必要 | 低い | 環境変数1つの追加 |
| AI非依存 | 維持 | 維持 | 維持(標準的なfrontmatter) |
| 既存設計との整合 | 部分的 | 思想に反する | 形式統一を完全維持 |
| Codex指摘 | 本提案の対応 |
|---|---|
| 「同じ形式で残すほど使いやすい」は半分だけ正しい | 形式は統一、意味分類を追加 |
| 「後段の検索で区別できれば十分」は10K+で破綻 | frontmatter で事前分類 |
| 「AI-agnostic = 同一スキーマ」は誤り | record_kind は vendor-neutral |
| 「分類にはLLMが必要」は怪しい | 発生源・経路で機械分類 |
| 「単一の主軸 = 単一レイヤー」は別問題 | 主軸のまま、内部に型を追加 |
record_kind 追加変更対象: sync-recall-to-obsidian.sh(とその呼び出し元)
環境変数の追加: RECORD_KIND を受け取るようにする
interactive(ユーザー直接操作)RECORD_KIND=agent_workRECORD_KIND=dialoguefrontmatter 生成部分の修正: record_kind: $RECORD_KIND を追加
record_kind: dialogue # ← 1行追加するだけ
secretary の dispatch スクリプト修正: タスク実行時に RECORD_KIND=agent_work を環境変数に設定
source ベースの自動判定: RECORD_KIND が未設定の場合のフォールバック
record_kind: chatgptrecord_kind: codex_reviewrecord_kind: interactive全2,885件を一気に分類する必要はない。段階的に:
決定的ルールで一括処理できるもの:
source: ChatGPT → record_kind: chatgpt(1,219件)source: Codex → record_kind: codex_review(897件)Claude Code セッション(734件)の分類:
record_kind: unknownunknown はそのまま放置してよい:
record_kind ベースの一覧ビューを作成compile-wiki.sh が record_kind を参照して蒸留ロジックを分岐record_kind でフィルタリング| ケース | 対応 |
|---|---|
| 対話しながら作業もする混合セッション | record_kind: mixed を許容 |
| secretary自身が調査する短いセッション | record_kind: dialogue(意思決定の一部) |
| ユーザーが直接Claude Codeで作業 | record_kind: interactive |
「本当の問題は『dialogue と work が区別できないこと』ではない。『記録システムが retrieval requirements(取り出し要件)から逆算されていないこと』だ。お前が欲しいのは保存の美しさではなく、必要なときに必要な記録だけを、安く、確実に引けることのはずだ。」
record_kind をfrontmatterに追加「今の "same format for everything" は原則ではなく、実装都合が哲学に昇格しているだけだ。形式統一と意味無差別は別物だ。」