fix(migration): canonical store urls for pwa-sunset launch (TASK-21044) - #2945
fix(migration): canonical store urls for pwa-sunset launch (TASK-21044)#2945kushagrasarathe wants to merge 4 commits into
Conversation
… launch the real store ids already landed on dev (ca45419); this pins the ios store + write-review urls to the canonical /us/ listing form (apps.apple.com/us/app/id6786373552) so they match the published listing exactly. play url confirmed unchanged. launch-blocker per TASK-21044 §2. branch doubles as the handoff branch for slava's review-nudge changes.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Team Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Code-analysis diffPainscore total: 7052.83 → 7056.39 (+3.56) 🆕 New findings (77)
…and 57 more. ✅ Resolved (79)
…and 59 more. 📈 Painscore deltas (top movers)
|
🧪 UI test report — ✅ all greenSuites
📊 Coverage (unit)
⏱ 10 slowest test cases
|
There was a problem hiding this comment.
Chip review — no blocking findings — this is not an approval
Clean at the supplied head. The two constants now use the standard US-storefront App Store URL shape while preserving the app ID and write-review query semantics; every consumer remains compatible.
Checked clean
- Verified the detached worktree HEAD, trusted author, dev base ref, exact base SHA, and merge base.
- Traced STORE_URL.ios and REVIEW_URL.ios through store badges, smart redirects, deferred handoff helpers, and the native review prompt.
- Checked Apple's official App Store linking and review deep-link guidance; the product URL shape and action=write-review query are valid.
- Probed both changed URLs: the listing currently returns 404 as documented because it is not public yet, so the final published destination cannot yet be exercised.
- Checked CI at the exact head: 13 checks succeeded, 3 were still in progress, 1 was skipped, and none failed.
- Ran git diff --check and reviewed the file's recent history and surrounding migration constants.
Second opinion by moonshotai/kimi-k3: 0 finding(s), marked with the model name. It reads the diff only, so treat its findings as advice.
Third opinion by claude-opus: 0 finding(s), marked with the model name. It answers only product truth, missing tests and the cross-repo contract, so treat its findings as advice.
Exact head: 2a552d16a02e · Context: repo, apple-developer-docs · Took 6m
🖼 Visual diff — 1 screen moved1 of 60 shots changed · 59 identical · baseline
new screens (1)
job summary · before/after/diff images — artifact Fixture screenshots, no backend. Advisory — this check never blocks a merge. Posted from the default branch by ds-shots-comment.yml; the report it renders is untrusted data. |
App Store Review Guidelines 5.6.1 disallows custom review prompts outright: "Use the provided API to prompt users to review your app ... we will disallow custom review prompts." ReviewPromptModal is one — our own copy, our own CTA, deep-linking out to the store's write-review page. Two further problems on the same modal: routing "Could be better" to the support drawer filters unhappy users away from the store (5.6.3 Discovery Fraud; Google's In-App Review guidelines name the "Do you like the app?" pre-question explicitly), and it fired on the first home view after app open, which is the moment the HIG tells you not to ask. Removing it rather than relocating it: the native review sheet (SKStoreReviewController / Play In-App Review) needs a Capacitor plugin, so it cannot ride an OTA bundle. This deletion is JS-only and unblocks flipping pwa-sunset to 100% without carrying a 5.6.1 violation into App Review; the happy-moment replacement lands with the next binary. REVIEW_URL, the reviewPromptShownAt preference and the APP_REVIEW modal type lose their only consumer and go with it. migration.review.* is removed from the three source catalogs and the marketing subsets regenerated.
There was a problem hiding this comment.
Chip review — no blocking findings — this is not an approval
The store URL canonicalization and custom review-prompt removal are sound, but the deletion leaves two design-system audit inventories claiming that ReviewPromptModal is still live.
Findings
- MINOR · src/components/Migration/ReviewPromptModal.tsx:1 · Remove the stale ReviewPromptModal audit rows
Deleting this component leaves both DS audit inventories reporting ReviewPromptModal as live with one usage and pointing at a source file that no longer exists. The /dev/ds/audit views therefore present a false inventory after this change. Remove the ReviewPromptModal rows from audit-data.ts and audit-components-data.ts, and update any affected modal aggregate counts.
Checked clean
- Verified the detached worktree HEAD, supplied base commit, merge base, trusted PR author, and dev base ref.
- Reviewed the complete two-commit diff and surrounding STORE_URL consumers.
- Confirmed the custom prompt's live import, analytics modal type, preference field, review URL, and locale entries were removed with no remaining product-code references.
- Checked current Apple App Review 5.6.1 and Google Play in-app review guidance; removing the custom pre-prompt matches both.
- All exact-head GitHub checks completed successfully; changed locale JSON parses and git diff --check is clean.
- Security pass found no new secret exposure, input-handling boundary, privilege change, or persistent-state mutation.
Second opinion by moonshotai/kimi-k3: 0 finding(s), marked with the model name. It reads the diff only, so treat its findings as advice.
Third opinion by claude-opus: 0 finding(s), marked with the model name. It answers only product truth, missing tests and the cross-repo contract, so treat its findings as advice.
Exact head: 02acd52457ae · Context: repo, ci, web · Took 11m (queued 9m)
…193) Replaces the deleted custom prompt with the OS review sheet (@capgo/capacitor-in-app-review: SKStoreReviewController on iOS, Play In-App Review on Android), which is the only ask guideline 5.6.1 permits. This is the binary half of the review-nudge work — it adds native plugins and so cannot ship over OTA; the JS-only removal is TASK-22193's other PR. requestAppReview(userId, trigger) is the single entry point. It carries the whole policy so call sites stay one line: - native only, skipped in demo mode - an engagement floor (>=2 qualifying moments) before the first ask, so a day-0 depositor is never asked — HIG's "demonstrated engagement" - a 120-day floor between requests and at most 2 per 365 days, one under Apple's silent 3/365 ceiling so a strong moment always has budget. The OS reports nothing back, so this stamp is the only control we have. - a 7-day friction quiet period: any money-flow failure (observed for free in posthog before_send) suppresses the ask. This is the honest version of what the old "Could be better" branch reached for — suppress the question, never filter the answer toward or away from the store. Wired on the tail of four happy moments, each gated on the success being real and fired ~2.5s after the celebration settles (never mid-flow, never layered on our own modal): reward/perk claim (a friend joined + money landed — the strongest moment), shared payment success, claim-link money-received, and QR pay. review_requested is captured with the trigger and budget state; there is deliberately no shown/rated counterpart because neither OS exposes one — measure against App Store Connect / Play Console. Also adds a user-initiated "Leave a review" row in Profile -> About. A prompt built from a write-review deep link would breach 5.6.1, but Apple documents that exact link for a review the user starts themselves, and it is the release valve for anyone the OS quota silently skipped. Opens via @capacitor/app-launcher, not the in-app browser: SFSafariViewController does not follow the universal link, so ?action=write-review would otherwise land on the web listing with no composer.
feat(review): native app-store review sheet on happy moments (TASK-22193)
There was a problem hiding this comment.
Chip review — no blocking findings — this is not an approval
The review-prompt removal and native review-nudge rollout are coherent at this head; one previously raised stale DS-audit entry remains and is explicitly deferred to TASK-22226.
Answered by a human, not raised again
These are still present as far as this review can tell. You resolved the thread or deferred the fix, so Chip files them instead of repeating them.
- MINOR · src/components/Migration/ReviewPromptModal.tsx:1 · Design-system audit data still references deleted ReviewPromptModal — no task filed, please file one
Checked clean
- Verified HEAD matches 036db38 and diff is against base c2811a2.
- Reviewed app-review flow end-to-end (useAppReviewNudge, requestAppReview, friction suppression, About screen fallback) and found no additional correctness or security defects in changed runtime paths.
- Confirmed old custom review prompt wiring was removed (component deletion, HomeModals removal, APP_REVIEW modal type and reviewPromptShownAt usage removed).
- Checked CI for this exact head via check-runs API: all required gates succeeded.
Security review by moonshotai/kimi-k3: 0 finding(s), marked with the model name. It reads the diff only and answers only security, privacy and money, so treat its findings as advice.
Third opinion by claude-opus: 0 finding(s), marked with the model name. It answers only product truth, missing tests and the cross-repo contract, so treat its findings as advice.
The usual first reviewer was out of plan, so this review was done by openrouter/openai/gpt-5.3-codex.
Exact head: 036db38aefba · Context: repo, ci · Took 11m (queued 9m)
Summary
Two related changes for the pwa-sunset launch, both dark behind the
pwa-sunsetPostHog flag:1. Canonical store URLs (TASK-21044). Pins the iOS store + write-review URLs to the official
/us/listing form (https://apps.apple.com/us/app/id6786373552); Google Play unchanged (id=me.peanut.wallet).2. Removes the custom app-review prompt (TASK-22193).
ReviewPromptModal("Loving Peanut so far?" → store deep link / "Could be better" → support) is a custom review prompt, disallowed verbatim by App Store guideline 5.6.1 ("Use the provided API… we will disallow custom review prompts"). It also routed unhappy users away from the store (5.6.3; Google's In-App Review guidelines forbid the "Do you like the app?" pre-question by name) and fired on the first home view after open — the moment the HIG says not to ask. Removing it clears the 5.6.1 exposure sopwa-sunsetcan flip to 100% without carrying a violation into App Review.This is JS-only and OTA-shippable — no binary rebuild.
REVIEW_URL, thereviewPromptShownAtpref, theAPP_REVIEWmodal type and themigration.review.*copy (three source locales + regenerated marketing subsets) go with the component.The compliant replacement — the native OS review sheet on happy moments — is the follow-on #2952 (stacked on this branch; needs a binary release, cannot ride OTA).
Tasks
Risks
None on web — all migration surfaces are dark behind
pwa-sunset(scoped to 11 userIds today). The prompt removal is additive-by-subtraction and OTA-safe.MIGRATION_CUTOVER_DATEintentionally left as placeholder — set at flip-day decision.QA
npm run typecheckclean; fullnpm testgreen (433 suites, 5568 passed); prettier clean.STORE_URLconstant, not literals;REVIEW_URLhad no consumer other than the removed modal, so nothing else references it.IOS_APP_STORE_LISTING_LIVEstaysfalse). Re-verify 200 before flag-on.