NEO-110 — Manual QA checklist
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
- Start server:
cd server/NeonSprawl.Server && dotnet run.
- Run Godot main scene (F5). Confirm boot lines:
Encounter: … not started (0/3) and Loot: — on EncounterProgressLabel / EncounterCompleteLabel (combat HUD block, below PlayerCombatHpLabel).
- 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).
- Defeat
prototype_npc_ranged: lock at SE marker, cast until defeated. Verify 2/3.
- 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).
- Open
Economy HUD body: InventoryLabel shows scrap_metal_bulk and contract_handoff_token without pressing I (auto-refresh on completion GET).
- Defeat any already-defeated NPC again (optional): encounter row stays
completed (3/3); loot lines unchanged.
- 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.
- Component combat regression: NEO-98 manual QA.
Acceptance