diff --git a/plans/badges-codes/2026-08-21-badges-web-checkout.md b/plans/badges-codes/2026-08-21-badges-web-checkout.md index 471a4a4c97..f03779bea2 100644 --- a/plans/badges-codes/2026-08-21-badges-web-checkout.md +++ b/plans/badges-codes/2026-08-21-badges-web-checkout.md @@ -171,12 +171,12 @@ The two `-m` filters are needed because the badge tests live under two hspec pat | F4 | Refunds and disputes | B7, F2 | ☐ | | F5 | Stripe scenario tests | F2, F4 | ☐ | | G0 | Remove the store purchase action | — | ☑ | -| G1 | Kotlin: payment-method screen and browser hand-off | C2, D5, G0 | ☐ | -| G2 | Kotlin: redeem view | B8, C4, G0 | ☐ | -| G3 | Swift: redeem view | B8, C4, G0 | ☐ | -| G4 | Kotlin: catalog pricing and badge-state refresh | C4, D3, G0, G1, G2 | ☐ | -| G5 | Swift: catalog pricing and badge-state refresh | C4, D3, G0, G3 | ☐ | -| G6 | Strings and stub cleanup | G0, G1, G2, G3, G4, G5 | ☐ | +| G1 | Kotlin: payment-method screen and browser hand-off | — | ⊘ out of scope | +| G2 | Kotlin: redeem view | — | ⊘ out of scope | +| G3 | Swift: redeem view | — | ⊘ out of scope | +| G4 | Kotlin: catalog pricing and badge-state refresh | — | ⊘ out of scope | +| G5 | Swift: catalog pricing and badge-state refresh | — | ⊘ out of scope | +| G6 | Strings and stub cleanup | — | ⊘ out of scope | | H1 | Rate limiting and request caps | D7, E4, F2 | ☐ | | H2 | Code lifecycle tooling | B7, B8, E4 | ☐ | | H3 | Stuck-order reconciliation | E3, F2 | ☐ | @@ -1299,6 +1299,19 @@ Document the backup procedure for both secrets, and state that `[web] web_dir` i Deferred. All remain defined in the protocol and either return `bad_request` or are unused. +- **The client apps, and code redemption itself (scope reduction, 2026-08-27).** This plan's + remaining work is **money → code** only: the site, the two payment providers, and the operator + tooling around orders and codes. **Code → badge is another person's responsibility** and no step + here advances it. Concretely: G1–G6 are dropped (no iOS or Android change), and Phase C, B7's + `purchaseBadge{code}` and B8's minting stay exactly as they shipped — they are complete and + tested, and nothing in D5–D7, E, F or H may alter their behaviour. Two consequences to hold onto: + **G0 already landed** and stays, because it removed a store button that charged users for a badge + they would never receive, and reverting it would restore that; and the redeem views on both + platforms remain title-only stubs, so a code bought on the site cannot be redeemed from a shipped + app until whoever owns that half builds G2/G3. §10's end-to-end script therefore stops at a code + on the result screen — the `/_badge purchase` steps in it are that other person's verification, + not this plan's. + - Subscriptions and renewals for non-store payments. Web purchases are prepaid months only. - `getBadgeInvoice` (in-app invoices), `upgradeBadgeSubscription`, `pauseBadge`. - The `receipt` transfer payment, and `SPApple` / `SPGoogle` store evidence. **Store purchases yield no credential**, which is why decision 6 removes the store purchase action. Verifying Apple JWS and Google purchase tokens is a later plan; until then the redemption code is the only route to a badge on iOS and the Play build.