Skip to content

Latest commit

 

History

History
112 lines (102 loc) · 25.3 KB

release.md

File metadata and controls

112 lines (102 loc) · 25.3 KB

TimeStack Release Checklist

Build Gates

  • Debug APK: .\gradlew.bat assembleDebug --no-daemon --no-configuration-cache --console=plain
  • Release APK: .\gradlew.bat assembleRelease --no-daemon --no-configuration-cache --console=plain
  • Release AAB: .\gradlew.bat bundleRelease --no-daemon --no-configuration-cache --console=plain
  • Local store-candidate gate: .\gradlew.bat verifyStoreCandidate --no-daemon --no-configuration-cache --console=plain
  • Store-listing assets: .\gradlew.bat verifyStoreListingAssets --no-daemon --no-configuration-cache --console=plain
  • Store-listing copy: .\gradlew.bat verifyStoreListingCopy --no-daemon --no-configuration-cache --console=plain
  • Privacy/Data Safety disclosure alignment: .\gradlew.bat verifyPrivacyDisclosures --no-daemon --no-configuration-cache --console=plain
  • Public privacy-policy draft: .\gradlew.bat verifyPublicPrivacyPolicyDraft --no-daemon --no-configuration-cache --console=plain
  • Privacy-policy hosting readiness: .\gradlew.bat verifyPrivacyPolicyHosting --no-daemon --no-configuration-cache --console=plain
  • In-app policy/support readiness: .\gradlew.bat verifyInAppPolicySupport --no-daemon --no-configuration-cache --console=plain
  • Third-party notices readiness: .\gradlew.bat verifyThirdPartyNotices --no-daemon --no-configuration-cache --console=plain
  • Play Console app-content readiness: .\gradlew.bat verifyPlayConsoleReadiness --no-daemon --no-configuration-cache --console=plain
  • Play Console submission runbook readiness: .\gradlew.bat verifyPlaySubmissionRunbook --no-daemon --no-configuration-cache --console=plain
  • Play release notes/version readiness: .\gradlew.bat verifyReleaseNotes --no-daemon --no-configuration-cache --console=plain
  • Release signing runbook readiness: .\gradlew.bat verifySigningRunbook --no-daemon --no-configuration-cache --console=plain
  • Device/OEM smoke checklist readiness: .\gradlew.bat verifyDeviceSmokeChecklist --no-daemon --no-configuration-cache --console=plain
  • Distribution readiness matrix: .\gradlew.bat verifyDistributionReadiness --no-daemon --no-configuration-cache --console=plain
  • Permission policy: .\gradlew.bat verifyDebugPermissions verifyReleasePermissions --no-daemon --no-configuration-cache --console=plain
  • Local unit tests: run through the T: alias described in docs/testing.md.
  • Instrumented test APK compile: .\gradlew.bat assembleDebugAndroidTest --no-daemon --no-configuration-cache --console=plain
  • Device/emulator tests: .\gradlew.bat connectedDebugAndroidTest --no-daemon --no-configuration-cache --console=plain
  • Signed release APK/AAB: provide keystore.properties or the TIMESTACK_RELEASE_* environment variables, then run .\gradlew.bat verifySignedStoreCandidate --no-daemon --no-configuration-cache --console=plain.

Latest Verified Run

  • API 36 AVD: medium_phone, model sdk_gphone64_x86_64, Android 16.
  • Installed package: com.lvjun.timestack.
  • Launch target: com.lvjun.timestack/com.example.timestack.MainActivity.
  • connectedDebugAndroidTest passed on 2026-07-01: 46 tests, 0 failures, 0 errors, 0 skipped.
  • Evidence artifacts: artifacts/timestack-home-api36.png, artifacts/timestack-wide-api36.png, artifacts/product-audit-2026-07-01-settings/, artifacts/product-audit-2026-07-01-review-trends/, artifacts/product-audit-2026-07-01-current-product/, artifacts/product-flow-audit-2026-07-01-current-run/, artifacts/review-triage-audit-2026-07-01/, artifacts/reminder-throttle-audit-2026-07-01/, artifacts/focus-reminder-quiet-audit-2026-07-01/, artifacts/task-row-focus-audit-2026-07-01/, artifacts/task-row-delete-audit-2026-07-01/, artifacts/inbox-attention-audit-2026-07-01/, artifacts/system-picker-smoke-2026-07-01/, artifacts/widget-smoke-2026-07-01/, artifacts/reminder-permission-smoke-2026-07-01/, artifacts/permission-audit-2026-07-01/, artifacts/release-bundle-audit-2026-07-01/, artifacts/store-candidate-gate-2026-07-01/, artifacts/store-listing-copy-audit-2026-07-01/, artifacts/privacy-disclosure-gate-2026-07-02/, artifacts/public-privacy-policy-gate-2026-07-02/, artifacts/privacy-policy-hosting-gate-2026-07-02/, artifacts/in-app-policy-support-gate-2026-07-02/, artifacts/third-party-notices-gate-2026-07-02/, artifacts/play-console-readiness-gate-2026-07-02/, artifacts/play-submission-runbook-gate-2026-07-02/, artifacts/release-notes-gate-2026-07-02/, artifacts/signing-runbook-gate-2026-07-02/, artifacts/device-smoke-checklist-gate-2026-07-02/, artifacts/distribution-readiness-gate-2026-07-02/, artifacts/visual-golden-audit-2026-07-01/, artifacts/screenshot-matrix-2026-07-01/, artifacts/settings-privacy-trust-audit-2026-07-01/, artifacts/settings-app-identity-audit-2026-07-01/, artifacts/settings-backup-live-summary-audit-2026-07-01/ and artifacts/settings-backup-passphrase-clear-audit-2026-07-01/.
  • Connected test report: app/build/reports/androidTests/connected/debug/index.html.
  • APK resource check: debug APK packages the TimeStack adaptive launcher icon XML and ic_notification_timestack.xml; old generated launcher webp files are not packaged.
  • Window/insets check: MainActivity enables edge-to-edge, disables API 29+ navigation-bar contrast enforcement, and the merged debug/release manifests keep windowSoftInputMode="adjustResize" on the Activity.
  • Notification delivery check: ReminderWorker posts a TimeStack notification after POST_NOTIFICATIONS is granted on the API 36 emulator, local-hour delivery throttling caps foreground notification posts at 2 per hour, and running Focus timer state silences non-schedule reminders while allowing schedule reminders. Evidence: artifacts/reminder-throttle-audit-2026-07-01/ and artifacts/focus-reminder-quiet-audit-2026-07-01/.
  • Primary action callback check: focus, task, countdown, calendar event, habit, Today task-row direct focus/delete and unresolved-task actions, including reschedule/split/cancel, are covered by Compose device tests.
  • Editor and inbox check: task, habit, timeline event, countdown and manual time-log editor save flows plus inbox promote/delete actions are covered by Compose device tests.
  • Navigation check: Navigation 3 top-level destination switching and back behavior from task detail/settings routes are covered by Compose device tests.
  • Focus and review check: Focus timer running/paused/finished UI states, Focus paused-state restoration after recreation, Review daily-review/question save flows, historical review trend stats and visible focus-session history stats are covered by Compose device tests.
  • Settings flow check: preferences save callbacks, installed app identity display, live backup data summary updates, reminder-row labels/toggle callbacks, backup entry points, encrypted-backup password entry, visible backup-password clearing after export/import preview/restore and compact 400dp + 1.5 font scale reachability are covered by Compose device tests.
  • Settings trust check: the in-app Settings surface displays the local-first data boundary, including no network permission, no accounts/ads/analytics/cloud sync, Room local storage, Android system picker backup/import, backup-password scope and uninstall behavior. Evidence: artifacts/settings-privacy-trust-audit-2026-07-01/.
  • Settings identity check: the in-app Settings surface reads installed package metadata from Android and displays app name, version, package name and Debug/Release state. Evidence: artifacts/settings-app-identity-audit-2026-07-01/.
  • Settings backup live-summary check: the in-app Settings backup surface always includes the current snapshot data summary and appends operation status through the polite live region. Evidence: artifacts/settings-backup-live-summary-audit-2026-07-01/.
  • Settings backup passphrase-clear check: the visible backup password field clears after successful export, successful import preview and successful restore, while pending restore keeps only the temporary passphrase needed for confirmation. Evidence: artifacts/settings-backup-passphrase-clear-audit-2026-07-01/.
  • Visual smoke/golden check: automated screenshot tests verify nonblank, visually varied frames for compact phone home, tablet landscape home, dark review and 1.5 font scale settings surfaces; on the API 36 reference AVD they also assert stable sampled visual signatures. Evidence: artifacts/visual-golden-audit-2026-07-01/.
  • Product shell polish check: bottom navigation, global/settings entry points and quick-create direct actions use real Material icons with retained Chinese text labels and existing accessibility labels. Settings backup now gives primary visual priority to export and secondary priority to import. Evidence: artifacts/product-flow-audit-2026-07-01-current-run/.
  • Inbox attention check: Today surfaces stale or overloaded inbox state below the summary metrics and the "整理" action opens Inbox, preventing old captured items from staying hidden. Evidence: artifacts/inbox-attention-audit-2026-07-01/.
  • Task row focus check: Today ordinary task rows expose a direct play-icon focus action, preserving the detail route and complete/restore action. Evidence: artifacts/task-row-focus-audit-2026-07-01/.
  • Task row delete check: Today ordinary task rows expose a delete icon, accessibility label and destructive confirmation dialog, preserving the detail route plus complete/restore/focus actions. Evidence: artifacts/task-row-delete-audit-2026-07-01/.
  • Review triage check: unresolved tasks can now be explicitly continued tomorrow, rescheduled, split into inbox items, lowered in priority, moved back to inbox, cancelled without being counted as done, or deleted. Room schema v8 and backup format v8 preserve cancelled task state while legacy v7 task records import as not cancelled. Evidence: artifacts/review-triage-audit-2026-07-01/.
  • System picker backup smoke check: API 36 emulator DocumentsUI exported readable JSON, exported password-encrypted JSON, imported the encrypted backup with the same password, showed restore preview and completed restore. Evidence: artifacts/system-picker-smoke-2026-07-01/.
  • Launcher widget smoke check: API 36 Nexus Launcher lists TimeStack Today, Focus and Habits widget providers, places the Today widget on the home screen with live data, and opens MainActivity from a widget tap. Evidence: artifacts/widget-smoke-2026-07-01/.
  • Reminder permission/scheduling smoke check: API 36 emulator revoked POST_NOTIFICATIONS, granted it through the real system dialog, verified Settings switch enablement, and confirmed reminder UI, Room state and WorkManager enqueue/cancel state stay consistent after the retained Navigation 3 snapshot fix. Evidence: artifacts/reminder-permission-smoke-2026-07-01/.
  • Latest full verification after the Navigation snapshot fix: testDebugUnitTest assembleDebugAndroidTest assembleRelease connectedDebugAndroidTest passed, including 37 connected tests on medium_phone.
  • Permission audit check: verifyDebugPermissions verifyReleasePermissions assembleDebug assembleRelease passed and aapt2 dump permissions confirmed debug/release APKs contain only the allowed merged permissions with no INTERNET or sensitive device/data permissions. Evidence: artifacts/permission-audit-2026-07-01/.
  • Release bundle check: verifyReleasePermissions bundleRelease passed and produced app/build/outputs/bundle/release/app-release.aab with the expected bundle structure. jarsigner confirms the local AAB remains unsigned until a real release/upload key is provided. Evidence: artifacts/release-bundle-audit-2026-07-01/.
  • Store-candidate gate check: verifyStoreCandidate passed after store-listing asset and copy verification were added and now aggregates the local no-secret/no-device release gate, including candidate Play Store PNG dimensions, listing references, listing text length limits and obvious promotional/ranking risk phrases; :app:verifyReleaseSigningConfigured fails with a clear signing-credentials message until a real keystore/upload key is configured. Evidence: artifacts/store-candidate-gate-2026-07-01/.
  • Privacy disclosure gate check: verifyPrivacyDisclosures passed and is included in verifyStoreCandidate, binding the privacy and Data Safety drafts to the source manifest, permission allowlist and Android backup-rule XML files. Evidence: artifacts/privacy-disclosure-gate-2026-07-02/.
  • Public privacy-policy draft check: verifyPublicPrivacyPolicyDraft passed and is included in verifyStoreCandidate, preparing a hostable privacy-policy draft while keeping real public contact and HTTPS hosting as pre-release requirements. Evidence: artifacts/public-privacy-policy-gate-2026-07-02/.
  • Privacy-policy hosting check: verifyPrivacyPolicyHosting passed and is included in verifyStoreCandidate, binding the public URL, public contact, Play Console Privacy Policy field and Data Safety consistency checklist to the current public policy draft. Final verifyStoreCandidate reruns after adding the gate and updating evidence docs passed repeatedly with :verifyPrivacyPolicyHosting included. Evidence: artifacts/privacy-policy-hosting-gate-2026-07-02/.
  • In-app policy and support section check: verifyInAppPolicySupport passed and covers the Settings 政策与支持 in-app policy and support section, its Compose test and release docs, binding privacy-policy boundary, support contact readiness, no network feedback and submission reminders to the current build. testDebugUnitTest assembleDebugAndroidTest passed after the UI and test changes; no device was attached for connected execution in this pass. The final verifyStoreCandidate rerun after adding the gate passed with :verifyInAppPolicySupport included. Evidence: artifacts/in-app-policy-support-gate-2026-07-02/.
  • Third-party notices check: verifyThirdPartyNotices covers docs/third-party-notices.md, Settings 开源许可 copy, release runtime dependency declarations from gradle/libs.versions.toml, and local POM license spot-check evidence. Evidence: artifacts/third-party-notices-gate-2026-07-02/.
  • Play Console readiness check: verifyPlayConsoleReadiness passed and is included in verifyStoreCandidate, covering local preparation for privacy policy URL, Data Safety, ads, app access, target audience, content rating, permissions declaration and account deletion answers. Evidence: artifacts/play-console-readiness-gate-2026-07-02/.
  • Play submission runbook check: verifyPlaySubmissionRunbook passed and covers docs/play-submission-runbook.md, binding Play Console app creation, store listing, app content, testing tracks, production access, managed publishing, errors summary, pre-launch report and rollout evidence to the current release docs. The final verifyStoreCandidate rerun after adding the gate passed with :verifyPlaySubmissionRunbook included. Evidence: artifacts/play-submission-runbook-gate-2026-07-02/.
  • Release notes check: verifyReleaseNotes passed and is included in verifyStoreCandidate, binding Play release notes to the current versionName/versionCode and enforcing language-tag format, 500-character per-language limits and no obvious promotional/solicitation wording. Evidence: artifacts/release-notes-gate-2026-07-02/.
  • Release signing runbook check: verifySigningRunbook passed and is included in verifyStoreCandidate, binding upload-key signing guidance, ignored secret boundaries, signed AAB/APK verification commands and release evidence requirements to the current Gradle signing hooks. Evidence: artifacts/signing-runbook-gate-2026-07-02/.
  • Device/OEM smoke checklist check: verifyDeviceSmokeChecklist passed and is included in verifyStoreCandidate, binding physical-phone, OEM launcher, signed release install, real reminder delivery, document provider, IME, large-screen and TalkBack spot-check requirements to the release docs. The final verifyStoreCandidate rerun after adding the gate passed with :verifyDeviceSmokeChecklist included. Evidence: artifacts/device-smoke-checklist-gate-2026-07-02/.
  • Distribution readiness matrix check: verifyDistributionReadiness passed and is included in verifyStoreCandidate, binding local gate evidence, external blockers and the release decision summary to docs/distribution-readiness.md. The final verifyStoreCandidate rerun after adding the gate passed with :verifyDistributionReadiness included. Evidence: artifacts/distribution-readiness-gate-2026-07-02/.
  • Latest full connected-device check after Review unresolved-task triage: connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 37 tests, 0 failures, 0 errors and 0 skipped. Evidence: artifacts/visual-golden-audit-2026-07-01/.
  • Latest reminder-throttle check: testDebugUnitTest passed with reminder delivery-window coverage, and connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 37 tests, 0 failures, 0 errors and 0 skipped after the worker state reset was added. Evidence: artifacts/reminder-throttle-audit-2026-07-01/.
  • Latest inbox-attention check: testDebugUnitTest assembleDebugAndroidTest passed, Home visual signatures were rebased for the new Today card, and connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 38 tests, 0 failures, 0 errors and 0 skipped. Evidence: artifacts/inbox-attention-audit-2026-07-01/.
  • Latest focus-reminder quiet check: testDebugUnitTest assembleDebugAndroidTest passed, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 40 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed. Evidence: artifacts/focus-reminder-quiet-audit-2026-07-01/.
  • Latest task-row focus check: testDebugUnitTest assembleDebugAndroidTest passed, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 40 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 53s. Evidence: artifacts/task-row-focus-audit-2026-07-01/.
  • Latest task-row delete check: testDebugUnitTest assembleDebugAndroidTest passed, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 40 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 34s. Evidence: artifacts/task-row-delete-audit-2026-07-01/.
  • Latest settings privacy trust check: testDebugUnitTest assembleDebugAndroidTest passed in 18s, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 41 tests, 0 failures, 0 errors and 0 skipped, and verifyStoreCandidate passed in 2m 17s. Evidence: artifacts/settings-privacy-trust-audit-2026-07-01/.
  • Latest settings app identity check: testDebugUnitTest assembleDebugAndroidTest passed in 51s, connectedDebugAndroidTest passed on the API 36 medium_phone AVD with 42 tests, 0 failures, 0 errors and 0 skipped, verifyStoreCandidate passed in 2m 18s, and verifySignedStoreCandidate failed as expected in 16s without signing credentials. Evidence: artifacts/settings-app-identity-audit-2026-07-01/.
  • Latest settings backup live-summary check: testDebugUnitTest assembleDebugAndroidTest passed in 45s, connectedDebugAndroidTest passed on the API 36 medium_phone AVD in 4m 9s with 43 tests, 0 failures, 0 errors and 0 skipped, verifyStoreCandidate passed in 1m 58s, and verifySignedStoreCandidate failed as expected in 11s without signing credentials. Evidence: artifacts/settings-backup-live-summary-audit-2026-07-01/.
  • Latest settings backup passphrase-clear check: testDebugUnitTest assembleDebugAndroidTest passed in 47s, targeted import-preview and restore passphrase-clear tests passed on the API 36 medium_phone AVD in 46s with 2 tests, 0 failures, 0 errors and 0 skipped, connectedDebugAndroidTest passed in 2m 7s with 46 tests, 0 failures, 0 errors and 0 skipped, verifyStoreCandidate passed in 21s, and verifySignedStoreCandidate failed as expected in 15s without signing credentials. Evidence: artifacts/settings-backup-passphrase-clear-audit-2026-07-01/.

Release Configuration

  • Android application id: com.lvjun.timestack.
  • Release APK and AAB builds enable R8 minification and resource shrinking.
  • verifyStoreCandidate aggregates the local no-device/no-secret release gate: store-listing asset validation, store-listing copy validation, privacy/Data Safety disclosure validation, public privacy-policy draft validation, privacy-policy hosting validation, in-app policy/support validation, third-party notices validation, Play Console readiness validation, Play submission runbook validation, release-notes/version validation, release signing runbook validation, device/OEM smoke checklist validation, distribution readiness matrix validation, unit tests, Android test APK compilation, merged-manifest permission checks, release APK and release AAB builds.
  • verifySignedStoreCandidate additionally fails fast when release signing credentials or the referenced keystore file are missing.
  • app/proguard-rules.pro is reserved for app-specific keep rules; AndroidX, Room, WorkManager, Compose and Kotlinx Serialization provide their consumer rules.
  • Android system auto-backup is disabled. TimeStack is local-first, so user-controlled JSON export/import in Settings is the supported data migration path.
  • Backup export supports readable JSON v8 by default and optional password encryption using an AES-GCM envelope for sensitive personal data; encrypted imports require the same backup password before preview/restore.
  • Debug builds seed first-run sample data only when the entire business database is empty. Release builds disable sample content and seed only default preferences, so a freshly installed formal build starts with empty task, habit, inbox, schedule, countdown, focus, review and reminder lists. Empty lists imported from backups remain empty instead of being refilled with examples later.
  • POST_NOTIFICATIONS is requested only for local reminder delivery.
  • Product design, privacy, public privacy-policy, privacy-policy hosting, third-party notices, store-listing, Play Console readiness, Play submission, release-notes, signing, device-smoke and distribution-readiness drafts are maintained in docs/product-design.md, docs/privacy.md, docs/public-privacy-policy.md, docs/privacy-policy-hosting.md, docs/third-party-notices.md, docs/store-listing.md, docs/play-console-readiness.md, docs/play-submission-runbook.md, docs/release-notes.md, docs/signing-runbook.md, docs/device-smoke-checklist.md and docs/distribution-readiness.md; a local candidate listing asset pack is available in artifacts/store-listing-2026-07-01/; recheck all copy and assets against the final signed build before any public distribution.
  • MainActivity owns keyboard resize behavior through Activity-scoped adjustResize; standalone editor forms add IME padding so bottom fields and actions remain reachable while typing.
  • Launcher icons use TimeStack-specific adaptive icon resources. Local notifications use a separate single-color ic_notification_timestack small icon.
  • Release signing is configured through ignored keystore.properties or environment variables. keystore.properties.example documents the required keys without storing secrets, and docs/signing-runbook.md defines the upload-key, certificate fingerprint and signed-artifact verification evidence required before distribution.
  • Debug APK, release APK and release AAB builds run a merged-manifest permission allowlist. Current allowed permissions are POST_NOTIFICATIONS, WorkManager scheduling support permissions (WAKE_LOCK, ACCESS_NETWORK_STATE, RECEIVE_BOOT_COMPLETED, FOREGROUND_SERVICE) and the AndroidX dynamic receiver permission. INTERNET and sensitive device/data permissions are intentionally absent.

Device Smoke Test

Run verifyDeviceSmokeChecklist to confirm the current release docs include the required physical-device and OEM smoke plan. Then execute docs/device-smoke-checklist.md on a real candidate build before calling a build release-ready.

Known Release Blockers Before Store Distribution

  • Provide a real signing key or Play App Signing upload key values through keystore.properties or TIMESTACK_RELEASE_* environment variables, then follow docs/signing-runbook.md, rebuild the release APK/AAB and verify the AAB is signed before upload.
  • Repeat docs/device-smoke-checklist.md on at least one physical phone before distributing outside this machine.
  • Verify real wall-clock delayed reminder delivery, delivery-throttle behavior under OEM background policies and launcher widgets on-device. Android document picker export/import, notification permission/toggle scheduling and Nexus Launcher widget placement have API 36 emulator evidence; docs/device-smoke-checklist.md tracks the required physical-phone/OEM-provider spot checks before wider distribution.
  • Regenerate or approve final public listing assets from the signed build if this moves beyond self-use. A debug-build candidate pack exists under artifacts/store-listing-2026-07-01/, including phone screenshots, feature graphic, Play Store icon and alt text drafts.
  • Follow docs/privacy-policy-hosting.md, replace the contact section in docs/public-privacy-policy.md with a real public support email or contact URL, host the policy on HTTPS, and add that URL in Play Console before public distribution.
  • Review docs/third-party-notices.md, rerun verifyThirdPartyNotices and keep third-party notice evidence for the exact signed release candidate before public distribution.
  • Follow docs/play-submission-runbook.md and run verifyPlaySubmissionRunbook before any real Play Console upload, testing-track submission, production-access application or rollout.