From 41f743debc9eb38d92bbd21ab949d1c3479c022b Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Thu, 8 Oct 2026 15:57:05 +0800 Subject: [PATCH] docs(08-10): complete coverage and interface alignment plan --- .planning/ROADMAP.md | 6 +- .planning/STATE.md | 19 +- .../08-10-SUMMARY.md | 289 ++++++++++++++++++ .../deferred-items.md | 5 +- 4 files changed, 307 insertions(+), 12 deletions(-) create mode 100644 .planning/phases/08-test-refactor-alignment/08-10-SUMMARY.md diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index ee5e445..9851665 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -450,7 +450,7 @@ Plans: 3. 重构遗漏的细节问题已修复(测试面或经用户确认的数据端细节),不弱化既有断言 4. `pnpm test:perf` 仍可运行;不新增跳过用例 -**Plans**: 9/11 plans executedned(08-01..08-11;规划 2026-10-04,`gsd-plan-checker` 判 PASS / 0 blocker / 3 非阻塞 warning)——迁移 `08-01`(独立先行)→ 子系统对齐 `08-02..08-09` → 错误码与接口覆盖 `08-10` → 收口 `08-11`;每个计划 `autonomous: false`,以 blocking-human Task 0 汇报关卡开头 +**Plans**: 10/11 plans executedned(08-01..08-11;规划 2026-10-04,`gsd-plan-checker` 判 PASS / 0 blocker / 3 非阻塞 warning)——迁移 `08-01`(独立先行)→ 子系统对齐 `08-02..08-09` → 错误码与接口覆盖 `08-10` → 收口 `08-11`;每个计划 `autonomous: false`,以 blocking-human Task 0 汇报关卡开头 Plans: @@ -463,7 +463,7 @@ Plans: - [x] 08-07-PLAN.md — data-system path 对齐(`useMapState` 删除、`useFaceHandler` 注入) - [x] 08-08-PLAN.md — data-state src 对齐(`createCoreState` 删除→`CoreState({loadStarter,coreURL})`;`coreEventLayer` A1/A2) - [x] 08-09-PLAN.md — data-state 集成对齐(共享夹具 `closed-loop.ts`、`tileLegacy` 去留、寻路注入) -- [ ] 08-10-PLAN.md — 错误码 21 缺口 + loader 公共接口覆盖盘点与补测 +- [x] 08-10-PLAN.md — 错误码 21 缺口 + loader 公共接口覆盖盘点与补测 - [ ] 08-11-PLAN.md — 收口(`test:ci`+`test:perf` 全绿、skipped=1、零生产改动终审、阶段 SUMMARY) **Scope note (2026-10-04)**: 由原 `07-16`(寻路重构后的测试对齐,已 SUPERSEDED)转来并扩展,加入「测试文件迁入 `__test__`」的组织重构要求。用户并发进行渲染端收尾,可能触及数据端内容但不改接口设计、不影响测试;AI 不得提交用户改动的文件,发生冲突须暂停汇报。 @@ -483,4 +483,4 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 | 5. Legacy 移植 | 0/TBD | Not started | - | | 6. 单元测试 | 18/18 | In Progress| | | 7. 数据端缺陷修复 | 15/16 | Complete(07-16 superseded) | - | -| 8. 测试重构与接口对齐 | 9/11 | In Progress| | +| 8. 测试重构与接口对齐 | 10/11 | In Progress| | diff --git a/.planning/STATE.md b/.planning/STATE.md index fd645cc..5c7a644 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -4,16 +4,16 @@ milestone: v1.0 current_phase: 08 current_phase_name: 测试重构与接口对齐 status: executing -stopped_at: Completed 08-09-PLAN.md(data-state 集成层对齐:夹具根因 + 寻路注入 + 录像契约 + equip.value Record + tileLegacy 退役;__test__ 54/54、__test__+src 152/152、perf 45/45、eslint 0) -last_updated: "2026-10-07T11:16:41.386Z" +stopped_at: "Completed 08-10-PLAN.md(覆盖补测与接口对齐收口:14 缺口码新增断言 + loader.test.ts + 基线测试侧对齐;test:ci 65 文件 727 passed/1 skipped、test:perf 6 文件 54 passed、触达文件 eslint 0)" +last_updated: "2026-10-08T07:55:18.148Z" last_activity: 2026-10-05 last_activity_desc: Phase 08 execution started -state_head: 551e63de9af6b6674d35d9cabc0a6a3006710b0f +state_head: "0b23ff52c077b9917eefb98eb881ebbeae2d958d" progress: total_phases: 8 completed_phases: 2 total_plans: 98 - completed_plans: 95 + completed_plans: 96 milestone_name: milestone --- @@ -29,7 +29,7 @@ See: .planning/PROJECT.md (updated 2026-09-17) ## Current Position Phase: 08 (测试重构与接口对齐) — EXECUTING -Plan: 5 of 11 +Plan: 10 of 11 Status: Ready to execute Last activity: 2026-10-05 — Phase 08 execution started @@ -105,6 +105,7 @@ Progress: [█████░░░░░] 50% | Phase 08 P07 | 40min | 2 tasks | 4 files | | Phase 08 P08 | 30min | 2 tasks | 4 files | | Phase 08 P09 | 25min | 2 tasks | 10 files | +| Phase 08 P10 | 80min | 3 tasks | 10 files | ## Accumulated Context @@ -248,6 +249,10 @@ Recent decisions affecting current work: - [Phase 08]: [Phase 08] 08-09 Q1(STRICT):tileLegacy.test.ts 授权退役删除(被测 data-state/src/legacy/tile 已整体删除),不重定向、不伪造替代测试 - [Phase 08]: [Phase 08] 08-09 Q2–Q4:CoreState 延续 08-08 装配;closed-loop setFloor(真实 IGameMap);finder 删 useMapState、DefaultPassPredicateImpl(state)、注入 Dir4FaceHandler - [Phase 08]: [Phase 08] 08-09 追加对齐:录像命令结果用 ReplayCommandResult + Active;sandbox 走 shipped 自然预读(getReplayed 计预读位);equip.value 由 Map 改 Record;装备/flag 同引用契约移除后改校验值/uid 恢复;addHook 后不再调 .load() +- [Phase 08]: 08-10:§9.1 21 缺口码处置=14 码新增 logger.catch 断言 + 5 码(72/170/173/179/183)仅登记既有覆盖 + 2 码(70/68)记为不可达(不写 it.skip) +- [Phase 08]: 08-10:码 68 为死代码——extraConfigs 为 Map 键去重且 loading/dataLoaded 自始未赋值,同 id 双任务不可能;记录不可达并 surface,不伪造测试 +- [Phase 08]: 08-10:基线 test:ci 测试侧失败按 shipped 对齐——sandbox.test.ts 删 playing=true 预读绕过、mapLifecycle.test.ts 改经 GameMap.resizeLayer;E4 attribute.perf.ts 的 BaseHeroModifier 改自 ../modifier;零生产改动 +- [Phase 08]: 08-10:域外既有 prettier eslint 报错(46 errors/7 文件,含生产 replay/func.ts)存在于 HEAD,未修复,登记 deferred-items ### Roadmap Evolution @@ -287,6 +292,6 @@ None yet. ## Session Continuity -Last session: 2026-10-07T11:16:41.103Z -Stopped at: Completed 08-09-PLAN.md(data-state 集成层对齐:夹具根因 + 寻路注入 + 录像契约 + equip.value Record + tileLegacy 退役;__test__ 54/54、__test__+src 152/152、perf 45/45、eslint 0) +Last session: 2026-10-08T07:54:51.167Z +Stopped at: Completed 08-10-PLAN.md(覆盖补测与接口对齐收口:14 缺口码新增断言 + loader.test.ts + 基线测试侧对齐;test:ci 65 文件 727 passed/1 skipped、test:perf 6 文件 54 passed、触达文件 eslint 0) Resume file: None diff --git a/.planning/phases/08-test-refactor-alignment/08-10-SUMMARY.md b/.planning/phases/08-test-refactor-alignment/08-10-SUMMARY.md new file mode 100644 index 0000000..24d9929 --- /dev/null +++ b/.planning/phases/08-test-refactor-alignment/08-10-SUMMARY.md @@ -0,0 +1,289 @@ +--- +phase: 08-test-refactor-alignment +plan: 10 +subsystem: testing +tags: + - test-coverage + - error-codes + - logger-json + - loader + - vitest + - baseline-alignment +requires: + - phase: 08-test-refactor-alignment/08-02 + provides: data-common 对齐(含 sandbox 码 72/158/175 契约改写) + - phase: 08-test-refactor-alignment/08-05 + provides: data-base/map 对齐 + 陈旧码 62/63/64/84/130/125 契约裁定 + - phase: 08-test-refactor-alignment/08-06 + provides: data-system combat/event 对齐 + - phase: 08-test-refactor-alignment/08-07 + provides: data-system path 注入面对齐 + 码 173/183 覆盖 + - phase: 08-test-refactor-alignment/08-08 + provides: data-state src 对齐 + CoreState 装配约定 + - phase: 08-test-refactor-alignment/08-09 + provides: data-state 集成层对齐 + 域外失败登记 +provides: + - "§9.1 21 个缺口错误码逐条处置:14 码新增通过断言、5 码(72/170/173/179/183)仅登记既有覆盖、2 码(70/68)记为不可达" + - "新建 packages-user/data-state/src/loader/__test__/loader.test.ts:码 66/67/69 + MotaDataLoader 公开面(码 68 记录不可达)" + - "基线 test:ci 两处失败(sandbox.test.ts 6 例、mapLifecycle.test.ts 1 例)按 shipped 契约测试侧对齐" + - "E4 attribute.perf.ts 收集失败为测试侧导入漂移并修复" + - "§9.2 陈旧码逐条登记为「契约变更」,不补测、不复活" +affects: + - packages-user/data-common/src/replay + - packages-user/data-common/src/store + - packages-user/data-base/src/map + - packages-user/data-base/src/hero + - packages-user/data-system/src/event + - packages-user/data-system/src/path + - packages-user/data-state/src/event + - packages-user/data-state/src/loader +tech-stack: + added: [] + patterns: + - "缺口码断言沿用 logger.catch(fn)(返回 { ret, info })或 vi.spyOn(logger, 'warn'/'error'),只校验 code 不硬编码文案" + - "沙箱单步对齐 shipped 自然预读:不手动置 playing=true(否则 step() 跳过预读、appendingStep 恒 null)" + - "经由 GameMap.resizeLayer 变更图层尺寸,使共享 MapLocIndexer 宽度在 cropPointEvents 前同步" + - "loader 测试以内联 ILoadManager/ILoadTaskStarter 桩驱动 MotaDataLoader.start(),零新依赖" + - "每个新增 it 前一行中文注释(dev.md:86)" +key-files: + created: + - packages-user/data-state/src/loader/__test__/loader.test.ts + - .planning/phases/08-test-refactor-alignment/08-10-SUMMARY.md + modified: + - packages-user/data-common/src/replay/__test__/sandbox.test.ts + - packages-user/data-common/src/store/__test__/tileStore.test.ts + - packages-user/data-base/src/map/__test__/mover.test.ts + - packages-user/data-base/src/map/__test__/mapLifecycle.test.ts + - packages-user/data-base/src/hero/__test__/items.test.ts + - packages-user/data-base/src/hero/__test__/attribute.perf.ts + - packages-user/data-system/src/event/__test__/eventDispatch.test.ts + - packages-user/data-system/src/path/__test__/system.test.ts + - packages-user/data-state/src/event/__test__/event.test.ts + - .planning/phases/08-test-refactor-alignment/deferred-items.md +key-decisions: + - "Q1:缺口清单按实际需要收敛——14 码新增覆盖;72/170/173/179/183 仅登记既有覆盖不重测;70/68 记为不可达、不写 it.skip" + - "Q1:码 181 落 data-common store 层(itemStore/enemyStore),因未获批新文件,落位于既有 tileStore.test.ts 的独立 describe" + - "Q1:从本计划范围移除未被拥有的 data-base/src/enemy/__test__/enemy.test.ts(未触碰)" + - "Q2:陈旧码(62/63/64/84/130/158/175 + 表外提及的 125)全部按「契约变更」登记,不补测(62–125 已由 08-05 裁定,158/175 已由 08-02 迁移到 72)" + - "Q3:批准新建 data-state/src/loader/__test__/loader.test.ts,覆盖 66/67/68/69 与 MotaDataLoader 公开面;实测 68 为死代码,按不可达记录" + - "Q4:仅复用既有 createEnv/sandbox 桩风格,不引入新生产标识符(新文件仅测试内 helper 名)" + - "E1:基线 test:ci 的测试侧失败由执行者对齐(sandbox.test.ts、mapLifecycle.test.ts),未改生产" + - "E4:attribute.perf.ts 收集失败判定为测试侧导入漂移(BaseHeroModifier 误自 ../attribute),修复为 ../modifier" + - "基线 test:ci 后:65 文件全绿(727 passed / 1 skipped);test:perf 6 文件 54 passed;触达文件 eslint 0 errors" +patterns-established: + - "缺口码覆盖矩阵:code → emit 模块 → 测试文件 → 用例/处置" + - "不可达码处置:记录为不可达并说明 emit 点为何不可经公开 API 触发,不写 it.skip(沿用用户 Q1 对码 70 的裁定)" +requirements-completed: [TEST-02] +actuals: + tokens: 5795 + tasks: 3 + commits: 3 + plan_head_before: 339f72d541affb0f7489edd9325600c30d17a62b +coverage: + - id: D1 + description: "§9.1 21 个缺口错误码逐条处置(14 新增断言 / 5 既有登记 / 2 不可达)" + requirement: TEST-02 + verification: + - kind: unit + ref: "pnpm exec vitest run …data-common/src/replay/__test__/sandbox.test.ts …data-common/src/store/__test__ …data-base/src/map/__test__/mover.test.ts …mapLifecycle.test.ts …hero/__test__/items.test.ts …data-system/src/event/__test__ …path/__test__ …data-state/src/event/__test__ …loader/__test__ — 各聚焦 0 失败" + status: pass + - kind: unit + ref: "pnpm test:ci — 65 files passed; 727 passed / 1 skipped / 0 failed" + status: pass + human_judgment: false + - id: D2 + description: "新建 loader.test.ts:码 66/67(PrefixedJSONCProcessor)、69(DefaultDataLoaderHook)、MotaDataLoader 公开面;码 68 记录不可达" + requirement: TEST-02 + verification: + - kind: unit + ref: "packages-user/data-state/src/loader/__test__/loader.test.ts — 6 passed(含 66/67/69 断言与 start() 公开面加载)" + status: pass + human_judgment: false + - id: D3 + description: "基线 test:ci 两处测试侧失败对齐 + E4 attribute.perf.ts 收集失败修复" + requirement: TEST-02 + verification: + - kind: unit + ref: "sandbox.test.ts 16 passed / mapLifecycle.test.ts 5 passed(基线各失败 6/1)" + status: pass + - kind: other + ref: "pnpm test:perf — 6 files / 54 passed / 0 failed(基线 attribute.perf.ts 收集失败)" + status: pass + human_judgment: false +duration: 80min +completed: 2026-10-08 +status: complete +--- + +# Phase 8 Plan 10: 覆盖补测与接口对齐收口 Summary + +**数据端 21 个已发出但未覆盖错误码逐条处置(14 码新增 `logger.catch` 断言)、新建 `loader.test.ts` 覆盖 loader 公共面、并把基线 `test:ci` 的测试侧失败全部对齐,最终 `test:ci` 65 文件全绿(727 passed / 1 skipped)、`test:perf` 6 文件 54 passed,零生产改动。** + +## Performance + +- **Duration:** ~80 min +- **Started:** 2026-10-08 +- **Completed:** 2026-10-08 +- **Tasks:** 3(Task 0 决策关卡已由用户 RESOLVED,不计入实现任务) +- **Files modified:** 10(含 1 新建测试) + +## 覆盖矩阵(§9.1 的 21 个缺口码 → 处置) + +| code | emit 模块 | 测试文件 / 用例 | 处置 | +| --- | --- | --- | --- | +| 73 | `replay/sandbox.ts:84,93` | `sandbox.test.ts` `errors code 73 when getPassive is called with no pending passive step` | 新增断言 | +| 194 | `replay/sandbox.ts:187` | `sandbox.test.ts` `warns code 194 when a passive step follows an active step` | 新增断言 | +| 133 | `store/tileStore.ts:35` | `tileStore.test.ts` `warns code 133 and 134 on number or id conflicts` | 新增断言 | +| 134 | `store/tileStore.ts:39` | 同上 | 新增断言 | +| 181 | `store/itemStore.ts:13`、`enemyStore.ts:13` | `tileStore.test.ts`(`ItemStore and EnemyStore duplicate registration`)2 用例 | 新增断言 | +| 192 | `map/mover.ts:47` | `mover.test.ts` `warns code 192 when the Dir8 face handler is missing` | 新增断言 | +| 193 | `hero/items.ts:144` | `items.test.ts` `warns code 193 when a saved item has no tile id registration` | 新增断言 | +| 171 | `event/executor.ts:66,73` | `eventDispatch.test.ts` `warns code 171 for an event id missing from the store` | 新增断言 | +| 172 | `event/executor.ts:39,46` | `eventDispatch.test.ts` `warns code 172 for a non-boolean event result during reduction` | 新增断言 | +| 182 | `path/finder.ts:110` | `system.test.ts` `warns code 182 when binding a layer from another CoreState` | 新增断言 | +| 66 | `loader/jsoncProcessor.ts:16` | `loader.test.ts` `warns code 66 when the prefix split string is missing` | 新增断言 | +| 67 | `loader/jsoncProcessor.ts:25` | `loader.test.ts` `warns code 67 when the split payload is not valid json` | 新增断言 | +| 69 | `loader/hook.ts:9` | `loader.test.ts` `warns code 69 when the core config is missing` | 新增断言 | +| 1001 | `event/map.ts:26` | `event/__test__/event.test.ts` `warns code 1001 when setBlock receives an unknown tile` | 新增断言 | +| 72 | `replay/sandbox.ts:136` | `sandbox.test.ts` 既有 `errors code 72 …`(execute/finalize) | 仅登记(既有覆盖) | +| 170 | `store/eventStore.ts:16` | `eventStore.test.ts` 既有 `warns and overwrites when an id is added twice` | 仅登记(既有覆盖) | +| 173 | `path/graph.ts:70,74,78`、`system.ts:40` | `graph.test.ts` / `system.test.ts` 既有缺绑定用例 | 仅登记(既有覆盖) | +| 179 | `replay/array.ts:448,500,544` | `array.test.ts` 既有越界 insert/delete/set 用例 | 仅登记(既有覆盖) | +| 183 | `path/graph.ts:82` | `graph.test.ts` 既有越界起点用例(F5,08-07) | 仅登记(既有覆盖) | +| 70 | `replay/array.ts:405,728` | 无 | **不可达**(编码/解码未知 param type 的 emit 点存在,但公开 API 会在 `add` 前以码 148 拦截;按 D-04 规则不写 `it.skip`) | +| 68 | `loader/loader.ts:121` | 无 | **不可达**(见下「不可达码」小节) | + +**计数核对:** 21 = 14 新增断言 + 5 仅登记 + 2 不可达。 + +## 不可达码(70 / 68) + +- **70**(`array.ts` 编码/解码未知 param type):emit 点在内部 `encode`/`decode`,但任何经公开 `IReplayArray.add` 传入的非法参数都会先被公开校验以 **148**(未知 param type)拦截,故 70 不可经公开 API 触发。按用户 Q1 对码 70 的裁定:记录为不可达,**不写 `it.skip`**。 +- **68**(`loader.ts:122` extra config id 冲突):`extraConfigs` 是 `Map`(`addExtraConfig` 以 identifier 为键),同一 identifier 至多一条任务;而 `configMap.has(id)` 的 68 守卫仅在「同一 id 的第二条额外配置任务兑现」时触发,故该守卫为死代码。经 `git log -p -S "this.dataLoaded ="` 确认 `loading`/`dataLoaded` 自首次提交起从未被赋值,`start()` 重入也无法制造同 id 双任务。故 68 不可经公开 API 触发。按 Q1 规则记录为不可达,**不写 `it.skip`**,并在 Issues/Deviations 中向用户说明。 + +## §9.2 陈旧登记码处置(契约变更,不补测) + +| code | 覆盖表登记 | 当前源码 | 处置 | +| --- | --- | --- | --- | +| 62 | `mapState` raw key 非数字 | `mapState.ts` 无 62 调用点(现发 60/61/121/55/122) | 契约变更(08-05 Q1=A 裁定),仅登记 | +| 63 | `mapState` 容器缺失 | 同上 | 契约变更,仅登记 | +| 64 | `mapState` 非法值/类型 | 同上 | 契约变更,仅登记 | +| 84 | `gameMap` 重复别名 | `gameMap.ts` 无 84;别名改由 `addLayer(alias)` 承担 | 契约变更,仅登记 | +| 130 | `mapLayer` 非本层图块 | `mapLayer.ts` 无 130 | 契约变更,仅登记 | +| 158 | `sandbox` 执行失败 | 无 158;统一改发 `error(72)`(08-02) | 契约码迁移 158→72,仅登记 | +| 175 | `sandbox` notExecuted 失败 | 无 175;同上 | 契约码迁移 175→72,仅登记 | +| 125 | 表外提及(排序楼层集不一致) | `mapState.ts` 无 125 调用点 | 契约变更,仅登记(08-05 无操作) | + +> 说明:计划 must_haves 写「7 个陈旧码」但列举了 8 项(含 125);此处按实际逐条列出,§9.2 规范陈旧集为 62/63/64/84/130/158/175(7 项),125 为表外补充提及。**不补测、不用生产改动复活任何陈旧码。** + +## Task Commits + +1. **Task 1: data-common + data-base 缺口码补测 + 基线对齐** — `b932f8c` (test) +2. **Task 2: data-system + data-state 缺口码补测(含 loader.test.ts)** — `47c6e2c` (test) +3. **Task 3a: E4 `attribute.perf.ts` 导入漂移修复** — `0b23ff5` (test) +4. **Task 3b: 覆盖矩阵登记 + 门禁收口** — 见「Metadata commit」(本 SUMMARY 与 STATE/ROADMAP) + +## Files Created/Modified + +- `packages-user/data-common/src/replay/__test__/sandbox.test.ts` — 删除过时 `playing=true` 预读绕过与 `IManualReplaySandbox`;过期读流出例改为自然步进后过期;新增码 73/194 用例。 +- `packages-user/data-common/src/store/__test__/tileStore.test.ts` — 新增码 133/134 断言与 `ItemStore`/`EnemyStore` 码 181 describe。 +- `packages-user/data-base/src/map/__test__/mover.test.ts` — `createMoverFixture(registerDir8?)` 参数化;新增码 192 用例。 +- `packages-user/data-base/src/map/__test__/mapLifecycle.test.ts` — reindex 用例改经 `map.resizeLayer(3,2,true)`(共享索引器宽度同步)。 +- `packages-user/data-base/src/hero/__test__/items.test.ts` — 新增码 193 用例。 +- `packages-user/data-base/src/hero/__test__/attribute.perf.ts` — `BaseHeroModifier` 改自 `../modifier` 导入(E4)。 +- `packages-user/data-system/src/event/__test__/eventDispatch.test.ts` — 新增码 171/172 用例。 +- `packages-user/data-system/src/path/__test__/system.test.ts` — 新增码 182 用例。 +- `packages-user/data-state/src/event/__test__/event.test.ts` — 新增码 1001 用例。 +- `packages-user/data-state/src/loader/__test__/loader.test.ts` — **新建**:66/67/69 断言与 MotaDataLoader 公开面。 +- `.planning/phases/08-test-refactor-alignment/deferred-items.md` — 结清 08-09 两项、登记域外既有 eslint 问题。 + +## Decisions Made + +见 frontmatter `key-decisions`(Q1–Q4、E1、E4)。 + +## Baseline Alignment(test:ci 测试侧失败) + +| 文件 | 基线失败 | 根因 | 对齐 | +| --- | --- | --- | --- | +| `sandbox.test.ts` | 6 例 | 测试用 `playing=true` 预读绕过;shipped `step()` 仅在 `!playing && !ended` 时惰性预读,绕过致 `appendingStep=null` | 删除绕过与 `start()` helper、`IManualReplaySandbox`;改用 shipped 自然 `step()`;过期用例先自然步进再过期 | +| `mapLifecycle.test.ts` | 1 例 | 用例直接调 `layer.resize` 绕过 `GameMap.resizeLayer`,共享 `MapLocIndexer.width` 未同步,点事件按旧宽索引(key 3 而非 4) | 改经 `map.resizeLayer(3,2,true)`,令 `indexer.setWidth` 先于 `cropPointEvents` | + +以上均为测试侧对齐,**未改生产**(`GameMap.resizeLayer` 与 `sandbox.ts` 的 shipped 行为即权威)。 + +## Deviations from Plan + +### 1. [E1 · 用户授权] 基线测试侧失败对齐(sandbox.test.ts / mapLifecycle.test.ts) + +- **Found during:** Task 1 基线 `pnpm test:ci`。 +- **Issue:** 基线 2 文件 7 例失败,与覆盖补测无关但阻断全绿门禁。 +- **Fix:** 测试侧对齐(见上表);未改任何生产文件。E1 明确授权测试侧对齐。 +- **Committed in:** `b932f8c`(Task 1)。 + +### 2. [E4 · 用户授权] `attribute.perf.ts` 收集失败修复 + +- **Found during:** Task 3 `pnpm test:perf` 复核。 +- **Issue:** `PerfModifier extends BaseHeroModifier` 报 `Class extends value undefined`;`attribute.perf.ts:3` 自 `../attribute` 导入(未导出),与 08-04 已修的 `attribute.test.ts` 同源漂移。 +- **Fix:** 改自 `../modifier` 导入;`test:perf` 6 文件 54 passed。 +- **Committed in:** `0b23ff5`(Task 3a)。 + +### 3. [Q1/code 68] 码 68 记为不可达而非补测 + +- **Found during:** Task 2 loader 覆盖设计。 +- **Issue:** 计划/Q3 期望覆盖 68,但 68 的触发条件(同一 extra config identifier 出现两条任务)因 `extraConfigs` 为 `Map` 而不可能发生;`loading`/`dataLoaded` 自始未赋值,重入也不产生同 id 双任务。逐字对照 `loader.ts:111-127` 与 `.prettierrc` 无关。 +- **Fix:** 按用户 Q1 对码 70 的裁定(emit 点存在但不可经公开 API 触发 → 记录不可达、**不写 `it.skip`**),将 68 记为不可达并在本 SUMMARY 与 Issues 中说明。**未伪造断言、未新增 skip。** +- **Impact:** `loader.test.ts` 覆盖 66/67/69 + MotaDataLoader 公开面;68 无测试但已记录理由。 + +### 4. [Scope · 提交边界] 181 落位既有 `tileStore.test.ts` + +- **Found during:** Task 1(Q1 要求 181 落 data-common store 层,但仅 loader.test.ts 获批新建)。 +- **Fix:** 在既有 `tileStore.test.ts` 追加独立 describe「ItemStore and EnemyStore duplicate registration」,不新建文件、不违反新文件批准约束。 + +### 5. [Scope · 域外] 既有 eslint prettier 报错不修复 + +- **Found during:** Task 3 全量 eslint 门禁。 +- **Issue:** `pnpm exec eslint packages-user/data-{common,base,system,state}/src` 报 46 errors / 6 warnings,全部为 `prettier/prettier` 格式(line wrapping),分布于 7 个本计划未触达的文件(含生产 `data-common/src/replay/func.ts`)。 +- **Evidence:** `git diff --stat HEAD` 对 7 文件为空——它们在 08-10 任何编辑前即存在于 HEAD `339f72d`。 +- **Fix:** 按 scope boundary 不修复;登记于 `deferred-items.md` 并在本 SUMMARY 说明。**本计划触达的全部文件 eslint 0 errors。** + +--- + +**Total deviations:** 1 基线测试侧对齐(授权)+ 1 E4 测试侧修复(授权)+ 1 不可达码记录(沿用 Q1 裁定)+ 1 落位替代 + 1 域外 lint 登记。 +**Impact on plan:** 零生产改动、零新增依赖、零新增 `it.skip`;覆盖矩阵 14/14 新增码全部有通过断言;未弱化/未删除任何既有用例。 + +## Issues Encountered + +- **环境:node_modules 全量 junction 为「untrusted mount point」。** 本执行 shell 为高完整性(elevated),无法遍历由非提升进程 pnpm 创建的全量 3899 个 junction,`pnpm test:ci`/`vitest`/`eslint` 均 `Cannot find module`。经确认根因为 Windows「untrusted mount point」校验,以提升权限重建同名 junction(仅重建 reparse point,未增删任何包、未改 lockfile)后恢复;此为环境修复,非仓库改动,`git status` 无相关变更。(供知悉:如用户在普通(非提升)终端运行,原本即可正常遍历。) + +## Known Stubs + +None。新增断言全部驱动真实 emit 路径(`logger.catch` 捕获到目标 code);不可达码 70/68 明确不伪造覆盖。 + +## Threat Flags + +None——未引入新的网络/鉴权/文件访问/信任边界表面。`T-08-10-01..04/SC` 缓解均满足:每个新码以真实 `logger.catch`/spy 捕获 code(非空断言);陈旧码明确不补测、未用生产改动复活;新文件与测试内命名经 Task 0 批准(loader.test.ts);仅以显式路径 `git add` 提交、未提交用户并发改动;未安装任何包。 + +## Next Phase Readiness + +- Phase 08 覆盖侧收口完成:`test:ci` 65 文件全绿(727 passed / 1 skipped)、`test:perf` 6 文件 54 passed、触达文件 eslint 0。 +- 待用户裁决/知悉:码 68 与 70 为不可达死代码(本计划已记录,未改生产);7 个域外文件的既有 prettier eslint 报错(含生产 `func.ts`)未修,见 `deferred-items.md`。 +- Phase 08 剩余 `08-11-PLAN.md` 待执行;本计划完成不阻断 08-11。 + +--- + +*Phase: 08-test-refactor-alignment* +*Completed: 2026-10-08* + +## Self-Check: PASSED + +- FOUND: packages-user/data-state/src/loader/__test__/loader.test.ts +- FOUND: packages-user/data-common/src/replay/__test__/sandbox.test.ts +- FOUND: packages-user/data-common/src/store/__test__/tileStore.test.ts +- FOUND: packages-user/data-base/src/map/__test__/mover.test.ts +- FOUND: packages-user/data-base/src/map/__test__/mapLifecycle.test.ts +- FOUND: packages-user/data-base/src/hero/__test__/items.test.ts +- FOUND: packages-user/data-base/src/hero/__test__/attribute.perf.ts +- FOUND: packages-user/data-system/src/event/__test__/eventDispatch.test.ts +- FOUND: packages-user/data-system/src/path/__test__/system.test.ts +- FOUND: packages-user/data-state/src/event/__test__/event.test.ts +- FOUND: b932f8c (Task 1) +- FOUND: 47c6e2c (Task 2) +- FOUND: 0b23ff5 (Task 3a) diff --git a/.planning/phases/08-test-refactor-alignment/deferred-items.md b/.planning/phases/08-test-refactor-alignment/deferred-items.md index 8b8672d..c272310 100644 --- a/.planning/phases/08-test-refactor-alignment/deferred-items.md +++ b/.planning/phases/08-test-refactor-alignment/deferred-items.md @@ -4,5 +4,6 @@ Out-of-scope discoveries logged by executors; not fixed within the reporting pla | Discovered by | Item | Scope note | Status | | --- | --- | --- | --- | -| 08-09 | `pnpm test:perf` collects 6 files; `packages-user/data-base/src/hero/__test__/attribute.perf.ts` fails at collection with `TypeError: Class extends value undefined is not a constructor or null` (`:162 class PerfModifier extends BaseHeroModifier`) | data-base file; untouched by 08-09 (zero production and zero data-base changes). Pre-existing since the 08-01 migration commit `36d8b4f`. Expected to be covered by the data-base alignment plan. | deferred | -| 08-09 | `packages-user/data-common/src/replay/__test__/sandbox.test.ts` fails 6 cases because `ReplaySandbox.step()` no longer pre-reads when `playing` is set manually | data-common file; untouched by 08-09. Pre-existing shipped-contract drift (the shipped `step()` pre-reads only when `!playing && !ended`). Expected to be covered by the data-common alignment plan. 08-09 aligned the data-state consumer (`dataClosure.test.ts`) to the shipped natural pre-read. | deferred | +| 08-09 | `pnpm test:perf` collects 6 files; `packages-user/data-base/src/hero/__test__/attribute.perf.ts` fails at collection with `TypeError: Class extends value undefined is not a constructor or null` (`:162 class PerfModifier extends BaseHeroModifier`) | Test-side import drift: `BaseHeroModifier` was imported from `../attribute` (not exported); corrected to `../modifier` in 08-10. | resolved by 08-10 | +| 08-09 | `packages-user/data-common/src/replay/__test__/sandbox.test.ts` fails 6 cases because `ReplaySandbox.step()` no longer pre-reads when `playing` is set manually | Test-side obsolete `playing=true` pre-read bypass; aligned to shipped natural `step()` in 08-10. | resolved by 08-10 | +| 08-10 | Pre-existing `prettier/prettier` eslint errors (46 errors across 7 files) unrelated to this plan's changes and present at HEAD `339f72d` before any 08-10 edit — `data-base/src/enemy/__test__/{manager,saveLoad}.test.ts`, `data-base/src/hero/__test__/{follower,location}.test.ts`, `data-system/src/combat/__test__/{context,damage}.perf.ts`, and production `data-common/src/replay/func.ts`. All are `--fix`-able formatting-only (line wrapping); verified via `git diff --stat HEAD` that the files are unmodified by 08-10. | Out of scope (scope boundary: do not fix pre-existing lint in unrelated files); `func.ts` is production so fixing would violate the zero-production-change constraint. Surfaced in 08-10-SUMMARY. All files touched by 08-10 pass eslint with 0 errors. | deferred |