# NEO-75 — Manual QA checklist

| Field | Value |
|-------|-------|
| Key | NEO-75 |
| Title | E3: Playable gather→refine→make loop in client (E3S5-04) |
| Linear | https://linear.app/neon-sprawl/issue/NEO-75/e3-playable-gatherrefinemake-loop-in-client-e3s5-04 |
| Plan | `docs/plans/NEO-75-implementation-plan.md` |
| Branch | `NEO-75-e3-playable-gather-refine-make-loop` |

## Preconditions

- **Fresh dev player:** stop any running server, then start a new instance so in-memory **`dev-local-1`** inventory, skills, and resource-node depletion reset.
- **No Bruno/curl seeding** for this checklist — all materials come from in-client gather (**R**).
- NEO-72 inventory HUD, NEO-73 gather feedback, NEO-74 craft UI landed on the same branch or `main`.

## Material math

| Step | Action | Scrap | Plates | Result |
|------|--------|-------|--------|--------|
| Gather ×4 | **R** at four anchors (below) | **+11** | — | 11 scrap |
| Refine #1 | Craft **`refine_scrap_standard`** | −5 | +1 | 6 scrap, 1 plate |
| Refine #2 | Craft **`refine_scrap_standard`** | −5 | +1 | 1 scrap, 2 plates |
| Make | Craft **`make_field_stim_mk0`** | −1 | −2 | **`field_stim_mk0` ×1** |

## Checklist

1. Start server: `cd server/NeonSprawl.Server && dotnet run`.
2. Run Godot main scene (**F5**). Confirm **`Economy HUD`** toggle is **on**; **`InventoryLabel`** shows empty bag; **`SkillProgressionLabel`** shows **`salvage`** and **`refine`** rows.
3. **WASD** to **`prototype_resource_node_alpha`** anchor **(12, −6)**. Press **R** once. **`GatherFeedbackLabel`** shows **`+1`** scrap delta; inventory scrap updates without **I**; **`salvage`** xp increases.
4. Walk to **`prototype_subsurface_vein_beta`** **(18, −6)**; press **R** (**+2** scrap). Repeat at **`prototype_bio_mat_gamma`** **(12, 0)** (**+3**) and **`prototype_urban_bulk_delta`** **(18, 0)** (**+5**). Inventory shows **11** scrap total.
5. In the recipe panel, click **Craft** on **`refine_scrap_standard`**. **`CraftFeedbackLabel`** shows success; inventory shows **6** scrap and **1** **`refined_plate_stock`**; **`refine`** xp increases.
6. Click **Craft** on **`refine_scrap_standard`** again. Inventory shows **1** scrap and **2** plates.
7. Click **Craft** on **`make_field_stim_mk0`**. Success feedback shows **`field_stim_mk0`** output; **`InventoryLabel`** lists **`Field Stim Mk0`** (or agreed display name) with quantity **≥ 1**; **`refine`** xp increases again.
8. Uncheck **`Economy HUD`** — inventory, skills, and recipe panel hide; gather/craft feedback labels above remain visible. Check **`Economy HUD`** again — panel repopulates with current data.

## Notes

- **R** posts the **nearest in-range** `resource_node`; walk to each anchor before pressing **R** (see [NEO-73 manual QA](NEO-73.md) for anchor coords).
- Re-run this checklist after a **server restart** (nodes deplete; inventory persists only in memory).
- Combat **use** of **`field_stim_mk0`** is out of scope (E5 follow-up).

## Acceptance

- [ ] Steps 1–8 completable in one session without Bruno/curl.
- [ ] **`field_stim_mk0`** quantity **≥ 1** in inventory at step 7.
- [ ] **Salvage** xp moved after gather; **refine** xp moved after each successful craft.
