Standout Builder Studio · planning Index / Flow / 04 · Launch Lab review Updated 12 Jun 2026

Proposal 04 · Launch Lab

The Launch Lab is pipeline step 6 (Generate playable sandbox). The session composer exists today but produces a completely mocked experience — no real URL, no real launch, nothing playable. This proposal specifies the real implementation: a signed launch URL into the sandbox dispatch namespace, a live session event feed, a Deploy agent transcript, and session history as iterable evidence. It is the moment the game becomes something you can feel.

1 Choose build path 2 Define the game package 3 Configure mechanics 4 Attach assets & theme 5 Run validation 6 Generate playable sandbox 7 Iterate 8 Promote toward handoff

User problem

The current SandboxLaunchLab.tsx component contains a prominent warning that explicitly declares itself a prototype:

Mocked prototype only
Launch URL, signature, iframe, wallet responses, and transcript below are local mock data. No real HMAC signing or launch API integration is running.

This is the component's own banner — it is not a planning document's assessment. The gap between "configured" and "actually playable" is where builds stall. A builder who completes all eight fields in the composer, clicks nothing, watches no real event — they have no felt sense of whether their configuration is right. The following code paths confirm the mock surface:

The result: a builder finishes validation, reaches Launch Lab, sees a polished-looking form, fills it out, and receives a fake URL they cannot open and a fake transcript that does not reflect any real outcome. The gap between "configured" and "felt it play" is where builds stall, revisions lose momentum, and the quality of a session-based game is never verified before it reaches operator review.

Why this is the right exemplar for the second full-depth proposal
The Launch Lab sits at the hinge of the build pipeline — after all the structuring work (path, spec, mechanics, assets, validation) and before iteration begins. Making it real means a builder's first "I can feel this game" moment is grounded in actual session evidence. That evidence also feeds step 7 (Iterate) as the version-history baseline. These two proposals (01 and 04) bookend the core pipeline and demonstrate two different proposal shapes: a new surface (path picker) and an existing surface made real (Launch Lab).

Proposed UI

Three mocks. The first (session composer) is GROUNDED — it mirrors the existing two-card layout from SandboxLaunchLab.tsx truthfully, with one clearly-badged CONCEPT delta added inside it. The second (live session panel) and third (deploy-agent transcript) are CONCEPT — the real implementations these mocks specify.

(a) Session composer

Session composer — two-card layout (Launch inputs + Wallet faults) GROUNDED · matches main
Mocked prototype only
Launch URL, signature, iframe, wallet responses, and transcript below are local mock data. No real HMAC signing or launch API integration is running. (This banner disappears once the real signer is wired.)
Launch inputs
Sandbox session composer
BLD-CC-074
v0.7.4 · sandbox
Operator Demo EU
Dre Park · high balance
EUR · Euro
Mobile web
UK
Normal approve/debit/credit
Label spelling normalised to AU English in these docs; the live component currently reads "Wallet behavior".
15 minutes
Deploy target
namespace: sandbox
version: v0.7.4
CONCEPT · new field
Wallet faults
Failure injection toggles
mock responses
Insufficient funds
WALLET_INSUFFICIENT_FUNDS
Timeout
WALLET_TIMEOUT
Duplicate transaction
WALLET_DUPLICATE_TXN
Rollback failure
WALLET_ROLLBACK_FAILED
Stale session
SESSION_STALE
Enabled faults are passed as faults=WALLET_TIMEOUT in the launch parameters. The stub-wallet Worker fires the fault at the configured trigger point. See architecture.html#edge.
Validation passed — ready to launch
Full option lists (from builderMockData.ts): Operators: Operator Demo EU · Apollo Testbook · Maple Sandbox · Certification Lab Runner · Players: Maya Stone · casual · Dre Park · high balance · Iris Chen · bonus wallet · Noah Vale · low balance · Currencies: EUR · Euro, GBP · Pound sterling, CAD · Canadian dollar, SEK · Swedish krona, RON · Romanian leu · Devices: Mobile web · Desktop web · Tablet web · Jurisdictions: UK · Ontario · Malta · Sweden · Romania · Wallet behaviours: Normal approve/debit/credit · Bonus wallet first · Cash wallet only · Replay-only dry run · Session expiries: 2 minutes · 15 minutes · 60 minutes · 24 hours.

(b) Live session panel

Live session — real signed URL + event feed CONCEPT · proposed
Signed launch URL
https://play.sandbox.standout.games/launch?session=sess_a7f3b09c2e4d&sig=9e2f4a8c1b7d3e60f0a5c2b4d8e9f1a3 NOTE (concept): this URL is a shape-only example — the HMAC and session ID are illustrative only, not real values. Real URLs are server-issued by the session signer. Session expiry is a server-side claim embedded in the signed token and verified by the dispatch Worker; it is not exposed as a URL parameter.
Player: Dre Park · high balance (player-2044) · Currency: EUR · Namespace: sandbox · Expires in 14 m 22 s
Session event feed
+0.0s session created — player-2044 · EUR · sandbox namespace · expiry 15 m
+1.2s ws connected — 51 ms round-trip · Durable Object assigned
+4.8s bet placed 10.00 EUR — round #18211 · wallet debit OK
+9.1s cashout 2.41× — +24.10 EUR · wallet credit OK · round closed
Game frame
Crash Cartel · sandbox frame
Operator Demo EU · EUR · Mobile web · v0.7.4
Session live
Replay session Debug log Download replay bundle Session expires in 14 m 22 s · relaunch after expiry

(c) Deploy-agent transcript

Deploy agent transcript — bundle → namespace → smoke test → session ready CONCEPT · proposed
Deploy agent
Crash Cartel v0.7.4sandbox
Smoke PASS
+0.0s Deploy agent Bundle built — 412 KB gz · HTML5 package verified · R2 upload queued
+2.1s Deploy agent R2 upload complete — sandbox/crash-cartel/v0.7.4/bundle.gz · deployed to namespace sandbox
+2.9s Deploy agent healthz probe → 200 OK in 38 ms · Worker routable
+4.1s Deploy agent WebSocket smoke test → connected · 51 ms round-trip · Durable Object OK
+4.4s Deploy agent Stub wallet probe → WALLET_TIMEOUT fault injected (as configured) → fault response confirmed
+4.6s System Smoke PASS · session signer ready · launch URL issued

State variants

Five states cover the full interaction arc of the Launch Lab. With JavaScript enabled, use the tabs below to switch. With JavaScript disabled, all panels render stacked with their state labels — every panel starts with a visible label identifying which state it depicts.

State: composing — builder is choosing session parameters
composing — choices mid-flight CONCEPT · proposed
Two-card layout: Launch inputs + Wallet faults
Launch inputs — 8 selects
Game version · Operator · Player · Currency
Device · Jurisdiction · Wallet behaviour · Session expiry
+ Deploy target (concept delta)
Wallet faults — 5 toggles
WALLET_INSUFFICIENT_FUNDS
WALLET_TIMEOUT
WALLET_DUPLICATE_TXN
WALLET_ROLLBACK_FAILED
SESSION_STALE
Builder is selecting operator + enabling WALLET_TIMEOUT fault Primary CTA "Launch sandbox →" — enabled (validation passed)
State: deploying — Deploy agent is building and uploading the Worker
deploying — agent working, transcript streaming CONCEPT · proposed
Deploying Crash Cartel v0.7.4 → namespace sandbox
Bundle built — 412 KB gz
R2 upload complete
Worker deploy in progress…
healthz probe
WebSocket smoke test
Transcript streaming (live, appending)
Deploy agent rows appear as each step completes. Builder sees real-time progress without polling.
State: live — session is running; event feed is streaming
live — session active, event feed + game frame CONCEPT · proposed
Session live sess_a7f3b09c2e4d Dre Park · high balance · EUR · Mobile web · UK Expires in 14 m 22 s
Session event feed
+0.0s session created — player-2044 · EUR
+1.2s ws connected — 51 ms round-trip
+4.8s bet placed 10.00 — round #18211
+9.1s cashout 2.41× — +24.10
Game frame
Crash Cartel v0.7.4
Operator Demo EU · EUR · Mobile
State: fault-triggered — WALLET_TIMEOUT fired mid-session
fault-triggered — WALLET_TIMEOUT during bet debit CONCEPT · proposed
Fault triggered WALLET_TIMEOUT mid-session · round #18214
+0.0s session created — player-2044 · EUR
+1.2s ws connected — 51 ms round-trip
+4.8s bet placed 10.00 — round #18211
+9.1s cashout 2.41× — +24.10
+14.3s bet placed 10.00 — round #18214 · debit sent to wallet
+19.8s fault WALLET_TIMEOUT — wallet did not respond within SLA (5 000 ms) · debit voided · round #18214 aborted
Player-facing handling
The game Worker catches WALLET_TIMEOUT and surfaces a "Service unavailable — your stake has been returned" message to the player frame. No debit is recorded. The session remains open; the builder can observe whether the game recovers gracefully or leaves the player in a broken state. This is the primary value of fault injection testing.
State: expired — session window elapsed; history row available; relaunch CTA active
expired — session window elapsed CONCEPT · proposed
Session expired sess_a7f3b09c2e4d 15 min window · 3 rounds · 1 fault tested
Session ID Summary Status
sess_a7f3b09c2e4d 3 rounds · EUR · Mobile web · UK · WALLET_TIMEOUT triggered Expired
Session evidence saved
Replay bundle captured · event log available · fault-path recording archived. All of this feeds step 7 (Iterate) as the evidence baseline for the next build version.
View replay Download session log

Affected files

These are the files that need to change to implement this proposal. Paths are relative to the repo root on main. New platform pieces are marked "new — see architecture.html#edge".

File / component Change
apps/web/src/components/builder/SandboxLaunchLab.tsx The composer goes real: buildPreviewUrl() is replaced by a call to the session signer API, which returns a real HMAC-signed URL (https://play.sandbox.standout.games/launch?session=…&sig=…). The mock-warning banner is removed. The Transcript component is replaced by a live session event feed (WebSocket or SSE). The iframe placeholder is replaced by a real embedded game frame. The fake fakeSignature() function is deleted.
apps/web/src/lib/builderMockData.ts The BUILDER_LAUNCH_LAB option lists (operators, players, currencies, devices, jurisdictions, walletBehaviors, sessionExpiries) move from a static in-app object to a real catalogue data source — either a /api/sandbox/catalogue endpoint or a typed constant fetched from the platform config. The mock object becomes the fallback for offline/dev only.
dispatch Worker new — see architecture.html#edge
The Cloudflare dispatch Worker for the sandbox namespace: verifies the HMAC on every incoming launch request, routes to the correct game Worker version, and enforces session expiry (SESSION_STALE).
stub-wallet Worker new — see architecture.html#edge
Implements the wallet API interface with configurable fault injection. Activated when a session is launched with a faults=… parameter. Fires WALLET_INSUFFICIENT_FUNDS, WALLET_TIMEOUT, WALLET_DUPLICATE_TXN, WALLET_ROLLBACK_FAILED, or SESSION_STALE at the configured trigger points.
session signer new — see architecture.html#edge
A server-side service (Worker or D1-backed endpoint) that receives the session parameters from the composer, generates a cryptographic HMAC, and returns the signed launch URL. Replaces the client-side FNV-hash mock.
Not changing in this proposal
The eight select fields and five fault toggles in SandboxLaunchLab.tsx retain their exact options — the values in builderMockData.ts are correct and complete. Only their data source moves from a static object to a real API. The two-card layout and the fault toggle UI remain unchanged.

What changes in the build flow

Today, step 5 (Run validation — see vision.html · step 5) ends with a pass/warn/fail report and an inert "Launch sandbox" button that produces no real outcome. After this proposal, that CTA is live. Step 7 (Iterate — see vision.html · step 7) gains session history as evidence for the next build version.

Today — validation ends with a fake launch GROUNDED · matches main
Step 5 · Run validation
Pass/warn/fail gates, blocker list
Step 6 · Launch Lab (mock)
Fake URL, fake signature, no session
Step 7 · Iterate
No session evidence; only config diffs
Builder leaves step 5 without ever feeling the game play. Configuration quality is judged by config values alone, not by session evidence.
After — validation ends with a real launch CTA CONCEPT · proposed
Step 5 · Run validation
Gates pass → "Launch sandbox" CTA becomes live
Step 6 · Launch Lab (real)
Real HMAC URL → session feed → game frame → fault testing
Step 7 · Iterate
Session history, replay bundles, fault-path evidence
Builder finishes validation and immediately plays the game in a real session. Session evidence becomes the baseline for iteration decisions.

Open questions

Decisions needed before implementation
  • Session data retention for replay and debug. How long are sandbox session event logs and replay bundles retained in R2? A builder returning to a session from two weeks ago needs the replay bundle to be available. Retention cost scales with active games × sessions × expiry window; this needs a policy decision before the session signer persists anything.
  • Per-builder sandbox quotas. Each launch spins up a Worker deployment and consumes a Durable Object and R2 writes. Should sandbox sessions be capped per builder per day, or is the cost model flat for the development environment? Unlimited sessions may be acceptable at current scale but needs explicit confirmation before we remove the mock warning without a quota UI.
  • Demo namespace and the stub wallet. Does the demo namespace share the same stub-wallet Worker as sandbox, or does an operator demo session require operator-shaped mock responses (e.g. the real operator's bet limits, currency config, and session rules, not the stub defaults)? If demos need operator-shaped mocks, the wallet fixture must be per-operator-config, not a single shared stub.

What to tackle next

The Launch Lab's live session panel is the gateway into step 7 (Iterate). Once a builder has real session evidence — event logs, replay bundles, fault-path recordings — they have a basis for comparing build versions and making targeted configuration changes. The next proposal in this cadence is Proposal 05 · Iteration Loop, which covers pipeline step 7: version history, config diffs between builds, validation deltas, and how session evidence from the Launch Lab feeds the iteration decision loop.