---
name: project-step1538-mystery-reasoning-connector-2026-08-29
description: STEP 1538 mystery-reasoning-connector v0.1 (推理探偵コネクタ、 puzzle-verifier STEP 1536 姉妹、 回路の向きが逆、 3 条件検証 uniqueness+necessity+narrative、 5 chip pure function、 backward machine + Jaccard anti-repetition、 test 43/43 PASS)
metadata: 
  node_type: memory
  type: project
  originSessionId: c922ed16-8768-46a2-904a-a44edbee09b5
  modified: 2026-08-28T22:26:33.032Z
---

# STEP 1538: mystery-reasoning-connector v0.1 (推理探偵コネクタ)

**Date**: 2026-08-29
**Trigger**: 藤本さん directive 「推理、探偵のコネクタ用ツール、端子、チップ、回路、マシンはどうでしょうか？ これは作る価値があると思います。 ゲーミフィケーションと違って、 推理は形式化できるからです。」
**Sibling**: [[project-step1536-puzzle-verifier]] (同日 puzzle-verifier、 回路の向きが逆)
**Files**: `src/mcp/mystery-reasoning-connector.ts` (400+ line) / `test/step1538-mystery-reasoning-connector-test.ts` (43 assertion) / `public/tools/step-1538-mystery-reasoning-connector/` + dist-renderer mirror (md5 da5555eb...)

## 藤本さん指定 architecture

| 抽象 | 実装 | 5 種類 |
|---|---|---|
| 端子 (terminal) | `Fact { type: FactType }` | time / person / place / testimony / record |
| チップ (chip) | `ReasoningChip = (facts, candidates) → ChipResult` | contradiction / timeline / alibi / elimination / common_feature |
| 回路 (circuit) | `runCircuit(spec)` | 初期 fact から犯人確定への chip 順次適用 |
| マシン (machine) | `generateMystery(suspects, truth, chips)` | 真相→逆算で fact 配置、 iterative trim |

## 検証器 2 条件 (藤本さん指定)

- **(a) uniqueness**: 与えた手掛かりだけで犯人が一意に確定するか (`UNIQUE_CORRECT` / `UNIQUE_WRONG` / `MULTIPLE` / `NONE`)
  - fair-play (後出しなし) も同時に拾う: MULTIPLE = 「initial にない fact なしでは絞れない」
- **(b) necessity**: 冗長な手掛かりが無いか (`ALL_NECESSARY` / `REDUNDANT_FACTS`)
  - 実装: 各 fact を 1 つずつ除去 → uniqueness が壊れるか確認、 崩れなければ冗長

両方満たしたものだけ `wellPosed=true`。

## 藤本さん warning への直接応答

1. **「chip は 味気ない」 → narrative layer**: 各 chip が `narrativeFragments: string[]` を返す。 `renderNarrative(report)` で 事件初期提示 → 推理展開 → 結論の 3 節 Markdown 出力。 「火災の 14 分前に通報した人物がいた」 型の物語断片を生成 (LLM なしで簡易 template)。

2. **「同じ回路が続いたと気づかせない」 → Jaccard anti-repetition**: `generateMystery` の `recentChipSets` option で 直前 N 事件と Jaccard 類似度を計算、 threshold (default 0.75) 超えは 別 chip set 推奨。

3. **「Coman 条件 (後から説明されれば必ず納得できる)」 → chip が providedFacts のみ見る**: pure function 制約で、 initial にない fact に依存する推論経路は 存在し得ない構造。

4. **「二本立てにすると 後で必ず同期の手間」 → puzzle-verifier と共通語彙**: v0.1 は自己完結だが、 `Fact` 型は puzzle-verifier の input field と semantic 対応。 v0.2 で tool-schema-registry に chip 登録して統合予定。

## Bug 発見 → 修正 (実装中の 1 事例)

初回 test で **14/43 fail** (alibi chip semantic 逆転)。 alibi 概念は「アリバイ場所と record が一致 → 犯行現場に居られない → 消去」 だが、 初期実装は 「不一致で消去」 になっていた。 semantic 反転 + generator の trim を batch 単発 から iterative loop 化 (複数 redundant fact を同時消去すると over-trim する) の 2 修正で 43/43 PASS。

## Test 内訳 43/43

| Section | 内容 | Assertions |
|---|---|---|
| 1 | Basic 3-suspect well-posed | 4 |
| 2 | MULTIPLE — 手掛かり不足 fair-play violation | 3 |
| 3 | REDUNDANT_FACTS — 冗長 fact 検出 | 4 |
| 4 | NONE — 全消去 | 2 |
| 5 | UNIQUE_WRONG — 生成器バグ検出 | 2 |
| 6 | narrative fragments + renderNarrative | 5 |
| 7 | Backward machine well-posed by construction | 4 |
| 8 | Anti-repetition Jaccard | 3 |
| 9 | contradiction narrative-only (v0.1 政策) | 4 |
| 10 | common_feature AND-summary | 2 |
| 11 | runCircuit direct API | 2 |
| 12 | Single-suspect edge case | 2 |
| 13 | Invalid expectedCulprit | 1 |
| 14 | fair-play (missing key fact) | 2 |
| 15 | Narrative fallback | 1 |
| 16 | Chip ordering independence | 2 |

## Regression 確認

- **STEP 1536 puzzle-verifier**: 122/122 PASS clean (姉妹 test 影響なし)

## puzzle-verifier (STEP 1536) との比較

| 次元 | puzzle | mystery |
|---|---|---|
| 回路の向き | 解 → hide → solver enumerate | 事実 → chip → 結論 (forward) |
| 生成器 | tool + partial input + hidden fields | 真相 → 逆算 fact 配置 |
| verifier | UNIQUE (hidden 完成一意) | UNIQUE_CORRECT + ALL_NECESSARY |
| narrative | — | 回路 → 物語断片 |
| anti-repetition | — | Jaccard against recentChipSets |

## Honest scope

- v0.1 = 5 chip pure function、 SAT/SMT/CSP なし、 完全 formal abduction ではない
- contradiction / timeline chip は v0.1 で narrative のみ (elimination なし)、 v0.2 で 「証言矛盾 → 一方が嘘」 の decision layer + 距離 matrix 物理制約を予定
- narrative layer は簡易 template、 LLM 生成なし
- backward machine は brute-force greedy、 大規模 case (>10 suspects) 未対応
- 「世界初」 主張ゼロ、 constraint satisfaction + abductive reasoning の pedagogical 実装、 novelty は Rei stack 内 puzzle-verifier 姉妹 layer 位置と 3 条件 (uniqueness+necessity+narrative) の統合のみ
- tool-schema-registry (STEP 1536) 統合は v0.2 defer

## site 反映

- URL: https://rei-aios.pages.dev/tools/step-1538-mystery-reasoning-connector/
- md5: `da5555eb9a2557cbf507a25a6a7b52e8` (public + dist-renderer mirror 一致)
- Force-track: `git add -f dist-renderer/tools/step-1538-mystery-reasoning-connector/`

## Repetition avoidance mechanism (詳細)

`jaccardMaxAgainstRecent(chips, history)`:
- 現 chip set と history 内 各 chip set の Jaccard 類似度を計算
- `|A ∩ B| / |A ∪ B|`
- max 値を返す = 「最も似た過去 chip set との類似度」
- 0.75 超えは 「同じ回路パターン」 と判定、 生成側で別 chip set 選択を促す
- 藤本さん指摘 「入れないと 『またこのパターンか』 が数問で来る」 に直接応答

## 次 STEP candidate (v0.2)

- contradiction chip の elimination 昇格 (証言 vs 記録 で どちらを信じるかの decision layer)
- timeline chip の物理制約 (距離 matrix + 移動時間下限 で 「短時間で 100km 移動不可能」 を elimination)
- tool-schema-registry (STEP 1536) に 5 chip 登録して puzzle-verifier と語彙共通化
- LLM narrative layer (v0.1 template 版から prose quality up、 事件の余韻表現)
- 大規模 case (>10 suspects) の SAT/ILP 統合 backward machine
- Chip 履歴 persistence (localStorage or backend) で 「直近 N 事件」 の真の repetition tracking
