STEP 1907 · 2026-09-09 · rei-aios-2e
「修正機器」 = 修正する 装置 で は なく、 拒否 の 情報量 を 上げ、 その 効果 を 測る 器。 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) を 通す まで 未確定。
既存 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 制約
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 で 確定)。
| Exception | raise 元 | 状態 | 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 |
IncompleteLedgerError | compute (未 hash-verify SideInfo) | raise される | accounting_mismatch |
HashMismatchError | verify_hash (sha256 / bytes 不一致) | raise される | accounting_mismatch |
RoundtripFailError | verify_roundtrip (decoder 例外 / output 不一致) / compute (route 未選択) | raise される | accounting_mismatch + scope_violation |
WellKnownRejectedError | — | class 定義のみ、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)。
rule field で subclass 区別、multi-item message は 2 pattern で 座標展開
| Axis | Subclass (rule field) | 由来 |
|---|---|---|
declaration_missing | SideInfo.<field> | declare() field 不足 |
| LossyDeclaration.<field> | declare_lossy() field 不足 | |
accounting_mismatch | hash_mismatch | HashMismatchError (sha256) |
byte_count_mismatch | HashMismatchError (bytes) | |
hash_not_verified | IncompleteLedgerError (pending) | |
roundtrip_length_mismatch | RoundtripFailError (output 不一致) | |
decoder_exception | RoundtripFailError (decoder が例外) | |
scope_violation | basic_validation | __post_init__ / set_amortize_n / bypass_roundtrip_for_cost |
sideinfo_not_declared / k_item_not_declared | verify_hash / verify_roundtrip | |
mutex_state_violation | declare_lossy / bypass_roundtrip_for_cost (mutex) | |
roundtrip_route_missing | compute (route 未選択) |
Multi-item message の 2 展開ルート: (a) "missing/invalid fields: ['X', 'Y']" (declare 系) / (b) "pending:\n - X\n - Y" (IncompleteLedgerError)。 各 item を regex で 分解 して item 数 = 座標数 として 展開。
Q1〜Q4 + 追加 8 制約、6 turn review で 確定
| # | § | 追加/変更内容 | 由来 |
|---|---|---|---|
| 1 | §0.1 | claim scope 絞り込み: 「装置C reject 一般」 で は なく 「declaration / accounting / roundtrip content reject に 対する 修正」 | Q2 scope |
| 2 | §4.2.1 | raw_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 | §5 | coordinate 層 metadata に ledger_snapshot? 配置、 observed / required null 可 (§9 c-2 対象)、 両方 null は unlocalizable に 格上げ | Q1 + Q4 |
| 8 | §7 | terminal.status enum 拡張、 attempt に route_taken、 env_snapshot に ctx_ledger_source_commit + last_drift_check | 追加制約 4 + 5 |
| 9 | §8 | P0.5 (vendored pin 作成) と P2.5 (drift check CI) を 挿入、 P1 に 回帰 test 4 本 明記 | 追加制約 5 + 藤本さん 3-2 |
| 10 | §11.2 | vendored copy + manifest 配置 (single source of truth = manifest)、 runtime で sidecar に 触れない | Q3 |
| 11 | §12.2 | integrity check (runtime, abort、 warning → abort に 格上げ) + drift check (非 runtime、 CI 分離、 pin 忠実性 と upstream drift の 2 種) | 追加制約 5 |
| 12 | §13 | Q1〜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 |
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 integrity | sha256(vendored/ctx_ledger.py) == manifest.ctx_ledger_sha256 | runtime (起動 + 各 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 drift | manifest.ctx_ledger_sha256 == sha256(現 sidecar) | 定期 CI | issue / 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 を 壊さない。
主要指標 attempts_to_fix と 4 診断指標、初回 run 後 改訂禁止
価値仮説 「座標付き reject は 修正試行回数 を 減らす」 は、 以下 の いずれか で 反証:
coordinate mode の attempts_to_fix median が naive mode の 0.8 倍以上 (= 20% 未満 の 改善)coordinate mode の FIXED_BY_REPAIR 到達率 が naive mode を 下回るunlocalizable_count > 0 の reject が coordinate mode intake の 50% 超 (multi-stream 汎用閾値)observed または required の 少なくとも 一方 が null / placeholder の 座標 が 全 coordinate の 50% 超 (partial-coordinatization 検定、 装置C では decoder_exception が captured)同時凍結 4 種 (W-R3 別 STEP で 決定、 初回 run 後 改訂禁止):
escape_rate = count(FIXED_BY_DECLARED_ESCAPE) / count(all terminal outcomes) の 予測上限 と 読み方 (診断: なぜ 痩せた か)n_min(FIXED_BY_REPAIR) — これ を 下回る run は underpowered で 主要指標 を 読まない (判定: 痩せた か どうか)escape_rate と n_min の 役割分離 が 重要: escape_rate は TIMEOUT / ABANDONED が 嵩んで 主要標本 が 薄くなった とき 何 も 警告しない (分母 が all terminal outcomes)。 n_min が 「痩せた か どうか」 の 判定、 escape_rate は 「なぜ 痩せた か」 の 説明。
主張しないこと
declare_lossy / bypass_roundtrip_for_cost による 「宣言 で の 回避」 は FIXED_BY_DECLARED_ESCAPE と して 主要指標 から 除外、 escape_rate 診断 と して 並記 (§7 / §9.1)。
exc.rule / exc.fields / exc.pending を 持たせて regex を 廃す」 (装置C 側 10 行程度) で、 v0.1 adapter を 実際 に 走らせて regex parser の 実測 fragility を 得た 後、 別 STEP で 起こす。 本 STEP で は 触らない。
STEP 1907 は addendum 含めて close、P1 は別 STEP claim 待ち
次 の 作業 (P1 go 後):
scripts/claim-step.ts --slug rei-repair-mcp-v0.2-p1 (or p0.5) で claimscripts/tab-worktree.sh open ...)rei-repair-mcp/ を rei-checker-mcp precedent (STEP 1365) に 沿って 別 public repo として 起こす か、 rei-aios subdir に 置く か を 判断vendored/ctx_ledger.py + manifest.json + scripts/verify-pin-integrity.sh、 pin 忠実性 verify green までcore + schema + guard + ctx adapter + 5 tool、 回帰 test 4 本 green まで測定側 STEP (§9 課題群設計) は W-R3 明示通り 更に 別 STEP・別 claim。 実装 STEP と 測定設計 STEP が 同一番号 だと、 反証条件 を 「後 から 実装 に 合わせて 緩めた」 形 に 見える。