# STEP 1840 — rei-meta-mcp coherence を comparison-basis contract に適合

**Timestamp**: 2026-09-06T17:19 (JST)
**Tab worktree**: main (rei-aios-97 [de6edb])
**Commit**: <commit 後に追記>

## 一行 summary

STEP 1838 で 定義した contract の 唯一の NONCONFORM 計器 (rei-meta-mcp
`meta_check_coherence`) を、 payload に `comparisonBasis` を 直接添付する
形で 適合させた。 rei-aios 側 adapter + fixture + assertion を 同時追随。

## 主要 finding / evidence

- rei-meta-mcp `src/rei_meta_mcp/coherence.py` を STEP 1840 適合に修正:
  - `comparisonBasis` 10 field を常時添付 (`_build_comparison_basis`)
  - `coherent` → `coherent_on_basis` に降格 (comparedFields 非空 かつ
    uncheckedSources 空 のときのみ)
  - コミットしない agreement (基底空 or unchecked あり) は `insufficient_basis` に分岐
  - divergence の `latest_id_diff` / `latest_timestamp_diff` を meet 外なので
    `unavailable_fields` に別 key で分離 (G3 適合)
  - `undetectable[]` に 「record_count 保存乖離」「content edit blindness」
    「id-set replacement blindness」「cross-flavour silence」の 4 blind spot 宣言
- rei-meta-mcp pytest **62/62 PASS** (`test_coherence.py` の identical fixture
  test + `test_contract.py` の end_to_end_finding30 の 2 箇所を
  `coherent` → `coherent_on_basis` に flip、意図的コメント付き)
- rei-aios `src/aios/comparison-basis-contract/adapters.ts`
  `basisFromReiMetaCoherence` を 直読み優先 + legacy fallback に refactor:
  - 新 payload (`comparisonBasis` あり): そのまま転記 → 4 gate 全 CONFORM
  - 旧 payload: 逆算 (post STEP 1838 initial state と同じ) → G2 NONCONFORM で
    契約未適合を正しく診断
- rei-aios `enumerate.ts` `positiveVerdicts` に `coherent_on_basis` 追加
  (`coherent` も残して §15 counterfactual + legacy caller 両立)
- rei-aios `test/step1838` `COHERENCE_FIXTURE` を新 shape に差し替え、
  §14 assertion を G2/G3 NONCONFORM → **4 gate 全 CONFORM に意図的反転**
  + §15 counterfactual を coherent_on_basis + legacy coherent 二重テストに拡張
- rei-aios test 79/79 → **81/81 PASS** (assertion +2: undetectable non-empty +
  legacy backward compat)、regression 166/166 PASS、tsc strict 0 errors、
  comparator:basis-audit 3/3 CONFORM + rei_meta N/A (runner 不変)

## Honest scope

- **MCP 再起動 → 実応答 verify は 別 session 繰り越し**。 私 (rei-aios-97) は
  再起動対象に含まれるため 本セッション内 では 実 payload 検証不可。
  fixture は 「新 shape が こう返る はず」 の期待値ベース。 
  実 payload との一致は 別 session で `meta_check_coherence("seed_kernel")`
  → `basisFromReiMetaCoherence(payload)` で verify 要。
- Breaking change の呼び出し側影響は `rg -n 'status.*coherent|meta_check_coherence'`
  で 4 hits、全て `comparison-basis-contract` module 内 (comment + display label +
  JSDoc)。 `=== "coherent"` 実文字列比較 は 0 件 = 実質 breaking なし。
- `coherent` を positiveVerdicts に残す 後方互換 判断: legacy caller (もし将来
  現れたら) を破壊しない + §15 counterfactual を 二重に扱える。 但し 未来
  STEP で legacy 完全撤廃する場合は enumerate.ts positiveVerdicts の
  `coherent` 削除 + test の legacy counterfactual 削除で対応。

## Failure mode (機械学習用 dataset)

- **What could go wrong**: shape 変更時に fixture だけ更新して adapter 更新を
  忘れる → shape mismatch で runner 落ちる、または adapter を「新 shape 前提」
  のみで legacy payload を破壊する → 過去 payload に対する診断能力喪失。
- **Prevention**: 
  (a) fixture と adapter を 同一 commit に。 別 commit だと 間の状態で
      test 通らない (bisect noise)。
  (b) adapter に legacy fallback path を残す (「新 shape 直読み優先、
      無ければ逆算」)。 defensive programming の cost は 30 行、
      benefit は 過去 payload archive の診断能力保持。
  (c) test に「両 shape が正しく処理される」assertion を明示 
      (本 STEP は §14 で新 shape CONFORM + §15 で legacy coherent counterfactual
      両方を assert)。
- **Recovery**: shape mismatch 検知した場合、まず該当 fixture の shape 確認、
  adapter の分岐を確認、legacy fallback が動いているか (payload に
  comparisonBasis が欠落してないか) を diagnostic 出力で切り分け。
- **Additional lesson**: 「新 STEP を書く前に 4 系統 collision check」
  (git log + notes/steps + package.json + docs/notepad) は 本 arc でも
  適用。 STEP 1840 は 4 系統全空きで進行、STEP 1838 pre-check で 
  STEP 1836/1837 先取り発見 → rename の 学び を継承。

## MCP 再起動 待ち action

- 藤本さん or 別 tab で rei-meta-mcp を使う Claude Code タブを閉じて再起動
- 別 session で `meta_check_coherence("seed_kernel")` 呼び出し
- 返り値の `comparisonBasis` field 存在 + shape 検証 (下記期待値)
- 期待 payload (seed_kernel, 2026-09-06 状態):
  ```
  status: "divergent" (record_count 1677 vs 1685)
  comparisonBasis: {
    sourcesDeclared: [rei-memory-local, rei-aios-local-mcp, rei-aios-remote],
    sourcesCompared: [rei-memory-local, rei-aios-local-mcp],
    uncheckedSources: [rei-aios-remote],
    comparedFields: [record_count],
    separatingPower: "scalar",
    undetectable: 4 entries (record_count preservation / content edit /
                              id-set replacement / cross-flavour silence)
  }
  divergence.unavailable_fields.latest_id / latest_timestamp 分離
  ```

## 詳細参照

- 関連 STEP: STEP 1838 (comparison-basis contract v0.1、本適合 arc の 相手)、
  STEP 1676 (self-description contract、同型)
- rei-meta-mcp commit hash: <別 repo commit 後に追記>
- 次段 (v0.2 candidate): rei-meta-mcp Python 側にも `_available_fields_of` の
  hypothesis property test 追加 / cross-flavour undetectable[] entry の
  content 検証 (人間 review 依存を減らす)
