# Dopa Fit Privacy / プライバシー

更新日：2026-10-03。対象：このリポジトリの静的アプリ。

## カメラと姿勢推定

STARTを押すとインカメラを要求します。マイクは要求しません。カメラ映像は鏡プレビューとMoveNetによる姿勢推定に使用します。TensorFlow.jsは端末のブラウザ内で実行し、手首・肩・腰の位置からゲームの入力を計算します。Record OFFでは映像・座標をファイルへ保存しません。Record ONでは、選択したFace Mask設定のカメラ映像とゲーム音をセッション内の容量制限付きBlob素材として一時保持します。Face Mask OFFでは顔も映ります。完成動画は保存／共有操作で初めて端末外への共有先に渡します。骨格座標や顔認証用特徴量は保存しません。アプリはこれらをサーバーへ送信しません。

一時停止、タブを離れる、終了、エラーの際はカメラトラックを停止します。再開にはカメラを再取得します。OS・ブラウザ側の権限設定はアプリから変更できません。

半身モードではカメラ映像全体から姿勢を推定し、表示の切り抜き外にある肩・肘も基準に使います。全身モードの画面いっぱい表示では、端末内の一時Canvasへ可視範囲を切り出して推論します。手首と肘の直前の座標を短時間メモリに保持して表示・判定を補助します。一時画像・座標をディスクやキャッシュへ保存せず、外部送信もしません。

## 通信

アプリ、画像、推論ライブラリ、モデル、WASMはこのサイトと同じ配信元から取得します。実行時に外部CDN、分析SDK、利用統計送信、WebSocket、Beaconは使いません。Pose Detectionライブラリには他の推論方式の実装も含まれますが、PoseはローカルMoveNetです。Face Mask／背景変更／Recordを選んだ場合は、同一配信元のMediaPipe TasksモデルとMediabunnyを追加取得します。

HTTPSホスティング事業者は、通常のWebアクセスの処理にIPアドレス、User-Agent等を扱うことがあります。これはカメラ画像のアップロードとは異なります。GitHubへの外部リンクを開くとGitHubのサイトへ移動します。通信が一切ないことを保証するものではありません。

## この端末に保存するもの

- `dopa-fit:settings`：言語（日本語／英語）、音量、演出軽減、動く範囲（広く／その場で小さく）とカメラ表示（画面いっぱい／広く映す）、遊び方（半身／全身）、Face Mask、背景の選択。RecordのONは永続化せず、ページを開くとOFFです。同じページで再度運動する場合は選択中のONを引き継ぎます。
- `dopa-fit:history`：直近30セッションの日時、運動秒数、HIT数、ENERGY、最高FEVER段階、カメラ／デモ区分。座標・画像・体格・フォームは含みません。
- `dopa-record-*`のCache Storage：ハッシュ検証済みの追加ライブラリ・顔／背景モデルだけ。動画素材は含みません。
- `dopa-fit-*`のCache Storage：アプリ、静的画像、ライセンス文書、ライブラリ、モデル、WASMと保存完了の目印。

運動の記録画面の「記録を削除」で履歴を削除できます。ブラウザのサイトデータ削除で設定とオフラインキャッシュも削除できます。保存が禁止されている場合もプレイは継続できます。履歴は端末間で同期しません。カメラなしのデモは実運動と区別して記録します。

終了時の成果カードは集計値と独自マスコットだけから端末内で描画します。「画像で保存」を押した場合にPNGのダウンロードを開始します。カメラ映像・骨格・個人の写真は含めず、成果画像をサーバーへ送信しません。

## オフラインと更新

全必要ファイルのハッシュ検証とキャッシュ保存に成功した後だけ「オフライン利用OK」と表示します。OSがキャッシュを削除すると再取得が必要です。更新版は待機し、運動を終了して更新操作を行うまで適用しません。他のタブでプレイ中の場合も更新を待機します。

## 確認状況

自動テストでは起動・モデル取得・デモ・停止・履歴・オフラインの通信を確認します。実機Safari／Androidの長時間プレイ、スリープ、ネットワーク監査は端末での追加確認が必要です。最新の確認状況は[release-checklist](docs/release-checklist.md)を参照してください。アプリ側の実装説明と、端末で確認できた範囲を区別しています。

## Face MaskとDopa Record

RecordとFace Maskは独立して選べます。MY ROOMではFace Mask OFFでも録画でき、顔と部屋が動画に映ります。この場合はFace追跡を起動せず、画面のカメラ表示設定に合わせて反転・切り抜きした映像を収録します。背景変更は従来どおりFace Maskを併用します。Face Mask ONでは同じカメラフレームの顔追跡結果と合成し、未検出、複数人、異常値、新しい結果の取得から200ms超では実写を不透明なDopa背景へ置換し、その区間を素材候補から除外します。次の推論待ちでは、顔を隠し終えた画像だけを撮影から最大450msまで表示し、録画には200ms以内の画像だけを使います。プレビューと収録に同じ処理済みCanvasを使います。マスクの装飾と不透明な顔カバーは分離しています。

MY ROOM（初期値）は部屋が動画に映ります。BLUR ROOMは背景をぼかしますが完全に隠す保証ではありません。DOPA STAGEは背景を置換します。背景分離の失敗時は不透明な舞台へ退避し、実写の部屋へ自動切替しません。

素材容量はLOW 24MiB／NORMAL 48MiB／HIGH 64MiBの範囲です。未知の端末はLOWで始まり、長時間でも容量・候補数を増やし続けません。素材と完成動画はメモリ内だけに保持し、次の運動の開始で破棄します。履歴には集計だけを保存します。マイクを使わず、Web Audioのゲーム音だけを収録します。動画に操作UIや診断情報は入れません。自動投稿はせず、OS共有は利用者の操作で行います。共有キャンセルでも運動成果と動画を保持します。

Face Detector／Landmarkerの実機比較は未完了です。顔の被覆や背景分離はデスクトップ自動試験だけで実機合格と扱いません。横向き・急な動き等で安全に追跡できない間は実写を隠します。
