# ローカル回帰チェックリスト（手動 · PoC）

Platform / Karaoke / CDS3D を変更したあと、**同じ手順で動作を確認**するための一覧です。自動テストは `npm run validate:works`（`works.mock.json` + `works.catalog.json` のスキーマ検証）— 本チェックは **ブラウザ操作**が正本。

| モード | 目安時間 | 含むセクション |
|--------|----------|----------------|
| **ミニ** | 15 分 | §0 · §2 |
| **標準** | 30 分 | §0 · §2 · §4 · §6 |
| **フル** | 45 分 | すべて |

詳細仕様: [local-dev-guide.md](local-dev-guide.md) · [transport-sync-v2.md](architecture/transport-sync-v2.md) · [README.md](../README.md)

---

## 記録（任意）

| 項目 | 値 |
|------|-----|
| 日付 | 2026-11-07 |
| Platform `git log -1` | `e2bf295` |
| Karaoke `git log -1` | `7ed2e50`（`..\karaoke-app-v1.0.0`） |
| CDS3D `git log -1` | `e26cc7f`（`..\CDS3D\app`） |
| 実施者 | 譲 + Agent smoke |
| モード（ミニ / 標準 / フル） | **フル相当** — §1 · §2 · §3（2026-11-07）· 標準 PASS（[2026-11-06](regression-runs/2026-11-06-standard-pass.md)） |

PowerShell（HEAD 確認）:

```powershell
git -C "...\muvic-joy-platform" log -1 --oneline
git -C "...\karaoke-app-v1.0.0" log -1 --oneline
git -C "...\CDS3D\app" log -1 --oneline
```

---

## §0 前提（すべてのセクションの前に）

- [x] **8780** — リポジトリ**ルート**で `py -m http.server 8780 --bind 127.0.0.1`（**1 プロセスのみ**）
- [x] **8782** — `npm run dev:api` · `http://127.0.0.1:8782/health` → `{"ok":true,...}`
- [x] **8790** — `..\karaoke-app-v1.0.0` で `py -m http.server 8790 --bind 127.0.0.1`
- [x] **8765** — `..\CDS3D\app` で `py cds3d_serve.py`
- [x] URL は **`127.0.0.1`** に統一（`localhost` 混在で postMessage 不整合の原因になりやすい）
- [x] Web は **`?api=1`** または login/submit 後の API モード（`localStorage` `muvic_use_api`）
- [x] **8782 / 8790 / 8765 のコード変更後** — 該当プロセス再起動 · Player は **Ctrl+Shift+R**（2026-11-06 実行時点）

---

## §1 P1 芯 — 投稿 → Player（楽譜 + 3D）

README「P1 — 投稿から Player」相当。**フル**向け。

- [x] ログイン — http://127.0.0.1:8780/apps/web/login.html（`POST /auth/session` **201** · 2026-11-07）
- [x] 投稿 — `submit.html` 相当 · `demo-official.musicxml` + `sample-motion.json` · **公開** → `work_ugc_mw6ijtjp_10hlre`
- [x] 成功後 **▶ プレイヤーで確認** — `player.html?work=work_ugc_mw6ijtjp_10hlre&api=1`
- [x] **楽譜** — Karaoke ステージで譜面表示（Player 楽譜タブ · 8790 embed）
- [x] **3D** — `assets.motion.url` · `keyframes[]`（2）· 尺 **8s**（[ログ](regression-runs/2026-11-07-p1-core.md)）
- [x] **Work 詳細** — `work.html?work=work_ugc_mw6ijtjp_10hlre&api=1` · 資産表に score / motion URL（譲 · Player 楽譜/3D 手動確認済）

---

## §2 Transport / 3D / Player シェル

[local-dev-guide §2.6](local-dev-guide.md#26-platform-変更後のチェックリストtransport--3d) · [transport-sync-v2「確認」](architecture/transport-sync-v2.md#確認)

入口: `player.html?work=work_demo_001&api=1`

- [x] `#karaokeFrame` / `#cds3dFrame` の `src` に `muvicEmbed=1` · **`v=`** キャッシュバスタ（`embedVersion` 反映）
- [x] **親 transport ▶** — 秒が進む · 楽譜 / 3D が同じ秒付近で追従（親バー完走まで確認 · 3D 追従は未）
- [x] **3D embed ▶ / ⏸ / シーク** — 親バーと連動（CDS3D `muvic_embed` **v=5** · Platform `embedVersion` **10**）
- [x] **3D ↔ 楽譜** タブ切替（再生中）— 親マスター BGM **オフ**時も `clockSync` で非表示 3D の時計が親に追従（裏 BGM ずれ防止）
- [x] **Console** — `postMessage` の origin mismatch が雪だるま式に増えない（2026-11-07 手動）
- [x] **Work 尺** — `work_demo_001` 等 · 親 transport total **≈ `durationSec`（例 0:08.0）** · 長い BGM ファイルでも伸びない · 楽譜 iframe の `current / total` も同尺（`muvic:session` 後）
- [x] **P1b + 親 transport（B1）** — 録画中 · **約 `durationSec` で録画自動停止** · `POST /overlays` **201** · `work.html` でテイク再生（譲 · embed `v=10`+ · Platform `6763bd0`+ · Karaoke `7ed2e50`）
- [x] **譜面のみ** — `player.html?work=work_ugc_score_only&api=1` · **3D タブ無効**（`works.mock.json` · 8782 `loadCatalog` がカタログとマージ · 従来の代替 `work_ugc_mvz11abd_mkbpmt` でも可）

任意（Studio）:

- [x] `studio.html?work=work_demo_001&api=1` — 親 ▶ ↔ CDS3D · **`muvic:transportRequest` 往復** · **G4** — `playbackStarted` / `embedEngaged` / `playbackCompleted` → `POST /events`（`bindPlayerEngagementEvents`）

---

## §3 G4 有効プレイ（計測）

[local-dev-guide §3](local-dev-guide.md#3-g4-有効プレイduplicate_qualified_play) · Network は **Fetch/XHR** · `8782/events`

**初回カウントを試す前:** シークレット / `localStorage.removeItem('muvic_play_session_id')` / 別 Work / jsonl リセットのいずれか。

| # | 操作 | OK |
|---|------|-----|
| [x] | **長尺** — 再生開始後 embed 滞在 **≥ 30 秒** | 1 回目 `POST /events` **201**（成功 · 2026-11-07 手動） |
| [x] | **短尺** — Work 尺で **自然終了**（5s ≤ played &lt; 30s） | 同上（201） |
| [x] | **再テスト** — 同 session × 同 work で再度 | **409** `duplicate_qualified_play` · 画面下部トースト |
| [x] | **ホーム** — `index.html?api=1` · 左ランキングの再生数表示に矛盾なし（stub/events 注釈どおり） |

---

## §4 マスター BGM · Work API

[local-dev-guide §4](local-dev-guide.md#4-投稿-work-のマスター-bgM8782)

- [x] 投稿時 MP3/WAV — `GET /works/<id>` に `assets.masterAudio.url` · `durationSec`（catalog 既存 UGC で間接確認）
- [x] マスター URL をブラウザで開き **200**（`work_demo_001` PoC BGM）
- [x] Player — transport **「マスター BGM（親）」** · 親 ▶ でアップロード音
- [x] **後付け** — 作成者 · `work.html?work=<id>&api=1` · PATCH パネル保存 → 再読込で反映（譲 · 開発中 UGC）
- [x] **説明 · カバー（D3）** — 投稿 or Work 詳細 PATCH · `GET /works/<id>` に `description` · `coverUrl` · **ホーム / Explore グリッド**（2 行）· ヒーロー · Work 詳細

---

## §5 P1b 重ね録り（任意 · フル）

README「P1b — カジュアル重ね録り」短縮版。

- [x] `player.html?work=work_demo_001&api=1` · 録画 → **約 8s で自動停止** · overlay POST（Network `overlays` **201** · 完了トーストは Karaoke iframe 内）
- [x] `work.html?work=work_demo_001&api=1` · 歌唱テイク `<audio>` 再生（譲 · 2026-11-06）
- [x] （時間あれば）2 ユーザー · ガイド同期 · 2 本目 POST — `work_demo_001` · **201×2** · guide anchor **1150**（[ログ](regression-runs/2026-11-07-p1b-two-user.md) · 2026-11-07）

---

## §6 Discover / ホーム UI

- [x] **ホーム** — `index.html?api=1` · ヒーロー · タイアップ（公式 Work）· **カテゴリタブ**（Explore 同様）· おすすめグリッド · 左ランキングタブ
- [x] **Explore** — 検索 · カテゴリタブ · カード → `player?work=`（ページ 200 · グリッド共通 UI）
- [x] **Work 詳細** — `work.html?work=work_demo_001&api=1` · 「読み込み中」で止まらない
- [x] **マイページ（D4）** — `mypage.html?api=1` ログイン · 自分の Work **グリッド** · **Work 編集** → `work.html`（BGM · 説明 PATCH）
- [x] **ヘッダ検索**（ホーム / Explore）— `GET explore.html?q=…&api=1`（`shell-nav` · `discoverPageHref`）

---

## §7 データ検証（任意）

```powershell
npm run validate:works
```

- [x] 終了コード 0（2026-11-07）

---

## いつ走らせるか（目安）

- Platform / Karaoke / CDS3D の **Muvic 連携**を触った直後
- **`embedVersion` を上げた**あと
- **8782 の events / works / PATCH** を変更したあと
- デモ前 · 大きな commit の前後

---

## 関連

- [regression-runs/2026-11-06-standard-pass.md](regression-runs/2026-11-06-standard-pass.md) — 直近標準 PASS ログ
- [regression-runs/2026-11-06-p1b-pass.md](regression-runs/2026-11-06-p1b-pass.md) — P1b 重ね録り + B1 自動停止（2026-11-06）
- [regression-runs/2026-11-06-b1-transport-stop.md](regression-runs/2026-11-06-b1-transport-stop.md) — B1 transport / clockSync（要約）
- [regression-runs/2026-11-06-s2-s6-transport.md](regression-runs/2026-11-06-s2-s6-transport.md) — §2 3D clockSync · §6 検索（実装メモ）
- [regression-runs/2026-11-07-studio-scoreonly.md](regression-runs/2026-11-07-studio-scoreonly.md) — Studio G4 · `work_ugc_score_only` catalog
- [regression-runs/2026-11-07-p1-core.md](regression-runs/2026-11-07-p1-core.md) — §1 投稿 → Player（`work_ugc_mw6ijtjp_10hlre`）
- [regression-runs/2026-11-07-p1b-two-user.md](regression-runs/2026-11-07-p1b-two-user.md) — §5 2 ユーザー overlay · ガイド anchor
- [local-dev-guide.md](local-dev-guide.md) — 3 リポ git · embed 再読込 · G4 詳細
- [LEGACY-CLIENTS.md](LEGACY-CLIENTS.md) — postMessage 契約
- [player-ui-phases.md](architecture/player-ui-phases.md) — UI フェーズ
- [demos/stakeholder-p2-contest.md](demos/stakeholder-p2-contest.md) — ステークホルダー通しデモ（P2）
- [architecture/roadmap-p2-p3.md](architecture/roadmap-p2-p3.md) — P2/P3 ロードマップ
