From 7c415df9e9a551253cbd3c2129dbda175661353f Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Mon, 14 Sep 2026 20:28:14 +0800 Subject: [PATCH] docs(06): refresh 06-07 for post-refactor replay API --- .planning/phases/06-unit-tests/06-07-PLAN.md | 105 ++++++++++++------- 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/.planning/phases/06-unit-tests/06-07-PLAN.md b/.planning/phases/06-unit-tests/06-07-PLAN.md index b964a09..dda7432 100644 --- a/.planning/phases/06-unit-tests/06-07-PLAN.md +++ b/.planning/phases/06-unit-tests/06-07-PLAN.md @@ -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` 可存档" --- -顶层集成(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/` 集成测试文件。 - Task 1: 执行前门禁 — 用户确认录像记录已接通 + Task 1: 执行前记录门禁 — 用户已确认录像记录已接通 packages-user/data-state/test/replayPlayback.test.ts(尚未创建,仅作占位说明) - 录像记录在 CoreState 操作路径中的接通,以及驱动小地图录像播放/二次录制所需的公开入口。 + 用户已按 `17d7c8f refactor: refactor replay system record.` 完成录像记录方式改造(用户原话「我已经修改完毕了录像记录方式」),本任务为刷新后 API 的执行记录门禁。 - 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 })可供录像重置最小使用。 - 用户回复「录像记录已接通,可以开始」则继续 Task 2/3;否则暂停本计划等待用户改代码。 + 用户已确认录像记录接通;如当前 API 无进一步变动,直接继续 Task 2/3。若核对发现 API 再次变动或前置条件不成立,暂停本计划等待用户处理。 - .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) - 本计划依赖用户先在具体操作中接通录像记录,否则二次录制比对无法进行(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()` 包裹程序化序列。 - 用户明确回复「录像记录已接通,可以开始」,或不通过则暂停本计划 + 用户确认录像记录已接通(已提供「我已经修改完毕了录像记录方式」);若核对发现 API 已再次变动,则暂停本计划等待用户处理 - - 用户给出明确开始确认;否则本计划保持暂停状态。 + - 前置条件已确认并以本任务记录在案;否则本计划保持暂停状态。 - 录像记录接通得到用户确认,或计划暂停等待用户改代码。 + 录像记录接通得到用户确认且当前 API 与上述事实一致,进入 Task 2/3;若不一致则计划暂停等待用户处理。 @@ -194,13 +211,19 @@ Output: 2 个 `data-state/test/` 集成测试文件。 - 阶段 3(完整/集成):小地图录像播放 + 二次录制逐条比对 + error 2001–2008 + 阶段 3(完整/集成):小地图录像播放 + 二次录制逐条比对 + 176 + error 2001–2008 packages-user/data-state/test/replayPlayback.test.ts 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/` 集成测试文件。 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。 pnpm exec vitest run packages-user/data-state/test/replayPlayback.test.ts - 运行失败,或 2001–2008 中任一码未被观测,或二次录制逐条比对失败 + 运行失败,或 2001–2008 中任一码未被观测,或 176 未被观测,或二次录制逐条比对失败 - `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` 全绿。 - 阶段 3(完整/集成)的小地图录像播放、二次录制比对与 2001–2008 在阶段 1/2 跑绿的基础上全部跑绿。若本阶段发现阻断性 bug,暂停并按 D-05/D-07 向用户汇报、等确认;不得跳过或弱化。完成后以 create-or-append 方式将本计划的 code→模块→用例行(2001–2008)写入 `06-COVERAGE-MAP.md` 的 06-07 小节:先检查表头,不存在则先创建,再只追加本小节,不重写他节。 + 阶段 3(完整/集成)的小地图录像播放、二次录制比对、176 与 2001–2008 在阶段 1/2 跑绿的基础上全部跑绿。若本阶段发现阻断性 bug,暂停并按 D-05/D-07 向用户汇报、等确认;不得跳过或弱化。完成后以 create-or-append 方式将本计划的 code→模块→用例行(176、2001–2008)写入 `06-COVERAGE-MAP.md` 的 06-07 小节:先检查表头,不存在则先创建,再只追加本小节,不重写他节。 @@ -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);表头不存在则先创建;幂等、顺序无关,不重写他节。 +- **执行协议**:执行前必须先向用户确认录像记录已接通(已确认并记录);执行后暂停并用中文分条汇报。 - 2 个集成测试文件存在并通过(在用户确认录像记录接通之后)。 -- 顶层伤害组合、系统层光环/效果组合、小地图录像播放、二次录制逐条比对、2001–2008 全部断言。 +- 顶层伤害组合、系统层光环/效果组合、小地图录像播放、二次录制逐条比对、176、2001–2008 全部断言。 @@ -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 小节