diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md
index bf0d434..8d4cc42 100644
--- a/.planning/ROADMAP.md
+++ b/.planning/ROADMAP.md
@@ -457,7 +457,7 @@ Plans:
- [ ] 08-01-PLAN.md — 全量目录迁移到 `__test__/`(Rule A/B 分流改相对导入 + `script/test-data-node.ts:67,122` 硬编码路径;门禁=文件数守恒 66/6、零配置/零生产改动)
- [x] 08-02-PLAN.md — data-common 对齐(`utils.test.ts` 退役、`DirectionMapper` 删除、`addHook().load()` 移除、158/175→72;含经确认的 sandbox 首步预读生产修复)
- [x] 08-03-PLAN.md — data-base enemy+flag 对齐(真实 `TileStore` + 注册图块、删 legacy bridge、`getPrefab` 签名 `number|string` 类型修正、flag 读档重建语义对齐)
-- [ ] 08-04-PLAN.md — data-base hero 对齐(录像桩 `route`→`array`、`getItem`→`addItem`、`setFloor(IGameMap)`)
+- [x] 08-04-PLAN.md — data-base hero 对齐(录像桩 `array`、删 `.load()`、真实 `TileStore`/`ItemStore(tileStore)`、`setFloor(IGameMap|null)`、`getItem`→`addItem`;含经确认的 `equipment.loadState` 读档禁录修复)
- [ ] 08-05-PLAN.md — data-base map 对齐(`addLayer(alias)`、`MapState(state)`;陈旧码 62/63/64/84/130/125 裁决)
- [ ] 08-06-PLAN.md — data-system combat+event 对齐(`CombatFlow` 构造、`.load()` 移除、DEV 守卫码)
- [ ] 08-07-PLAN.md — data-system path 对齐(`useMapState` 删除、`useFaceHandler` 注入)
@@ -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. 测试重构与接口对齐 | 2/11 | In Progress | - |
+| 8. 测试重构与接口对齐 | 3/11 | In Progress | - |
diff --git a/.planning/phases/08-test-refactor-alignment/08-04-PLAN.md b/.planning/phases/08-test-refactor-alignment/08-04-PLAN.md
index a1f8354..0573285 100644
--- a/.planning/phases/08-test-refactor-alignment/08-04-PLAN.md
+++ b/.planning/phases/08-test-refactor-alignment/08-04-PLAN.md
@@ -97,6 +97,12 @@ Output: 12 个既有文件的对齐改动;零生产改动、零新增依赖。
- **Q2**:录像桩的测试内接口名(如 `ReplayRouteStub`)与相关用途注释如何随 `route`->`array` 改名——保留旧名/改为无 `route` 语义的新名/一并更新注释(R1 注释范围)。任何新的测试内标识符命名需用户先批准。
- **Q3**:`HeroItems.getItem`→`addItem`/`getItemState` 的替代是否保持原用例意图(用例自述「getItem 等价于增加一个道具」)。
+
+ **裁决日期:** 2026-10-04(用户「可以执行」)
+ - **Q1 = B:** 生产实现 `HeroLocation.setFloor` 改为收 `IGameMap | null`,`null` 时置 `floorId = undefined`、`map = null` 并通知 `onSetFloor(null)`;测试同时覆盖传真实 `IGameMap` 与传 `null` 两半。
+ - **Q2:** 测试录像桩 `ReplayRouteStub` / 成员 `route` → `ReplayArrayStub` / `array`(保留 `disable`/`revert`),同步用途注释。
+ - **Q3:** `HeroItems.getItem` 已删除,改用 `addItem`(按原用例意图)。
+
RESEARCH §8.7、PATTERNS `P4`/`P6`。D-05 禁止新增接口;D-10 默认零生产改动,`setFloor(null)` 是否属重构遗漏由用户裁定。既有唯一 `it.skip` 是 `equipment.test.ts:353`(码 147),本计划不改其 skip 状态。
diff --git a/.planning/phases/08-test-refactor-alignment/08-04-SUMMARY.md b/.planning/phases/08-test-refactor-alignment/08-04-SUMMARY.md
new file mode 100644
index 0000000..538f653
--- /dev/null
+++ b/.planning/phases/08-test-refactor-alignment/08-04-SUMMARY.md
@@ -0,0 +1,54 @@
+# 08-04 SUMMARY — data-base hero 对齐
+
+**执行日期:** 2026-10-04
+**计划:** `08-04-PLAN.md`
+**状态:** 完成(聚焦 11 文件 / 114 passed + 1 skipped;eslint 0;已提交)
+
+## Task 0 裁决与执行期追加裁决(用户)
+
+- **Q1 = B**:生产实现 `HeroLocation.setFloor` 改收 `IGameMap | null`,`null` 清空楼层。
+- **Q2**:录像桩 `ReplayRouteStub`/`route` → `ReplayArrayStub`/`array`(同步注释)。
+- **Q3**:`HeroItems.getItem` 已删,改用 `addItem`。
+- **P1(更正后)**:`EquipmentState` 同实例读档失败属**测试用法过时**(生产 `HeroEquipsStore.loadState` 始终读入新实例);改为「读档到新实例」对齐,**不改生产**。
+- **P2(生产修复)**:`HeroEquipment.loadState` 补 `replay.disable()`/`replay.revert()` 包裹重新装备循环(WR-06 回归,`7743795` 丢失)。
+- **P3 = A**:容器 `IHeroState` 已移除 `rendering`/`followers`(归渲染端);测试移除相应引用与容器覆盖。
+
+## 生产改动(2 处,均经批准)
+
+| 文件 | 改动 |
+|------|------|
+| `hero/location.ts` | `setFloor(map: IGameMap \| null)`;`null` 时 `floorId=undefined`、`map=null`、通知 `onSetFloor(null)`(Q1=B) |
+| `hero/equipment.ts` | `loadState` 的重新装备循环用 `replay.disable()`/`replay.revert()` 包裹,避免读档写录像(P2) |
+
+## 测试对齐改动(11 test + 1 perf 声明文件)
+
+- 录像桩 `route`→`array`:`equipment`/`items`/`follower`/`mover`/`saveLoad`。
+- 删全部 `addHook(...).load()`:`follower`(8)/`location`(1)/`rendering`(2,含 `controller.load()`)/`state`(2)。
+- `new ItemStore(tileStore)`:9 处(`ItemStore` 现需 `tileStore` 入参)。
+- `attribute.test.ts`:`BaseHeroModifier` 改自 `../modifier` 导入(原误从 `../attribute`)。
+- `items`:`getItem`→`addItem`;`equip.value/percentage` 由 `new Map` → `Object.fromEntries`(shipped 为 `Record`)。
+- `equipStore`/`equipment`/`saveLoad`:`item.equip.value/percentage` 同上。
+- `setFloor('')` → 真实 `IGameMap`(`MapState.createMap`):`location`/`state`/`saveLoad`。
+- `setFloor(undefined)` → `setFloor(null)`(`location.test.ts`),并补覆盖 `[floor, null]`。
+
+## 同引用相关歧义(已按用户既有裁决对齐,供知悉)
+
+| 位置 | 现状 | 处置 |
+|------|------|------|
+| `equipStore` #06-17-4 同引用保留 | 被用户 `7743795`(2026-09-23)改为 clear+重建 | 测试改为「读档重建实例、值恢复」 |
+| `flag` #06-17-5 同引用保留 | 被用户 `d74cc35`(2026-09-23)改为 clear+新建 | (08-03 已同向对齐) |
+| `HeroState` 容器 `equipment` 读档 | 随 equipStore 重建 | 测试改为「重建实例、值恢复」 |
+| `HeroState` 容器 `followers` 读档 | 容器已不含 `followers` | 移除该 describe(覆盖已在 `follower.test.ts` 的 `restoreFollowers` 用例) |
+| `HeroState` 容器 `rendering` | 容器已不含 `rendering` | 移除引用 |
+| `HeroState` `attribute` 读档 | 属性**保持同引用**(07-09 设计,仍生效) | 相关 `#06-17-1` 用例保持通过 |
+
+## 门禁证据
+
+- `pnpm exec vitest run packages-user/data-base/src/hero/__test__` → **11 passed / 114 passed + 1 skipped**(唯一 skip = `equipment.test.ts` 码 147,D-04 保留)。
+- `pnpm exec eslint --fix` 后 **0 报错**。
+- 非测试生产改动仅 `hero/location.ts`、`hero/equipment.ts`(均经批准)。
+- 仓库级 skipped 仍为 1。
+
+## 并发保护(D-08)
+
+- 未触碰、未暂存、未提交任何用户并发改动。