# NAGA新旧比較 — 統合仕様書
更新日:2026-10-29。会話で合意した現時点の仕様を統合した最新版。
従来HTMLの追記による矛盾を整理した。本書を仕様の基準とし、画面モックはレイアウト・操作の参考とする。「案」「未決」は実装者が確定済みと解釈しない。
## 1. 目的・成果物・実装範囲
NAGAの新旧モデルの選択が異なる局面を抽出し、条件検索、局面表示、メモ、復習リストで学習する。
現在のフロントは架空データによる単一HTMLモック。API取得、牌譜復元、本当のタグ判定、永続保存は未実装。画面の条件すべてがサンプルを抽出するわけではない。
本実装ではサーバーDBを使わず、解析原本等をIndexedDB、軽量設定をLocalStorageに保存する設計を提案している。IndexedDBはサーバーDBではない。保存方式の詳細は要確定。
相談投稿・ログイン限定回答は将来構想。初期版で共有サービスとして動くとは扱わない。
## 2. モデル比較と抽出
- 比較対象チェック:アナンタ/ウロボロス。両方チェックが既定。
- チェックしたモデルだけを新モデル群とする。2つなら最上位の行動が一致する局面だけ採用。1つなら一致検査は不要。
- 両方選択時は両方の結果がある試合、片方選択時はそのモデルの結果がある試合が対象。他方を含む試合も除外しない。
- 旧モデルはアナンタ・ウロボロス以外。未選択の新モデルを旧に移さない。
- 新推奨A:選択された新モデルそれぞれの最上位が一致した行動。
- 旧推奨B:旧モデル群で行動ごとの評価を算術平均し、平均が最大となる行動。
- 新モデルの各最上位、または旧平均の最上位が同率で一意でなければ除外。
- A≠Bの局面について、評価差Δ=新モデル平均(A)−旧モデル平均(A)。絶対値にしない。閾値以上を抽出。例:70−20=50ポイント。
- 通常打牌とリーチ宣言付き打牌は同じ牌でも別行動。合算しない。赤牌の対応も検証する。
- 評価欠損を0にしない。丸め前の値で比較する案。モデル・評価が足りなければ比較不能として説明する。
- 両モデル未選択はモックで適用不可。旧評価の不足時の細かい方針は未決。
## 3. 登録試合・API・再取得の抑制
画面の主役は登録済み試合の検索。URLは毎回入力させない。
登録試合数をチップ表示し、「試合を追加」でのみURL入力を展開。複数URL(1行1URL)、2D/3D混在に対応。登録一覧も表示する。
同一report_idは2D/3D・視点・局面パラメーター違いでも重複保存/取得しない。
同一対局の異なるreport_idを統合するかは未決。自動結合しない。
公式資料:https://naga.dmv.nico/naga_report/manual/#report_json_api
取得先:`https://naga.dmv.nico/reports/{report_id}.json`
公式マニュアルをブラウザーで確認済み。実レポート取得・CORSは未検証。
- 認証不要、gzip JSON。解析完了後に生成。
- `naga_types`の名称とインデックスを対応させ、固定の配列位置に依存しない。
- `pred[局][局面]`、`info.msg`から局面を復元する。既知の未来情報を判断に混ぜない。
- 旧モデル:`dahai_pred`、`reach`等。新モデル:該当する旧欄はnull、`dahai_detail`は通常/リーチ×37牌種。赤5は別。評価は10000倍整数。
- 新の合計値が10000でない場合がある。独断で正規化しない。
- 旧モデルの打牌・リーチ評価から、新と同じ共同の行動単位を作る方法は最重要未決事項。独立と仮定した積等で推測しない。
- `huro`は副露、`kan`は槓の評価。ロン等が競合する場合や合法行動の対応を検証する。
- 原本JSON全体、取得日時、形式版、モデル版、登録URL等を保存。抽出局面だけ保存しない。
- 保存済みならAPIを呼ばず利用。同時取得もID単位でまとめる。初期案は逐次取得。
- 条件変更、表示切替、再起動、タグ規則更新で再取得しない。派生情報は原本から再計算。
- 明示的な更新操作だけ対象IDを再取得。更新失敗でも正常な旧キャッシュとメモを残す。
- 無限再試行や定期ポーリングをしない。部分成功を保存し、失敗分だけ再試行可能にする。
- 保存容量・保存失敗を検出し、未保存なのに保存済みと表示しない。原本・メモを無断で削除しない。
## 4. 画面の方向性
GitHub寄りの細い罫線・高密度・控えめな装飾。操作色は紫・青紫・ラベンダー。
モデルの意味の色は旧=紫、アナンタ=白、ウロボロス=黒。ただし検索条件UIをモデル色に変えない。独自アイコンの参考にする。公式ロゴと称しない。
上から:登録済み試合/検索条件/適用中条件/結果リスト・スライド。
検索条件の保存・呼出し・リセットを用意。列フィルターは結果のローカル絞り込み。
## 5. 検索条件(共通)
1. **比較対象**:アナンタ/ウロボロス、既定は両方。
2. **判断種類**:打牌判断/副露判断/リーチ判断/テンパイ時判断。
3. **比較**:評価差の下限。モデルの説明を表示。
4. **場・局**:東場・南場の親チェック、各1~4局の子チェック。初期全チェック。親で全選択・解除、一部選択は中間状態。
5. **巡目**:下限~上限。比較とは独立行。数え方は未決。
6. **自家副露**:指定なし/なし/あり。既定は指定なし。あり時だけ副露数1~4の複数選択、初期全チェック。
7. **他家の状況**:1行目に被リーチ。指定なし/なし/あり。あり選択時だけ1・2・3軒チェックを表示し全チェックで初期化。
8. **押し引き判断**:他家の状況の直下。押し/回し/オリ。「ダマ・副露への警戒も対象」の補足はオリのすぐ右。
9. **他家副露**:1・2・3軒の複数チェック。他家のみの累計副露数「○件以上」も指定。暗槓等の数え方は未決。
10. **シャンテン数**:ツモ前/ツモ後/打牌後を独立して同時指定。各既定は指定なし。ツモ後の下にグレーの(副露後)。広い画面は横並び。打牌後は新推奨A。副露直後をツモ後欄に対応させるが、存在しないツモ前は過去ツモで代替しない。
11. **ドラ枚数**:合計指定で表ドラ/赤ドラの内訳を展開。既定指定なし。集計時点は判断時点の手牌+自家副露を提案(未確定)。表ドラ加点+赤ドラ加点、両方に該当する赤牌は2加点、槓ドラ含む・未公開裏ドラ除外という案。
12. **点数状況**:独立行。トップ目なら2着目との点差・以上/以下/ちょうどを追加指定。他順位の詳細は未決。
13. **安全牌**:指定なし/現物/安パイのラジオ。既定指定なし。選択された側の枚数指定だけ有効、他方disabled。
同一項目の複数選択はOR、異なる項目はANDを基本案とする。全解除時の扱いは各項目で明示し、勝手に指定なしにしない。
## 6. 安全牌の定義
現物枚数:リーチ者全員に共通する現物の自家保有枚数。
安パイ枚数:各リーチ者に対する現物 OR 筋(中筋含む)OR 字牌すべてを先に求め、その共通集合の自家保有枚数。
字牌は生牌も含む。1人に現物、他の1人に筋なら安パイの対象。
重複条件を二重加算しない。実枚数で数える案。リーチ者0人時は対象外案。
現物の範囲、筋の全対応表・片筋・宣言牌筋、集計時点は未決。検索上の安パイ分類で実際の無放銃を保証しない。
## 7. 局面テーマと方向タグ
タグは新モデルAを主語にする。「非○○」は旧Bが○○側を選ぶ逆方向。単なる非該当全部ではない。この説明をタグ付近に置く。
判定に必要な情報がなければ非該当でなく判定不能。理由・規則版を保持する案。
- **孤立牌選択**:同一牌や周辺±1・±2とのつながりから厳密な孤立を判定する案。検索対象A/Bの範囲は未決。
- **両面先切り**:334→34、233→23等。A/Bどちらか該当で拾う要望あり。その後の新主語原則とのタグ方向整理(非両面先切り等)は未決。周辺牌を含め手全体の分解を見る。
- **タンヤオ**:19字牌を含むメンツなし、19字牌合計3枚以下の共通条件で、Aが19字牌・Bが2~8。
- **非タンヤオ**:上記の逆方向。順子もメンツ対象。ただし67899を678+99と分けられる場合789を順子扱いしない。手全体の最良分解等の厳密な採用規則は未決。
- **役牌**:Aが役牌・Bが役牌以外。**非役牌**は逆。切る牌の分類であり「役牌を残す」の意味ではない。
- **役牌残し**:Bが手牌に1枚だけの孤立役牌を切り、Aが残す。対象役牌は生牌・1切れ。**1切れ役牌残し**はその部分集合。
- 生牌/1切れの見え枚数は自分の河を除き、ドラ表示牌を含む。他家河・公開副露の重複排除を行う案。自分の河から鳴かれた牌の境界等は未決。
- **シャンテン戻し**:ツモ前s0よりA後sAが増え、B後sBは増えない。**非シャンテン戻し**はBだけが増える。両方戻す場合は方向タグを付けない案。
- **高打点/非高打点**:A/Bの和了時平均打点を比べ、高い方がAなら高打点、Bなら非高打点。5%以上の差を提案中。差率の分母等は未決。
- pystyle:https://pystyle.info/mahjong-nanikiru-simulator/ 。期待値と和了率から条件付き平均を導けるか検証する。和了率込み期待値と平均打点を混同しない。E/pは同じ結果集合・条件の場合のみ。連携/API/利用可能範囲は未検証。
## 8. 押し・回し・オリ
- 押し:Bが現物・筋(中筋含む)・字牌、Aが無筋。
- オリ:Bが無筋、Aが安全側かつ面子の中抜き。123から1、刻子から1枚切る場合も含む。
- 回し:Bが無筋、Aが安全側で面子を崩さない。
- 面子を崩しても、ツモ時(ツモ後)と比べてA後のシャンテンが悪化しなければ回し。
- 七対子イーシャンテンは対子切りをオリとするが、面子手と七対子が同シャンテンで、ツモ後と比べ面子手シャンテンが増えないなら回し。
- ここでのツモ後基準は、シャンテン戻しタグのツモ前基準と別。
- 被リーチ限定ではない。ダマ・副露警戒も対象。ただし非リーチ時の対象他家選定と安全牌判定は未決。
- 複数分解で面子崩しの解釈が違う場合の処理、一般例外で使う通常手/最小シャンテンの選択は要確定。
## 9. 副露判断
推奨:スルー優位/副露優位。ポン/チー/カンの複数選択。
副露数:判断時点の自家副露数。すべて/0~4。鳴き後の数ではない。
手役:役牌/タンヤオ/ホンイツ/トイトイ。
判定案:鳴いた後の構造で、成立形と候補を分離。役牌副露成立、タンヤオ中張牌のみ、ホンイツ1色+字牌、トイトイ専用シャンテン等を使う。
スルー時の手役を旧推奨鳴き後で調べる案は未確定。鳴き後の仮想打牌の選び方も未決。カンが大明槓のみか暗槓・加槓を含むか未決。
## 10. リーチ判断・テンパイ時判断
推奨:リーチ/ダマ/シャンテン戻し。打点と待ちの条件を用意。
新がテンパイを外す場合、打点・待ちは旧推奨のテンパイ選択を参照する(確定)。参照元を表示する。
推奨区分のシャンテン戻しと既存のツモ前基準タグとの違いは表示・内部キーを区別する案。
打点案:ダマ/リーチ、ロン/ツモを分け、待ち牌ごとの点数と最小~最大を保持。役なしダマロンを不可扱い。不確定裏ドラ・一発等を確定打点へ混ぜない。点数ルール、検索が最低点か平均等は未決。
待ち:良形/愚形。
良形=両面、字筋シャンポン、宣言牌以外の筋待ち。
字筋シャンポン=字牌または自分の筋牌待ちを含むシャンポン。
愚形選択時のみ残り0~4枚を複数選択、初期は全チェック。
残枚数は公知情報から求める案。総和か牌種別、4枚超・フリテン・複合待ち・筋対応は未決。
テンパイ時判断タブは打牌の局面テーマとリーチ条件の組合せ。リーチ不可の副露テンパイ等の対象範囲は未決。
## 11. 結果リスト・局面詳細
列:複数選択チェック/局・巡目/手牌/新・選択/旧・選択/評価差/タグ/ステータス。
- 局・巡目は東2 / 8巡目の1行、巡目は小さめ。
- 自然文の意図説明タイトルや冗長な補助説明を表示しない。
- 通常打牌ラベルは不要。リーチ・ダマだけ牌の右に表示。
- 行高・余白を抑え、局・巡目と手牌に不要な幅を配分しない。余りはタグ列へ。
- タグは2行まで。ホバー・キーボードフォーカスで全表示。詳細は全タグ。
- 列フィルターは漏斗アイコンからポップアップ。指定中は色で強調。局・巡目範囲、新旧別の選択種別、タグ、ステータスを指定。未指定時は入力欄を隠す。
- 選択種別:通常/リーチ/ダマ/ポン/チー/カン。通常・ダマの本実装判定を要明確化。
- ステータス複数選択の初期は全チェック。全解除は0件。
- 評価差見出しで昇順/降順、矢印表示。上部の並び順とも同期。
- リスト/スライド切替。局面を開き、盤面・新旧比較・タグ・メモを表示。
- ドラに遅い光のスライドアニメーション。モックは7秒周期。動きを減らす設定なら停止。牌名と枠でも判別可能にする。
- NAGAリンクは2Dで開く/3Dで開くの2ボタン。左上に小さくNAGA。
- 同じ局面を指すURLパラメーター・プレイヤー・局・イベントキーを検証し、表示設定違いでメモを分裂させない。
## 12. ステータス・メモ・局面リスト
局面共通ステータス:未確認→確認済→要確認→未確認。ワンタップ循環。初期未確認。
同じ局面は各画面・各リストで状態を共有。個人用として保存し、他者共有には含めない。
局面リスト:YouTubeプレイリストのように任意作成。一覧で複数局面を選び、複数リストへ追加。リスト内の重複禁止。リストから外しても元局面・メモを削除しない。
モックは閲覧・追加・作成・登録解除対応。改名・削除・順序変更・リスト内スライド再生は今後検討。
検索条件は名前付き保存/呼出し。判断種類、比較モデル、値、親子チェック、有効条件、テーマを復元。端末永続化は本実装。列フィルターを保存対象に含めるかは未決。
## 13. 保存・共有・取り込み
LocalStorageに固定期限はないがブラウザーデータ削除等で消える。file:運用の挙動を保証しない。本アプリは固定HTTP(S)オリジンでの運用を提案。
原本を含む個人用完全バックアップと、他者向け共有を区別する。
共有の選択:試合/局面リスト/メモ、初期すべてチェック。ステータスは含めない。
保存検索条件の共有は未確定(現在の共有3項目には含めない)。個人用バックアップへの保存は案。
同一メモは重複追加しない。内容が違う場合は確認ダイアログ。既定は既存維持、両方保持・明示的上書き・中止を選べる。空メモで既存を消さない。
試合を共有しない場合の局面参照を破棄せず、不足データとして案内・後から紐づけ可能にする案。
バックアップ形式版、ID、更新日時、検証、競合プレビューを設計する。実インポートは全検証後にまとめて反映し、中途半端な破損を避ける。
## 14. 将来の相談機能
難しい局面を投稿し相談。回答はログイン者限定。悪質回答が増えた場合、一定数のNAGA URL登録または鳳凰卓のスクリーンショット認証を回答資格とする案。
件数・認証・通報・公開範囲・サーバー保存は未決。ローカル版とは切り離して残す。
## 15. 参照と検証状態
- NAGA公式APIマニュアル:上記。ブラウザー本文確認済み。
- NAGA 2D:`https://naga.dmv.nico/htmls/report_viewer.html?report_id=184183dcfa0eac18ef0b14e01f90f143d092fc7fb63e74325e176155a74cf728v2_2&tw=3`
- NAGA 3D:`https://naga.dmv.nico/htmls/report_viewer_v2.html?report_id=184183dcfa0eac18ef0b14e01f90f143d092fc7fb63e74325e176155a74cf728v2_2&tw=3&ts=0&tv=2`
- ClipDrill:`https://clip-drill.web.app/share.html?s=512e37528616eddf3f27ecb8ead524c528577eb3f2026a40`
- 保存仕様参考:https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
- 容量参考:https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria
参照画面の表示は確認済み。モックのJavaScript構文確認は実施。file:のブラウザー自動観察はツールのURL制限で不可だったため、現状の視覚・全操作確認済みとは主張しない。
## 16. 実装開始時に優先確認する事項
1. 旧モデルの通常/リーチ共同行動の比較方法、牌種・赤牌対応、実APIとCORS。
2. 押し引きの非リーチ相手選定、複合形の分解規則、筋の対応表。
3. 手牌・副露・時点の復元と局面キー、URLの位置対応。
4. 残枚数・打点・副露手役の厳密定義、シミュレーター利用方法。
5. IndexedDBの採用詳細、全レポート保存容量と移行・競合方針。
上記が未決でも、確定済みの登録・キャッシュ・検索UI・メモ等は独立して進められる。判断不能を勝手な評価式で補完しない。