rei-ledger — 反証台帳 (v0.2 append-only)
「その道は 過去に 潰れた」 を 一手目で 返す MCP コネクタ。
fresh Claude (会話をまたいで持続しないインスタンス) が 同じ提案を 何度も繰り返さないための、
死んだ経路の 地図。 v0.2 で append-only の ledger_record
(fabrication 防止関門 + duplicate detection 込み) を追加。
1. なぜ 別 tool か (rei-verify との 分岐)
rei-verify (反証機械) は 既に PyPI に あり、 「今の主張」 を Lean 4 / property-based / breakpoint で 攻撃する 現在時制の tool。 一方で 本 ledger は 過去時制 — 時間の向きが違うため 別 tool にした。
| 時間の向き | 出力 | |
|---|---|---|
| rei-verify (反証機械) | 現在 — 今の主張を攻撃 | 反例 or HOLDING |
| rei-ledger (反証台帳) | 過去 — 潰れた道を返す | 死んだ経路の地図 + 再開条件 |
技術的分岐点 2 つ (作り直しではなく 後ろに置く 拡張):
- 不可能性証明は 反例ではない。
search_counterexampleの schema (iterable space × predicate) では 「V = log_2(n) + α(t_1) 型の関数が 存在しない」 を 格納できない。 格納形式が違う。 - HOLDING を 一級記録項目化。 rei-verify の HOLDING を そのまま積むと 「探索深度 / 打ち切り条件 / 再挑戦の閾値」 の 区別が消える。 台帳側で 必須 field にする。
2. 提供 tool (v0.2 = 2 tool)
| tool | 入力 | 出力 |
|---|---|---|
ledger_lookup |
query (str) / limit (1-20) | 過去 entry の 一覧 (score 降順、 threshold 0.20) |
ledger_record v0.2 NEW |
claim / death_type / reach / reopen_when / source_ref (必須) + verdict / markers / recorded_at / recorded_by / force | {status: 'recorded'|'duplicate_rejected'|'validation_error', entry_id?, …} |
ledger_lookup: CJK 2-gram (漢字/仮名 run 内で 生成) + ASCII word (>=3 alnum) の
混合 tokenizer による query 側 coverage |q ∩ e| / |q|。 外部依存ゼロ。
hit ゼロは 「まだ 潰されていない」 or 「台帳が 未記録」 の どちらか — rei-verify の HOLDING と 同じ discipline (「絶対に嘘をつかない」)。
ledger_record の 4 関門 (fabrication 防止 + append-only)
- 必須 field 空チェック — claim / death_type / reach.method / reopen_when / source_ref が空なら reject
- verdict allowlist — REFUTED / HOLDING / INCOMPLETE_FRAME のみ。 CONFIRMED は reject (台帳は「潰れた道」の帳簿、 生きている主張は SEED_KERNEL 側)
- source_ref 非空 — session_date / commit / memory_ref / site_page / paper_doi / url のうち 少なくとも 1 field に 非空値必須。 これが 「fabrication を難しくする」 主関門 (完全な防止ではない、 honest scope 参照)
- duplicate detection — 既存 entry と score>=0.90 で 一致すると
duplicate_rejected。force=trueで override
AI recorder は recorded_by='<session or model id>' を 付けると
後で 監査しやすい (人間 vs AI 由来 entry を 区別)。 過去 entry は immutable —
削除・訂正 tool は 意図的に 未提供 (誤 entry は 手動で jsonl 修正)。
3. 実測 verify (fresh-Claude lookup 7/7 + record 9/9 + MCP 2/2 = 18/18)
lookup 7/7 PASS — fresh Claude が 今日の λ-calculus 判断 / 6 月の Lyapunov 不可能性を、 memory なしで 一手目に 検出できるか の 直接実測 (subprocess CLI、 memory bypass)。
| query | 期待 | score |
|---|---|---|
ラムダ計算 connector | L001 | 1.000 |
λ計算 コネクタ 作りたい (表記揺れ) | L001 | 0.571 |
lambda calculus MCP (英字 fallback) | L001 | 0.333 |
Collatz Lyapunov 関数 | L002 | 1.000 |
V = log_2(n) + α(t_1) descent | L002 | 1.000 |
piecewise Lyapunov Collatz | L002 | 1.000 |
量子重力 unification (無関係) | no-hit | rejected |
record 9/9 PASS — tempfile 隔離で 破壊的 test を 安全に (production entries.jsonl 影響なし)。
| test | 期待 |
|---|---|
| 空 field で record | validation_error (5+ errors) |
| verdict=CONFIRMED | validation_error (CONFIRMED reject) |
| source_ref 空 dict | validation_error (fabrication 防止) |
| L001 と同じ claim | duplicate_rejected (L001 参照返却) |
| L001 と同 claim + force=true | recorded (L003) |
| 新規 claim | recorded (L004) |
| L004 を lookup | 引ける (round-trip) |
| file 行数 | before+2 (force + new、 過去 entry 破壊なし) |
| recorded_by 保存 | 確認 |
MCP subprocess 2/2 PASS: initialize + tools/list(2) + tools/call(ledger_lookup → L001 hit) + tools/call(ledger_record 空 args → validation_error、 副作用なし)。
4. 現状の 2 entries
claim: ラムダ計算を connector として実装する (総合一覧 catalog / MCP コネクタ層で)
death_type: criteria_analysis (connector 三条件テスト = 未知データ / 鮮度 / 検索量 いずれにも該当せず)
再開条件: meta_compose 層 (型検査 / 合成規則) が 3-4 コネクタ規模を超えて 合成失敗が実地で出た時。 圏論 precedent と 同じ基準。
出所: 本 session (2026-08-21) / commit 56db0de2c / sougou-connectors v1.0.1 (ただし 一覧側の抜けは 埋めた = id 435 catalog entry として)
claim: Collatz second-monotone quantity として piecewise V = log_2(n) + α(t_1) が descent Lyapunov 関数として機能する
death_type: impossibility_proof (concrete small-number witnesses)
witnesses: n=3, t1=2→1 requires α(2)−α(1) > 0.737 / n=25, t1=1→2 requires α(2)−α(1) < 0.396 ⇒ contradiction
再開条件: 追加 feature (t_1 以外の 局所指標) を V に加える extension、 または piecewise でない α 形式、 または 加法形以外の Lyapunov family (cross-term β を含む non-monotone family)
出所: reference_collatz_t1_1_obstruction_witness_2026-06-17.md / STEP 622-624 trailing 1-bits ≥ 4 wall (same type) / Chang v6 Paradigm Exhaustion Theorem, (log_2, t_1) feature space instantiation
5. 使ってみる
CLI 単独実行 (lookup のみ、 record は MCP or 手動 JSONL 追記から)
python3 ledger_core.py "ラムダ計算 connector" python3 ledger_core.py "Collatz Lyapunov 関数" limit=3 python3 ledger_core.py stats
ledger_record を MCP 経由で 呼ぶ (Python)
from ledger_core import record
r = record(
claim="新しく潰れた道の 主張要点",
death_type="counterexample", # or impossibility_proof / criteria_analysis / ...
reach={"method": "実験で 反例 n=42 発見",
"space": "n <= 100 まで 全数探索"},
reopen_when="n > 100 で 別 property を 満たす候補が 出た時",
source_ref={"session_date": "2026-08-21",
"commit": "abc123def",
"memory_ref": "project_xyz.md"},
recorded_by="claude-session-...",
)
print(r["status"], r.get("entry_id"))
6. entry schema (JSONL、 1 行 1 entry)
{
"id": "L001",
"recorded_at": "2026-08-21",
"claim": "…主張の要点…",
"verdict": "REFUTED | HOLDING | INCOMPLETE_FRAME",
"death_type": "counterexample | impossibility_proof | numerical_refutation | criteria_analysis",
"reach": { "method": "…", "space": "…", "witnesses": {…}, "conclusion": "…" },
"reopen_when": "…どんな追加 evidence があれば 再開できるか…",
"source_ref": { "session_date": "…", "commit": "…", "memory_ref": "…" },
"markers": { "witness_type": "…", "explanation": "…" }
}
verdict は REFUTED / HOLDING / INCOMPLETE_FRAME のみ。
CONFIRMED は 台帳に載せない (台帳は「潰れた道」 の 帳簿、 生きている主張は SEED_KERNEL 側)。
7. 使用パターン別 (誰が どう使うか)
藤本さん (ローカル、 CLI 直接)
cd tools/rei-ledger/ python3 ledger_core.py "ラムダ計算 connector" python3 ledger_core.py stats # ledger_record は Python から: python3 -c "from ledger_core import record; print(record(claim='…', ...))"
藤本さん (Claude Desktop / Cursor / Cline 経由)
tools/rei-ledger/mcp_servers.json
の __ROOT__ を実パスに置換して、 Claude Desktop の
claude_desktop_config.json の mcpServers に貼り付ける:
{
"mcpServers": {
"rei-ledger": {
"command": "python3",
"args": ["/absolute/path/to/rei-aios/tools/rei-ledger/ledger_core.py"]
}
}
}
再起動後、 Claude Desktop から ledger_lookup / ledger_record が
MCP tool として 呼べる。
chat-Claude (別窓の web Claude / claude.ai) — WebFetch pattern
chat-Claude は サブプロセスも filesystem も無いので ledger_lookup を 直接呼べない。
代わりに 公開された entries.jsonl を WebFetch で読む:
WebFetch https://rei-aios.pages.dev/tools/rei-ledger/entries.jsonl
現在 https://rei-aios.pages.dev/tools/rei-ledger/entries.jsonl で 全 entry を JSONL として 公開。 memory-mirror (STEP 1352) と 同型の 「chat-Claude が 直接参照」 パターン。 entries が 数百まで増えても JSONL 自体は 数十 KB で chat-Claude context に 収まる。
chat-Claude 会話例:
ユーザー: 「ラムダ計算を connector として実装する」 のは 過去に検討済み? chat-Claude: (WebFetch https://rei-aios.pages.dev/tools/rei-ledger/entries.jsonl) → L001 として 2026-08-21 に REFUTED 済み。 death_type=criteria_analysis。 再開条件: meta_compose 層の 合成失敗が 実地で出た時。
chat-Claude が record したい場合
chat-Claude は 直接 append できない (書き込み権限なし)。 3 選択肢:
- chat-Claude が entry JSON を 会話内で 生成 → 藤本さん が コピペで
tools/rei-ledger/entries.jsonlに 手動追記 →sync_public.py→ git push - chat-Claude が entry JSON を 会話内で 生成 → Claude Code (私) に 転送 →
Claude Code が
ledger_recordで validation 通してから append - 将来: HTTP API (CF Pages Function) 化 で chat-Claude が 直接 POST できるように (別 iter candidate、 現状 未実装)
Claude Code (私) — Bash + MCP 両方
Bash tool 経由 (subprocess) or MCP server として 起動。 このセッションで
ledger_record の live test を 実施済み。
8. Honest scope (v0.2)
- 2 tool (ledger_lookup + ledger_record append-only)、 rei-verify との 自動 pipeline は 別 iter (schema は 意識的に 互換寄り)
- record の 関門は 「fabrication を 難しくする」 だけで 不可能にはしない — source_ref に 「abc123」 のような 偽 commit を書けば通る (git log との 突合 verification は 別 iter candidate)。 現状の 主関門は 「recorder が 空値を 出す 手間」 のみ
- match は 素朴 tokenizer (CJK 2-gram + ASCII word)、 意味論的検索ではない
- score threshold: lookup=0.20 (fresh 再検出用)、 record duplicate=0.90 (重複排除用)。 entries 増えたら 再調整必要
- append-only は file 追記 open で 保証。 単一 process 前提、 並行 record の 競合対策は なし
- 過去 entry の 削除・訂正 tool は 意図的に 未提供。 誤 entry は 手動で jsonl 修正、 台帳は immutable として扱う
- 「世界初」 主張ゼロ — negative results ledger の 一般設計は 学術界に多々あり、 novelty は 「rei-verify (反証機械) の 後段として、 fresh-Claude 再検出に 特化した MCP layer」 の 位置のみ
9. 関連
- ソース:
rei-aios/tools/rei-ledger/ - 反証機械 (前段): fc0web/rei-verify PyPI 0.1.0a2
- L002 出所 memory: reference_collatz_t1_1_obstruction_witness_2026-06-17.md
- L001 出所 site: sougou-connectors v1.0.1 (id 435 ラムダ計算 catalog entry)