chore: merge release/v1.3.15 back into develop#1001
Closed
github-actions[bot] wants to merge 34 commits intodevelopfrom
Closed
chore: merge release/v1.3.15 back into develop#1001github-actions[bot] wants to merge 34 commits intodevelopfrom
github-actions[bot] wants to merge 34 commits intodevelopfrom
Conversation
## Summary - Fix iOS Pro backdoor: set `.elite` not `.base` - Persist debug unlock through billing restore (both platforms) - Android paywall matches iOS: single $29.99/yr plan - Bump version to 1.2.7 - Add REVIEW.md for Claude Code Review ## Test plan - [ ] Long-press "Upgrade to Pro" 8s → unlocks Pro, stays unlocked - [ ] Paywall shows single plan on both platforms - [ ] All lock icons disappear after backdoor --------- Co-authored-by: Igor Ganapolsky <igor.ganapolsky@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary - ship the App Store creative overhaul release payload - include the release-branch CI unblockers for Android voice cues, iOS paywall copy, and Google Play internal distribution wiring - remove the Android Pro sound-arsenal flicker by initializing the expansion state correctly ## Verification - python3 -m pytest -q scripts/tests/test_growth_workflow_contracts.py scripts/tests/test_mobile_feature_parity.py scripts/tests/test_timer_defaults_parity.py - ./gradlew --no-daemon -Dorg.gradle.jvmargs="-Xmx1024m -Dfile.encoding=UTF-8" :app:compileDebugKotlin - DEVELOPER_DIR=/Applications/Xcode-26.1.1.app/Contents/Developer xcodebuild -project native-ios/RandomTimer.xcodeproj -scheme RandomTimer -destination "platform=iOS Simulator,name=RandomTimer AppStore iPhone 16 Pro Max,OS=18.6" build - git diff --check --------- Co-authored-by: Igor Ganapolsky <igor.ganapolsky@gmail.com>
## Summary\n- shorten App Store keywords to stay within Apple's 100-character limit\n- accept both current and legacy 13-inch iPad screenshot dimensions in the local validator\n- restore local Python 3.9 compatibility for scripts/verify_release.py\n- add validator coverage for both supported iPad screenshot sizes\n\n## Verification\n- python3 scripts/refresh_ios_screenshot_creatives.py\n- python3 -m pytest -q scripts/tests/test_refresh_ios_screenshot_creatives.py scripts/tests/test_verify_release.py\n- python3 -m pytest scripts/tests/ -q --cov=scripts --cov-report=term --cov-report=xml:coverage-python.xml\n- git diff --check Co-authored-by: Igor Ganapolsky <igor.ganapolsky@gmail.com>
## Summary\n- stop iOS release verification from failing a TestFlight-only check on App Store rejected state\n- retarget the highest editable ASC version to the preferred version when create is blocked\n- cover the new resolver and verifier paths with focused tests\n\n## Verification\n- python3 -m pytest -q scripts/tests/test_asc_resolve_version.py scripts/tests/test_verify_release.py scripts/tests/test_asc_submit_for_review.py scripts/tests/test_asc_verify_ready.py\n- APPSTORE_KEY_ID=*** APPSTORE_ISSUER_ID=*** APPSTORE_PRIVATE_KEY=~/.appstoreconnect/private_keys/AuthKey_4RP6S27FL2.p8 python3 scripts/asc_resolve_version.py --preferred-version 1.3.11 --create-if-needed --auto-next-patch --json-out /tmp/asc_resolve_after_fix.json\n- APPSTORE_KEY_ID=*** APPSTORE_ISSUER_ID=*** APPSTORE_PRIVATE_KEY=~/.appstoreconnect/private_keys/AuthKey_4RP6S27FL2.p8 python3 scripts/verify_release.py --platform ios --version 1.3.11 --ios-scope testflight --wait --timeout 120 --poll-interval 15\n- git diff --check --------- Co-authored-by: Igor Ganapolsky <igor.ganapolsky@gmail.com>
## Summary - switch ASC age rating checks from deprecated App Store version paths to live App Info relationships - make the hard readiness gate verify age rating truthfully instead of skipping on PATH_ERROR - cover the new App Info lookup path in submit and readiness tests ## Verification - python3 -m pytest -q scripts/tests/test_asc_submit_for_review_age_rating.py scripts/tests/test_asc_verify_ready.py scripts/tests/test_asc_submit_for_review.py scripts/tests/test_asc_submit_for_review_pricing.py scripts/tests/test_asc_submit_for_review_review_detail.py scripts/tests/test_asc_submit_for_review_version_localization.py - APPSTORE_KEY_ID=*** APPSTORE_ISSUER_ID=*** APPSTORE_PRIVATE_KEY=... python3 scripts/asc_submit_for_review.py --version 1.3.11 --locale en-US --dry-run - APPSTORE_KEY_ID=*** APPSTORE_ISSUER_ID=*** APPSTORE_PRIVATE_KEY=... python3 scripts/asc_verify_ready.py --version 1.3.11 --locale en-US - git diff --check Co-authored-by: Igor Ganapolsky <igor.ganapolsky@gmail.com>
## Summary - replace the stale Fastlane-only review submit path with App Store Connect reviewSubmissions API handling - resolve rejected review submission items before resubmitting the existing submission - add workflow and unit-test coverage for the resubmit flow ## Verification - python3 -m pytest -q scripts/tests/test_asc_submit_for_review_submission_flow.py scripts/tests/test_asc_submit_for_review.py scripts/tests/test_asc_submit_for_review_age_rating.py scripts/tests/test_asc_submit_for_review_review_detail.py scripts/tests/test_asc_verify_ready.py scripts/tests/test_growth_workflow_contracts.py - APPSTORE_KEY_ID=*** APPSTORE_ISSUER_ID=*** APPSTORE_PRIVATE_KEY=*** python3 scripts/asc_submit_for_review.py --version 1.3.11 --locale en-US --wait --timeout 60 --poll-interval 10 - git diff --check - actionlint .github/workflows/ios-submit-review.yml Co-authored-by: Igor Ganapolsky <igor.ganapolsky@gmail.com>
## Summary - bring main in line with current PR automation docs and BUGBOT contract - carry over repo hygiene and Sonar workflow remediations from develop - remove stale REVIEW.md from the repo root ## Verification - python3 scripts/validate_release_branch.py --repo-root . --head-ref hotfix/v1.3.11 - PYTHONPATH=/tmp/random-timer-pydeps python3 -m pytest scripts/tests/test_pr_automation_docs.py scripts/tests/test_repo_hygiene_contracts.py scripts/tests/test_source_versions.py scripts/tests/test_paid_acquisition_seed.py scripts/tests/test_apple_ads_live_metrics.py scripts/tests/test_workflow_security_contracts.py -q - bash scripts/hygiene-check.sh
## Summary - update the PR automation note to reflect the live green Sonar state - keep the Cursor status honest: repo-ready, external app install still required ## Verification - bash scripts/hygiene-check.sh - python3 scripts/validate_release_branch.py --repo-root . --head-ref hotfix/v1.3.11 - rg -n "Current note:" README.md
Auto-generated PR to sync main with release v1.3.15 --------- Co-authored-by: Igor Ganapolsky <iganapolsky@gmail.com> Co-authored-by: Igor Ganapolsky <igor.ganapolsky@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: IgorGanapolsky <201209+IgorGanapolsky@users.noreply.github.com> Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: aider (openrouter/qwen/qwen3-coder) <aider@aider.chat>
Both platforms: - VoiceGender enum (male/female) added to TimerConfig - Segmented picker in setup screen (shown when voice enabled + Pro) - Voice callout service accepts gender for future female voice pack Male is default. Female voice files will be generated separately via ElevenLabs with a female HIIT instructor voice. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Runs at 6 AM UTC on the 1st via cron schedule: - Generates voice callouts via ElevenLabs TTS - Generates alarm sounds via ElevenLabs Sound Effects - Syncs to Android resources - Creates a PR with the new pack Also available via manual dispatch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…d detection Made-with: Cursor
## Summary\n- stop accidental iOS-only release dispatches on \n- disable Play fallback-track publishing for this release branch\n- fix the iOS submit-review metadata lane to edit the existing App Store version instead of trying to create it again\n- fail fast when the first subscription still needs manual App Store Connect review attachment\n\n## Verification\n- function-level workflow checks on release branch: , \n- ▸ Warning: could not enumerate subscriptions for review: unhandled route GET /apps/app-1/subscriptionGroups ▸ No existing review submission found for this version; creating one. ▸ Review submission sub-new state: WAITING_FOR_REVIEW ▸ Found existing review submission sub-1 (state=UNRESOLVED_ISSUES). ▸ Resolving rejected review submission item item-1 for resubmission… ▸ Review submission item item-1 state: READY_FOR_REVIEW ▸ Review submission sub-1 state: WAITING_FOR_REVIEW\n- Syntax OK\n-
The ios-submit-review job was silently skipped on every single-platform dispatch because GitHub Actions propagates the "skipped" state from transitive ancestors (android-release) even when verify-releases succeeds. Adding `if: always() && needs.verify-releases.result == 'success'` matches the pattern already used by tag-release and sync-main jobs. Made-with: Cursor
Fastlane deliver cannot find an "editable" version when the ASC version is already READY_FOR_REVIEW, causing 20+ min timeout then failure. Skip the metadata step entirely for versions that are already ready/waiting/in-review since metadata was uploaded earlier. Made-with: Cursor
grep -oP '[\d.]+' produces multiple matches per line causing GITHUB_OUTPUT to receive invalid format (just '.'). sed extracts the full version string cleanly in one pass. Made-with: Cursor
ASCClient reads key content from APPSTORE_PRIVATE_KEY env var, not a file path. Use APPSTORE_PRIVATE_KEY_PATH so it reads the .p8 file correctly. Also show stderr for debugging. Made-with: Cursor
scripts/asc_resolve_version.py imports from scripts.asc_client which requires PYTHONPATH to include the repo root. The standalone ios-submit-review.yml already sets this; native-release.yml was missing it. Made-with: Cursor
ASCClient doesn't have get_app_store_version. Use the existing asc_poll_version_state.py script which properly queries ASC API. Made-with: Cursor
Made-with: Cursor
## Summary - align internal-distribution ruby/setup-ruby pin with the working native-release workflow - document the active Firebase App Distribution project and internal target behavior - add regression coverage for the ruby pin so this does not drift again ## Verification - pytest -q scripts/tests/test_growth_workflow_contracts.py scripts/tests/test_workflow_security_contracts.py - reproduced failing internal-distribution run 23814350097 where iOS TestFlight and Android Play both died in Setup Ruby - direct workflow verification from a fix branch was blocked by production environment protection, so this PR targets release/v1.3.15 for allowed rerun
|
Merging to
After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here |
Prevent native release from calling Fastlane metadata when the selected App Store version is already in a submitted/reviewable state, which avoids ASC rejecting version creation during submit-review flow. Made-with: Cursor
…bmission Handle ITEM_PART_OF_ANOTHER_SUBMISSION conflicts by reloading existing review submissions and reusing the already-attached submission item instead of failing the release job. Made-with: Cursor
## Root cause - Free users could tap `PREVIEW`, but the voice gender selector was not consistently usable for that path. - The runtime stored `voiceGender`, but preview and timer playback were effectively single-voice in practice. - The repo does not ship a dedicated female asset pack yet, so selecting female had no real differentiated playback path. ## Fix - Keep the male/female selector visible in free preview flows. - Wire preview and timer playback to the selected gender on both iOS and Android. - Use bundled voice assets for male playback. - Use system synthesized speech for female playback until a dedicated female pack ships. - Rename the Android setup label back to `Voice Callouts`. ## Verification - `cd native-android && ./gradlew testDebugUnitTest --tests '*AIVoiceCalloutManagerSelectionTest'` - `cd native-ios && xcodebuild test -scheme RandomTimer -destination 'id=C404BB2D-0539-478F-82A3-832F54FEC7EF' -only-testing:RandomTimerTests/AIVoiceCalloutServiceTests -only-testing:RandomTimerUITests/RandomTimerUITests/testFreeSetupShowsPreviewWithoutExtendedRangeToggle -only-testing:RandomTimerUITests/RandomTimerUITests/testFemalePreviewVoiceCueDoesNotCrashSetupScreen`
Extend android-metadata-sync to run fastlane metadata_legacy so Play listing images and screenshots are uploaded alongside text metadata. Made-with: Cursor
Upload Android listing creatives during metadata sync and make iOS remove-from-review tolerant of missing submission resources so parity automation can proceed reliably. Made-with: Cursor
Extend Android metadata sync to replace icon, feature graphic, and phone screenshots through the Play edits API with strict asset validation, removing the brittle fastlane metadata fallback. Made-with: Cursor
Apply strict image/screenshot completeness checks to en-US while allowing secondary locales to sync listing text without requiring mirrored creative packs. Made-with: Cursor
|
Owner
|
Superseded by later back-merges, including the verified v1.3.17 back-merge in #1082. Closing this stale v1.3.15 develop sync PR. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Auto-generated PR to sync develop after release