# Manual QA — NEO-63 (gather via interact → inventory) Reference: [implementation plan](../plans/NEO-63-implementation-plan.md), [NEO-62 implementation plan](../plans/NEO-62-implementation-plan.md) gather engine, [NEO-55](./NEO-55.md) inventory GET. ## Preconditions - Run `NeonSprawl.Server` from `server/NeonSprawl.Server` (`dotnet run`; default `http://localhost:5253`). - Player **`dev-local-1`** (default seed). ```bash BASE=http://localhost:5253 ID=dev-local-1 ``` ## Happy path — gather → inventory + XP Move in range of **`prototype_resource_node_alpha`** (anchor **12, −6**; stand at **10, −6**): ```bash curl -sS -i -X POST "${BASE}/game/players/${ID}/move" \ -H "Content-Type: application/json" \ -d '{"schemaVersion":1,"target":{"x":10,"y":0.9,"z":-6}}' ``` Interact: ```bash curl -sS -i -X POST "${BASE}/game/players/${ID}/interact" \ -H "Content-Type: application/json" \ -d '{"schemaVersion":1,"interactableId":"prototype_resource_node_alpha"}' ``` Expect **HTTP 200**, **`allowed`:** **true**. Inventory should show **`scrap_metal_bulk`** quantity **1** (or +1 per repeat): ```bash curl -sS "${BASE}/game/players/${ID}/inventory" ``` Skill progression should show **`salvage`** **`xp`** **+10** per successful gather: ```bash curl -sS "${BASE}/game/players/${ID}/skill-progression" ``` ## Depletion deny Uses **`prototype_urban_bulk_delta`** (anchor **18, 0**) so earlier Bruno interaction requests on alpha do not pre-deplete capacity in the shared CI Postgres store. Move in range (**16, 0**), exhaust with **10** successful interacts on delta, then interact again: ```bash curl -sS -i -X POST "${BASE}/game/players/${ID}/move" \ -H "Content-Type: application/json" \ -d '{"schemaVersion":1,"target":{"x":16,"y":0.9,"z":0}}' ``` (Repeat interact on **`prototype_urban_bulk_delta`** ten times with **`allowed: true`**, then:) ```bash curl -sS -i -X POST "${BASE}/game/players/${ID}/interact" \ -H "Content-Type: application/json" \ -d '{"schemaVersion":1,"interactableId":"prototype_urban_bulk_delta"}' ``` Expect **HTTP 200**, **`allowed`:** **false**, **`reasonCode`:** **`node_depleted`**. Inventory and XP totals unchanged on that denied request. ## Control — terminal Move near **`prototype_terminal`**, interact with **`prototype_terminal`**: **`allowed`:** **true**; no **`scrap_metal_bulk`** added; no gather XP from terminal alone. ## Bruno Run folder `bruno/neon-sprawl-server/interaction/` — **`Post interact gather then get inventory.bru`** and **`Post interact depleted node deny.bru`**.