test(audit): #408 无头浏览器审计伪造击杀与掉落,未走真实掉落管线 #449

Closed
opened 2026-09-24 12:34:52 +00:00 by troytt · 0 comments
Owner

问题

scripts/verify-ground-combat-browser.ts 第 266–286 行:

target.hp = 0; target.state = 'dead'; target.dropRolled = true;
engine.metrics.dropsRolled = preDrops + 1;
const swordItem = { code: 'ssd', ... }   // 手工构造
engine.dropItem(swordItem, ...); engine.dropGold(150, ...)

直接改怪物状态、手工塞一把短剑和 150 金币,完全绕过 damageMonster → kill event → engine.tick → executeDropPipeline → groundItems.add。因此 #408 报告的"8 stages 全绿"不能证明真实掉落可用——这也是"怪物掉落鹿角显示为赫拉迪克方块"(已由 af2671c 修复)未被发现的原因:手工 swordItem 的 code 是未补位的 'ssd',而真实管线产物是补位的 'dr3 '。

另:worktree 下无法运行

场景依赖 gitignored 的 samples/d2-packs,在 .worktrees/* 中启动报 启动失败:no pack location worked,审计超时(STAGE 1 仅等 20s)。

验收

  • 击杀走真实伤害入口(engine.tick attacking / damageMonster),禁止直接改 hp/state/metrics
  • 断言掉落来自 executeDropPipeline(批量击杀 ≥1000 次,统计每只件数/金币/药瓶与 TC 理论值误差 < 3σ)
  • 断言每个真实掉落物的地面 sprite 与拾取后 UI sprite 一致,且不命中尺寸兜底(invbox 等)
  • 截图包含真实掉落的金币、药瓶、装备
  • 支持 worktree 运行(显式参数指定 packs 目录,缺失时 fail-fast 并给出明确报错)
## 问题 `scripts/verify-ground-combat-browser.ts` 第 266–286 行: ```js target.hp = 0; target.state = 'dead'; target.dropRolled = true; engine.metrics.dropsRolled = preDrops + 1; const swordItem = { code: 'ssd', ... } // 手工构造 engine.dropItem(swordItem, ...); engine.dropGold(150, ...) ``` 直接改怪物状态、手工塞一把短剑和 150 金币,**完全绕过** `damageMonster → kill event → engine.tick → executeDropPipeline → groundItems.add`。因此 #408 报告的"8 stages 全绿"不能证明真实掉落可用——这也是"怪物掉落鹿角显示为赫拉迪克方块"(已由 af2671c 修复)未被发现的原因:手工 swordItem 的 code 是未补位的 `'ssd'`,而真实管线产物是补位的 `'dr3 '`。 ## 另:worktree 下无法运行 场景依赖 gitignored 的 `samples/d2-packs`,在 `.worktrees/*` 中启动报 `启动失败:no pack location worked`,审计超时(STAGE 1 仅等 20s)。 ## 验收 - [ ] 击杀走真实伤害入口(`engine.tick` attacking / `damageMonster`),禁止直接改 hp/state/metrics - [ ] 断言掉落来自 `executeDropPipeline`(批量击杀 ≥1000 次,统计每只件数/金币/药瓶与 TC 理论值误差 < 3σ) - [ ] 断言每个真实掉落物的地面 sprite 与拾取后 UI sprite 一致,且不命中尺寸兜底(invbox 等) - [ ] 截图包含真实掉落的金币、药瓶、装备 - [ ] 支持 worktree 运行(显式参数指定 packs 目录,缺失时 fail-fast 并给出明确报错)
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#449
No description provided.