# 確定オッズ（NL_O1 / TanOdds）取得トラブルシュート

p6 の◎決定に必要なのは **NL_O1.TanOdds（確定単勝オッズ）** のみ。  
0B20 票数・0B30 速報・TS_O1 時系列は **不要**。

## エラー -111「契約外のデータ種別」

`jltsql fetch --spec O1 --option 4` で出る典型例。

| 誤り | 正しい理解 |
|------|------------|
| `--spec O1` で単体取得 | **無効な dataspec 組み合わせ**。公式も「通常は RACE 経由」 |
| `--option 4` でオッズ取得 | option 4 は主に **DIFN 等のセットアップ用**。RACE は **option 1** |
| 時系列 0B20 を待つ | NL_O1 の TanOdds とは別系統。待っても埋まらない |

参照: [jrvltsql data_support.md](https://github.com/miyamamoto/jrvltsql/blob/master/docs/data_support.md)  
> 確定オッズ → `RACE` 取得で `NL_O1`〜`NL_O6` に保存

quickstart ソースでも **RACE + option 1** に O1〜O6 レコードが含まれると明記。

## 推奨手順（Windows）

### 1. 現状確認（cmd に1ブロック）

```bat
cd /d C:\Users\oshim\jrvltsql
venv32\Scripts\python.exe -c "import sqlite3;s=chr(124)*2;c=sqlite3.connect('data/keiba.db');q='SELECT COUNT(DISTINCT Year'+s+'JyoCD'+s+'MonthDay'+s+'RaceNum) FROM NL_O1 WHERE TanOdds IS NOT NULL AND length(TanOdds)>0';print('races_with_tanodds:',c.execute(q).fetchone()[0]);print('target: 18000+')"
```

### 2. 年別 RACE 取得（cmd に1ブロック・推奨）

```bat
cd /d C:\Users\oshim\jrvltsql
venv32\Scripts\jltsql.exe fetch --from 20200101 --to 20201231 --spec RACE --option 1
```

2020 が通ったら 2021, 2022 … と **1年ずつ** 繰り返す。  
一括なら `scripts\windows\fetch_race_by_year.bat`（PC にファイルがある場合）。

### 3. 対話でやる場合（quickstart）

```bat
cd /d C:\Users\oshim\jrvltsql
quickstart.bat
```

| 質問 | 選ぶ |
|------|------|
| DB | SQLite |
| モード | **1) 簡易**（RACE, DIFF） |
| 開始日 | `2020-01-01` |
| 時系列オッズ | **N**（不要） |

### 4. 取得後に再確認 → 18,000+ なら scp → サーバー取込

```bat
scp C:\Users\oshim\jrvltsql\data\keiba.db root@163.44.117.9:/root/keiba.db
```

```bash
cd /var/www/html/tools.kachiumaai.com
./scripts/backfill_odds_pipeline.sh /root/keiba.db --repredict
```

## o1_raw_all.txt オフラインパース（fetch 失敗時はこちら）

`jltsql fetch` が `Download stalled at 6%` 等で落ちても、**既にダンプ済みの生ファイル**で ①パース可否を確認できる（JV-Link 再取得不要）。

```bat
cd /d C:\Users\oshim\jrvltsql
venv32\Scripts\python.exe parse_o1_raw_file.py --db data\keiba.db --year 2026
type o1_parse_result.txt
```

`o1_raw_all.txt` が無い場合のみ `dump_o1_raw_all.py` を実行する。

## JV-Link 単体診断（最優先）

**先に JV-Link だけ見る。** RA(成績確定 k7) と O1〜O6 がレース単位で揃うか。さらに **O1 の中身に単勝オッズ値があるか**。

| スクリプト | 用途 |
|------------|------|
| `diag_jvlink_integrity.py` | 2026上半期など広い期間・`diag_result.txt` 出力 |
| `diag_jvlink.py` | 1ヶ月など短い期間の4行サマリ |

```bat
cd /d C:\Users\oshim\jrvltsql
venv32\Scripts\python.exe diag_jvlink_integrity.py
type diag_result.txt
```

| JV-Link 結果 | 意味 |
|--------------|------|
| O1+odds ≈ RA k7 | **OK** — 欲しい情報あり |
| O1 行はあるが O1+odds 少ない | **JV 側でオッズ空** — 取込では埋まらない |
| O1 レコード自体が欠損 | **JV 取得範囲／FROM_TO** を見直す |

## まだ TanOdds が少ないとき

- **NL_O1 行は多いが TanOdds が NULL** → RACE 再取得でも JV 側に値が無い可能性。年別件数でどの年が欠けているか確認。
- **JV-Link / DataLab が動いていない** → `jltsql status`、JVLinkAgent が Running か確認。
- **途中で quickstart が中断** → 未取得年だけ `fetch --spec RACE --option 1` を再実行。

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

- `--spec O1` 単体 fetch
- Manus の `jrvltsql.exe download`
- quickstart.bat の書き換え
- 0B20/0B30 完了待ちでオッズ不足を解決しようとする
