# NEO-110 — Manual QA checklist | Field | Value | |-------|-------| | Key | NEO-110 | | Title | E5M3-11: Client encounter progress + loot feedback HUD | | Linear | https://linear.app/neon-sprawl/issue/NEO-110/e5m3-11-client-encounter-progress-loot-feedback-hud | | Plan | `docs/plans/NEO-110-implementation-plan.md` | | Branch | `NEO-110-client-encounter-progress-loot-feedback-hud` | ## Preconditions - **Fresh dev player:** stop any running server, then start a new instance so in-memory encounter progress, NPC HP, and inventory reset. - **No Bruno/curl** for this checklist — defeat chain uses Godot **Tab** + **1** only. - NEO-108 encounter-progress GET and NEO-106 combat wiring landed on `main`. - **`Economy HUD`** toggle **on** for inventory verification (step 8). ## Archetype reference (defeat order flexible) | Archetype | Instance id | Marker | Pulses to defeat | |-----------|-------------|--------|------------------| | Melee | `prototype_npc_melee` | orange west **`(-3, -3)`** | 4 | | Ranged | `prototype_npc_ranged` | purple SE **`(3, 3)`** | 4 | | Elite | `prototype_npc_elite` | gold origin **`(0, 0)`** | 8 | Player casts **`prototype_pulse`** (**25** damage, ~**3 s** cooldown). ## Expected encounter HUD progression | After | `EncounterProgressLabel` | `EncounterCompleteLabel` | |-------|--------------------------|---------------------------| | Boot (no engagement) | `prototype_combat_pocket: not started (0/3)` | `Loot: —` | | 1st NPC defeated | `prototype_combat_pocket: 1/3` | `Loot: —` | | 2nd NPC defeated | `prototype_combat_pocket: 2/3` | `Loot: —` | | 3rd NPC defeated | `prototype_combat_pocket: completed (3/3)` | `scrap_metal_bulk ×10` and `contract_handoff_token ×1` (display names when item defs loaded) | ## Checklist 1. Start server: `cd server/NeonSprawl.Server && dotnet run`. 2. Run Godot main scene (**F5**). Confirm boot lines: **`Encounter: … not started (0/3)`** and **`Loot: —`** on **`EncounterProgressLabel`** / **`EncounterCompleteLabel`** (in **`HudRootScroll`**, below **`PlayerCombatHpLabel`**). Scroll **`HudRootScroll`** if the debug stack is taller than the viewport. 3. Defeat **`prototype_npc_melee`**: walk to orange marker, **Tab** lock, press **1** until **`Cast: … — defeated!`**. Verify **`EncounterProgressLabel`** shows **`1/3`** (may lag one GET behind cast — wait ~1 s or defeat next NPC). 4. Defeat **`prototype_npc_ranged`**: lock at SE marker, cast until defeated. Verify **`2/3`**. 5. Defeat **`prototype_npc_elite`**: lock at origin, cast until defeated (**8** pulses). Verify **`completed (3/3)`** and **`EncounterCompleteLabel`** lists **`scrap_metal_bulk ×10`** and **`contract_handoff_token ×1`** (or raw ids if defs still loading). 6. Open **`Economy HUD`** body: **`InventoryLabel`** shows **`scrap_metal_bulk`** and **`contract_handoff_token`** without pressing **I** (auto-refresh on completion GET). 7. Defeat any already-defeated NPC again (optional): encounter row stays **`completed (3/3)`**; loot lines unchanged. 8. Regression: **`GigXpLabel`** still updates per defeat (NEO-86); **`CastFeedbackLabel`** still shows deny on re-cast (**`target_defeated`**). ## Notes - Defeat order may differ from table — server tracks order-independent subset; count is **`defeatedTargetIds.size()`**. - Capstone baseline prefers **server restart** over mid-session fixture POST. - Full three-NPC loop + idempotency capstone: [NEO-111 manual QA](NEO-111.md). - Component combat regression: [NEO-98 manual QA](NEO-98.md). ## Acceptance - [ ] Steps 1–8 completable in one session without Bruno/curl. - [ ] Progress label shows **1/3**, **2/3**, then **completed (3/3)** after defeats. - [ ] Loot label matches server grant summary; inventory reflects grants without **I**.