chore: move TODO.md to the repo root and drop the redundant serialize-javascript override

This commit is contained in:
tiennm99 committed 2026-10-12 11:28:53 +07:00
1 parent 8c2a6c2413
commit 28825b78e4
12 files changed
+26 -27

No files matched your search

+2 -2
View File
@@ -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
@@ -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
@@ -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
@@ -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).
@@ -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
@@ -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
@@ -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)
@@ -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
@@ -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
@@ -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.
@@ -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.
-1
View File
@@ -20,7 +20,6 @@
"lightningcss-linux-x64-gnu": "1.33.0"
},
"overrides": {
"serialize-javascript": "^7.0.5",
"cookie": "^0.7.2"
},
"devDependencies": {