From 32fbcec766773f13fc0e04d341d28e65eea34f4e Mon Sep 17 00:00:00 2001 From: VinPropane Date: Mon, 25 May 2026 12:14:29 -0400 Subject: [PATCH] NEO-44: Fix Bruno defeat spine for CI collection order. Reset prototype target HP before cast chain, use slot 2 to avoid cooldown pollution, and assert +25 gig XP delta from baseline. --- ...Get gig progression after defeat spine.bru | 26 ++++++++++++++----- .../gig-progression/folder.bru | 5 ++-- docs/manual-qa/NEO-44.md | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/bruno/neon-sprawl-server/gig-progression/Get gig progression after defeat spine.bru b/bruno/neon-sprawl-server/gig-progression/Get gig progression after defeat spine.bru index fedd3d2..ce5a2d4 100644 --- a/bruno/neon-sprawl-server/gig-progression/Get gig progression after defeat spine.bru +++ b/bruno/neon-sprawl-server/gig-progression/Get gig progression after defeat spine.bru @@ -5,12 +5,13 @@ meta { } docs { - NEO-44 AC spine: pre-request runs four pulse casts on prototype_target_alpha (slot 1, 3.2s between). - Asserts breach xp === 25 and salvage/refine skill xp unchanged from pre-defeat baseline. + NEO-44 AC spine: pre-request resets prototype target HP (NEO-83 fixture), then four pulse casts on alpha (slot 2 — avoids slot 0/1 cooldown from ability-cast and combat-targets folders). + Asserts breach xp increased by 25 from pre-spine baseline; salvage/refine skill xp unchanged. } script:pre-request { const axios = require("axios"); + const { resetPrototypeCombatTargets } = require("./scripts/combat-targets-reset-helper.js"); const baseUrl = bru.getEnvVar("baseUrl") || bru.getVar("baseUrl"); const playerId = bru.getEnvVar("playerId") || bru.getVar("playerId"); const jsonHeaders = { headers: { "Content-Type": "application/json" } }; @@ -26,6 +27,18 @@ script:pre-request { bru.setVar("neo44SalvageXpBefore", String(skillBefore.data.skills.find((x) => x.id === "salvage").xp)); bru.setVar("neo44RefineXpBefore", String(skillBefore.data.skills.find((x) => x.id === "refine").xp)); + const gigBefore = await axios.get( + `${baseUrl}/game/players/${playerId}/gig-progression`, + jsonHeaders, + ); + const breachBefore = gigBefore.data.gigs.find((x) => x.id === "breach"); + bru.setVar( + "neo44BreachXpBefore", + String(breachBefore?.xp ?? 0), + ); + + await resetPrototypeCombatTargets(bru); + await axios.post( `${baseUrl}/game/players/${playerId}/move`, { schemaVersion: 1, target: { x: -5, y: 0.9, z: -5 } }, @@ -36,7 +49,7 @@ script:pre-request { `${baseUrl}/game/players/${playerId}/hotbar-loadout`, { schemaVersion: 1, - slots: [{ slotIndex: 1, abilityId: "prototype_pulse" }], + slots: [{ slotIndex: 2, abilityId: "prototype_pulse" }], }, jsonHeaders, ); @@ -49,7 +62,7 @@ script:pre-request { const castBody = { schemaVersion: 1, - slotIndex: 1, + slotIndex: 2, abilityId: "prototype_pulse", targetId: "prototype_target_alpha", }; @@ -87,13 +100,14 @@ script:post-response { } tests { - test("breach gig xp is 25 after alpha defeat", function () { + test("breach gig xp increases by 25 after alpha defeat", function () { const body = res.getBody(); expect(res.getStatus()).to.equal(200); expect(body.mainGigId).to.equal("breach"); const breach = body.gigs.find((x) => x.id === "breach"); expect(breach).to.be.an("object"); - expect(breach.xp).to.equal(25); + const breachXpBefore = Number(bru.getVar("neo44BreachXpBefore")); + expect(breach.xp).to.equal(breachXpBefore + 25); expect(breach.level).to.equal(1); }); diff --git a/bruno/neon-sprawl-server/gig-progression/folder.bru b/bruno/neon-sprawl-server/gig-progression/folder.bru index 9557925..a9b58e8 100644 --- a/bruno/neon-sprawl-server/gig-progression/folder.bru +++ b/bruno/neon-sprawl-server/gig-progression/folder.bru @@ -5,6 +5,7 @@ meta { docs { NEO-44: read-only gig XP snapshot (combat defeat path — not E2.M2 skill XP). - Run order: Get gig progression → Get gig progression after defeat spine (depends on ability-cast defeat spine setup). - Cross-link: bruno/neon-sprawl-server/ability-cast/ + Run order: Get gig progression → Get gig progression after defeat spine (~13s pre-request). + Defeat spine resets prototype target HP via __dev/combat-targets-fixture (same as combat-targets folder) and uses slot 2 to avoid cooldown pollution from earlier folders. + Cross-link: bruno/neon-sprawl-server/ability-cast/ and combat-targets/ } diff --git a/docs/manual-qa/NEO-44.md b/docs/manual-qa/NEO-44.md index 70b091a..b4ae052 100644 --- a/docs/manual-qa/NEO-44.md +++ b/docs/manual-qa/NEO-44.md @@ -63,7 +63,7 @@ Fourth accept should show **`targetDefeated": true`**. Fifth cast should deny ** curl -sS "${BASE}/game/players/${ID}/gig-progression" ``` -Expect **`breach`** row **`xp` 25** (one defeat transition). +Expect **`breach`** row **`xp`** increased by **25** from the pre-spine baseline (Postgres retains prior totals across the full Bruno collection). ## 5. Verify skill XP unchanged