docs(04-13): 部分 UI 进一步接口适配只读影响台账(D-71/D-72 第一步)

- 新增 04-UI-ADAPTATION-IMPACT.md:元信息块 + 12 小节 + A–F 六类固定列序表 + 修改点汇总 + 处置
- A 7 / B 5 / C 2 / D 5 / E 4 条事实行(每行 ≥2 个 file:line 锚点)+ F 5 条 undetermined
- 新增 04-13-SUMMARY.md:只读基线 / A–F 落点 / 门禁实测 / 人工复核 / 无运行时验证声明
- 生产源码零改动;material/ 与 legacy 与用户并发改动零触碰;REND-01 / REND-02 保持 Pending
This commit is contained in:
unanmed 2026-09-30 14:53:41 +08:00
parent faba3d3c11
commit 26e2fb7dd2
2 changed files with 412 additions and 0 deletions

View File

@ -0,0 +1,225 @@
---
phase: 04-render-adaptation
plan: 13
subsystem: render-ui-interface-adaptation
tags: [read-only, impact-ledger, d71-d72, global-loading-hook, loader-refactor, d69-barrel]
requires:
- phase: 04-render-adaptation
provides: 用户裁定 D-71 / D-72 / D-73(部分 UI 进一步接口适配·第一步只读收集)写入 04-CONTEXT.md
- phase: 04-render-adaptation
provides: 基准提交 d8fa4b8(删除全局 loading / hook 与旧加载系统);既有台账 04-TEXTURE-INTERFACE-IMPACT.md / 04-STRUCTURE-MIGRATION-IMPACT.md(格式模板)
provides:
- .planning/phases/04-render-adaptation/04-UI-ADAPTATION-IMPACT.md(部分 UI 进一步接口适配·第一步只读影响台账;A–F 六类 + 修改点汇总)
- 供第二步(D-72 适配实施)消费的修改点汇总(沿用 / undetermined 标注)
affects: [04-render-adaptation]
actuals:
tokens: 21000
tasks: 5
commits: 1
plan_head_before: faba3d3c11a6ca1f5c0a900ce7c73131c2a5cc8e
tech-stack:
added: []
patterns:
- "只读影响台账:元信息块 + 12 小节 + A–F 六类固定列序表 + 修改点汇总 + 处置"
- "证据纪律:事实行每行 ≥2 个 file:line 锚点;证据行带 [证据行] 标记 + 核对命令"
- "只登记不判定:静态阅读不能定论者一律进 F 类(未猜测),不得写成错配 / 缺失 / 残留 / 待办"
key-files:
created:
- .planning/phases/04-render-adaptation/04-UI-ADAPTATION-IMPACT.md
- .planning/phases/04-render-adaptation/04-13-SUMMARY.md
modified: []
deleted: []
key-decisions:
- "本 run 为纯只读收集(D-71 / D-72 第一步):生产源码改动 0,files_modified 仅台账;Task 1/2/3 不独立提交,Task 4 单次白名单提交"
- "A–E 事实行统一覆盖:A 7 条(UI 4 + 边界非 UI 3)/ B 5 条 / C 2 条 / D 5 条 / E 4 条;F 5 条;修改点汇总 8 行"
- "statusBarUpdate(多对象聚合)/ restart(无新发射者)/ load.tsx progress 迭代等价写法 / 边界面是否纳入 一律进 F 类 undetermined,不臆测"
- "Task 4 门禁脚本 #2(E legacy 命中 计数)在 PowerShell 5.1 下 `\\b` 转义不可直跑,按原样语义改由临时脚本执行,判据不变(见 Deviations)"
requirements-completed: []
duration: ~25min
completed: 2026-09-30
status: complete
---
# Phase 4 Plan 13: 部分 UI 进一步接口适配·第一步(只读收集)Summary
**对数据端 `d8fa4b8 refactor: Delete global loading & hook object` 后渲染端「部分 UI」仍依赖已删全局 `loading` / `hook` 与旧加载系统的使用点做只读清点,产出影响台账 `04-UI-ADAPTATION-IMPACT.md`(元信息块 + 12 小节 + A–F 六类固定列序表 + 修改点汇总 + 处置);A / B / C / D / E 事实行均带 `file:line` 锚点,未确定者一律进 F 类「只登记不判定」;生产代码零改动、未引入任何命名变更、无运行时验证(D-68 的延续)。**
## Performance
- **Duration:** ~25min
- **Started:** 2026-09-30
- **Completed:** 2026-09-30
- **Tasks:** 5(Task 0 blocking-human 汇报关卡 — 用户已回复「可以执行」;Task 1 tracer;Task 2;Task 3;Task 4 收口)
- **Files:** 1 新增(`04-UI-ADAPTATION-IMPACT.md`)+ 本 SUMMARY;生产源码改动 **0**
## 只读起始基线(Task 1 步骤 0a)
- **只读起始基线(packages / packages-user / src):** `(无)`
- **起始 HEAD:** `faba3d3c11a6ca1f5c0a900ce7c73131c2a5cc8e`(short `faba3d3`)
- **起始分支:** `refine/data-client`
- **基准提交:** `d8fa4b8`;`git merge-base --is-ancestor d8fa4b8 HEAD` 退出码 0;`packages-user/client-base/src/load/` 目录不存在(`Test-Path` → `False`)。
- **用户并发改动:** `.planning/phases/04-render-adaptation/04-CONTEXT.md` 的既有未提交改动仍在(porcelain ` M`);本 run 未回滚 / 暂存 / 提交 / 修改(D-56)。
## Accomplishments
**唯一交付物:** `.planning/phases/04-render-adaptation/04-UI-ADAPTATION-IMPACT.md`(只读)。
| 节 | 落点 | 条目数 |
|---|---|---|
| 元信息块 + 只读起始基线 + 背景 + 方法 + 基准变更(d8fa4b8) | 6 行元信息块;porcelain 原样(空);D-71 / D-72 / D-73 要点;A–F 判定口径表;`d8fa4b8` 删除 16 文件(旧加载系统 4 + `data-base/game.ts` 273 行 + 13 文件用法改注释) | — |
| **A 全局 loading / hook 使用点(UI 面)** | `load.tsx` 旧加载接口(A-01)、装配链不可达(A-02)、`main.tsx` `statusBarUpdate`(A-03)、`render/index.tsx` `restart`(A-04);边界非 UI(A-05 `client.ts` / A-06 `client-modules/index.ts` / A-07 `entry-client/create.ts`)只报告 | **7** |
| **B 目标对象与钩子 API 证据** | A-01 → `IMotaDataLoader` / `ILoadManager`(可确定);A-02 / A-03 / A-04 / A-05..A-07 → **undetermined**(交叉引用 F 类) | **5** |
| **C 旧加载 UI 清单与新加载系统** | 旧侧 `LoadScene` / `LoadSceneUI` + 装配链 + 已删 `client-base/src/load/**` / `IMotaAssetsLoader` / `use.ts:onLoaded`;新侧 `@motajs/loader` + `data-state/src/loader/**` + `CoreState.loader` / `loadManager` | **2** |
| **D 分层与 barrel(D-69)检查** | `render/ui/index.ts`(无 `./load` 导出)/ `render/index.tsx:43-49` / `client-modules/src/index.ts:9-16` / `client-base/src/index.ts:1-8` 均**不违反 D-69**;`packages/client/src/index.ts:1` 跨包转发违反 D-69(`packages/` 只报告) | **5** |
| **E legacy 命中(仅报告)** | `core.*`(E-01)、`client` / `state` 单例(E-02)、legacy-ui 经 `Mota.require` 取已删 `hook` / `loading`(E-03)、`[证据行]` `render/ui` 内 `Mota.require` 零命中(E-04) | **4** |
| **F 未能从阅读确定(未猜测)** | F-01 旧加载 UI 进度数据来源 / F-02 `progress` 迭代等价写法 / F-03 `statusBarUpdate` 精确对象集合 / F-04 `restart` 无新发射者 / F-05 边界面是否纳入 | **5** |
| **修改点汇总(供后续执行计划消费)** | 8 行固定列表(文件 file:line / 现状 / 应改对象或 undetermined / 归属 / 置信) | **8** |
**A–E 表列数:** A 7 / B 5 / C 2 / D 5 / E 4 = **23** 条分类行(门禁实测一致)。
## Task Commits
1. **Task 0(blocking-human 汇报关卡)** — 用户已回复「可以执行」,无文件改动、无提交
2. **Task 1(tracer)** — 台账骨架 + 12 小节 + tracer 行(A-01 / A-02 等;门禁全绿,无独立提交)
3. **Task 2** — A 类剩余 UI 面 + 边界非 UI 面 + B 类证据铺开 + F-03..F-05(门禁全绿,无独立提交)
4. **Task 3** — C / D / E / F 铺开与 `## 修改点汇总` 定稿(门禁全绿,无独立提交)
5. **Task 4** — 收口门禁 + 人工复核 + 本 SUMMARY + 白名单提交
**Plan metadata:** 单一白名单提交(见「提交记录」)。计划 Task 1/2/3 的 action 未定义独立提交步骤;Task 4 步骤 (10) 明示单次白名单提交(与 04-11 / 04-12 的单一提交口径一致)。
## 提交记录
- `docs(04-13): 部分 UI 进一步接口适配只读影响台账(D-71/D-72 第一步)` —— 单次白名单提交,仅含 `files_modified`(`04-UI-ADAPTATION-IMPACT.md`)+ 本 `04-13-SUMMARY.md`(提交 hash 见 orchestrator 回报 / `git log`)。
## A–F 落点表(关键锚点)
| 面 | 条目 | 关键 `file:line` 锚点 |
|---|---|---|
| **A 全局对象使用点** | A-01:`load.tsx` 旧加载接口 | `packages-user/client-modules/src/render/ui/load.tsx:36,71,72,76-79,91-92,118-119,139` ↔ `packages-user/data-state/src/types.ts:29` / `packages-user/data-state/src/loader/types.ts:19-72` |
| | A-02:装配链不可达 | `packages-user/client-modules/src/render/index.tsx:11,25`;`createGameRenderer` 定义 `:13`(`git grep` 无调用者) |
| | A-03:`statusBarUpdate` | `packages-user/client-modules/src/render/ui/main.tsx:140-143` + `:145-152` ↔ `packages-user/data-base/src/hero/types.ts:277-295` |
| | A-04:`restart` | `packages-user/client-modules/src/render/index.tsx:35-38` ↔ `packages-user/client-modules/src/action/hotkey.ts:507` / `packages-user/client-modules/src/render/ui/settings.tsx:112` |
| | A-05..A-07:边界非 UI(只报告) | `packages-user/client-modules/src/client.ts:88-92,124-127` / `packages-user/client-modules/src/index.ts:1-8` / `packages-user/entry-client/src/create.ts:16,31,34-41` |
| **B 目标对象证据** | B-01 可确定 | `packages/loader/src/types.ts:288-335` / `packages/loader/src/manager.ts:10-112` / `packages-user/data-state/src/loader/loader.ts:18-151` |
| | B-02..B-05 undetermined | `packages-user/data-state/src/core.ts:205-208` / `packages-user/data-state/src/loader/types.ts:4-17` |
| **C 旧 / 新加载系统** | C-01 旧侧 | `packages-user/client-modules/src/render/ui/load.tsx:35,165` / `packages-user/client-modules/src/render/use.ts:1-19` |
| | C-02 新侧 | `packages/loader/src/index.ts:1-5` / `packages-user/data-state/src/loader/index.ts:1-4` / `packages-user/data-state/src/core.ts:205-208` |
| **D barrel(D-69)** | D-01..D-04 合规 | `packages-user/client-modules/src/render/ui/index.ts:1-14` / `packages-user/client-modules/src/index.ts:9-16` / `packages-user/client-base/src/index.ts:1-8` |
| | D-05 只报告 | `packages/client/src/index.ts:1` |
| **E legacy(仅报告)** | E-01..E-04 | `packages-user/client-modules/src/render/ui/main.tsx:97` / `packages/legacy-ui/src/preset/ui.ts:13,222` / `packages-user/data-base/src/index.ts:1-2` |
| **F undetermined** | F-01..F-05 | 见台账 `## F` 一节 |
## 门禁实测结果(全部静态 — D-68 的延续)
| # | 门禁 | 结果(OK 行) |
|---|---|---|
| T1-1 | 台账骨架 + 12 小节 + tracer 行 `#04-13-A-01` | ✅ `OK ledger skeleton + tracer row` |
| T1-2 | A–E 事实行 ≥2 锚点 | ✅ `OK anchor discipline: 23 classed rows` |
| T1-3 | 生产树零改动 | ✅ `OK no production changes (read-only)` |
| T1-4 | CRLF | ✅ `OK CRLF ledger` |
| T2-1 | A/B/F 铺开(`main.tsx` / `render/index.tsx` / 边界面 + F-03..F-05) | ✅ `OK A/B/F expansion` |
| T2-2 | 锚点纪律 + F ≥5 | ✅ `OK anchor discipline: 23 table rows, 5 F entries` |
| T2-3 | 生产树零改动 | ✅ `OK no production changes (read-only)` |
| T3-1 | C / D / E + 修改点汇总覆盖 | ✅ `OK C/D/E + summary coverage` |
| T3-2 | E 小节在场(`ui core/Mota hits today = 150`) | ✅ `OK E section present; ui core/Mota hits today = 150`(临时脚本,见 Deviations) |
| T3-3 | 最终纪律(锚点 + F ≥5 + 汇总表头) | ✅ `OK final: 23 table rows, 5 F entries, summary present` |
| T3-4 | 范围门禁(`REQUIREMENTS.md` 零改动 + 用户 `CONTEXT.md` 改动仍在) | ✅ `OK scope: read-only, REQUIREMENTS untouched, user CONTEXT edit preserved` |
| T3-5 | CRLF | ✅ `OK CRLF ledger` |
| T4-1 | 只读基线一致(当日基线为空) | ✅ `OK read-only baseline consistent (today entries = 0)` |
| T4-2 | 台账结构 / 内容 / tracer / 新加载系统 / D / E 关键锚点 | ✅ `OK ledger structure + tracer + expansion content` |
| T4-3 | 最终纪律(锚点 + F ≥5) | ✅ `OK final discipline: 23 rows, 5 F entries` |
| T4-4 | 范围门禁(`material/` / `packages/` / `src/` 空;`REQUIREMENTS.md` 零改动;用户 `CONTEXT.md` 保留) | ✅ `OK scope: material/packages/src clean; REQUIREMENTS untouched; user CONTEXT preserved` |
| T4-5 | 既有产物保护(`04-01`..`04-12` porcelain 空;无 `04-14+`) | ✅ `OK existing 04-01..04-12 artifacts untouched; no 04-14+ plan` |
| T4-6 | 台账 + SUMMARY CRLF + SUMMARY 在场 | ✅ `OK CRLF ledger + SUMMARY present` |
| T4-7 | `04-13-SUMMARY.md` 落盘且含 `04-13` / `D-71` / `D-72` / `只读` / `Pending` | ✅ `OK 04-13-SUMMARY.md present and keyed` |
**门禁时刻 porcelain(`packages packages-user src`):** **0** 条(本计划为只读,生产树零改动);用户 `04-CONTEXT.md` 的未提交改动(工作树内 ` M`)全程未触碰。
## 人工复核结论(Task 4 步骤 8)
逐条打开当日源码核对,**全部通过,无偏差**:
- A 类每条锚点指向真实存在的旧接口调用 / 被注释监听点:`load.tsx:36,71,72,76-79,91-92,118-119,139`(旧加载接口)、`main.tsx:140-143`(手工调用)/`:145-152`(被注释 `hook.on`)、`render/index.tsx:35-38`(被注释 `hook.on('restart')`)、`client.ts:88-92,124-127`、`entry-client/src/create.ts:16,31,34-41` 均实读确认。
- B 类目标对象证据锚点指向真实声明:`packages-user/data-state/src/loader/types.ts:19-72`(`IMotaDataLoader`)、`packages/loader/src/types.ts:288-335`(`ILoadManager`)、`packages-user/data-state/src/core.ts:205-208`(装配)、各 hero / map / replay hooks 接口行均实读确认。
- C 类旧侧「已删除」由当日 `git grep` 复验:`git grep -n "IMotaAssetsLoader" -- packages-user packages src` 零命中;`initSystemLoadTask` 仅剩 `load.tsx:71` 无效调用点;`packages-user/client-base/src/load/` 目录不存在。
- `createGameRenderer` 无调用者由 `git grep -n "createGameRenderer" -- packages-user packages src` 复验(仅 `render/index.tsx:13` 定义行)。
- D 类 barrel 导出集合与 D-69 判定一致(4 个渲染端 barrel 全同目录 `export *`;`render/ui/index.ts` 确无 `./load`)。
- E 类 legacy 命中与 `git grep` 输出一致(`render/ui` 内 `core.*` 150 行;`Mota.require` 零命中);E 全节无修复 / 待办措辞。
- F 类 5 条均未越过「只登记不判定」边界,无「错配 / 缺失 / 残留 / 待办」措辞。
## Decisions Made
- **只读收集小切片(D-71 / D-72 第一步)**:唯一交付物为台账 + 本 SUMMARY;生产源码改动 0,`files_modified` 仅台账。
- **单一白名单提交**:Task 1/2/3 不独立提交;Task 4 步骤 (10) 单次提交,仅暂存台账 + SUMMARY。
- **undetermined 纪律**:`statusBarUpdate`(多对象聚合)/ `restart`(无新发射者)/ `load.tsx` progress 迭代等价写法 / 边界面是否纳入 一律进 F 类,不臆测目标对象。
- **未写其它 `.planning/` 文件**:除本 SUMMARY 外未写 `STATE.md` / `ROADMAP.md` / `WINDOWS.md` / `REQUIREMENTS.md`(`REND-01` / `REND-02` 保持 Pending)。
## Deviations from Plan
### Auto-fixed Issues
**1. [Rule 3 - Tooling] Task 4 门禁 #2(E 小节计数)在 PowerShell 5.1 下不可直跑**
- **Found during:** Task 3 门禁执行(`E legacy 命中(仅报告)` 计数门禁)
- **Issue:** 计划门禁以 `node -e "..."` 内嵌 `git grep -E "\\bcore\\.|\\bMota\\.require\\b"`;本环境 shell 为 Windows PowerShell 5.1,反斜杠与双引号转义组合被 shell 吞并 / 截断(`CommandNotFoundException`),node 收到破损脚本。
- **Fix:** 将门禁脚本按**逐字语义**落到仓库外临时文件 `C:\Users\13194\AppData\Local\Temp\opencode\gate-e.js` 后执行 `node <file>`;判据(台账含 `E legacy 命中(仅报告)` + 输出 `ui core/Mota hits today` 计数)与计划完全一致,结果 `OK E section present; ui core/Mota hits today = 150`。
- **Files modified:** 无生产文件(临时工装,位于仓库外)
- **Commit:** 不适用
**2. [Rule 3 - Doc] Task 3 门禁要求精确子串 `legacy-ui/src/preset/ui.ts:13,222`**
- **Found during:** Task 3 门禁执行(C/D/E 覆盖门禁)
- **Issue:** 初稿 E-03 命中处写作 `packages/legacy-ui/src/preset/ui.ts:13, packages/legacy-ui/src/preset/ui.ts:222`,门禁要求的紧凑形式 `ui.ts:13,222` 不存在。
- **Fix:** 将 E-03 命中处改为 `packages/legacy-ui/src/preset/ui.ts:13,222, packages/legacy-ui/src/preset/ui.ts:222`,判据满足且事实不变。
- **Files modified:** 台账(本计划 `files_modified` 内)
- **Commit:** 含于 Task 4 单次白名单提交
---
**Total deviations:** 2(1 门禁执行方式、1 台账措辞)——**均不涉及生产代码,所有实质判据全部通过**。
## Known Stubs (只报告不处置)
| # | 余留 | 位置 | 说明 |
|---|---|---|---|
| 1 | `statusBarUpdate` 目标对象未定 | `packages-user/client-modules/src/render/ui/main.tsx:145-152` | 多对象聚合(含不可 hook 的 `client.hero.attribute`);F 类 F-03 交用户裁决 |
| 2 | `restart` 无新发射者 | `packages-user/client-modules/src/render/index.tsx:35-38` | F 类 F-04 交用户裁决 |
| 3 | 旧加载 UI `progress` 迭代等价写法未定 | `packages-user/client-modules/src/render/ui/load.tsx:76-79` | F 类 F-01 / F-02 交用户裁决 |
| 4 | 边界非 UI 面是否纳入适配范围未定 | `client.ts` / `client-modules/src/index.ts` / `entry-client/src/create.ts` | F 类 F-05 交用户裁决 |
| 5 | `createGameRenderer` 无调用者(旧加载 UI 当前不可达) | `packages-user/client-modules/src/render/index.tsx:13` | 事实登记(A-02);是否纳入由用户裁定 |
> 依计划 prohibitions 与 Task 4 步骤 (11),未写入 `.planning/WINDOWS.md` / `STATE.md` / `ROADMAP.md`(本步仅允许写台账与 SUMMARY)。
## Issues Encountered
- 见「Deviations from Plan」的 2 处(1 门禁脚本 shell 兼容性 + 1 台账措辞),均已按规则处置,无生产代码影响。
## 无运行时验证声明(D-68 的延续)
- 本步**没有「保证能运行」的要求**:**未运行** `pnpm check:type` / `pnpm build`,**未使用** TS 诊断数(全仓或范围内)作为任何门禁或验收项。
- 证明方式全部为**静态**:`git status --porcelain` 基线一致 / 台账结构与锚点 / 分类关键词 / 禁用路径 porcelain / CRLF / 既有产物保护,辅以人工代码复核。
## User Setup Required
None - no external service configuration required.
## Next Phase Readiness
- **第一步(只读收集)完成**:A 7 / B 5 / C 2 / D 5 / E 4 / F 5 条 + 修改点汇总 8 行;可确定目标对象(`load.tsx` 旧加载接口 → `IMotaDataLoader` / `ILoadManager`)与 undetermined 项分离清晰。
- **第二步(适配实施)未规划**,待用户审阅 `04-UI-ADAPTATION-IMPACT.md` 后另行规划(D-72);本步不产出任何新 `*-PLAN.md`。
- **D-69 与 legacy 边界遵守**:D 类 4 个渲染端 barrel 均合规、`packages/` 旁注只报告;E 类 legacy 一律只报告、不修、不登记为待办。
- **范围零外溢**:`packages-user/client-base/src/material/**`(D-42 / D-48)、`packages/**`、`src/**`、测试文件全部零触碰;用户 `04-CONTEXT.md` 并发改动保留且未被提交。
- `REND-01` / `REND-02` 仍为 **Pending**;`.planning/REQUIREMENTS.md` 零改动。
---
*Phase: 04-render-adaptation*
*Completed: 2026-09-30*
## Self-Check: PASSED
- `.planning/phases/04-render-adaptation/04-UI-ADAPTATION-IMPACT.md`: FOUND(含 12 小节 + A–E 23 行 + F 5 条 + 修改点汇总 8 行)
- `.planning/phases/04-render-adaptation/04-13-SUMMARY.md`: FOUND
- 生产源码改动: 0(`git status --porcelain -- packages packages-user src` 为空);`material/` / `packages/` / `src/` 零触碰
- 用户并发改动 `04-CONTEXT.md`: PRESERVED(未提交、未触碰)
- `04-01`..`04-12` 既有产物: 零触碰;无 `04-14+`
- commits measured from ledger (`faba3d3c..HEAD`): 1

View File

@ -0,0 +1,187 @@
# 部分 UI 进一步接口适配影响范围清点(只读)
**日期:** 2026-09-30
**范围:** 被查对象 = 渲染端部分 UI(`packages-user/client-modules/src/render/ui/**` + `packages-user/client-modules/src/render/index.tsx`)对已删全局 `loading` / `hook` 与旧加载系统的使用点;边界(非 UI)面(`packages-user/client-modules/src/client.ts` / `packages-user/client-modules/src/index.ts` / `packages-user/entry-client/src/create.ts`)只报告;`packages/` 与 `src/` 仅报告(D-33 沿用)
**性质:** 只读清点(D-71 / D-72 第一步),未修改任何生产代码,未引入任何命名变更
**基准提交:** `d8fa4b8 refactor: Delete global loading & hook object`;当日 HEAD `faba3d3`(分支 `refine/data-client`)
**新加载系统基准:** `@motajs/loader` + `packages-user/data-state/src/loader/**`
**下一步:** 第二步(适配实施)未规划,待用户审阅本文件后另行规划(D-72)
## 只读起始基线
- **只读起始基线(packages / packages-user / src)**:执行 `git status --porcelain -- packages packages-user src`,当日实测输出**为空**,原样逐行记录:
- (无)
- 当日 HEAD = `faba3d3c11a6ca1f5c0a900ce7c73131c2a5cc8e`(short `faba3d3`),分支 `refine/data-client`;`git merge-base --is-ancestor d8fa4b8 HEAD` 退出码 0。
- `packages-user/client-base/src/load/` 目录**不存在**(`Test-Path` 返回 `False`);`d8fa4b8` 已在 HEAD 历史中。
- `.planning/phases/04-render-adaptation/04-CONTEXT.md` 的既有未提交改动**仍在**(`git status --porcelain` 显示 ` M .planning/phases/04-render-adaptation/04-CONTEXT.md`);本 run 不回滚 / 不暂存 / 不提交 / 不修改(D-56)。
## 背景
本文件是 Phase 4 第十三个增量(用户裁定 2026-09-25 · **D-71 / D-72 / D-73** 第一步)的交付物:对「部分 UI 的进一步接口适配」需修改点的**只读影响清点**。
- **D-71(目标):** 完成部分 UI 的进一步接口适配。此前已有一轮适配;数据端经用户近期调整(含 `d8fa4b8 refactor: Delete global loading & hook object`、加载系统重构等)后,仍有若干需适配的点:
1. **全局 `loading` / `hook` 对象已被删除** —— 组件不得再依赖这些全局对象监听全局钩子,必须在对应的对象上监听。
2. **加载系统重构** —— 现使用新的加载系统,旧的加载 UI 已不能用了,需要重新适配。
- **D-72(两步走):** 本目标至少两个计划 —— 第一个计划只做只读收集(清点需要修改的点,产出影响台账;生产代码零改动);第二个及后续才真正执行适配。第一个计划的产出是后续执行计划的输入。
- **D-73(边界延续):** 沿用既有约束 —— 范围外一律不改、不追平全部类型错误(D-33);`packages-user/client-base/src/material/**` 归用户、AI 不得改(D-42 / D-48);不考虑任何 legacy(D-49 / D-55 / D-65);不得触碰 / 提交用户并发改动(D-56);不要求「保证能运行」、不得以 `check:type` / `build` / TS 诊断数作为门禁(D-68);桶导出边界(**D-69**)继续适用。
本步**只清点、不修改、不规划第二步**。本文件不含修复方案、不含代码改动建议、不产出任何新 `*-PLAN.md`。
## 方法
**枚举面(两侧):**
- **(a)基准面(用户已调整)**:`d8fa4b8` 删除的全局 `loading` / `hook`(`packages-user/data-base/src/{game.ts,index.ts}`)与旧加载系统(`packages-user/client-base/src/load/**`、`IMotaAssetsLoader`);新加载系统 `@motajs/loader`(`packages/loader/src/{manager,starter,stream,task,types,index}.ts`)与 `packages-user/data-state/src/loader/{loader,types,hook,jsoncProcessor,index}.ts`、`CoreState.loader` / `loadManager`(`packages-user/data-state/src/core.ts`、`packages-user/data-state/src/types.ts`)。
- **(b)命中面**:渲染端部分 UI(`packages-user/client-modules/src/render/ui/**` 与 `packages-user/client-modules/src/render/index.tsx`)对上述旧接口的使用点;边界(非 UI)面(`packages-user/client-modules/src/client.ts` / `packages-user/client-modules/src/index.ts` / `packages-user/entry-client/src/create.ts`)**只报告**;`packages/` 与 `src/` 对照扫描**只报告**。
**判定口径(固定六类,一条记录只归一类,跨类拆条并互相引用):**
| 类别 | 含义 | 归属规则 |
|---|---|---|
| A | 全局 `loading` / `hook` 使用点(UI 面) | `render/ui/load.tsx`(经 `client.loader` 的旧加载接口)、`render/ui/main.tsx`(`statusBarUpdate` 监听 / 手工调用)、`render/index.tsx`(`restart` 监听);边界非 UI 面(`client.ts` / `client-modules/src/index.ts` / `entry-client/src/create.ts`)只报告 |
| B | 目标对象与钩子 API 证据 | 每处 A 给出应改监听 / 使用的对象 + 现行源码 `file:line` 证据,或显式 undetermined |
| C | 旧加载 UI 清单与新加载系统 | 旧侧 `LoadScene` / `LoadSceneUI` + 已删 `client-base/src/load/**` / `IMotaAssetsLoader`;新侧 `@motajs/loader` + `data-state/src/loader/**` + `CoreState.loader` / `loadManager` |
| D | 分层与 barrel(D-69)检查 | 逐个分明 barrel 的 `export *` 面,判定是否违反 D-69、是否存在转发 / 反向依赖候选;`packages/` 命中只报告 |
| E | legacy 命中(仅报告) | `core.*` / `Mota.require`(legacy)不修、不登记为待办;`client` / `state` 单例另属 D-23 / D-28 的只读范围(非 legacy),一并只报告 |
| F | 未能从阅读确定(未猜测) | 静态阅读不能定论项,只登记不判定;不得写成错配 / 缺失 / 残留 / 待办 |
**分列规则(写死,防止类别互相冒充):** A 记「全局 `loading` / `hook` 使用点」;B 记「目标对象与钩子 API 证据」;C 记「旧加载 UI 与新加载系统清单」;D 记「分层与 barrel(D-69)判定」;E 记「legacy 命中(仅报告)」;F 记「未能从阅读确定」。
**证据纪律:** A–E 的**事实行**每行至少 **2** 个完整 `文件:行` 锚点;**证据行**(零命中 / 对照扫描,仅在 ID / 项目单元格带 `[证据行]` 标记)改为必须携带核对命令(`git grep` / `git status --porcelain`)与原样结果,豁免 ≥2 计数;**非证据行带 `[证据行]` 标记即违规**。静态阅读不能定论者一律进 F 类,**不得写成错配 / 缺失 / 残留 / 待办**。
## 基准变更(d8fa4b8)
依据:`git show d8fa4b8 --stat --format="%H %s"`(共触及 16 个文件,`16 files changed, 32 insertions(+), 977 deletions(-)`)。
**① 删除旧加载系统(4 个文件):**
| 旧文件 | 删除行数 | 说明 |
|---|---|---|
| `packages-user/client-base/src/load/loader.ts` | 515 | 旧加载器实现 |
| `packages-user/client-base/src/load/types.ts` | 84 | 旧接口 `IMotaAssetsLoader`(`initSystemLoadTask` / `addCustomLoadTask` / `load` / `progress`) |
| `packages-user/client-base/src/load/data.ts` | 37 | 旧加载数据 |
| `packages-user/client-base/src/load/index.ts` | 3 | 旧 barrel |
同提交在 `packages-user/client-base/src/index.ts:1` 删除 `export * from './load';`(现行 `packages-user/client-base/src/index.ts:1-9` 仅剩 8 条同目录 `export *`)。现行 `packages-user/client-base/src/load/` 目录不存在(`Test-Path` 返回 `False`);`IMotaAssetsLoader` / `initSystemLoadTask` / `addCustomLoadTask` 在 `packages-user` / `packages` / `src` 源码面 `git grep` 均零命中。
**② 删除全局 `hook` / `loading`:**
- `packages-user/data-base/src/game.ts` 删除 273 行(原 `hook` / `gameListener` 渲染通知机制)。
- `packages-user/data-base/src/index.ts:1-2` 删除 `export * from './load';` 与 `export * from './game';`。
- `packages-user/entry-data/src/create.ts`(2 行)与 `packages-user/entry-data/src/index.ts`(6 行)同步移除。
**③ 把 16 个文件中的 `loading` / `hook` 用法改为注释(本步相关的 UI 面):**
- `packages-user/client-modules/src/client.ts`:`loading.once('loaded', ...)` + `fallbackLoad` / `loading.emit('assetBuilt')` 与 `loading.once('assetBuilt', initMapExtensions)` 改为注释(现行 `client.ts:88-92` 与 `client.ts:124-127`)。
- `packages-user/client-modules/src/index.ts`:删除 `import { loading }` 与 `loading.once('coreInit', () => { createGameRenderer(); })`(现行 `create()` 只 `patchAll()` + `createRender()`)。
- `packages-user/client-modules/src/render/index.tsx`:删除 `import { hook }` 与 `import { GameTitleUI }`;`hook.on('restart', ...)` 改为注释(现行 `render/index.tsx:35-38`)。
- `packages-user/client-modules/src/render/ui/load.tsx`:删除 `import { loading } from '@user/data-base';` 与 `loading.emit('loaded');` 一行(现行 `load.tsx` 无 `loading` 引用)。
- `packages-user/client-modules/src/render/ui/main.tsx`:删除 `import { hook }`;`hook.on('statusBarUpdate', ...)` / `hook.off(...)` 改为注释并补入手工单次调用(现行 `main.tsx:140-143` 与 `main.tsx:145-152`)。
- `packages-user/client-modules/src/render/use.ts`:删除 `import { loading }` 与 `onLoaded(hook)` 函数(现行 `use.ts` 不含 `onLoaded`)。
- `packages-user/entry-client/src/create.ts`:`loading.once('registered', ...)` / `loading.emit('clientRegistered')` / `createModule()` + `hook.emit('renderLoaded')` 改为注释或删除(现行 `create.ts:16,31,34-41`)。
**新加载系统基准(`d8fa4b8` 后的现行面):** `@motajs/loader`(`packages/loader/src/index.ts:1-5` 导出 `./manager` / `./starter` / `./stream` / `./task` / `./types`)与 `packages-user/data-state/src/loader/index.ts:1-4`(导出 `./hook` / `./jsoncProcessor` / `./loader` / `./types`)。
## A 全局 loading / hook 使用点(UI 面)
列序固定:`ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信`。本节登记**渲染端部分 UI 及其边界**对已删全局 `loading` / `hook` 与旧加载系统的使用点。**行内不含任何修复建议或改写写法**(应改对象见 B 类,未定者见 F 类)。
| ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信 |
|---|---|---|---|---|---|---|
| #04-13-A-01 | `load.tsx` 旧加载接口使用点(`client.loader` / `initSystemLoadTask` / `load` / `progress`) | packages-user/client-modules/src/render/ui/load.tsx:36, packages-user/client-modules/src/render/ui/load.tsx:71, packages-user/client-modules/src/render/ui/load.tsx:72, packages-user/client-modules/src/render/ui/load.tsx:76-79, packages-user/client-modules/src/render/ui/load.tsx:91-92, packages-user/client-modules/src/render/ui/load.tsx:118-119, packages-user/client-modules/src/render/ui/load.tsx:139 | packages-user/data-state/src/types.ts:29, packages-user/data-state/src/loader/types.ts:19-72, packages/loader/src/types.ts:288-335 | 旧加载 UI 按已删的旧加载接口编写:`:36` `const loader = client.loader;`、`:71` `loader.initSystemLoadTask()`、`:72` `loader.load()`、`:76-79` `for await (const _ of loader.progress)` 与 `loader.progress.getLoadedTasks()` / `getLoadedByte()`(`:75` 有 `@ts-expect-error 需要重构`)、`:91-92` `getLoadedTasks` / `getAddedTasks`、`:118-119` `getTotalByte` / `getLoadedByte`、`:139` `getByteRatio`。`client.loader` 现为 `ICoreState.loader: IMotaDataLoader`(`packages-user/data-state/src/types.ts:29`),其上无 `initSystemLoadTask` / `progress` 成员 | 该 UI 无法按旧接口工作;等价数据来源见 B / F 类 | 高 |
| #04-13-A-02 | 旧加载 UI 装配链(深导 + 打开时机,当前不可达) | packages-user/client-modules/src/render/index.tsx:11, packages-user/client-modules/src/render/index.tsx:25, packages-user/client-modules/src/render/index.tsx:13 | packages-user/client-modules/src/index.ts:4-7, packages-user/client-modules/src/render/index.tsx:13 | 旧加载 UI 经深导 `import { LoadSceneUI } from './ui/load'`(`render/index.tsx:11`)装配在 `createGameRenderer`(`render/index.tsx:13`)内,并在 `render/index.tsx:25` `sceneController.open(LoadSceneUI, {})` 打开。`git grep -n "createGameRenderer" -- packages-user packages src` **仅命中 `render/index.tsx:13` 定义行,无调用者**;`client-modules/src/index.ts:4-7` 的 `create()` 现只 `patchAll()` + `createRender()` | 事实登记:旧加载 UI 当前**不可达**;是否纳入第二步由用户裁定(F 类) | 高 |
| #04-13-A-03 | `main.tsx` `statusBarUpdate` 全局 `hook` 监听点与手工单次调用 | packages-user/client-modules/src/render/ui/main.tsx:140-143, packages-user/client-modules/src/render/ui/main.tsx:145-152 | packages-user/client-modules/src/render/ui/main.tsx:97, packages-user/client-modules/src/render/ui/main.tsx:101-132, packages-user/client-modules/src/render/ui/main.tsx:137, packages-user/data-base/src/hero/types.ts:277-295 | `:140-143` 为注释「保留函数调用,避免被识别为未使用函数而报错 / 后续修改后需要删除」+ `updateDataFallback()` / `updateStatus()` 手工单次调用;`:145-152` 为被注释的 `hook.on('statusBarUpdate', updateStatus)` / `hook.on('statusBarUpdate', updateDataFallback)` 与 `hook.off(...)`。状态更新函数(`:96-138`)读取 `core.status` / `client.hero.attribute` / `client.flags` 等。`d8fa4b8` 把这两处监听改为注释 | 状态栏更新不再由事件驱动;应改监听对象无法从阅读确定为单一对象(F 类 F-03) | 高 |
| #04-13-A-04 | `render/index.tsx` `restart` 全局 `hook` 监听点 | packages-user/client-modules/src/render/index.tsx:35-38 | packages-user/client-modules/src/render/ui/settings.tsx:112, packages-user/client-modules/src/action/hotkey.ts:507, packages-user/client-modules/src/render/ui/title.tsx:38 | `:35-38` 为被注释的 `hook.on('restart', () => { sceneController.closeAll(); sceneController.open(GameTitleUI, {}); })`。`d8fa4b8` 把该监听改为注释。`git grep -n "restart" -- packages-user/client-modules/src` 仅命中 hotkey 实现(`action/hotkey.ts:194,507`)、legacy `core.restart()`(`render/ui/settings.tsx:112`)与该注释行 `render/index.tsx:35`,**无新发射者** | 事件来源与新接线方式未定(F 类 F-04) | 高 |
| #04-13-A-05 | 边界(非 UI,仅报告)— `client.ts` 被注释的 `loading` 接线 | packages-user/client-modules/src/client.ts:88-92, packages-user/client-modules/src/client.ts:124-127 | packages-user/client-modules/src/client.ts:131, packages-user/client-modules/src/client.ts:137-148 | `client.ts:88-92` 为被注释的 `loading.once('loaded', () => { fallbackLoad(this.materials); loading.emit('assetBuilt'); })`;`client.ts:124-127` 为被注释的 `loading.once('assetBuilt', () => { this.initMapExtensions(); })`。`d8fa4b8` 把两处改为注释;`client.ts:131` 现走新加载系统 `this.loader.addCoreConfig('client', config.clientURL)`。此处非 UI(D-71 措辞为「组件 / UI」) | 仅报告;是否纳入第二步由用户裁定(F 类 F-05) | 高 |
| #04-13-A-06 | 边界(非 UI,仅报告)— `client-modules/src/index.ts` 的 `loading.once('coreInit')` 已移除 | packages-user/client-modules/src/index.ts:1-8 | packages-user/client-modules/src/render/index.tsx:13, packages-user/client-modules/src/render/index.tsx:43-49 | 现行 `client-modules/src/index.ts:1-8` 的 `create()` 只 `patchAll()` + `createRender()`;`d8fa4b8` 删除了 `import { loading }` 与 `loading.once('coreInit', () => { createGameRenderer(); })`。组合根不再经全局 `loading` 触发 `createGameRenderer`(`render/index.tsx:13`),故其无调用者 | 仅报告;是否纳入第二步由用户裁定(F 类 F-05) | 高 |
| #04-13-A-07 | 边界(非 UI,仅报告)— `entry-client/create.ts` 被注释的 `loading` / `hook` | packages-user/entry-client/src/create.ts:16,31,34-41 | packages-user/entry-client/src/create.ts:1-14, packages-user/entry-client/src/create.ts:18-29 | `create.ts:16` `// loading.once('registered', createModule);`、`create.ts:31` `// loading.emit('clientRegistered');`、`create.ts:34-41` 为被注释的 `createModule()`(`ClientModules.create()` / `LegacyUI.create()` / `main.renderLoaded = true` / `hook.emit('renderLoaded')`)。`d8fa4b8` 把这些接线改为注释;此处为入口组合根,非 UI | 仅报告;是否纳入第二步由用户裁定(F 类 F-05) | 高 |
**A 类小结:** UI 面 3 组(`load.tsx` 旧加载接口 A-01 / 装配链 A-02 / `main.tsx` `statusBarUpdate` A-03 / `render/index.tsx` `restart` A-04),边界非 UI 面 3 条(`client.ts` A-05 / `client-modules/src/index.ts` A-06 / `entry-client/create.ts` A-07)。**行内无修复建议。**
## B 目标对象与钩子 API 证据
列序固定:`ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信`。本节对 A 的每一处给出**应改监听 / 使用的对象**并附现行源码 `file:line` 证据,或显式 **undetermined(无法从阅读确定目标对象)**。**行内不写具体 import / 调用改写写法。**
| ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信 |
|---|---|---|---|---|---|---|
| #04-13-B-01 | A-01 目标对象 — 新加载系统(加载器 / 管理器 / 钩子) | packages-user/client-modules/src/render/ui/load.tsx:71, packages-user/client-modules/src/render/ui/load.tsx:72, packages-user/client-modules/src/render/ui/load.tsx:76-79 | packages-user/data-state/src/loader/types.ts:19-72, packages/loader/src/types.ts:288-335, packages/loader/src/manager.ts:10-112, packages-user/data-state/src/loader/loader.ts:18-151 | 旧加载 UI 应改依新加载系统的对象 / 钩子:`IMotaDataLoader`(`packages-user/data-state/src/loader/types.ts:19-72`:`start()` / `loaded()` / `manager` / `addCustomTask`)、`ILoadManager`(`packages/loader/src/types.ts:288-335`:`onStartLoad` / `onProgress` / `onLoadEnd` + `getLoadedByte` / `getTotalByte` / `getLoadedTasks` / `getAddedTasks` / `getTaskRatio` / `getByteRatio`)、实现 `LoadManager`(`packages/loader/src/manager.ts:10-112`)/ `MotaDataLoader`(`packages-user/data-state/src/loader/loader.ts:18-151`)。旧 UI 用到的 `getLoadedTasks` / `getAddedTasks` / `getTotalByte` / `getLoadedByte` / `getByteRatio` 在 `ILoadManager` 上均有对应成员 | 承接对象为 `IMotaDataLoader` / `ILoadManager`;`loader.progress` 异步迭代的等价写法 undetermined(F 类 F-02) | 高 |
| #04-13-B-02 | A-02 目标对象 — 数据端加载入口 | packages-user/client-modules/src/render/index.tsx:11, packages-user/client-modules/src/render/index.tsx:25 | packages-user/data-state/src/core.ts:205-208, packages-user/data-state/src/types.ts:26-43 | 新加载系统的数据端入口为 `CoreState.loader` / `CoreState.loadManager`:`core.ts:205` `this.loadManager = new LoadManager();`、`core.ts:206` `this.loader = new MotaDataLoader(this.loadManager, config.loadStarter);`、`core.ts:207-208` `this.loader.addHook(new DefaultDataLoaderHook()); this.loader.addCoreConfig('core', config.coreURL);`;契约见 `packages-user/data-state/src/types.ts:26-43`(`ICoreState.loader` / `ICoreState.loadManager`) | 旧加载 UI 的打开时机原由 `loading.once('coreInit')` 触发;新接线方式 **undetermined(无法从阅读确定目标对象)** | 中 |
| #04-13-B-03 | A-03 目标对象 — 状态栏可 hook 的数据端对象(候选集合) | packages-user/client-modules/src/render/ui/main.tsx:145-152 | packages-user/data-base/src/hero/types.ts:277-295, packages-user/data-base/src/hero/types.ts:428-443, packages-user/data-base/src/hero/types.ts:652-671, packages-user/data-base/src/hero/types.ts:883-903, packages-user/data-common/src/common/mover.ts:166, packages-user/data-base/src/map/types.ts:220, packages-user/data-base/src/map/types.ts:599, packages-user/data-common/src/replay/types.ts:80, packages-user/data-common/src/replay/types.ts:342 | 状态栏为**多对象聚合**:状态更新函数(`main.tsx:96-138`)读取 `client.hero.attribute`(只读属性对象 —— 该对象不可 hook)、`client.flags`、`core.status`(含 `core.status.replay`)等,另 `core.itemCount(...)` / `core.getNextLvUpNeed()` / `core.getLvName(...)` 等 legacy 调用。可 hook 的数据端对象接口候选:`IHeroLocationHooks` / `IHeroRenderingHooks` / `IEquipmentStateHooks` / `IHeroStateHooks` / `IObjectMoverHooks` / `IMapLayerHooks` / `IGameMapHooks` / `IReplaySandboxHooks` / `IReplaySystemHooks` | 单一目标对象无法从阅读确定 ⇒ **undetermined(无法从阅读确定目标对象)**;交叉引用 F 类 F-03 | 中 |
| #04-13-B-04 | A-04 目标对象 — `restart` 事件来源 | packages-user/client-modules/src/render/index.tsx:35-38 | packages-user/client-modules/src/render/ui/settings.tsx:112, packages-user/client-modules/src/action/hotkey.ts:507 | 全局 `hook` 删除后 `restart` **无新发射者**:`git grep -n "restart" -- packages-user/client-modules/src` 仅命中 legacy `core.restart()`(`render/ui/settings.tsx:112`)与 hotkey 实现(`action/hotkey.ts:194,507`)。事件由谁发出 / 应改在哪个对象上监听 **undetermined(无法从阅读确定目标对象)** | 交叉引用 F 类 F-04 | 中 |
| #04-13-B-05 | A-05 / A-06 / A-07 边界目标 — 新加载系统(配置 / 钩子) | packages-user/client-modules/src/client.ts:131, packages-user/client-modules/src/client.ts:137-148 | packages-user/data-state/src/loader/loader.ts:57-63, packages-user/data-state/src/loader/hook.ts:5-24, packages-user/data-state/src/loader/types.ts:4-17 | 边界非 UI 面的 `loading` / `hook` 接线目标为新加载系统的 `IMotaDataLoader`:`addCoreConfig` / `addExtraConfig`(`packages-user/data-state/src/loader/loader.ts:57-63`)、`IMotaDataLoaderHooks.onCoreConfigLoaded` / `onExtraConfigLoaded`(`packages-user/data-state/src/loader/types.ts:4-17`)、装配 `DefaultDataLoaderHook.onCoreConfigLoaded` 内 `addExtraConfig`(`packages-user/data-state/src/loader/hook.ts:5-24`) | 该面是否纳入「部分 UI」适配范围 **undetermined**;交叉引用 F 类 F-05 | 中 |
**B 类小结:** A-01 目标可确定(`IMotaDataLoader` / `ILoadManager`,惟 `progress` 迭代等价写法进 F 类);A-02 / A-03 / A-04 / A-05..A-07 的目标对象均**显式 undetermined** 并交叉引用 F 类。**每行含现行源码锚点。**
## C 旧加载 UI 清单与新加载系统
列序固定:`ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信`。**只登记事实与锚点,不给修复 / 改写建议。**
| ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信 |
|---|---|---|---|---|---|---|
| #04-13-C-01 | 旧侧 — 旧加载 UI 清单与已删旧加载系统 | packages-user/client-modules/src/render/ui/load.tsx:35, packages-user/client-modules/src/render/ui/load.tsx:165, packages-user/client-modules/src/render/index.tsx:11, packages-user/client-modules/src/render/index.tsx:13, packages-user/client-modules/src/render/index.tsx:25 | packages-user/client-modules/src/render/use.ts:1-19, packages-user/client-modules/src/render/index.tsx:29-41 | 旧加载 UI = `LoadScene`(`load.tsx:35`)/ `LoadSceneUI`(`load.tsx:165`)+ 装配点 `render/index.tsx:11,13,25`。旧系统 `packages-user/client-base/src/load/{loader.ts,types.ts,data.ts,index.ts}` 与旧接口 `IMotaAssetsLoader`(其 `initSystemLoadTask` / `addCustomLoadTask` / `load` / `progress` 成员)**已随 `d8fa4b8` 删除,现行不存在**(`git grep -n "IMotaAssetsLoader" -- packages-user packages src` 零命中;`initSystemLoadTask` 仅剩 `load.tsx:71` 的无效调用点)。另 `packages-user/client-modules/src/render/use.ts` 的 `onLoaded` 已随该提交删除(现行 `use.ts:1-19` 不含 `onLoaded`) | 事实登记;旧加载 UI 已不能用了,需重新适配(D-71) | 高 |
| #04-13-C-02 | 新侧 — 新加载系统提供物(入口 / API / 钩子) | packages/loader/src/index.ts:1-5, packages/loader/src/manager.ts:10-112, packages/loader/src/starter.ts:3-11, packages/loader/src/types.ts:194-266, packages/loader/src/types.ts:288-335 | packages-user/data-state/src/loader/loader.ts:18-151, packages-user/data-state/src/loader/types.ts:19-72, packages-user/data-state/src/loader/hook.ts:5-24, packages-user/data-state/src/loader/index.ts:1-4, packages-user/data-state/src/core.ts:205-208 | 新加载系统提供物 = `@motajs/loader`(`packages/loader/src/index.ts:1-5`;`LoadManager` `packages/loader/src/manager.ts:10-112`;`WebLoadStarter` `packages/loader/src/starter.ts:3-11`;`ILoadTask` / `ILoadTaskHooks` `packages/loader/src/types.ts:194-266`;`ILoadManager` `packages/loader/src/types.ts:288-335`)+ `packages-user/data-state/src/loader/**`(`MotaDataLoader` / `IMotaDataLoader` / `DefaultDataLoaderHook`;导出面 `packages-user/data-state/src/loader/index.ts:1-4`)+ `CoreState.loader` / `loadManager`(`packages-user/data-state/src/core.ts:205-208`)。**这些是新加载 UI 重新适配时必须使用的入口 / API / 钩子**(本步不写用法) | 事实登记(后续执行计划的输入) | 高 |
**C 类小结:** 旧侧(`LoadScene` / `LoadSceneUI` + 装配链 + 已删 `client-base/src/load/**` / `IMotaAssetsLoader` / `use.ts:onLoaded`)与新侧(`@motajs/loader` + `data-state/src/loader/**` + `CoreState.loader` / `loadManager`)均已登记并带 `file:line`。**未给任何修复方案。**
## D 分层与 barrel(D-69)检查
列序固定:`ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信`。逐条登记 barrel 的 `export *` 面,判定是否违反 D-69、是否存在为补齐导出面而转发 / 反向依赖的**候选**;`packages/` 命中只报告。
| ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信 |
|---|---|---|---|---|---|---|
| #04-13-D-01 | barrel — `render/ui/index.ts`(**无** `./load` 导出) | packages-user/client-modules/src/render/ui/index.ts:1-14 | packages-user/client-modules/src/render/index.tsx:11, packages-user/client-modules/src/render/ui/load.tsx:35 | `packages-user/client-modules/src/render/ui/index.ts`(14 行)的 `export *` 面为 `./controller` / `./main` / `./save` / `./settings` / `./statistics` / `./statusBar` / `./toolbar` / `./viewmap`(全同目录),**没有** `export * from './load'` ⇒ 旧加载 UI 不经 `ui` 桶暴露,由 `render/index.tsx:11` 深导 `./ui/load`。判定:该 barrel 全部同目录 `export *`,**不违反 D-69** | 事实登记;是否有转发 / 反向依赖候选由用户裁定 | 高 |
| #04-13-D-02 | barrel — `render/index.tsx`(7 条同目录 `export *`) | packages-user/client-modules/src/render/index.tsx:43-49 | packages-user/client-modules/src/render/index.tsx:11, packages-user/client-modules/src/render/index.tsx:13 | `render/index.tsx:43-49` 的 7 条 `export *`(`./fx` / `./ui` / `./utils` / `./weather` / `./renderer` / `./scene` / `./use`)全为同目录项(含同目录子文件夹 `./ui`),**不违反 D-69**。`render/index.tsx:11` 的 `./ui/load` 为目录内深导,与 barrel 边界无关 | 事实登记 | 高 |
| #04-13-D-03 | barrel — `client-modules/src/index.ts` | packages-user/client-modules/src/index.ts:9-16 | packages-user/client-modules/src/index.ts:1-8 | `client-modules/src/index.ts:9-16` 的 `export *` 面(`./action` / `./fallback` / `./render` / `./client` / `./core` / `./shared` / `./types`)全为同目录项,**不违反 D-69**;无跨包 / 上层转发 | 事实登记 | 高 |
| #04-13-D-04 | barrel — `client-base/src/index.ts`(8 条同目录 `export *`) | packages-user/client-base/src/index.ts:1-8 | packages-user/client-base/src/index.ts:1-9, packages-user/client-base/src/index.ts:1 | `client-base/src/index.ts:1-9` 的 8 条 `export *`(`./material` / `./save` / `./types` / `./layout` / `./shared` / `./components` / `./elements` / `./map`)全为同目录项,**不违反 D-69**;`d8fa4b8` 已删除 `export * from './load';` 一条 | 事实登记 | 高 |
| #04-13-D-05 | `packages/` 命中(只报告)— `packages/client/src/index.ts` | packages/client/src/index.ts:1 | packages-user/client-base/src/index.ts:1, packages-user/client-base/src/index.ts:1-9 | `packages/client/src/index.ts:1` 的 `export * from '@motajs/client-base'` 为**跨包转发**,**违反 D-69**,但在 `packages/`(D-33 **只报告**,不修改) | 仅报告;不修改 | 高 |
**D 类小结:** 4 个渲染端 barrel 节点(`render/ui/index.ts` / `render/index.tsx` / `client-modules/src/index.ts` / `client-base/src/index.ts`)均为同目录 `export *`,**不违反 D-69**;`render/ui/index.ts` 无 `./load` 导出(旧加载 UI 走 `render/index.tsx:11` 深导)。`packages/client/src/index.ts:1` 跨包转发违反 D-69 但只报告(D-33)。**未给补位 / 改指方案。**
## E legacy 命中(仅报告)
**本节仅报告:按 D-49 / D-55 / D-65 不考虑任何 legacy 内容,legacy 相关报错一律不管、不修、不登记为待办。**
列序固定:`ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信`。本节只登记事实与核对命令。
| ID | 项目 | 命中处 file:line | 目标锚点 / 证据 file:line | 问题描述 | 影响 | 置信 |
|---|---|---|---|---|---|---|
| #04-13-E-01 | `render/ui/*.tsx` 的 `core.*` 命中(legacy,仅报告) | packages-user/client-modules/src/render/ui/main.tsx:97, packages-user/client-modules/src/render/ui/settings.tsx:112, packages-user/client-modules/src/render/ui/statusBar.tsx:139, packages-user/client-modules/src/render/ui/toolbar.tsx:90, packages-user/client-modules/src/render/ui/viewmap.tsx:54 | packages-user/client-modules/src/render/ui/main.tsx:96-138, packages-user/client-modules/src/render/ui/load.tsx:35 | `git grep -n -E "\bcore\.|\bMota\.require\b" -- packages-user/client-modules/src/render/ui` 命中 `main.tsx`(`:97,101-132,137,158,168,201,210,219`)、`settings.tsx`(`:112,164-628`)、`save.tsx`(`:90-587`)、`statistics.tsx`、`statusBar.tsx`、`title.tsx`、`toolbar.tsx`、`viewmap.tsx` 等大量 `core.*`(旧引擎适配,D-12 / D-49 / D-55 / D-65)。**仅报告**,不修、不登记为待办 | 仅报告 | 高 |
| #04-13-E-02 | `client` / `state` 单例使用(D-23 / D-28 只读范围,另属非 legacy) | packages-user/client-modules/src/render/ui/load.tsx:27, packages-user/client-modules/src/render/ui/main.tsx:28, packages-user/client-modules/src/render/ui/main.tsx:32, packages-user/client-modules/src/render/ui/settings.tsx:28, packages-user/client-modules/src/render/ui/statusBar.tsx:15, packages-user/client-modules/src/render/ui/title.tsx:38, packages-user/client-modules/src/render/ui/toolbar.tsx:28 | packages-user/client-modules/src/render/ui/main.tsx:28, packages-user/client-modules/src/render/ui/main.tsx:32 | `git grep -n -F "from '../../core'" -- packages-user/client-modules/src/render/ui` 命中 6 处 `import { client } from '../../core'`(`load.tsx:27` / `main.tsx:32` / `settings.tsx:28` / `statusBar.tsx:15` / `title.tsx:38` / `toolbar.tsx:28`);`main.tsx:28` 另有 `import { state } from '@user/data-state'`。属 D-23 / D-28 的只读范围(**非 legacy**),一并只报告 | 仅报告 | 高 |
| #04-13-E-03 | legacy `Mota.require('@user/data-base')` 取已删 `hook` / `loading`(`packages/` 只报告) | packages/legacy-ui/src/preset/ui.ts:13,222, packages/legacy-ui/src/preset/ui.ts:222 | packages-user/data-base/src/index.ts:1-2 | `packages/legacy-ui/src/preset/ui.ts:13` `const { hook } = Mota.require('@user/data-base');`(`hook.once('mounted', ...)`)与 `packages/legacy-ui/src/preset/ui.ts:222` `const { loading } = Mota.require('@user/data-base');`(`loading.once('coreInit', ...)`)经 legacy 插件系统取已删的 `hook` / `loading`(`d8fa4b8` 已从 `packages-user/data-base/src/index.ts` 删除 `./game`(`hook`)与 `./load`(`loading`)导出)。在 `packages/`(D-33 **只报告**) | 仅报告;不修、不登记为待办 | 高 |
| #04-13-E-04 | `[证据行]` — `render/ui` 内 `Mota.require` 对照扫描(零命中) | packages-user/client-modules/src/render/ui(核对命令 `git grep -n -F "Mota.require" -- packages-user/client-modules/src/render/ui` → 无输出,退出码 1) | packages-user/client-modules/src/render/ui/main.tsx:1-33, packages-user/client-modules/src/render/ui/load.tsx:1-28 | `render/ui` 内**无** `Mota.require` 命中;该面 legacy 命中仅为 `core.*`(见 E-01)。**仅报告** | 仅报告 | 高 |
**E 类小结:** `core.*`(E-01)、`client` / `state` 单例(E-02)、legacy-ui 经 `Mota.require` 取已删 `hook` / `loading`(E-03)与 `render/ui` 内 `Mota.require` 零命中(E-04)均已登记。**全节只报告,无任何修复 / 待办措辞。**
## F 未能从阅读确定(未猜测)
条目形如 `- **#04-13-F-NN**:现象 + 为什么读不出来 + 需要用户裁决的点`。**只登记,不判定**;不得写成错配 / 缺失 / 残留。
- **#04-13-F-01**:旧加载 UI 的「任务进度 / 字节进度 / 总字节」新数据来源。现象:旧 UI 经 `loader.progress`(`packages-user/client-modules/src/render/ui/load.tsx:76-79,91-92,118-119,139`)取任务 / 字节进度。读不出来的原因:新 `ILoadManager`(`packages/loader/src/types.ts:288-335`)虽提供 `getTotalByte` / `getLoadedByte` / `getLoadedTasks` / `getAddedTasks` / `getTaskRatio` / `getByteRatio`,但旧 UI 期望的 `loader.progress` 对象形态在新 API 下的等价数据来源未定;且 `LoadManager.getTotalByte`(`packages/loader/src/manager.ts:92-94`)实现返回 `this.loaded`(非独立 total 字段)需用户确认语义。需要用户裁决:**旧加载 UI 的进度数据来源与取值入口**。
- **#04-13-F-02**:`loader.progress` 异步迭代语义在新 API 下的等价写法。现象:`for await (const _ of loader.progress)`(`packages-user/client-modules/src/render/ui/load.tsx:76`,`:75` 有 `@ts-expect-error 需要重构`)。读不出来的原因:新 `IMotaDataLoader.start()`(`packages-user/data-state/src/loader/types.ts:26`)与 `ILoadManager.load()`(`packages/loader/src/types.ts:304`)均返回 `AsyncIterable<number>`,但 `loader.progress` 是旧 `IMotaAssetsLoader`(已删)的属性;迭代对象 / 迭代语义如何对应无法由静态阅读定论。需要用户裁决:**迭代改写所依对象与语义**。
- **#04-13-F-03**:`statusBarUpdate` 的精确监听对象集合。现象:状态栏更新函数(`packages-user/client-modules/src/render/ui/main.tsx:96-138`)聚合读取 `client.hero.attribute`(只读属性对象 —— 该对象**不可 hook**)、`client.flags`、`core.status`(含 `core.status.replay`)等;原监听点 `main.tsx:145-152` 已注释。读不出来的原因:单一目标对象无法从阅读确定;可 hook 的数据端对象接口有多个候选(`packages-user/data-base/src/hero/types.ts:277-295,428-443,652-671,883-903`、`packages-user/data-common/src/common/mover.ts:166`、`packages-user/data-base/src/map/types.ts:220,599`、`packages-user/data-common/src/replay/types.ts:80,342`),各自只覆盖字段来源的一部分。需要用户裁决:**状态栏更新应监听的精确对象集合 / 聚合方式**。
- **#04-13-F-04**:`restart` 事件在全局 `hook` 删除后无新发射者。现象:原 `hook.on('restart', ...)`(`packages-user/client-modules/src/render/index.tsx:35-38`)已注释;`git grep -n "restart" -- packages-user/client-modules/src` 仅命中 hotkey 实现(`action/hotkey.ts:194,507`)与 legacy `core.restart()`(`render/ui/settings.tsx:112`)。读不出来的原因:事件来源(谁触发重开)与新接线方式无法由静态阅读定论。需要用户裁决:**`restart` 的事件来源与应监听对象**。
- **#04-13-F-05**:`client.ts` / `client-modules/src/index.ts` / `entry-client/create.ts` 是否纳入「部分 UI」适配范围。现象:`packages-user/client-modules/src/client.ts:88-92,124-127` 与 `packages-user/entry-client/src/create.ts:16,31,34-41` 的被注释 `loading` / `hook` 接线、`packages-user/client-modules/src/index.ts:1-8` 的 `loading.once('coreInit')` 移除点,均为非 UI(D-71 措辞为「组件 / UI」)。读不出来的原因:D-71 的范围措辞未明确是否覆盖这些非 UI 面(组合根 / 入口)。需要用户裁决:**这些边界面是否纳入第二步适配工作集**。
## 修改点汇总(供后续执行计划消费)
列序固定:`文件 file:line | 现状(旧全局对象 / 旧加载接口) | 应改为监听 / 使用的对象(附 B 类证据锚点,或 undetermined) | 归属(UI / 边界非 UI / 其余) | 置信`。**只汇总本台账已登记条目,不新增未登记事实、不给代码写法。**
| 文件 file:line | 现状(旧全局对象 / 旧加载接口) | 应改为监听 / 使用的对象(证据锚点或 undetermined) | 归属 | 置信 |
|---|---|---|---|---|
| packages-user/client-modules/src/render/ui/load.tsx:71,72,76-79 | 旧加载接口 `initSystemLoadTask()` / `load()` / `progress` 异步迭代 | `IMotaDataLoader`(packages-user/data-state/src/loader/types.ts:19-72)/ `ILoadManager`(packages/loader/src/types.ts:288-335);`progress` 迭代等价写法 undetermined(F-02) | UI | 高 |
| packages-user/client-modules/src/render/ui/load.tsx:36,91-92,118-119,139 | `client.loader` + `loader.progress.getLoadedTasks` / `getAddedTasks` / `getTotalByte` / `getLoadedByte` / `getByteRatio` | `IMotaDataLoader.manager`(packages-user/data-state/src/loader/types.ts:21)/ `ILoadManager.get*`(packages/loader/src/types.ts:288-335) | UI | 高 |
| packages-user/client-modules/src/render/index.tsx:11,25 | 旧加载 UI 深导 + `sceneController.open(LoadSceneUI, {})`(当前不可达) | undetermined(无法从阅读确定目标对象;F-01) | UI | 中 |
| packages-user/client-modules/src/render/ui/main.tsx:145-152 | 全局 `hook.on('statusBarUpdate', ...)`(已注释) | 可 hook 数据端对象候选(packages-user/data-base/src/hero/types.ts:277-295 等);精确集合 undetermined(F-03) | UI | 中 |
| packages-user/client-modules/src/render/index.tsx:35-38 | 全局 `hook.on('restart', ...)`(已注释) | undetermined(无法从阅读确定目标对象;F-04) | UI | 中 |
| packages-user/client-modules/src/client.ts:88-92,124-127 | 被注释的 `loading.once('loaded' / 'assetBuilt')` | `IMotaDataLoader`(packages-user/data-state/src/loader/types.ts:19-72);是否纳入 undetermined(F-05) | 边界非 UI | 中 |
| packages-user/client-modules/src/index.ts:1-8 | `loading.once('coreInit', () => { createGameRenderer(); })` 已移除 | 无(组合根现只 `patchAll()` + `createRender()`;`createGameRenderer` 无调用者) | 边界非 UI | 中 |
| packages-user/entry-client/src/create.ts:16,31,34-41 | 被注释的 `loading` / `hook` 接线(`registered` / `clientRegistered` / `renderLoaded`) | undetermined(无法从阅读确定目标对象;F-05) | 边界非 UI | 中 |
## 处置
- 本文件是部分 UI 进一步接口适配(D-71 / D-72)**第一步(只读收集)**的交付物;本步**未修改任何生产代码**、**未引入任何命名变更**;`files_modified` 仅本文件。
- 相对「只读起始基线」**零变化**(当日 `git status --porcelain -- packages packages-user src` 为空):本 run 未新增 / 消失任何生产改动,也未回滚 / 暂存 / 提交 / 修改用户的并发改动(D-56)。
- **第二步(适配实施)未规划**,待用户审阅本文件后另行规划(D-72)。本文件不含适配方案、不含 `import` / 调用改写写法、不产出任何新 `*-PLAN.md`。
- 范围限渲染端部分 UI 及其对已删全局 `loading` / `hook` 与旧加载系统的使用点;边界非 UI 面(`client.ts` / `client-modules/src/index.ts` / `entry-client/create.ts`)与 `packages/` / `src/` 命中**仅报告**(D-33 沿用);`packages-user/client-base/src/material/**`(D-42 / D-48)零触碰;legacy(D-49 / D-55 / D-65)只报告、不登记为待办。
- A / B 为事实层、C 为旧 / 新加载系统清单、D 为 D-69 barrel 判定、E 为 legacy 只报告、F 为未确定项(须用户裁决);`## 修改点汇总` 供后续第二个执行计划挑选工作集。
- `REND-01` / `REND-02` 保持 **Pending**;`.planning/REQUIREMENTS.md` 零改动;本步无运行时要求(D-68 的延续)。