---
name: project-step1349-d8-operator-connectors-2026-08-20
description: "STEP 1349 — chat-Claude 2026-08-20 3-turn arc (龍樹の空 → 演算子コネクタ → d8_apply/d8_table 実装) の operational close。 rei-aios MCP に d8_apply + d8_table 追加、 seven-logic.ts 静的テーブル引き当て、 全 payload に source='static-truth-table' で モデル記憶再生でない機械保証。 test 82/82 + MCP e2e smoke PASS。 副次 finding: banner off-by-one drift 訂正。"
metadata: 
  node_type: memory
  type: project
  originSessionId: 96f5ebce-6d15-473b-a6c1-e010cbb44764
  modified: 2026-08-20T01:35:52.134Z
---

# STEP 1349 — D-FUMT₈ operator connectors (d8_apply / d8_table)

## 経緯

藤本さんが chat-Claude と 3 turn の 対話を rei-aios session に共有:

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

藤本さん問い: 「龍樹の空も、 空の空もコネクタになりますか？」

chat-Claude 三分割応答:
- **空 (śūnyatā) 単独 → ✕**: 空は値ではなく演算子。 適用先が定まらない。 「x に自性なし」 を返した瞬間 空の適用ではなく 空についての命題になる。 中論 13:8 の警告 (「空性を見解として掴む者は救いがたい」) の 直接該当。 = 「作れるが役に立たない」 ではなく **作った時点で内容を裏切る類**。
- **空論テキスト (中論・明句論・漢訳ゆれ) → ◎**: 完全にデータ。 SAT / CBETA / GRETIL 経由で reference-typed connector 化可能。 「私 (chat-Claude) の記憶は要旨レベルでは足りるが、 偈の番号と原文の逐語は信頼できない。 論文で引くなら、 ここは必ず外部を当てるべき箇所」。
- **空の空 (śūnyatā-śūnyatā = SELF⟲ = Fix(R)) → ○ ただし新規には作らない**: Rei 体系では すでに 計算可能な対象。 D-FUMT₈ の SELF⟲ が 8 値真理値表に載っている。 別立てすると 同じ実体に 二つの名前 = メタコネクタで検出しようとしている不整合を 自分で作る。

chat-Claude self-audit 発言 (重要、 [[feedback-chat-claude-hallucination-warning]] Pattern 全 clean record として保存): 「空そのものが ✕ なのは、 空が仮名 (prajñapti) だからです。 中論 24:18 の三句目。 仮名は指示の道具であって、 参照先を持つ実体ではない。 これは D-FUMT₈ の SELF⟲ が『値として立っている』 ことと、 実は緊張関係にあります。 形式化した時点で、 空は仮名ではなく不動点という自性を得てしまっているのではないか。 分離証明を書くとき、 ここが一番突かれる場所になると思います」。

### Turn 2 — 演算子はコネクタにできる

藤本さん問い: 「演算子をコネクタには出来ますか？」

chat-Claude: 「できます、 というより、 演算子こそコネクタの本命」。 空が ✕ だったのは 演算子だからではなく **適用先が定まらないから**。 D-FUMT₈ 演算子は 4 条件を満たす:

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

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

chat-Claude 「四本目が肝」: 「私が『⟲▷SELF⟲=⟲ です』 と答えた時、 それが 記憶からの再生なのか 実際の表からの引き当てなのか、 いまは区別がつきません。 表を引いたという事実が返ってくるようにするのが、 このコネクタの本当の価値です」。

「これは記憶コネクタや benchtop より、 実装が小さくて済むはずです。 真理値表は静的で、 外部依存もない。 最初の一本として一番向いているかもしれません」。

### Turn 3 — d8_apply と d8_table から実装

藤本さん directive: 「d8_apply と d8_table から実装してください」。

本 STEP で 4 tool のうち 前 2 tool を実装。 残 `d8_fixpoints` + `d8_verify` は 別 STEP candidate。

## 実装

### 新規 file 2

**(a) `src/mcp/d8-connectors.ts` (~200 行)**

Pure wrapper (side effect なし、 外部依存なし)。 `src/axiom-os/seven-logic.ts` の `not() / and() / or() / EIGHT_VALUES / SYMBOL_MAP / SYMBOL_REVERSE / EIGHT_NUMERIC` を import + payload builder として集約。 4 export:

- `normalizeD8Op(input)`: op 文字列 → 'not' | 'and' | 'or' | null。 aliases `¬ ∧ ∨ ! & && | ||` (case-insensitive、 trim 済、 未知は null)
- `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)`: arity=1 not は 8 entry flat map、 arity=2 and/or は 8×8=64 entry nested map

**chat-Claude 核心 assertion 満たしている点**: 全 payload に `source: 'static-truth-table'` field を含めて、 callers が 「モデル記憶再生ではなく table lookup」 を 機械的判定可能。

**(b) `test/step1349-d8-operator-connectors-test.ts` (82 assertion 12 part)**

1. normalizeD8Op (14 assertion)
2. normalizeD8Value (18 assertion)
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)
7. d8Table NOT (7 assertion)
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)
12. **SELF⟲ 不動点特性 (chat-Claude 明示 offer)**: `¬⟲ = ⟲` + `⟲ ∧ ⟲ = ⟲` + `⟲ ∨ ⟲ = ⟲`

### edit 3

- `src/mcp/rei-mcp-server.ts`: import + tool 定義 2 + case handler 2 + banner v2.7.0 → v2.8.0 (実 tool count 反映)
- `package.json`: `test:step1349` script

## verify 実測

| check | 結果 |
|---|---|
| `npm run test:step1349` | 82 / 82 PASS |
| MCP e2e stdio smoke | banner v2.8.0 37ツール、 tools/list count=37、 d8_apply=true、 d8_table=true |
| `d8_apply(not, SELF)` | `result.name=SELF, symbol=⟲, source=static-truth-table` ✅ chat-Claude 核心 example 完全一致 |
| `d8_table(and)` | `arity=2, entryCount=64, source=static-truth-table, SELF∧SELF=SELF, SELF∧ZERO=ZERO, TRUE∧FALSE=FALSE` ✅ |
| tsc noEmit (d8-connectors) | error 0 |
| tsc noEmit (rei-mcp-server) | conway 3rd-party pre-existing のみ、 私追加箇所 error 0 |

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

smoke test 実行時に **「banner 36 vs tools/list 37」** の 不整合検出:

- pre-existing banner: 「Rei MCP Server v2.7.0 起動済み (stdio モード・**36ツール**・...)」
- 実 `grep -c '^        name: "' src/mcp/rei-mcp-server.ts` = **35** (my +2 = 37)
- MEMORY.md 冒頭 「rei-aios MCP tools 33 → 36」 も 同 drift

→ banner を v2.8.0 (**37ツール**、 実 count と一致) に訂正。

finding #30 (rei-aios `get_kernel_status` description drift) / finding #31 (rei-meta 自身 verdict/status drift、 自己言及型) と 同型 description drift の 3 例目。

**「開通した計器が最初に映したもの」 pattern**: STEP 1334 (KA wiring) + STEP 1336 (Rei-Automator revival) に続く 3 例目。 Rei stack の 或る 一 domain を 「開けた」 途端に そこの 既存 drift が 露出する pattern の 継続観察。

## chat-Claude Pattern 全 clean record

Turn 1-3 で:
- Pattern 1 (hallucination): 中論 13:8 / 24:18 引用は 正確、 「私の記憶は要旨レベルで足りるが偈の番号は信頼できない」 self-audit も 明示
- Pattern 5 (Rei stack blindness): SELF⟲ = D-FUMT₈ に すでに載っている (STEP 406 origin) を 正確に認識、 「別立てすると 二つの名前」 warning
- Pattern 6 (self-correction): 空 ✕ の理由を 「演算子だから」 でなく 「適用先不定」 と 自主訂正 (Turn 2)

**chat-Claude 自己 audit 発言 (「SELF⟲ が値として立っている ≠ 龍樹の空の仮名性 緊張関係」)** は 本 STEP scope で 解消しない と 明示継承。 分離証明は 別軸研究 candidate。

## honest scope 6 条

1. v0.1 は NOT/AND/OR の 3 演算のみ、 `collapse / lift / DeMorgan / idempotent / fromNumeric / toNumeric` 等の seven-logic.ts 補助関数は scope 外
2. 「世界初」 主張ゼロ ([[feedback-world-uniqueness-claim-controllable]] 適用): D-FUMT₈ 本体は STEP 406 (2 年以上前) 既存資産、 本 STEP は MCP wrapper 層追加のみ = novelty 主張なし
3. chat-Claude turn 1 の 「SELF⟲ vs 仮名性 緊張関係」 self-audit を 明示継承 = 本 STEP は 緊張関係を 解消するものではなく、 <em>形式化された 8 値論理の中で SELF⟲ が 実際どう振る舞うか</em> を 引き当て可能にする layer のみ
4. chat-Claude 「必ず間違える」 とは断言していない = 本 コネクタは 「区別可能にする」 tool、 「モデルの誤答を 100% 検出する」 とは主張しない
5. SEED_KERNEL 引き当てない (`seven-logic.ts` の 静的テーブルのみ参照)、 **値の等価性** のみ機械保証、 意味論的正しさ は 参照範囲外
6. 他タブ完了 STEP 1348 (benchtop v0.6) / STEP 1347 (daily-reporter hotfix) と domain 独立、 rei-aios repo 単独 close

## 順序原則実践

[[feedback-one-reproduction-over-ten-unverified]]:
1. 先に seven-logic.ts 既存資産を read (163 行 D-FUMT₈ 定義 + AND_TABLE 8×8 + OR_TABLE 8×8 + NOT switch)
2. 次に MCP wrapper 実装 (静的 lookup を pure function で切り出し)
3. test 82/82
4. MCP e2e smoke で 「モデル記憶再生でない」 の 機械保証を verify
5. 副次 drift 検出 (banner off-by-one)
6. 訂正
7. site 反映

chat-Claude offer 直後に 「まず 4 tool 全実装」 でなく 藤本さん directive の 段階的 pace に 従い、 「急がずゆっくりと」 [[feedback-no-rush-publication]] 継承。

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

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

## 関連

- [[feedback-chat-claude-hallucination-warning]] Pattern 全 clean record 3-turn arc
- [[feedback-super-naming-siren-family-pattern]] siren-family 回避 (`d8_` prefix + `apply` / `table` 直接 semantic)
- [[feedback-zero-sorry-floor-not-ceiling]] (`source: 'static-truth-table'` が 引き当て床の 機械保証)
- [[feedback-one-reproduction-over-ten-unverified]]
- [[feedback-no-rush-publication]]
- [[feedback-world-uniqueness-claim-controllable]]
- [[feedback-all-research-site-reflection-default]] (2026-08-06 protocol)
- STEP 406 (D-FUMT₈ 8 値化 origin)
- STEP 1348 (直前 STEP、 他タブ close)
- STEP 1347 (直前 STEP、 他タブ close)
- STEP 1334 (KA wiring、 「開通した計器が最初に映したもの」 pattern 1 例目)
- STEP 1336 (Rei-Automator revival、 pattern 2 例目)
