{
  "flavor": "prod",
  "versionCode": 1019,
  "versionName": "0.2.0",
  "minSupportedVersionCode": 1019,
  "apkUrl": "https://app.wizowiz.com/production/releases/wizowiz-0.2.0-1019.apk",
  "sha256": "bc5d138f1e90590f1ceb9296a1f293dff5bf79e32e5270d7e7b567260d4aa3fe",
  "sizeBytes": 15349781,
  "releaseNotes": "### Features\n\n- **settings**: show the build flavor next to the version (`933c826`)\n- **ota**: Settings → Check for updates, and show the real version (`551ed96`)\n- **ota**: dismissible optional-update banner (`1721d8d`)\n- **ota**: forced-update gate wired into boot + resume (`c685e12`)\n- **ota**: native APK install channel + REQUEST_INSTALL_PACKAGES (`8805764`)\n- **ota**: UpdateDownloader with sha256 verification (TDD) (`9f7a30d`)\n- **ota**: UpdateService — fetch, cache, classify, fail open (TDD) (`6d3ac74`)\n- **ota**: manifest URL + update prefs keys (`a1d120e`)\n- **ota**: UpdateManifest parsing + classification (TDD) (`52b0195`)\n- **ci**: comment the update policy on prod PRs (`474aae5`)\n- **ci**: publish versioned APK + latest.json with force flag (`6f0be97`)\n- **ci**: manifest renderer for OTA latest.json (`b56d628`)\n- **contact-resolver**: enhance number extraction logic and add unit tests for various formats (`4fadece`)\n\n### Fixes\n\n- **ci**: checkout ref is only valid on push, not pull_request (`f4c4c42`)\n- **ota**: forced gate and optional screen could never be pushed (`3462e35`)\n- **ota**: update check crashed on ScaffoldMessenger.of(context) (`50c40fa`)\n- **ota**: update check could hang forever and die silently (`ef4a71c`)\n- **ci**: stop golden screenshots from failing the build (`840ed42`)\n- **ota**: isolate OTA network traffic from the authenticated API client (`5484061`)\n- **ota**: drain timer must not reset on unchanged pending count (`975cd6e`)\n- **ota**: dedupe optional-update banner + align pending-upload count (`6fffa62`)\n- **ota**: UpdateGateScreen.dismissible so the optional path can actually be popped (`a03cc92`)\n- **ota**: load-bearing non-dismissibility tests + guard setState after dispose (`0d65466`)\n- **ota**: openInstallPermissionSettings never crashes on ActivityNotFoundException (`8c3bb00`)\n- **ota**: drain gate on retriable uploads only, not terminal failures (`36bbe80`)\n- **ota**: FileProvider fallback path for devices with no external cache (`b39df4a`)\n- **ota**: restrict manifest apkUrl to the app host (`6ca96be`)\n- **ci**: checkout release commit in publish; source releaseNotes from CHANGELOG.md (`3ee1d83`)\n\n### Maintenance\n\n- 1.2.0 + add CHANGELOG (`a120389`)\n- **ota**: render every update UI state to a screenshot (`94c7ed5`)\n- **ota**: fix workflow permission over-grant + doc drift (`1cce1be`)\n- **ota**: guard the stage-vs-prod manifest URL, not just any() URL (`e608ec8`)\n- mirror OTA reference into the repo (`3d0a63d`)\n- **ota**: manual verification checklist matching shipped behavior (`5fc29b9`)\n- OTA force-update implementation plan (`cdeda77`)\n- OTA force-update design spec (`9e7e565`)",
  "publishedAt": "2026-09-02T13:03:40Z"
}