100 Commits
Author SHA1 Message Date
John Smith 448bd8d490 ci(release): add Android release keystore signing, GPG signatures, and Sigstore attestations 2026-09-13 12:30:14 -04:00
John Smith 2a8db2ff2b feat(social): mark cloud inbox messages read server-side via /v1/social/me/inbox/{id}/read 2026-09-13 12:30:14 -04:00
John Smith 41b51ace8d feat(social): read cloud inbox via /v1/social/me/inbox; surface sign-in errors
CloudSocialClient now parses the modern JSON inbox instead of the host-gated legacy Atom feed (which 404s on a normal cloud base URL), so the cloud inbox can actually sync; the dead Atom parser is removed. CloudSignIn records lastError and settings shows it (e.g. an unverified email is denied with access_denied). Suite 1,602.
2026-09-12 20:40:22 -04:00
John Smith b88ed0c518 test(playback): pure sleep-timer math + controller uses it
Extracts deadline/remaining/expiry into SleepTimer with unit tests (arm,
disarm, countdown clamp, expiry) so the M10 sleep timer is directly covered.
2026-09-12 19:44:18 -04:00
John Smith 989bc4ca56 docs(parity): Track B/C/D results, emulator GPU workaround, crawl P0 note 2026-09-12 19:42:51 -04:00
John Smith cea51f16a4 fix(playback): connect() must touch MediaController on the application thread
The audiobook speed restore ran on Dispatchers.Default (DoradoApp connects
from appScope), so every app launch died with 'MediaController method is
called from a wrong thread' — the emulator entry crawl caught it (63/63 crash,
now 63/63 ok; flow crawl 63/63). connect() resumes the controller calls on
Dispatchers.Main.
2026-09-12 19:39:44 -04:00
John Smith dcad657955 feat(queue): showlist move up/down, play-next, remove menu + clear
Surfaces the QueueEngine operations in the Now Playing showlist: long-press
opens move up / move down / play next / remove; the header gains clear.
2026-09-12 18:24:12 -04:00
John Smith 5c707e6b73 docs(parity): canon PIN-lock + card-export records; roadmap status for M5/D2/backlog/rosters 2026-09-12 18:23:39 -04:00
John Smith 8597a28fab docs(parity): mark M5 card export, D2 inbox, queue/playlists/PIN and roster deltas 2026-09-12 18:23:39 -04:00
John Smith c675375c48 feat(content): roster uplift — PGR 12 cars/6 tracks/18 events, Echoes 24 arenas, 8 bowling lanes
- PGR: four cars per class (12), three more code-spline city circuits (6),
  six more career events (18) with unlock/reward graph integrity tests; menu
  event count is dynamic now.
- Echoes: 24 authored arenas (was 12), all corridor/crystal-validated for the
  radius-21 puck; existing indices unchanged.
- Bowling: 8 lanes/balls/rivals at the existing 1:1:1 proportion with a setup
  layout that fits; per-lane determinism tested.
- Labyrinth verified at device parity (112+4 mazes); documented.
- Echoes and PGR entry goldens re-recorded for the new counts; specs updated.
- Suite 1,598/0.
2026-09-12 18:23:38 -04:00
John Smith c5c1924c00 feat(backlog): deep queue engine, built-in playlists, PIN screen lock
- media/QueueEngine.kt: bounded queue (500) + played-history (100) with
  back/forward branches, insert-next/move/clear; PlaybackController mirrors
  mutations to Media3, previous() restarts within 3 s else steps through
  history, and a PlaybackEvent flow exposes positioned/playing/paused/stopped.
- Built-in playlists (BuiltIn-FavoriteTracks/MostPlayedArtists/RecentTracks)
  derived from hearts, play counts and history; rendered read-only in the
  playlists pivot and unit-tested.
- PIN screen lock (device GemSettingPinLockScene): PBKDF2-HMAC-SHA256 salted
  hash in DataStore (never plaintext), settings ▸ screen lock set/change/clear,
  auto-lock toggle, lock-now; LockShade shows a tokenized numeric keypad with
  a 5-try/30 s limiter and back cannot bypass; no-PIN drag-unlock unchanged.
- 30 new tests; suite 1,598/0.
2026-09-12 18:23:38 -04:00
John Smith 501f821b24 feat(social): Zune Card export + local-first cloud inbox (M5/D2)
- social/CardRenderer.kt: deterministic Zune Card bitmap (our own mark, Selawik,
  stats); social/CardExporter.kt: ACTION_SEND PNG via FileProvider + save to
  Pictures (API 29+). Social screen gains export actions.
- CloudSocialClient (feed/card/inbox) is settings-gated; inbox is local-first
  via a new inbox_messages Room table (v8 + MIGRATION_7_8), InboxRepository
  with mark-read and cached-offline behaviour and explicit offline labels.
- Social screen and the zunesocial mock gain feed/inbox/card tabs; zunesocial
  goldens re-recorded. Server caveat documented: the cloud inbox is read-only,
  so read state stays local.
- Tests: CardRenderer, CloudSocialClient, InboxRepository, Inbox migration,
  plus the audiobook migration chain update. Suite 1,598/0.
2026-09-12 18:23:28 -04:00
John Smith 35eb3aacc8 feat(audiobooks): audiobook media model, scanner, library + parts player (D4)
- Model: Audiobook/AudiobookPart with a pure progress codec and speed ladder
  (0.75/1.0/1.25/1.5/2.0).
- Scanner: a second MediaStore pass detects books by genre signal or
  numbered-chapter sibling directories; grouping heuristics are pure and
  unit-tested; the music scan is unchanged.
- Room v7 (MIGRATION_6_7): audiobooks + audiobook_parts tables, DAO,
  AudiobookRepository with group-keyed rebuild that preserves resume and one
  bookmark per book.
- UI: 'audiobooks' as the sixth music crossbar pivot (canon §3.1 home menu
  untouched; GemLibraryAudiobookPartScene parity), book list, book detail with
  resume CTA, parts list, bookmark jump, compact player with speed steps.
- PlaybackController: PlaybackSource.AUDIOBOOK, playAudiobook(startPositionMs),
  setSpeed, speed/currentAudiobookId flows, reset on non-book queues; resume
  persisted from controller state.
- Canon §3.3/§10 and roadmap D4 updated. 30 new tests; suite 1,551/0.
2026-09-12 18:01:31 -04:00
John Smith 4aae2ea9dc docs(parity): M5/M13 status for Smart DJ, podcast search, photos, radio/picture NP 2026-09-11 15:26:31 -04:00
John Smith d28ea0ec0a feat(parity): radio + picture Now Playing, immersive presentation (M13-B4)
- PlaybackController gains an explicit PlaybackSource (LIBRARY/RADIO) set by
  the radio screen; Now Playing renders station name/dial/live with no
  seekbar, queue, hearts or lyrics, plus a matching screensaver.
- Picture presentation: full-bleed pager with wrap-around, title/date caption,
  auto-hiding chrome (DoradoMotion), entered from both picture viewers; pinch
  zoom/double-tap untouched.
- Shell hides the MiniPlayer during full-bleed presentations via a graph
  immersive signal.
- Canon §4 + roadmap updated.
2026-09-11 15:26:31 -04:00
John Smith ef31872606 feat(parity): podcast search + artist photo grid (M5/M13-B5)
- Podcast search: local subscribed-feed filter + dorado-cloud podcast
  directory when enabled; debounced panel mirroring the music search states;
  cloud hits subscribe-and-play; explicit local-only/offline labels.
- Artist photos: cloud artwork module -> MusicBrainz release groups -> Cover
  Art Archive -> cached wallpaper fallback, grid + full-bleed viewer; source
  selection and URL shaping are pure and unit-tested (22 new tests).
2026-09-11 15:26:31 -04:00
John Smith 1b09c2a42d feat(music): Smart DJ tap-to-build in the crossbar (M5)
Music screen action row gains 'smart dj': a menu that builds and plays a mix
from the current track (SIMILAR_TO_TRACK), the hearted favorites, or the most
played tracks via CloudMixService (local-first, cloud-enhanced).
2026-09-11 15:26:31 -04:00
John Smith 2d220bc3e8 feat(notification): custom lock-screen surface + golden stabilization
- DoradoMediaNotificationProvider: dedicated public low-importance channel,
  compact transport from the session command layout, album art via a caching
  session bitmap loader (async re-post), content intent to the app; wired via
  setMediaNotificationProvider + CacheBitmapLoader(SimpleBitmapLoader).
- Robolectric provider test builds a real session notification.
- Goldens: the fixed 900ms virtual advance rendered blank frames under load;
  replaced with a settle loop (100ms steps until idle) and actual-frame dumps
  on mismatch. fan-prediction's device id now derives from AppClock instead of
  a random UUID so entry frames are deterministic. Two full executions green
  (1,488 tests).
2026-09-11 15:05:53 -04:00
John Smith 35892740f3 feat(visualizer): real-FFT spectrum from the playback PCM tap (C5)
- TapRenderersFactory installs TeeAudioProcessor into the audio sink so
  VisualizerBus mirrors rendered PCM into a mono ring buffer (no RECORD_AUDIO
  permission; buffers pass through untouched).
- SpectrumBands: log-spaced band mapping, sqrt perceptual scaling, per-frame
  peak-hold decay (pure, unit-tested).
- SpectrumVisualizer accepts live levels and falls back to the procedural
  animation before the first window; Now Playing polls per frame and resets
  the bus on pause.
- Tests include an end-to-end PCM-tap integration test. Suite 1487/1487.
2026-09-11 14:55:26 -04:00
John Smith 64211bf506 feat(playback): fade-through crossfade + sleep timer (M6/M10)
- FadeRamp.kt: pure linear ramp math (window, steps, bounds) with tests.
- PlaybackController: live crossfade setting provider; tail fade-out via the
  position ticker, fade-in on AUTO transitions, quick fade for manual skips,
  pause resets volume; sleep timer with remaining StateFlow that fades out and
  pauses on expiry; countdown surfaced in the Now Playing status OSD.
- Settings ▸ playback: crossfade off/2/4/6/8 s and sleep timer
  off/15/30/45/60/90 min (persisted; canon §10 labelled as extensions).
- Canon §10 + roadmap M6/M10 updated.
2026-09-11 14:51:59 -04:00
John Smith e889cd8b55 tools: classify official apps by render stack (framework vs ZDKGL)
Scans the external decompiled corpus and reports per-app framework/GL
classification plus the Zune framework families each app uses. Writes a
prose-only summary for dorado-emu docs.
2026-09-11 14:48:55 -04:00
John Smith 161f129f6a tools: add intake stage for newly discovered archive.org items
Adds zune-homebrew-pack-v1, zune-Stuff, zune-4.8-beta-2098,
hexic-for-zune-hd and zune-firmware-x-86 to the mirrored categories with
a dedicated --stage intake, and merges per-item results into the shared
_mirror-report.json instead of overwriting prior runs.
2026-09-11 14:48:23 -04:00
John Smith 39d6626b53 feat(goldens): freeze the wall clock; 126 device+landscape goldens (A4)
- AppClock seam: production reads the system clock; tests freeze it. All
  app seeds/time reads route through it, so entry frames are deterministic.
- GoldenCaptureTest now covers every app at device 480x272 and adaptive
  landscape (126 goldens) with the clock frozen at 2024-06-15T12:34Z; the
  four clock-screen exclusions are gone.
- Checklist regenerated (goldens 126/126, flow crawl 63/63).
- Audit §8 records the Track A hardening results. 1,477/1,477 tests.
2026-09-11 14:21:44 -04:00
John Smith d4be623ec7 feat(a11y): accessible touch contract for all mini-app controls
- AppTouch.kt: appTap (clickable with null indication: TalkBack click action,
  always-latest lambda, no Material ripple), appHold (press/release with an
  accessible click), appDescription (screen-reader summaries for boards and
  readouts).
- Converted button/row/tab controls across the catalog; positional board
  taps and drags stay raw but now carry board state descriptions; 3D hosts
  describe mode/score.
- Six entry menus gained verticalScroll because the new semantics exposed
  zero-height rows at the adaptive canvas (previously untappable).
- Goldens re-recorded for the six layout-affected screens.

1410/1410 tests; ui_lint clean; LayoutBounds 126/126; flow crawl 63/63.
2026-09-11 14:16:14 -04:00
John Smith 89c97d1c43 ci(parity): lint + source guards in CI; interactive flow crawl tool
- CI now runs lintDebug, tools/ui_lint.py and a py_compile check on the
  corpus tools after the unit/UI suites.
- tools/emulator_flow_crawl.py drives each app's primary flow (element taps
  by text bounds since pointerInput controls lack click semantics), then
  backgrounds/relaunches and cold-restarts it, scanning logcat per step.
  Baseline: 63/63, 0 crashes (reports/emulator/flows/, git-ignored).
2026-09-11 14:16:14 -04:00
John Smith 5b333ead75 test(goldens): drop the remaining clock-screen golden (alarm) 2026-09-11 12:27:49 -04:00
John Smith cfc2e9e46f feat(parity): static guards, coverage checklist, three more silent-synth fixes
- tools/ui_lint.py + DesignInvariantTest guards: MiniSynth must start,
  pointerInput(Unit) must be reviewed, sub-screens must forward onBack, IME
  wiring must exist. The synth rule immediately caught ColorSpill,
  Supernova and Tiles shipping silent SFX — fixed.
- docs/ui-parity-checklists.md: 63-app coverage (spec/smoke/bounds/golden/
  crawl, zero open gaps).
- 1,410/1,410 tests; lint green.
2026-09-11 12:27:28 -04:00
John Smith f29d4cec9f docs(parity): close the register and record results; lint + golden hygiene
- Register: 61 fixed, 23 verified, 2 documented N/A, 0 open.
- Audit: Phase 2/4 results (verification layers, residual notes).
- Goldens: exclude four clock/date screens with rationale.
- Lint: unused BoxWithConstraints scopes replaced (3 apps).
- README test count 1,406.
2026-09-11 12:16:25 -04:00
John Smith ece6b5356a test(ui): layout-bounds gate for unreachable controls
For every app at adaptive portrait and landscape, no clickable semantics
node may sit entirely outside the viewport unless it has a scrollable
ancestor. 126/126 green — the off-screen-control class from the audit is
closed for tappable (clickable-semantics) UI.
2026-09-11 12:04:15 -04:00
John Smith 8106ac96f3 test(ui): golden screenshot regression for all 63 apps
- GoldenCaptureTest (ParameterizedRobolectric + native graphics) captures
  each app's entry screen at device size 480x272 and compares within a
  per-channel tolerance; goldens recorded to app/src/test/goldens (880KB).
- The goldens directory is a declared test input so CI re-runs on change;
  -Dgolden.update=true re-records after intentional visuals.
- Harness root tagged for exact-canvas capture.

Verified: corrupted golden fails, restored golden passes.
2026-09-11 11:55:16 -04:00
John Smith 51123c5937 test(ui): hardware-back contract + missing onBack wiring
- BackContractTest proves system back returns from a game sub-screen to its
  in-app menu (checkers records, hexic difficulty).
- Fix the class of sub-screens that declared an onBack parameter but never
  passed it to DetailScaffold (checkers/chess records+learn, trash throw
  about, bowling records, hexic difficulty), so the H-01 contract applies.

1221/1221 tests green.
2026-09-11 11:49:41 -04:00
John Smith 73574a5998 fix(apps): post-wave visual polish
- fan-prediction: duplicate offline banner removed.
- audiosurf: ride rows 46dp so artist lines are not clipped.
- shuffle by album: transport wraps (FlowRow) so 'shuffle' is readable.
- sudoku/reversi: duplicate in-content headings removed (H-13).
- weather: condition glyph clipped so no stroke bleeds into neighbours.
2026-09-11 11:47:04 -04:00
John Smith f460587d8a docs(parity): close 60 register rows after the W-P0 wave
Statuses: 60 fixed, 23 verified-clean, 2 open (H-12 menu rhythm, H-13
duplicate headings), 1 na (V-15 cropped headers are canon).
2026-09-11 11:39:37 -04:00
John Smith a84e789b76 fix(fan-prediction): wrap footer actions so all controls are visible
The refresh/standings/settings/about row now uses FlowRow instead of a
horizontal scroller; the fourth button no longer sits off-screen.
2026-09-11 11:39:28 -04:00
John Smith a606fcadf1 fix(apps): W-P0 remediation wave — 24 P0 defects + P1/P2 parity fixes
Harness: engine3d per-frame buffer allocations removed, bounded GPU mesh/
texture caches with sweep + release, atomic scene rebuild; cached uniform
lookups.

Game-breakers closed (register ids):
- A-01 run-and-jump death softlock; A-02 hairball frozen retry;
  A-03 splatter-bug frozen retry; goo-splat retry added.
- A-04 vine-climb stale-capture rewind; A-05 BBQ + A-06 Bees per-frame
  gesture churn (stable run tokens + rememberUpdatedState).
- A-07 slider-puzzle pause/autosave; A-08 wordmonger autosave + save&exit;
  A-09 castles live-camera taps; A-10 texas hold'em buy-in refund +
  persisted active event.
- A-11 facebook About trap; A-12 twitter orphan DMs (id-keyed store);
  A-13 piano octave snap; A-14 hearts PassPicker toggle.
- A-15 metronome drag survival; A-16 calendar month scroll;
  A-17/18/19 shell-game/snowball/tug-o-war sensorless fallbacks.
- A-20 AlarmManager exact-alarm guard; A-21 alarm sleep persistence.
- A-22 3D puzzle rebuild storm + texture cache; A-23 PGR mesh leak +
  lifecycle-gated engine audio; A-24 prop yaw; A-25 echoes countdown
  input; A-26 skate pause mid-grind; A-27 audiosurf stall fallback;
  A-28 bowling full-setup resume + background loop gates; A-29
  fingerpaint autosave/stroke commit; A-30 checkers AI plies in draw
  clock; A-31 sudoku timer persistence; A-32 supernova stale continue;
  A-33 cold-start clobber gates across 7 apps.
- H-08 Room/appState write throttling; H-09 recording out of composition
  with once-guards; H-10 synth.start; H-15 tap targets.

Visual/layout: fan-prediction overflow + 2-digit scores, shell-game shop
column, solitaire action column, msnmoney tabs, messenger presence,
shuffle rows, weather insets, zunereader/social row widths, note search
placeholder, calendar empty state, duplicate headings removed.

1219/1219 tests green (includes 63-app smoke at 3 parity configs).
2026-09-11 11:32:39 -04:00
John Smith b6be75ead5 fix(ui): W-H harness — back contract, menu anchoring, IME, shade, SFX
- DetailScaffold now routes hardware back through its in-app onBack (the
  header contract), so sub-screens no longer exit the whole mini-app; the
  context menu/prompt intercepts back to dismiss (H-01, H-02/03).
- ContextMenuOverlay anchored bottom-center inside a full-size Box (menus no
  longer render over the cropped header); PromptPanel resets per request so
  nested prompts no longer inherit the previous text (H-02/03).
- Root imePadding + windowSoftInputMode=adjustResize keep text fields above
  the keyboard (H-04).
- Wake shade on ON_STOP instead of ON_PAUSE: permission dialogs and
  deep-link relaunches no longer raise the unlock shade (H-07).
- Checkers/Chess/Hexic start MiniSynth so game SFX actually play (H-10).

Full suite 1150/1150 (includes 63-app smoke suite).
2026-09-11 11:04:18 -04:00
John Smith 365f3dde56 docs(parity): Phase 1 UI parity audit + gap register
Consolidates three static audit passes, the Robolectric smoke baseline
(63/63) and the emulator crawl (63/63 launch, 0 crashes) into a severity-
ranked report plus 86-row machine register: 24 P0, 26 P1, 13 P2, 23
verified-clean entry screens. Canon clarification: cropped headers are
intentional; functional overflow is not.
2026-09-11 11:01:21 -04:00
John Smith 44c1e82328 test(ui): emulator crawl tool (Phase 0 baseline)
Launches every registry app via the debug deep link, screenshots it, and
reports crashes (filtered to the app package) and blank screens. Baseline
run: 63/63 launch, 0 crashes, 0 blanks. Screenshots + JSON land in
git-ignored reports/emulator/.
2026-09-11 11:00:31 -04:00
John Smith 75066e46a9 test(ui): catalog-wide AppSmokeSuite (63 apps x 3 parity configs)
Every registered mini-app renders through the real host path at device
480x272, adaptive portrait and adaptive landscape with a non-empty
semantics tree and no composition crash. ParameterizedRobolectricTestRunner
keeps Robolectric active per parameter; the harness provides the
MenuController the real root injects. 63/63 green.
2026-09-11 10:47:44 -04:00
John Smith 1861f5dafa test(ui): Phase 0 harness — Compose UI tests under Robolectric
- Add ui-test-junit4/ui-test-manifest (test classpath) and enable
  unitTests.includeAndroidResources; pin Robolectric sdk=34.
- Debug-only deep link dorado://app/<slug> (release ignores) for automation.
- TestDoradoApp disables the app-level Media3 connect, which cannot bind
  under Robolectric; DoradoApp is open with an autoConnectPlayback flag.
- MiniAppTestSupport: real app graph + real host path (MiniAppScreen) inside
  DoradoTheme/DeviceCanvas at DEVICE 480x272, PORTRAIT 400x800 and
  LANDSCAPE 800x360; MiniAppHarnessTest proves it renders.
2026-09-11 10:40:12 -04:00
John Smith c3eecde8e8 docs(apps): close out the official-app program + lint fixes
- Canon §8 now enumerates all 62 implemented packages by category with the
  provenance rule (re-derived behavior, re-authored content).
- README counts and the mini-app section describe the full 62-app matrix,
  the engine3d core and the dead-service local UIs.
- Parity roadmap gains §9 (M16 program record: waves, evidence, gates,
  known deltas, corpus acquisition results).
- Audit/gaps regenerated: 55 native + 7 dead-service shells, zero unmapped
  catalog rows.
- Lint: replace unused BoxWithConstraints scopes with Box (8 apps) and read
  the locale from LocalConfiguration in Animalgrams.

Gates: assembleDebug + test 1086/1086 + lintDebug all green.
2026-09-11 07:40:23 -04:00
John Smith 49911e5bd2 fix(corpus): capacity gate counts only missing bytes
A resumed mirror was blocked because the pre-flight summed every item,
including the 48 GB already verified on disk. The gate now subtracts present
files and reports total vs still-missing; the full archive (70 items,
51.4 GB) then completed with 0 failures.
2026-09-11 07:32:48 -04:00
John Smith 1a7658a8bd feat(apps): W7 — pixel-faithful local dead-service UIs
Email, Facebook, Twitter, Messenger, Weather, MSN Money, Zune Reader and
Zune Social rebuilt from the decompiled screen inventory as offline local
surfaces (simulated content, clearly labelled): mail chooser/inbox/viewer/
composer with validation, the Facebook pivot shell with composer and
threads, the Twitter timeline/replies/favourites/DM shell with 140-char
compose and @-to-DM retargeting, the Messenger presence/thread/roster hub,
paged city weather with a deterministic forecast model, Money
watchlist/markets/converter/articles, the Reader library/pagination/TOC/
bookmarks with original sample text, and the Social memorial card.

Pure-Kotlin models (EmailModel, FacebookModel, TwitterModel, MessengerModel,
WeatherModel, MoneyModel, ReaderModel) with persistence via appState; 55 new
tests. Registry migrated to the new *App() names. Full suite 1086/1086.
2026-09-11 07:27:41 -04:00
John Smith 8f80e4ce42 refactor(apps): split Mocks.kt into one file per dead-service surface
Pure move plus MockPage/MockBody widened to internal in MockCommon.kt. No
behavior change; unblocks per-app W7 fidelity work.
2026-09-11 07:15:50 -04:00
John Smith 86cad6d768 feat(apps): W6 — six big engines (3D parity tier)
- echoes: deterministic arena with input-path echo replay, 12 original maps,
  five modes, power-up table, achievements, lives/invulnerability.
- labyrinth: engine3d tilt-marble with swept physics, 116 seed-generated
  mazes across five acts + bonus, checkpoint rewind, par stars.
- audiosurf tilt: AudioFeatures-driven deterministic courses (Normal/Hard/
  Visualizer), lane steering, chain/perfect scoring, exact medal fractions.
- lucky lanes bowling: deterministic pin physics, full 10-frame scoring,
  Exhibition/Blackjack/Golf, five original lanes and 3D lane rendering.
- pgr ferrari: fixed 30 Hz sim (torque/gears/grip/drag/downforce), three
  spline circuits, 4-car AI, full kudos catalogue + combo/stash, 12-event
  career and garage economy, engine3d city rendering.
- vans sk8: paraboloid pool physics, swipe trick table, grinds with balance,
  combo/multiplier rules, 12 events, 27 achievements, engine3d bowl.

All six registered and catalog-wired; audit regenerated. ~250 new tests;
full suite 1032/1032 green.
2026-09-11 07:15:20 -04:00
John Smith 2fec24f373 feat(apps): W5 — 5 touch/toy/physics titles (first engine3d title)
- 3d picture puzzle: engine3d OpenGL board with 3x3/4x4 grids, one/two-sided
  play (single shared empty slot model), generated 7-category artwork via
  PuzzleTextures, ray-picked tiles, flip/hint/timer and per-config best times.
- dr optics: pure-Kotlin 2D optics tracer (mirrors, arcs, polygons, lenses,
  Snell + TIR) with 41 authored levels and the 6/16/20/24 unlock ladder.
- finger physics: shared sequential-impulse Physics2d solver (circles + OBBs,
  joints, explosions, gravity variants) with 10 modes x 9 authored levels.
- tiki totems: physics block-removal with 13 packs x 8 authored levels.
- fingerpaint: stroke model with undo/redo/eraser/RDP + local pass-and-play
  draw-and-guess rounds (original networked play replaced by local mode).

All 5 registered and catalog-wired; audit regenerated. 69 new tests; full
suite 872/872 green (DesignInvariantTest included).
2026-09-11 06:38:44 -04:00
John Smith 562a12fb08 feat(engine3d): dependency-free OpenGL ES 3.0 scene core
Phase 2 infrastructure for the 3D official titles:
- Math3d: pure-Kotlin Vec3/Mat4 (column-major, inverse/normal matrices),
  Camera3d with NDC ray construction, ray/sphere and ray/plane intersection.
- Mesh3d: procedural box/plane/cylinder/quad builders with bounds for picking.
- Scene3d: tagged nodes, materials (flat/textured/unlit/emissive), directional
  light, ambient, fog, bounding-sphere picking and ground picking.
- GlSceneView: GLSurfaceView renderer (cached mesh/texture uploads, context-
  loss safe) plus a Compose AndroidView host with tap-to-pick; no third-party
  dependency, all geometry/textures authored in code.
- Engine3dTest: 11 pure-JVM tests for matrix/ray/pick/mesh invariants.

Full suite 803/803 green.
2026-09-11 06:02:41 -04:00
John Smith 657a7b7feb feat(apps): W4 — 11 new casual/word titles implemented
New pure-Kotlin engines + Compose apps (original content only; own word
corpora, authored waves/levels, procedural art, synth SFX):
a beanstalk tale (tilt climber with specials/bosses/cups), animalgrams
(25-animal authored anagram bank), wordmonger (7x7 tile board, hazards,
rush), bbq battle (tower defense with 30 authored waves), castles and
cannons (one-lane siege, 16 levels, skill tree), bees (5-theme hive
harvester, 25 levels), decoder ring (15x15 cipher crossword, 12 authored
puzzles), space battle 2 (10-stage shmup + 5 race tracks + parts),
vine climb (4-lane endless climber), penalty flick soccer (physics
shootout, bracket, Mad Minute, Goal Streak), fan prediction (offline
fixture simulation with standings).

All 11 registered and catalog-wired; register statuses -> native; audit
regenerated. 190 new tests; full suite 792/792 green.
2026-09-11 06:00:56 -04:00
John Smith 0c45d03702 feat(apps): W3 — 12 new casual/puzzle titles implemented
New pure-Kotlin engines + Compose apps (original procedural art, synth SFX,
graph.games high scores, appState resume):
color spill (flood-fill, corpus-blocked provisional constants), supernova
(chain reactions, level tables), tiles (3x3 8-puzzle, shuffle/countdown),
slider puzzle (4x2/5x3/6x4 with timed top-10), shell game (robot tracking,
shake charge, trophy reveal), trash throw (flick physics, wind, scenes),
tug-o-war (rhythm pulls, AI ramp), snowball (8x13 tile melt campaign +
survival), run and jump (58-level platformer with boost pads/warps),
hairball (tilt + sludge grid), splatter bug (spawn/HP/life sim),
goo splat (sludge/jelly physics with power-ups).

All 12 registered in DoradoApps and wired to their catalog entries; register
statuses flipped to native and the audit regenerated. 165 new tests; full
suite 602/602 green.
2026-09-11 05:32:51 -04:00
John Smith dc667f7c5f feat(apps): W2 fidelity — hexic, checkers, chess
- hexic: board rebuilt to the device hex cluster (8/9-cell rings, 5-7
  colors), standard/flower rotation cursors, stars/bombs/flowers/black
  pearls, gravity cascades, Marathon/Timed/Survival with the 7-level tables
  and score formulas; legacy square-board API kept for LogicTest.
- checkers: bounded negascout at 1/3/8 plies + 4-ply hint, Suicide mode,
  snapshot undo, FEN/save codecs, per-difficulty records, mandatory-capture
  and multi-jump rules preserved.
- chess: 1/3/5-ply levels with a synthesized opening book, 2-half-move undo,
  hint, two-player mode, FEN save/restore; castling/en-passant/promotion
  verified.

38 new tests; full suite 437/437 green.
2026-09-11 05:11:45 -04:00
John Smith 1608f0bfb4 feat(apps): W2 fidelity — hearts, spades, texas hold 'em
- hearts: Standard/Wildcard/Turbo modes, shoot-the-moon, passing rotation
  (Left/Right/Across/None) with simultaneous passing, first-trick point ban,
  Easy/Hard AI, 100-point games, autosave; stall fixes in the trick loop.
- spades: Easy/Hard bidding and play AI, Nil/Blind Nil (+/-100/200), official
  bag-out formula, 500/300 targets, round-history scoreboard, deterministic
  one-action-per-state loop (fixes the 'ai playing' stall).
- texas hold 'em: new 6-seat PokerTableEngine with layered side pots, six AI
  personalities across Easy/Medium/Hard, pot/blind-aware sizing, seven-event
  tournament ladder with bankroll gating and hand history; heads-up hand
  ranking APIs preserved for LogicTest.

34 new tests; full suite 437/437 green.
2026-09-11 05:11:45 -04:00
John Smith 9a2d110964 feat(apps): W2 fidelity — solitaire, sudoku, reversi
- solitaire: Standard/Vegas scoring (stake, 3-pass cap, time bonus),
  1/3-card draw, multi-card run moves, history undo, hint, autocomplete,
  resumable deal + per-mode stats via appState/graph.games.
- sudoku: seeded uniqueness-checked generator (Classic 6x6/9x9, three
  difficulties) replacing the curated set; pencil notes, conflict highlight,
  undo, candidate hint, aggregate solve, timed records.
- reversi: Easy random / Medium greedy / Hard weighted + bounded lookahead
  AI, side/difficulty setup, undo, hint toggle, per-difficulty records.

35 new tests; full suite 437/437 green.
2026-09-11 05:11:45 -04:00
John Smith a9c7e16dea refactor(apps): split Games/MoreGames into per-game engine + app files
Pure move in the same package: solitaire/sudoku/hexic/reversi and
hearts/spades/checkers/chess/poker each get <Game>Engine.kt and <Game>App.kt;
shared card chrome moves to CardViews.kt (EdgeText/rankLabel/suitGlyph/
PlayerHand/PassPicker widened from private to internal). No behavior change;
330/330 tests green.
2026-09-11 04:41:38 -04:00
John Smith 6aaf48daf7 feat(apps): W1 fidelity — music quiz, shuffle by album, piano, drum machine
- music quiz: deterministic 20-question timed rounds (4/6 options, five
  question kinds, hint, 30s bonus round), seeded QuizEngine, per-mix high
  scores via graph.games, settings via appState.
- shuffle by album: scoped shuffled album queue with in-order track playback
  and auto-advance, five-album drag carousel, queue sheet, idle screensaver,
  controller integration.
- piano: 52-white-key scrolling keyboard (A0-C8), octave bar, multi-touch
  glissando, sustain/dampen, volume, notation; pre-rendered synth voices
  with documented AudioTrack serialization limits.
- drum machine: layered pads with zone splitting, hold-to-loop, three kits,
  record/playback sequencer, 40-340 BPM, synth-only voices.

40 new engine tests; full suite 330/330 green.
2026-09-11 04:40:07 -04:00
John Smith d1d3f53226 feat(apps): W1 fidelity — alarm, level, metronome, chord finder
- alarm: four-page clock/alarm/sleep/settings flow, minute-match firing with
  snooze and 30-min bow-out, source fallback to buzzer, sleep timer with
  shake-to-reset via rememberTilt(); existing Room alarm list preserved.
- level: all three instruments on one canvas with 90-degree travel clamps,
  0.1-degree readouts and peak-hold memory; shared rememberTilt() replaces
  the inline sensor, with a graceful no-sensor state.
- metronome: 40-340 BPM dial with drag, tap tempo, 16-cell accent grid,
  beat-count handling; synth clicks.
- chord finder: 12 enharmonic roots x 8 qualities with multiple voicings,
  fret-window shift, finger-number dots, built-in metronome.

39 new engine tests; full suite 330/330 green.
2026-09-11 04:40:07 -04:00
John Smith da3f1e79c2 feat(apps): W1 fidelity — calculator, calendar, notes, stopwatch
- calculator: stacked expression machine (memory, DEG/RAD/GRAD, parens,
  repeat-equals, div-zero/NaN/Inf -> Err, 15/19-digit caps), four-page
  landscape scientific keypad with stats, portrait/landscape shared value.
- calendar: day timeline / agenda / month views over the existing Room
  appointments, recurrence expansion, clash detection, all-day + notes.
- notes: notes|lists pivot with checklist strikethrough items, three sort
  modes, live search, text-size setting, sort/size persisted via appState.
- stopwatch: countdown H/M/S timer with synth alarm and crescendo, split vs
  total laps, wall-clock-correct resume, appState persistence.

65 new engine tests; full suite 330/330 green.
2026-09-11 04:40:02 -04:00
John Smith 1cd47b1b35 refactor(apps): split MiniAppsUtilities into one file per app
Pure move: CalculatorApp, NotesApp, StopwatchApp, MetronomeApp, LevelApp,
ChordFinderApp, ShuffleByAlbumApp, MusicQuizApp, AlarmClockApp, CalendarApp
each get their own file in the same package (private helpers travel with
their app). No behavior change; unblocks parallel fidelity work per app
without shared-file conflicts.
2026-09-11 04:26:49 -04:00
John Smith 4182f6043e docs(apps): fill all 62 behavioral specs from the decompiled corpus
Phase 1 completion: every official package now has a synthesized spec with
screens/flow, rules/scoring/AI, controls, content inventory, implementation
plan and an Assembly!Type.Method citation log. 62 specs / ~9,000 lines;
documentation-first gate is closed.

Notable corpus findings recorded in the specs:
- color-spill is blocked upstream: its marketplace package shares a GUID with
  Reversi, so the archive payload is Reversi.exe (register notes + spec gap).
- W2 AI tiers, W3 score/simulation constants, W6 30 Hz deterministic
  simulation and content inventories are now pinned for implementation.

No Microsoft content is committed; analysis only.
2026-09-11 04:25:51 -04:00
John Smith 1acdf2d64b feat(apps): shared runtime — app state store, synthesized SFX bank, tilt helper
Phase 2 infrastructure for the official-app program:
- Room v6 app_state table (AppStateEntity/Dao/MIGRATION_5_6) behind
  AppStateRepository, wired into the graph for save/resume and board snapshots.
- Sfx.kt: deterministic LCG noise, tone/sweep/noise/arpeggio generators, and a
  cached 16-cue SfxBank for games (synthesized only; no sampled audio).
- AppSensors.kt: rememberTilt() accelerometer helper (level, tilt calculator,
  motion games).
- OfficialCatalog: the seven dead-service mocks now carry installedIds so the
  marketplace resolves them.
- Tests: AppStateStoreTest (round-trip + reopen), SfxTest (determinism,
  inventory), OfficialAppsTest (register⇔catalog⇔registry⇔spec gate).

186/186 unit tests green (JDK 21).
2026-09-11 03:53:22 -04:00
John Smith 529f3aef2d feat(apps): corpus miner, 62-app register, behavioral specs, audit register
Phase 1 of the official-app reimplementation program:
- tools/app_mine.py: batch-decompiles the external corpus with ilspycmd,
  emits per-app indexes (types/methods/strings/constants/content with PNG
  dimensions and XNB headers), generates spec skeletons, and regenerates the
  audit matrix + machine-readable gaps register.
- docs/official-apps.json: the 62-package register (slug/title/exe/category/
  corpusDir/installedId/status/wave/spec) that drives tooling and tests.
- docs/apps/: a behavioral spec per package (documentation-first gate).
- docs/official-apps-audit.md + official-apps-gaps.json: tracked matrix.

61/62 packages mined (weather is a dead service with no shipped package). No
Microsoft content is committed; counts and synthesized analysis only.
2026-09-11 03:53:18 -04:00
John Smith d5d1ac480f feat(corpus): archive.org mirror + decompiled app corpus extract/verify tools
Phase 0 of the official-app reimplementation program:
- zune_archive_mirror.py: staged, resumable, checksum-verified mirror of the
  Zune Archive (70 items, 51.4 GB pre-flight) into an external untracked dir,
  with a capacity gate, --root override, and per-item manifests.
- zune_app_corpus.py: extracts the 61 decompiled official-app ZIPs and
  verifies every file against the published hashes.txt (7843/7844 ok; the
  one miss, sudoku Database.xml, is absent upstream).

No Microsoft content is committed; both scripts write to the external corpus
only.
2026-09-11 03:38:23 -04:00
John Smith b8403621da feat(re): kernel module reconstruction and ZCSTFS/keyvault findings
- Add scripts/reconstruct_nk_modules.py to rebuild the kernel-only modules
  (zcstfs.dll, keyvault.dll, DwXfer.dll, zcblock.dll, zpartstream.dll) from
  NK.bin into the external corpus.
- Update the module inventory and API reference: 114/114 modules, 67,399
  functions decompiled, 4,236 exports.
- Correct the ZCP inventory and asset notes: the payload is a ZCSTFS volume
  (plaintext for the runtime), and marketplace keys are per-package AES keys
  unwrapped from an RSA-2048 blob by a device-provisioned keypack.
2026-09-11 03:26:21 -04:00
John Smith 9fceea6341 docs(audit): close-out pass record
Document the follow-up fixes that were listed but not applied in the first
pass, update the deferred register (fling cap, visualizer and eager
device-link items are done), and add close-out on-device evidence.
2026-09-11 03:23:06 -04:00
John Smith 5f61115356 fix(radio,device): dial action overlay; lazy Device Link; crop constraints
Radio actions move onto the dial so the station list gets a full-height
region; Device Link becomes a LazyColumn (keyed device/pending items) and
long titles crop at their column instead of overlapping 'copy back'.
2026-09-11 03:23:05 -04:00
John Smith cc34724c7c fix(motion,scaling): density-normalized fling cap, tablet headroom, draw-scope visualizer, dp drift
- Fling velocity cap scales with the adaptive density multiplier so it no
  longer shrinks on scaled layouts (device-mode behavior unchanged).
- Adaptive scale ceiling 2.1 -> 2.6 for tablets/foldables.
- Visualizer reads phase in the draw scope (no per-frame recomposition)
  and the 60s loop is seamless (integer harmonics over 2pi).
- Screensaver drift expressed in dp instead of raw px.
2026-09-11 03:22:57 -04:00
John Smith c73ec3597a fix(widget): album art thumbnail, 2-cell sizing, preview; drop dead helper
Glance 1.2 has no URI-based ImageProvider, so the updater decodes a
128px PNG off-main and the widget renders it beside title/artist/album;
declared size raised to 110dp/2 cells with description and preview image;
removed the dead legacy albumArtUri helper.
2026-09-11 03:22:56 -04:00
John Smith 81a0ce52b9 fix(detail): MiniPlayer insets, empty states, related wrap, MusicBrainz URL
Album/artist/genre/playlist track lists reserve the MiniPlayer strip;
album-not-found and empty-genre states replace blank panes; album play/
shuffle hide when there are no tracks; the related-artists explanation
wraps instead of cropping and links to MusicBrainz search (artist pages
require an MBID).
2026-09-11 03:22:47 -04:00
John Smith 4333f7812b docs(audit): UI/UX deep-audit report; calculator del label
Adds docs/ui-ux-audit.md: scope, severity table of the 42 defects found and
fixed across screens and all 29 mini-apps, on-device verification evidence,
and the deliberately deferred items (mediaId namespacing, eager device-link
composition, fling-cap density, visualizer recomposition).
2026-09-11 02:54:50 -04:00
John Smith 677743bd2d fix(games,mocks): cell sizing; mocks scroll and wrap
- Hexic circles derive their radius from the tighter axis, so tiles no
  longer overflow their cells or overlap the score line; Sudoku/Reversi
  subtract the inter-cell gaps so the last row fits the viewport.
- Every mock page scrolls, reserves MiniPlayer space and wraps long
  sentences instead of clipping them at the screen edge.
2026-09-11 02:48:14 -04:00
John Smith 31922b4e48 fix(screens): podcasts parser/IO, radio dial, marketplace details, settings info
- Podcast RSS parser scopes titles to channel vs item, reads
  itunes:duration and summary, and no longer mis-attributes episode
  titles; feed fetch runs on IO; feeds gain a refresh action; feed
  screen shows the real title and an empty state; the video pivot says
  it is unsupported rather than duplicating audio.
- Radio: drag detector no longer re-keys while dragging; needle maps
  frequency left-to-right and ticks align to 87.5–108; list padding.
- Marketplace: details' back returns to the list (was popping the whole
  marketplace), description wraps and scrolls, videos show a loading
  state, music has an empty state, lists reserve MiniPlayer space.
- Settings: multi-line info rows wrap instead of clipping, sign-in
  reports success/failure, update check distinguishes unreachable from
  up to date; lyrics reserve bottom space.
- Device link: status copy derives from pairing state; manifest shows
  '+N more' instead of silently truncating.
2026-09-11 02:40:20 -04:00
John Smith 4c69cdbe63 fix(screens): clipping, scrolling, gestures, playback and cloud defects
Home: Smart DJ uses the full library; history long-press can pin (unpin was
a no-op); watermark clears the MiniPlayer; 'new' has an empty state.
Music: album tiles are square; search long-press menu; per-pivot empty
states; MiniPlayer/footer padding so rows are never covered.
Videos: playback is a fullscreen route (MiniPlayer suppressed, header
returns to the list), seek bar accepts tap/drag, music pauses on entry.
Pictures: tapped photo opens at its index; favorites open the viewer;
albums pivot scrolls; system Back closes the viewer; pan is edge-clamped.
Internet: WebView released on exit; bookmarks/history are tappable.
Social/Radio/Marketplace lists reserve MiniPlayer space.
Now Playing: back arrow exists with nothing playing; control taps reset
the screensaver timer; volume readout times out and shows 0; dim is a
translucent veil above the saver; OSD clock ticks; skip deadband is
density-corrected.
Components: AlbumArt falls back on load error; crossbar hit targets fill
the bar and gaps no longer select neighbours; the alphabet rail only
appears on long lists and reserves end padding.
Lock shade: unlock animates before dismiss, offset resets, Back closes it,
wallpaper is decoded off-main and downsampled.
Cloud: token exchange is IO-dispatched, malformed JSON cannot crash,
state must match exactly, sign-out disables cloud, redirect host checked;
POST_NOTIFICATIONS requested for the media notification.
2026-09-11 02:36:51 -04:00
John Smith e451d1bf2c fix(games): unstick engines, scale boards, correct hit-testing and scoring
- Sudoku: generated puzzle (not the solution) is dealt; given-mask fixed;
  win compares against the stored solution; board scales to the viewport.
- Hexic: clearing no longer re-creates clusters (infinite loop/freeze);
  board is observable state; canvas draws and hit-tests with one mapping.
- Solitaire: exposed cards flip, waste pile is playable, black suits are
  readable, compact layout fits 272dp.
- Reversi: board scales; game-over result + new game; win/loss recorded.
- Hearts: passing phase completes (was stuck forever); opponent hands are
  summaries; 13-card hands fit; scores recorded once.
- Spades: spadesBroken flag, correct follow/discard rules, team scoring
  with bags, AI auto-advances (a fresh deal no longer stalls).
- Checkers: winner detection fixed; multi-jump AI continues; board and
  taps share one canvas (overlay was offset and covered the header).
- Chess: castling rights revoked on rook capture (NPE fix, in-place masks
  corrected); piece letters drawn; AI search off the main thread at depth
  2; only terminal results recorded.
- Hold'em: per-street contributions/acted tracking actually deals flop/
  turn/river; showdown compares kickers and awards the pot; AI hole cards
  hidden until showdown; cards rendered by SolCardView.
2026-09-11 02:31:29 -04:00
John Smith 26ec13f962 fix(miniapps): device-mode fit, audio, calculator, alarms, calendar, quiz
- Calculator keypad rows are weighted so the full basic/scientific pad fits
  the 224dp device-mode content area; +/- no longer corrupts subtraction;
  engine gains ^ and sin/cos/tan/ln/log/sqrt.
- Synth: piano no longer multiplied by exp(-6) (was ~-52dB inaudible);
  AudioTrack writes move off the main thread (suspend playSamples).
- Piano gains black keys; drum machine gains a BPM control and re-reads
  tempo each bar; metronome retimes on BPM change with one click loop.
- Notes placeholder overlays the field; back is the cropped header and
  autosaves (DetailScaffold grew an optional onBack).
- Stopwatch shows centiseconds, split laps, scrollable lap list.
- Shuffle-by-album play button fits 272dp (side-by-side layout); quiz no
  longer hangs when the library lacks 4 artists/albums; level shows both
  axes; chord finder stops substituting C major for unknown shapes;
  fretboard draws O/X and fret 5.
- Alarm: time prompt (hour+minute), delete cancels PendingIntent, edit
  respects disabled state, full 64-bit request codes, weekly mask fixed.
- Calendar keys appointments by full date; long-press lists/deletes.
2026-09-11 02:24:43 -04:00
John Smith 7548ba1e06 fix(ui): de-duplicate mini-app scaffold, fullscreen MiniPlayer rules, device-canvas insets
- MiniAppScreen no longer wraps apps in a second DetailScaffold; every
  mini-app already provides its own cropped header. Removes the stacked
  double header that consumed 96 of 272 device-mode design units.
- MiniPlayer is suppressed on mini-app and fullscreen viewer routes
  (canon 8) and its transport target is a bare 32dp box instead of a
  48dp Material IconButton that overhung the bar.
- safeDrawingPadding moved outside the scaled canvas so real insets no
  longer shrink/offset the 480x272 device composition.
- Device mode keeps the landscape 480x272 canvas in portrait instead of
  swapping axes (screens are landscape-authored).
- Widget transport actions run on the main looper (MediaController).
2026-09-11 02:19:41 -04:00
John Smith df3579a6f4 ci: emit prune tags newline-separated so an empty list is a no-op 2026-09-11 02:02:05 -04:00
John Smith b5454d25d5 ci: scope gh release prune to the repo (publish job has no checkout) 2026-09-11 01:56:31 -04:00
John Smith 5cc17665a2 ci: publish debug APK as per-commit prerelease tagged by short commit hash
- add publish job on main push / dispatch (PRs build+test only)
- dorado-hd-<sha7> prerelease with dorado-hd-<sha7>.apk
- keep last 10 prereleases; serialized via concurrency group
2026-09-11 01:45:24 -04:00
John Smith 27833a78c1 feat(m15): local Zune Card on social screen 2026-09-11 01:40:29 -04:00
John Smith aa80bc458e feat(m13-m15): dimmer+status OSD, picture zoom, item snap, EQ presets, sort keys, share, marketplace discovery 2026-09-11 01:38:18 -04:00
John Smith 6115175f85 feat(m12): NP scrubber, queue/showlist, library search, fling cap; kinetic provenance fix 2026-09-11 01:29:56 -04:00
John Smith 22ff5f2847 docs(parity): on-device parity audit vs Zune HD disassembly + gap register; correct kinetic provenance 2026-09-11 01:20:10 -04:00
John Smith f8ac21c29a feat(re): full 109-module Zune HD decompilation corpus with symbol recovery + analysis docs 2026-09-11 00:28:29 -04:00
John Smith 538ab0e594 docs: refresh README, parity roadmap and UI canon to current state 2026-09-10 22:40:44 -04:00
John Smith 39f43e7954 chore: ignore Python bytecode (remove accidentally committed pycache) 2026-09-10 21:58:09 -04:00
John Smith b0b113d898 feat(tools): export decompiled Ghidra functions and function index 2026-09-10 21:57:56 -04:00
John Smith e7aa582a07 feat(m8.2b): live LAN discovery and paired sync session 2026-09-10 20:55:13 -04:00
John Smith 64c9c5f1b0 feat(m10): Glance Now Playing widget with transport 2026-09-10 20:47:03 -04:00
John Smith bfdd25f5d2 feat(m9.2b): persist per-track play counts and surface Top Played mix 2026-09-10 20:41:50 -04:00
John Smith 15ddd40279 feat(cloud): signed update-check service and settings action 2026-09-10 20:39:40 -04:00
John Smith 039600d432 docs: correct unit test count to 143 2026-09-10 20:21:20 -04:00
John Smith 695cbec8e6 feat(motion): parameterize Zune fling; shorter glide for horizontal lanes
rememberZuneFlingBehavior(frameRetention) exposes the decay retention.
Vertical lists keep the device value (0.95/frame); horizontal lanes use
DoradoMotion.KINETIC_LANE_FRAME_RETENTION (0.94/frame) so carousels do not
over-glide. Labelled post-device in the new canon §10; DesignInvariantTest
and DoradoMotionTest (3/3, incl. lane-shorter-than-list) green.
2026-09-10 20:10:04 -04:00
John Smith faff28c8cc feat(parity): apply Zune fling to horizontal lanes
Home Quickplay/New, marketplace (installed/featured/dead-services) and
artist-album LazyRows now share the device kinetic decay instead of the
platform spline fling. All scrolling surfaces (KineticList, album grid,
lanes) now use rememberZuneFlingBehavior().
2026-09-10 19:52:12 -04:00
John Smith ef2593215f chore(design): drop unused gesture imports in KineticList 2026-09-10 19:49:09 -04:00
John Smith 8d1d022511 feat(parity): Zune fling on album grid; record kinetic scroll integrator
- MusicScreen album grid now uses the shared Zune fling (was platform spline),
  matching the kinetic lists.
- docs/zune-hd-touch-settings.md §6: document the xuidll scroll tick
  (VA 0x41841D58) and its velocity/position/decay state for provenance.
2026-09-10 19:48:19 -04:00
John Smith e15f648f38 feat(parity): Zune HD touch-settings extraction, kinetic fling, alphabet rail drag
Mine the reconstructed firmware corpus for the shell's real kinetic
parameters and wire the corroborated ones into the app.

- docs/zune-hd-touch-settings.md: exact XuiTouchSettings struct (80 bytes,
  xuidll.dll VA 0x41874314), XUI defaults and gemstone.exe effective values,
  accessor/override model, provenance and confidence.
- canon §6/§9 + design-tokens cite the extraction; fix stale AlphabetJumpRail
  reference in zune-hd-disassembly.md.
- DoradoMotion: KINETIC_FRAME_RETENTION 0.95 (XuiTouchSettings[0x1C], shell
  value) and kineticFrictionMultiplier().
- ZuneFling: exponential-decay FlingBehavior wired into KineticList for the
  device's long deceleration (no springs).
- DoradoTokens.SKIP_DRAG_PX: 24 -> 25 (XuiTouchSettings[0x10]).
- KineticList: the alphabet rail's onLetterFocus/onDragEnd were dead code;
  implement drag-to-scrub (tap still opens the A-Z index).

Verified: assembleDebug, testDebugUnitTest (DesignInvariantTest 6/6,
DoradoMotionTest 2/2), lintDebug all green.
2026-09-10 19:45:20 -04:00
John Smith 24c54ca04b fix(tools): correct WinCE e32_rom data directories in PE reconstruction
WinCE e32_rom e32_unit entries are 1-indexed relative to standard PE
(unit[1]=Export ... unit[7]=Debug). Map them accordingly, clear the
security directory (PE expects a file offset), and zero any directory
whose RVA falls outside reconstructed section bounds. Verified: all 109
modules reconstruct and xuidll.dll/zhud_serv.dll export tables resolve.
2026-09-10 18:54:08 -04:00
John Smith 526f12a081 fix(ui): prevent vertical clipping of hub screen headers in CroppedHeader
Fixes an issue where top hub titles (e.g. 'music', 'videos', 'settings')
were horizontally sliced in half across their midsection.

- EdgeCropText.kt: Remove negative vertical offset (visibleHeight - fontSize)
  in CroppedHeader; align text to CenterStart with EDGE.dp leading margin.
- DoradoTokens.kt: Introduce HEADER_HEIGHT = 48dp and align
  TYPE_HEADER_CROP_VISIBLE to 48dp to accommodate full 40sp typography.
- MiniAppsUtilities.kt & Mocks.kt: Use TYPE_NOW_TITLE (26sp) for scaled
  numerical readouts formerly tied to TYPE_HEADER_CROP_VISIBLE.
- docs/zune-hd-ui-canon.md & design-tokens.md: Update canon section 3.4
  and design tokens to reflect vertical integrity and horizontal signature crop.
2026-09-10 18:39:18 -04:00
John Smith e931bb7b3b feat(ux+parity): Zune HD UI parity audit, navigation back affordance, gesture fixes, and visualizer
- Add DetailScaffold / CroppedHeader back navigation to MusicScreen and MarketplaceScreens
- Fix NowPlayingScreen gesture conflict, pointerInput keys, and enlarge back button touch target
- Add SpectrumVisualizer with 24 zero-radius equalizer bars for Now Playing screensaver mode
- Redesign KineticList jump grid into 4-column authentic Metro tiles with instant letter jump
- Enable vertical scrolling on QuickplayScreen
- Enhance CrossbarBar with BringIntoViewRequester auto-scroll and typography weight emphasis
- Preserve LockShade on app resume until explicit upward drag gesture
- Correct DeviceCanvas orientation to support 272x480 portrait and 480x272 landscape
- Declare Android 13+ granular media permissions and remove crashing LIMIT queries
- Add bug hunt report documentation
2026-09-10 18:31:47 -04:00
John Smith 9eb3207c1d feat(cloud+sync): cloud client, PKCE sign-in, LAN sync, format contract
- cloud/: DoradoCloudClient (25 methods) + dependency-free JSON codec; OAuth 2.0
  PKCE sign-in (doradohd deep link, Settings UI); UpdateManifest byte-exact
  verifier; CloudMetadataSource (artist images/bio); CloudMixSource +
  CloudMixService (QuickMix-backed DynamicMix).
- sync/SyncClient: phone side of the LAN sync protocol over JSON-RPC 2.0.
- ScrobbleService mirrors each play to the cloud; MediaFormats parity contract.
2026-09-10 17:21:06 -04:00
John Smith 5df8cebb3a Sprint 4: M4-M7 — marketplace, device sync, scrobble, lyrics + audio analysis
- Marketplace: full screen parity (apps, games, Music+Videos catalog)
- Device link: pairing, sync engine, transport abstraction, golden simulator
- Scrobble: Last.fm client + signature, scrobble store, background service
- Lyrics: LrcLib fetch + synced lyric screen
- Audio analysis: feature extractor, dynamic mix, PCM decoder
- New Room entities/DAOs/migrations for sync, features, scrobbles
- Settings: device link, scrobble, sync configuration
- Parity roadmap doc + sync_golden tool scaffold
- Tests: audio, scrobble, sync, device link, lyrics, dynamic mix
2026-09-10 14:22:29 -04:00