context-engine-audit.ja.md
docs/i18n/context-engine-audit.ja.md
コンテキストエンジンとしての Tesserae — ギャップ分析
<!-- translations:start -->
English · 한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch
<!-- translations:end -->
ミッション(2026-06-02): Tesserae は*コンテキストエンジン*です —— 三本の 柱を通じて自己改善型ナレッジベースを再構築することで、エージェントが すぐに使えるコンテキストを生成します:(1) セッション監視、 (2) 自律的かつ能動的な取り込み、(3) オンデマンドドキュメント。 知識はリアルタイムで進化し、いつでもエージェントに渡せる状態でなければ なりません。
本ドキュメントは、現在のコードベースをそのミッションに照らして監査します。 四方向の並行レビュー(取り込み/セッション、自己改善、出力/エージェント対面、 オーケストレーション/ライフサイクル)の成果物です。
v0.5.0 時点のステータス(2026-06-06): 本書は時点監査(2026-06-02 のスナップショット)であり、記録のためそのまま保持しています。その横断的な指摘の大半は現在解決済みです: 欠けていたスーパーバイザデーモンとインプロセスのパイプラインオーケストレータが出荷され(エンジンスパイン、
tesserae/engine/)、ライブセッションのテーリングが事後スキャンを置き換え(柱 1)、自己改善パスがnode_memoryサイドカーを通じて有効化・永続化され(supersede デフォルト有効+抑制、数値的な再発信頼度 — 柱 2)、ハッシュバケットのデフォルト埋め込みが失敗時に明示的に知らせる本物のバックエンドに置き換わり(柱 3)、そして柱 3 のオンデマンドコンテキストコンパイラが今や存在します(compile_context)。GraphStoreポート経由の設計された増分レイヤはインフラとして着地しましたが、フラグ OFF/実験的のままで、serve+watch+deploy の統一(ビルド順序ステップ 7)は依然未対応です。フェーズごとのステータスはフェーズ別ロードマップ、変更の概要は v0.5.0 リリースノートを参照してください。以下の指摘は元のスナップショットのまま無編集で残しています。
一行の評決
今日の Tesserae は機械的に健全で、十分にテストされたバッチ CLI コンパイラです。コンテキストエンジンのビジョンに照らすと、三本の柱すべてで 手動トリガー + 事後処理 + git-HEAD 依存です。エンジンを構築する機構は すでにプリミティブとして存在します —— 欠けているのは、それらを組み合わせる 継続的・自己駆動の層です。
あらゆる断面で最大の欠落部分:単一のイベントループを所有し、セッション 追跡、取り込み、増分コンパイル、公開を自律的に駆動する長時間稼働の スーパーバイザ/デーモン。それ以外はすべてその上に積む増分作業です。
柱 1 — セッション監視 → ライブではなく事後処理
| 状態 | 所見 | 必要なもの |
|---|---|---|
| ギャップ | セッションキャプチャは事後スキャン:discover_harness_sessions() は、人が sessions discover --import または compile を実行したときだけ完了したトランスクリプトを走査します。compile は意図的に ~/.claude/projects/ のスキャンを拒否します(レイテンシ)。 | セッション進行中に harness JSONL ファイルを監視しターン単位で取り込むテイラー(tailer)。 |
| ギャップ | 唯一の真のウォッチャ(watch.py WatchLoop)はソース markdown を対象とし、2 秒ごとにポーリングして完全な compile を発火します。セッションもコードも監視しません。 | 一つのスーパーバイザの下でセッション + ソースツールのトリガーへ拡張。 |
| ギャップ | vault_watch.py の「ライブ」ループは取り込みではなく出力(Obsidian 逆同期)に対するものです。 | ライブ知識プルの代替にはなりません。 |
| 粗い | セッション再抽出は session_id 単位でキャッシュキー化されますがセッション全体単位です:新しいターン 1 つでキャッシュ全体が無効化され、完全な LLM パスを再実行します。 | ライブテイリングのためのターン単位の増分性。 |
| 粗い | harness_sessions ストアはフラットな glob で、list/write のたびに全再スキャンします。 | 増え続けるキャプチャ集合のためのインデックス式/追記式ストア。 |
| 欠落 | ノード単位の鮮度/来歴タイムスタンプがありません。最新性はアーティファクトレベル(git HEAD)でのみ追跡されます。 | 「これはどれくらい新鮮か?」のための事実単位の鮮度。 |
柱 2 — 自己改善型ナレッジベース → 一回限りの再抽出、後付けの進化
「進化する」パスは存在しますが、単一の compile 内でのみ(ゼロからの 再抽出)実行され、ほとんどが環境フラグまたは手動 CLI でのオプトインです。 事実はコンパイルごとに再計算され、その場で改訂されません。
| 状態 | 所見 | 必要なもの |
|---|---|---|
| ギャップ | 減衰(Decay)(memory/decay.py、エビングハウス 14 日半減期)は*クエリ時*にのみ計算され、コンパイル時に永続化・書き戻しされません。 | コンパイル時の減衰書き込み + 永続スコア。 |
| ギャップ | 減衰のアクセスループが死んでいます:last_accessed_at == first_seen_at、access_count は決して増えません。「ずっと見ている → 重要だ」というシグナルが何もしません。 | アクセス記録面(MCP 読み取り → インクリメント)。 |
| ギャップ | 置き換え(Supersede)(memory/supersede.py)は TESSERAE_SUPERSEDE_PASS=true でゲート(デフォルトオフ)され、エッジを*追加するだけ* —— 陳腐化したコンテンツを降格/非表示にしません。信念改訂は見せかけです。 | デフォルトオン + 出力で置き換えられた事実を抑制するコンシューマ。 |
| ギャップ | 矛盾(Contradictions)は*検出*されますが(lint.py、info 重大度、脆弱な文字列一致)*解決*されません。信頼度の調停がありません。 | 単なる探査ではなく解決パス。 |
| ギャップ | スキーマドリフト(Schema drift)(schema_drift.py)は手動の schema-drift サブコマンドで提案を書くだけ。スキーマは自己精緻化しません。 | 適用パス + パイプライン統合。 |
| ギャップ | 正規化(Canonicalization)は高信頼度のエイリアスのみ自動マージし、残りは人の CLI 承認待ちにします。 | 時間とともに LLM が調停する自動マージ。 |
| ギャップ | フィードバックループが半閉じ:決定論的ベースライン抽出器は*ガイダンスを完全に無視*します(selective_extractor.py:43)。任意の LLM パスのみが修正を消費します。LLM オフだと、人の修正は抽出に再投入されません。 | 決定論的パスのガイダンス遵守、または LLM デフォルト化。 |
| ギャップ | 再発インサイト強化がありません:インサイトがセッションをまたいで再出現しても信頼度を強化するものがありません。temporal.infer_confidence は粗い文字列ヒューリスティックです。 | セッション横断の頻度 → 数値信頼度。 |
| 粗い | 置き換え候補のペアリングは語彙的 Jaccard(0.55)です。語彙の重なりが少ない意味的言い換えは決して候補になりません。 | 埋め込みベースの候補生成。 |
| 欠落 | 自己改善の断面全体が未テスト(decay/supersede/feedback/drift/canonical/temporal のテストなし)。 | ここを変更する際に併走するテスト。 |
柱 3 — オンデマンドドキュメント → まだ存在しない
クエリ/検索の配管は成熟しています(ハイブリッド RRF、PPR、約 20 の MCP ツール、 ページごとの ask、AI エクスポート)。しかしすべてのアーティファクトは静的な 全コーパス投影か単一ノードのルックアップです。「ユーザーが『X についての コンテキストをくれ』→ あつらえのドキュメント」は実装されていません。それを 構築するプリミティブはすべて存在しますが、組み合わされていません。
| 状態 | 所見 | 必要なもの | |
|---|---|---|---|
| 欠落 | オンデマンドドキュメント生成(中核となる柱 3 のギャップ)。 リクエストからあつらえ・クエリスコープのドキュメントを生成するモジュールがありません。report.py はコンパイル時の lint サマリであって知識アーティファクトではありません。 | 新 context_compiler:検索 → PPR → 近傍探索 → 本文組み立て → 任意の LLM 統合。 | |
| ギャップ | wiki_page は事前コンパイルされたノード本文を 1 つ返すだけ。マルチノード・クエリスコープの組み立てツールがありません。 | `compile_context(query | seeds, depth, budget)` MCP ツール。 |
| ギャップ | ask は散文や結果リストを返すだけで、ダウンロード可能/受け渡し用のコンテキストアーティファクトは決して返しません。 | 構造化・引用付きコンテキストバンドルを出力する回答モード。 | |
| ギャップ | agent_harness.py は静的ハンドオフ(ハードコードされた上位 12 ノード + 固定リスト)であり、クエリスコープでもタスクごとでもありません。 | トピック/シードを受け取り → スコープ化されたブリーフをレンダリング。 | |
| ギャップ | node_context は 1 ホップ、ランクなし。エージェントコンテキストのプリミティブとして弱い。 | ランク付き k ホップコンテキストのため PPR を経由。 | |
| ギャップ | エクスポート(llms.txt、graph.jsonld)は全コーパスダンプ。トピックごとのスライスがありません。 | トピックスコープのサブグラフ → llms-txt スライス。 | |
| 粗い | デフォルトの埋め込みレーンは決定論的ハッシュバケット擬似埋め込み(blake2b、128 次元)。sentence-transformers がインストールされている場合のみ本物の意味バックエンドで、auto は静かに降格します。すぐ使える「意味」検索は偽物です。 | 本物のデフォルト埋め込み、またはハッシュレーンに対する大きな警告。 | |
| 粗い | ノード引用の正規表現一致がないと、query.answer() は有効な LLM 回答を破棄します。 | 回答を保持し、欠落した引用をフラグ。 | |
| 粗い | 静的ホストの ask ウィジェットは缶詰の DEMO_QA を提供します。本物の ask は serve 下でのみ動作します。公開 Pages の「ask」は演劇です。 | デモ用は許容可能。だが公開サイトではエージェントが消費できません。 | |
| 粗い | ask の auto バックエンドは例外を飲み込み、見えないところで BM25 に降格します。 | どのバックエンドが答え、なぜフォールバックが発火したかを明示。 |
横断的関心事 — オーケストレーション & ライフサイクル → バッチ CLI、エンジンなし
| 状態 | 所見 | 必要なもの | |
|---|---|---|---|
| ギャップ | デーモン/エンジンプロセスがない。 フラットな一回限りの argparse ディスパッチャ。各サブコマンドの後にプロセスが終了。signal/SIGTERM/pidfile/launchd 処理はゼロ。ウォッチャは素の KeyboardInterrupt で死ぬ。 | 単一のイベントループ + 優雅なシャットダウンを所有する監督付き長時間稼働デーモン。 | |
| ギャップ | 「継続」 = while True: time.sleep(interval) の markdown ポーラ。ファイルシステムイベント、バックプレッシャ、ストリーミングなし。 | 単一スケジューラを持つイベント駆動コア。 | |
| ギャップ | 「Refresh」がコードではなくスラッシュコマンドの markdown スキルに存在 —— sessions discover --import → compile → obsidian-sync を順序付けます。 | デーモン/CLI/MCP が共有する一級のインプロセスパイプラインオーケストレータ。 | |
| 粗い | changed_only 増分コンパイルは脆弱で、それ自身が回避策と明言:マニフェストは {path: sha256}。先行グラフを再ロードし、プロジェクタ/統合ノードを剥がし、再抽出されたソースノードを退避させてからマージする必要がある —— さもないと 21 ファイル編集が 2400 ノードを 1700 に崩壊させる。 | GraphStore ポートを流れる設計された増分/ストリーミング層。 | |
| 粗い | cli.py は約 2000 行の神ディスパッチャ(if args.command == ... の梯子)。ask/wiki は別個の手作りパーサを持つ。 | コマンドレジストリ / サブコマンドモジュール。 | |
| 粗い | フェーズゲートのフラグが半完成の面を出荷:--sessions-llm のヘルプが*「Phase 5 が着地したら反映される」*と言う。 | 完成させるか隠す。 | |
| 粗い | graph_stores/url_resolver.py は非同期ストアを呼び出しごとに asyncio.run でラップ —— upsert ごとに新しいイベントループ。ストリーミングには病的。 | エンジンが本番化するなら永続非同期ランタイム。 | |
| 粗い | ports/ のヘキサゴナルプロトコルは定義済みだが、スタンドアロンパイプラインはそれらをバイパスして JSON アーティファクトへ直行。ポートを使うのは HypePaper のみ。 | コアパイプラインを一貫して GraphStore に流す。 | |
| 粗い | 3 つの永続化フォーマット(JSON アーティファクト、SQLite ストア、Kuzu)に単一の真実源がない。Kuzu アダプタは 0.16 破損バグを避けるため全フィールドを base64 で包む。 | 一つの真実源に収束。 | |
| 粗い | serve(TCPServer.serve_forever)と watch は別々のブロッキングプロセス —— serve + 自動再コンパイルを一緒にできない。deploy は手動 git push で分離。 | 継続的公開のため serve + watch + deploy をスーパーバイザ下に統一。 | |
| 欠落 | frontend.py は tesserae/site/ を重複させる非推奨の死んだモジュールだが、まだ出荷されている。 | 削除するか呼び出し元を移行。 | |
| 粗い | review_workflow.py の人間レビューループは手編集用に文字列型 `"action": "TODO: merge | keep_separate"` JSON を出力。プログラム的な適用パスがない。 | コンパイルに配線された統合レビューキュー。 |
| 注 | TODO/FIXME マーカーは本当にまばら —— 真の負債はコメントで文書化された回避策(changed-only マージ、Kuzu base64、asyncio-per-call)であって、散在する TODO ではない。 | — |
推奨ビルド順序(アーキテクチャ差分 → ビジョン)
- スーパーバイザデーモン + インプロセスパイプラインオーケストレータ。 一つのイベントループ、シグナル/シャットダウン、markdown スキルの refresh チェーンを置き換える。他のすべての柱をアンロック。
- ライブセッションモニタ。 harness JSONL をテイル → ターン単位の増分抽出 → ループへ供給。(手動の
sessions discover --importを置き換える。) - 本物の増分/ストリーミングコンパイルを
GraphStoreポート経由で行い、 脆弱なchanged_only退避パッチを引退させる。 - 自己改善パスをデフォルトで有効化 + 永続化:コンパイル時の減衰書き込み、 MCP 読み取り時の access-count インクリメント、supersede オン(抑制付き)、 矛盾解決、再発インサイトの信頼度。
- オンデマンドコンテキストコンパイラ(
compile_contextMCP ツール + CLI):クエリ → PPR/ハイブリッド → 近傍探索 → 組み立て・引用付き・ エージェント対応ドキュメント。 - 本物のデフォルト埋め込み(または大きな降格警告)で、意味検索が すぐ使えるハッシュスタブにならないように。
- serve + watch + deploy を統一して継続的公開へ。ライフサイクルテストを 追加(ビジョンが最も依存する層が現在最もカバーされていない)。
保つ価値のある強み
決定論的なバイト同一コンパイル。バッチ機構に対する広範なテストカバレッジ。 クリーンなハイブリッド RRF 検索 + 思慮深い PPR エッジ重み付け。広範で正しく 分割された(公開/非公開)MCP ツール面。堅実な静的エクスポート(llms.txt、 JSON-LD、RSS)とセキュリティを意識した ask ウィジェット。土台は強固で、 やるべき仕事はその上に動的・自己駆動の層を加えることです。