# 引継ぎ — ev_new（5/26版）別 Window 用

**新しい Cursor Window では、このファイルを最初に `@` 参照して読ませること。**

詳細仕様: [`docs/session-handoff-ev-new-20260526.md`](session-handoff-ev-new-20260526.md)

**163 で処理を持ち込んで再計算:** [`docs/session-handoff-ev-new-163-deploy.md`](session-handoff-ev-new-163-deploy.md)

---

## 1. 結論（データは残っているか？）

### 133（旧コードサーバー）— **2026-06-02 時点で確認済み**

| 項目 | 状態 |
|------|------|
| **DB の ev_new 行** | **残っている**（`status=ok` **5,166 件**） |
| 日付範囲 | 2021-01-05 〜 **2026-05-03** |
| 2026年 ◎1着率 | **12.3%**（1,194 レース）— スクショと一致 |
| `ai_snapshot_json` | `method: ev_new`、各馬の `ev_new` / `win_prob_new_pct` 入り |
| **ソースコード** | **消えている**（下記ファイルすべて無し） |

```bash
# 133 で確認したコマンド（再実行可）
cd /var/www/html/ai-horse-race.maspis.com
python3 -c "
from collectors.db_util import connect
c=connect()
with c.cursor() as cur:
    cur.execute(\"\"\"
      SELECT profile_key, COUNT(*) c, MIN(race_date), MAX(race_date)
      FROM all_race_ai_profile_compare
      WHERE profile_key='ev_new' AND status='ok'
    \"\"\")
    print('ev_new:', cur.fetchone())
    cur.execute(\"\"\"
      SELECT COUNT(*) n, ROUND(100*SUM(match_honmei_winner=1)/COUNT(*),1) pct
      FROM all_race_ai_profile_compare
      WHERE profile_key='ev_new' AND status='ok'
        AND YEAR(race_date)=2026 AND winner_umaban IS NOT NULL
    \"\"\")
    print('2026 honmei:', cur.fetchone())
c.close()
"
```

**期待される出力例:**

```
ev_new: {'profile_key': 'ev_new', 'c': 5166, ...}
2026 honmei: {'n': 1194, 'pct': Decimal('12.3')}
```

### 163（新本番）— **要確認**

- 本番は **`163.44.117.9`** … `/var/www/html/tools.kachiumaai.com`
- レース・オッズは 22k 規模。**ev_new が何件あるかは 163 に SSH して同じ SQL で確認すること**
- 133 の DB を 163 にリストアすると **本番データが劣化する**（133 の方がレース数が少ない）ので、通常は **リストア不要**

---

## 2. 何が残っていて何が無いか

| 種類 | 残っている？ | 場所・備考 |
|------|-------------|-----------|
| **予想データ（ev_new）** | ✅ 133 DB に 5,166 件 | `all_race_ai_profile_compare.profile_key='ev_new'` |
| p6_latest / ev_forecast | ✅ 同数 5,166 件 | 別ロジック。混同しない |
| **計算ロジック** | ❌ | `ai/win_prob_ev_new.py` |
| **取込バッチ** | ❌ | `scripts/import_all_race_ev_new_compare.py` |
| **一覧画面** | ❌ | `public/all_race_compare_profiles_new.html` |
| **集計 API** | ❌ | `public/api/all_race_compare_profiles.php` |
| 仕様メモ | ✅ | `docs/session-handoff-ev-new-20260526.md`（本ファイル含む） |

**画面を再表示するには「DBデータ」＋「消えた4ファイルの復元」の両方が必要。**

---

## 3. このデータの正体（5/26 スクショの処理）

```
predictions（stage1 のモデルスコア）
  → softmax 勝率100%（温度10）
  → × 単勝オッズ
  → 期待値(New) の降順で ◎〇▲△
  → all_race_ai_profile_compare（profile_key=ev_new）
  → 画面 all_race_compare_profiles_new.html（PROFILE_KEY=ev_new）
```

**6月以降の `prob_odds` / `base_forecast` / `ev_forecast` とは別物。** 対象外。

### スクショの KPI（2026年・ev_new）

| 指標 | 値 |
|------|-----|
| ◎1着的中率 | **12.3%** |
| ◎単勝回収率 | **73.0%** |
| 馬連 ◎-〇 回収 | **69.2%**（48/1193） |
| 馬連 ◎-▲ 回収 | **557.2%** |
| 馬連 ◎-△ 回収 | **329.8%** |
| 3点合計回収 | **318.8%** |

---

## 4. 環境（固定）

| 項目 | 値 |
|------|-----|
| **作業すべき本番** | `163.44.117.9` … `/var/www/html/tools.kachiumaai.com` |
| コード編集用（133） | `133.130.90.66` … `/var/www/html/ai-horse-race.maspis.com` |
| MySQL | `keiba_ai`（**133 と 163 は別 DB**） |
| ブラウザ（DNS 未設定時） | `http://163.44.117.9/public/all_race_compare_profiles_new.html` |
| モデルパス | `ai/models/stage1_lgbm_enhanced.txt` + `.meta.json` |
| Windows JV | `C:\Users\oshim\jrvltsql` |
| オッズ手順 | `docs/ops_odds_2020_tansho_umaren.md` |

---

## 5. 別 Window でやること（1 STEP ずつ）

### STEP 0 — 接続先を確認

```bash
hostname -I    # 163.44.117.9 なら本番
pwd            # /var/www/html/tools.kachiumaai.com であること
```

### STEP 1 — ev_new 件数を確認（接続先の DB）

```bash
mysql keiba_ai -e "
SELECT profile_key, COUNT(*) c, MIN(race_date), MAX(race_date)
FROM all_race_ai_profile_compare
WHERE profile_key='ev_new' GROUP BY profile_key;
"
```

- **0 件** → STEP 3（全件取込）が必要
- **5,000 件前後** → データは既にある。STEP 2（画面復元）を優先

### STEP 2 — 消えたファイルを復元

**優先順:**

1. `ai/win_prob_ev_new.py` … [`session-handoff-ev-new-20260526.md` 付録 A](session-handoff-ev-new-20260526.md) の全文をそのまま保存
2. `scripts/import_all_race_ev_new_compare.py` … Agent transcript `541544e7-0691-4145-af5c-d09a4920c978` の 2026-05-26 `Write` から復元
3. `public/all_race_compare_profiles_new.html` … 同上
4. `public/api/all_race_compare_profiles.php` … git `15d76c4` ベース + transcript の `ev_new` 馬連分岐

git から PHP の骨格を取る例（163 上）:

```bash
cd /var/www/html/tools.kachiumaai.com
git show 15d76c4:public/api/all_race_compare_profiles.php > public/api/all_race_compare_profiles.php
```

### STEP 3 — 163 で ev_new 全件取込（データが無い／更新したい場合）

```bash
cd /var/www/html/tools.kachiumaai.com
mkdir -p logs
nohup python3 scripts/import_all_race_ev_new_compare.py \
  --from-date 2020-01-01 --to-date 2026-12-31 \
  --model-path ai/models/stage1_lgbm_enhanced.txt \
  --model-meta-path ai/models/stage1_lgbm_enhanced.meta.json \
  >> logs/import_ev_new_$(date +%Y%m%d_%H%M%S).log 2>&1 &
tail -f logs/import_ev_new_*.log
```

成功: ログ末尾 `done ok=... err=0`

### STEP 4 — KPI 確認（スクショと同じ数字か）

```bash
mysql keiba_ai -e "
SELECT COUNT(*) n,
  ROUND(100*SUM(match_honmei_winner=1)/COUNT(*),1) honmei_pct
FROM all_race_ai_profile_compare
WHERE profile_key='ev_new' AND status='ok'
  AND YEAR(race_date)=2026 AND winner_umaban IS NOT NULL;
"
```

**目安: n≈1194, honmei_pct≈12.3**

### STEP 5 — 画面確認

```
http://163.44.117.9/public/all_race_compare_profiles_new.html
```

年=2026、強制再読み込み（Ctrl+Shift+R）。

---

## 6. やってはいけないこと

- 133 の DB を 163 にリストア（本番データが減る）
- `p6_latest`（prob_odds 版）や `ev_forecast` と ev_new を混同
- 133 で再予想して終わる（本番は 163）

---

## 7. 別 Window へのコピペ用プロンプト

```text
@docs/session-handoff-ev-new-window.md と @docs/session-handoff-ev-new-20260526.md を読んで、
163 本番で ev_new（2026-05-26 版・期待値 New）を復元して。
DBに ev_new が残っているか先に確認。消えたソースファイルを復元してから画面を出す。
6月以降の base_forecast / ev_forecast / prob_odds は対象外。1 STEP ずつ。
```

---

## 8. 関連ファイル一覧

| ファイル | 役割 |
|----------|------|
| **本ファイル** | 別 Window 用・データ残存確認・手順 |
| `docs/session-handoff-ev-new-20260526.md` | ロジック詳細・付録（win_prob_ev_new.py 全文） |
| `docs/session-handoff-ev-forecast-20260615.md` | **6月以降**の別設計（読まなくてよい） |
| `docs/ops_odds_2020_tansho_umaren.md` | 2020〜オッズ取込 |

---

最終更新: 2026-06-02（133 DB 実測: ev_new 5,166 件・2026年 ◎12.3% 確認）
