STEP 1631 — invariance-checker v0.1

STEP 1631 test 48/48 PASS v0.1 primitive only
2026-08-31 · rei-aios · 表現不変性 D-FUMT₈ verdict (chat-Claude 「史上最高の推論マシン」 dialogue の operational form)

1. 契機

chat-Claude 2026-08-31 「三つの候補を挙げるが、 最初の一枚を出すのが (1) 表現不変性チェッカーになる。 同じ問いを別の同値関係で再符号化した時、 モデルの結論が保存されるか。 空 (śūnyatā) を思想ではなく test として実装する骨。」

3 候補 (invariance / discard-log / falsification-gate) のうち、 時間の物理 (最短で一枚のテーブルが出る)、 既存部品 (STEP 1371/1376/1379 primitive の domain wrap)、 候補競合なし (paraphrase robustness は先行あるが 「商空間の取り替え」 として定式化した先行なし) の 3 理由で (1) を採択。

2. 実装

2.1 モジュール構成 src/aios/invariance-checker/

2.2 依存 (既存 primitive の domain wrap)

2.3 決定表 I (per-pair、 first-match)

#ConditionVerdictReason
I1comparator not providedNEITHER Ncomparator_not_set
I2aequivalent=null, reason=both_answers_absentZERO 〇both_answers_absent
I2bequivalent=null (それ以外)NEITHER N<comparator reason preserved>
I3equivalent=trueTRUE ⊤invariant_preserved:<reason>
I4equivalent=falseFALSE ⊥invariance_violated:<reason>
I5comparator threwNEITHER Ncomparator_threw:<msg>

2.4 決定表 A (aggregate, per-problem × K transforms)

#ConditionVerdictReason
A0K = 0ZERO 〇no_transforms
A1trueCount = KTRUE ⊤invariant_holds_across_all
A2falseCount = KFALSE ⊥invariance_fails_across_all
A3trueCount > 0 かつ falseCount > 0BOTH Bpartial_invariance
A4zeroCount = KZERO 〇all_pairs_absent
A5全 NEITHER (+ 任意 ZERO)、 T/F なしNEITHER Ninsufficient_evidence
A6 ★T > 0、 F = 0、 NEITHER ありNEITHER Npartial_evidence_no_violation
A7 ★F > 0、 T = 0、 NEITHER ありFALSE ⊥violation_with_partial_evidence

A6/A7 の非対称性: 一つの反例で FALSE、 だが 「T のみ + 一部 NEITHER」 は TRUE ではなく NEITHER に降格。 Popper 的 asymmetry の直接実装 (証拠不足で反例なし ≠ 不変性成立)。

3. 統計 wrapper (stochastic model)

statisticalInvarianceVerdict は 1 pair に対して N 個の (before, after) sample を受け取り:

  1. 各 sample に comparator 適用 → equivalent k 個、 not-equivalent (n-k) 個、 判定不能 = invalid
  2. 一側 exact binomial: p = P(X ≤ k | n, 0.5) — H0: 「等価率は偶然以上」 を左裾で棄却
  3. 得た単一 p-value を mapMultiTrialToD8 (STEP 1371) に 1 件だけ渡して delegate
  4. ZERO は「入力あり かつ 全 invalid」 なら NEITHER に降格

多問題横断 BH-FDR aggregate は caller 側で: 各 (problem × relation) の pValue を集めて mapMultiTrialToD8({trials, fdrQ, alpha}) に直接投げる。 v0.1 primitive は 一段目 まで。

4. 順序原則 (定数化禁止)

5. Test

npm run test:step163148/48 PASS (8 section):

  1. exactMatch (case sensitivity + normalize + null absence)
  2. numericMatch (tolerance 未設定 discipline + abs/rel + text-extract + provided-numeric priority)
  3. setMatch (unordered + size differ + empty tokens + token-normalize)
  4. singleInvarianceVerdict I1-I5 全 rule + invalid-input
  5. aggregateInvarianceVerdict A0-A7 全 rule (非対称 A6/A7 含む)
  6. binomialOneTailedLower (k=0, k=n/2, k=n, n=0 の boundary)
  7. statisticalInvarianceVerdict (comparator absent / 10/10 equivalent → FALSE / 0/10 → TRUE / 全 invalid / fdrQ missing)
  8. spec table dump + honestScope 確認

6. 反証条件 (Popper self-application)

本 primitive が 偽である と言える条件:

  1. Comparator に恒等 pair (before=after) を投入したのに TRUE 以外を返す
  2. 完全 mismatch pair (無関係な文字列) に exact-match comparator が TRUE を返す
  3. mapSamplePairToD8 / mapMultiTrialToD8 の decision table と矛盾する verdict
  4. statisticalInvarianceVerdict の p-value が閉じた区間 [0, 1] を逸脱

(1)(2) は test Section 1-3 で cover、 (3)(4) は Section 6-7 で cover。 全 48 test PASS で 全 4 反証条件が 現時点で 発火せず。

7. Honest scope (v0.1)

  • Primitive は 「答え A と答え B が来た。 comparator が こう言った」 まで の主張のみ。 「本当に この二つは等価か」 の judgment は primitive 外
  • LLM 呼出 layer は 実装しない (別 STEP)
  • Transformation library (問題書換機械) は 実装しない (別 STEP)
  • Semantic equivalence (LLM-as-judge / embedding) は v0.1 scope 外
  • v0.1 activate 4-5/8 値 (TRUE / FALSE / NEITHER / ZERO / BOTH)。 INFINITY / FLOWING / SELF は 予約
  • Aggregate A6 の 「T + NEITHER → NEITHER 降格」 は 意図的 (Popper asymmetry)、 「T + NEITHER = TRUE」 が欲しい場合は別 aggregator

8. Next

関連

STEP 1631 · 2026-08-31 · rei-aios home