# NEO-72 — Manual QA checklist

| Field | Value |
|-------|-------|
| Key | NEO-72 |
| Title | E3.M3: Client inventory snapshot HUD (E3S5-01) |
| Linear | https://linear.app/neon-sprawl/issue/NEO-72/e3m3-client-inventory-snapshot-hud-e3s5-01 |
| Plan | `docs/plans/NEO-72-implementation-plan.md` |
| Branch | `NEO-72-client-inventory-snapshot-hud` |

## Preconditions

- Server running with default dev player (`dev-local-1`) and item catalog loaded (NEO-51–NEO-55 on `main`).

## Checklist

1. Start server: `cd server/NeonSprawl.Server && dotnet run`.
2. Run Godot main scene (**F5**). **`InventoryLabel`** (below cooldown HUD) shows **`Inventory: (refresh: I)`**, **`Bag: (empty)`**, and **`Equipment:`** / **`slot 0: — empty`** on a fresh dev player.
3. Seed inventory via Bruno or curl:

   ```bash
   curl -sS -X POST "http://localhost:5253/game/players/dev-local-1/inventory" \
     -H "Content-Type: application/json" \
     -d '{"schemaVersion":1,"mutationKind":"add","itemId":"scrap_metal_bulk","quantity":5}'
   ```

4. Press **`I`** (or **`inventory_refresh`**). HUD lists occupied bag slot with **`Scrap Metal (Bulk) x5`** (display name from NEO-53 defs).
5. Stop the server; press **`I`**. HUD shows **`error — …`** and Output shows **`InventoryClient:`** **`push_warning`**.
6. Restart server; press **`I`** again — HUD returns to synced inventory lines.

## Notes

- **`I`** is handled in **`main.gd`** **`_unhandled_key_input`** (same reliability pattern as **E** / **R** interact keys).
- POST inventory mutations from UI are out of scope; use Bruno/curl to seed stock for this story.
