# Manual QA — NEO-40 (progression telemetry hook sites) Reference: [implementation plan](../plans/NEO-40-implementation-plan.md), [NEO-38 manual QA](./NEO-38.md) (same server surface). ## Preconditions - Same as NEO-38: run `NeonSprawl.Server` (`dotnet run` from `server/NeonSprawl.Server`; default `http://localhost:5253`). - This story adds **comments only**; behavior matches NEO-38. ```bash BASE=http://localhost:5253 ID=dev-local-1 ``` ## Verify API unchanged 1. **Grant** (same as NEO-38 happy path): ```bash curl -sS -i -X POST "${BASE}/game/players/${ID}/skill-progression" \ -H "Content-Type: application/json" \ -d '{"schemaVersion":1,"skillId":"salvage","amount":10,"sourceKind":"activity"}' ``` Expect **HTTP 200**, `granted` **true**, `progression` and `levelUps` present as before. 2. **Level-up path** (optional, same as NEO-38 bonus): large grant on `intrusion` if XP crosses the curve threshold; expect `levelUps` non-empty when a boundary is crossed. ## Code review check - Open `server/NeonSprawl.Server/Game/Skills/SkillProgressionSnapshotApi.cs` and confirm **comment blocks** mark **`xp_grant`** (after successful `TryApplyXpDelta`) and **`level_up`** (inside `nextLevel > prevLevel`), referencing **E9.M1** / no production ingest. - Confirm there are **no** new `ILogger` or metrics calls for these events.