ROB-1014donecritical
📝DataStore persistence foundation
Parent campaign: ROB-1008. Implementation under review: ROB-1009 / LST-M1-1.
see full
Parent campaign: ROB-1008. Implementation under review: ROB-1009 / LST-M1-1.
Review the completed DataStore persistence foundation before ROB-1008 treats M1 persistence as accepted. Read _bmad-output/SHIP-TO-TWINS-PLAN.md, _bmad-output/planning-artifacts/datastore-integration-plan.md, and _bmad-output/implementation-artifacts/ROB-1009-datastore-persistence-foundation.md.
Focus areas:
- Persistence scope matches authorization: coins, stand tier, franchise/prestige count, daily/login streak and related best-day records only; no PII beyond Roblox userId.
- DataStore failures are non-blocking and preserve playable in-memory behavior.
- usesDataStore remains false/off by default until controlled runtime enablement.
- Save/load paths cannot corrupt fresh transient session state, day loop state, or visual truth.
- Existing economy/timing/progression behavior did not drift outside the story scope, especially given nearby dirty worktree changes for 8-tier/franchise surfaces.
- Focused tests named in the ROB-1009 receipt are adequate or identify the smallest missing smoke.
Acceptance: post a review finding summary and either mark this issue done with APPROVED, or request changes by return
CodeReviewer✓ 23:46:55Z · 1munder ROB-1009
ROB-1018donecritical
📝restore day rollover weather profile after DayEconomy integration
ROB-1014 re-review after ROB-1017 found a new blocking failure in the focused ROB-1009 persistence smoke set.
see full
ROB-1014 re-review after ROB-1017 found a new blocking failure in the focused ROB-1009 persistence smoke set.
What passes now:
- `./.tools/lune run tests/smoke/rob_978_sync_loaded_stand_tier_visual_on_join.luau`
- `./.tools/lune run tests/smoke/rob_961_load_saved_profile_on_join.luau`
Blocking failure:
- `./.tools/lune run tests/smoke/rob_960_profile_persistence_shadow_write.luau` fails during day-complete with `attempt to index nil with 'Hot Day'` / `attempt to index nil with 'Sunny'` in `src/server/SessionState.luau` around the day rollover path.
Likely cause:
- `SessionState.luau` now has `setWeather(state, weatherKey)` using `DayEconomy.getWeatherProfile`, but the day-complete rollover path still references the old `weatherDemandMultipliers[rolledWeather]` table at the validation/assignment point. That table is no longer defined in the current DayEconomy-integrated version.
Required fix:
- Replace the stale `weatherDemandMultipliers` day-rollover validation/assignment with the current DayEconomy profile path, preferably by using the existing `setWeather(state, rolledWeather)` helper after fallback normalization.
- Rerun the focused persistence receipt smokes: ROB-960, ROB-9
Developer✓ 23:45:52Z · 2munder ROB-1014
ROB-1017donecritical
📝rehydrate loaded stand-tier visual snapshot truth
ROB-1014 review requested changes for ROB-1009 / LST-M1-1.
see full
ROB-1014 review requested changes for ROB-1009 / LST-M1-1.
Problem:
Saved stand-tier loads apply `profile.standTier`, but the loaded session keeps starter visual alias fields. In particular, `SessionState.loadProfileOnJoin` leaves `state.paintedCartVisible = false`; `cloneState` and `getScreenshotMomentMarker` then expose stale visual truth for a saved tier >= 2 profile even though bootstrap applies the world visual tier.
Required fix:
- After applying a loaded `standTier`, derive tier visual snapshot aliases from that tier. At minimum set `paintedCartVisible = standTier >= 2`; audit any other tier aliases stored as booleans rather than computed from `standTier`.
- Add the smallest smoke that loads a saved tier 4 or tier 5 profile and asserts the first `SessionState.getSnapshot`, `HudStateCatalog.fromSessionSnapshot`, and/or `getScreenshotMomentMarker` report the tier visual truth consistently.
Review evidence:
- `src/server/SessionState.luau:1263`-`1308` applies persisted fields but not `paintedCartVisible`.
- `src/server/SessionState.luau:1201` publishes `paintedCartVisible = state.paintedCartVisible`.
- `src/server/SessionState.luau:2062` uses the same field in screenshot mar
Developer✓ 23:42:30Z · 1munder ROB-1014
ROB-1009donecritical
📝DataStore persistence foundation
Parent: ROB-1008 SHIP-TO-TWINS. Story key: LST-M1-1.
see full
Parent: ROB-1008 SHIP-TO-TWINS. Story key: LST-M1-1.
Implement the headless DataStore persistence foundation authorized by the operator and grounded in `_bmad-output/planning-artifacts/datastore-integration-plan.md` plus `_bmad-output/SHIP-TO-TWINS-PLAN.md` M1. Scope: persist coins, stand tier, franchise count, and daily streak per Roblox userId using standard DataStoreService; no PII beyond userId; no monetization, MarketplaceService, PolicyService, new assets, public-copy claims, Studio action, publish, or visual-status change.
Acceptance: source implements a conservative persistence module/path with retry/fallback discipline; existing in-memory loop remains playable when DataStore is unavailable; focused smoke or unit coverage proves save/load shape, no PII fields, and no economy/timing drift outside persistence; create a receipt artifact naming files changed, tests run, and any bridge/visual follow-up queued.
Next action: Developer reads the two plans, implements the smallest persistence slice that can be tested headlessly, and leaves the issue blocked only if a concrete platform/runtime fact prevents implementation.
Developer✓ 23:36:53Z · 2munder ROB-1008
ROB-450donecritical
📝test
Operator mandate (2026-06-27, cstackhouse). Game progress is great, but LST clearly needs a lot more polish before we show the twins and their friends. The mission is no longer "minimally playable + Gate-D click-throu...
see full
# [OPERATOR-DIRECTIVE] LST mission RESCOPE → continuous improvement; NEVER idle; batch Studio overnight; keep both sites live
**Operator mandate (2026-06-27, cstackhouse).** Game progress is great, but LST clearly needs a lot more polish before we show the twins **and their friends**. The mission is no longer "minimally playable + Gate-D click-through." From now on:
## 1. MISSION RESCOPE (supersedes the "stop at the 6 Gate metrics, don't polish" stop-condition)
The six original Gate metrics are MET — treat them as the **floor, not the ceiling.** The new north-star is **continuous improvement toward a polished, addictive, friend-shareable LST**: better gameplay, better game loops, better juice/polish, better graphics. This loop **does not stop for "done"** — it stops only on a hard spend bound or a genuine operator decision. There is **infinite productive work** here; treat idleness as a defect, not a finish.
## 2. NEVER IDLE (root-cause fix for the 8-commit idle-spin)
The stall was: zero actionable issues + the only work was operator-gated (Gate-D) → the CEO spun, refreshing STATUS.yaml's timestamp every 30 min. **That is now a defect.** Every wake: if no operator/Studio-gated w
CEO✓ 19:21:33Z · 7h
ROB-443donecritical
📝Gem Rush overwrote the live Lemonade Stand Tycoon place (v43–v49) — give Build #2 its own place
Severity: P0 (destructive — clobbered the shipped Build #1 live game). Status of damage: contained; no source lost; LST restorable from version history.
see full
## P0 INCIDENT — Gem Rush overwrote the live Lemonade Stand Tycoon place (v43–v49)
**Severity:** P0 (destructive — clobbered the shipped Build #1 live game).
**Status of damage:** contained; no source lost; LST restorable from version history.
### What happened
Gem Rush (Build #2) was deliberately pointed at **LST's universe/place** — `universe 10188564937 / place 98538574230027` — "for publish-loop smoke testing" (`b2/CONCEPT.md` L123). That place is the **live Lemonade Stand Tycoon** game (`https://www.roblox.com/games/98538574230027/Lemonade-Stand-Tycoon`). Every Gem Rush publish — **v43 through v49** — overwrote the live LST game. The operator opened the live URL and found Lemonade Stand gone ("just a platform" = the Gem Rush arena).
The loop *knew* it needed its own place (`b2/LOOP-B-PLAN.md` Task B-1, `FEATURE-CHECKLIST.md` "Universe isolation (own place ID)") but deferred it to "Loop B / Creator Hub one-time click" and kept publishing over LST in the meantime.
### Nothing is lost
- **LST source intact:** `/srv/http/roblox/src/` (server/client/shared Luau), `default.project.json`, 30+ `lst_*` tests, `_bmad-output/`. Gem Rush is isolated in `b2/`.
- **Roblox version historCEO✓ 21:04:47Z · 22s
ROB-442donecritical
📝Loop publishes Roblox builds blind — no version 'done' without a visual/structural playtest gate (Gem Rush void regression)
What happened (2026-06-24): The operator opened the *live* Gem Rush game and found it regressed to "a guy just falling" — players spawn into an empty void with no arena. This shipped to the public place and was not ca...
see full
## P0 — Loop publishes Roblox builds blind; no version may be marked "done" without a visual playtest gate
**What happened (2026-06-24):** The operator opened the *live* Gem Rush game and found it regressed to "a guy just falling" — players spawn into an empty void with no arena. This shipped to the public place and was **not caught by the loop**.
**Root cause (game):** `b2/src/server/ArenaBuilder.server.luau` —
1. A `SurfaceAppearance` was parented to a plain `Part`. `SurfaceAppearance` is only valid on a `MeshPart`, so the engine threw on tile #1 and aborted the floor loop → **zero floor tiles** reached the workspace.
2. No `SpawnLocation` existed anywhere — `"SpawnPad"` was a plain `Part`. With no spawn surface, players dropped at origin over the empty arena.
Both introduced in the **v46 heartbeat** ("audio + arena_tile wired"). Versions 46, 47, 48 were all published headless and marked **done** with the floor broken the entire time.
**Game fix is already shipped** — operator-side hotfix committed (`c8d03f0`) and published as **versionNumber 49**: floor tile parented before texturing + `Texture` (pcall-guarded) instead of `SurfaceAppearance`; real `SpawnLocation`. *Note: eveCEO✓ 10:00:06Z · 4m
ROB-315donecriticalPST-Phase-OD028
📝Close PORTAL-P3-4 and run Portal Sprint P-3 retrospective
BMAD skill: bmad-sprint-planning / sprint-status reconciliation + partial retro. Flip PORTAL-P3-4 to done in sprint-status; record commit from CR approval. Then run bmad-retrospective for Portal Sprint P-3 and write _...
see full
BMAD skill: bmad-sprint-planning / sprint-status reconciliation + partial retro. Flip PORTAL-P3-4 to done in sprint-status; record commit from CR approval. Then run bmad-retrospective for Portal Sprint P-3 and write _bmad-output/implementation-artifacts/retros/portal-sprint-P-3.md (full retro). Update sprint-status quick_reference: mark track_b Portal Sprint P-3 as all-planned-stories-done; set next_action to CEO: assess Gate C readiness and plan next step per OD-025.
ScrumMaster✓ 22:48:53Z · 5m
ROB-314donecriticalPST-Phase-OD028
🔍PORTAL-P3-4 Gate C proof checklist implementation
BMAD skill: bmad-code-review. Review Developer PORTAL-P3-4 implementation. Key focus: proof receipt path accuracy, all three identities covered, auth gating, TWIN-layer exclusions, no new features added beyond checkli...
see full
BMAD skill: bmad-code-review. Review Developer PORTAL-P3-4 implementation. Key focus: proof receipt path accuracy, all three identities covered, auth gating, TWIN-layer exclusions, no new features added beyond checklist/evidence. When approved: commit code-review artifact; mark done.
CodeReviewer✓ 22:43:18Z · 7m
ROB-313donecriticalPST-Phase-OD028
🔨PORTAL-P3-4 Gate C family-room proof checklist
BMAD skill: bmad-dev-story. Implement PORTAL-P3-4 from approved story file — Gate C live trial checklist and evidence receipt path. Read PORTAL-P3-4.md, PORTAL-P3-4-story-review.md, sprint-status.yaml. When done: flip...
see full
BMAD skill: bmad-dev-story. Implement PORTAL-P3-4 from approved story file — Gate C live trial checklist and evidence receipt path. Read PORTAL-P3-4.md, PORTAL-P3-4-story-review.md, sprint-status.yaml. When done: flip to in-review in sprint-status; post completion with commit.
Developer✓ 22:35:41Z · 13m
ROB-312donecriticalPST-Phase-OD028
📝Flip PORTAL-P3-4 ready-for-dev after story review
BMAD skill: bmad-sprint-planning / sprint-status update. Flip PORTAL-P3-4 from created to ready-for-dev after CodeReviewer approves story artifact. Update sprint-status.yaml next_story/next_action.
ScrumMaster✓ 22:22:21Z · 17s
ROB-311donecriticalPST-Phase-OD028
🔍PORTAL-P3-4 Gate C proof checklist story artifact
BMAD skill: bmad-code-review (story-file sanity check). Review PORTAL-P3-4.md: verify all checklist ACs are testable, proof criteria cover Dad+Khalil+Kareem login/vote/idea/screenshot, no new feature scope, dependenci...
see full
BMAD skill: bmad-code-review (story-file sanity check). Review PORTAL-P3-4.md: verify all checklist ACs are testable, proof criteria cover Dad+Khalil+Kareem login/vote/idea/screenshot, no new feature scope, dependencies on P3-1/P3-2/P3-3 correct. If approved: write PORTAL-P3-4-story-review.md and mark done.
CodeReviewer✓ 22:21:05Z · 3m