# NEO-122 — Manual QA checklist | Field | Value | |-------|-------| | Key | NEO-122 | | Title | E7M1-11: Client quest progress + accept HUD (Godot) | | Linear | https://linear.app/neon-sprawl/issue/NEO-122/e7m1-11-client-quest-progress-accept-hud-godot | | Plan | `docs/plans/NEO-122-implementation-plan.md` | | Branch | `NEO-122-client-quest-progress-accept-hud` | ## Preconditions - **Fresh dev player:** stop any running server, then start a new instance so in-memory quest progress resets. - **No Bruno/curl** for this checklist — accept and progress use Godot **Q** / **Shift+Q** and gameplay actions only. - NEO-119 quest-progress GET, NEO-120 accept POST, and NEO-115 quest-definitions GET landed on `main`. ## Expected quest HUD progression | After | `QuestProgressLabel` | `QuestAcceptFeedbackLabel` | |-------|----------------------|----------------------------| | Boot | All four quests **`not started`** (display names when defs loaded) | **`Quest accept: — (Q gather / Shift+Q next)`** | | **Q** accept gather | **`Intro: Salvage Run: active step 1`** | **`Quest accept: Intro: Salvage Run accepted`** | | Gather scrap (**R** on resource node ×3) | Gather objective counter increases (e.g. **`gather_intro_obj_scrap=3`**) | unchanged | | Gather quest completes | **`Intro: Salvage Run: completed`** | unchanged | | **Shift+Q** accept refine (after gather complete) | **`Intro: Refine Stock: active step 1`** | **`Quest accept: Intro: Refine Stock accepted`** | | Craft **`refine_scrap_standard`** (Economy HUD) | Refine quest completes when recipe succeeds | unchanged | | Duplicate **Q** on gather | Gather row stays **`completed`** | **`Quest accept: denied — already_completed`** (or **`already_active`**) | ## Checklist 1. Start server: `cd server/NeonSprawl.Server && dotnet run`. 2. Run Godot main scene (**F5**). Confirm **`QuestProgressLabel`** shows four **`not started`** lines and **`QuestAcceptFeedbackLabel`** shows the idle hint (in **`HudRootScroll`**, below encounter loot labels). Economy panel pinned bottom-left (not off-screen). 3. Press **Q**. Verify gather intro becomes **`active step 1`** and accept feedback shows success. 4. Gather scrap until gather quest completes (resource node **R**). Verify counter updates on **`QuestProgressLabel`** after each successful gather (may lag one GET). 5. Press **Shift+Q** before gather is complete — verify **`Quest accept: denied — prerequisite_incomplete`** for refine (or **`no eligible quest`** if refine is not yet eligible). 6. After gather completes, press **Shift+Q**. Verify refine quest becomes **`active`**. 7. Open **Economy HUD** recipe panel — **Refine Scrap (Standard)** is the **first** row (scroll starts at top). Craft when **≥5** scrap in bag. 8. Craft **`refine_scrap_standard`** with Economy HUD open. Verify refine quest **`completed`** after successful craft. 9. Press **Q** again on already-completed gather. Verify deny feedback on **`QuestAcceptFeedbackLabel`** without Bruno. 10. Optional: stop server while Godot running, press **Q** — verify **`Quests: error — …`** or **`Quest accept: failed — …`** visible on HUD. 11. Optional: block **`GET /game/world/quest-definitions`** only while progress GET succeeds — verify **`definitions error — …`** under **`QuestProgressLabel`** with raw quest ids as fallback. 12. Toggle **Economy HUD** off/on — debug labels in **`HudRootScroll`** remain; recipe repopulate + scroll reset still works. ## Notes - Combat intro (**`prototype_quest_combat_intro`**) has no prerequisites — **Shift+Q** may offer it before refine if gather is still active; server deny is authoritative when prerequisites block accept. - Full four-quest chain capstone: [NEO-123 manual QA](NEO-123.md). - Encounter progress HUD regression: [NEO-110 manual QA](NEO-110.md). ## Acceptance - [ ] Steps 1–9 completable in one session without Bruno/curl. - [ ] Quest status visible after **Q** accept and updates after gather/craft without manual refresh key. - [ ] Failed GET/accept shows visible HUD error copy. - [ ] Economy HUD craft panel visible for step 7–8 (recipes first row, no overlap with quest labels).