Skip to content

chore: merge release/v1.3.15 back into develop#1001

Closed
github-actions[bot] wants to merge 34 commits intodevelopfrom
release/v1.3.15
Closed

chore: merge release/v1.3.15 back into develop#1001
github-actions[bot] wants to merge 34 commits intodevelopfrom
release/v1.3.15

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

Auto-generated PR to sync develop after release

IgorGanapolsky and others added 23 commits March 13, 2026 16:21
## 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>
## 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
## 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
@trunk-io
Copy link
Copy Markdown

trunk-io Bot commented Mar 31, 2026

Merging to develop in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

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

@github-actions github-actions Bot added the pr-state:ci_green All required CI checks are green label Mar 31, 2026
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
@github-actions github-actions Bot removed the pr-state:ci_green All required CI checks are green label Mar 31, 2026
…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
@github-actions github-actions Bot added pr-state:ci_running Required CI checks are still running and removed pr-state:ci_green All required CI checks are green labels Mar 31, 2026
## 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
Comment thread native-ios/RandomTimer/Sources/Services/AIVoiceCalloutService.swift
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
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented Apr 1, 2026

Comment thread native-ios/RandomTimer/Sources/Services/AIVoiceCalloutService.swift
@IgorGanapolsky
Copy link
Copy Markdown
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.

@IgorGanapolsky IgorGanapolsky deleted the release/v1.3.15 branch April 6, 2026 18:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-state:ci_running Required CI checks are still running

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant