47 lines
3.2 KiB
Markdown
47 lines
3.2 KiB
Markdown
# 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.
|