STEP 1349MCP CONNECTOR v0.1 chat-Claude 2026-08-20 3-turn arc: 龍樹の空 → 演算子コネクタ → 実装

D-FUMT₈ operator connectors — d8_apply / d8_table (rei-aios MCP)

2026-08-20 chat-Claude turn 「私が『⟲▷SELF⟲=⟲ です』と答えた時、 それが 記憶からの再生なのか 実際の表からの引き当てなのか いまは区別がつきません。 表を引いたという 事実が返ってくるようにするのが、 このコネクタの本当の価値です」 offer への operational 応答。 rei-aios MCP に d8_apply + d8_table を追加、 src/axiom-os/seven-logic.ts の 静的 NOT / AND / OR 真理値表を 直接引き当てる layer。 全 payload に source: 'static-truth-table' を含め、 callers が 「モデル記憶再生ではなく table lookup」 と 機械的に判定可能。 藤本伸樹 × Claude Code / rei-aios STEP 1349

1. 経緯 (chat-Claude 3-turn arc)

Turn 1 — 龍樹の空 / 空の空 は コネクタになるか

藤本さん問い: 「龍樹の空も、 空の空もコネクタになりますか?」 → chat-Claude 三分割応答:

  • 空 (śūnyatā) 単独 → ✕: 空は値ではなく演算子。 適用先が定まらない (「x に自性なし」 を返した瞬間 空の適用ではなく 空についての命題になる)。 中論 13:8 の警告 (「空性を見解として掴む者は救いがたい」) の 直接該当。
  • 空論テキスト (中論・明句論・漢訳ゆれ) → ◎: これは完全にデータ。 SAT / CBETA / GRETIL 経由で reference-typed connector 化可能。
  • 空の空 (śūnyatā-śūnyatā = SELF⟲ = Fix(R)) → ○ ただし新規には作らない: Rei 体系では すでに 計算可能な対象 (D-FUMT₈ の SELF⟲ が 8 値真理値表に載っている)。 別立てすると 同じ実体に 二つの名前 = メタコネクタで検出しようとしている不整合を 自分で作る。

Turn 2 — 演算子はコネクタにできる (D-FUMT₈ は本命)

藤本さん問い: 「演算子をコネクタには出来ますか?」 → chat-Claude: 「できます。 というより、 演算子こそコネクタの本命」。 D-FUMT₈ 演算子は 4 条件を全て満たす:

  1. 適用先が確定している (8 値の 有限集合)
  2. 結果が一意 (192 bit 真理値表で 閉じている)
  3. 私 (LLM) の推論では間違う (非可換・非可逆で、 暗算すると必ず取り違える)
  4. 検証可能 (Lean 4 側と 突き合わせられる)

chat-Claude 提案 4 tool:

d8_apply(op, a, b)      → 単一演算 (単発 lookup)
d8_table(op)            → 真理値表全体 (全 dump)
d8_fixpoints(op)        → Fix(R) の 列挙
d8_verify(claim)        → Lean 4 突き合わせ

「四本目が肝」 (回答が 記憶からの再生か 表からの引き当てか の区別)、 「これは記憶コネクタや benchtop より、 実装が小さくて済むはず。 真理値表は静的で、 外部依存もない。 最初の一本として一番向いているかもしれません」。

Turn 3 — d8_apply と d8_table から実装 (本 STEP)

藤本さん指示: 「d8_apply と d8_table から実装してください」 → 本 STEP 1349 で 4 tool のうち 前 2 tool を実装。 残 2 tool (d8_fixpoints + d8_verify) は 別 STEP candidate として defer。

2. 実装内容

新規 file: src/mcp/d8-connectors.ts

MCP wrapper layer (pure functions、 side effect なし、 外部依存なし)。 src/axiom-os/seven-logic.tsnot() / and() / or() / EIGHT_VALUES / SYMBOL_MAP / SYMBOL_REVERSE / EIGHT_NUMERIC を import し、 payload builder として 集約。

export役割
normalizeD8Op(input)op 文字列 → 'not' | 'and' | 'or' | null。 aliases: ¬ ∧ ∨ ! & && | || (case-insensitive、 trim 済)
normalizeD8Value(input)value 文字列 → EightLogicValue | null。 name (TRUE/FALSE/BOTH/NEITHER/INFINITY/ZERO/FLOWING/SELF) + symbol (⊤ ⊥ B N ∞ 〇 ○ 〜 ~ ⟲) 両受入
d8Apply(op, a, b)単発適用。 {op, arity, inputs, result, source: 'static-truth-table', honestScope} または {error, detail} を返す
d8Table(op)真理値表全体 dump。 arity=1 (not) は 8 entry、 arity=2 (and/or) は 8×8=64 entry の nested map

edit: src/mcp/rei-mcp-server.ts

  • import: d8Apply, d8Table from ./d8-connectors
  • ListTools: d8_apply + d8_table の 2 tool 定義追加 (返却 field 全列挙 discipline 継承、 finding #30/#31 preventive design 継承)
  • CallTool: case "d8_apply" + case "d8_table" handler 追加 (thin wrapper、 error 時は isError: true)
  • startup banner: v2.7.0 (36ツール、 実 count 35 との drift) → v2.8.0 (37ツール、 実 count と一致)。 副次 finding として banner off-by-one drift 訂正

新規 test: test/step1349-d8-operator-connectors-test.ts

82 assertion、 12 part 構成:

  1. normalizeD8Op (14 assertion: alias 認識 + 未知拒否)
  2. normalizeD8Value (18 assertion: name/symbol 両受入 + 未知拒否)
  3. d8Apply NOT (5 assertion、 chat-Claude 核心 example ⟲ の不動点確認)
  4. d8Apply AND (6 assertion: 冪等 + ZERO 吸収 + FALSE 零元 + SELF 伝播)
  5. d8Apply OR (6 assertion: 冪等 + ZERO 吸収 + TRUE 零元 + SELF 伝播)
  6. d8Apply error paths (5 assertion: unknown-op / unknown-a / unknown-b / missing-b)
  7. d8Table NOT (7 assertion: arity + entryCount + source + 個別 entry)
  8. d8Table AND (5 assertion + 64 entry exhaustive coverage 確認)
  9. d8Table OR (4 assertion + 64 entry exhaustive coverage 確認)
  10. d8Table error (2 assertion)
  11. d8Apply / d8Table 整合性 invariant (144 pair chain check: 全 (op, a, b) で apply 結果 = table 引き当て)
  12. SELF⟲ 不動点特性 (chat-Claude 明示 offer): ¬⟲ = ⟲ + ⟲ ∧ ⟲ = ⟲ + ⟲ ∨ ⟲ = ⟲ を 3 test で 明示 assert

3. verify 結果

check手段結果
unit test npm run test:step1349 82 / 82 PASS
MCP server end-to-end stdio subprocess smoke (initialize + tools/list + tools/call × 2) v2.8.0 起動、 tools/list count=37、 d8_apply=true、 d8_table=true
d8_apply(not, SELF) 実測 MCP tools/call result.name=SELF, symbol=⟲, source=static-truth-table
d8_table(and) 実測 MCP tools/call arity=2, entryCount=64, source=static-truth-table, SELF∧SELF=SELF, SELF∧ZERO=ZERO, TRUE∧FALSE=FALSE
tsc noEmit (d8-connectors.ts) strict mode error 0
tsc noEmit (rei-mcp-server.ts) strict mode conway 3rd-party pre-existing のみ、 私の追加箇所 error 0
chat-Claude 核心 assertion 満たしている点: 全 payload に source: 'static-truth-table' を含む → callers は 「モデル記憶再生ではなく table lookup」 と 機械的判定可能。 「⟲▷SELF⟲=⟲ です」 と 答えた根拠が トークン生成でなく静的テーブル引き当てである事実が、 呼び手側で 検証できる。

4. 副次 finding — banner off-by-one drift 訂正

smoke test 実行時に 「banner 36 vs tools/list 37」 の 不整合を検出。 pre-existing の banner が 実 tool 数 35 (my +2 = 37) と drift していた (2026-08-20 メモリ index も 「rei-aios MCP tools 33 → 36」 と同じ drift 記載) → banner を v2.8.0 (37ツール) に訂正。 finding #30 (rei-aios) / #31 (rei-meta) と同型の description drift。

「開通した計器が最初に映したもの」 pattern が 本 STEP でも Rei stack を 「開けた」 途端に 現れた (STEP 1334 KA wiring / STEP 1336 Rei-Automator revival に続く 3 例目)。

5. Prior art / 出典

本 STEP は 新規発明ではないsrc/axiom-os/seven-logic.ts (STEP 406 で 8 値化完了) の 静的テーブルを MCP 経由で 引き当てるための wrapper 層のみ。

  • D-FUMT₈ 定義本体: seven-logic.ts 行 82-120 の EIGHT_VALUES / EIGHT_NUMERIC / SYMBOL_MAP
  • NOT 演算: 同 file 行 158-169 (switch 文、 SELF 不動点性は 行 148-156 コメント根拠)
  • AND 演算: 同 file 行 191-205 の AND_TABLE (8×8=64 entry)
  • OR 演算: 同 file 行 224-238 の OR_TABLE (8×8=64 entry)
  • 四価論理 (Catuṣkoṭi): Belnap 1977 + 龍樹・中論 (śūnyatā の四句論)
  • SELF⟲ 演算根拠: ゲーデル自己言及 + Fix(R) 不動点意味論。 seven-logic.ts 行 148-189 のコメント参照

6. Honest scope

(1) v0.1 の scope: NOT / AND / OR の 3 演算のみ。 collapse / lift / checkDeMorgan / checkIdempotent / fromNumeric / toNumeric 等の seven-logic.ts 補助関数は scope 外。 d8_fixpoints (Fix(R) 列挙) + d8_verify (Lean 4 突き合わせ) は 別 STEP candidate として defer。
(2) 「世界初」 主張ゼロ (feedback_world_uniqueness_claim_controllable.md 継承): D-FUMT₈ 本体は 既存資産 (STEP 406、 2 年以上前 実装)、 本 STEP は MCP コネクタ層追加のみ。 novelty 主張なし。
(3) chat-Claude turn 1 の 「緊張関係」 明示: chat-Claude 自身が offer 内で 「SELF⟲ が『値として立っている』ことと、 実は緊張関係にあります。 形式化した時点で、 空は仮名ではなく不動点という自性を得てしまっているのではないか。 分離証明を書くとき、 ここが一番突かれる場所になると思います」 と指摘。 本 STEP は この緊張関係を 解消するものではなく、 形式化された 8 値論理の中で SELF⟲ が 実際どう振る舞うか を 引き当て可能にする layer のみ。 分離証明 (龍樹の空の仮名性 vs D-FUMT₈ の SELF 不動点) は 未着手 (別軸研究 candidate)。
(4) 「LLM は 真理値表を 暗記できない」 主張は controllable: chat-Claude は 「私が『⟲▷SELF⟲=⟲ です』 と答えた時、 それが 記憶からの再生なのか 実際の表からの引き当てなのか 区別がつかない」 と 自己認識、 但し 「必ず間違える」 とは断言していない。 本 コネクタは 「区別可能にする」 tool であって 「モデルの誤答を 100% 検出する」 とは主張しない。
(5) SEED_KERNEL は 引き当てない: 本 コネクタは seven-logic.ts の 静的テーブルのみ参照、 SEED_KERNEL 1,677 理論 / 発明 pipeline / 藤本さん承認 layer には 一切触れない。 「⟲▷SELF⟲=⟲ の 意味論的正しさ」 は 参照範囲外、 値の等価性 のみ機械保証。
(6) 前タブ完了 STEP 1348 / 前 STEP 1347 と独立: 本 STEP は benchtop-mcp / archive/ 予防修正とは domain 独立、 他タブ arc に依存しない。 rei-aios repo 内単独 close。

7. 関連 memory + 次 candidate

継承 memory

  • feedback_zero_sorry_floor_not_ceiling.md — 「床」 discipline (source='static-truth-table' が 引き当て床の 機械保証)
  • feedback_one_reproduction_over_ten_unverified.md — 順序原則 (先に seven-logic.ts 既存資産を read → 次に wrapper 実装)
  • feedback_all_research_site_reflection_default.md — 2026-08-06 全研究 site 反映 protocol (本 site page 化)
  • feedback_no_rush_publication.md — 急がずゆっくりと (chat-Claude offer 直後 実装 → verify → 単日 close)
  • feedback_chat_claude_hallucination_warning.md — Pattern 全 clean streak (Turn 1-3 全 verify pass、 chat-Claude self-audit 発言も明示保存)

次 candidate (別 STEP、 藤本さん stance 待ち)

  • d8_fixpoints(op): Fix(R) = { v ∈ EIGHT_VALUES | op(v) = v (unary) or op(v, v) = v (binary) } の 列挙。 SELF⟲ 非冗長性の分離証明を書く時に 他 演算子の 不動点分布を 網羅的に出せると 手で数える工程が消える (chat-Claude turn 2)
  • d8_verify(claim): Lean 4 突き合わせ (chat-Claude 曰く 「四本目が肝」)。 CollatzRei 内の D-FUMT₈ 定理 (行 148-189 の SELF 不動点 3 性質) を 静的テーブル と 突き合わせて 定理 vs 実装 一致確認
  • d8-connectors.ts の 5 演算 (collapse / lift / DeMorgan / idempotent / self-fixpoint) 追加 (v0.2 scope)