diff --git a/plans/TODO.md b/TODO.md similarity index 98% rename from plans/TODO.md rename to TODO.md index 98adc7d..7172734 100644 --- a/plans/TODO.md +++ b/TODO.md @@ -157,10 +157,10 @@ iOS Safari. No code; verification only. `cookie`: still needed — Kit 2.70.x still declares `cookie ^0.6.0`, below the 0.7.0 fix. Kit 3.0.1 (now `latest`) declares `^2.0.1`, so the override goes away with a Kit 3 migration (a major upgrade, not - done). `serialize-javascript`: effectively redundant — the consumer + done). `serialize-javascript`: dropped 2026-10-12 — redundant — the consumer (`@rollup/plugin-terser`, via `workbox-build`) declares `^7.0.3`, which already resolves to 7.1.x; the `^7.0.5` override only guards a lockfile - that pins 7.0.3/7.0.4. Safe to drop. + that pins 7.0.3/7.0.4. - **Voice list growth.** If we add voices > 2 (esp. > 10), revisit the precache strategy — currently we precache only the default voice. The 7d runtime cache covers the rest, but cold-start cost diff --git a/plans/260429-1511-loto-upstream-sync/phase-06-tests-and-verification.md b/plans/260429-1511-loto-upstream-sync/phase-06-tests-and-verification.md index 6b3afaf..252bcda 100644 --- a/plans/260429-1511-loto-upstream-sync/phase-06-tests-and-verification.md +++ b/plans/260429-1511-loto-upstream-sync/phase-06-tests-and-verification.md @@ -95,7 +95,7 @@ pending. - [ ] `./gradlew :app:test` clean - [ ] `./gradlew :app:assembleDebug` clean - [ ] Manual smoke per checklist -- [ ] Update `plans/TODO.md` once verified +- [ ] Update `TODO.md` once verified ## Success criteria diff --git a/plans/260831-1131-native-android-rewrite/phase-03-audio-subsystem.md b/plans/260831-1131-native-android-rewrite/phase-03-audio-subsystem.md index a675970..a4fffde 100644 --- a/plans/260831-1131-native-android-rewrite/phase-03-audio-subsystem.md +++ b/plans/260831-1131-native-android-rewrite/phase-03-audio-subsystem.md @@ -23,7 +23,7 @@ sequencing and cancellation semantics as `web/src/lib/voice.js`. a new utterance cancels any in-flight one (token semantics of `voice.js`). - Non-functional: no audio focus grab beyond transient playback - (`plans/TODO.md` flags the unanswered incoming-call question — decide + (`TODO.md` flags the unanswered incoming-call question — decide and document here: use `AudioAttributes` USAGE_MEDIA + `setHandleAudioBecomingNoisy`, request no focus or transient-may-duck; record the choice in the code and android README); no INTERNET. @@ -77,7 +77,7 @@ Package `com.miti99.loto.audio`: - **ExoPlayer `asset:///` quirks on API 24** — the old port's research already picked ExoPlayer over SoundPool (decision record: - `git show f7cbb6e:android/plans/TODO.md`; the standalone research + `git show f7cbb6e:android/TODO.md`; the standalone research reports no longer exist). Signal: playback failure on the API 24 emulator in Phase 10. Response: fall back to `AssetFileDescriptor` + `ProgressiveMediaSource`, or MediaPlayer for diff --git a/plans/260831-1131-native-android-rewrite/phase-05-player-board-ui.md b/plans/260831-1131-native-android-rewrite/phase-05-player-board-ui.md index 2085d0b..ff6730f 100644 --- a/plans/260831-1131-native-android-rewrite/phase-05-player-board-ui.md +++ b/plans/260831-1131-native-android-rewrite/phase-05-player-board-ui.md @@ -35,7 +35,7 @@ celebration. Compose throughout, driven by `PlayerBoardViewModel`. match web copy exactly. - Non-functional: haptics via `VIBRATE` on cell tap, suppressed when the system reduced-motion/haptics-off signals say so (mirror wrapper - behavior recorded in `plans/TODO.md` QA list); 60fps grid on API 24 + behavior recorded in `TODO.md` QA list); 60fps grid on API 24 hardware (no per-cell recomposition storms — stable keys, immutable cell state). diff --git a/plans/260831-1131-native-android-rewrite/phase-08-platform-behaviors-and-branding.md b/plans/260831-1131-native-android-rewrite/phase-08-platform-behaviors-and-branding.md index 0b08339..32d3133 100644 --- a/plans/260831-1131-native-android-rewrite/phase-08-platform-behaviors-and-branding.md +++ b/plans/260831-1131-native-android-rewrite/phase-08-platform-behaviors-and-branding.md @@ -13,7 +13,7 @@ dependencies: [5, 6, 7] Everything that made the wrapper feel like a real Android app, now native-first: keep-screen-on, back handling, theming, splash, launcher -icons, edge-to-edge. The wrapper-era device-QA list in `plans/TODO.md` +icons, edge-to-edge. The wrapper-era device-QA list in `TODO.md` is the acceptance spec. ## Requirements @@ -56,7 +56,7 @@ is the acceptance spec. `res/values*/themes.xml`, `values-night/` - Modify: `MainActivity.kt` (back callback, edge-to-edge), `LotoAppRoot.kt` (footer, keep-screen-on binding) -- Spec: `plans/TODO.md` device-QA list, wrapper `MainActivity.java` + +- Spec: `TODO.md` device-QA list, wrapper `MainActivity.java` + `res/` in git history, `web/src/app.css` (colors), `web/src/lib/PageFooter.svelte` ## Implementation Steps @@ -72,7 +72,7 @@ is the acceptance spec. ## Success Criteria -- [ ] Wrapper-era QA items in `plans/TODO.md` that are still applicable pass on an emulator (screen-awake, back chain, exit dialog copy, themed icon, dark splash) +- [ ] Wrapper-era QA items in `TODO.md` that are still applicable pass on an emulator (screen-awake, back chain, exit dialog copy, themed icon, dark splash) - [ ] No hardcoded color literals outside `ui/theme` (lint check or grep) - [ ] App label, icon, splash match the brand in light + dark diff --git a/plans/260831-1131-native-android-rewrite/phase-09-wrapper-removal-and-ci-rewire.md b/plans/260831-1131-native-android-rewrite/phase-09-wrapper-removal-and-ci-rewire.md index a3b8852..bf7f46a 100644 --- a/plans/260831-1131-native-android-rewrite/phase-09-wrapper-removal-and-ci-rewire.md +++ b/plans/260831-1131-native-android-rewrite/phase-09-wrapper-removal-and-ci-rewire.md @@ -39,7 +39,7 @@ pipeline stays untouched. `android/README.md` full rewrite (native stack, build, release, permissions rationale kept — no INTERNET), `docs/play-store-publishing.md` spot-check (paths to build.gradle change), - `plans/TODO.md`: drop wrapper-only items, keep still-valid ones. + `TODO.md`: drop wrapper-only items, keep still-valid ones. ## Architecture @@ -47,7 +47,7 @@ Move, don't rewrite: `git rm -r` the Capacitor tree, `git mv android-native android`, fix the audio-assets relative path (`../web/static/audio` from `android/app/`), fix workflow paths. History preserves the wrapper (like the old native port before it) — -note the swap in the commit message and `plans/TODO.md` decisions record. +note the swap in the commit message and `TODO.md` decisions record. ## Related Code Files @@ -56,7 +56,7 @@ note the swap in the commit message and `plans/TODO.md` decisions record. - Move: `android-native/**` → `android/**` - Modify: `.github/workflows/ci.yml`, `.github/workflows/android-release.yml`, `.github/actions/setup-android/action.yml`, root `README.md`, - `docs/play-store-publishing.md`, `plans/TODO.md` + `docs/play-store-publishing.md`, `TODO.md` - Create: `android/README.md` (rewritten) ## Implementation Steps diff --git a/plans/260831-1131-native-android-rewrite/phase-10-qa-and-release.md b/plans/260831-1131-native-android-rewrite/phase-10-qa-and-release.md index 4dcd7fe..2eb2d25 100644 --- a/plans/260831-1131-native-android-rewrite/phase-10-qa-and-release.md +++ b/plans/260831-1131-native-android-rewrite/phase-10-qa-and-release.md @@ -41,7 +41,7 @@ without breaking the running 14-day tester window. ## Related Code Files - Modify: `android/app/build.gradle.kts` (only if versionCode/Name - need correction), `plans/TODO.md` (retire completed QA items, carry + need correction), `TODO.md` (retire completed QA items, carry genuinely open ones — e.g. store-listing assets) - No feature code — QA findings each become a fix commit or a tracked todo item; do not batch silent fixes into the release commit. @@ -53,13 +53,13 @@ without breaking the running 14-day tester window. Studio/SDK command-line tools on this machine, create AVDs for API 24, 31, 36 (or attach a physical device via ADB). Budget ~0.5d extra the first time. -1. Build QA matrix from `plans/TODO.md` device-QA list + the checklist +1. Build QA matrix from `TODO.md` device-QA list + the checklist above; run on API 24 / 31 / 36 emulators (BlueStacks optional). 2. File and fix blockers; re-run the affected checks. 3. Verify versionCode/Name; tag `v0.2.0`; watch `android-release` run. 4. Confirm Play console shows the build on `alpha`; monitor tester opt-in count for the next days (window must not dip below 12). -5. Sweep `plans/TODO.md`: mark superseded wrapper items, record the +5. Sweep `TODO.md`: mark superseded wrapper items, record the decision reversal, keep the production-access log going (tester feedback + exercised features — Play asks for both). @@ -71,7 +71,7 @@ without breaking the running 14-day tester window. all green in the tag run) - [x] Play `alpha` accepted the upload (`Validating tracks: 'alpha'`); tester opt-in count to be monitored over the coming days -- [x] `plans/TODO.md` reconciled with the new reality +- [x] `TODO.md` reconciled with the new reality ## QA log — 2026-08-31, API 36 emulator (Medium_Phone_API_36.1) diff --git a/plans/260831-1131-native-android-rewrite/plan.md b/plans/260831-1131-native-android-rewrite/plan.md index b762c75..5c3a019 100644 --- a/plans/260831-1131-native-android-rewrite/plan.md +++ b/plans/260831-1131-native-android-rewrite/plan.md @@ -21,7 +21,7 @@ behavioral spec; the retired 2026-04 native port (git `f7cbb6e`) is 2026-08-31). The wrapper is deleted in the same effort; the native app takes over the package id, signing key, and tag-driven release pipeline. -**Decision reversal on record:** `plans/TODO.md` records "Native +**Decision reversal on record:** `TODO.md` records "Native Kotlin/Compose port retired (2026-05-10) in favour of the wrapper, for maintenance parity." The user explicitly reversed this on 2026-08-31. Trade-off accepted: every future `web/` feature must now be hand-ported @@ -54,7 +54,7 @@ to Kotlin; the two apps no longer ship from one codebase. ## Non-goals - iOS target, multiplayer, i18n, background audio, share sheet — all stay - in the `plans/TODO.md` parking lot. + in the `TODO.md` parking lot. - Migrating WebView `localStorage` (wrapper users' settings/round state) into the native app — loss accepted (Validation Session 1); release notes must state it. @@ -87,7 +87,7 @@ after 4. Everything else is sequential. | Settings contract | `web/src/lib/settings-store.svelte.js` (DEFAULT_SETTINGS) | | Voice semantics (cancellation, chờ+N sequence) | `web/src/lib/voice.js` + test | | Auto-cross, auto-countdown | `web/src/lib/player-auto-cross.js`, `AutoCountdown.svelte` | -| Wrapper-era platform behaviors | `plans/TODO.md` (device QA list), old `android/.../MainActivity.java`, `web/src/lib/wake-lock.js`, `overlay-history.js` | +| Wrapper-era platform behaviors | `TODO.md` (device QA list), old `android/.../MainActivity.java`, `web/src/lib/wake-lock.js`, `overlay-history.js` | | Visual parity details (confetti tiers, chờ ring, palette, hint copy) | superseded plan `plans/260429-1511-loto-upstream-sync/` phase files | | Old port architecture (reference only, no code reuse) | git `f7cbb6e` tree, commit message of `90a9dd1` | @@ -136,7 +136,7 @@ phase files; chờ = exactly-one-remaining-in-row Failures/refinements (both propagated): 1. [Fact Checker] `plans/reports/researcher-260427-*` — not found; - phase 3 now cites only the `f7cbb6e:android/plans/TODO.md` decision + phase 3 now cites only the `f7cbb6e:android/TODO.md` decision record for the ExoPlayer pick. 2. [Fact Checker] Exit-dialog Vietnamese strings live in wrapper `res/values/strings.xml:9-12`, not `MainActivity.java` — phase 8 diff --git a/plans/journals/2026-08-31-native-android-rewrite-implementation.md b/plans/journals/2026-08-31-native-android-rewrite-implementation.md index f3775b6..3e871a1 100644 --- a/plans/journals/2026-08-31-native-android-rewrite-implementation.md +++ b/plans/journals/2026-08-31-native-android-rewrite-implementation.md @@ -57,7 +57,7 @@ generate/clear replays (H2), auto-call lifecycle pause on background (H3), color sliders commit on drag end (H4), R8 `assembleRelease` in CI (H5), auto-cross cursor clamp + ván-mới on shrink (M1), wall-clock countdown immune to animator scale (M3), `grep -Fvx` in the tag guard (L2). Four new -tests cover H2/H3/M1. Minors deferred to `plans/TODO.md` tech debt. +tests cover H2/H3/M1. Minors deferred to `TODO.md` tech debt. ## State for the next session diff --git a/plans/reports/code-reviewer-260831-2213-android-review.md b/plans/reports/code-reviewer-260831-2213-android-review.md index 99a3ceb..4cbc75c 100644 --- a/plans/reports/code-reviewer-260831-2213-android-review.md +++ b/plans/reports/code-reviewer-260831-2213-android-review.md @@ -211,7 +211,7 @@ per-frame `withFrameNanos` loop in `AutoCountdown.kt:143-153`, auto-call at 1 s/number keeps the main thread busy. Not a blocker for a fairground app on modern hardware, but worth measuring -on the API 24 target listed in `plans/TODO.md`. Cheap mitigations: hoist +on the API 24 target listed in `TODO.md`. Cheap mitigations: hoist `MasterBoardLayout.BOARD` rows into `key(num)` blocks, or pass `isCalled` / `isLast` as lambdas so the token colour changes without recomposing the cell. @@ -321,7 +321,7 @@ Recorded so a future audit does not re-litigate them: animation so the digit still ticks under "remove animations" (`AutoCountdown.kt:139-153`) — correct, and the comment explains why. - `KeepScreenOn` releases the flag in `onDispose` and is keyed on `remaining`, - matching the `plans/TODO.md` QA items. + matching the `TODO.md` QA items. - Manifest surface is minimal: `VIBRATE` only, `ACCESS_NETWORK_STATE` stripped, one exported activity with a LAUNCHER filter. @@ -391,5 +391,5 @@ Then assert that `generate()` before `gate.complete(Unit)` wins. 3. **L8** — was `launchMode="singleTask"` carried over deliberately from the Capacitor wrapper manifest, or copied without a reason? 4. **M6** — has the master panel been profiled on the API 24 device named in - `plans/TODO.md`, or is that QA item still open? The `todo.md` list shows + `TODO.md`, or is that QA item still open? The `todo.md` list shows all device-QA boxes unchecked. diff --git a/plans/reports/fullstack-developer-260831-2226-android-fixes.md b/plans/reports/fullstack-developer-260831-2226-android-fixes.md index ff36d18..7dc622f 100644 --- a/plans/reports/fullstack-developer-260831-2226-android-fixes.md +++ b/plans/reports/fullstack-developer-260831-2226-android-fixes.md @@ -114,7 +114,7 @@ Scope: `android/` only (per delegation; `web/` read-only for M2 parity check; - **Deferred, not applied.** The report frames this as "not a blocker... worth measuring," conditional on API 24 device profiling that - `plans/TODO.md` shows as still unchecked. The suggested mitigations + `TODO.md` shows as still unchecked. The suggested mitigations (`key(num)` blocks or lambda-based cell props) touch the hot `MasterBoard`/cell-render path with no compose UI test harness in this project to catch a visual regression — the risk/verification ratio didn't @@ -193,7 +193,7 @@ Scope: `android/` only (per delegation; `web/` read-only for M2 parity check; in-progress round acceptable/desired? Needs a product call, not a code fix. 3. M6: is there an actual profiled slowdown on the API 24 device from - `plans/TODO.md`, or should this stay deferred until QA reports one? + `TODO.md`, or should this stay deferred until QA reports one? Status: DONE_WITH_CONCERNS Summary: Fixed H1, H2, M1, M3, M4 (partial, documented gap), M5, L1, and the two clear-cut manifest/gradle hygiene items (L8, L11); confirmed M2 already matches web and left as-is; deferred M6, L2-L7, L9, L10 with reasons. All unit tests (including 5 new race-regression tests) and lint pass. diff --git a/web/package.json b/web/package.json index 1b7e90f..200bbc1 100644 --- a/web/package.json +++ b/web/package.json @@ -20,7 +20,6 @@ "lightningcss-linux-x64-gnu": "1.33.0" }, "overrides": { - "serialize-javascript": "^7.0.5", "cookie": "^0.7.2" }, "devDependencies": {