11# AHBG submission blockers — Google Play (primary)
22
3- The Android release artifact and entitlement-check boundary are source-ready.
4- The remaining blockers are split below between repository work and live external
5- Play/RevenueCat work so a green build is not mistaken for a publishable app.
3+ The Android release artifact is source-buildable, but the billing/acquisition,
4+ entitlement-delivery, runtime-enforcement, and production-deployment boundaries
5+ are not complete. The remaining blockers are split below so a green build is
6+ not mistaken for a publishable or sellable app.
67
78## 1. Construction (core mechanics) — CLOSED
89
@@ -13,29 +14,50 @@ Play/RevenueCat work so a green build is not mistaken for a publishable app.
1314- Post-merge hardening is owned by UCNS; AHBG does not invent replacement
1415 construction geometry.
1516
16- ## 2. Billing controls — REPOSITORY BLOCKER
17+ ## 2. Billing + entitlement enforcement — REPOSITORY BLOCKERS
1718
18- RevenueCat initialization and entitlement lookup exist, but the Android/WebView
19- surface does not yet expose a complete acquisition flow .
19+ RevenueCat initialization and an asynchronous customer-info lookup exist, but
20+ the Android/WebView/runtime path does not yet form a complete premium gate .
2021
2122- ** Blocker** : fetch the current RevenueCat offering/package.
2223- ** Blocker** : launch purchase of ` ahbg_benchmark_lab ` from a user-visible
2324 control and surface success/cancel/error state.
24- - ** Blocker** : expose an explicit restore control that calls
25- ` Purchases.sharedInstance.restorePurchases ` and refreshes entitlement state.
26- - Regression-test the bridge/API boundary; do not mark the sandbox billing gate
27- complete from ` getCustomerInfo ` alone.
28-
29- ## 3. Google Play publication — EXTERNAL (primary path)
30-
31- - Code compliance is done: ` compileSdk ` /` targetSdk ` 36, AGP 8.9.1, Gradle
32- 8.11.1, Play-native ` bundleRelease ` in CI, RevenueCat 10.19.1 core, production
33- HTTPS endpoint, signing config outside Git.
25+ - ** Blocker** : expose an explicit restore control using RevenueCat restore.
26+ - ** Blocker** : notify/refresh the WebView when asynchronous customer-info refresh
27+ changes ` benchmark_lab ` ; one synchronous read during page startup is not
28+ persistence evidence.
29+ - ** Blocker** : carry a server-verifiable entitlement claim to the runtime rather
30+ than trusting a local client Boolean.
31+ - ** Blocker** : enforce ` benchmark_lab ` at the actual premium runtime operations;
32+ a changed status label is not feature gating.
33+ - Regression-test the acquisition, async-refresh, transport, and deny/allow
34+ runtime boundaries before calling the billing gate complete.
35+
36+ ## 3. Production AHBG runtime — REPOSITORY/DEPLOYMENT BLOCKER
37+
38+ The Android build carries an intended production ` RUNTIME_URL ` ; that build-time
39+ constant is not proof that the service exists or is healthy.
40+
41+ - ** Blocker** : deploy the canonical AHBG runtime at the exact configured HTTPS
42+ URL with valid TLS.
43+ - ** Blocker** : verify from a release-equivalent client that ` board.html ` , session
44+ creation, plan/state calls, entitlement verification, and a premium deny/allow
45+ operation work end to end.
46+ - Preserve the Android layer as transport/presentation only; do not repair a
47+ missing service by embedding a second runtime into the app.
48+
49+ ## 4. Google Play publication — EXTERNAL (primary path)
50+
51+ - Code/build compliance is present: ` compileSdk ` /` targetSdk ` 36, AGP 8.9.1,
52+ Gradle 8.11.1, Play-native ` bundleRelease ` in CI, RevenueCat 10.19.1 core,
53+ and signing config outside Git.
3454- ** Blocker** : Play developer account, app registration, first internal/closed
3555 test release upload, and production promotion.
3656- ** Blocker** : complete Play Console App content requirements: Data safety,
3757 public privacy-policy URL, ads declaration, app-access declaration, target
38- audience/content declarations, and content-rating questionnaire.
58+ audience/content declarations, content-rating questionnaire, Financial
59+ features declaration, and Health apps declaration. Where AHBG has no
60+ financial/health features, submit the corresponding "none" declaration.
3961- ** Blocker** : create and activate the ` ahbg_benchmark_lab ` non-consumable
4062 one-time-product purchase option, including price and regional availability.
4163- ** Blocker** : configure the billing-test Google account under Play Console
@@ -45,20 +67,19 @@ surface does not yet expose a complete acquisition flow.
4567 Google currently requires 12 continuously opted-in testers for at least 14
4668 days before production access — start the closed test immediately.
4769
48- ## 4 . RevenueCat production provisioning — EXTERNAL
70+ ## 5 . RevenueCat production provisioning — EXTERNAL
4971
50- - Client/runtime entitlement-check boundary complete.
5172- ** Blocker** : live RevenueCat project, Google Play app, Google Cloud service
5273 account (Play Developer + Reporting APIs), Play permission grants,
5374 service-account JSON upload, product/entitlement/offering mapping, and the
5475 Google Play app's RevenueCat public SDK key (` goog_... ` ).
55- - ` rc_ ...` project identifiers are not valid substitutes for the Android Google
56- Play public SDK key.
76+ - RevenueCat v2 project IDs use the ` proj ...` form; project IDs are not valid
77+ substitutes for the Android Google Play public SDK key.
5778- ** hmmm** : RevenueCat/Google Play service-account permissions can take time to
5879 propagate after provisioning.
5980 See ` REVENUECAT_PROVISIONING.md ` .
6081
61- ## 5 . Publish + submission assets — EXTERNAL
82+ ## 6 . Publish + submission assets — EXTERNAL
6283
6384- Store listing, privacy policy, demo storyboard, Play runbook, and Devpost
6485 material are in ` ahbg/submission/ ` .
@@ -78,13 +99,22 @@ and follow the archived Galaxy notes.
7899 change; signing needs the production keystore outside Git.
79100- Connect conforming harness / A0 same contract / build / persist / reload:
80101 verified by ` ahbg/runtime ` tests and the HTTP bridge.
81- - Sandbox purchase → ` benchmark_lab ` unlock → restore → restart persistence:
82- ** BLOCKED** until purchase/restore controls are implemented, then requires
83- the Play test track, License testing account, active purchase option, and
84- RevenueCat Play credentials.
102+ - Sandbox purchase → async entitlement refresh → verified runtime unlock →
103+ restore → restart persistence → premium deny/allow: ** BLOCKED** until the
104+ repository work in sections 2–3 is implemented, then requires the Play test
105+ track, License testing account, active purchase option, and RevenueCat Play
106+ credentials.
107+
108+ ## Smallest repository next action
109+
110+ Add one explicit entitlement-state notification/refresh path from
111+ ` RevenueCatPremiumStore ` to the WebView and a regression test proving a cold
112+ start can transition from the initial locked state to the eventual RevenueCat
113+ state without restart. This closes one concrete race without pretending that
114+ purchase, restore, server verification, feature gating, or deployment are done.
85115
86116## hmmm
87117
88- A buildable AAB is not yet a sellable product. The smallest repository-owned
89- next step is purchase + restore wiring; the rest of the gate then crosses into
90- live Play/RevenueCat accounts .
118+ A buildable AAB is not yet a sellable product. After the async entitlement
119+ refresh is repaired, acquisition, verified runtime gating, and production
120+ runtime acceptance remain living continuation before the external store gate .
0 commit comments