Session close record · STEP 2308 · 2026-10-09

持ち越し仮定検出器 v0 の 独立実測 + Python 版 読込 + held-out 設計

chat-Claude 起工 の 「持ち越し仮定検出器 v0」 (HTML 可搬版 + Python 本家版 = carryover-detector.zip、 2 段構成 = 抽出部 差し替え可 + 照合部 決定的) と 作題 dev-set 16 件 (calibration_v1_additions.json) を Claude Code (rei-aios-2c) で 読み取り専用実測。 Node 移植版 を 作って Python 版 と 突合、 oracle_extractor の 設計意図 (= 検出能力 の 上限 ではなく、 schema × 性質表 × check() の 内部無矛盾性保証) を 明示化。 dev-set の 性能数値 は self-marking tainted (作題 + 予測 + 評価 を 全部 Claude が やった) ため **引用禁止**、 項目列挙 のみ。 独立 held-out 仕様 (藤本さん 8 + Gemini 12 + Rei 4 pilot = 20+、 二重否定/偽装否定 を 必須要素 に 入れた) + 境界測定 protocol (dev / held-out phase 分離 + rule 凍結 + L0/L1/L2 事前付与 + held-out 1 回限り) を Downloads 外 md 1 枚 で land。

rei-aios-2c main (worktree 分離 skip、 読み取り専用 arc) (1a) pred_oracle vs expect-ideal 再照合 (1b) Node 移植版 ↔ Python/JS 突合 bit-identical (1c) 規則差分: LLM slot + oracle extractor は Python のみ (2) protocol md land to Downloads held-out 実行 defer (作者 trigger 待ち)

対象 artifact (全 Downloads、 project tree 外)

(1a) pred_oracle vs expect-ideal 再照合

前 session で 「pred_oracle vs actual (= v0 keyword 検出器 出力)」 を 比較していたが、 藤本さん 指摘 で 比較軸誤り confirm。 oracle は 「ideal detector」 ではないので、 比較すべき は 「ideal outcome (= expect が carry なら hit、 clean なら ok)」。

再照合結果 (dev-set 16 件、 数値 は 引用禁止 のため 項目のみ): mismatches 3 件、 全部 A 群 false-justify。 以下 深い理由。

oracle が false-justify で defeated される schema 設計上 の 理由

Python 側 oracle_extractor の 動作:

def oracle_extractor():
    def extract(step):
        return {"domain": step.get("d"), "uses": step.get("u", []),
                "justified": step.get("j", [])}
    return extract

= gold d/u/j labels を verbatim pass。 check() は established |= set(ex["justified"]) で j を 無条件 est に 加える。

Gold schema の 定義 (calibration_v1_additions.json _comment):

→ false-justify (「円分整数では一意分解が成り立つことが証明されている」 等) は j=[unique_factorization] gold label を持つ ため、 oracle extractor も est に UF を 加え、 次段 の use を skip = miss。

これは bug ではなく schema 設計 の 構造的限界。 Python 本家 README L42 で 明示: 「oracle の 満点 は 『正解注釈 と 性質表 が 互いに 矛盾しない』 こと を 示す だけ で、 検出能力 の 証拠 では ない」。

将来 schema 拡張 候補 (本 arc scope 外):

(1b) Node 移植版 ↔ Python/JS 版 突合

HTML 側 の embedded CAL 17 件 (= chat-Claude 作題 の 元 較正セット) を 対象 に、 自作 Node 移植版 で measure() 相当 を 実行、 Python 版 measure.py の README L28-31 と 完全一致 確認:

MetricNode 移植版Python 版 README一致
n (cases)1717✓
tp (的中)88✓
fp (誤検出)11✓
fn (見逃し)22✓
recall0.8000.8✓
precision0.8890.889✓

3 誤り の 内訳 も README L34-36 と 完全一致: lame-paraphrase 見逃し (言い換え + 領域誤切替) / octonion-assoc-implicit 見逃し (性質名 を 言わない 書換) / ctl-negation 誤検出 (否定文)。 → Node 版 と Python 版 と JS 版 は bit-identical (TABLE + CAL + check() verbatim copy)。

※ 本 (1b) の 数値 は 元 CAL 17 件 (chat-Claude 作題、 Python 本家 の 公式測定値) 由来、 本 session で land した dev-set 16 件 由来 ではない ため 引用可。

(1c) 規則差分: HTML/JS 版 vs Python 本家版

項目HTML/JS 版Python 版備考
longest-match (null-pad)✓✓identical
check() logic (domain reset + est + status flag)✓✓identical
keyword_extractor✓✓identical
command_extractor (LLM 差し替え口)なし✓--extractor "cmd:<cmd>"、 stdin JSON → stdout JSON
oracle_extractor (上限参照)なし✓gold label verbatim pass
check(oracle=True) branch—✓step dict pass 用
測定 scriptHTML 内 measure() 自動独立 measure.py + --jsoncases_all_correct 全段正解事例 を Python のみ
CLIbrowser 内 のみpython3 detector.py <file> + extractor optionPython 側 が 本家

規則本体 の 差分 ゼロ。 Python 側 は LLM 差し替え口 を 既に実装済 で、 chat-Claude の 「LLM 本命経路」 の 設計意図 と 完全一致。 HTML/JS 版 は portable 展示版。

Dev-set 凍結宣言 (self-marking tainted、 数値引用禁止)

対象: calibration_v1_additions.json 16 件 (A 群 5 + B 群 3 + C 群 4 + D 群 4)。 作題 + 予測 + 評価 を 全部 Claude が やった ため 独立性 ゼロ。 用途 は 「rule 探索 の 開発信号」 と 「held-out 設計 の 指針」 のみ。

引用禁止 list (本 arc 以降、 対外発信 / 論文 / site 掲載 一切 禁止):

Held-out set 仕様 (概要、 詳細 は protocol md)

境界測定 protocol (3 phase 分離、 詳細 は md)

  1. Phase A rule 探索: dev-set のみ、 無制限 iteration (新 rule 候補 = D 群 否定 scope / A 群 step-local justify / 他 を dev-set 上 で 試算)
  2. Phase B rule 凍結: Phase A で 採用 した rule を bit-level freeze (detector.py + properties.json の SHA-256 + rule list 明記)、 以降 変更禁止
  3. Phase C held-out 実行: 凍結 rule を held-out に 1 回だけ 実行、 L0/L1/L2 群別 で keyword / LLM / oracle path を 比較

重要 discipline: held-out 実行結果 を 見て から rule 変更 は 本 protocol 違反。 「もう 1 回 動かしたい」 と 思った 時 は 「別 held-out set を 新規作成」 ルート を 取る。 旧 held-out は immutable record。

L0/L1/L2 事前分類 (held-out 実行前 必須)

Level必要能力典型 (dev-set 試算)
L0keyword 段 単独 で 可能: 性質 keyword 検出 + domain reset + 否定 scope + justify scopeA 群 一部、 D 群 全部 (rule 追加後)
L1構造 reasoning 必要: anaphora / cross-domain 比較 / scope-trackingB 群 「X の 場合 と 同様に」、 E 群 二重否定 の 一部
L2意味理解 必須 (LLM 段 の 本命経路): 性質 keyword 不在 の implicit 使用C 群 全部

付与 timing: held-out set 作成 直後、 検出器を 1 行も 動かす前 に 全 case に 事前付与。 作者 自身 または 作者 と 別人 (藤本さん が Gemini 作題 の 全 case を 分類 する、 等)。 事後 変更 禁止。

Honest scope

本 session で land した もの:

Peer coordination

本 session (rei-aios-2c、 2026-10-08 start) 中 の peer tab 状態:

Pointer