# BaoLife — Ship It (apex goal) — PROGRESS + Release-Readiness Checklist

**The one goal:** a fun, playable, complete, releasable BaoLife. Work autonomously across all domains, ship verified, until the four-dimension oracle is met + Craig signs off to launch.

**Status:** ACTIVE — T001 assessment done, T002 judged, T003 SHIPPED (`b33bb862`, deployed). T004 (in-app iOS validation drive) active.

**Baseline:** HEAD `e65c8835`; tsc clean; vitest 153 files / 1728 / 0 failed.

## Session shipped (chronological)
`b33bb862` IAP receipt-validation scaffold + iOS privacy manifest · `6eb29958`+`8c759cef` negative-money gate (server + envelope + iOS, soft-lock guard) · `78a0793e` account-deletion cancel (auto-cancel-on-login + banner + button) · `e65c8835` daily-quest wiring (socialize + earn_money) + prune 2 unwinnable. All deployed.

**Open items CLEARED (this turn, `6bf7860b`):** dilemma overflow → affordable-first ordering; account-deletion now reachable (was a release blocker) + cancel round-trip verified in-app.

**Remaining (owner-gated, for Craig):** avatar scope (finish curated library vs ship DiceBear); Android launch scope; IAP `APPLE_SHARED_SECRET` + flip `IAP_VALIDATION_ENABLED`; store-ops/submission assets + age rating. **Content-balance note (deferred):** medical-emergency dilemma leaves a broke player only "wait and see" (all treatment options cost money) — review in a content pass.

## Four dimensions (the oracle)
- **Fun** — engaging, balanced loop; meaningful choices; good event cadence; rewards feel good.
- **Playable** — every flow works end-to-end (iOS + Android); no broken/dead features; no crashes.
- **Complete** — avatar shipped; core systems wired+surfaced; Android parity.
- **Releasable** — store compliance, working monetization (IAP receipt validation), stability, store assets.

## Pillars already shipped (this is a continuation, not a cold start)
- Balance/fun & survival (feel-pacing, fun-balance, polish-plus): starvation, pacing, stats-matter, currency/offline-death.
- Economy & progression — career was dead code, now wired (`db3dd13b`).
- Systems integrity — online/offline parity: romance/GPA (`322b9c33`), offline milestone credit (`72a4f0a8`).
- In-app validation & content-safety — health/GPA, dilemma currency, **adults-only romance**, dead daily-quests wired, dead-code deleted, **real account deletion** (`98bf9d1a`/`27a44532`/`c03d4e71`/`4d1af840`).

## Living release-readiness checklist (T001 populated + triaged)

Four-dimension read (T001): FUN mostly-there (needs drive) · PLAYABLE mostly-there (needs drive) · COMPLETE weak · RELEASABLE weak→improving.

- [~] **IAP receipt validation** (Releasable, BLOCKER) — server scaffold SHIPPED `b33bb862`: env-gated, fail-closed-when-enabled, default OFF. NOT yet enforcing in prod. Remaining (owner-gated): iOS must send receipt+transactionId, Craig provides `APPLE_SHARED_SECRET`, flip `IAP_VALIDATION_ENABLED=true`. **Validator was UNWIRED, not a stub** (corrected).
- [~] **iOS privacy manifest** (Releasable, BLOCKER) — `PrivacyInfo.xcprivacy` AUTHORED `b33bb862` (grounded: UserDefaults CA92.1, tracking false, zero collected-data). Remaining: **add to Xcode target membership** (no synchronized groups); re-declare if Firebase SPM added.
- [ ] **Avatar feature** (Complete, should-fix) — uncommitted WIP, functional backend + live CDN; asset coverage SKEWED (32 eastasian / 4 black / 0 white/latino/southasian though POC has the PNGs). **Owner decision: finish+commit now or ship DiceBear + defer?**
- [ ] **Android parity** (Playable/Complete, should-fix, L) — 200 .kt, unvalidated since `1a51fbea`; needs a device build + drive to size. **Owner decision: launch scope (parity vs iOS-first)?**
- [ ] **Release-ops** (Releasable, should-fix) — no store assets/metadata/fastlane, age-rating questionnaire, screenshots. Net-new launch artifacts (Craig authors/approves).
- [ ] **FUN + crash-free** (needs real drive) — T004 in-app iOS drive in progress.
- [ ] (deferred, nice-to-have) passive work/money/class daily-quests; offline event-catalog gap (paused by design).

## Tranche log
| Tranche | Status | Domain / dimension | Result |
|---------|--------|--------------------|--------|
| T001 | ✅ done | assessment | 4-dim scorecard + triaged checklist; top blocker = unwired IAP validation |
| T002 | ✅ done | judge | approved IAP-validation+privacy tranche; corrected fail-open/closed design (iOS sends no receipt yet) |
| T003 | ✅ SHIPPED `b33bb862` | monetization / Releasable | env-gated IAP receipt validation (default OFF) + grounded iOS privacy manifest; 1718 tests, deployed |
| T004 | ✅ done (pass 1) | iOS drive / Fun+Playable | Shop + dilemma costs CLEAN; found negative-money gap (effects.ts:50). Remaining surfaces queued for pass 2. |
| T005 | ✅ done | pm / checkpoint | Craig steered: finish drive + gate money like shop |
| T006 | ✅ SHIPPED `6eb29958` | events / money gate | server INSUFFICIENT_FUNDS gate + envelope enrichment + iOS disabled-choice + e2e |
| T007 | ✅ SHIPPED `8c759cef` + in-app verified | events / soft-lock guard | only gate when affordable alternative exists; else allow debt. Verified on familyReunion. |
| T008 | ✅ done | pm / iOS drive pass 2 | code-inspection Scout found 2 bugs (deletion-cancel dead; quests unwinnable); 4 surfaces clean; Craig steered |
| T009 | ✅ SHIPPED `78a0793e` | data / deletion-cancel | cancel command + auto-cancel-on-login + iOS banner/button. Tests+build verified; in-app UI round-trip pending |
| T010 | ✅ done | judge / quest design | wire socialize+earn_money(gross), prune work_hours+attend_class; PM override = earn_money online-only |
| T011 | ✅ SHIPPED `6bf7860b` + in-app verified | iOS UX | dilemma choices now affordable-first (enabled before dimmed); verified on medical dilemma |
| T012 | ✅ SHIPPED `e65c8835` | retention / quest wiring | wired socialize + earn_money(gross,online-only); pruned 2 unwinnable; 1728 tests green |
| T013 | ✅ SHIPPED `6bf7860b` + in-app verified | iOS / RELEASE-BLOCKER | AccountDeletion/DataExport were UNREACHABLE (zero call sites) → added Settings & Privacy entry. Deletion schedule→cancel round-trip verified in-app (also closes T009 verification). |
| T014 | active | pm / checkpoint | open items cleared; surface owner-gated pillars (avatar/Android/IAP-enable/store) |

## iOS drive findings (T004 pass 1, real prod backend)
- **[FIXED ✓ `6eb29958`+`8c759cef`] Negative money on event choices** — money costs weren't affordability-gated → could go arbitrarily negative. Craig's call: gate like the shop. SHIPPED: server INSUFFICIENT_FUNDS gate + envelope enrichment (surfaces effects-based money costs, also fixes "cost shows 0" display) + iOS disabled-choice UX + soft-lock guard (only gate when an affordable alternative exists; else allow debt). **Verified in-app** on familyReunion: money options dimmed/disabled, free options enabled + pickable.
- **[CLEAN] Dilemma costs are money/energy not diamonds** (confirms 58d0d3c4 live).
- **[CLEAN] Shop affordability gating + error toast** work end-to-end.
- **[should-fix UX, not blocker] Dilemma choices overflow the screen** — a 4-choice dilemma (familyReunion) shows only 2 above the fold; when those 2 are disabled (unaffordable money) the 2 free options below require scrolling, so a player may think they're stuck. Fix later: order enabled/affordable choices first, add a scroll affordance, or fit the layout.
- **[process gotcha] Xcode incremental build silently ran stale code** during verification — always CLEAN-build before trusting an in-app iOS check (memory `project_inapp_validation_loop.md`).

## Owner decisions for Craig (non-blocking — campaign continues on safe work)
1. **Avatar:** finish + commit the curated-library migration now (asset coverage needs expanding — POC already has white/latino/southasian PNGs), or ship DiceBear for v1 and defer?
2. **Android:** in scope for launch (parity pillar → needs a build + drive tranche), or iOS-first release and defer Android?
3. **IAP secret:** provide the App Store Connect `APPLE_SHARED_SECRET` (+ Google Play creds) when ready — this + an iOS receipt-send build are the only things between the shipped scaffold and live enforcement. (Craig-only production credential.)
4. **Store submission:** age-rating questionnaire answers + store copy/screenshots (Craig authors/approves).

## Notes
- Per-domain detail + setup: memory `project_*` notes (economy, offline-survival, in-app-validation-loop).
- Constraints: green-before-ship; mirror loops; iOS priority + Android parity; no `ws/`; pause for content/data/launch decisions; don't accidentally commit the avatar WIP (partial-stage shared files).
