# 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`**.
