--- description: Epics deliver playable game features — prototype backlogs must pair server + client stories; forbid Bruno-only "optional UI" deferrals. alwaysApply: true --- # Full-stack epic decomposition (CRITICAL) Neon Sprawl is a **game**, not a headless server. Prototype backlogs and epic slices must ship **Godot presentation** for every **player-visible** feature. ## When this rule applies - Writing or editing **`docs/plans/*backlog*.md`**, **`docs/plans/E*S*-client*.md`**, or **implementation slices** in **`docs/decomposition/epics/epic_*.md`** - Creating **Linear issues** during decomposition (not at ad-hoc kickoff without client counterparts) - Reviewing whether an epic/module slice is **“decomposed”** or **“prototype complete”** Reference: [decomposition README — Full-stack epics](../../docs/decomposition/README.md#full-stack-epics), [prototype backlog template](../../docs/plans/_prototype-backlog-template.md). ## Canonical pattern Mirror **Epic 1** ([E1M3-prototype-backlog](../../docs/plans/E1M3-prototype-backlog.md)): server contract story immediately followed by client HUD/wiring (e.g. NEO-23 → NEO-24). For large epics, a dedicated **client slice** file is OK ([E3S5-client-prototype-backlog.md](../../docs/plans/E3S5-client-prototype-backlog.md)) — but **client Linear issues must exist in the same decomposition pass** as server issues, with `blockedBy` links. ## Story classification | Type | Client story required? | Examples | |------|------------------------|----------| | **Infrastructure** | **No** | JSON Schema, CI gates, server catalog load, DB migrations, comment-only telemetry hooks | | **Player-visible** | **Yes** | Inventory, gather/craft, quests, zone/PvP warnings, combat telegraphs, skill/perk UI, any AC with *player*, *visible*, *HUD*, *select*, *complete*, *understand* | | **Capstone** | **Yes** | “Playable loop in Godot without Bruno” (e.g. NEO-75) | Tag **infrastructure-only** stories explicitly in the backlog so agents do not skip UI for the wrong reasons. ## Mandatory backlog contents When creating `docs/plans/E*M*-prototype-backlog.md` (copy [\_prototype-backlog-template.md](../../docs/plans/_prototype-backlog-template.md)): 1. **Server + client story tables** — every player-visible slug lists **`Client counterpart: NEO-XX`** or points to a client slice slug. 2. **Linear issues created together** — all server **and** client issues + **`blockedBy`** in one decomposition pass; label client issues **`client`** + module id (`E3.M1`, etc.). 3. **Capstone client story** — at least one issue proving the slice is **playable in Godot** (manual QA in `docs/manual-qa/{KEY}.md`), unless the entire epic slice is infrastructure-only (rare). 4. **Epic DoD updated** — prototype Definition of Done says **Godot**, not Bruno-only (see [epic_03 example](../../docs/decomposition/epics/epic_03_crafting_economy.md)). ## Forbidden language Do **not** use in backlogs or Linear descriptions for player-visible work: - “Godot HUD (**optional follow-up**)” - “for manual QA and **future client**” (without a linked **NEO-XX** client issue) - “client UI deferred” without a **created** client issue id Use **Out of scope** only for genuinely non-prototype UX (e.g. drag-drop inventory, final art pass). ## Bruno vs Godot - **Bruno** — proves HTTP contracts and server authority. - **Godot** — proves [vision prototype gates](../../neon_sprawl_vision.plan.md) (fun, readability, progression visibility). Do **not** mark a **player-facing** epic slice **complete** when only Bruno passes. ## Kickoff and implementation - **Story kickoff** for a **server** issue on a player-visible path: plan must **cross-link** the **client counterpart** Linear issue (even if not started). See [story-kickoff](story-kickoff.md). - **Manual QA** ([planning-implementation-docs](planning-implementation-docs.md)): player-visible **client** stories require `docs/manual-qa/{KEY}.md` with **Godot** steps, not API-only checks. - **Client scripts:** thin `main.gd`, HTTP client nodes — [godot-client-script-organization](godot-client-script-organization.md). ## Decomposition complete checklist Before calling an epic slice **decomposed**: - [ ] Every player-visible acceptance criterion maps to a **`client`** Linear issue - [ ] No forbidden deferral language in backlog - [ ] Capstone or client slice issue exists for playable verification - [ ] Epic / module docs and [documentation_and_implementation_alignment.md](../../docs/decomposition/modules/documentation_and_implementation_alignment.md) mention client backlog - [ ] [module_dependency_register.md](../../docs/decomposition/modules/module_dependency_register.md) note updated when issues are created ## Code review Reviewers (human or [code-review-agent](code-review-agent.md)) **should fix** or **block** claims that a **player-facing** prototype slice is done when backlog has **no client issue** or manual QA is Bruno-only.