# BaoLife Playtest Audit — 2026-06-02

**Method:** Played full lives through the real engine (the faithful `npm run metrics` PlayerSession harness + a new `server/scripts/playthrough.mts` social-arc narrator + targeted probes), then ran a multi-agent audit across 12 gameplay domains. Every finding was adversarially verified by independent agents (refute + classify lenses). Result: **43 findings, 40 confirmed / 5 partial / 2 refuted.** Each is cited to `file:line` and tagged live-vs-dead, online/offline.

> Scope note: 8 domains got the full find→verify→synthesize treatment; 4 (romance-depth, activities/stats, event-consequence, retention-completability) were cut short by an API rate limit but are ~85% covered by overlapping findings. Gaps are flagged in the Blind Spots section.

---

## Headline verdict

BaoLife's **engine is healthy and its content library is large — but a startling amount of that content is built and then never wired in.** The game is **playable and pleasant** (a life runs start-to-finish: you grow up, fall in love, marry, work, age, and die with a thoughtful life-summary), but it is **not yet "complete," and its monetization is not yet "releasable."** The dominant theme is **dead-but-built systems**: the entire generational meta-loop (children → inheritance → heir → "beat your best life"), the education progression, the friendship system, and all three diamond sinks are fully coded yet have zero live callers. The single most valuable fact: **one small fix (create a child at birth) transitively revives an enormous amount of already-built content.**

## Four-dimension scorecard

| Dimension | Score | Rationale |
|---|---|---|
| **Fun** | ⚠️ **Adequate, shallow** | Core loop + romance work and a life has texture, but agency is thin (~1.4 interactive decisions/yr; most choices are one-shot stat nudges), health/death carries no real risk, and the headline "generational legacy" hook never pays off. |
| **Playable** | ✅ **Strong** | A full life runs end-to-end with no crashes; survives to old age; onboarding (iOS-driven) works. Main blemish: live NPC encounters are disabled while connected. |
| **Complete** | 🔴 **At-risk / Blocked** | Major advertised systems are inert: children/inheritance/legacy, education progression, the friendship system, health conditions, retirement. These are *built*, not missing — but dead. |
| **Releasable** | 🔴 **Blocked** | You're shipping IAP that buys diamonds, and **all three diamond sinks (energy refill, time-skip, dating-premium) are no-ops** — players would pay for a currency that does nothing. That's an App-Store-risk-level functional defect. |

---

## Top ranked findings (deduped, corrections applied)

| # | Finding | Sev | Dim | Conf | Why it matters | Fix | Owner? |
|---|---|---|---|---|---|---|---|
| 1 | **Children are never created** — `addChild()` works but has zero live callers (`character_manager.ts:361`); birth only pushes an achievement | 🔴 blocker | complete | .97 | **Keystone.** Transitively kills #2, parenting content, and several achievements/goals below. Births grant a stat counter but no child enters your family. | Call `addChild(player)` at the *birth* terminus of `PregnancyArc` (`medicalArcs.ts` stage5), both loops | S | no |
| 2 | **Generational meta-loop dead** — inheritance always 0, heir always null, "Continue as heir" New-Life mode unreachable, family-prestige resets to 0 each life | 🔴 blocker | fun | .95 | BaoLife is *architected* as a generational life-sim; the entire cross-life progression silently no-ops. Every new life is a hard reset. Fixed transitively by #1. | #1 + persist a lineage hall-of-fame | M | yes |
| 3 | **Education frozen at creation** — `c.education` set once, never advances, never graduates (online+offline; verified by live probe age 6→28) | 🔴 blocker | complete/fun | .95 | Locks **~2/3 of careers** behind an unobtainable credential (probe: 10/30 jobs at start vs 16/30 with HS). GPA changes weekly but gates nothing. | Drive grade/college progression + graduation from the live tick (port to v2 + offline GameEngine) | M | yes |
| 4 | **Diamond sinks all broken** — energy refill, time-skip, and dating-premium choices each deduct/return but never write real state (`timeSkips.ts:200-285`, `energyRefills.ts:64-132`, `romance.ts:498-522`) | 🔴 blocker | releasable | .9 | Diamonds are a steady faucet with **zero working sink** — an accumulating dead currency. You're selling IAP for it. | Build `playerState` server-side from the session; write results back to `session.player.c` | S–M | no |
| 5 | **Friendship system is dead code** — 1,140 lines of friendship events never run on any live loop; random social events only touch the romantic partner; v2 friend events never change NPC affinity | 🔴 blocker | complete | .92 | Social life beyond romance is hollow. Friends are set near birth and never meaningfully evolve. | Port `friendships.ts` into the v2 catalog with per-NPC `relationshipChanges` | M | yes |
| 6 | **Health/death has no stakes** — only death cause is old-age (`updateDeathChance` is age-only); 13 health conditions are decorative; negative habits have no downside and quitting only costs you | ⚠️ should-fix | fun | .9 | No illness/accident/overdose mortality; the fully-built habit-quit loop is mechanically empty. Health is inert flavor. | Add mortality hooks to a few high-stakes events; wire condition drain; give habits a recurring drain + quit payoff | M | yes |
| 7 | **Live NPC simulation disabled online** — `updateNPCLocations` / `processHourlyNPCInteractions` run only in the offline LoopManager, never in PlayerSession | ⚠️ should-fix | fun | .85 | The "world feels alive / run into someone" system is off exactly when the player is watching. | Call them (throttled) from `PlayerSession.processHourTick` | S | yes |
| 8 | **Agency is thin** — ~84 interactive decisions across a ~63-yr life vs ~2400 ambient events; most dilemmas are single-stat deltas with no lasting flags | ⚠️ should-fix | fun | .82 | Lives feel samey; choices rarely branch or matter later. | Upgrade a tranche of one-shot dilemmas into 2-stage arcs with persistent flags (#1 gives the pregnancy/parenting arc a payoff for free) | L | yes |
| 9 | **Wealth vs sinks mismatch** — even a CTO banks only ~$476k/life; top shop items are $300k–$5M; `finance.ts:109-110` auto-vaporizes ~90% of weekly surplus | ⚠️ should-fix | fun | .9 | Aspirational purchases are unreachable; late-game money is meaningless. | Stop discarding surplus (let savings accumulate) and/or rescale the catalog; expose the spending-habits lever | M | yes |
| 10 | **Death has no carry-forward stakes** — life score is a one-time epitaph; no personal-best, no comparison, no lineage record | ⚠️ should-fix | fun | .9 | Removes the "beat your last life" motivation a life-sim lives on. | Persist `bestLifeScore` + last N scores + family tree on the Player blob across fresh starts | S–M | yes |
| 11 | **Several achievements/life-goals unreachable** — `raise_two_children`, `have_child`, retirement, graduation gated on never-set state | ⚠️ should-fix | complete | .9 | Chase-content dead-ends. Mostly fixed transitively by #1 and #3. | Mostly free once #1/#3 land | S | no |
| 12 | **Education has no failure/dropout consequence** + 3 overlapping education systems (2 dead) | ⚠️ should-fix | fun | .85 | No academic risk; dead-code maintenance trap. | Add low-GPA risk events after progression is restored; retire the dead systems | M | yes |

**Lower tier (nice-to-have):** spending-habits lever locked (no setter); no mechanical retirement (a v2 retirement *narrative* arc does fire, but occupation never changes); passive "Balanced" worker can silently get fired late-career; AI chat stalls ~7s through 3 retries when no API key is set (add a key pre-flight fast-path); offline tutorial tips re-fire (broken dedup — `askedQuestions.add` never called) and no server tutorial tips fire online; career climb to CTO is arguably *too fast* (~age 23) then flatlines 50 yrs; friend-making is one-shot per life.

---

## Quick wins (safe, high-value, no owner decision)

- **`addChild()` at birth (#1)** — the keystone. One bounded call lights up inheritance, heir, parenting content, and multiple achievements/goals. iOS `RelationshipSection.swift` already renders `child`, so no client change needed for it to appear.
- **Fix the 3 diamond sinks (#4)** — build `playerState` server-side and write energy/time/affinity back to `session.player`. Turns dead IAP currency into a working economy.
- **Offline tutorial-tip dedup** — call `player.askedQuestions.add(eventId)` when a tip fires (it currently checks a key it never sets).
- **Spending-habits setter** — `computeWeeklyFinances` already reads `spendingHabits`; just add a command + iOS toggle to write it.
- **AI no-key fast-path** — skip the 3 retries when no provider key is configured; return the canned reply immediately.

## Owner decisions for Craig

1. **Children scope** beyond the wiring fix — child aging cadence on the online loop, newborn stats/personality, naming UI, Android parity.
2. **Diamond economy rebalance** — once sinks work, set a fair earn-vs-spend rate.
3. **Death lethality** — should players be able to die young (illness/accident/overdose), or is age-only intentional?
4. **Health conditions** — wire them to do something, or delete the chronic-illness framing to avoid a false promise.
5. **Education progression approach** — port school/college transitions into v2, or another path.
6. **Friendship system** — port the 1,140 lines into v2, or cut it.
7. **Retirement** — add a real mechanic, or accept narrative-only.
8. **Shop catalog vs savings** — rescale prices down, or stop vaporizing surplus so wealth accrues.

## Checked and NOT a bug (don't relitigate)

- **Offline survival paused** — hunger/thirst/starvation intentionally don't tick offline. By design (Craig's call).
- **Marriage / romance basics** — Dating→Engaged→Married works with rich micro-events; verified in play.
- **Online survival** — healthy; dies of old age ~63–74.
- **Career → CTO is reachable** — *correcting my earlier "CEO unreachable" claim*: with intelligence ≥75 + accruing prestige, a Work-Hard worker climbs all 5 tiers to CTO/$10k by ~age 23 on both loops. My first probe used default intelligence(50)/prestige(0), which caps at Senior; the adversarial pass caught the error.
- **`child-born` early-fire** — refuted; that mechanism lives in a dead code path.

---

## Blind spots (completeness honesty)

- **Romance depth** not deeply audited: multi-partner integrity, neglect→divorce on the live loop, and divorce *consequences* are unverified.
- **Activities→stats→outcomes loop** not directly audited end-to-end (intelligence→promotion and prestige→elite-tier are confirmed levers; happiness/social as gates are not).
- **iOS rendering** of the revived systems (a real child, working refills) confirmed only by code inspection, not an in-app drive.

## Recommended next tranche — "The Family & Legacy keystone"

**Make births create a real child `Person`** (call `addChild()` at the pregnancy arc's birth terminus, both loops), then verify it transitively revives: inheritance + heir, the "Continue as heir" New-Life meta-loop, all `child`-gated parenting content, and the `raise_two_children`/`have_child` goals/achievements. Mirror child aging on the online loop and confirm iOS renders the child + heir.

**Why this first:** it's the highest leverage on the board — *one small, low-risk, reversible fix activates a large body of already-built content* across both **Complete** and **Fun**, and it restores the game's central identity as a *generational* life-sim. Pair it in the same tranche with the **diamond-sink fix (#4)** to clear the single **Releasable** blocker. Education progression (#3) is the natural second tranche.
