RENAMED 2026-05-03: Brand pivoted from “Ensemble” to “Endenza”. Vocabulary (Maestro/Virtuoso/Agent/Studio/Canvas/Showcase) unchanged. References to “Ensemble” in this historical doc preserve the decision context as-recorded; treat the brand name as Endenza in any current work.
Status: locked 2026-04-30 evening (Kevin’s call). Supersedes: the v1.0 scope in
PATH_TO_LAUNCH.md§2.2 and the v1.5 walkable-world deferral inV1_5_WALKABLE_WORLD.md. Earlier docs stay as historical record but the v1.0 vs v1.5 line shifts per this doc.
1. Terminology lock
These four terms are the binding vocabulary going forward. Every piece of user-facing copy, every doc, every internal variable name where copy bleeds in, gets aligned to this table.
| Term | Definition | Cardinality |
|---|---|---|
| Ensemble | The overworld map. The PLACE itself. The world a visitor lands in. | One |
| Studio | The editor app where creators author canvases. Every creator has exactly one. | 1 per creator |
| Canvas | A creator’s place inside their Studio. Anything they can imagine within the sprite-game world. Can wrap games, websites, embeds — visual elements placed via toolbar or Claude. | 2 (free) / 10 (pro) per creator |
| Showcase | The ONE canvas a creator chooses to publish to Ensemble. Visitors see it from the overworld and walk into it. | 1 per creator |
Anti-glossary (terms NOT to use anymore)
- “Room” → use Canvas
- “Workshop” (when meaning the creator’s surface) → use Studio
- “Showcase” (when meaning the public-grid of all creators’ work) → use Ensemble for that grid; “Showcase” is reserved for the per-creator public canvas
2. Tier limits — canvas count
| Tier | Showcase (public) | Extra canvases (drafts/private) | Total |
|---|---|---|---|
| Free | 1 | 1 | 2 |
| Pro | 1 | 9 | 10 |
| Team (post-launch) | 1 per member | unlimited | unlimited |
Enforcement points
POST /canvas(create) — tier check + count check; reject with HTTP 402 (Payment Required) + upgrade-prompt if at limit.- Studio UI — disable “New canvas” button when at limit; show “Upgrade for more” inline.
- Showcase setter — exactly one canvas per creator can hold the showcase flag at any time. Setting a new one auto-clears the prior.
3. v1.0 scope expansion — sprite-walk pulled in
Old v1.0 (per PATH_TO_LAUNCH.md): visitor lands on creator’s canvas, clicks components from outside, components launch/link/embed/read.
NEW v1.0: visitor steers a SPRITE through the canvas. Walks up to components. Presses X (or clicks) to interact. Click-to-launch / link / embed / read all still work — sprite just gets there first.
What changes about the shipping v1.0 product
| Capability | Old plan | New plan |
|---|---|---|
| Character creator | v1.5 | v1.0 ← pulled in |
| Sprite-walk engine | v1.5 | v1.0 ← pulled in |
| Component collision (walkable_through / solid / interactable flags) | v1.5 | v1.0 ← pulled in |
| Camera follows sprite | v1.5 | v1.0 ← pulled in |
| “Press X to interact” prompts | v1.5 | v1.0 ← pulled in |
| Multi-canvas overworld (walk between Studios) | v1.5 | v1.5 (unchanged) |
| Multiplayer presence (live ghost-cursors) | v1.5 | v1.5 (unchanged) |
| Notes pinned to other creators’ work | v1.5 | v1.5 (unchanged) |
Why this works
The substrate we shipped earlier today already supports half of this:
- Canvas v2 schema (
canvas_schema.py) — components have x/y/w/h, ready for collision detection - Rooftop editor MVP (
rooftop_editor.py+ runtime) — proves the sprite-grid + click-to-place pipeline at small scale; we extend that to canvas-scale - All 4 click-to-* interactions (
launch / link / embed / read) — sprite walks up, then those work unchanged - Sound layer scaffold — ambient track + footstep SFX hooks ready
- Theme + bg system — each canvas already styles itself per theme
What we’re ADDING is the sprite, the walk physics, the collision flags, the camera, and the interaction-prompt overlay. ~3-4 dedicated warp rounds.
4. The 10/10 plan — every category, no exceptions
Per ~/.claude/CLAUDE.md: “Apple-quality. Would I be proud to ship
this to a harsh critic?” Tonight’s re-rate landed visual at 7.58/10
and codebase at 7.25/10. Sprint 7 ship-contract is “≥7.5 visual /
≥7.0 code” — we cleared that, but we’re not at 10/10.
The road to 10/10 has two distinct phases:
Phase 1 — Polish to 8.5+ on existing surfaces (Rounds 4-5)
This is partial-adoption debt cleanup. Substrate exists but isn’t fully used. Mechanical sweeps + small refactors. Round 4 is in flight; Round 5 finishes it.
| Category | 04-30 baseline | Phase 1 target | How |
|---|---|---|---|
| Grid + alignment | 6 | 8 | Container max-width consolidation (Round 4 slot A) |
| Typographic system | 6 | 8 | Inline-style elimination (Round 4 slot A) |
| Proportional structure | 7 | 8 | Token sweep finish (Round 4 slot A) |
| Vertical rhythm | 6 | 8 | Same — tokens consume the magic-px |
| Visual hierarchy | 8 | 9 | .settings-h3 rule + heading scale audit |
| Color discipline | 8 | 9 | One straggler #10b981 → var(--success) (Round 4 slot A) |
| Component consistency | 7 | 9 | studio-publish-modal migration + drop legacy aliases (Round 4 slot A) |
| Whitespace | 8 | 8.5 | Per-section breathing-room audit |
| No overlapping elements | 8 | 9 | Already mostly clean post-tonight’s fixes |
| Detail polish | 8 | 9 | Footer rebuild (already done tonight) + studio fixes |
| Mobile / responsive | 8 | 9 | Verify breakpoints across all new surfaces |
| Brand + first-impression | 9 | 9.5 | Hero logo addition (already done tonight) |
Codebase Phase 1 targets (Round 4 slot B + C):
| Category | 04-30 | Target | How |
|---|---|---|---|
| Error handling | 6 | 8 | 19 bare-excepts narrowed (Round 4 slot B) |
| Performance | 6 | 8 | Bundle minification fix (Round 4 slot B) |
| Type hints | 7 | 9 | Handler methods annotated (Round 4 slot B) |
| Module shape | 8 | 9 | Drop 3 tombstones (Round 4 slot C) |
| Maintainability | 7 | 8 | One studio.html JS extraction (Round 4 slot C) |
Phase 1 expected aggregate: visual ~8.5, code ~8.0. Sprint 7 ship-contract clear by a comfortable margin.
Phase 2 — Build the new vision (Rounds 6-7)
Tier gates + terminology sweep + sprite engine + character creator. This isn’t polish; it’s NEW product. Each round adds capability.
Round 5 — Vision foundations (right after Round 4 merges)
- Slot A: Update grand-plan docs (PRODUCT_SPEC.md, MANIFESTO.md, PATH_TO_LAUNCH.md, V1_5_WALKABLE_WORLD.md) with new terminology + scope shift
- Slot B: Tier-gated canvas creation (POST /canvas with tier check) + showcase distinction (per-user showcase_canvas_id field)
- Slot C: Terminology copy sweep across pages (replace “Workshop” / “Room” misuse, lock Ensemble/Studio/Canvas/Showcase naming)
Round 6 — Sprite primitive + walk engine - Slot A: Character creator UI + storage (sprite customization on first-run; per-user sprite descriptor) - Slot B: Sprite-walk engine — vanilla canvas2D, 8-direction, collision against components, camera follow - Slot C: Component interaction-radius prompt + walkable_through/solid/interactable flags + per-component metadata in canvas_schema
Round 7 — Stitch + integrate - Slot A: First-run flow — sprite creation → studio entry → walkable canvas - Slot B: Click-to-launch / link / embed / read all work via sprite proximity - Slot C: Re-rate (visual + codebase) — checkpoint on Phase 2 end-state
Phase 2 expected aggregate: visual ~9.0, code ~8.5. The sprite addition is itself a major brand + first-impression lift.
Phase 3 — Optical polish to 10/10 (Rounds 8-9)
This is where the rating doc says “the work shifts from substrate to optical.” Hand-tuned details that no token can capture. Each is small individually; the SUM is what makes the difference between 9.0 and 10/10.
Round 8 — Optical pass - Slot A: Hand-tuned aspect-ratios on every card type. Optical alignment of brand mark to baseline. Hand-set kerning on EB Garamond hero. Stagger + ease curves on grids. - Slot B: Every state designed (empty / loading / error / first-time / disabled). No defaults; everything purposeful. Microcopy review (every error message, every help text, every placeholder). - Slot C: Animation choreography — sprite walk-cycle frames hand-tuned. Door-open ease. Camera follow smoothness. Reduced-motion fallbacks for everything.
Round 9 — Final pre-freeze
- Slot A: Cross-browser smoke (Safari / Chrome / Firefox / iOS / Android). Fix anything that drifts from spec.
- Slot B: Performance pass — bundle audit, asset optimization, TTI / LCP / CLS measurement against 60fps target.
- Slot C: Final re-rate — confirm 10/10 across every category. Tag v1.0-rc1.
Phase 3 expected aggregate: visual 10/10, code 9.5+/10 (10/10 is asymptotic for code; some categories like i18n only hit 10 with a real translation effort which is post-launch).
Phase 4 — Sprint 7 launch (your manual external actions)
Per docs/operations/SPRINT_7_LAUNCH_RUNBOOK.md. CF Access + Stripe + DNS +
Sentry + uptime monitor + privacy/ToS sign-off + trusted-friend
walkthrough → public flip.
5. Estimated timeline (assuming current warp pace)
| Day | Round | Code-side | Kevin-side |
|---|---|---|---|
| 04-30 (now) | 4 | Polish to 8.3/7.7 — in flight | None |
| 05-01 | 5 | Vision docs + tier gates + terminology sweep | Read vision-revision doc + sign off |
| 05-02 | 6 | Sprite engine + character creator + collision flags | Begin §3 CF Access setup (45 min) |
| 05-03 | 7 | Stitch + integrate + re-rate | §5 Sentry + §6 Stripe (45 min) |
| 05-04 | 8 | Optical polish pass | §7 uptime + §8 privacy/ToS sign-off |
| 05-05 | 9 | Final pre-freeze + 10/10 re-rate confirm | Domain + DNS records |
| 05-06 | (freeze) | Tag v1.0-rc1; observability smoke | Friend-walkthrough setup |
| 05-07 | (rc-test) | Bug fixes only | Run trusted-friend walkthrough |
| 05-08 | 🚀 | Public flip | CF Access policy → public; announce |
~8 days from tonight to public flip at this cadence. Could slip 2-3 days if sprite-engine work hits unexpected complexity (collision math is famously tricky; cross-browser pointer events fragmenting).
6. Open questions for Kevin (before Round 5 fires)
- Pro tier canvas count. I proposed 1 showcase + 9 extras = 10 total. Want it tighter (1+4=5) or looser (1+19=20 / unlimited)?
- Showcase = the ONE public canvas, or top-N highlighted? Current model: exactly 1 showcase per creator. Could later allow Pro to have 2-3 highlighted. Lock at 1 for v1.0?
- Sprite character creator — palette size for v1.0? Tight palette (8 body × 6 hair × 8 outfit = 384 combos) keeps art budget reasonable. Or aim for “lots of freedom” with a procedural generator?
- Sprite art direction. v10w-style (warm-bronze on dark / clean line) or pixel-art (more game-like)? Locks the asset pipeline.
- Walk physics — top-down or 3/4-perspective? Top-down (like Stardew / Pokemon Red) is simpler. 3/4 (like Stardew Valley as it actually plays) feels richer. Top-down for v1.0?
- Sound — footsteps default on? With opt-out toggle, or off-by-default-with-opt-in like the ambient layer?
7. Definition of “10/10” — explicit
Because “10/10” is otherwise hand-wavy:
Visual 10/10: - Every surface looks designed, not assembled - Every state designed (empty / loading / error / first-time / disabled / hover / focus / active) - Optical alignment everywhere; hand-tuned where math doesn’t catch it - Animation purposeful, not decorative; reduced-motion respected everywhere - Mobile parity with desktop (or intentional mobile-specific designs) - Brand consistency through every page
Codebase 10/10: - 100% test coverage on critical paths (auth, persistence, payments) - All Handler methods type-annotated - Zero unjustified bare excepts - Every module has a docstring; every public function has a docstring - Observability complete — Sentry catches errors; logs are structured + redacted; metrics endpoint covers every load-bearing dimension - Performance — TTI < 1s on 4G; LCP < 2.5s; CLS < 0.1; bundle < 150KB compressed - Security — auth gate verified; CSRF on writes; rate limits on auth + creates; iframe sandboxing audited - A11y — WCAG 2.1 AA on every surface; keyboard nav complete; focus rings visible everywhere; reduced-motion honored
Brand 10/10: - Every word feels considered - Every transition feels intentional - The product has a voice you can quote
If any category is below 9.5/10 at v1.0-rc1, we don’t ship. We fix it. The bar is the bar.
8. What this doc commits to
- New terminology is locked (Ensemble / Studio / Canvas / Showcase)
- Tier limits are locked at 1+1 free / 1+9 pro (pending Kevin’s call on the 9 number)
- v1.0 scope now includes sprite-walk + character creator (was v1.5)
- 10/10 across every category before public flip — no exceptions
- ~8 days to public flip at current warp cadence (5 more rounds)
This doc is the spec the rounds execute against. If reality diverges, update this doc + announce the divergence. Don’t drift silently.