2.0 KiB
2.0 KiB
NEO-30 — Manual QA checklist
| Field | Value |
|---|---|
| Key | NEO-30 |
| Title | E1M4-05: Slice 3 telemetry hooks for cast funnel |
| Linear | https://linear.app/neon-sprawl/issue/NEO-30/e1m4-05-slice-3-telemetry-hooks-for-cast-funnel |
| Plan | docs/plans/NEO-30-implementation-plan.md |
| Branch | NEO-30-cast-funnel-telemetry-hooks |
1) Code / docs sanity
- Open
server/NeonSprawl.Server/Game/AbilityInput/AbilityCastApi.csand confirm NEO-30 comments markability_cast_deniedon each JSON deny return andability_cast_requestedon the final accept return; each deny branch notes TODO(E9.M1). - Confirm 400 / 404 early returns are documented as not Slice 3
ability_cast_deniedJSON paths. - Skim
docs/decomposition/modules/E1_M4_AbilityInputScaffold.md— snapshot mentions NEO-30 hook file paths; E1M4-05 row links to Linear NEO-30.
2) Client hook vocabulary (regression with NEO-31 / NEO-28)
- With server running and slot 0 bound to
prototype_pulse, Tab lock alpha, press 1: Godot Output line starts withability_cast_requestedand includesslot=0,ability_id=prototype_pulse,targetId=consistent with HUD lock. - Optional (server stdout): same scenario with
NEON_SPRAWL_API_LOG=1(see server README — Run) — server console shows[ability-cast] ability_cast_requestedfor that accept (Slice 3 hook name alignment). - Without lock (or wrong target), press 1:
CastFeedbackLabelshowsability_cast_denied: …with a non-empty reason; Output warning includesability_cast_deniedandreasonCode=(seedocs/manual-qa/NEO-28.mdfor concrete cases).
3) Server JSON deny (reason non-empty)
curlor Bruno: provoke a 200 deny (e.g.loadout_mismatchperdocs/manual-qa/NEO-31.md) — response JSON hasaccepted": falseand a non-emptyreasonCode.