# 提出手順 — 作業ログ自動記録（依頼主の作業）

開発側でできるところ（MSIX・掲載文・スクリーンショット・プライバシーポリシー案・パッケージ版の通し確認・電源イベントの区切りのテスト）は済んでいる（DEVLOG「M3 リリース準備」）。
ここに書いたのは、Partner Center のアカウント・実機のスリープ／再起動・1 か月の実使用が要るため、依頼主にしかできない作業。
**名前はまだ予約していない**（手順 1 が最初）。

## 0. 手元にあるもの
| もの | 場所 |
|---|---|
| MSIX（未署名・Store が署名する） | `apps/work-logger/dist/WorkLogger_1.0.0.0_x64.msix`（identity は仮。手順 2 で作り直す）。M3 版の大きさと SHA256 は DEVLOG「M3 リリース準備 → 最終の MSIX」（確かめ方：PowerShell で `Get-FileHash dist\WorkLogger_1.0.0.0_x64.msix`。作り直すと値は変わる） |
| 掲載文（日本語・英語） | `store/listing-ja.md`・`store/listing-en.md` |
| スクリーンショット 5 枚（1600×900、合成データだけ） | `store/screenshots/01〜05.png`（作り直し：`tools/store_shots.py`。手順 2 の下） |
| プライバシーポリシー案 | `store/privacy-policy.md` |

## 1. 名前を予約する（Partner Center）
1. Partner Center → アプリとゲーム → 新しい製品 → MSIX または PWA アプリ。
2. 名前：**作業ログ自動記録**（2026-11-09 に空きを確認。`docs/ms-store-apps/name-availability-2026-11-09.md`。その後は再確認していない）。取られていたら別名を決め、下の差し替えをその名前で行う。
3. 英語の掲載名を別に持つなら、同じ製品に「Auto Work Log」も予約する（任意。予約しない場合は英語の掲載にも日本語の名前を使う）。
4. 製品 → 製品 ID（Product identity）の画面で次をメモする：
   - Package/Identity/Name（例 `imoninja.1234ABCD5678`）
   - Package/Identity/Publisher（`CN=ECF78C6D-…` — 他のアプリと同じはず）
   - Store ID（12 文字、例 `9ABCDEFGHIJK`）

## 2. 予約した値に差し替える（開発側に頼んでもよい・5 分）
| ファイル | 項目 | 今の値（仮） | 入れる値 |
|---|---|---|---|
| `apps/work-logger/msix.json` | `identity.name` | `imoninja.WorkLoggerDev` | Package/Identity/Name |
| 同 | `identity.publisher` | `CN=ECF78C6D-7A8E-415A-BEC7-4C853385A7DE` | Package/Identity/Publisher（同じなら変更なし） |
| 同 | `display_name` | `作業ログ自動記録` | 予約した名前（完全に同じ文字。空白も） |
| 同 | `startup_task.display_name` | `作業ログ自動記録` | 予約した名前（タスク マネージャーの「スタートアップ アプリ」に出る名前）。`startup_task.id`（`WorkLoggerStartup`）は**変えない**（main.py の `STARTUP_TASK_ID` と同じ値） |
| 同 | `_note` | 「仮」の説明 | 消すか「予約済み（日付）」に |
| `apps/work-logger/main.py` | `INFO.store_id` | `""`（空＝購入ボタンでストアを開けない） | Store ID |
| 同 | `INFO.name["ja"]` / `["en"]`、`resident.tooltip` | `作業ログ自動記録` / `Auto Work Log` | 予約した名前（英語名を予約しなかったら en はそのままでよい） |
| 同 | `controller.py` の通知の見出し（`"作業ログ自動記録"` 2 か所） | `作業ログ自動記録` | 名前を変えたときだけ |
| `tools/msix_check.ps1`・`tools/msix_m3_check.ps1` | 窓を探す名前（`"作業ログ自動記録"`） | 同上 | 名前を変えたときだけ |
| `store/listing-ja.md`・`listing-en.md`・`privacy-policy.md` | 製品名 | 作業ログ自動記録 | 名前を変えたときだけ |

名前を変えた場合は、スクリーンショットのヘッダーにアプリ名が写っているので撮り直す（アプリのフォルダで）：
```
set QT_QPA_PLATFORM=offscreen
set IMOSHELL_LICENSE=purchased
.venv\Scripts\python tools\store_shots.py --work %TEMP%\wl-shots --out store\screenshots
```
（合成データ・偽の前面ウィンドウで撮るので、この PC の本物のウィンドウタイトルは写らない。作業フォルダは最後に消える）

差し替えたら MSIX を作り直す（アプリのフォルダで）：
```
powershell -ExecutionPolicy Bypass -File ..\..\common\build\build.ps1
```
→ `dist\WorkLogger_1.0.0.0_x64.msix`。古い開発版（`imoninja.WorkLoggerDev`）が入っていたら先に外す：`Get-AppxPackage -Name imoninja.WorkLoggerDev | Remove-AppxPackage`。
作り直したら `build\licenses\index.json` が 13 件（Qt の欄・PyInstaller の欄を含む）で、本文の欠けが無いことを見る（DEVLOG M3「ライセンス本文」）。

## 3. 実機で確かめる（提出前・合わせて 1 時間＋数日）
開発機ではスリープ・再起動・サインアウトを実際には行っていない（他の作業が並行で動いていたため）。電源イベントの受け取りと記録の区切りはテストとパッケージ版に知らせを直接送る形で確認済み（DEVLOG M3「スリープ・休止」）。**本物のスリープで同じになるかを、次の手順で見てほしい。**

準備：開発者モードで入れる（アプリのフォルダで）`powershell -ExecutionPolicy Bypass -File ..\..\common\build\build.ps1 -DevInstall`。スタートメニューの「作業ログ自動記録」から起動。

### 3-1. スリープ（10 分）
1. アプリを起動し、ヘッダーが「● 記録中」なのを見る。メモ帳などを 2〜3 分使う。
2. スタート → 電源 → **スリープ**。そのまま **5 分以上**置く（ノート PC ならふたを閉じてもよい）。
3. 復帰してサインインし、メモ帳を 1 分使う。トレイのアイコン →「今日の記録を開く」。
4. 見る点：
   - 「今日の作業」で、スリープしていた時間帯に**行が無い**（スリープの直前の行の終わり〜復帰後の行の始まりの間が空いている）。スリープ中の時間が「記録済み」「離席」にも入っていない。
   - ヘッダーが「● 記録中」に戻っている（「‖ スリープ中」「⚠ 記録が止まっています」のままでない）。
   - 「異常終了」に新しい行が**出ていない**。
   - ログ（`%LOCALAPPDATA%\Packages\imoninja.WorkLoggerDev_gytd433ssh6vj\LocalState\logs\app.log`）に `power: WM_POWERBROADCAST wparam=0x4 -> suspend`・`power: suspend -> recording stopped`・`power: resume after NNNs`・`recording started (… resume)` がある。
   - **ログに `power:` の行が無い**場合（モダンスタンバイの PC で知らせが来ない場合がある）も、上の「行が無い」が満たされていればよい（時刻の飛びで区切る仕組みが働いている）。その場合はログの有無を開発側に伝えて。
5. 休止状態（ハイバネート）が使える PC なら、スタート → 電源 →「休止状態」でも同じことを見る（電源メニューに無ければ省いてよい）。

### 3-2. 自動開始（StartupTask）（10 分）
1. 設定 → 一般 →「Windows の起動時に開始する」をオン → OK。
2. タスク マネージャー（Ctrl+Shift+Esc）→ スタートアップ アプリ に「作業ログ自動記録」が**有効**で出ていることを見る。
3. **サインアウト → サインイン**。ウィンドウは出ず、タスクトレイにアイコンが出て記録が始まっていること（トレイ →「今日の記録を開く」で、サインイン直後から行がある・ヘッダーが「● 記録中」）。
4. **再起動**して同じことを見る。
5. 設定でオフに戻す → タスク マネージャーで「無効」になる → サインアウト／サインインで**起動しない**こと。
6. （任意）タスク マネージャーで無効にした状態で、アプリの設定をオンにしようとすると「タスク マネージャーで無効にされているため…」の案内が出ること。

### 3-3. 1 か月の実使用（仕様 §10 のリリース基準）
仕様のリリース基準は「日隈自身の開発作業で 1 か月ドッグフーディングし、月次集計が実感と一致すること」。**まだ始まっていない。**
- 上の開発者モードの版（または `.venv\Scripts\python main.py`）で 1 か月記録し、月末に「レポート」の案件別の時間が実感と合うか、CSV が請求に使えるかを見る。
- 合わない・使いにくい点（未分類が多い・寄り道の吸収・丸め・CSV の列など）を開発側に。**記録そのもの（タイトル）は渡さなくてよい**。
- 1 か月を待たずに提出するかは依頼主の判断（待たない場合は、3-1・3-2 と数日の実使用だけでも）。
- 終わったら登録を外す：`Get-AppxPackage -Name imoninja.WorkLoggerDev | Remove-AppxPackage`（記録も消える。残したいなら先にレポート・CSV を書き出す）。設定で自動開始をオンにしていた場合も、外せば StartupTask ごと消える。

## 4. プライバシーポリシーを公開する
1. `store/privacy-policy.md` の「最終更新日」を入れ、内容を確認する（このアプリはウィンドウタイトルを平文で保存するので、記録する内容を具体的に書いてある）。
2. 他のアプリと同じ置き場所（note の固定記事・GitHub Pages など）に置き、URL を控える。

## 5. Partner Center で提出する
1. **価格と使用可能状況**：市場＝日本（任意で全市場）、価格 ¥2,980（仕様 §4）、無料試用＝**「試用版あり・期限なし」（Trial never expires）**（アプリ側で 14 日を数え、期限後も記録は続けて書き出しだけ止める。Store の期限付き試用にすると期限後に起動できなくなり、記録が止まる＝「試用後も記録は続く」と矛盾する）。
2. **プロパティ**：カテゴリ＝仕事効率化。プライバシーポリシーの URL。サポート連絡先 imoninja@gmail.com。
   「このアプリは個人情報にアクセス・収集・送信しますか？」→ **はい（アクセス・保存する）を選び、送信はしない旨をポリシーに書いてある**、が無難（ウィンドウタイトルにメールの件名などが入りうるため。送信はしない）。質問の選択肢が「収集・送信」だけなら、端末内のみで送信しないことをポリシーの URL で示す。
3. **年齢区分**：IARC の質問票（ユーザー間のやり取りなし・位置情報なし・購入はストアのみ）→ 全年齢になるはず。
4. **パッケージ**：手順 2 で作り直した `.msix` をアップロード。対象：Windows 10/11 デスクトップ。
   エラーが出たら：identity・publisher・display_name の不一致がほとんど（予約情報と 1 文字でも違うと弾かれる）。
5. **ストア掲載情報（日本語）**：`listing-ja.md` を貼る。スクリーンショット 5 枚（キャプションも）。アイコンはパッケージのもの。
   **英語**：`listing-en.md`（画面は日本語が主であることを書いてある）。
6. **審査担当へのメモ（Notes for certification）**：
   「Time tracking app (Japanese UI). It runs in the system tray and, every 5 seconds, records only the foreground app's executable name, its window title, idle time and lock state, into a local SQLite database. It does not record keystrokes or screenshots and makes no network connections. Window titles stay on the device. It declares a StartupTask (windows.startupTask, disabled by default; the user can enable 'Start when Windows starts' in Settings). Closing the window hides it to the tray; use the tray icon menu → Exit (終了) to quit. Test: launch → use any app for a minute → tray icon → 今日の記録を開く (Today) shows the recorded apps → レポート (Report) → CSV を書き出す (Export CSV). Free trial: 14 days; after that recording continues and only export needs purchase.」
7. 制限付き機能 `runFullTrust` の理由欄：「Desktop (Win32) app packaged with MSIX; runs a PySide6 GUI and reads the foreground window title via Win32 APIs (GetForegroundWindow/GetWindowText). No other restricted capabilities.」

## 6. 公開後すぐ（2 週間は夜間チェック：ロードマップの共通基準 4）
- 実際に Store から入れて：購入前に試用表示 → 購入後に「製品版」、購入ボタンでストアのページが開く（store_id が入っているか）。
- オフラインでの判定（common TODO-M2 §18.2）：一度ネットありで起動 → 機内モードで起動してヘッダーが「製品版」のままか。
- Store 版でも 3-2（自動開始）をもう一度見る（Store のインストールでも StartupTask が使えること）。
- 評価・レビューと imoninja@gmail.com を毎晩見る。「記録が止まる・抜ける」の報告は最優先（掲載文にそう書いた）。報告者には app.log（タイトルは含まない）を頼む。

## 未確認のまま提出することになる点（知っておいてほしいこと）
- 本物のスリープ・休止・モダンスタンバイでの区切り（手順 3-1）。開発側は知らせを直接送る形と時刻の飛びのテストまで。
- サインアウト／再起動での自動開始（手順 3-2）。開発側はアプリ内のオン・オフと StartupTask の状態（レジストリ）・設定画面の表示まで。
- 1 か月の実使用（手順 3-3、仕様 §10）と、24 時間以上の常駐（計測は 10 分）。ノート PC の電池への影響。
- 管理者権限のアプリ・UAC 画面・全画面ゲーム・リモートデスクトップでの記録。
- Windows 10 での動作（開発機は Windows 11 のみ。マニフェストの最小は 10.0.17763）。
- Store 経由の購入・試用の実反映（公開後にしか確かめられない）。
- バージョン情報の画面のライセンス表示（「Qt 6 / PySide6 / Shiboken6」「PyInstaller（起動部）」）は、パッケージ版で一度開いて目で読む（中身の index.json と本文ファイルは確認済み）。表示文の法的な最終確認は人が読むこと（common §17.3 の注）。

## プライバシーポリシーの URL（2026-11-10 公開済み）
https://auto-work-log.pages.dev/ （Cloudflare Pages。更新手順は ms-store-apps/privacy-site/README.md）。Partner Center の「プライバシー ポリシーの URL」にこれを入れる。

## 提出用の最終 MSIX（2026-11-10、名前の予約後）

**これより前に書いた MSIX の大きさ・SHA256 は古い。提出にはこれを使う。**

- `apps/work-logger/dist/WorkLogger_1.0.0.0_x64.msix`：34308866 バイト
- SHA256 `417F413563FC72D709925FBD5B439E63DC5260AB96783B9C6ED438D7A2AD9340`
- Identity/Name `imoninja.26312176752CA`、Store ID `9N4GBVJZ00QK`、Publisher `CN=ECF78C6D-7A8E-415A-BEC7-4C853385A7DE`
- 含むもの：BOM 付き JSON の読み込み（common §22・アプリ側 utf-8-sig）、ライセンス収集の改善（§23）、左メニューの UIA（§23）、ビルド時の PATH 固定（§24：Git の OpenSSL DLL 混入なし）
- この PC にも同じレイアウトを開発者モードで登録済み（動作確認用）
