7.6 KiB
NEO-143 — Manual QA checklist
| Field | Value |
|---|---|
| Key | NEO-143 |
| Title | E7M3-11: Playable faction reputation + gate capstone (Godot) |
| Linear | https://linear.app/neon-sprawl/issue/NEO-143/e7m3-11-playable-faction-reputation-gate-capstone-godot |
| Plan | docs/plans/NEO-143-implementation-plan.md |
| Branch | NEO-143-playable-faction-reputation-gate-capstone |
Preconditions
- Fresh dev player: stop any running server, then start a new instance so in-memory quest progress, faction standing,
IRewardDeliveryStore, inventory, skill progression, encounter progress, NPC HP, and resource-node depletion reset. - No Bruno/curl for this checklist — accept uses Q / Shift+Q; gameplay uses R, Tab + 1, and Economy HUD Craft buttons only.
- NEO-133–NEO-142 faction spine and NEO-132 reward capstone landed on
main. Economy HUDtoggle on for inventory + skill verification.
Faction + quest freeze (E7M3-01)
| Quest id | Display name | Rep grant on completion | Expected standing after |
|---|---|---|---|
prototype_quest_operator_chain |
Operator Chain | Grid Operators +15 (plus item/skill bundle — see NEO-132) | Grid Operators 15, Rust Collective 0 |
prototype_quest_grid_contract |
Grid Contract | Rust Collective +10 | Grid Operators 15, Rust Collective 10 |
Gate (component QA — not main capstone path): accept prototype_quest_grid_contract at Grid Operators standing 0 with operator-chain prerequisite met ⇒ faction_gate_blocked with readable copy. Verified in NEO-142 GdUnit (client/test/faction_standing_hud_test.gd) and optional dev fixture — organic Godot gameplay grants +15 on operator-chain completion, so live capstone accept succeeds at standing 15.
Quest roster (five ids, catalog order)
| Quest id | Display name |
|---|---|
prototype_quest_combat_intro |
Intro: Clear the Pocket |
prototype_quest_gather_intro |
Intro: Salvage Run |
prototype_quest_grid_contract |
Grid Contract |
prototype_quest_operator_chain |
Operator Chain |
prototype_quest_refine_intro |
Intro: Refine Stock |
Shift+Q after operator chain: only prototype_quest_grid_contract is eligible (not_started, prerequisite completed). Grid contract has one step — inventory_has_item survey_drone_kit ×1 — satisfied from operator-chain reward; expect completed immediately on accept (no extra player action).
Expected HUD progression
| Phase | FactionStandingLabel |
QuestProgressLabel |
QuestRewardDeliveryLabel |
|---|---|---|---|
| Boot | Grid Operators 0, Rust Collective 0 | Five quests not started |
Quest rewards: / — |
Operator chain completed |
Grid Operators 15, Rust Collective 0 | Four intros + operator chain completed; grid contract not started |
Operator chain grants + Grid Operators +15 rep |
Grid contract completed |
Grid Operators 15, Rust Collective 10 | All five completed |
Grid Contract + Rust Collective +10 rep |
| Godot restart | Unchanged | All five still completed |
— (transition-only) |
| Duplicate accepts | Unchanged | Unchanged | Unchanged |
Checklist
Follow NEO-132 steps 1–19 for the four-quest reward path (accept order, anchors, material math, reward + economy verification through operator chain). Extend with faction + fifth-quest steps below.
Boot (faction baseline)
- Start server:
cd server/NeonSprawl.Server && dotnet run. - Run Godot main scene (F5). Confirm
FactionStandingLabelshowsGrid Operators: 0,Rust Collective: 0;QuestProgressLabellists five quests allnot started.
Slice 2 reward path (inherit NEO-132)
- Complete NEO-132 steps 3–19 — four intros + operator chain with reward/economy checks at each completion.
Faction standing after operator chain
- Verify
FactionStandingLabel:Grid Operators: 15,Rust Collective: 0— may lag reward label rep line by one faction-standing GET round-trip; confirm both within a moment after operator-chain completion. - Verify
QuestRewardDeliveryLabelon operator-chain completion includesGrid Operators +15 rep(alongside item/skill lines). - Verify
InventoryLabelstill listssurvey_drone_kit. - Verify
QuestProgressLabel: grid contractnot started; four prior questscompleted.
Grid contract accept + complete (faction-gated success path)
- Press Shift+Q to accept
prototype_quest_grid_contract. VerifyQuestAcceptFeedbackLabelshows accept success (notfaction_gate_blocked). - Verify
Grid Contract: completedonQuestProgressLabel(instant complete — kit already held). - Verify
QuestRewardDeliveryLabel:Grid Contract+Rust Collective +10 rep. - Verify
FactionStandingLabel:Rust Collective: 10(Grid Operators still 15).
Capstone snapshot (record for idempotency)
- Record final state:
FactionStandingLabel: Grid Operators 15, Rust Collective 10QuestProgressLabel: all five questscompletedSkillProgressionLabel/InventoryLabel: match NEO-132 step 20 totals
Idempotency (no duplicate rep delivery)
- Godot restart: stop Godot (Shift+F5); F5 again without stopping the server.
- Verify all five quests still
completed;QuestRewardDeliveryLabelis—(transition-only). - Verify
FactionStandingLabelcounts match step 12 exactly. - Press Shift+Q. Verify
Quest accept: no eligible quest(or equivalent deny). - Verify faction standing and economy HUD counts still match step 12 — no duplicate rep grants.
Regression
- Component faction HUD + gate deny: NEO-142 manual QA (GdUnit gate deny; optional dev fixture).
- Slice 2 reward idempotency: NEO-132 manual QA.
- Slice 1 onboarding chain: NEO-123 manual QA.
Server AC (optional — not Godot gameplay)
cd /path/to/neon-sprawl && dotnet test NeonSprawl.sln \
--filter "FullyQualifiedName~ReputationOperationsTests|FullyQualifiedName~FactionGateOperationsTests|FullyQualifiedName~RewardRouterOperationsTests"
Expect all pass — auditable ReputationDelta apply + fail-closed gate evaluation. Content CI (scripts/validate_content.py) and server startup catalog cross-ref deny unknown faction ids at load (tamper fail-closed).
Notes
- Gate deny is not exercised on the main capstone success path — see NEO-142 step 6.
- Rep grants apply on quest completion, not accept; faction standing refreshes after in-session completion transition (NEO-142).
- Epic 7 Slice 3 AC: reputation deltas auditable; gates fail closed on tamper (epic_07 Slice 3).
Acceptance
- Steps 1–17 completable in one session without Bruno/curl.
- Operator chain grants Grid Operators +15; grid contract grants Rust Collective +10 — visible on HUD.
- Faction-gated grid contract accept succeeds at standing 15 and completes with kit in bag.
- Godot restart + duplicate accepts leave faction standing unchanged (no double-claim).
- Epic 7 Slice 3 AC satisfied in Godot (gate deny regression via NEO-142; server AC via automated tests).