# NEO-153 — Manual QA checklist | Field | Value | |-------|-------| | Key | NEO-153 | | Title | E7M4-10: Client contract issue + progress HUD (Godot) | | Linear | https://linear.app/neon-sprawl/issue/NEO-153/e7m4-10-client-contract-issue-progress-hud-godot | | Plan | `docs/plans/NEO-153-implementation-plan.md` | | Branch | `NEO-153-e7m4-10-client-contract-issue-progress-hud-godot` | ## Preconditions - **Fresh dev player:** restart server so contract instance state is clean (or use dev fixture reset if a prior contract exists). - **Server deps:** NEO-151 **`POST …/contracts/issue`** and **`GET …/contracts`** on `main`. - **No Bruno/curl** for this checklist — issue and progress use Godot **Shift+C** and combat pocket clear only. ## Expected contract HUD progression | After | `ContractActiveLabel` | `ContractIssueFeedbackLabel` | `ContractRewardDeliveryLabel` | |-------|----------------------|------------------------------|-------------------------------| | Boot | **`Contract: —`** | **`Contract issue: — (Shift+C prototype)`** | **`Contract rewards: —`** | | **Shift+C** issue | **`Clear Combat Pocket (Repeat): active — objective prototype_combat_pocket`** | **`Contract issue: Clear Combat Pocket (Repeat) issued`** | **`—`** | | Defeat ×3 NPCs (combat pocket) | **`…: completed — objective prototype_combat_pocket`** | unchanged | **`scrap_metal_bulk ×5`** + **`Salvage +15 XP`** (display names when item defs loaded) | | Duplicate **Shift+C** while active | unchanged active line | **`Contract issue: denied — active contract already issued`** | unchanged | ## Checklist 1. Start server: `cd server/NeonSprawl.Server && dotnet run`. 2. Run Godot main scene (**F5**). Confirm contract labels appear in **`HudRootScroll`** below quest reward labels. 3. Press **Shift+C**. Verify **`ContractActiveLabel`** shows **`active`** with **`prototype_combat_pocket`** objective id and issue feedback shows success. 4. Defeat all three combat pocket NPCs (hotbar casts). Verify encounter **`completed (3/3)`** and contract GET refresh shows **`completed`** on **`ContractActiveLabel`**. 5. Verify **`ContractRewardDeliveryLabel`** lists contract completion grants (**`scrap_metal_bulk ×5`**, **`Salvage +15 XP`**) after pocket clear — not on boot alone. 6. Press **Shift+C** again while contract still active (before clear) or after issuing once — verify readable deny when **`active_contract_exists`**. 7. Optional: stop server while Godot running, press **Shift+C** — verify **`Contract: error — …`** or **`Contract issue: failed — …`** on HUD. ## Notes - Prototype flow is **issue then clear** the bound encounter. Issuing after the pocket is already cleared leaves the contract **`active`** until a future matching clear (NEO-149 v1 edge case). - Fixed seed **`prototype_contract_dev_seed`** — repeat re-issue after complete requires **NEO-154** capstone (seed rotation / fixture reset). - Encounter + quest HUD regression: [NEO-110 manual QA](NEO-110.md), [NEO-122 manual QA](NEO-122.md). ## Acceptance - [ ] Steps 1–5 completable in one session without Bruno/curl. - [ ] Active contract shows encounter objective id after **Shift+C** issue. - [ ] Completed contract shows reward summary line on HUD after pocket clear.