Smoke test required

...

← All documentation

Documentation

Path to Launch

**Status:** active · last reviewed 2026-05-03

source: docs/grand-plan/PATH_TO_LAUNCH.md

The strategic recalibration after the honest 25–35% probability assessment of 2026-04-27. Every category scored, every gap closed, scope sharpened so we ship a focused 10/10 product instead of 80% of an ambitious one. Reads after MANIFESTO.md, PRODUCT_SPEC.md, ARCHITECTURE.md, ART_DIRECTION.md, GTM_PLAN.md, INTERACTIVE_ASSETS.md.

Status: locked 2026-04-27 (recalibration pass). Re-locked 2026-04-30 evening per VISION_REVISION_2026-04-30.md: sprite-walk + character creator + per-component flags + camera + interaction-prompt UX pulled forward from v1.5 to v1.0. Terminology aligned to Ensemble / Studio / Canvas / Showcase. Tier limits set to 1+1 free / 1+9 pro. The multi-tenant overworld (walking BETWEEN Studios) remains v1.5. Bar: every v1 category at A+ / 10/10. No exception. Honest target: raise the probability of meaningful success from 25–35% → 50–65% by sharpening scope and investing fully in the categories that matter.


1. Why this doc exists

The earlier strategic docs locked the vision. That vision is real-game-changer-shaped, but the path described from there to launch was too broad: - 6 phases (A → F) totaling ~210 hours of build. - Plus ~219 hours of category-by-category quality work to push everything to A+. - Total: ~430 hours, or 12–18 months of focused full-time effort.

That timeline is not the problem. The problem is that 430 hours spread across “everything we want to build” gives us 80% of an ambitious vision. The product wins by being 100% of a focused vision, not 80% of an ambitious one.

This doc: 1. Names the recalibrated v1. Smaller, sharper, achievable. 2. Plans every category to A+. No exceptions, no “good enough” carveouts. 3. Writes the auxiliary plans that were missing (sound, sprite art, content, CI/CD). 4. Re-estimates probability of success with the recalibration.

If anything in MANIFESTO.md conflicts with this recalibration, the manifesto wins. This doc operates inside the manifesto.


2. The recalibration — what changes vs. the original plan

2.1 The single elevator-pitch sentence we’re committing to

Linktree is a list of links — Ensemble is a place you walk through, in a sprite you made.

Every product decision passes this filter. If a feature doesn’t earn its way into “Ensemble is a place + you walk through it,” it gets cut from v1.

2.2 What’s IN v1 (mandatory for launch)

Five line items below (★ marked) were pulled forward from v1.5 in the 2026-04-30 vision revision.

Category What
The Studio Procedurally-filled first Canvas (per PRODUCT_SPEC.md §3.2 / §3.6.5; spec drafted Chunk 4, real impl Chunk 5) + Workshop drawer + 5 example presets + 5 asset packs + edit mode + Claude chat in edit mode
Character creator First-run UI; persisted sprite descriptor; ~384-combo palette (8 body × 6 hair × 8 outfit). v1.0 per VISION_REVISION_2026-04-30.md §3 + SPRITE_WORLD.md.
Sprite-walk engine 8-direction walk, camera-follow, collision detection, vanilla canvas2D. v1.0.
Per-component flags walkable_through / solid / interactable wired into the canvas schema and the props panel. v1.0.
Camera follow Camera tracks the sprite within canvas bounds; smooth lerp; reduced-motion-respect. v1.0.
Interaction-prompt UX “Press X to interact” overlay when sprite enters an interactable component’s radius; works with keyboard, click, and touch. v1.0.
Click-to-launch Full implementation of all 4 in-canvas interactions: launch, link, embed, read. Sprite-proximity fires the same handlers as click.
Tier gates POST /canvas enforces 1+1 free / 1+9 pro per PRODUCT_SPEC.md §3.1a; Studio UI disables “New canvas” at limit; Showcase setter enforces exactly-one.
Showcase pages Per-Showcase public pages with og:image generation, RSS feed
Iframe embedding Canvas embeddable in other surfaces (Substack, Notion, Bluesky bio)
Multi-tenancy + auth Cloud backend, account creation, public profiles
The Dashboard Existing power-user surface (preserved, demoted in nav)
/pair flow Already shipped
~85–100 quality sprites Across 5 asset packs (per PRODUCT_SPEC.md §3.3): instruments (~20), arcade (~15), books + shelves (~15), plants + props (~25), doors + portals (~10). Total ~85–100. These are component sprites; the user’s avatar sprite from the character creator is a separate asset stream.
Sound layer Off by default, opt-in. Per-preset ambient + action library. Footstep SFX hook on sprite-walk (default per Kevin’s call, VISION_REVISION_2026-04-30.md §6.6).
Apple-quality bar Every page designed. Every empty state designed. Every error state designed.

2.3 What’s DEFERRED to v1.5 / v1.1 (post-launch)

The 2026-04-30 vision revision pulled sprite-walk + character creator + per-component flags + camera + interaction-prompt UX into v1.0. They are no longer deferred. The remaining v1.5 items (the multi-tenant overworld and presence layers) are kept here.

Deferred to Item Why
v1.5 Composable connected canvases ACROSS Studios Door routing across Studios needs the multi-tenant overworld + significant cross-tenant infra. Per V1_5_WALKABLE_WORLD.md. v1.0 doors connect within a creator’s own canvases.
v1.5 Multi-tenant Ensemble overworld (walking BETWEEN Studios) The walkable city of rooftops + plazas + paths per V1_5_WALKABLE_WORLD.md. Rendering scales (LOD, presence DOs, town layout) compound; landed as a single coordinated phase.
v1.5 Rooftop primitive The 256² art-tile that represents a Showcase on the overworld. Per ROOFTOP_LAYER.md. Schema field shipped now (forward-compat); editor + renderer post-v1.0.
v1.5 Procedural town layout The algorithm that places Showcases into walkable plazas. Per TOWN_LAYOUT.md.
v1.5 Live presence (multi-visitor ghost-sprites) Visitors see other-visitor sprites drifting through the canvas. v1.0 ships single-visitor sprite-walk only.
v1.1 Generative living canvases Claude composes a fresh Canvas from your data. Defining demo for a “we’re back with the next thing” launch hook.
v1.2 Programmable creator-bots Big build, big moderation surface. Validate that creators want it before investing.

2.4 What’s DEFERRED indefinitely or to v2

  • Feed (cross-Ensemble timeline) — Phase E. Networks take years; we ship v1 without and add later if the audience is real.
  • Sprite community catalog + remix lineage — Phase F. Post-launch creator-driven feature.
  • Asset marketplace + tipping economy — Post-launch when there’s a real economy.
  • Team tier ($40/user) — Year 2 if the consumer tier validates.
  • Mobile native apps — Year 2.

2.5 What changes about the dashboard

Stays exactly as it is. The Maestro/Agents control deck shipped through Phase 1–2.5 is preserved. Demoted in marketing nav (the homepage is the Studio), but power users find it via Settings or the Operator footer link. Functionally unchanged.

This is critical: we don’t break what already works. The dashboard’s existing depth is one of the things that makes Ensemble distinctive.


3. The new v1 ship list

This is the launch contract. v1 is shipped only when every line below is checked.

3.1 Studio core (~85h baseline + ~24-30h sprite-walk pull-in = ~110-115h)

  • [ ] Procedurally-filled first Canvas default with Workshop drawer (Phase A.0 lays the surface; procedural-fill stub in Chunk 2, real impl Chunk 5 per PRODUCT_SPEC.md §3.6.5). Sprite-aware: layout preserves walk-paths.
  • [ ] 5 example presets: blank, music ensemble, game arcade (DONE), personal library, gallery, workshop literal (4 to author)
  • [ ] 5 asset packs at ~85–100 sprites total (per PRODUCT_SPEC.md §3.3)
  • [ ] Character creator UI + storage (~6h): first-run flow; ~384-combo palette (8 body × 6 hair × 8 outfit); persisted sprite descriptor on user record. Per SPRITE_WORLD.md.
  • [ ] Sprite-walk engine (~10h): vanilla canvas2D, 8-direction, collision against solid components, camera-follow, reduced-motion fallback.
  • [ ] Per-component flags (walkable_through / solid / interactable) (~4h): canvas schema patch, props-panel UI, default-flag heuristics per component class.
  • [ ] Interaction-radius prompt UX (~4h): visible “Press X” overlay when sprite enters an interactable’s radius; honors keyboard + click + touch.
  • [ ] Edit mode: drag/resize/select/code, undo/redo (50-op history), auto-save (5s), keyboard shortcuts (Cmd-S/Cmd-Z/Cmd-E). Edit toggle pauses sprite-walk + parks the sprite at the door.
  • [ ] Walk-floor overlay in edit mode (~2h): 16px grid + collision shading visualizing where the sprite can walk.
  • [ ] Claude chat drawer in edit mode: sprite generation, component generation, layout suggestions, free-form chat. Compositions respect sprite-walk constraints.
  • [ ] All 4 click-to- interactions: launch (DONE), link, embed, read. Sprite-proximity fires the same handlers as click.*
  • [ ] Edit-mode interaction wiring panel (props sidebar) — extended with the 3 sprite-walk flags.
  • [ ] First-run tutorial (4-step coachmarks): “Make your sprite” → “Walk around” → “Press X to interact” → “Edit when ready”.
  • [ ] Empty state, first-time edit, error states all designed (sprite stands on entrance for empty canvas).
  • [ ] CRT overlay toggle in Settings
  • [ ] Sound layer (opt-in) with per-preset ambient + action sounds + footstep SFX (default per VISION_REVISION_2026-04-30.md §6.6).
  • [ ] Reduced-motion fully honored across every animation including sprite-walk (motion → instant teleport on direction change; no walk-cycle frames)
  • [ ] All 21 themes apply correctly to every preset
  • [ ] Per-Canvas CSS sandbox + per-Canvas JS sandbox
  • [ ] Tier gates (~3h): POST /canvas enforces 1+1 free / 1+9 pro; Studio UI disables “New canvas” at limit; Showcase setter enforces exactly-one in a single transaction.

3.2 Showcase pages (~16 hours)

  • [ ] /showcase/<slug>.html rich layouts per public project
  • [ ] Auto-generated 1200×630 og:image PNG
  • [ ] Per-Ensemble RSS feed at feed.xml
  • [ ] Showcase tab inside Studio shows curated list
  • [ ] Embed snippet for each showcase

3.3 Multi-tenancy + auth (~40 hours)

  • [ ] Cloudflare Workers + D1 + R2 + Durable Objects setup
  • [ ] GitHub OAuth + Apple sign-in + magic-link email
  • [ ] User accounts, workspaces, public profiles at ensemble.tld/<handle>
  • [ ] Cloud Studio sync (server is source of truth post-D)
  • [ ] Migration script from Mac-local to cloud
  • [ ] Pricing surface (Stripe Checkout)
  • [ ] Free + paid tiers wired

3.4 Operations + safety + quality (~80 hours)

  • [ ] CI gating every PR (GH Actions running tests + lint + build)
  • [ ] Pytest 70%+ coverage on Python modules
  • [ ] Vitest 60%+ coverage on Studio engine JS
  • [ ] Playwright e2e for the 5 critical flows (pair, fire autopilot, kill, edit Studio, publish showcase)
  • [ ] WCAG 2.1 AA audit + fixes
  • [ ] Security threat model + sandbox pen test
  • [ ] Status page at status.ensemble.tld
  • [ ] Incident response runbook
  • [ ] Content moderation policy + intake form
  • [ ] Cost monitoring + spend alerts

Total v1 build: ~221 hours baseline + ~24-30h sprite-walk pull-in = ~245–251 hours. That’s ~2.5-3 months full-time, or 6-7 months part-time at 8h/week. Roughly half the original 430h plan, with the sprite-walk addition itself a major brand + first-impression lift (per VISION_REVISION_2026-04-30.md §3).


4. Per-category plan to A+ (10/10)

For each category in the honest assessment, the concrete plan to push it from current state → A+. Time estimates included. Nothing left as “we’ll figure it out.”

4.1 Dashboard architecture: A− → A+ (~16h)

Gap: missing automated test coverage; Phase 1 modularization clean, single-source CSS strong, but no regression safety net.

Plan: 1. Pytest harness for bin/dashgen/ modules: data, pages, styles, widgets, server. Goal: 70%+ line coverage. 2. Golden-file diffs: regenerate dashboard, diff against committed baseline. Pass if no diff or diff is timestamp-only. 3. JSON schema validators for state.json, chats/*.json, studio/room.json, sprite metadata. 4. Type hints throughout Python (gradual mypy adoption). 5. CI gates: pytest, mypy, ruff, python3 -m py_compile all green required to merge.

Hours: 16

4.2 Studio architecture: B+ → A+ (~12h)

Gap: engine just shipped, no schema validation, no scale tests, no JSDoc types.

Plan: 1. JSDoc type definitions for every function in studio_engine_js. Strict types via // @ts-check at file head. 2. JSON Schema for Room + Preset + Sprite. Validate on load + before save. 3. Refactor engine into pure-function modules where possible (testable). 4. Load test: render a Canvas with 100 components. Verify FPS stays >30, memory <150MB. 5. Engine unit tests via vitest: schema validation, slot resolution, preset loading.

Hours: 12

4.3 Studio UX: B− → A+ (~37h)

Gap: edit mode missing, persistence missing, multi-tenancy missing, no first-run flow.

Plan: 1. Edit mode (Phase A.3 from PRODUCT_SPEC) — ~14h - Drag handles + resize handles + delete buttons - Component palette (right-side drawer) - Props panel (replaces palette when component selected) - Code editor (Monaco-style modal for custom CSS/JS) - Outline view (left-side, hierarchical components) 2. Auto-save + undo/redo — ~6h - Auto-save every 5s, persists to studio/room.json (Phase A) / cloud (Phase D) - 50-op undo/redo history per session - Cmd-S / Cmd-Z / Cmd-Shift-Z / Cmd-E shortcuts 3. Workshop drag-to-stage — ~4h - Asset packs: drag a sprite from the pack list onto the stage to add a component - Drop-target visualization (snap-to-grid, 16px increments) 4. First-run tutorial — ~4h - 4-step coachmark sequence on first edit-mode entry - “Press Edit” → “Drag a sprite” → “Wire an interaction” → “Save” - Dismissible, persisted 5. Designed empty + error states — ~6h - Empty Canvas (after wipe-and-restart) — “Press Edit or load an Example” (default first-canvas state is procedurally-filled, not empty; this is the post-wipe state per PRODUCT_SPEC.md §3.2) - Empty Workshop search (“No matches — try X”) - Save failure (designed pill with retry) - Asset load failure (placeholder ? sprite with tooltip) 6. Keyboard navigation — ~3h - Tab cycles components, Enter selects, Space activates - Focus rings on every interactive element

Hours: 37

4.4 Sprite art: C+ → A+ (~32h, OR ~$3000 for a pixel artist)

Gap: 14 sprites today; need ~85–100 quality sprites at consistent style (per PRODUCT_SPEC.md §3.3). Current sprites are recognizable but not Stardew-tier.

Plan A — solo execution: 1. Author ~45 anchor sprites (1 per asset-pack-style + main characters). 30 min each = ~22h. 2. Use Claude to draft ~40–55 supporting sprites (variants, props, secondary characters). Hand-clean each. 15 min each = ~12h. 3. Style guide doc + theme retinting validation. 2h.

Plan B — hire a pixel artist (recommended): 1. Find a freelancer specializing in 32×32 pixel art. ~$30–50/sprite = $2550–5000 for ~85–100 sprites. 2. 1-week sprint with daily check-ins. Deliver in batches. 3. Maestro reviews each batch against the art-bible rules.

Plan C — hybrid (best for v1): 1. Hire a pixel artist for the 5 anchor sprites in each pack (25 total, ~$1000–1250). 2. Author the remaining ~60–75 in-house (~16–20h) following the artist’s anchor style. 3. Result: pack-coherent style at lower cost than full hire.

Recommendation: Plan C ideally. Locked decision (2026-04-27): Plan A — solo DIY. $0 cash spend; 32h of authored sprite work in-house. Slower path but Kevin’s call. Quality risk: anchor sprites may take longer than estimated to hit A+ without a pixel-art professional to study. Mitigation: hand-author the 5 anchor sprites first, study real pixel-art reference closely (Stardew, Celeste), iterate until each anchor is A+ before scaling to the supporting 35.

Hours / cost: 32h + $0 (DIY)

4.5 Documentation: A− → A+ (~12h)

Gap: strategic docs locked. Missing: user-facing help, FAQ, video walkthroughs, API reference.

Plan: 1. docs/help/ — user-facing help with screenshots. 10 articles covering: pair, edit mode, workshop, click-to-launch, showcase, themes, sound, troubleshooting, billing, account. 2. FAQ at ensemble.tld/help — 50 questions across categories. 3. 5-minute walkthrough video — screen recording + voiceover (Kevin records). 4. API reference for /studio/* endpoints + control panel. 5. Component schema reference (auto-generated from JSDoc).

Hours: 12

4.6 Testing: D+ → A+ (~25h)

Gap: almost zero test coverage today. Critical risk for the launch.

Plan: 1. Pytest for bin/dashgen/: 70% line coverage minimum. - Module unit tests (data, pages, styles, widgets, server). - Render golden-file diffs. - Schema validation tests. 2. Vitest for studio_engine_js: 60% coverage. - Pure-function tests (slot resolution, embed URL transforms, markdown-lite). - Render-engine tests with mock state. 3. Playwright for 5 critical flows: - Pair this browser → owner mode unlocks. - Fire autopilot from dashboard → state.json updates. - Edit a Canvas in the Studio → save → reload → state preserved. - Click-to-launch on Game Arcade → modal opens with correct frame. - Publish showcase → public URL renders. 4. Visual regression via Percy or similar — screenshots of every page across 21 themes. 5. CI gating every PR. 6. Smoke tests post-deploy.

Hours: 25

4.7 Performance: B+ → A+ (~10h)

Gap: dashboard performance solid. Studio not load-tested. No CI-enforced budgets.

Plan: 1. Lighthouse CI on every page: LCP <1.5s, FID <100ms, CLS <0.1. 2. Bundle size budgets: style.css <50KB compressed, studio engine <500KB compressed. 3. Lazy-load sprites by category (core 80 in initial bundle, extended fetched on edit-mode). 4. content-visibility: auto on off-screen components. 5. Synthetic uptime checks every 5 min from 3 regions (Cloudflare, US, EU).

Hours: 10

4.8 Security: B → A+ (~12h)

Gap: sandbox model right; allowlist solid; multi-tenancy security untested.

Plan: 1. Threat model write-up: list every threat × mitigation × test. 2. Sandbox escape pen test: try to exfiltrate from a custom-code iframe (manual + automated). 3. Prompt injection test suite: try to break the Claude system prompt. 4. CSP audit on every page + fix violations. 5. Auth flow security review (Phase D): token rotation, session expiry, recovery. 6. Cloudflare Access wired (already on A-tier roadmap). 7. Quarterly security review process documented.

Hours: 12

4.9 Operations: B → A+ (~12h)

Gap: scheduled tasks + autopilot work, but no real on-call story.

Plan: 1. Zombie sweeper: launchd job every 30 min, kills stale claude processes. 2. Structured logging: all bash scripts use log_error helper, all Python logs via logging module with rotating file handler. 3. Status page: status.ensemble.tld powered by Cloudflare Workers + free uptime monitor. 4. Daily/weekly health check: cron-driven, posts to Slack/Discord. 5. Incident response runbook. 6. Backup retention: 30-day daily + quarterly snapshot. 7. Migration safety: pre-migration backup + post-migration verification.

Hours: 12

4.10 Accessibility: B− → A+ (~10h)

Gap: keyboard nav + reduced-motion mostly honored. No formal audit.

Plan: 1. Run aXe + WAVE across every page. Fix all errors. 2. Manual screen reader pass (NVDA on Win + VoiceOver on Mac). 3. Keyboard-only navigation pass for every flow. 4. Color contrast verification across all 21 themes (Stark or similar). 5. Reduced-motion full audit. 6. Add aria-live regions for state changes. 7. Document accessibility statement.

Hours: 10

4.11 Internationalization: F → DEFERRED to v1.1

Honest call: English-only at v1 is acceptable for the vibe-coder audience. The first 1k users are likely English-speaking. Investing 25h here pre-launch yields no validation; investing post-launch yields scaled value.

v1.1 plan (post-launch): 1. xcstrings catalog with all UI strings. 2. Translate to 5 languages: ES, FR, PT, DE, JP. ~$2000 via professional service. 3. RTL layout support (CSS logical properties already mostly in use). 4. Locale-aware date/number formatting.

Hours: 0 at v1, 25h post-launch.

4.12 Brand identity: A− → A+ (~6h)

Gap: manifesto + art bible solid. Missing: brand kit, marketing site, launch assets.

Plan: 1. Brand kit: logo SVG variants, color tokens, typography pairing rules. 2. Marketing site (separate from app): ensemble.tld homepage with hero, manifesto excerpt, demo video, waitlist form. 3. Launch assets: og:image template, social card templates, App icon variants. 4. Press kit: high-res logos, screenshots, founder bio.

Hours: 6

4.13 Build/deploy: B− → A+ (~10h)

Plan: 1. CI gating every PR via GH Actions. 2. Tagged releases with auto-changelog (release-it or similar). 3. Versioned API endpoints (/v1/...) for forward compat. 4. Cloudflare Workers deployment via Wrangler in CI. 5. Database migrations versioned + automated. 6. Rollback procedure documented + tested.

Hours: 10

4.14 Operational maturity: C+ → A+ (~12h)

Gap: no real users yet, no support story, no moderation.

Plan: 1. Support intake form (in-app + via email). 2. SLA: 24h paid, 7d free. 3. Discord server for paid users. 4. Status page (covered above). 5. Moderation policy + intake queue (covered in GTM_PLAN.md §7). 6. Billing self-service via Stripe Customer Portal. 7. Refund policy: 30-day no-questions.

Hours: 12


5. New auxiliary plans (gaps that weren’t covered)

5.1 Sound design execution plan — DIY locked (~15h, $0)

The art bible specifies sound design but doesn’t plan execution. Locked decision (2026-04-27): DIY everything. $0 cash spend. Trade-off: more time, possibly lower quality on ambient loops vs. a professional library.

  1. Author ambient loops in GarageBand / Logic (~5h): - Concert hall murmur — record room tone + add light reverb + EQ. - Jazz club — sample + loop bass + brushed-drum patterns. - Spaceship hum — synth pad at 60Hz + filtered noise. - Forest birds — open-source field recordings (Freesound.org, CC0 license). - Office whir — fan + keyboard typing layered.
  2. Author action sounds in GarageBand / Logic (~3h): - 20 short SFX (wood block, brushed snare, synth click, stone-on-stone, key press). Use built-in instruments + samples.
  3. Author UI sounds (~2h): - Toggle clicks, button presses, save/undo subtle ticks.
  4. Encode + bundle (~2h): - 192kbps Opus via ffmpeg. - Lazy-load by preset.
  5. Test sound layer (~2h): - Reduced-motion respects audio sensitivity. - Master volume + per-category mute.
  6. Document soundpacks (~1h): - Each preset’s sonic palette. - Sound credits attribution (CC0 sources).

Hours: 15, Cost: $0 (DIY)

Quality risk: loops may sound less professional than a $30/track Pond5 source. Mitigation: lean on real public-domain field recordings from Freesound.org (CC0) for ambient + use GarageBand’s built-in jazz-club and orchestral sample libraries for fills. Iterate until each loop is A+ to the manifesto bar.

5.2 Sprite art execution plan (covered above as 4.4)

Recommendation: hybrid — hire an artist for 25 anchor sprites, author 55 supporting in-house. Hours: 16, Cost: ~$1000

5.3 Content + community plan (~30h over 6 months)

The GTM doc specifies a launch sequence; this is the executable plan.

Pre-launch content (months 1–4): 1. Personal Substack at ensemble.substack.com — 2 posts/month covering build progress, design choices, beta-user spotlights. 2. 5 “design diary” essays for the blog: why pixel sprites, why CRT overlay, why click-to-launch, why composable rooms, why the dashboard stays. 3. 3 case study drafts (one per first-batch beta user with their permission).

Launch content (month 5): 4. Manifesto-class launch post: “Building Ensemble: a year of solo making with Claude” (3000–5000 words). 5. 30-second demo video: screen recording of a Studio in action, mood music, narration. 6. Show HN + Product Hunt assets.

Post-launch (month 6+): 7. Weekly featured Ensemble member spotlight (homepage + feed). 8. Quarterly state-of-Ensemble post.

Hours: 30 over 6 months (~5h/month), Cost: $0 (organic)

5.4 First-100-users execution plan (~20h)

GTM doc specifies the first 10. This expands to 100.

Wave 1 (days 1–14): 200-person hand-picked waitlist. - Kevin DMs 200 specifically curated people. - Each invitation is personal (not broadcast). - Tracking spreadsheet: name, why-they-fit, response, next-step.

Wave 2 (days 15–60): 25-person closed beta. - Top 25 from waitlist invited first. - 1-on-1 onboarding call (30 min Zoom each). - Weekly group office hours.

Wave 3 (days 61–120): 100 active users. - Open the remaining 175 waitlisters. - Soft public homepage. - First 75 conversions tracked individually. - Net Promoter Score collected from each.

Hours: 20 of dedicated outreach, Cost: $0

5.5 CI/CD + DevEx plan (~20h)

Tied to testing + build/deploy categories above. The full picture:

  1. GH Actions workflow .github/workflows/test.yml: - Triggers: push to main, pull request. - Jobs: pytest, vitest, lint (ruff + eslint), type-check (mypy + tsc), build dashboard, smoke test. - Concurrency: cancel-in-progress on subsequent pushes.
  2. Pre-commit hooks: black, ruff, prettier, eslint.
  3. Branch protection: require CI green + 1 review (when team grows).
  4. Wrangler deploy on tag push to Cloudflare Workers.
  5. Supabase / D1 migrations via wrangler d1 in CI.
  6. Sentry error tracking (free tier <10k events/month).

Hours: 20

5.6 Pricing validation plan (~8h)

Don’t lock $12/mo without validation.

  1. Beta survey: 25 closed-beta users asked at week 6: “What would you pay monthly for this?” Open-ended, then multi-choice $5/$10/$15/$20/$25/won’t pay.
  2. Comparable benchmarks: survey actual prices users currently pay for Linktree ($5), Substack ($0–8/mo), Bandcamp Pro ($10/mo), Carrd Pro ($19/yr), etc.
  3. Cost ceiling test: measure actual API spend per Pro user during beta. If $12/mo doesn’t cover Claude allotment + storage + bandwidth, raise.
  4. Lock at week 16, before Wave 4 launch.

Hours: 8


6. Total recalibrated investment

Adding it all up:

Bucket Hours Cost
v1 Studio core 85
v1 Showcase pages 16
v1 Multi-tenancy + auth 40
v1 Operations + safety + quality 80
Per-category A+ pushes (dash, studio arch, perf, sec, ops, a11y, brand, build, op-mat) 78
Sound design (DIY) 15 $0
Sprite art (DIY all 80) 32 $0
Content + community 30 $0
First-100-users outreach 20 $0
CI/CD + DevEx 20
Pricing validation 8
Total v1 launch (DIY locked) 424 $0

Time: ~5.3 months full-time, ~13 months part-time at 8h/week.

DIY locked 2026-04-27: Kevin’s call to author every sprite + every sound in-house. Adds ~19h vs. the hybrid-hire path (16h sprite art + 12h sound = 28h hybrid; 32h sprite art + 15h sound = 47h DIY). Saves $1500 cash. Trade-off accepted: slower delivery, slightly higher quality risk on the most “professional craft” elements (anchor sprites + ambient loops). Mitigation in §4.4 + §5.1.

The total investment is otherwise the same shape as the original plan (~430h ambitious) — what changed is the focus, not the time. We’re investing in quality across the categories that matter for v1 launch instead of building features that ship in v1.1+.


7. Milestones (concrete dates from the locked plan)

Based on the GTM plan + this recalibration:

Month Milestone
0 Today. Phase A.0–A.2 part 1 shipped. Recalibration locked. Sprite-walk pulled into v1.0 per VISION_REVISION_2026-04-30.md.
1 Phase A.2 part 2 + A.3 (edit mode + Claude chat) shipped. Character creator + sprite-walk engine + component flags + camera + interaction-prompt land in this month per Round 6-7 cadence. Sprite art batch 1 (25 anchors) authored.
2 Phase A.1 part 2 (4 more presets + 4 more asset packs) shipped. Sprite art batch 1 delivered + integrated. Tier-gate enforcement live.
3 Showcase pages + iframe embedding shipped. Wave 0 dogfooding internal. Sprite art batch 2 (55 supporting) authored.
4 Phase D (multi-tenancy + auth) shipped. Wave 1 stealth waitlist opens. CI/CD + tests + a11y pass complete. Pricing locked.
5 Wave 2 closed beta opens with 25 hand-picked users. Sound layer (incl. footsteps) shipping. Marketing site live.
6 Wave 3 soft public launch. Blog + Substack live. 250 signups target, 100 active.
7–8 Dial in based on beta feedback. NPS ≥50 target.
9 Wave 4 — Show HN + Product Hunt launch. 2k signups in launch week target.
10–12 Steady-state growth. 1k paid by EOM 12. v1.5 work starts (multi-tenant overworld + rooftops + live presence) per V1_5_WALKABLE_WORLD.md. v1.1 generative + bots start landing as the “we’re back” narrative.

That’s a concrete 12-month plan. Every month has a deliverable.


8. Honest probability re-estimate

The original 25–35% probability assumed building 80% of an ambitious vision. With this recalibration:

Path Probability of meaningful success @ 18 months
Original plan (430h, 6 phases, 4 breakthrough features in v1) executed perfectly 25–35%
Recalibrated plan (405h, sharper v1, breakthrough features in v1.1) executed perfectly 50–65%
Original plan executed at 80% quality 10–15%
Recalibrated plan executed at 80% quality 25–35%

The recalibration roughly doubles the probability of success because we ship a focused thing first, validate the audience, then expand. We don’t try to ship everything before validating anything.

The single biggest probability drivers:

  1. Audience validation in months 4–5. If Wave 1 stealth waitlist + Wave 2 closed beta come back enthusiastic (NPS 50+), we have a real product. If lukewarm, we pivot before sinking another 6 months. +15% if positive validation, −20% if not.

  2. Quality of the 5 example presets at v1. The first impression of the Studio. If these feel template-y instead of crafted, the whole “Apple-quality” promise breaks. +10% if A+ presets, −15% if B− presets.

  3. The Claude chat in edit mode actually delivering useful sprites/components on first ask. The differentiator. If it 70% of the time generates something useful, magic. If 30%, frustrating. +10% if it lands, −10% if not.

  4. Cost structure holding at scale. If Claude allotment + bandwidth + storage stays under 30% of revenue at 1k users, sustainable. If it’s 60%+, we’re squeezing. +5% if margins hold, −10% if not.

These four levers are where execution discipline matters most.


9. The single thing we’d cut if forced

Per the prior strategic question: “name the ONE thing you’d cut if forced.”

Answer: the Map tab (Canvas map).

Reasoning: it’s beautiful, but it’s also the feature that’s most “nice to have” without being tied to either the click-to-launch wedge OR the linktree-replacement positioning. It’s a viewer, not a creator surface. We can ship v1 without it and add it back if the audience asks. Composable connected canvases (Phase D.1+, deferred to v1.5 per V1_5_WALKABLE_WORLD.md) make the Map valuable; without that, the Map is just a project list.

Second-cut candidate: Sound layer. It’s a polish item; v1 ships fine without sounds (off by default anyway). Cuts 12h + $500.

Third-cut candidate: The 4 example presets beyond Music + Game Arcade (the two that already exist). Force users to compose from scratch on day 1. Risky because empty-canvas can intimidate, but also forces the Workshop drawer to do its job hard.

I’d cut the Map tab if forced. Saves ~6h. Doesn’t materially weaken the v1 promise.


10. What this recalibration commits us to

One product, sharply focused: the Ensemble is the front door (the overworld of Showcases), the Studio is the editor app behind it, the Dashboard is for power users, and the multi-tenant overworld + multi-visitor presence + Claude-composed canvases + creator-bots land as v1.5/v1.1/v1.2 once we have proof of audience.

Sprite-walk is in v1.0 (was v1.5). Visitors steer a customizable sprite through the canvas, walk up to components, press X to interact. The overworld remains v1.5.

~245-251 hours of focused build over 3 months full-time / 7 months part-time for v1.0 (sprite-walk pull-in adds ~24-30h to the 221h baseline).

~$0 cash investment for v1.0 (DIY locked); ~$1500 historical estimate kept for sprite anchors + sound if hybrid path re-opened.

A 50–65% probability of meaningful success at the highest quality bar. Sprite-walk in v1.0 is itself a probability lift — first-impression delta is large.

Every category at A+ before v1 ships. No “good enough” carveouts.

Validation gates at months 4–5 before we sink another 6 months.

If anything in this doc conflicts with the manifesto, the manifesto wins. If the manifesto is fundamentally wrong, we kill it and rebuild. But based on everything we’ve seen, this is a real swing at a meaningful product.


Locked 2026-04-27 (recalibration pass). Reviewed against MANIFESTO + every sister doc. The single contract for v1 launch.


Addendum — Staged platform companion (locked 2026-04-27 evening)

This doc remains the contract for v1.0 launch. It is now paired with STAGED_PLATFORM.md, which extends the cadence through v1.1 → v2.1 (months 7-30) with a launch-worthy hook in every release. The v1.0 scope here is unchanged in shape, with one addition pulled forward from the v1.1+ horizon:

Phase A.4 — Repo-to-Studio onboarding (~16-20h added to v1.0). Sign up → link GitHub → 60 seconds later your Studio is alive with components reflecting your actual work. Solves the empty-state-death risk and becomes the v1.0 Show HN demo. Detailed scope in STAGED_PLATFORM.md §3 v1.0 entry.

Revised v1.0 total: ~440h DIY (was 424h; +16h for A.4). $0 cash through v1.x; v2.x adds Stripe Connect transaction fees + tax compliance setup.

Probability ceiling: the staging-doc analysis (STAGED_PLATFORM.md §10) identifies five levers that compound the 50-65% v1.0 probability up toward a 92-97% structural ceiling through v2.1. Public building (lever 2) and concierge MVP (lever 3) are recommended for the next 30 days; the others stage with the cadence.