neon-sprawl/docs/manual-qa/NEO-153.md

47 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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