STEP 1907 · 2026-09-09 · rei-aios-2e

rei-repair-mcp v0.2 P0 audit

「修正機器」 = 修正する 装置 で は なく、 拒否 の 情報量 を 上げ、 その 効果 を 測る 器。 v0.2 依頼文 §8 の P0 (装置C reject の read-only audit) を 実施、 判定 PASS。 §6.1 axis 3 種 で 装置C 由来 Python typed exception raise される 4 種 + 宣言のみ 1 種 を 網羅可能、 装置C 側 書き換え 不要、 P1 blocker なし で 報告。 続く 6 turn の review で Q1〜Q4 + 追加 8 制約 が 確定、 依頼文 v0.1_1 → v0.2 の 差分 13 箇所 に 反映。 本 装置 は 未検証 の 器 で あり、 価値仮説 は §9 の 事前登録 反証条件 (n_min / escape_rate / partial-coord c-2) を 通す まで 未確定。

永久参照: P0 audit commit 2ce922986 · Corrigendum commit ad1e435c7 · P0 audit notepad · Corrigendum notepad · 装置C 実装 (rei-aios-29 sidecar)

装置 の 位置づけ

既存 tool の compose との差分は未証明。§9 の測定を通すまで 器 に すぎない

rei-repair-mcp は checker が 出す reject を 「座標付き の 構造化 reject」 に 正規化し、 修正 の 試行履歴 を 計測可能 な 形 で 記録 する MCP server の 仕様 で あり、 実装 は go 後。

中心仮説 (未検証):

修正ループ の 効率 を 決める の は 修正器 (AI) の 賢さ で は なく、 1 回 の reject が 返す 情報量 で ある。

したがって v0 で 3 stream (ctx = 装置C / lean = Lean4 build / lrat = cake_lpr) を 順次 wire。 修正 そのもの は AI 側 が 書き、 装置 は 拒否 の 情報量 と 試行回数 の 測定装置 に 徹する。

P0 判定

PASS

装置C 側 書き換え 不要

Exception 種類

4 + 1

raise される 4 種 + 宣言のみ 1 種

Axis × Subclass

3 × 10

§6.1 axis × rule field

Review turn

6

Q1〜Q4 + 追加 8 制約

装置C reject の 物理形式

Python module × typed exception (raise される 4 種 + 宣言のみ 1 種)

装置C (ctx_ledger.py v0.3.1) は subprocess で 叩く binary で は なく Python module。 adapter は import ctx_ledger して 例外 を 捕捉 する 形。 §4.2 の raw_output: str は 「例外 の str(exc) のみ」 で は なく、 {traceback, parsed: {exc_type, message, raise_site, caller_site}} の JSON envelope が 必要 (v0.2 §4.2.1 で 確定)。

Exceptionraise 元状態Axis (§6.1)
CtxLedgerError (base)__post_init__ / set_amortize_n / declare (LossyDecl) / verify_hash / verify_roundtrip (undecl K) / bypass_roundtrip_for_cost / declare_lossy (mutex)raise されるscope_violation + declaration_missing
IncompleteLedgerErrorcompute (未 hash-verify SideInfo)raise されるaccounting_mismatch
HashMismatchErrorverify_hash (sha256 / bytes 不一致)raise されるaccounting_mismatch
RoundtripFailErrorverify_roundtrip (decoder 例外 / output 不一致) / compute (route 未選択)raise されるaccounting_mismatch + scope_violation
WellKnownRejectedErrorclass 定義のみ、raise されない— (v0.1 scope 外)

Well-known 却下 の 特殊扱い: 例外 で は なく state (si.well_known_pass=False + si.reclassify_reason)。 §6.1 は 「refusal-until-declared 機構 が 出す reject」 に scope 限定 の ため、 v0.1 adapter は 座標化 せず raw_text 経由 で AI に 可視化。 wellknown_reclassify axis は v0.2 adapter candidate (別 STEP)。

Axis 3 種 × 10 subclass 写像

rule field で subclass 区別、multi-item message は 2 pattern で 座標展開

AxisSubclass (rule field)由来
declaration_missingSideInfo.<field>declare() field 不足
LossyDeclaration.<field>declare_lossy() field 不足
accounting_mismatchhash_mismatchHashMismatchError (sha256)
byte_count_mismatchHashMismatchError (bytes)
hash_not_verifiedIncompleteLedgerError (pending)
roundtrip_length_mismatchRoundtripFailError (output 不一致)
decoder_exceptionRoundtripFailError (decoder が例外)
scope_violationbasic_validation__post_init__ / set_amortize_n / bypass_roundtrip_for_cost
sideinfo_not_declared / k_item_not_declaredverify_hash / verify_roundtrip
mutex_state_violationdeclare_lossy / bypass_roundtrip_for_cost (mutex)
roundtrip_route_missingcompute (route 未選択)

Multi-item message の 2 展開ルート: (a) "missing/invalid fields: ['X', 'Y']" (declare 系) / (b) "pending:\n - X\n - Y" (IncompleteLedgerError)。 各 item を regex で 分解 して item 数 = 座標数 として 展開。

依頼文 v0.1_1 → v0.2 13 箇所 の 変更

Q1〜Q4 + 追加 8 制約、6 turn review で 確定

#§追加/変更内容由来
1§0.1claim scope 絞り込み: 「装置C reject 一般」 で は なく 「declaration / accounting / roundtrip content reject に 対する 修正」Q2 scope
2§4.2.1raw_output = traceback formatted + parsed mirror (exc_type / message / raise_site / caller_site) までに 限定、 ledger_snapshot は §5 coordinate metadata に 分離Q1
3§4.3(1)recheck 5 段 (a-e) 完全走破、 宣言チェック 単独 shortcut 禁止 (over-declaration gaming 防止)追加制約 3-1
4§4.3(2)attempt ごと に CtxLedger 新規生成 (in-process state isolation)追加制約 3-2
5§4.3(3)candidate canonical form + sha256 hash、 等価再提出 は duplicate_of 記録 で attempts_to_fix 分子 を 進めない追加制約 3-3
6§4.3(4)route_taken 記録 + FIXED_BY_REPAIR / FIXED_BY_DECLARED_ESCAPE verdict 分離 (lossy 宣言 で 修正成功率 水増し 防止)追加制約 4
7§5coordinate 層 metadata に ledger_snapshot? 配置、 observed / required null 可 (§9 c-2 対象)、 両方 null は unlocalizable に 格上げQ1 + Q4
8§7terminal.status enum 拡張、 attempt に route_taken、 env_snapshot に ctx_ledger_source_commit + last_drift_check追加制約 4 + 5
9§8P0.5 (vendored pin 作成) と P2.5 (drift check CI) を 挿入、 P1 に 回帰 test 4 本 明記追加制約 5 + 藤本さん 3-2
10§11.2vendored copy + manifest 配置 (single source of truth = manifest)、 runtime で sidecar に 触れないQ3
11§12.2integrity check (runtime, abort、 warning → abort に 格上げ) + drift check (非 runtime、 CI 分離、 pin 忠実性 と upstream drift の 2 種)追加制約 5
12§13Q1〜Q4 + 追加 8 制約 + 先送り 2 件 を 判断結果 として 4 分割記録依頼文 v0.2 全体
13§9.2 / W-R3 scope(c-2) 追加、 同時凍結 4 種 (閾値 / item mix / escape_rate 予測 と 読み方 / mode 別 n_min(FIXED_BY_REPAIR)) + well-known 除外 or 別 stratum、 最初 の 測定 run 後 改訂禁止Q4 + 追加制約 6 + 7

Guard の 3 層 分離

integrity (runtime abort) / pin 忠実性 (pin bump STEP) / upstream drift (定期 CI)

装置C は checker binary で は なく core dependency の ため、 v0.1_1 §12 の 「digest 不一致 は warning」 を v0.2 §12.1 で abort に 格上げ。 さらに 「pin が 正しく 取られた か」 と 「upstream の drift」 は 別 concern なので 3 層 に 分ける:

何 を 検定実行タイミング失敗時
§12.1 integritysha256(vendored/ctx_ledger.py) == manifest.ctx_ledger_sha256runtime (起動 + 各 tool 呼出)abort (loud stderr)
§12.2(i) pin 忠実性sha256(vendored) == sha256(git show <source_commit>:sidecar)pin bump STEP 内 で 1 回のみpin bump STEP abort
§12.2(ii) upstream driftmanifest.ctx_ledger_sha256 == sha256(現 sidecar)定期 CIissue / PR で pin bump 促す

Runtime で sidecar に 触れない: 実行された コード の 同定 に は 12.1 で 足りる (vendored が 実行されている ので vendored の digest が single source of truth)。 sidecar digest が 必要 な の は 「pin が 古びていない か」 と いう 外的妥当性 の 話 で、 これ は ctx_ledger_source_commit + last_drift_check の bookkeeping で 足る。 tab isolation protocol を 壊さない。

§9 事前登録 の 反証条件

主要指標 attempts_to_fix と 4 診断指標、初回 run 後 改訂禁止

価値仮説 「座標付き reject は 修正試行回数 を 減らす」 は、 以下 の いずれか で 反証:

  • (a) 同一課題群 で coordinate mode の attempts_to_fix median が naive mode の 0.8 倍以上 (= 20% 未満 の 改善)
  • (b) coordinate mode の FIXED_BY_REPAIR 到達率 が naive mode を 下回る
  • (c-1) unlocalizable_count > 0 の reject が coordinate mode intake の 50% 超 (multi-stream 汎用閾値)
  • (c-2) observed または required少なくとも 一方 が null / placeholder の 座標 が 全 coordinate の 50% 超 (partial-coordinatization 検定、 装置C では decoder_exception が captured)
  • (d) 同一 candidate に 対する verdict が 非決定的 な 試行 が 10% 超 (測定自体 が 無効)

同時凍結 4 種 (W-R3 別 STEP で 決定、 初回 run 後 改訂禁止):

  1. 閾値 (a) / (b) / (c-1) / (c-2) / (d)
  2. 課題群 item mix (選定規則・件数・seed)
  3. escape_rate = count(FIXED_BY_DECLARED_ESCAPE) / count(all terminal outcomes) の 予測上限 と 読み方 (診断: なぜ 痩せた か)
  4. mode 別 n_min(FIXED_BY_REPAIR) — これ を 下回る run は underpowered で 主要指標 を 読まない (判定: 痩せた か どうか)

escape_rate と n_min の 役割分離 が 重要: escape_rate は TIMEOUT / ABANDONED が 嵩んで 主要標本 が 薄くなった とき 何 も 警告しない (分母 が all terminal outcomes)。 n_min が 「痩せた か どうか」 の 判定、 escape_rate は 「なぜ 痩せた か」 の 説明。

Honest scope

主張しないこと

未検証 の 器 実装完了時点 で 本装置 は 未検証 の 器。 §9 の 事前登録 反証条件 (n_min / escape_rate / partial-coord c-2) を 通す まで、 既存 tool の compose (checker の 生 stderr を そのまま AI に 渡す 20 行ループ) との 差分 は 未証明。 README / commit / 公開物 に 「新機構」 「世界初」 「高密度」 「突破」 等 を 書かない (§10)。
Claim scope の 限定 測定結果 は 「装置C の reject 一般 に 対する 修正効率」 で は なく、 「declaration / accounting / roundtrip content reject に 対する 修正効率」 と してのみ 記述してよい (§0.1)。 encoder / decoder の ロジック変更、 装置C source の 書き換え、 compressed bytes の 再エンコード、 hash の 逆算 は 装置内 で 表現不可能。 declare_lossy / bypass_roundtrip_for_cost による 「宣言 で の 回避」 は FIXED_BY_DECLARED_ESCAPE と して 主要指標 から 除外escape_rate 診断 と して 並記 (§7 / §9.1)。
既知 の 脆さ (v0.2 candidate) adapter は 装置C の message format を regex で parse する ため、 装置C 側 の 文言変更 で 壊れる。 v0.1 で は これ を 受け入れ、 §12 の guard で 検知 する 運用。 構造的解決 は 「装置C の 例外 に exc.rule / exc.fields / exc.pending を 持たせて regex を 廃す」 (装置C 側 10 行程度) で、 v0.1 adapter を 実際 に 走らせて regex parser の 実測 fragility を 得た 後、 別 STEP で 起こす。 本 STEP で は 触らない。

Next step

STEP 1907 は addendum 含めて close、P1 は別 STEP claim 待ち

次 の 作業 (P1 go 後):

  1. 新 STEP を scripts/claim-step.ts --slug rei-repair-mcp-v0.2-p1 (or p0.5) で claim
  2. tab worktree で isolation (scripts/tab-worktree.sh open ...)
  3. rei-repair-mcp/ を rei-checker-mcp precedent (STEP 1365) に 沿って 別 public repo として 起こす か、 rei-aios subdir に 置く か を 判断
  4. P0.5: vendored/ctx_ledger.py + manifest.json + scripts/verify-pin-integrity.sh、 pin 忠実性 verify green まで
  5. P1: core + schema + guard + ctx adapter + 5 tool、 回帰 test 4 本 green まで

測定側 STEP (§9 課題群設計) は W-R3 明示通り 更に 別 STEP・別 claim。 実装 STEP と 測定設計 STEP が 同一番号 だと、 反証条件 を 「後 から 実装 に 合わせて 緩めた」 形 に 見える。