6.7 KiB
E1.M4 — Prototype story backlog (AbilityInputScaffold)
Working backlog for Epic 1 — Slice 3 (interaction, targeting, ability input). Decomposition and contracts: E1.M4 — AbilityInputScaffold.
Labels (Linear): every issue E1.M4; add Epic 1 / Slice 3 as your team prefers.
Precursor (do not re-scope): selection and targeting authority live in E1.M3 (E1.M3 module); combat accept/deny remains authoritative in E5.M1.
Linear issues (created): attach docs/plans/NEO-*-implementation-plan.md on the same branch as implementation work.
| Slug | Linear |
|---|---|
| E1M4-01 | NEO-29 |
| E1M4-02 | NEO-31 |
| E1M4-03 | NEO-28 |
| E1M4-04 | NEO-32 |
| E1M4-05 | NEO-30 |
Dependency graph in Linear: E1M4-02 blocked by E1M4-01. E1M4-03 blocked by E1M4-02 and minimum E5.M1 accept/deny response contract. E1M4-04 blocked by E1M4-03. E1M4-05 blocked by E1M4-02 and E1M4-03.
Story order (recommended)
| Order | Slug | Depends on |
|---|---|---|
| 1 | E1M4-01 | E1.M3 target lock shape, existing prototype auth/session APIs |
| 2 | E1M4-02 | E1M4-01, E1.M3 target selection flow |
| 3 | E1M4-03 | E1M4-02, E5.M1 accept/deny contract |
| 4 | E1M4-04 | E1M4-03 |
| 5 | E1M4-05 | E1M4-02, E1M4-03 |
E1M4-01 — HotbarLoadout v1 contract + baseline persistence path
Goal: Define a versioned HotbarLoadout shape and minimal server-owned read/write flow so clients can bind slots and recover the same loadout on reconnect.
In scope
- Server DTO/API surface (prototype JSON v1) for loadout fetch/update with explicit slot index and ability id fields.
- Client load/apply path for initial hotbar hydration.
- Validation for slot bounds and unknown ability ids with non-empty reason codes on deny.
Out of scope
- Final account-vs-character policy hardening beyond a documented prototype choice.
- Cooldown timing and cast execution.
Acceptance criteria
- A player can bind at least two slots and retrieve the same bindings after reconnect/reload.
- Invalid slot/ability input is rejected with a stable machine-readable reason code.
- Module docs and per-story implementation plan describe the chosen prototype persistence policy.
E1M4-02 — Input to AbilityCastRequest path (hotbar activation)
Goal: Wire hotbar input to a real AbilityCastRequest payload that includes selected target context from E1.M3.
In scope
- Client input binding (slot key or click) to request emission.
- Request payload includes at least slot, ability id, and selected target id (if any).
- Integration tests or harness coverage for request formation and send triggers.
Out of scope
- Final combat resolution semantics and cooldown rendering.
Acceptance criteria
- Pressing a bound slot emits one cast request with expected payload fields.
- Request target context uses last acknowledged target state (not camera-only local guess).
- Unbound slots do not emit requests and expose clear local feedback/logging.
E1M4-03 — Combat accept/deny integration + reason-code UX
Goal: Consume authoritative cast accept/deny responses from E5.M1 and reconcile client presentation when casts are rejected.
In scope
- Handle accept and deny responses in the cast path.
- Surface deny reasons in agreed prototype UX surface (debug panel, toast, or combat log).
- Reconcile optimistic UI state on deny.
Out of scope
- Rich final combat feedback package and VFX.
Acceptance criteria
- Denied casts render a player-visible reason path for at least
invalid_targetandout_of_range. - Successful casts transition to post-request state without conflicting local rollback behavior.
- Denial contract and reason list are documented in plan/module docs to prevent drift.
E1M4-04 — CooldownSnapshot sync + slot presentation
Goal: Add cooldown snapshot contract and hook slot presentation to server cooldown truth.
In scope
- Define
CooldownSnapshotprototype fields and source route/update mechanism. - Update hotbar slot state (ready, cooling down, remaining time display or indicator).
- Gate repeated cast attempts during active cooldown with synchronized behavior.
Out of scope
- Final polished animation treatments for cooldown visuals.
Acceptance criteria
- After a successful cast, affected slot shows cooling state until cooldown completes.
- Client cannot repeatedly fire a cooling ability without receiving deny/guard behavior.
- Cooldown UI recovers correctly after reconnect by rehydrating snapshot state.
E1M4-05 — Slice 3 telemetry hooks for cast funnel
Goal: Complete Slice 3 telemetry hook sites for ability_cast_requested and ability_cast_denied with reason metadata and TODO alignment for E9.M1 schema.
In scope
- Add/verify hook locations in client/server cast flow for requested/denied events.
- Include payload notes for ability id, slot id, target context, and deny reason.
- Document temporary
TODO(E9.M1)status where catalog/schema integration is pending.
Out of scope
- Production telemetry ingest pipelines, dashboards, and retention policy work.
Acceptance criteria
- Hook names match Epic 1 Slice 3 telemetry vocabulary.
- Denied cast hook carries a non-empty reason code.
- Module docs reference where hooks are emitted and what remains deferred to E9.M1.
After this backlog
- Track delivery in the created Linear issues and keep dependency links synchronized if scope changes.
- For each issue kickoff, add
docs/plans/{NEO-XX}-implementation-plan.mdand keep decisions synchronized during implementation. - Add
docs/manual-qa/{NEO-XX}.mdfor user-visible stories when implementation lands.