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