| 1 | # Billing currency refactor — acceptance checklist |
| 2 | |
| 3 | ## Automated (run before merge) |
| 4 | |
| 5 | - [x] `go test ./...` |
| 6 | - [x] `cd desktop && go test ./...` |
| 7 | - [x] Key packages `-race` (billing, event, boot, cli, config, acp, serve, stats) |
| 8 | - [x] `cd desktop/frontend && pnpm typecheck && pnpm test:usage-stats && pnpm build` |
| 9 | - [x] `scripts/check-cache-impact.sh` → no provider-visible changes |
| 10 | - [x] `reasonix doctor billing` surfaces display/billing/FX-disabled/catalog |
| 11 | |
| 12 | ## Manual UI (Desktop + Serve) |
| 13 | |
| 14 | 1. **CNY ↔ USD hot switch** — Settings → Display currency; session estimate rebinds without zeroing; provider prices unchanged. |
| 15 | 2. **Restart restore** — reload a session with `*.telemetry.json` v2 legacy cost; ledger migrates lazily; no invented totals for wiped zeros. |
| 16 | 3. **Mixed models** — main + planner + subagent with different currencies; total uses shared valuations or shows incomplete. |
| 17 | 4. **No runtime FX** — no ECB request, cache, or refresh goroutine; custom-currency totals stay in original buckets; official dual-region still values via `official_table`. |
| 18 | 5. **Wallet** — multi-currency balance shows `≈` total + detail tooltip (originals, rate date). |
| 19 | 6. **MiMo Token Plan** — cost label uses PAYG-equivalent wording when `billing_mode=subscription_equivalent`. |
| 20 | 7. **Narrow / restore** — Serve and Desktop after session resume show same selected estimate. |
| 21 | |
| 22 | ## GitHub follow-up |
| 23 | |
| 24 | - [ ] Open PR; link #4565, #3527, #4546; note supersedes #7790 |
| 25 | - [ ] After merge, mark PR #7790 superseded |
| 26 |