# STEP 1846 — comparison-basis contract v0.2 (統計的 verdict への 拡張)

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

## 一行 summary

v0.1 が G2 のみ で 捕まえた STEP 1843 Weaver Task B verdict pattern (帰無モデル
未宣言 で G1/G4 素通り) を close する ため、 null-compared BasisKind + R1 shape
規則 + R2 導出 separatingPower + R2 補則 + G5 direction stability を 追加。
v0.1 63 unit 無変更 CONFORM 維持 + 4 gate → 5 gate。

## 主要 finding / evidence

- **v0.1 診断**: STEP 1843 verdict を v0.1 契約に 誠実に 落とすと 4 gate のうち
  **G2 のみ NONCONFORM** (私 の 前回 report は G1/G2/G4 と誤り、 藤本さん が
  code 照合で 訂正)。 G1/G4 素通り の 原因は 「帰無モデル (chance level) が
  source として 宣言されていない」 一点。
- **v0.2 中核**: 新 gate ではなく **shape 規則 R1** で close。 「null-compared
  BasisKind の とき nullModel.id は sourcesDeclared に 必須」 の 1 行 で 既存
  G1/G4 が 自動 発火 する。 「1 つの穴 の 昇格のみ」 の v0.1 discipline を 継承。
- **R2 = separatingPower を CI から 導出**: v0.1 G3 の `'declared'` loophole の
  再帰的 close。 分析者が `'content'` を 自己申告 する 抜け道を null-compared に
  限って 塞ぐ。
- **R2 補則 (rev.2 追加、 藤本さん 独自発見)**: 反証 control (shuffled-label 等
  `expectation='effect-vanishes'`) 不通過 → 無条件 `'none'`。 対応破壊 しても
  効果が 残るなら 測定系 の 漏れであり 昇格材料 ではなく 無効。 計量経済 の
  placebo test 慣行 対応物。
- **判別/反証 asymmetry (rev.1→rev.2 で 藤本さん 発見、 私 の 見落とし)**:
  control の 通過条件は kind で 逆転する (判別 = 効果残る が pass / 反証 =
  効果消える が pass)。 rev.1 の `passed: boolean` field で 潰すと shuffled-gold
  (0.00096 vs chance 0.00098、 CI 帰無含む) が 「区間 0 除外 = 通過」 一律 rule で
  **FAILED 扱い**、 意味論の 静か な 崩壊。 fixture 緑のまま で detect 不能領域。
  rev.2 で `ControlExpectation` 型 + `controlPassed()` 導出関数 で 型 leve で 分離。
- **G5 (唯一の 新 gate)**: aggregate と perItem 符号 の 逆転 検知 (Simpson's
  paradox 系)。 STEP 1843 の 6/25 = 0.24、 Tatoeba n=2000 の 975/2000 = 0.4875 は
  平均だけ 見ると 「勝ち」、 符号で 見ると 「負け」。 v0.1 の 4 gate 全て 素通り
  する 型の failure mode を close。
- **§7 fixture 実測 一致**: STEP 1843 fixture (n=25、 CI [-0.0203, +0.1262]、
  perItem 6/18/1) → G1+G2+G5 NONCONFORM (design §7-1 予測 完全 match)。
  Tatoeba n=10000 fixture (3 control 通過 + undetectable 2 entries 宣言) →
  5 gate 全 CONFORM。 「v0.1 で 区別できなかった 4 件 が v0.2 で 3 件 の 禁止 と
  1 件 の 条件付き許可 に 分かれる」 が 実 test で 確認。

## 実測

- **step1846 test**: **35/35 PASS** (regression + R1 + controlPassed 判別/反証 +
  R2 ladder + R2 補則 + G5 3 分岐 + N2 ties denominator + §7 fixture 2 件 +
  dogfood 全網羅)
- **step1838 regression**: **81/81 PASS** (version 0.1.0 → 0.2.0 の 意図的 flip
  1 箇所反映済)
- **regression 7 test batch**: **166/166 PASS** (1599/1605/1608/1609/1613/1615/1676)
- **runner (basisAudit)**: **3/3 CONFORM** (harvest_lag 9/9 + plugin_census 4/4 +
  source_freshness 50/50) + rei_meta_coherence N/A (out-of-band 不変)
- **tsc --strict on modified/new 6 files**: **0 errors**
- 累計: **282/282 PASS** + tsc 0 + runner CONFORM

## Honest scope (v0.1 継承 + v0.2 追加限界)

### v0.1 継承
- read-only 診断、 計器側 code 無変更
- G3 は field 名 集合演算 のみ、 同名 field の 意味一致は 検証不能
- G3 は `basisOrigin='intersection'` 限定、 `'declared'` 抜け道あり

### v0.2 追加限界 (§8)
- **interval / control interval の 値 自体 は 検査しない**。 `method` / `resamples` /
  `seed` は 名乗り であり、 手続きが 実際に 走ったかは 契約 外。 悪用 の 方向は
  「不当に 狭い区間 で `'scalar'` 以上 に 昇格」。 `resamples` / `seed` を 要求
  するのは 値の 正しさ 保証 のため ではなく **第三者 が 再現 を 試みられる
  ため**。 (M2 訂正: 私 の rev.1 review で 「狭い区間 で `'none'` を 取る」 例を
  出したが、 自傷なので 実務上 起きない、 藤本さん 訂正)
- **control の 中身の 妥当性は 検査しない**。 `expectation` と `interval` から
  passed は 導出されるが、 `shuffled-label` と 名乗った control が 本当に 対応を
  破壊しているかは 型で 検査不能。 真の 外部依存。
- **判別 control 1 件で `'multi-scalar'` に 上がる**。 どの 交絡を 潰す control
  が 必要かは 領域知識、 契約は 件数のみ (v0.3 送り)
- **G5 は 対応 の ある 比較 にしか 効かない**。 対応 の ない 設計では perItem
  未定義 で N/A。 sign test の 近似 ではなく majority-direction consistency check
  (n=100 の 55/100 は G5 通るが 二項検定 では 何も 言えない、 有意性 は R2 の
  区間が 担う、 gate の 役割は 決定的禁止 のみ)
- **R2 の ladder は 順序 であって 尺度 ではない**。 `'multi-scalar'` と
  `'identity-set'` の 間に 定量的 意味は なく、 v0.1 の 粗さを 継承
- **§4 分類抜け道 が 最大 の 限界**: `basisKind` を `'null-compared'` と 申告
  しなければ v0.2 規律 は 一切 適用されない。 STEP 1843 が 実際に した の は
  これ (意図的 ではなく そういう 分類軸 が 無かった ため)。 v0.1 G3 の
  `'declared'` 抜け道 と 同型 の 限界、 構造的 close 不可
- **metric convention (N1)**: interval は 「positive = subject 勝ち」 に 事前
  normalize 済 と する。 low-is-better metric (loss / perplexity 等) は 分析者
  責任 で 符号反転 して supply。 型検査 では 拾えない、 事前登録 慣行 と 同型 の
  分析者責任

## Novelty 主張なし — Prior art audit (§5)

| v0.2 要素 | 既存 対応物 |
|---|---|
| 帰無モデル 宣言義務 (R1) | Fisher/Pitman 並べ替え検定、 NHST の 帰無仮説 事前指定 |
| CI から 導出 separatingPower (R2) | power analysis、 Cumming "new statistics" 区間推定 |
| 判別/反証 control 区別 | 陰性/陽性対照 (実験科学一般)、 計量経済 falsification test |
| R2 補則 (反証 不通過 → 無効) | placebo test 有意 → 推定 無効 化 慣行、 ML data leakage 検査 |
| operationalThreshold | 臨床試験 MCID、 事前指定 主要評価項目 |
| shuffled-label control | 神経画像 permutation testing、 Adebayo 2018 saliency sanity check |
| trivial-feature baseline | IR random/length baseline、 TREC 評価規範 |
| G5 direction stability | 対応符号検定、 Simpson's paradox、 Gelman 「有意と非有意の差は有意ではない」 |
| 宣言義務 checklist 化 | NeurIPS reproducibility checklist、 ACL responsible NLP checklist |

**唯一 Rei 側 の 産物** = 「これらを 1 つの 型に 畳んで gate として 実行可能に
した 点」 のみ。 v0.1 の novelty 主張なし discipline を 完全継承。

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

- **What could go wrong (私 の rev.1 review の 失敗 事例)**: `controls: string[]`
  を `controls: ControlResult[]` に 型化 する 提案は 正しかったが、 `passed:
  boolean` field を 提案 = self-declaration の 一段下 に 移すだけ の loophole。
  藤本さん が rev.2 で `expectation + interval → controlPassed()` 導出 に 再帰
  適用 して 深化。 rev.1 →rev.2 で **判別/反証 asymmetry** も 発見 (私 の 完全
  見落とし)、 fixture 緑のまま semantic drift する 領域が 実在すると 判明。
- **Prevention**: (a) 型 refactor 時 「boolean field は self-declaration の 一段下
  で ないか」 の 検証、 (b) 「control 系 の pass/fail は kind で 逆転しうる」
  boundary case check、 (c) 「fixture 緑 は refactor 正しさの evidence ではない
  (semantic drift 検出不能 領域あり)」 を 型設計 チェックリスト に 常設
- **Recovery**: rev.2 の `ControlExpectation` + `controlPassed()` 導出 patternで
  boolean field を 排除。 test §3 で 判別/反証 両 direction 明示 assert する
  ことで 未来 の refactor で 崩れないよう 固定

## 詳細 参照

- Design doc: `docs/comparison-basis-contract-v0.2-DRAFT_1.md` (rev.2)
- 関連 STEP: STEP 1838 (v0.1 契約定義、 本 arc の base)、 STEP 1840 (rei-meta
  適合、 v0.1 唯一の NONCONFORM close)、 STEP 1843 (Weaver Task B、 v0.2 の
  motivating fixture)、 STEP 1676 (self-description-contract、 dogfood 対象)
- 実装 file: `src/aios/comparison-basis-contract/` (types.ts / verify.ts /
  verify-null-compared.ts / index.ts / enumerate.ts)
- test: `test/step1846-comparison-basis-contract-v02-test.ts` (35 assertion)
- v0.3 送り: 多重比較会計 / enumerate 自動分類 / 事前登録連携 / control 十分性
