# STEP 1848 — controlPassed() 反証側 両側判定 バグ fix + STEP 1846 attribution corrigendum

**Timestamp**: 2026-09-06T20:56 (JST)
**Tab worktree**: main (rei-aios-97 [de6edb])
**Commit**: <commit 後に追記>
**Refs-STEP**: 1846

## 一行 summary

STEP 1846 v0.2 の `controlPassed()` が 反証 control 側 を 両側判定 で 書いていた
バグ を Cowork side の Tatoeba multi-lang 実測 (en-ja shuffled-gold CI
[-0.00030, -0.00008]) が 発見。 1 行 修正 + 実測 fixture 4 件 差替え。 加えて
STEP 1846 の 「R2 補則 は 藤本さん 発見」 「checklist 3 は 藤本さん catch」
attribution が 誤り (実際は Cowork side の 発見) を 訂正。

## バグ の 中身

**旧実装** (verify-null-compared.ts controlPassed):
```ts
const excludesNull = c.interval.lower > 0 || c.interval.upper < 0;
return c.expectation === 'effect-persists'
  ? c.interval.lower > 0
  : !excludesNull;   // ← 反証 側 が 両側判定
```

反証 control の 通過条件 は 「対応 破壊 で 効果 が subject 方向 に 残らない」。
現行実装 の `!excludesNull` は 「CI が どちら側 でも 0 を 除外 しない」 を 要求
していた が、 これ は 契約 意図 に 反する: CI が negative 側 で 0 除外
(chance を わずかに 下回る) は leakage の 逆 で あり、 R2 補則 で `'none'` に
落とす 理由 に ならない。

**修正** (1 行):
```ts
return (c.interval.lower > 0) === (c.expectation === 'effect-persists');
```

両分岐 が `lower > 0` の 一致判定 に 畳まれる。 判別 と 反証 は 「subject
方向 に 効果 が 残ったか」 の 期待 が 反転するだけ で、 判定 する 事実 は 同じ。

## 発見経緯 (dataset entry: review では なく データ が 発見)

Cowork side (chat AI) が Paper 179 保留 の de-en / zh-en 判別 control を 4 言語対
(en-de / en-ru / en-cmn / en-ja) で 実施。 en-ja shuffled-gold の 実測 CI が
`[-0.00030, -0.00008]` = 両端 negative。 旧実装 で 「反証 不通過 → R2 補則
発動 → separatingPower 'none'」 と 誤発火 した ため バグ 発覚。

**私 (Code-Claude)、 Cowork-Claude、 Gemini の 誰も 見落とし、 データ が 見つけた**。
Cowork side の 明示 引用: 「review の 層 を いくら 重ねても、 走らせるまで 分から
ないもの が ある」 = STEP 1846 checklist 3 の 狭い形 「fixture の 緑 は、 fixture
の 数値 が 実測 で ある 場合 に しか 実装 の 正しさ を 保証しない」 の 実 evidence。

## §7 fixture が バグ を 通した 理由

STEP 1846 §7 fixture の shuffled-gold 区間 `[-0.00021, +0.00025]` は 私 が raw MRR
CI から 逆算 した **推定値** で、 実測 では なかった。 0 を 含む 値 を 書いた
ため 境界条件 が fixture に 現れなかった。 STEP 1848 fixture は en-ja 実測
`[-0.00030, -0.00008]` を 境界 として 明示 固定、 加えて 4 言語対 実測 の
全通過 も 別 test group で 固定。

## 実測 multi-lang 結果 (Cowork side、 data/experiments/weaver-b-multilang-2026-09-06/)

| 言語対 | shuffled-gold CI | 旧 v0.2 実装 | STEP 1848 修正後 |
|---|---|---|---|
| en-de | [-0.00013, +0.00003] | 通過 | 通過 |
| en-ru | [-0.00028, +0.00013] | 通過 | 通過 |
| en-cmn | [-0.00030, +0.00027] | 通過 | 通過 |
| **en-ja** | **[-0.00030, -0.00008]** | **不通過 (誤発火)** | **通過** |

4 件中 1 件 の 誤発火 = 実 Paper 179 の 保留解消 判定 (Weaver Task B ja-en が
「script 分離 artifact 仮説 棄却」 の 4 言語対 replication 完了) に **直接影響
する** バグ。 STEP 1848 で 完全 close。

## 実測 結果 (test)

- **step1846 v0.2 test**: 35 → **40/40 PASS** (assertion +5: en-ja 境界 + 4 言語対
  shuffled-gold 実測 fixture)
- **regression 7 batch**: 166/166 PASS
- **step1838 v0.1 base**: 81/81 PASS
- **runner**: 3/3 CONFORM + rei_meta N/A (v0.1 63 unit unchanged)
- **tsc --strict on 2 modified files**: 0 errors
- 累計: **287/287 PASS** (前回 282 + 追加 5)

## STEP 1846 attribution corrigendum

私 の STEP 1846 land 記録 (memory hook + notepad + fragment + site page) で
以下 の attribution が 誤り:

| 場所 | 私 の 記載 | 訂正 |
|---|---|---|
| notepad §「主要 finding」 | 「R2 補則 (rev.2 追加、 藤本さん 独自発見)」 | 「R2 補則 (rev.2 追加、 **Cowork side** 発見、 藤本さん 中継)」 |
| notepad §「判別/反証 asymmetry」 | 「rev.1→rev.2 で 藤本さん 発見、 私 の 見落とし」 | 「rev.1→rev.2 で **Cowork side** 発見、 私 の 見落とし、 藤本さん 中継」 |
| notepad §「Failure mode」 | 「藤本さん が rev.2 で 深化発見」 | 「**Cowork side** が rev.2 で 深化発見」 |
| site page §3 標題 | 「藤本さん rev.2 で 発見」 | 「**Cowork side** が rev.2 で 発見」 |
| site page §2.4 標題 | 「藤本さん rev.2 発見」 | 「**Cowork side** rev.2 発見」 |
| 累計 4 checklist item 3 | 「藤本さん の 発見 由来」 | 「**Cowork side** の 発見 由来」 |

**なぜ この 区別 が load-bearing か**: publish 判定 α (human final review が
safety net) の 論拠 は mis-frame track record に 依存 する。 catch が 人 に よる
もの か 別 AI に よる もの か で 意味 が 変わる。 加えて 今回 の バグ は 人 も
AI も 見落として **データ が 見つけた** = 「review の 層 を いくら 重ねても、
走らせる まで 分からない もの が ある」 の 追加 evidence。 α 推奨 自体 は
変えない が、 根拠 の 姿 は 変わる。

STEP 1846 の 過去 record (notepad / fragment / site page / MEMORY.md hook) は
append-only 原則 で 削除 せず、 本 STEP 1848 の 記録 を corrigendum として 追加
する。 未来 の 私 (or 別 tab) は STEP 1846 file を 引き当てた 時 本 corrigendum
を 併読 する 必要 あり。

## Honest scope (STEP 1848 arc の 限界)

- **STEP 1846 過去 record は 訂正 しない (append-only 原則)**。 corrigendum として
  STEP 1848 が 併存 する 形。 mis-attribution を 引き当て時 に catch する には
  未来 の reader が 本 corrigendum も 見る 必要あり。
- **fixture 実測 化 の 完全性 は 保証しない**。 4 言語対 は 実測 だが、 §7 fixture
  の 他 部分 (STEP 1843 相当 の CI [-0.0203, +0.1262]、 Tatoeba n=10000 相当 の
  CI [0.00040, 0.00088]) は 現在 も 数値 の 出所 が 部分推定。 全 fixture 実測化
  は v0.3 送り。
- **バグ が 過去 に どこ で 発火 した か 網羅 不能**。 STEP 1846 land 以降 に
  他 tab が v0.2 verifyStatisticalBasis を 呼んだ trace は 私 の 手元 に なし。
  外部 caller が 誤 verdict を 使った 可能性 は 実運用 上 な さそう だが (v0.2
  land から STEP 1848 fix まで 短時間)、 保証 不能。
- **1 行 修正 が 他 pattern を 破壊 しない ことは test で は 保証 しきれない**。
  4 boundary case (CI 含 0、 両端 negative、 両端 positive で 判別、 両端 positive
  で 反証) が 明示 assert 対象、 それ 以外 の 境界 (level != 0.95、 method =
  'analytic' 等) は 未 test。

## 詳細 参照

- 関連 STEP: **STEP 1846** (v0.2 land、 本 arc の 修正対象)、 STEP 1843 (motivating fixture)、
  STEP 1838 (v0.1 base)、 STEP 1676 (dogfood)
- Cowork side 実験 report: `data/experiments/weaver-b-multilang-2026-09-06/REPORT-MULTI.md`
- 修正 file: `src/aios/comparison-basis-contract/verify-null-compared.ts` (controlPassed 1 行 差替)
- test 差替: `test/step1846-comparison-basis-contract-v02-test.ts` (5 assertion 追加、
  en-ja 境界 fixture + 4 言語対 実測 fixture)
