# セッション引継ぎ — ベース予想・期待値予想（2026-06-15）

**次の Cursor（新 Windows）でこのファイルを最初に読むこと。**

---

## 1. 結論（データはどこにあるか）

| 場所 | IP | パス | MySQL `keiba_ai` | 役割 |
|------|-----|------|------------------|------|
| **新本番（やるべき場所）** | `163.44.117.9` | `/var/www/html/tools.kachiumaai.com` | **本番データ**（オッズ取込済み・p6 再予想 22,191 件の履歴あり） | 画面表示・本番再予想は **ここ** |
| **旧コードサーバー（今回誤って走らせた）** | `133.130.90.66` | `/var/www/html/ai-horse-race.maspis.com` | **別DB**（レース約 5,166 件分のみ） | コード編集用。ここで走らせた再予想は **本番に反映されない** |

**「データもまさか旧サーバにあるんか？」への答え:**

- **レース・オッズ・過去の p6 比較表の本番データ → 163 の MySQL**
- **今回の `ev_forecast` 再予想 5,166 件 → 133 の MySQL にだけ書いた**（2026-06-15 完了 `done ok=5166 err=0`）
- 新 Windows では **163 に SSH してコード同期 → 163 で再予想** が正しい

DNS `tools.kachiumaai.com` は未設定のことが多い。ブラウザは `http://163.44.117.9/...` で確認。

---

## 2. 用語（p6 は使わない）

| 名称 | profile_key | 説明 |
|------|-------------|------|
| **ベース予想** | `base_forecast` | オッズ無し。全馬順位・◎〇▲△・勝率見立て |
| **期待値予想** | `ev_forecast` | ベース＋単勝オッズで期待値。**公開画面はこちら** |
| ~~p6_latest~~ | 廃止 | CLI の `--profile p6_latest` は `ev_forecast` へのエイリアスのみ |

仕様書: `docs/spec/06_forecast_base_and_ev.md`

---

## 3. 設計の要点（会話で合意したこと）

### 3段階

1. **ベース予想** … LightGBM＋第2段階。`rank_accuracy` で ◎〇▲△。**オッズは使わない**
2. **勝率の数値化** … 全馬に `win_rate`（モデル生出力。按分しない）。切る馬だけ 0%
3. **期待値** … `win_rate × 単勝オッズ`。**◎の付け替えはしない**

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

- 全馬で勝率 100% 按分
- `prob × odds` で ◎を決める（旧 p6 のバグ）
- 5位以下だから切る

---

## 4. コードの所在（未 git push 注意）

**期待値予想の実装は 133 の作業ツリーにある。git push 済みかは要確認。**

新本番 163 に無い場合は、以下を **133 → 163 に scp**（または git commit → push → 163 で pull）。

### 必須ファイル一覧

```
ai/win_rate.py                          # 新規
ai/stage3_value.py
ai/stage1_screening.py
ai/prediction_profiles.py
ai/empirical_hit_rates.py
ai/race_confidence.py
scripts/import_all_race_ai_compare_profiles.py
scripts/backfill_data_and_repredict.sh
scripts/repredict_ev_after_odds.sh
scripts/repredict_p6_after_odds.sh      # 後方互換ラッパー
scripts/check_ev_hit_stats.sh
public/all_race_compare_profiles_legacy.html   # PROFILE_KEY=ev_forecast
docs/spec/06_forecast_base_and_ev.md
```

### 133 から 163 へ一括 scp（163 で受ける側。パスワード入力あり）

**Windows cmd から（133 に入れる場合）:**

```bat
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/ai/win_rate.py root@163.44.117.9:/var/www/html/tools.kachiumaai.com/ai/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/ai/stage3_value.py root@163.44.117.9:/var/www/html/tools.kachiumaai.com/ai/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/ai/stage1_screening.py root@163.44.117.9:/var/www/html/tools.kachiumaai.com/ai/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/ai/prediction_profiles.py root@163.44.117.9:/var/www/html/tools.kachiumaai.com/ai/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/ai/empirical_hit_rates.py root@163.44.117.9:/var/www/html/tools.kachiumaai.com/ai/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/ai/race_confidence.py root@163.44.117.9:/var/www/html/tools.kachiumaai.com/ai/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/scripts/import_all_race_ai_compare_profiles.py root@163.44.117.9:/var/www/html/tools.kachiumaai.com/scripts/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/scripts/repredict_ev_after_odds.sh root@163.44.117.9:/var/www/html/tools.kachiumaai.com/scripts/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/public/all_race_compare_profiles_legacy.html root@163.44.117.9:/var/www/html/tools.kachiumaai.com/public/
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/docs/spec/06_forecast_base_and_ev.md root@163.44.117.9:/var/www/html/tools.kachiumaai.com/docs/spec/
```

**または 163 に SSH した状態で 133 から pull:**

```bash
cd /var/www/html/tools.kachiumaai.com
scp root@133.130.90.66:/var/www/html/ai-horse-race.maspis.com/ai/win_rate.py ai/
# …上記同様
```

---

## 5. 新 Windows / 新 Cursor でやること（1STEPずつ）

### STEP A — 163 に接続

- Cursor: Remote SSH で `root@163.44.117.9`
- ワークスペース: `/var/www/html/tools.kachiumaai.com`
- **133 ではなく 163 を開く**

### STEP B — コード同期

- 上記 scp または `git pull`（push 済みなら）
- 確認: `grep ev_forecast ai/prediction_profiles.py` がヒットすること

### STEP C — 163 で期待値予想の再予想（本番）

```bash
cd /var/www/html/tools.kachiumaai.com
mkdir -p logs
nohup python3 scripts/import_all_race_ai_compare_profiles.py \
  --profile ev_forecast \
  --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_forecast_$(date +%Y%m%d_%H%M%S).log 2>&1 &
echo PID=$!
tail -f logs/import_ev_forecast_*.log   # 進捗確認。最後に done ok=... err=0
```

**成功の目安:** `done ok=22000前後 err=0`（163 では以前 p6 が 22,191 件だった）

### STEP D — 結果確認

```bash
bash scripts/check_ev_hit_stats.sh
```

画面: `http://163.44.117.9/...`（all_race_compare_profiles_legacy 等）で ◎ 的中率が更新されていること。

### STEP E（任意）— ベース予想も DB に載せる

```bash
nohup python3 scripts/import_all_race_ai_compare_profiles.py \
  --profile base_forecast \
  --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_base_forecast_$(date +%Y%m%d_%H%M%S).log 2>&1 &
```

---

## 5b. DBバックアップ（133 作成済み）と 163 到着後

### バックアップ概要

| 項目 | 値 |
|------|-----|
| 作成サーバー | **133.130.90.66** |
| ファイル | `/root/db_backups/keiba_ai_no_jvraw_20260615.sql.gz` |
| SHA256 | `759a81ab57a8ea6c0d2ed102021f0f5a142822d0936669c8a670cd1acf06f565` |
| サイズ | 約 **164 MB** |
| 内容 | `keiba_ai`（**`jv_raw_records` 除く**） |
| 133→163 直接 scp | **未実施**（鍵なし）。**Windows で STEP T** |

README: `/root/db_backups/README_keiba_ai_no_jvraw_20260615.txt`（133 上）

### STEP T — Windows で DB を 163 に送る

```bat
ssh root@163.44.117.9 "mkdir -p /root/db_backups"

scp root@133.130.90.66:/root/db_backups/keiba_ai_no_jvraw_20260615.sql.gz root@163.44.117.9:/root/db_backups/

scp root@133.130.90.66:/root/db_backups/keiba_ai_no_jvraw_20260615.sql.gz.sha256 root@163.44.117.9:/root/db_backups/
```

### STEP A2 — 163 で checksum 確認（STEP T 後）

```bash
cd /root/db_backups
sha256sum -c keiba_ai_no_jvraw_20260615.sql.gz.sha256
```

### STEP F — DB リストア（通常は不要）

**163 の本番 DB を 133 スナップショットで上書きするとレース数が減る恐れあり。原則スキップ。**

緊急時のみ:

```bash
mysqldump -u root -p keiba_ai | gzip -1 > /root/db_backups/keiba_ai_163_before_restore_$(date +%Y%m%d).sql.gz
gunzip -c /root/db_backups/keiba_ai_no_jvraw_20260615.sql.gz | mysql -u root -p keiba_ai
```

**推奨ルート:** リストアせず **STEP B（コード同期）→ STEP C（163 で ev_forecast 再予想）**。

---

## 6. 133 で既に完了したこと（再実行不要）

| 項目 | 結果 |
|------|------|
| 期待値予想コード実装 | 133 作業ツリーにあり |
| 133 での ev_forecast 再予想 | **完了** `5166/5166`（133 の DB のみ） |
| DB バックアップ（133） | **完了** `/root/db_backups/keiba_ai_no_jvraw_20260615.sql.gz` |
| DB を 163 へ送信 | **未完了**（Windows で STEP T） |
| 163 での ev_forecast 再予想 | **未実施 ← コード同期後 STEP C** |

133 の再予想を止める必要はない（既に終了）。

---

## 7. 固定環境（Windows 側 JV 作業）

| 項目 | 値 |
|------|-----|
| Windows | `C:\Users\oshim\jrvltsql` |
| keiba.db | `C:\Users\oshim\jrvltsql\data\keiba.db` |
| オッズ SQLite | `odds_o1_2020_2026.db` / `odds_o2_2020_2026.db`（163 取込済みのはず） |

オッズパイプライン詳細: `docs/ops_odds_2020_tansho_umaren.md`

---

## 8. 作業ルール（必須）

- **1STEPずつ**。完了確認後に次へ
- コマンドは **ファイル同期 → 実行** のセット
- `python -c` 長文・cmd で壊れる SQL は禁止 → `docs/ops_windows_cmd_guidelines.md`
- 本番は **163** で `git pull` / 再予想まで報告
- 秘密情報（DB パスワード）は `config/db_local.php` 参照。チャットに貼らない

---

## 9. エージェントへの指示（コピペ用）

```
docs/session-handoff-ev-forecast-20260615.md を読んでから作業開始。

目的: 新本番 163.44.117.9 で期待値予想（ev_forecast）の全件再予想。

1) STEP T: Windows から DB バックアップを 163:/root/db_backups/ へ scp（任意・通常はリストアしない）
2) STEP A2: sha256sum -c で確認
3) STEP B: 133 から期待値予想コードを 163 に同期
4) STEP C: 163 で ev_forecast 全件再予想
5) STEP D: 確認

133 の 5166 件再予想は本番ではない。リストアせず 163 で再予想するのが基本。

手順: 1STEPずつ報告。引継ぎ docs/session-handoff-ev-forecast-20260615.md
```

---

## 10. 関連ドキュメント

- `docs/spec/06_forecast_base_and_ev.md` — 処理詳細
- `docs/ops_odds_2020_tansho_umaren.md` — オッズ取込
- `.cursor/rules/one-step-at-a-time.mdc` — 1STEPルール
- `.cursor/rules/production-deploy.mdc` — 本番反映（※リポジトリ上 deleted 表示あり。要確認）

---

*更新: 2026-06-15。DBバックアップ作成・引継ぎ STEP T/F 追記。*
