Show HN:エージェントが維持するKarpathy風LLMウィキ(MarkdownとGit)

Hacker News / 2026/4/25

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical UsageModels & Research

要点

  • MarkdownとGitを唯一の正として使い、上にBleve(BM25)+SQLiteのインデックスを載せるAIエージェント向けウィキ層「WUPHF」を公開し、現時点ではベクトルDB/グラフDBは未採用です。
  • 各エージェントにプライベートなノート(agents/{slug}/notebook/.md)と共有チーム・ウィキ(team/)を用意し、下書きをウィキへ昇格させるフロー(バックリンク付与)と有効期限・自動アーカイブのための小さな状態機械を備えます。
  • エンティティごとの事実を追記型JSONL(append-only)で保持し、一定件数ごとにシンセサイザーワーカーがエンティティ要約を再構築し、Git上での来歴を「Pam the Archivist」という別IDで見える化します。
  • /lookupコマンドとMCPツールによる検索で、短い問い合わせはBM25へ、叙述的な質問は引用付きの回答ループへヒューリスティックに振り分け、矛盾や古い記載、壊れたウィキリンクのために毎日リンタを回します。
  • ウィキ層はローカル(~/.wuphf/wiki/)で動作し、gitクローンで持ち出し可能であり、重い基盤を追加する前にMarkdown+Gitだけでどこまで行けるかを検証することを狙っています。

AIエージェント向けのwikiレイヤーを出荷しました。情報源(唯一の正)としてmarkdown + gitを使い、その上にbleve(BM25)+ SQLiteのインデックスを載せています。まだベクトルDBやグラフDBはありません。

ローカルで ~/.wuphf/wiki/ に動作し、必要ならgit cloneして持ち運べます。

形は、Karpathyがしばらく回り続けているものと同じです。つまり、LLMネイティブな知識の基盤で、エージェントがそこから読み、そこへ書き込む。これにより、毎朝貼り直されるのではなく、セッションをまたいでコンテキストが積み重なります。そのアイデアの多くの実装は、Postgres、pgvector、Neo4j、Kafka、そしてダッシュボードに着地します。

そこで、重いものを何か足す前に、基本に立ち返って markdown + git がどこまで行けるかを確かめたかったのです。

これがやること:

-> 各エージェントは agents/{slug}/notebook/.md にプライベートなノートブックを持ちます。加えて、team/. にある共有チームwikiへのアクセスも持ちます。

-> 下書きからwikiへの昇格フロー。ノートブックのエントリはレビュー(エージェントまたは人)され、バックリンク付きで正規のwikiへ昇格します。小さなステートマシンが、有効期限と自動アーカイブを制御します。

-> エンティティごとの事実ログ:追加専用のJSONLが team/entities/{kind}-{slug}.facts.jsonl にあります。合成(シンセサイズ)ワーカーが、N件の事実ごとにそのエンティティのブリーフを再構築します。コミットは「Pam the Archivist」という別のgitアイデンティティで行われるため、git logで来歴が見えるようになります。

-> [[Wikilinks]]。壊れたリンクの検出は赤で表示されます。

-> 矛盾、古いエントリ、壊れたwikilinksのための毎日 lint クロン。

-> /lookup スラッシュコマンドに加えて、引用付き検索のためのMCPツール。短いルックアップはBM25へ、ナラティブなクエリは引用回答ループへ振り分けるヒューリスティック分類器を使います。

基盤(サブストレート)の選択:

耐久性のためのMarkdown。wikiは実行環境より長生きし、ユーザーはあらゆるバイトをそのまま持ち去れます。BM25のためのBleve。構造化メタデータ(事実、エンティティ、エッジ、リダイレクト、supersedes)のためのSQLite。まだベクトルはありません。現在のベンチマーク(500アーティファクト、50クエリ)は、BM25単体だけでrecall@20が85%を超えます。これは内部の出荷ゲートです。クエリのクラスがそれを下回った場合の、事前コミットされたフォールバックがsqlite-vecです。

正規(カノニカル)IDは最上位の存在です。事実IDは決定的で、文のオフセットを含みます。正規スラッグは一度だけ割り当てられ、リダイレクトのスタブを介してマージされ、決して名前変更されません。再構築は、論理的には同一であっても、バイト単位で同一ではありません。

既知の制限:

-> リコールのチューニングは継続中です。ベンチマークでの85%は、普遍的な保証ではありません。

-> 合成品質は、エージェントの観測品質により上限が決まります。ゴミの事実を入れれば、ゴミのブリーフが出ます。lintパスが助けになります。これは判断エンジンではありません。

-> 今日のスコープは一オフィスのみ。オフィス間のフェデレーションはありません。

デモ。5分のターミナルウォークスルーで、5つの事実を記録し、シンセサイズを起動し、ユーザーのLLM CLIをシェルアウトし、結果をPamのアイデンティティでコミットします: