Formal audit of phuzzle behavior, coverage, and release readiness as of 2026-03-21.
This audit covered:
- documented product behavior in:
docs/FEATURES_IMPLEMENTED.mddocs/CHANGES.mddocs/SHARING.mddocs/STREAK-FREEZE.mddocs/BUG_REPORT.mddocs/MOBILE_QA.mddocs/STATS_UI_QA.md
- shipped routes in
src/app/App.tsx - automated coverage in
e2e/and Vitest - targeted cross-browser/browser-project verification
Status: ready, with a stable one-command browser matrix gate.
What is in good shape:
- core gameplay, home, daily, setup, packs, stats, streak-freeze, theme, and share flows have broad automated coverage
- targeted browser slices passed after fixing stale selectors and a WebKit-only tray assertion tolerance
- the app still looks ship-ready based on the focused runs and the product areas reviewed
What is still not fully closed:
- true real-device coverage is still manual, per
docs/MOBILE_QA.md - some documented features still rely more on manual QA than direct end-to-end coverage
npm run -s test- previously completed in this audit session: 158 passed / 158 tests
npm run -s test:e2e -- e2e/setup-mobile-fit.spec.ts e2e/context-menu-mobile.spec.ts- after selector updates: 35 passed / 35 tests
npm run -s test:e2e -- e2e/tray-edge-webkit.spec.ts- after WebKit tolerance update: 5 passed / 5 tests
The original monolithic all-project run was unstable, so the release gate was changed to a sequential project matrix.
Current default command:
npm run test:e2e
Current behavior:
- runs Playwright projects one at a time:
chromiumchromium-tz-lachromium-tz-aucklandfirefoxwebkit
Current result:
- 34/34 passed in
chromium - 34/34 passed in
chromium-tz-la - 34/34 passed in
chromium-tz-auckland - 34/34 passed in
firefox - 34/34 passed in
webkit
That gives a clean full browser matrix result with the stable execution path now wired into the default test command.
Severity: medium
Status: fixed
Two E2E specs were still targeting the old Choose Photo entry point even though the current menu flow starts from Quick Play.
Files updated:
e2e/setup-mobile-fit.spec.tse2e/context-menu-mobile.spec.ts
Impact:
- these stale selectors produced false-negative failures in the audit
- after updating them to the shipped Quick Play flow, the targeted cross-browser slice passed
Severity: low
Status: fixed
e2e/tray-edge-webkit.spec.ts treated any negative scrollLeft reading as a failure. In WebKit, a tiny negative read can occur from scroll rounding even while the tray remains visually clamped.
File updated:
e2e/tray-edge-webkit.spec.ts
Impact:
- removed a noisy flaky failure without weakening the meaningful tray clamp signal
Severity: medium
Status: fixed
The combined all-project Playwright sweep proved unstable. The fix was to move the default browser gate to a sequential runner that executes each Playwright project independently while preserving the same coverage.
Files updated:
scripts/test-e2e-matrix.shpackage.json
Impact:
npm run test:e2eis now a stable release command again- cross-browser coverage remains intact
- project-to-project interference is avoided
- Home / menu
- logo, primary CTAs, Stats, Help
- Feedback
- home feedback entry point, feedback modal actions, bug/feature form submission
- Daily flow
- daily modal, difficulty options, start path
- Quick Play staged setup
- category chooser, puzzle chooser, setup modal, start flow
- Play screen
- tray presence, mobile fit, completion overlay, completion actions
- Stats / packs
- packs list, stats route, compact modal checks
- Routes
/new -> /- unknown route ->
/ - pack detail deep link
- not-found pack detail state
- Streak freeze
- visible offer, dismiss path, keyboard access
- Theme
- settings open and theme switch
- Tray bounds
- explicit tray edge coverage across projects
- Co-op share / play with friend
- documented in
docs/SHARING.md - I did not find a dedicated E2E spec for creating/joining a session
- documented in
- Daily Share (Wordle-style text share)
- documented in
docs/SHARING.md - not obviously covered by a dedicated E2E
- documented in
- Feedback end-to-end external form submission
- modal path is now covered
- actual third-party form handoff is still better treated as integration/manual behavior than browser E2E
Per docs/MOBILE_QA.md and docs/STATS_UI_QA.md, the following still require real-device/manual verification:
- iPhone SE Safari
- iPhone 13/14/15-class Safari
- Pixel-class Android Chrome
- safe-area / home-indicator / notch behavior
- rotate-and-recenter behavior
- OS text-size increase checks
- some stats modal density/readability checks at real device sizes
Routes currently shipped in src/app/App.tsx:
//new/play/stats/packs/packs/:packId*-> redirect/
- add direct E2E coverage for:
- co-op share
- daily share
- split browser projects into separate CI jobs or smaller suites
- keep real-device checklist mandatory before release
- keep focused feature slices as the strongest day-to-day regression gate
If the question is “does the product look ready enough to ship?”, the answer is yes.
If the question is “do we now have a stable one-command browser matrix gate?”, the answer is also yes.
The remaining work is coverage depth and real-device/manual QA, not a broken release path.