docs(06): refresh 06-07 for post-refactor replay API

This commit is contained in:
unanmed 2026-09-14 20:28:14 +08:00
parent 6d3d4dbaed
commit 7c415df9e9

View File

@ -3,7 +3,7 @@ phase: 06-unit-tests
plan: 07
type: execute
wave: 2
depends_on: [06-02, 06-04, 06-06]
depends_on: [06-02, 06-04, 06-05, 06-06]
files_modified:
- packages-user/data-state/test/enemyCombination.test.ts
- packages-user/data-state/test/replayPlayback.test.ts
@ -18,12 +18,13 @@ must_haves:
truths:
- "TEST-01 由数据端行为单测满足,门禁为固定非 watch 命令 `pnpm test:ci` 全绿(D-08)。"
- "接口全覆盖:本计划驱动的顶层/系统层组合入口与录像播放入口的每个公开方法至少一条正常用例;名称含 legacy 的接口/方法排除(D-30 / D-40)。"
- "code 全覆盖:录像执行错误 2001、2002、2003、2004、2005、2006、2007、2008 各至少一条触发断言,经 `logger.catch` / `logger.error` spy 观测(D-31 / D-40)。"
- "code 全覆盖:录像执行错误 2001、2002、2003、2004、2005、2006、2007、2008 各至少一条触发断言(经 `logger.catch` / `logger.error` spy 观测);并覆盖录像记录新码 176(`HeroMover` 记录时方向非上/右/下/左,D-45 / D-31)。"
- "录像可存档属主为 `ReplaySystem`:`IReplaySystemSave` = { length, commandWidth, commandArray, paramArray };`ReplayArray` 已**不再是** `ISaveableContent`、不再有 `saveState`/`loadState`。本计划仅允许为录像重置**最小使用** `ReplaySystem.saveState()`/`loadState()` 数据,但不测存读档本身(D-32)。"
- "录像记录控制:`ReplaySystem.disable()`/`revert()`(委托 `ReplayArray.disable()`/`revert()`)以**嵌套计数**抑制记录;真实英雄操作内部经 `replay.route.add(...)` 记录(mover 方向步、`hero.items.useItem`、`hero.equip.equip`/`unequip`、`pathfinding.teleportTo`),`equipment.equip` 在程序化卸装序列外用 disable/revert 包裹。阶段 3 经 `replaySystem.record(code, ...params)` 与/或真实英雄操作驱动录制,并用 disable/revert 避免录制准备步骤(D-40)。"
- "① 伤害组合:顶层多特殊属性组合(同时存在多个 special 时的伤害计算)+ 系统层光环/各效果组合(D-25/D-26)经真实 API 驱动并断言最终 `{damage,turn}`。"
- "② 小地图场景:用真实 API(`createCoreState` + 地图/怪物/勇士公开接口)构造小地图场景 + 一段录像步并正常播放(合成数据,D-02)。"
- "③ 二次录制比对:首次播放完毕后录像系统记录一遍录像步,断言二次录像与原录像**逐条完全相等**(步数 + 每步 code + 各 param 的 type/value),随后再次播放检验。"
- "本计划允许为录像重置**最小使用**存档数据,但不测存读档本身(D-32)。"
- "执行前必须先向用户确认(依赖用户先接通录像记录)(D-40)。"
- "③ 二次录制比对:首次播放完毕后录像系统经 `ReplaySystem.record(...)` 与/或真实英雄操作再记录一遍录像步,断言二次录像与原录像**逐条完全相等**(步数 + 每步 code + 各 param 的 type/value),随后再次播放检验。"
- "执行前必须先向用户确认(依赖用户先接通录像记录)(D-40);用户已于本次刷新前回复「我已经修改完毕了录像记录方式」,该前置条件已满足并作为执行记录门禁保留。"
- "测试形态(D-01):本计划为涉及多系统协作(战斗、录像)的经 `CoreState` 集成测试路径,与纯逻辑直测(06-01/06-05 等)共同构成混合测试形态。"
- "疑似缺陷按正确预期编写并标记 `it.skip`/`it.todo`,并按 D-06 的格式登记到共用的 `06-TEST-FINDINGS.md`(模块/接口、现象、最小复现、疑似原因、影响面、建议修复方向、关联 skip 用例、严重度)。"
- "执行节奏(D-33):本计划执行前先向用户确认;执行完成后暂停,用中文分条简要汇报验证结果,详细结果写入共用的 `06-TEST-FINDINGS.md`。"
@ -33,10 +34,11 @@ must_haves:
- path: packages-user/data-state/test/enemyCombination.test.ts
provides: 顶层伤害组合 + 系统层光环/效果组合覆盖
- path: packages-user/data-state/test/replayPlayback.test.ts
provides: 小地图录像播放 + 二次录制比对 + 2001–2008 覆盖
provides: 小地图录像播放 + 二次录制比对 + 176 + 2001–2008 覆盖
key_links:
- "enemyCombination.test.ts 扩展 `data-state/test/dataClosure.test.ts` 的真实 `createCoreState` + `enemyManager.addPrefab` + `MainDamageCalculator` 形状到多 special/组合路径"
- "replayPlayback.test.ts 复用 `data-state/test/nodeReplay.test.ts` 的逐步回放 harness 与 `dataClosure.test.ts` 的 `waitForEnded` 有界等待"
- "replayPlayback.test.ts 复用 `data-state/test/nodeReplay.test.ts` 的逐步回放 harness 与 `dataClosure.test.ts` 的 `waitForEnded` 有界等待;录制/播放/二次录制一律走当前 `ReplaySystem` 公开面(`record`/`disable`/`revert`/`createReplaySandbox`/`releaseSandbox`/`saveState`/`loadState`)"
- "录像记录的真实来源是英雄操作内部的 `replay.route.add(...)`(`hero/mover.ts` 方向步、`hero/items.ts` useItem、`hero/equipment.ts` equip/unequip、`path-system/src/path/system.ts` teleportTo);`equipment.equip` 与 `event/hero.ts` 用 `replaySystem.disable()`/`revert()` 包裹程序化序列"
- "`06-COVERAGE-MAP.md` 为共享 create-or-append 文件:写 06-07 小节前先检查表头(`| code | 模块 | 用例 | 计划 |`)是否存在,不存在则先创建,再只追加/更新本小节;幂等且与其它计划顺序无关,不重写他节"
prohibitions:
- "不创建或修改任何生产/核心源码,只新增 `*.test.ts`"
@ -45,15 +47,20 @@ must_haves:
- "疑似 bug 按正确预期编写并标记 `it.skip`/`it.todo`(D-05)"
- "fixture 全部文件内联,不建跨文件 helper(D-02/D-03)"
- "异步路径只用真实计时器,禁用 `vi.useFakeTimers()`(D-04)"
- "不测 `saveState`/`loadState` 本身;仅允许为录像重置最小使用存档数据(D-32)"
- "不测 `saveState`/`loadState` 本身;仅允许为录像重置最小使用 `ReplaySystem.saveState()`/`loadState()`(`IReplaySystemSave`)数据(D-32);不假设 `ReplayArray` 可存档"
---
<objective>
顶层集成(D-40):① 伤害系统的属性/加成组合(顶层多特殊属性 + 系统层光环/效果组合,D-25/D-26);② 用真实 API 构造小地图场景 + 一段录像步并正常播放;③ 二次录制验证:首次播放后系统记录一遍录像步,判定二次录像与原录像逐条完全相等,并再次播放检验。`error 2001–2008` 归本计划。按 D-43 的阶段化测试组织:阶段 1 构件级(真实 API 下单顶层类/单分支基线)→ 阶段 2 组合/流水线(多 special + 光环/效果组合)→ 阶段 3 完整/集成(小地图录像播放 + 二次录制比对 + 2001–2008)。
顶层集成(D-40):① 伤害系统的属性/加成组合(顶层多特殊属性 + 系统层光环/效果组合,D-25/D-26);② 用真实 API 构造小地图场景 + 一段录像步并正常播放;③ 二次录制验证:首次播放后系统记录一遍录像步,判定二次录像与原录像逐条完全相等,并再次播放检验。`error 2001–2008` 与录像记录新码 `176` 归本计划。按 D-43 的阶段化测试组织:阶段 1 构件级(真实 API 下单顶层类/单分支基线)→ 阶段 2 组合/流水线(多 special + 光环/效果组合)→ 阶段 3 完整/集成(小地图录像播放 + 二次录制比对 + 176 + 2001–2008)。
Purpose: 这是唯一验证多系统接线(战斗上下文 + 流程 + 计算器;地图 + 勇士 + 录像)的阶段工作。先构件级基线再组合/集成,避免整链失败无法定位(D-43)。
**执行前必须先向用户确认**(D-40:依赖用户先接通录像记录)。
当前录像 API(commit `17d7c8f refactor: refactor replay system record.` 之后)要点:
- 可存档属主是 `ReplaySystem`(`IReplaySystemSave` = { length, commandWidth, commandArray, paramArray });`ReplayArray` 已不再是 `ISaveableContent`,没有 `saveState`/`loadState`。
- 录制控制为嵌套计数:`ReplaySystem.disable()` → `route.disable()` 使禁用层 +1,`revert()` 使 -1;`ReplayArray.disable()`/`revert()` 同语义。
- 真实英雄操作自行记录:`hero/location/mover` 的方向步、`hero.items.useItem(item)`、`hero.equip.equip(uid, slot, autoUnload)`/`unequip(slot)`、`pathfinding.teleportTo(target)`;`equipment.equip` 内部用 disable/revert 包住卸装序列后记录。
**执行前必须先向用户确认**(D-40:依赖用户先接通录像记录)。用户此前已确认接通(「我已经修改完毕了录像记录方式」),本计划保留该记录门禁。
Output: 2 个 `data-state/test/` 集成测试文件。
@ -77,6 +84,13 @@ Output: 2 个 `data-state/test/` 集成测试文件。
@packages-user/data-state/src/enemy/aura.ts
@packages-user/data-state/src/enemy/mapDamage.ts
@packages-user/data-state/src/replay/commands.ts
@packages-user/data-common/src/replay/system.ts
@packages-user/data-common/src/replay/types.ts
@packages-user/data-common/src/replay/array.ts
@packages-user/data-common/src/replay/sandbox.ts
@packages-user/data-base/src/hero/mover.ts
@packages-user/data-base/src/hero/items.ts
@packages-user/data-base/src/hero/equipment.ts
@packages-user/data-system/src/combat/context.ts
@packages-user/data-system/src/combat/combat.ts
@packages-user/data-state/test/dataClosure.test.ts
@ -91,7 +105,8 @@ Output: 2 个 `data-state/test/` 集成测试文件。
- 异步路径用真实计时器 + 有界等待(`waitForEnded`),禁用 fake timers(D-04)。
- 警告/错误路径经 `logger.catch` / `vi.spyOn(logger, ...)`。
- 疑似 bug:正确预期 + `it.skip`/`it.todo` + 中文注释锚定 `#06-07-N`;`pnpm test:ci` 保持全绿。
- **本计划执行前必须先向用户确认录像记录已接通(D-40);确认前不得开始写/跑用例。**
- **录像 API 契约(当前实现)**:可存档属主为 `ReplaySystem`(`saveState(): IReplaySystemSave` / `loadState(state)`),`ReplayArray` **不可存档**;录制经 `replaySystem.record(code, ...params)` 或真实英雄操作内部的 `replay.route.add(...)`;记录抑制经 `replaySystem.disable()`/`revert()`(嵌套计数,必须配对);播放经 `createReplaySandbox({ route, reseter, startIndex?, save? })` + `sandbox.play()/step()`(`releaseSandbox()` 释放)。
- **本计划执行前必须先向用户确认录像记录已接通(D-40)**;该前置条件已由用户确认,本步骤只作执行记录门禁;若发现 API 再次变动则暂停。
- `06-COVERAGE-MAP.md` 为共享 create-or-append 文件(幂等、顺序无关):写 06-07 小节前先检查表头(`| code | 模块 | 用例 | 计划 |`)是否存在,不存在则先创建,再只追加/更新本小节,绝不重写他节。
- **执行协议(D-33):执行前向用户确认;执行后暂停并用中文分条汇报。**
- **阶段门禁(D-43):本计划按 构件 → 组合/流水线 → 完整/集成 三阶段顺序执行,每阶段跑绿后才进入下一阶段;若某阶段发现阻断性 bug 使后续阶段无法运行,暂停并按 D-05/D-07 向用户汇报、等确认,不得跳过或弱化。**
@ -101,34 +116,36 @@ Output: 2 个 `data-state/test/` 集成测试文件。
<tasks>
<task type="checkpoint:human-verify" gate="blocking-human">
<name>Task 1: 执行前门禁 — 用户确认录像记录已接通</name>
<name>Task 1: 执行前记录门禁 — 用户已确认录像记录已接通</name>
<files>packages-user/data-state/test/replayPlayback.test.ts(尚未创建,仅作占位说明)</files>
<what-built>录像记录在 CoreState 操作路径中的接通,以及驱动小地图录像播放/二次录制所需的公开入口。</what-built>
<what-built>用户已按 `17d7c8f refactor: refactor replay system record.` 完成录像记录方式改造(用户原话「我已经修改完毕了录像记录方式」),本任务为刷新后 API 的执行记录门禁。</what-built>
<how-to-verify>
1) 确认播放时每步会记入 `ReplaySystem.route`(录像记录已接通)。
2) 确认 `CoreState` 暴露构造小地图场景 + 播放 + 二次录制所需的公开入口。
3) 确认录像重置所需的最小状态入口可用。
1) 确认播放/录制走当前 API:`ReplaySystem.record/getCommand/createReplaySandbox/releaseSandbox/disable/revert/saveState/loadState`,以及 `ReplayArray.disable/revert`(`ReplayArray` 不再是 `ISaveableContent`)。
2) 确认真实英雄操作已接通记录:`hero/mover.ts` 方向步、`hero/items.ts` `useItem`、`hero/equipment.ts` `equip`/`unequip`(`equip` 内部 disable/revert 包裹)、`path/system.ts` `teleportTo`。
3) 确认 `CoreState` 暴露构造小地图场景 + 播放 + 二次录制所需的公开入口,且 `ReplaySystem.saveState()` 返回 `IReplaySystemSave`({ length, commandWidth, commandArray, paramArray })可供录像重置最小使用。
</how-to-verify>
<resume-signal>用户回复「录像记录已接通,可以开始」则继续 Task 2/3;否则暂停本计划等待用户改代码。</resume-signal>
<resume-signal>用户已确认录像记录接通;如当前 API 无进一步变动,直接继续 Task 2/3。若核对发现 API 再次变动或前置条件不成立,暂停本计划等待用户处理。</resume-signal>
<read_first>
.planning/phases/06-unit-tests/06-CONTEXT.md(D-40)
.planning/phases/06-unit-tests/06-CONTEXT.md(D-40 / D-45)
packages-user/data-common/src/replay/system.ts(ReplaySystem 公开面与 saveState/loadState)
packages-user/data-common/src/replay/types.ts(IReplaySystemSave / IReplayArray.disable·revert)
packages-user/data-state/src/core.ts(replaySystem 接线与公开入口)
packages-user/data-state/src/replay/commands.ts(录像指令与 error 2001–2008)
</read_first>
<action>
本计划依赖用户先在具体操作中接通录像记录,否则二次录制比对无法进行(D-40)。开始本计划前,向用户展示并确认:
- 录像记录是否已在 CoreState 操作路径中接通(播放时会把每步记入 `ReplaySystem.route`);
- `CoreState` 是否暴露驱动小地图场景 + 播放 + 二次录制所需的公开入口;
- 录像重置所需的最小状态入口是否可用。
用户确认后再继续 Task 2/3;若未接通,暂停本计划并等待用户改代码,不得自行修改核心代码。
本计划依赖用户先接通录像记录,否则二次录制比对无法进行(D-40)。用户此前已明确回复「我已经修改完毕了录像记录方式」,该前置条件**已满足并记录在案**;本任务作为执行记录门禁保留,不再重新索取实现。
执行者只需核对当前 HEAD 的 API 仍满足下列事实,作为 Task 2/3 的起点记录;不一致则按 D-07 暂停并汇报,不得自行改核心代码:
- `ReplaySystem` 提供 `record`/`getCommand`/`createReplaySandbox`/`releaseSandbox`/`disable`/`revert`/`saveState`/`loadState`,其中 `saveState()` 返回 `IReplaySystemSave`;
- `ReplayArray` 提供 `disable()`/`revert()`,且**不再**实现 `ISaveableContent`;
- 真实英雄操作在内部经 `replay.route.add(...)` 记录,`equipment.equip` 与 `event/hero.ts` 用 `replaySystem.disable()`/`revert()` 包裹程序化序列。
</action>
<verify>
<human-check>用户明确回复「录像记录已接通,可以开始」,或不通过则暂停本计划</human-check>
<human-check>用户确认录像记录已接通(已提供「我已经修改完毕了录像记录方式」);若核对发现 API 已再次变动,则暂停本计划等待用户处理</human-check>
</verify>
<acceptance_criteria>
- 用户给出明确开始确认;否则本计划保持暂停状态。
- 前置条件已确认并以本任务记录在案;否则本计划保持暂停状态。
</acceptance_criteria>
<done>录像记录接通得到用户确认,或计划暂停等待用户改代码。</done>
<done>录像记录接通得到用户确认且当前 API 与上述事实一致,进入 Task 2/3;若不一致则计划暂停等待用户处理。</done>
</task>
<task type="auto">
@ -194,13 +211,19 @@ Output: 2 个 `data-state/test/` 集成测试文件。
</task>
<task type="auto">
<name>阶段 3(完整/集成):小地图录像播放 + 二次录制逐条比对 + error 2001–2008</name>
<name>阶段 3(完整/集成):小地图录像播放 + 二次录制逐条比对 + 176 + error 2001–2008</name>
<files>packages-user/data-state/test/replayPlayback.test.ts</files>
<read_first>
packages-user/data-state/test/nodeReplay.test.ts
packages-user/data-state/test/dataClosure.test.ts
packages-user/data-state/test/fixtures/closed-loop.ts
packages-user/data-state/src/replay/commands.ts
packages-user/data-common/src/replay/system.ts
packages-user/data-common/src/replay/types.ts
packages-user/data-common/src/replay/array.ts
packages-user/data-base/src/hero/mover.ts
packages-user/data-base/src/hero/items.ts
packages-user/data-base/src/hero/equipment.ts
packages-user/data-base/src/map/mapState.ts
.planning/phases/03-data-completion/03-REPLAY-CONTRACT.md
.planning/phases/03-data-completion/03-REPLAY-DIAGNOSTICS.md
@ -208,26 +231,29 @@ Output: 2 个 `data-state/test/` 集成测试文件。
</read_first>
<action>
D-43 阶段 3(完整/集成):在阶段 1/2 跑绿后,测本计划的完整集成场景(真实 API 构造小地图 + 录像播放 + 二次录制比对)。
用真实 API 构造小地图场景(合成数据)+ 一段录像步并播放:
- 小地图:用真实 `createCoreState()` 的 map 公开接口构造极小地图(1..3 格),放置怪物/勇士,绑定必要状态。
- 播放:记录一小段有效录像,创建 sandbox 并用有界等待(`waitForEnded`)播放完毕;断言关键状态到达预期。
- 二次录制:首次播放完毕后录像系统记录一遍录像步;断言二次录像与原录像**逐条完全相等**:步数相同、每步 code 相同、每步各 param 的 type/value 相同(严格逐条比较,不做整体 deep equal 之外的结构忽略);随后再次播放二次录像并断言同样结束。
用真实 API 构造小地图场景(合成数据)+ 一段录像步并播放。全程使用当前 `ReplaySystem` 公开面,注意 `ReplayArray` **不可存档**(无 `saveState`/`loadState`):
- 小地图:用真实 `createCoreState()` 的 map 公开接口构造极小地图(1..3 格),放置怪物/勇士,绑定必要状态(`tileStore.addTile` + `maps.fromRaw` + `hero.location.setFloor/setPos` + `mover.setFaceDir`)。
- 录制与准备步骤隔离:**建图、放怪、绑定状态、快照等准备步骤必须用 `replaySystem.disable()` … `replaySystem.revert()` 包裹**(或 `replay.route.disable()`/`revert()`),避免误录;disable/revert 为**嵌套计数**,必须成对,注意 `equipment.equip` 内部已自带 disable/revert。
- 写入首段录像:经 `replaySystem.record(code, ...params)` 直接记录,和/或经真实英雄操作录制(`hero.location.mover` 方向步、`hero.items.useItem(item)`、`hero.equip.equip(uid, slot, autoUnload)`、`hero.equip.unequip(slot)`、`pathfinding.teleportTo({x,y})`);断言每步在 `replay.route.get(index)` 读回为预期 `{command, params}`。
- 播放:`replay.createReplaySandbox({ route, reseter })` 并用有界等待(`waitForEnded` 等待 `sandbox.ended`)播放完毕;断言关键状态到达预期,结束后 `releaseSandbox()`。
- 二次录制比对:首次播放完毕后,经 `replaySystem.record(...)` 与/或真实英雄操作再记录一遍录像步;断言二次录像与原录像**逐条完全相等**:`route.length`(或 `IReplaySystemSave.length`)相同、每步 code 相同、每步各 param 的 `typeof` 与值相同(number 含 int 位宽/float、boolean、bigint、string 逐一比较,不做结构忽略);随后再次播放二次录像并断言同样结束。录像重置可**最小使用** `ReplaySystem.saveState()`/`loadState()`(`IReplaySystemSave` = { length, commandWidth, commandArray, paramArray })或 `route.setReplayArray(...)`。
- warn 176:触发 `HeroMover` 记录时方向非 上/右/下/左 的路径(`replay.route.add` 前的 `default` 分支),经 `logger.warn` spy 观测码 `176`(D-45)。
- error 2001–2008:分别触发参数数量不匹配(2001)、参数类型不匹配(2002)、移动前未停止(2003)、移动控制器缺失(2004)、teleport 无路径(2005)、use-item 失败(2006)、equip 失败(2007)、unequip 失败(2008),经 `logger.catch`/`logger.error` spy 观测。
- 仅允许为录像重置最小使用存档数据,不测存读档本身(D-32)。
- 仅允许为录像重置最小使用 `ReplaySystem` 存档数据,不测存读档本身(D-32)。
有界循环,无 fake timers。
</action>
<verify>
<automated>pnpm exec vitest run packages-user/data-state/test/replayPlayback.test.ts</automated>
<fails_when>运行失败,或 2001–2008 中任一码未被观测,或二次录制逐条比对失败</fails_when>
<fails_when>运行失败,或 2001–2008 中任一码未被观测,或 176 未被观测,或二次录制逐条比对失败</fails_when>
</verify>
<acceptance_criteria>
- `replayPlayback.test.ts` 零非跳过失败。
- 断言小地图场景播放完成、二次录像与原录像逐条相等(步数 + code + 各 param type/value)、二次播放完成。
- 断言 2001–2008 全部触发。
- 断言 2001–2008 与 176 全部触发。
- 每个 `it` 前有单行中文注释。
- D-44 门禁通过:改动文件 `eslint --fix` 后 `eslint <改动文件>` 0 错误;本计划改动的测试文件在 `pnpm exec vue-tsc --noEmit` 输出中按文件路径过滤 0 类型错误;`pnpm test:ci` 全绿。
</acceptance_criteria>
<done>阶段 3(完整/集成)的小地图录像播放、二次录制比对与 2001–2008 在阶段 1/2 跑绿的基础上全部跑绿。若本阶段发现阻断性 bug,暂停并按 D-05/D-07 向用户汇报、等确认;不得跳过或弱化。完成后以 create-or-append 方式将本计划的 code→模块→用例行(2001–2008)写入 `06-COVERAGE-MAP.md` 的 06-07 小节:先检查表头,不存在则先创建,再只追加本小节,不重写他节。</done>
<done>阶段 3(完整/集成)的小地图录像播放、二次录制比对、176 与 2001–2008 在阶段 1/2 跑绿的基础上全部跑绿。若本阶段发现阻断性 bug,暂停并按 D-05/D-07 向用户汇报、等确认;不得跳过或弱化。完成后以 create-or-append 方式将本计划的 code→模块→用例行(176、2001–2008)写入 `06-COVERAGE-MAP.md` 的 06-07 小节:先检查表头,不存在则先创建,再只追加本小节,不重写他节。</done>
</task>
</tasks>
@ -253,13 +279,14 @@ Output: 2 个 `data-state/test/` 集成测试文件。
- 两个文件聚焦运行通过;`pnpm test:ci` 全量绿。
- `git status` 仅新增 `*.test.ts`;无核心文件改动。
- 任何 `it.skip`/`it.todo` 均有 `#06-07-N` 条目。
- 以 create-or-append 方式写入 `06-COVERAGE-MAP.md` 06-07 小节(2001–2008);表头不存在则先创建;幂等、顺序无关,不重写他节。
- **执行协议**:执行前必须先向用户确认录像记录已接通;执行后暂停并用中文分条汇报。
- 二次录制按“步数 + 每步 code + 各 param type/value”逐条比较,且用当前 `ReplaySystem` API(`record`/`disable`/`revert`/`saveState`/`loadState`)驱动,未假设 `ReplayArray` 可存档。
- 以 create-or-append 方式写入 `06-COVERAGE-MAP.md` 06-07 小节(176、2001–2008);表头不存在则先创建;幂等、顺序无关,不重写他节。
- **执行协议**:执行前必须先向用户确认录像记录已接通(已确认并记录);执行后暂停并用中文分条汇报。
</verification>
<success_criteria>
- 2 个集成测试文件存在并通过(在用户确认录像记录接通之后)。
- 顶层伤害组合、系统层光环/效果组合、小地图录像播放、二次录制逐条比对、2001–2008 全部断言。
- 顶层伤害组合、系统层光环/效果组合、小地图录像播放、二次录制逐条比对、176、2001–2008 全部断言。
</success_criteria>
<artifacts_this_plan_produces>
@ -269,7 +296,7 @@ Test files:
Inline helper symbols:
- `enemyCombination.test.ts`: `createMultiSpecialEnemy`、`createHandler`、`createAuraFixture`
- `replayPlayback.test.ts`: `waitForEnded`、`createSmallMapScene`、`assertReplayEqual`、`triggerReplayError`
- `replayPlayback.test.ts`: `waitForEnded`、`createSmallMapScene`、`withReplayDisabled`、`recordReplaySteps`、`assertReplayEqual`、`triggerReplayError`
Planning artifacts:
- `06-COVERAGE-MAP.md` create-or-append 06-07 小节