# Manual QA — NEO-56 (inventory telemetry hook sites)

Reference: [implementation plan](../plans/NEO-56-implementation-plan.md), [NEO-54 implementation plan](../plans/NEO-54-implementation-plan.md) (inventory engine), [NEO-55 implementation plan](../plans/NEO-55-implementation-plan.md) (inventory HTTP).

## Preconditions

- Run `NeonSprawl.Server` (`dotnet run` from `server/NeonSprawl.Server`; default `http://localhost:5253`) if exercising Bruno; not required for code review only.
- This story adds **comments only**; inventory behavior matches NEO-54/NEO-55.

## Code review check

- [ ] Open `server/NeonSprawl.Server/Game/Items/PlayerInventoryOperations.cs`.
- [ ] **`TryAddStack`:** confirm **`item_created`** comment block immediately before **`Applied`** return (successful add only).
- [ ] **`TryAddStack` / `TryRemoveStack`:** confirm **`inventory_transfer_denied`** hook on post-mutation **`Denied`** returns (`inventory_full`, `insufficient_quantity`).
- [ ] **`Deny`:** confirm **`inventory_transfer_denied`** hook covers early validation denies (`invalid_quantity`, `invalid_item`).
- [ ] Confirm **`TODO(E9.M1)`** markers and planned payload fields; **no** new `ILogger` or metrics calls.
- [ ] Confirm **no** duplicate hook comments in `PlayerInventoryApi.cs`.
- [ ] Open `PlayerInventoryReasonCodes.cs` — summary cross-references NEO-56 hook anchor.
- [ ] Open [server README — Player inventory (NEO-54 store, NEO-55 HTTP)](../../server/README.md#player-inventory-neo-54-store-neo-55-http) — NEO-56 telemetry subsection present.

## Regression (optional)

```bash
cd server && dotnet test NeonSprawl.sln
```

Expect all tests pass (comments-only change).

## Bruno (optional sanity)

From `bruno/neon-sprawl-server/inventory/` against a running server:

- **Get inventory** — 200 empty grid for `dev-local-1`.
- **Post inventory add** — `applied: true` unchanged.
- **Post inventory add deny invalid item** — `applied: false`, `reasonCode: invalid_item` unchanged.
