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.
pull/118/head
VinPropane 2026-05-25 12:14:29 -04:00
parent 9d9b53332f
commit 32fbcec766
3 changed files with 24 additions and 9 deletions

View File

@ -5,12 +5,13 @@ meta {
} }
docs { docs {
NEO-44 AC spine: pre-request runs four pulse casts on prototype_target_alpha (slot 1, 3.2s between). 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 === 25 and salvage/refine skill xp unchanged from pre-defeat baseline. Asserts breach xp increased by 25 from pre-spine baseline; salvage/refine skill xp unchanged.
} }
script:pre-request { script:pre-request {
const axios = require("axios"); const axios = require("axios");
const { resetPrototypeCombatTargets } = require("./scripts/combat-targets-reset-helper.js");
const baseUrl = bru.getEnvVar("baseUrl") || bru.getVar("baseUrl"); const baseUrl = bru.getEnvVar("baseUrl") || bru.getVar("baseUrl");
const playerId = bru.getEnvVar("playerId") || bru.getVar("playerId"); const playerId = bru.getEnvVar("playerId") || bru.getVar("playerId");
const jsonHeaders = { headers: { "Content-Type": "application/json" } }; 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("neo44SalvageXpBefore", String(skillBefore.data.skills.find((x) => x.id === "salvage").xp));
bru.setVar("neo44RefineXpBefore", String(skillBefore.data.skills.find((x) => x.id === "refine").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( await axios.post(
`${baseUrl}/game/players/${playerId}/move`, `${baseUrl}/game/players/${playerId}/move`,
{ schemaVersion: 1, target: { x: -5, y: 0.9, z: -5 } }, { schemaVersion: 1, target: { x: -5, y: 0.9, z: -5 } },
@ -36,7 +49,7 @@ script:pre-request {
`${baseUrl}/game/players/${playerId}/hotbar-loadout`, `${baseUrl}/game/players/${playerId}/hotbar-loadout`,
{ {
schemaVersion: 1, schemaVersion: 1,
slots: [{ slotIndex: 1, abilityId: "prototype_pulse" }], slots: [{ slotIndex: 2, abilityId: "prototype_pulse" }],
}, },
jsonHeaders, jsonHeaders,
); );
@ -49,7 +62,7 @@ script:pre-request {
const castBody = { const castBody = {
schemaVersion: 1, schemaVersion: 1,
slotIndex: 1, slotIndex: 2,
abilityId: "prototype_pulse", abilityId: "prototype_pulse",
targetId: "prototype_target_alpha", targetId: "prototype_target_alpha",
}; };
@ -87,13 +100,14 @@ script:post-response {
} }
tests { 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(); const body = res.getBody();
expect(res.getStatus()).to.equal(200); expect(res.getStatus()).to.equal(200);
expect(body.mainGigId).to.equal("breach"); expect(body.mainGigId).to.equal("breach");
const breach = body.gigs.find((x) => x.id === "breach"); const breach = body.gigs.find((x) => x.id === "breach");
expect(breach).to.be.an("object"); 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); expect(breach.level).to.equal(1);
}); });

View File

@ -5,6 +5,7 @@ meta {
docs { docs {
NEO-44: read-only gig XP snapshot (combat defeat path — not E2.M2 skill XP). 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). Run order: Get gig progression → Get gig progression after defeat spine (~13s pre-request).
Cross-link: bruno/neon-sprawl-server/ability-cast/ 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/
} }

View File

@ -63,7 +63,7 @@ Fourth accept should show **`targetDefeated": true`**. Fifth cast should deny **
curl -sS "${BASE}/game/players/${ID}/gig-progression" 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 ## 5. Verify skill XP unchanged