> **Public planning snapshot — not a runnable reproduction package.** E5 has not been reported as a completed experiment in this essay. Internal manifests, audit records, data and result directories mentioned below are not included. File names identify dependencies, not downloadable resources. The following source plan is preserved for transparency, including its limitations.
>
> **公開用の研究計画スナップショット**：実施済み結果や単独で実行可能な再現パッケージではありません。本文中の内部ファイルや監査記録は同梱していません。元の計画とその留保を以下に保存します。

# E5: Astra の編集の双対座標版（事前登録 v2）

> **状態**: v2 は Claude が作成したもので、⚠️未チェック。D1〜D5（2026-11-05）、凍結前クロスチェック後の F1〜F5（同日）、第 2 ラウンド後の H1〜H7（2026-11-06）はユーザーが推奨案で決定した（§9）。**凍結の成立時点は一つに定める**: ユーザーが H1〜H7 反映後の最終文面を承認し、`experiments/plans/e5_freeze_manifest.json`（§8 の 8 ファイルの sha256 と承認の記録）が書かれた時点。それまでは GPU で実行しない。
>
> **v1 を凍結しなかった理由**: 2026-11-05、ユーザーは v1 を「提案どおり凍結」と指示した。凍結前の敵対的レビューを行ったところ、確認済みの指摘が 48 件あった（重大 2、高 19、中 27。反証 0。5 観点で、各指摘を 2〜3 票で検証）。主なものは次の 3 点。
> 1. 推定用データの出所が自己矛盾していた。
> 2. 推定量と主要評価項目がずれていた（乖離台帳 G2）。
> 3. 主要統計量が定義されていなかった。
>
> そこで v1 は来歴として残し、凍結しない。承認済みの E5-a〜f は v2 でも変えていない。新たに必要になった設計判断は §9 でユーザーに問い、決定を記録した。
>
> **開示**（詳細は `experiments/plans/e5_blinding_audit.md`。このセッションのツール呼び出しの記録から作成。⚠️未チェック）:
> - E0〜E3 の結果ファイル（`experiments/results/wsp_geometry/`、15:28〜15:45 作成）と、それを集計した `blog/data/measurements.json`（15:45）は、v1 の執筆（15:56）より前からあった。Claude（主セッション）は v1 の執筆時にこれらを読んでいない。
> - v1 の凍結前レビュー（11/5 16:00〜16:33）では、サブエージェント 122 体のうち 68 体が、E0〜E3 の結果ファイルの中身を表示しうるコマンドを実行した。v2 はこのレビューの指摘を受けて書いた。主セッションが受け取った指摘の要約には、E3 の要約（「ゲイン 6 は局所二次モデルの外にある」。数値はレビュー側の計算で ⚠️未チェック）が含まれていた。
> - v2 の 2 回のクロスチェック（16:50〜17:16、20:42〜21:39）でも、それぞれ 10 体と 12 体が、結果ファイルか、結果を要約した文書（`measurements.json`、`blog/feature/evidence.json`、`blog/claims_evidence.json`、`blog/implementation_status.md`）を表示した。1 回目の指摘の 1 件は、E1・E3 のログにある順伝播の所要時間を引用していた。
> - 2026-11-06 00:57、主セッションは開示の確認の途中で `blog/feature/evidence.json` の一部を表示し、E1 の再構成誤差と E2 の較正の結果に関する記述（値を含む）を見た。
> - 仕様のどの数値も、E0〜E3 の結果から取っていない。結果に依存することが分かっている設計は、小さい効果での照合点 P_L を加えたこと（D4）だけである。ただし、v2 以降の設計判断（F1〜F5、H1〜H7 を含む）は、結果を読んだレビューの指摘を受けて行ったので、結果に影響されなかったとは言えない。
>
> **既存の計画との関係**: `wsp_execution_v1.json` と `p_astra_amendment_v02.md` は書き換えない。E4 側に必要な 2 つの変更（E5 が先に抽出した問題を E4 の練習問題プールから除くこと。E5 の teacher-forced 部分の消費を E4 の実施判断の前に 40 時間から差し引くこと）は、修正ファイル `p_astra_amendment_v03.md` として記録する（D5・F4 で承認済み）。E4 の実行者には、引き継ぎ文書でこの修正ファイルを読むよう明示する（H7。凍結済みの E4 文書は書き換えない）。v03 も凍結時に manifest でハッシュする。文書間の優先: 食い違うときは JSON → 本 md → 引き継ぎ文書の順に優先する。

---

## 0. 要点（5点）
1. **問い**: Astra のスイッチと部位をそのままにして、書き込む方向だけを替える。反復への効果が同じになるよう合わせたとき、保留した生産的テキストでの KL は小さくなるか。
2. **推定量（D2）**: コストは生産的位置だけで測る（G_prod）。効果は反復の標的位置で測る（b）。推定量は d_C = (G_prod + λI)⁻¹ b。これは「生産的 KL の二次近似を、反復の読み出しの一次変化を固定して最小にする方向」であり、主要評価項目（E5-a）と同じ量を最適化する。v1 の G は全位置から作っていた。
3. **予測と照合点**:
   - 予測は、測る量と同じ二次形式で書く。Q_E(d) = dᵀ G_E d / (dᵀ b_M)²。X:C の予測比は Q_E(d_X)/Q_E(d_C)。
   - 効果を合わせる点は2つ置く。一つは主要比較の点 P（A のゲイン 6）。もう一つは理論を検証するための点 P_L（A の用量 0.03、ゲイン 0.18。D4）。
4. **主要統計量（D3・H3）**: 評価する 32 問それぞれについて、生産的ケースの標的 16 位置での平均 KL m_i と、反復ケースでの効果 ΔR_i を求める。比 C/A は、効果で正規化したコスト mean m / (mean ΔR)² の比で測る（評価集合に残った効果のずれを補正するため）。区間は問題単位の BCa bootstrap（10,000 回、seed 20261105）で求める。最小の関心効果（SESOI）は比 0.8。判定は 4 通り（優越／劣後／同等／判定不能。この順に評価する）。
5. **退化と失敗の規則**:
   - 群 A の向きは決して変えない（乖離台帳 G3）。
   - CG が収束しない、効果を合わせられない、d* が u とほぼ同じ、C が B に潰れる、といった場合の規則を、すべて先に決めておく。

---

## 1. 仮説
- **H_dual**: 層 15・19 で Astra のスイッチのまま、書き込む方向を d_C に替えたとする。反復の読み出しへの効果を A（ゲイン 6）と同じにしたとき、保留した生産的テキストでの KL は A より小さい（主要評価項目。評価集合に残った効果のずれは、効果の二乗で正規化して補正する。§4）。
- **H_local**（理論の検証）: 小さい効果（P_L）では、実測の生産的 KL の比（平均どうしの比 mean_i m_i^X / mean_i m_i^C）が、予測比 Q_E(d_X)/Q_E(d_C) に近い（|実測/予測 − 1| ≤ 0.2）。
- **位置づけ**:
  - H_dual は実用上の問い。
  - H_local は幾何（局所二次モデル）の予測力を問う。
  - 二次モデルが外れていればゲイン 6 で H_dual が成り立たないこともありえる。その場合も、理論の破綻とは書かない（§5）。

## 2. 定義
- **部位・スイッチ・列**:
  - E1 の段階で、保存された差分 D_ℓ = W_edited − W_base（bf16 の差分を float32 にしたもの）から次を取り出し、出力する。
    - u_ℓ：D_ℓ の第一左特異ベクトル
    - M_ℓ：変化した列
    - 残差比 σ₂/σ₁
    - 列ごとのゲイン −u_ℓᵀD_{:,j}/u_ℓᵀW_{:,j}（中央値と分位）
  - **現状の E1 はこれを出力していない**。E5 の最初の段で実行し、`e5_decomposition.json` に記録する。
  - u の符号は群 A の編集式 −g·u(mask ⊙ uᵀW) では打ち消し合うが、スイッチ・K・b は u の符号で反転する。そこで SVD が返した符号を一度だけ固定し、スイッチ・K・b・全群の編集で同じ u を使う。
- **編集の族**: ΔW_ℓ(d, g) = −g · d_ℓ (mask_ℓ ⊙ u_ℓᵀ W_ℓ)。W は基底の重みで、float32 で計算する。スイッチは Astra と同じで、書き込む方向 d = (d_15, d_19) ∈ ℝ²⁰⁴⁸ だけを替える。
  - **群 A**: d = (u_15, u_19)。丸め前の理想式にあたる。参考として、保存された差分を用いた exact 版も記録する。**向きは決して変えない。**
  - **群 B**: d_B ∝ b。
  - **群 C**: d_C ∝ (G_prod + λI)⁻¹ b。
  - **群 C_alloc**: C を層ごとにスケールし、‖d_15‖ : ‖d_19‖ を A と同じ（1 : 1）にしたもの。
  - **大きさ（F5）**: どの群も d の総ノルムを ‖d‖ = √2 に正規化する（A は単位ベクトル u_15, u_19 からなるので √2）。層への配分は各群の推定のままとし、C_alloc だけ A の配分に揃える。ゲイン g はこの正規化のもとで報告する。
  - **向き（F5）**: B と C と C_alloc は、推定用集合の b に対して dᵀb > 0、すなわち一次の効果が反復の読み出し R を下げる向きにそろえる（C_alloc は層ごとの正の倍率で dᵀb ≤ 0 になりうるので、そのときは符号を反転し、反転したことを記録する。I1）。「A と同じ符号」とは書かない（uᵀb ≤ 0 のとき両者は食い違う）。
  - 推定用集合で uᵀb ≤ 0 となった場合（局所モデルが「A は反復を増やす」と言う場合）は、それ自体を主要な診断結果として報告する。**A の向きは決して変えない。**
- **反復の読み出し R**: 反復ケースの標的 16 トークン（ループの 7 回目）について、teacher-forced の対数確率を足したもの。
- **スイッチ・K・G_prod・b・G_E・b_M・b_E**:
  - スイッチの値は s_t^ℓ = (mask_ℓ ⊙ u_ℓᵀW_ℓ) a_t^ℓ = ⟨u_ℓ, W_{J,ℓ} a_t^ℓ⟩。a_t^ℓ は層 ℓ の down_proj の入力（MLP のニューロン活性）で、基底の重み（g = 0）での値。W_{J,ℓ} は W_ℓ のスイッチの列だけを残したもの。このとき ΔW_ℓ a_t^ℓ = −g s_t^ℓ d_ℓ。
  - K_t は、標的位置 t の全語彙の logits を、スイッチで重み付けたシフトの方向 c ∈ ℝ²⁰⁴⁸（δh_τ^ℓ = s_τ^ℓ c_ℓ。2 層同時）について微分したヤコビアン。シフトは重み編集と同じく、プロンプトを含む系列の**全位置** τ に当てる（標的位置だけではない）。
  - G_prod = Σ_{推定用の生産的ケース} Σ_{標的16位置} K_tᵀ Φ_t K_t
  - b = Σ_{推定用の反復ケース} Σ_{標的16位置} K_tᵀ ∇_z log p(target_t)
  - G_E は評価用の生産的ケースで、b_M はマッチング用の反復ケースで、b_E は評価用の反復ケースで、同じ式で作る。これらは予測と記録だけに使い、方向の構成には使わない。
  - 2 層の相互作用（層 19 のスイッチが層 15 の編集で変わること）は、効果には O(g²)、コストには O(g³) でしか入らない。したがって g=0 で評価した量が主要項として正しい（レビューの数学観点が玩具で確認。⚠️未チェック）。
- **減衰（E5-b の規則）**:
  - λ = γ · tr(G_prod)/n。n = 2048 は d の次元。
  - γ は {10⁻⁴, 10⁻³, 10⁻², 10⁻¹} のうち、推定用集合で CG が収束する最小の値を使う。
  - tr は Hutchinson 推定量で求める（Rademacher 32 本、seed 20261105）。
  - CG の設定: 初期値 0。残差 ‖(G_prod+λI)x − b‖/‖b‖ ≤ 10⁻³。最大 100 反復。γ の格子の 4 つの系は multi-shift CG で同時に解いてよい（収束の判定は γ ごとに真の残差で行う。I6）。
  - **どの γ でも収束しない場合、群 C は構成しない**。結果は「推定量の失敗」として報告し、H_dual は判定不能とする。
  - **感度分析（E5-b の後半。F3）**: 収束した他の各 γ についても C_γ を作り、点 P だけでマッチングして、対比 r_γ（§4 と同じ定義、BCa 区間つき）を記述用に報告する。判定には収束する最小の γ だけを使う。試運転の見積もりで 2.0 時間の上限を超える見込みなら、感度分析を先に削り、削ったことを記録する。
- **予測比**: X:C = Q_E(d_X)/Q_E(d_C)。減衰しているので、ρ(u) そのもの（減衰なしの理想値）とは比べない。Q_E は d の符号を区別しないので、予測比は各群の d_Xᵀb_M の符号とともに報告する（d_Xᵀb_M ≤ 0 の群は、P_L で正のゲインでは目標に届かず「不一致」になりうる）。

## 3. データ（D1、D5）
| 集合 | 構成規則 | 出所（D1・F4） | 大きさ（D5） |
|---|---|---|---|
| 推定用 | E2 の `make_cases` を変えずに使う（`experiments/wsp_controls/e2_controls.py`。凍結時に sha256 を記録）。生産的ケース = チャットのプロンプト＋参照解答の先頭 ≤128 トークン、標的は続く 16 トークン。反復ケース = 同じ先頭＋その末尾 16 トークンの塊 ×6、標的は塊の 7 回目。どちらも人工的に構成したループであることを明記する | **MATH train（F4）**: `DigitalLearningGmbH/MATH-lighteval`、revision `0530c78699ea5e8eb5530600900e1f328b48acad`、config `data`、split `train`（7,500 行。Astra のハーネス `wsp_public/code/mathqa.py` と同じ取得元。取得した parquet の sha256 を記録し、`eca6e667…` と一致するか照合する）。ID は `math_train:<行番号>`。`make_cases` には `problem` と `solution` を渡す。MATH-500 の問題文と一致する行は、ハーネスと同じ正規化で除く。**抽出手順**: `numpy.random.default_rng(20261105)` で行番号の順列を 1 つ作り、先頭から順に、`make_cases` が空を返す行（解答が 16 トークン以下）と MATH-500 一致行を飛ばしながら、推定用 64 → マッチング用 32 → 生成用 MATH 128 の順に取る。縮小するときは推定用の抽出順の先頭 32 問を使う | 64 問 |
| マッチング用 | 同上 | 同上（同じ順列の続き。推定用と重ならない） | 32 問 |
| 評価用 | 同上 | `wsp_execution_v1.json` の geometry.evaluation_ids の 32 問（＝ generation.problem_order[16:48]）。問題文と参照解答は `experiments/data/math500_ordered.json`（problem_order の順に並んだ MATH-500）の 16〜47 行目から取る。ID 一覧は凍結時に `e5_evaluation_ids.json` へ書き出し、両ファイルの sha256 を manifest に記録する。評価に使うだけで、選択には使わない | 32 問 |
| 生成（条件付き） | 元の生成条件（thinking、32,768 トークン、温度 0.6 ほか） | MATH は上の順列の続きから 128 問。GSM8K は `openai/gsm8k`、config `main`、split `train` を取得時の revision を固定・記録して使い、ID は `gsm8k_train:<行番号>`、`problem` = `question`、正解 = `answer` の `####` 以降を strip し、カンマを除いたもの（ハーネスの `evaluate.py` と同じ）。新しく作った別の `numpy.random.default_rng(20261105)` による行番号の順列の先頭から 128 問。上の 3 集合と重ならない | 256 問 × 2 サンプル |

**E4 との関係（F4）**: E5 は E4 より先に走るので、E5 が先に抽出し、抽出したすべての問題（縮小で使わなかったものも含む）の ID と、正規化した問題文の sha256 を `experiments/results/wsp_geometry/e5_ids.json` に書く。E4 は練習問題プール（公開 `practice/` と同じもの）から、この sha256 と一致する問題を除いて抽出する。これは E4 の凍結計画の変更にあたるので、`p_astra_amendment_v03.md` に記録する（承認: 2026-11-05 / ユーザー / F4）。

## 4. 測定と統計
- **主要評価項目（E5-a）**:
  - 問題 i、群 X について、m_i^X = 評価用の生産的ケースの標的 16 位置での KL(p_orig‖p_X) の平均。softmax は全語彙、float32。ΔR_i^X = 評価用の反復ケースでの R の変化（編集後 − 編集前）。
  - **対比（H3）**: r = log( [mean_i m_i^C / (mean_i ΔR_i^C)²] / [mean_i m_i^A / (mean_i ΔR_i^A)²] )。効果で正規化したコストの比の対数で、平均どうしの比（問題ごとの比はとらない）。局所ではコストが効果の二乗に比例するので、マッチング後に評価集合に残った効果のずれをこの正規化で補正する。
  - 95% 区間は、問題単位の BCa bootstrap で求める（10,000 回、seed 20261105。C と A は同じ問題の添字で対にして再標本化する）。
  - 比較点は P（A のゲイン 6）。
- **前提: 評価集合での効果の一致（F2・H1）**: 評価用の反復ケースで ΔR_C/ΔR_A = mean_i ΔR_i^C / mean_i ΔR_i^A（平均どうしの比、符号つき）を求め、その 95% BCa 区間（r と同じ対の再標本）が [0.8, 1.25] に入ることを主要判定の前提とする。比が負のとき、または区間が [0.8, 1.25] の外のときは、主要判定は「判定不能」とし、比 r は記述用に報告する。点推定が [0.8, 1.25] の外（または負）なら「効果が一致しない」、中なら「効果の一致が確認できない（区間が広い）」と書き分ける。前提の判定は点 P で行い、P_L でも同じ比を記述用に報告する。同じ前提を生成の実行条件にも課す。
- **判定（D3。優先順は F1）**: SESOI は比 exp(r) = 0.8（相対 20% 減）とし、比の 95% 区間で判定する。**優越 → 劣後 → 同等 → 判定不能の順に評価し、最初に当たったものを採る。**
  - **優越**: 上限 < 1。さらに点推定 ≤ 0.8 なら「実質的に小さい」と書く。
  - **劣後**: 下限 > 1。
  - **同等**: 区間全体が [0.8, 1.25] に入る（この順序では、区間が 1 を含む場合に限る）。
  - **判定不能**: 上のどれにも当たらない。「差がない」とは書かない。
  - 優越または劣後で、区間が [0.8, 1.25] の中にもある場合は「同等域内の優越／劣後（差は小さい）」と付記する。生成の関門（E5-d）の「優越」には、同等域内の優越も含める。
  - 群 C が点 P で目標に届かない（§6 の「不一致」）場合は、主要判定は「判定不能（C が効果に届かない）」とする。
- **効果の一致の確認（必須の副次項目）**:
  - 評価用の反復ケースで、両点の各群の ΔR_X/ΔR_A（平均どうしの比）を区間つきで報告する（点 P の C は上の前提の判定に使う）。
  - 正規化しない KL の比: r_raw = log(mean_i m_i^C / mean_i m_i^A)、区間つき（記述用）。
  - **B 対 C（H5、記述用）**: 点 P で r_BC = log(mean_i m_i^B / mean_i m_i^C)、同じ BCa 区間つき。計量の効果を分けるための対比で、判定はしない。
- **副次評価項目**（記述用。多重性の補正はしない）:
  1. P_L での実測比 mean_i m_i^X / mean_i m_i^C（平均どうしの比）と予測比 Q_E(d_X)/Q_E(d_C) の一致（H_local。D4）。一致の区分は |実測/予測 − 1| ≤ 0.2（I4）。予測比は d_Xᵀb_M の符号とともに報告する。P_L で A が逆符号のときは「評価不能」（H2）
  2. 生産的な継続の Δ log-prob
  3. 反復位置での非標的 KL: KL(p_orig‖p_X)、どちらも標的トークンを除いて再正規化した分布
  4. 各層の G 計量での cos(u_ℓ, d_C,ℓ)（G は減衰なしの G_prod の層 ℓ の対角ブロック）と、d_C の層間配分
  5. 交差適合: 推定用の問題を `default_rng(20261105).permutation` の前半と後半（64 問なら 32/32）に分け、半分ごとに Hutchinson と γ の選択をやり直して d̂₁ と d̂₂ を作る。G 計量（全体の減衰なし G_prod）での cos(d̂₁, d̂₂) と、保留した半分での予測優位 Q_{h′}(u)/Q_{h′}(d̂_h) を報告する（Q_{h′}(d) = dᵀG_{h′}d/(dᵀb_{h′})²。G_{h′} と b_{h′} は保留した半分 h′ で作る）
  6. 退化の診断:
     - G と b に寄与する位置の参加比 (Σ_t w_t)²/Σ_t w_t²（G 側は w_t = tr(K_tᵀΦ_tK_t) の Hutchinson 推定の位置ごとの内訳、b 側は w_t = ‖K_tᵀ∇_z log p(target_t)‖²）
     - cos_G(d_C, d_B)（G は減衰なしの G_prod）。C が B とほぼ同じかを見る
     - cos_G(d_C, u)。d* が u とほぼ同じかを見る
  7. 層の配分の交絡を分ける群 C_alloc: C を層ごとに A と同じノルム配分にスケールしたもの（D2 の付帯）。点 P で r_alloc = log(mean_i m_i^{C_alloc} / mean_i m_i^C)、同じ BCa 区間つき（I3）
- **生成（条件付き）**:
  - 指標は正答率（対応付き）と空白打切り率。空白打切りは「上限で打ち切られ、末尾 64 トークンがすべて空白類のトークン」と定義する（D5）。
  - 編集は bf16 の重みとして実体化する（W + ΔW を bf16 にキャスト。Astra の評価と同じ）。**群 A と C はどちらも式版**（d と g から ΔW を作る。H6）で、A は g = 6、C は点 P で合わせた g_C を使う。保存差分の exact 版は teacher-forced の参考としてだけ記録する。
  - プロンプトと採点は Astra の評価ハーネス（`experiments/data/wsp_public/code/` の `evaluate.py`・`mathqa.py`）と同じにする（H6）。チャットテンプレートは enable_thinking=True、ユーザーの発話は問題文＋改行＋\boxed の指示（`mathqa.build_prompt`）。採点は、応答の最後の \boxed{} の答えを math-verify 0.9.0 で正解と照合する strict 判定（`mathqa.is_correct`。ハーネスの主指標と同じ）。正解は、MATH train では参照解答の最後の \boxed（`mathqa.gold_of_solution`）、GSM8K train では §3 のとおり。
  - サンプリングは `profiles.py` の qwen35think と同じ（温度 0.6、top_p 0.95、top_k 20、presence_penalty 1.5、32,768 トークン）で、seed は 0（`wsp_execution_v1.json` の generation と同じ。H6）。空白類のトークンは `tokenizer.decode([id]).strip() == ""` となるトークンとする。
  - 実行条件は §7 のとおり（主要判定が優越、評価集合で効果が一致、E4 の後の残り予算で完了できる見積もり）。
  - 検出力は低い（C が A の半分の率でも 0.4 前後というレビューの試算。⚠️未チェック）。そのため記述にとどめる。

## 5. 事前に決める読み方
| 結果 | 読み方 |
|---|---|
| （前提）評価集合で効果の一致が成り立たない（ΔR_C/ΔR_A が負、または区間が [0.8, 1.25] の外） | 主要判定は「判定不能」。点推定が [0.8, 1.25] の外（または負）なら「効果が一致しない」、中なら「効果の一致が確認できない（区間が広い）」と書く。比 r は記述用に報告する。生成は行わない |
| 優越（上限 < 1） | 双対座標の方向は、効果あたりの生産的 KL（効果で正規化したコスト）を減らした。点推定 ≤ 0.8 なら実質的な改善と書く。区間が [0.8, 1.25] の中にもあれば「差は小さい」と付記する |
| 劣後（下限 > 1） | 双対方向のほうが悪い。原因は次のどれかとして検討する（どれかに断定はしない）。P が局所領域の外にあること（H_local の結果と照合）、交差適合での不安定さ（推定の雑音）、層の配分（C_alloc と比べる）。区間が [0.8, 1.25] の中にもあれば「差は小さい」と付記する |
| 同等（区間が 1 を含み、[0.8, 1.25] に入る） | 中間層では、ユークリッドの方向（Astra）で実質的に十分 |
| 判定不能 | 検出力不足（または C が効果に届かない、推定量の失敗）として報告する。「差がない」とは書かない |
| H_local: P_L で、実測比を予測比で割った値が [0.8, 1.2] に入る | 局所の幾何は、この部位で方向の優劣を予測する道具になる（記述用の区分）。P_L で A が逆符号なら「評価不能」 |
| 退化 | d_C ≈ u（G 計量の cos > 0.95）なら「Astra の対照方向は、すでに自然な方向に近かった」と書く。C ≈ B（G 計量の cos(d_C, d_B) > 0.95。F5）なら「計量は方向をほとんど変えなかった」と書く（減衰によるのか、b が G_prod の固有ベクトルに近いのかは区別しない。I2） |

## 6. 計算の実装
- **積の計算**: JVP は自動微分で求める（`torch.func.jvp`、使えなければ double-VJP の技法）。VJP も自動微分。計算は float32 で行う。有限差分は検算だけに使う。検算の定義（F5・I5）: 推定用の最初の生産的ケースについて、層 15 の down_proj の出力を標的 16 位置で並べた h（16 × 1024）を考える。方向 v は、c = u_15（単位ベクトル。§2 で固定した符号）を 16 位置すべてに置いたもの、刻みは ε‖h‖_F（Frobenius ノルム）。中心差分 [f(h + ε‖h‖_F v) − f(h − ε‖h‖_F v)]/(2ε‖h‖_F) を、標的 16 位置の全語彙 logits を並べたベクトルとして取り、自動微分の JVP（同じ v）との相対差 ‖FD − JVP‖₂/‖JVP‖₂ を測る。ε ∈ {10⁻³, 10⁻²} の両方で 10⁻² 未満なら合格。逆モードの検査は、標的 16 位置の logits の和の勾配が、層 15・19 の down_proj の出力で有限かつ零でないことを合格とする。
- **乱数**: 用途ごとに `numpy.random.default_rng(20261105)` を新しく作る（MATH の抽出、GSM8K の抽出、Hutchinson、BCa の再標本、交差適合の分割）。Hutchinson の Rademacher ベクトルは `rng.integers(0, 2, size=(32, 2048)) * 2 - 1` を一度に引いて torch に渡す。BCa の再標本は問題の添字 `rng.integers(0, 32, size=(10000, 32))` を一度に引き、すべての区間（r、前提の比、r_raw、r_BC、r_alloc、r_γ）で同じ添字を使う。BCa の加速度は問題単位の jackknife で求める。
- **事前の確認（preflight）**: 短い1系列で次を確かめ、記録する。
  - 線形注意の実装（融合カーネルか、torch の参照実装か）とパッケージの版
  - logits から層 15・19 の書き込みまで、逆モードの自動微分が通るか
  - 自動微分の JVP と有限差分の JVP の相対差 < 10⁻²
  - どれかが通らない場合は、torch の参照実装に切り替えて再確認する。それでも通らなければ、**E5 は中止して報告する**。有限差分だけで G v を作る代替経路は、2048 方向の差分が必要なので採らない（v1 の記述は実行不可能だった）。
- **マッチング（F5）**: 目標は、マッチング用集合での A の実測 ΔR（点 P なら g_A = 6、点 P_L なら g_A = 0.18）。各群のゲインは次の手順で決める。
  - 先に、[g_A/64, 64·g_A] を対数で等分した 8 点の格子で ΔR(g) を測り、単調性を確かめる。
  - 目標を挟む格子区間で二分探索する（最大 40 回。終了は、マッチング用集合での ΔR が目標の 1% 以内）。
  - 単調でなければ、目標を最初に横切る区間を採り、単調でなかったことを記録する。
  - 格子の端でも目標に届かない群は「不一致」と記録し、その点での主要比較から外す。C が P で不一致なら主要判定は「判定不能（C が効果に届かない）」（§4）。
  - **点 P で**マッチング用集合での A 自身の実測 ΔR が R を上げる向き（逆符号）なら、マッチングは定義できないので E5 を止めて報告する。**点 P_L で**逆符号なら、P_L のマッチングは行わず、H_local を「評価不能」と記録し（ΔR_A(P_L) と uᵀb_M を記録する）、主要解析は続ける（H2）。
- **玩具での検証（V20）との差**（⚠️未チェック）: V20（`experiments/verify_identities.py` の `check_v20`）は、全系列が 1 つの反復モチーフを共有する設定で、減衰なしの厳密解を使い、全群を固定の小さい目標に合わせ、マッチング用集合で一次の符号が逆の群（A を含む）を除いて合格した。記録しなかった 2 回の試運転では、系列ごとに独立のモチーフと、3 つのモチーフの集合で、推定用からマッチング用への転移が成り立たなかった（JSON の toy_checks.V20）。本番の反復ケースは問題ごとに異なる 16 トークンの塊を繰り返すので、独立のモチーフの側に近い。A の実測 ΔR に合わせること、A の逆符号での停止、λ と CG の手順は、玩具では実行していない。推定用からマッチング用・評価用への転移は仮定であり、交差適合（§4 の副次 5）と評価集合での効果の一致（F2）が、その監視項目である。

## 7. 計算資源と順序（D5）
- teacher-forced 部分は E3 の後、E4 の前に置く（E5-e）。上限は経過時間 2.0 時間（共有 GPU 上の実時間。試運転を含む）。
- **見積もり（F5）**: 試運転（2 系列）で、1 系列あたりの順伝播・VJP・JVP の所要時間を測り、次の演算回数から全体を見積もる: 推定（G v 積 × CG 反復 ≤ 100 × γ 4 値、Hutchinson 32 本、b の VJP）、交差適合（半分ずつでの再推定）、マッチング（格子 8 点＋二分探索 ≤ 40 回 × 群 3 × 点 2）、評価（32 問 × ケース 2（生産的・反復）× 群 4 × 点 2、群 A の exact 版、感度分析の C_γ の点 P での評価）、予測（G_E と各群の d、b_M、b_E）、感度分析。見積もりが上限を超える場合は、**感度分析 → 交差適合 → 推定用 64→32 問（抽出順の先頭 32 問）の順に削る**（H4）。それでも超える場合は中止して報告する。本番で経過時間が 2.0 時間に達したら、その時点で止めて報告する。中断から再開した場合、経過時間は通算する。
- **GPU の使い方**: 自分の使用は 20 GiB まで、6 GiB を他の利用者のために残す（`wsp_execution_v1.json` の budget）。同時に 1 ジョブ。OOM になったら止めて報告する（再試行はしない）。
- **勘定（F5）**: 共有 GPU の経過時間と専有時間を別々に記録し、40 時間の予算からは経過時間を差し引く（保守側）。E5 の消費は E4 の実施判断より前に差し引く（D5。`p_astra_amendment_v03.md`）。
- **生成部分の条件（E5-d, F2, F5）**: 主要判定が優越（同等域内の優越を含む）、評価集合で効果が一致、かつ E4 の後の残り予算で生成（256 問 × 2 サンプル × 群 2、32,768 トークン）を完了できると見積もれる場合だけ行う（見積もりは、E4 の実施判断と同じく E0 の実測速度から行う。`p_astra_amendment_v02.md` 第 2 項）。途中で終わった場合は未完了として報告し、値を割り当てない。
- 記録するもの: 評価呼び出し数、処理トークン数、各ジョブの経過時間（共有 GPU 上の実時間と、専有時間の区別）、CG の反復数と残差、γ、preflight の結果、抽出したすべての問題 ID、seed。

## 8. 凍結の手続き
- **凍結の対象**（8 ファイル）: 本 md、`e5_dual_edit_v2.json`、`e5_codex_handoff.md`、`p_astra_amendment_v03.md`、`e5_blinding_audit.md`、`experiments/wsp_controls/e2_controls.py`、評価用の本文を取る `experiments/data/math500_ordered.json`、凍結時に `wsp_execution_v1.json` の geometry.evaluation_ids を書き出す `e5_evaluation_ids.json`。
- **手続き**（`experiments/plans/freeze_e5.py`）:
  1. `--digest` が、`e5_evaluation_ids.json` を除く 7 ファイルの sha256 と、それらをまとめたダイジェストを出す。
  2. ユーザーが最終文面を承認し、`tasks/todo.md` の決定ログに、日付・決定者・承認したダイジェストを記録する。
  3. `--stamp` に承認の記録（ユーザーの発言の引用、日付、ダイジェスト）を渡す。`--stamp` は、現物のダイジェストが渡されたものと一致し、決定ログにそのダイジェストがあるときだけ進む。`e5_evaluation_ids.json` を書き、JSON の `frozen_at` と `spec_md_sha256` の 2 欄だけを文字列の置換で埋め（ほかの文字は変えない）、`experiments/plans/e5_freeze_manifest.json` に 8 ファイルの sha256、frozen_at、承認の記録を書く。
  4. 実行者は最初に `freeze_e5.py --verify` を実行する。8 ファイルの sha256、JSON の 2 欄、そして JSON の 2 欄を戻したものが承認時の sha256 と一致することを確かめる（不一致なら実行しない）。
- **変更管理**: 凍結後の変更は、理由を書いた新しい修正ファイルと、ユーザーの承認（`tasks/todo.md` の決定ログに日付・決定者・理由）を要件とする。実行者（Codex・Claude のいずれも）は自分で仕様を修正しない。仕様に書かれていないことに出会ったら、止めてユーザーに問う。
- 実装が仕様と食い違ったときは、止めて報告する（前例: 乖離台帳 G1）。
- 結果の出力先: `experiments/results/wsp_geometry/e5_*.json(l)`。**出力に含めるもの（F5）**: 問題ごとの m_i^X と ΔR_i^X（全群・全点）、各群の d（float32）、γ・λ・tr の推定値・CG の反復数と残差、マッチングの格子と探索の履歴、preflight の結果、抽出したすべての問題 ID と seed、各ジョブの経過時間と専有時間、符号の診断（uᵀb、uᵀb_M、uᵀb_E、各群の d_Xᵀb と d_Xᵀb_M、cos(b, b_M)）、そして各結果ファイル自身に凍結時のハッシュ（manifest の sha256、spec_md_sha256、JSON の sha256、frozen_at）と、適用した修正ファイルの名前（あれば）。BCa の再計算が出力だけからできること。

## 9. 決定の記録（ユーザー）
| ID | 論点 | 選択肢 | 採った案（推奨案） |
|---|---|---|---|
| D1 | 推定用・マッチング用の出所 | (a) E2 と同じ人工構成を MATH の train に当てる。データセットの取得が要る<br>(b) 同じ構成を MATH-500 の残り（problem_order[48:]）に当てる。取得は不要だが、ベンチマークを方向の構成に使う<br>(c) 先に Qwen 自身の練習回答を生成する。高価で、順序も変わる | **(a)**。ベンチマークを選択に使わず、E2 と同じ構成なので比較もしやすい |
| D2 | 群 C の計量 | (i) G_prod（生産的位置のみ）。主要評価項目と同じ量を最適化する<br>(ii) v1 の全位置 G を残し、主要評価項目を記述用に格下げする | **(i)**。付帯として C_alloc（層配分を A に揃えた C）を入れる |
| D3 | 主要統計量と判定 | 平均どうしの比の対数、BCa、SESOI 0.8、4 通りの判定（§4）／平均差 C−A の percentile 区間（v1 に近い） | **前者**。裾が重く、問題が 32 しかないので、比と BCa のほうが偽陽性に強い |
| D4 | 理論検証の照合点 P_L | 用量 0.03（g = 0.18）／0.1（g = 0.6）／置かない | **0.03**。E3 の格子にあり、局所領域の内側にある |
| D5 | 大きさと上限 | 推定用 64・マッチング用 32・評価用 32 問、teacher-forced の上限 2.0 時間、生成は 256 問 × 2、空白打切りの定義（§4） | **左記のとおり** |

決定の記録: 2026-11-05 / ユーザー / D1〜D5 すべてを推奨案で決定（「推奨案で凍結」）。理由: 凍結前レビューの指摘を反映した v2 の推奨案を選択。
- D1 = (a) MATH の train
- D2 = (i) G_prod（C_alloc を付帯）
- D3 = 平均どうしの比、BCa、SESOI 0.8、4 通りの判定
- D4 = 用量 0.03
- D5 = §3 と §7 の規模・上限（E4 の実施判断の前に 40 時間の予算から差し引くことを含む）

E5-a〜f（2026-11-05、ユーザーが提案どおり承認）の選択は変えていない。ただし E5-b の後半（感度分析）は v2 の初稿で落ちていたので、§2 に操作的な定義を戻した（F3）。

**凍結前クロスチェック後の決定 F1〜F5**（2026-11-05 / ユーザー / 「推奨案で決定」。理由: クロスチェック（4 観点、各指摘 2 票、確認済み 49 件）の指摘を反映した推奨案を選択。詳細は `e5_v2_freeze_blockers.md`）:
- F1 = 判定の優先順: 優越 → 劣後 → 同等 → 判定不能。同等域内なら付記（§4）
- F2 = 評価集合での効果一致を主要判定と生成の前提にする。基準は ΔR_C/ΔR_A の 95% BCa 区間 ⊂ [0.8, 1.25]（§4, §5）
- F3 = γ の感度分析: 収束した他の γ で C_γ を作り、P で合わせて r_γ を記述用に報告（§2）
- F4 = データの出所と抽出手順を固定し、E5 が先に抽出して E4 が除外する（§3。E4 側は `p_astra_amendment_v03.md`）
- F5 = マッチングの細則と既定値（§2 の大きさと向き、§4 の正規化コスト、§5 の C ≈ B、§6 の格子・探索・不一致・逆符号・preflight、§7 の見積もりと勘定、§8 の出力）

**第 2 ラウンドのクロスチェック後の決定 H1〜H7**（2026-11-06 / ユーザー / 「推奨案で決定」。理由: 2 回目のクロスチェック（workflow wkqbd0d7s、4 観点、各指摘 2 票、確認済み 39 件）の指摘を反映した推奨案を選択。詳細は `e5_v2_freeze_blockers.md` の第 2 ラウンド）:
- H1 = 効果一致の前提統計量は平均どうしの比（符号つき、r と同じ対の再標本で BCa）（§4）
- H2 = A の逆符号で E5 を止めるのは点 P だけ。P_L では H_local を「評価不能」とする（§6）
- H3 = 主要対比を効果で正規化したコストの比にし、効果一致 [0.8, 1.25] は前提として残す（§4。D3 の比・BCa・SESOI・4 通りの判定はこの対比に適用する）
- H4 = 予算超過時の縮小順は 感度分析 → 交差適合 → 推定用 64→32（§7）
- H5 = 点 P での B 対 C の対比を記述用に登録（§4）
- H6 = 生成のプロンプトと採点は Astra の評価ハーネスと同じ、seed 0、A と C は式版（§4）
- H7 = E4 の実行者に v03 を読むよう引き継ぎで明示する（冒頭「既存の計画との関係」、引き継ぎ文書）

**最終文面に含まれる、Claude が埋めた細目 I1〜I6**（2026-11-06 / Claude が提案。第 2 ラウンドのクロスチェックで「ユーザーの確認を要する」とされたが H1〜H7 に入っていなかったもの。最終文面の承認をもってユーザーの決定とする。⚠️未チェック）:
- I1 = C_alloc の向き: F5 の規則（dᵀb > 0）を C_alloc にも当て、必要なら符号を反転して記録する（§2）。代替: 反転せず「不一致」として比較から外す
- I2 = C ≈ B の読み方: 「計量は方向をほとんど変えなかった」とだけ書き、原因（減衰か、b が G_prod の固有ベクトルに近いか）は区別しない（§5）。代替: 収束した γ ごとの cos_G で読み分ける
- I3 = C_alloc 対 C の対比: 点 P で r_alloc = log(mean m^{C_alloc} / mean m^C)、BCa、記述用（§4。H5 と同じ形）。代替: 登録しない
- I4 = H_local の一致: 実測比は平均どうしの比、一致は |実測/予測 − 1| ≤ 0.2（「±20%」の読み。§4）。代替: 対数尺度 |log(実測/予測)| ≤ log 1.2
- I5 = 有限差分検算: 方向 c = u_15、刻みは標的 16 位置のブロックの Frobenius ノルム（§6）。代替: 単位乱数ベクトル、位置ごとのノルム
- I6 = CG: γ の 4 つの系を multi-shift CG で同時に解いてよい（収束の判定は γ ごと。§2）。代替: γ ごとに別々に解く（演算は最大 4 倍）

凍結の手続き（§8）も、第 2 ラウンドの指摘を受けて変えた: 対象を 8 ファイルにし（v03、盲検の監査記録、MATH-500 の本文を追加）、承認したダイジェストを `--stamp` が照合する。最終文面の承認と凍結の記録は、`tasks/todo.md` の決定ログと manifest に書く（本 md に書くとハッシュが変わるため）。

## 10. v1 からの変更（レビューの指摘との対応）
- 重大 2 件: データの出所 → §3（D1）。
- 高 19 件:
  - 推定量と評価項目のずれ → D2（G_prod）と Q_E
  - 減衰下の予測比 → §2
  - 局所域の外での比較 → P_L（D4）
  - 主要統計量の定義 → §4（D3）
  - 効果の一致の確認 → §4
  - 有限差分の雑音と代替経路の不可能性 → §6
  - 上限 → §7（D5）
  - 過学習の診断 → 交差適合
  - ほか
- 中 27 件:
  - 群 A の向き → §2（G3）
  - 縮退の規則 → §5
  - E1 の分解の出力 → §2
  - 凍結の手続き → §8
  - ブログの言い過ぎ → ブログ v0.3 を修正（G4）
  - V19 の上限の切り上げ → 2.2×10⁻³
  - ほか
- 低 9 件（未検証）: 生成部分の定義と、判定条件の曖昧さ → §4、§5 に反映。
