v0.2 append-only 18/18 test PASS 2 tool + 2 entries

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 つ (作り直しではなく 後ろに置く 拡張):

  1. 不可能性証明は 反例ではないsearch_counterexample の schema (iterable space × predicate) では 「V = log_2(n) + α(t_1) 型の関数が 存在しない」 を 格納できない。 格納形式が違う。
  2. 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)

  1. 必須 field 空チェック — claim / death_type / reach.method / reopen_when / source_ref が空なら reject
  2. verdict allowlist — REFUTED / HOLDING / INCOMPLETE_FRAME のみ。 CONFIRMED は reject (台帳は「潰れた道」の帳簿、 生きている主張は SEED_KERNEL 側)
  3. source_ref 非空 — session_date / commit / memory_ref / site_page / paper_doi / url のうち 少なくとも 1 field に 非空値必須。 これが 「fabrication を難しくする」 主関門 (完全な防止ではない、 honest scope 参照)
  4. duplicate detection — 既存 entry と score>=0.90 で 一致すると duplicate_rejectedforce=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
ラムダ計算 connectorL0011.000
λ計算 コネクタ 作りたい (表記揺れ)L0010.571
lambda calculus MCP (英字 fallback)L0010.333
Collatz Lyapunov 関数L0021.000
V = log_2(n) + α(t_1) descentL0021.000
piecewise Lyapunov CollatzL0021.000
量子重力 unification (無関係)no-hitrejected

record 9/9 PASS — tempfile 隔離で 破壊的 test を 安全に (production entries.jsonl 影響なし)。

test期待
空 field で recordvalidation_error (5+ errors)
verdict=CONFIRMEDvalidation_error (CONFIRMED reject)
source_ref 空 dictvalidation_error (fabrication 防止)
L001 と同じ claimduplicate_rejected (L001 参照返却)
L001 と同 claim + force=truerecorded (L003)
新規 claimrecorded (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

REFUTED L001 · 2026-08-21

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 として)

REFUTED (impossibility_proof) L002 · 2026-06-17

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.jsonmcpServers に貼り付ける:

{
  "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 選択肢:

  1. chat-Claude が entry JSON を 会話内で 生成 → 藤本さん が コピペで tools/rei-ledger/entries.jsonl に 手動追記 → sync_public.py → git push
  2. chat-Claude が entry JSON を 会話内で 生成 → Claude Code (私) に 転送 → Claude Code が ledger_record で validation 通してから append
  3. 将来: 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)

9. 関連