mirror of
https://github.com/motajs/template.git
synced 2026-10-04 10:20:16 +08:00
docs(04): plan TextureManager interface impact study (04-08)
This commit is contained in:
parent
d36ea69066
commit
d25702ff56
@ -181,8 +181,8 @@ Plans:
|
||||
3. 移动端(窄屏)布局下,同一场景正常显示且可操作
|
||||
4. 数据端与渲染端保持双端分离——数据端无 DOM,仍可在 Node 环境跑回放验证
|
||||
|
||||
**Plans**: 7/7 plans executed — 04-01..04-06 已执行(04-06 = material 接口影响范围清点·只读);**04-07(material 接口适应实施·第二步)已规划待执行**;渲染适配与移动端/桌面端双布局(REND-01/REND-02)整体仍未完成
|
||||
**Plan register note (2026-09-21):** 第五个增量 `04-05`(收口 `#04-01-M-06` / `#04-01-M-09`:状态栏 9 个数值属性改经 `client.hero.attribute.getFinalAttribute(...)` 读取 + 逐图层钩子类 `RendererLayerHook`,2026-09-20 执行)此前未登记进本路线图,本次一并补登;第六个增量 `04-06` = material 接口适应(D-30/D-31/D-32)**第一步·只读影响清点**,产出 `04-MATERIAL-INTERFACE-IMPACT.md`,第二步(实施)待用户审阅后另行规划。
|
||||
**Plans**: 8/8 plans planned — 04-01..04-07 已执行(04-06 = material 接口影响范围清点·只读;04-07 = material 接口适应实施·第二步);**04-08(TextureManager 新接口影响范围清点·只读,D-38/D-39/D-40/D-41/D-42 第一步)已规划待执行**;渲染适配与移动端/桌面端双布局(REND-01/REND-02)整体仍未完成
|
||||
**Plan register note (2026-09-21):** 第五个增量 `04-05`(收口 `#04-01-M-06` / `#04-01-M-09`:状态栏 9 个数值属性改经 `client.hero.attribute.getFinalAttribute(...)` 读取 + 逐图层钩子类 `RendererLayerHook`,2026-09-20 执行)此前未登记进本路线图,本次一并补登;第六个增量 `04-06` = material 接口适应(D-30/D-31/D-32)**第一步·只读影响清点**,产出 `04-MATERIAL-INTERFACE-IMPACT.md`,第二步(实施)待用户审阅后另行规划。第七个增量 `04-07` = material 接口适应实施(**第二步·代码改动**,D-33..D-37),2026-09-22 已执行(10 文件原子提交)。**第八个增量 `04-08` = TextureManager 新接口适应(D-38..D-42)第一步·只读影响清点**,产出 `04-TEXTURE-INTERFACE-IMPACT.md`;第二步(实施)待用户审阅后另行规划。
|
||||
|
||||
Plans:
|
||||
**Wave 1**
|
||||
@ -210,6 +210,10 @@ Plans:
|
||||
|
||||
- [x] 04-07-PLAN.md — material 接口适应实施(**第二步·代码改动**,D-30/D-31/D-32 第二步 + D-33..D-37):按 04-06 清点的 A/C/D/E 四类落地——A 类(D-34)删除全部 big-image 引用并把 `getIfBigImage` 的 7 处消费者(`door.ts` 2 / `hero.ts` 3 / `renderer.ts` 1 / `vertex.ts` 1)改为行为等价的 `getTile`、删除 `renderer.ts` `getOffsetPool` 的 big-image 偏移收集;C 类(D-35)为 `MaterialManager` 补 `textures`、为 `MaterialManager` / `AutotileProcessor` / `AssetBuilder` / `TrackedAssetData` 补构造器注入的 `state`(不取全局单例,D-23;`renderer.ts` 从 `manager.state` 取值);D 类(D-36)删除 `MaterialManager` 的 big-image 实现残留(`bigImageStore` / `bigImageData` / `bigImageId` / 五个方法 / `setDefaultFrame` 耦合)与 `render/elements/cache.ts` 的 legacy big-image 路径;E 类(D-37)为 `client-base/package.json` 补 `@user/data-state` 声明(不安装、不同步 lockfile)。10 个文件原子提交;门禁 = material 归属诊断归零 + 在范围文件零诊断 + 总行数不增加(规划日 199 / 19 → ≤ 180)+ `packages-user` 内 big-image 记号归零 + eslint / CRLF / 范围(基线感知)/ 并发基线;运行时 UAT 不可得(渲染端无测试设施)如实声明
|
||||
|
||||
**Wave 7** *(blocked on Wave 6 completion)*
|
||||
|
||||
- [ ] 04-08-PLAN.md — TextureManager 新接口影响范围清点(**只读**,D-38/D-39/D-40/D-41/D-42 第一步):以 `d36ea69`(`refactor: 贴图存储方式`)后的 `client-base/src/{types.ts,material/types.ts,material/manager.ts,material/autotile.ts,material/index.ts}` 为基准,清点 `packages-user` 消费者面对改名(`MaterialManager`→`TextureManager` 与构造器)、移除(`BlockCls` 枚举 / `IMaterialFramedData.cls`→`tileType` / `IAutotileProcessor` 三方法合一 / `renderAnimatedWith`→`renderAnimated` / `getIdentifierByAlias` / `getAliasByIdentifier` / `getBlockCls(ByAlias)` / `IClientBase.autotile` / `create()` 与 `createMaterial()`)与新增收紧(`tiles` / `autotile` / `tilesetReserve` / `tilesetUnit` / `getFrameCount` / 四个 `add*` 参数 / `flatten` / `AutotileType` / `IClientCoreConfig` 两个必填字段)的引用,按 A 符号改名与移除 / B 成员与签名变化 / C 地图渲染消费者定位索引 / D 被删且无替代(需用户反馈)/ E 加载相关与添加素材(仅报告,D-39/D-41)/ F 未确定 六类分组,每行精确到符号 + `file:line` 且 ≥2 锚点;产出 `04-TEXTURE-INTERFACE-IMPACT.md`,生产代码零改动(`material/` 按 D-42 只登记),第二步实施待用户审阅后另行规划
|
||||
|
||||
**UI hint**: yes
|
||||
|
||||
### Phase 5: Legacy 移植
|
||||
|
||||
480
.planning/phases/04-render-adaptation/04-08-PLAN.md
Normal file
480
.planning/phases/04-render-adaptation/04-08-PLAN.md
Normal file
@ -0,0 +1,480 @@
|
||||
---
|
||||
phase: 04-render-adaptation
|
||||
plan: 8
|
||||
type: execute
|
||||
wave: 7
|
||||
depends_on:
|
||||
- 04-01
|
||||
- 04-02
|
||||
- 04-03
|
||||
- 04-04
|
||||
- 04-05
|
||||
- 04-06
|
||||
- 04-07
|
||||
files_modified:
|
||||
- .planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md
|
||||
autonomous: false
|
||||
requirements:
|
||||
- REND-01
|
||||
- REND-02
|
||||
estimate:
|
||||
tokens: 82000
|
||||
raw_tokens: 82000
|
||||
tasks: 4
|
||||
confidence: low
|
||||
must_haves:
|
||||
truths:
|
||||
- "**本计划的第一个 block 点是 Task 0 的 `blocking-human` 汇报关卡(AGENTS.md 硬要求)**:Task 0 必须先向用户汇报「要解决的问题(`d36ea69` 把贴图存储层由 `MaterialManager` 重写为 `TextureManager`,构造器签名、barrel 导出、`client.autotile`、`IAutotileProcessor` 全部改了,渲染端消费者未跟上)、大致解决方案(只读清点,唯一交付物 `04-TEXTURE-INTERFACE-IMPACT.md`,11 节结构 / A–F 六类分列 / 每行精确到符号 + `file:line`)、`d36ea69` 基准的三类差异(改名与移除 / 成员与签名 / 相邻接线)、范围与禁令(D-38..D-42)、规划日实测数值(总错误 202、texture 归属 23)、验证方式与只读证明」,然后必须**停下等待**用户明确回复「可以执行」四个字;收到该回复前不得执行任何任务、不得派发任何执行子代理。无论触发方式(`/gsd-execute-phase`、`/gsd-manager`、`/gsd-autonomous`、子代理/执行器派发)或配置模式(`.planning/config.json` 的 `mode: yolo`、`workflow.auto_advance`)如何,均不得自动放行。"
|
||||
- "**只读硬约束(生产代码零改动)**:本 run 生产源码改动为 **0**——`git status --porcelain -- packages packages-user src` 在 Task 1 步骤 (0a) 起始逐行原样记录进 `## 方法`(规划日 2026-09-22 实测仅 ` M .planning/phases/04-render-adaptation/04-CONTEXT.md`,该路径不在集合内故集合为空),Task 1 / Task 3 门禁断言其后**逐条一致**(不新增、不消失、状态码不变);`pnpm exec vue-tsc --noEmit` 在 Task 1 步骤 (0b) 记录**错误总行数**与 **texture 归属错误行数**两个数字(规划日实测 **202 / 23**,见 assumption 的口径说明),Task 3 重跑并以**同一正则**统计,断言错误总行数等于 Task 1 记录值;`files_modified` 只含 `04-TEXTURE-INTERFACE-IMPACT.md` 一个交付物;本 PLAN 与 `04-08-SUMMARY.md` 属计划/执行簿记,不算生产改动。"
|
||||
- "**D-42 硬边界:`packages-user/client-base/src/material/` 是用户已重构完毕的文件夹,AI 不得计划任何修改**:本计划的 A–F 记录若命中该文件夹内(规划日已知 `material/utils.ts:2` 的 `BlockCls` import 残留),**只能在 `## D 被删且无替代(需用户反馈)` 内作为「用户自有面」登记并向用户反馈**,**不得**为该文件夹内的任何文件提出修改方案、不得列入第二步的 AI 工作范围。"
|
||||
- "**D-39 / D-41 硬边界:「加载相关」整体排除、只报告**——① **加载本身**(`packages-user/client-base/src/load/loader.ts`)与 ② **向 `TextureManager` 添加素材的内容**(`packages-user/client-modules/src/fallback/load.ts` 的 `addGrid` / `addRowAnimate` / `addAutotile` / `addTileset` / `buildAssets` / `cacheAutotileList` / `cacheTilesetList` / `buildListToAsset` 调用,以及 `client.ts:93-96` 的 `fallbackLoad(this.materials)` 接线)必须**单独成 `## E 加载相关与添加素材(仅报告)` 一节**,**不得**提出修改方案、**不得**计入 AI 的第二步工作范围;用户将自行适配新加载系统。"
|
||||
- "**A 类(符号改名与移除的引用点)必须给两侧 `file:line` 并覆盖 `d36ea69` 点名的每个符号**:`MaterialManager`→`TextureManager`(新名消费者 `client-modules/src/client.ts:15,83`,旧名引用须给机器证据)、`material/index.ts` 的 `createMaterial()` 与 `client-base/src/index.ts` 的 `create()` 被删除、`renderAnimatedWith`→`renderAnimated`(已适配点 `render/map/renderer.ts:1264`;旧名引用须给机器证据)、`IClientBase.autotile` 被删除(`client-base/src/types.ts`)、`IMaterialFramedData.cls: BlockCls`→`tileType: TileType`(消费者 `hero.ts:167`、`renderer.ts:1252,1263`、`vertex.ts:517,561,852`)、`BlockCls` 枚举本身被删除(消费者 import `hero.ts:15`、`renderer.ts:10`、`vertex.ts:27`)、`ITextureManager.getIdentifierByAlias` / `getAliasByIdentifier` 被删除、`ITextureGetter.getBlockCls` / `ITextureAliasGetter.getBlockClsByAlias` 被删除、`AutotileProcessor` 构造器改签名(消费者 `render/map/renderer.ts:234`)、新增 `AutotileType`。"
|
||||
- "**B 类(成员与签名变化的调用点)必须逐条登记 `d36ea69` 收紧后的签名与新成员**:`ITextureManager` 新增 `readonly tiles: ITileStore` 与 `readonly autotile: IAutotileProcessor` 并保留 `readonly textures`、新增 `readonly tilesetReserve` / `readonly tilesetUnit`;新增 `getFrameCount(num)`;`addGrid(source, map: ArrayLike<number>, width, height)`、`addRowAnimate(source, map: ArrayLike<number>, width, height)`、`addAutotile(source, identifier: number, type: AutotileType)`、`addTileset(source, identifier, cellWidth, cellHeight)` 四者参数收紧;`IAutotileProcessor.flatten(source, type, frames)` 新增;`IClientCoreConfig` 新增两个必填字段(消费者 `client-modules/src/core.ts:6-11` 与 `client.ts:62,86-87`)。**每行须含基准侧声明 `file:line` + 命中侧调用 `file:line`(≥2 锚点)。**"
|
||||
- "**C 类(地图渲染消费者定位索引)不新增独立事实,只把第二步将触及的定位点按文件汇总**:必须覆盖 `render/map/renderer.ts`、`render/map/vertex.ts`、`render/map/extension/hero.ts`、`render/map/moving.ts`、`render/map/types.ts`、`client-modules/src/client.ts`、`client-modules/src/types.ts`、`client-modules/src/core.ts`,每条给 `file:line`,并**交叉引用其 A / B / D 记录 ID**;C 行不得把加载相关(E)或 `material/` 内(D 的用户自有面)的定位点写成 AI 工作项。"
|
||||
- "**D 类(被删且无替代·需用户反馈)非空且不得发明替代品**:至少覆盖 `IAutotileProcessor.renderWithoutCheck`(消费者 `render/map/renderer.ts:1253`、`render/map/vertex.ts:461,874`,规划日 **3 处**调用点,接口上**已无同名或等价成员**)、`BlockCls` 枚举整体删除(消费者 3 处 import + `material/utils.ts:2` 的 import;`utils.ts` 的 `getClsByString` / `getTextureFrame` 两个 `@deprecated` 函数随之失去类型)、`IAutotileProcessor.manager` 删除、`IAutotileProcessor.render(autotile: number, connection)` 与 `renderWith(tile, connection)` 删除并合并为 `render(tile, connection)`、`ITextureManager.getIdentifierByAlias` / `getAliasByIdentifier` 删除、`IClientBase.autotile` 删除、`createMaterial()` / `create()` 入口函数删除、`material/utils.ts` 的两处 `BlockCls` 依赖(用户自有面)。**每条必须明写「接口已删、AI 未发现替代、请用户反馈」;不得自拟替代、不得写成「应改为 X」。**"
|
||||
- "**E 类(加载相关与添加素材·仅报告)与 in-scope 严格分开**:`client-base/src/load/loader.ts`(加载本身;其 6 条错误属加载系统重构提交既有、非 `d36ea69` 所致,须注明)与 `client-modules/src/fallback/load.ts`(向 `TextureManager` 添加素材;9 条 TS2554 参数个数错误在 `:76,:77,:80,:81,:82,:83,:84,:95,:105`)逐条登记事实;标题下明写「本节仅报告:D-39 / D-41 边界内的内容归用户自行适配,本阶段不修改、不提修改方案」;`packages/` 与 `src/` 另按 assumption 的对照扫描结果登记(规划日 `packages/` 对 texture 记号零命中;`src/types/declaration/*` 仅 legacy 声明)。"
|
||||
- "**F 类(未能从阅读确定·未猜测)非空且只登记不判定**,至少覆盖:① `renderWithoutCheck` 的语义与性能意图能否由新 `render(tile, connection)` 等价承接;② `BlockCls` 删除后消费者应改用 `TileType`(`@user/data-common`)还是 `AutotileType`,以及「自动元件」在 `TileType` 中的取值;③ `hero.ts:167` 构造 `IMaterialFramedData` 时 `tileType` 应填何值(勇士贴图不是地图图块),以及该点是否落入 D-18 的 `HeroRendering` 暂不处理边界;④ `MapRenderer` 自建的 `new AutotileProcessor(manager, manager.state)`(`renderer.ts:234`)与新增的 `ITextureManager.autotile` 是否重复、第二步应复用还是保留自建;⑤ `ITextureManager.textures` / `tileStore` / `tiles`(`ITileStore`)三者的职责边界与地图背景取值应走哪一个;⑥ `textures` 的写入侧(04-07 已记录「本次范围内无写入者」)归属哪一步;⑦ `@user/client-base` 作为整体注册进 legacy 插件系统(`Mota.register('@user/client-base', UserClientBase)`)后,删除 `create()` / `createMaterial()` 是否破坏插件面;⑧ `fallback/load.ts` 的 `extractClsBlocks` 产出 `IBlockIdentifier[]` 而新 `addGrid` / `addRowAnimate` 收 `ArrayLike<number>`,该转换是否属用户加载面(D-41)。**不得把本类任何一条写成错配、缺失或残留。**"
|
||||
- "**第二步(修改工作)不被规划**:文档只清点、分类、定位、分组,**不含**修复方案、不含代码改动建议、不产出 `04-09-PLAN.md` 或任何新 `*-PLAN.md`;`## 处置` 明写「第一步只读清点完成;第二步(TextureManager 新接口适应实施)待用户审阅本文件后另行规划」(D-40)。"
|
||||
- "**REND-01 / REND-02 在本 run 后仍保持 Pending**:本计划只清点 TextureManager 新接口对消费者的影响面,既未实施 texture 接口适应,也未实施移动端 / 桌面端双布局(见 assumptions 的两条 FLAGGED ASSUMPTION)。"
|
||||
- "**验证可运行且不臆造通过**:本计划的「运行结果」= 只读门禁(porcelain 基线逐条一致 + 类型错误**总行数**与记录值一致)+ 静态内容门禁(11 节结构、A–F 六类行数下限与关键词、每行 ≥2 个 `file:line` 锚点、C 类交叉引用 ID、D 类「无替代」措辞计数、E 类只报告口径)+ 符号零命中复验(`MaterialManager` / `renderAnimatedWith` / `getBlockClsByAlias` / `getIdentifierByAlias` / `getAliasByIdentifier` 在 `packages-user` 源码面无引用)+ 既有计划保护门禁(`04-01..04-07-*` 的 porcelain 为空)+ 计划文件范围门禁(不得出现 `04-09+`)+ CRLF 门禁 + 人工代码复核;本步为只读清点,**无运行时行为可观察**,故不得以任何无法运行的门禁冒充通过。"
|
||||
artifacts:
|
||||
- path: .planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md
|
||||
provides: "`d36ea69` TextureManager 基准在 `packages-user` 消费者面的只读影响台帐:元信息块 + 背景 / 方法 / 基准变更(d36ea69)/ 类型门禁实测基线 / A 符号改名与移除的引用点 / B 成员与签名变化的调用点 / C 地图渲染消费者定位索引 / D 被删且无替代(需用户反馈)/ E 加载相关与添加素材(仅报告)/ F 未能从阅读确定(未猜测)/ 处置;每行含符号名 + 命中处 `file:line` + 基准侧锚点 + 问题描述 + 影响 + 置信,供用户审阅后裁定修复范围并另行规划第二步"
|
||||
key_links:
|
||||
- "`packages-user/client-base/src/material/types.ts`(`d36ea69` 后的权威基准)↔ `packages-user/client-base/src/types.ts:18`(`ITextureManager` 是 `IClientBase.materials` 的唯一公共面):基准新增 `readonly tiles: ITileStore`(`:220`)/ `readonly autotile: IAutotileProcessor`(`:222`)/ `readonly tilesetReserve`(`:241`)/ `readonly tilesetUnit`(`:246`)/ `getFrameCount`(`:336`);`IMaterialFramedData.cls: BlockCls` 改为 `tileType: TileType`(`:79`);`BlockCls` 枚举已从该文件删除;`IAutotileProcessor.render(tile, connection)`(`:148-151`)取代原 `render`/`renderWith`/`renderWithoutCheck`,`renderAnimated`(`:159-162`)取代 `renderAnimatedWith`"
|
||||
- "`packages-user/client-base/src/material/manager.ts:37`(`export class TextureManager implements ITextureManager`,构造器 `:84-89` 收 `(state, tiles, tilesetReserve, tilesetUnit)`)↔ `packages-user/client-modules/src/client.ts:83-88`(`new TextureManager(this, this.tileStore, config.tilesetReserve, config.tilesetUnit)`)↔ `packages-user/client-modules/src/core.ts:6-11`(`tilesetReserve: 100000` / `tilesetUnit: 5000`)↔ `packages-user/client-modules/src/types.ts:8-10`(`IClientCoreConfig` 新增两个必填字段)"
|
||||
- "`packages-user/client-base/src/material/autotile.ts:64`(`export class AutotileProcessor implements IAutotileProcessor`;构造器 `:75` `constructor(readonly state: ICoreState)`,单参)↔ 消费者 `packages-user/client-modules/src/render/map/renderer.ts:234`(`new AutotileProcessor(manager, manager.state)`,实测 TS2554 期望 1 参得 2 参)↔ `packages-user/client-modules/src/client.ts:16`(`AutotileProcessor` 与 `:14` `IAutotileProcessor` 在 `client.autotile` 删除后成为未使用 import)"
|
||||
- "`IMaterialFramedData.cls` → `tileType`(`material/types.ts:79`)↔ 消费者 `packages-user/client-modules/src/render/map/extension/hero.ts:167`(`cls: BlockCls.Unknown` 对象字面量,实测 TS2353)↔ `packages-user/client-modules/src/render/map/renderer.ts:1252,1263`(`tex.cls`,实测 TS2339)↔ `packages-user/client-modules/src/render/map/vertex.ts:517,561,852`(`tile.cls` / `cls` 解构,实测 TS2339)"
|
||||
- "`BlockCls` 枚举删除(原 `packages-user/client-base/src/material/types.ts`)↔ 消费者 import `packages-user/client-modules/src/render/map/extension/hero.ts:15`、`packages-user/client-modules/src/render/map/renderer.ts:10`、`packages-user/client-modules/src/render/map/vertex.ts:27`(三处均实测 TS2305)↔ `packages-user/client-base/src/material/utils.ts:2`(用户自有面内的 `import { BlockCls } from './types'`,实测 TS2305)"
|
||||
- "`IAutotileProcessor.renderWithoutCheck` 已删(`material/types.ts:148-151` 无该成员)↔ 3 处消费者调用 `packages-user/client-modules/src/render/map/renderer.ts:1253`、`packages-user/client-modules/src/render/map/vertex.ts:461`、`packages-user/client-modules/src/render/map/vertex.ts:874`(均实测 TS2339)—— 无替代,属 D 类「需用户反馈」"
|
||||
- "`git status --porcelain -- packages packages-user src`(Task 1 步骤 (0a) 逐行记录)↔ Task 1 / Task 3 门禁的逐条一致断言 ↔ 只读(生产代码零改动)证明"
|
||||
- "`pnpm exec vue-tsc --noEmit` 的错误**总行数**(Task 1 步骤 (0b) 记录、规划日实测 202)↔ Task 3 门禁的重跑一致断言 ↔ 只读证明;texture 归属子集(规划日 23 = `client-base` 1 + `client-modules` 22,其中加载相关 9 + `material/utils.ts` 1 属 E/D 报告面、地图渲染 13 属 C 面)为规划日人工归类、逐行列出,执行日按当日实测重新归类并由人工复核,**不作为机器门禁断言项**"
|
||||
assumptions:
|
||||
- "**FLAGGED ASSUMPTION(specless fallback)— REND-01 edge unresolved:** 未提供 REND-01(渲染端适配新数据层接口)的验收边界;本计划**不发明**阈值,只交付 TextureManager 新接口对消费者面的只读清点(D-38 / D-40 第一步)。用户须在推进第二步与其余渲染适配前补齐 REND-01 的边界判据。"
|
||||
- "**FLAGGED ASSUMPTION(specless fallback)— REND-02 edge unresolved:** 未提供 REND-02(移动端与桌面端双布局)的验收边界;本计划不涉及双布局,也不发明其验收阈值。"
|
||||
- "**规划日实测数值与口径须用户在审阅时确认:** 规划日 2026-09-22 在 HEAD `d36ea69` 实测 `pnpm exec vue-tsc --noEmit` 的错误总行数为 **202**;其中**与本次 `d36ea69` texture 接口改动直接相关**的为 **23** 条 —— `packages-user/client-base` **1** 条(`material/utils.ts(2,10)` TS2305,属用户自有面)+ `packages-user/client-modules` **22** 条(`fallback/load.ts` 9、`render/map/extension/hero.ts` 2、`render/map/renderer.ts` 5、`render/map/vertex.ts` 6)。**另有 15 条属加载系统重构(提交 `cc434a6`)的既有结果**(`client-base/src/load/loader.ts` 6 + `client-modules/src/render/ui/load.tsx` 9),**不计入** texture 归属;其余 **164** 条为数据端测试 / 寻路等既有错误。该「texture 归属 / 加载既有 / 其余既有」三分类是**规划日的人工归类**,须用户在审阅时确认;若用户判定某条应改类,执行者按裁定重新归类并同步数字与 `## 处置` 的口径说明,不得改动其它事实。"
|
||||
- "**执行前必须复核(未确定项,不猜):** Task 1 步骤 (0a)/(0b) 必须在动手前打开当日 HEAD 的工作树逐条核对:① `material/types.ts` 的现行成员集合(`tiles` / `autotile` / `textures` / `tilesetReserve` / `tilesetUnit` / `getFrameCount` / `flatten` / `render` / `renderAnimated` / `tileType`)与 `BlockCls` 确不在其中;② `TextureManager` 构造器形参与 `AutotileProcessor` 构造器形参;③ `client-base/src/index.ts` 与 `material/index.ts` 确已无 `create()` / `createMaterial()`;④ A–C 各类命中的**当日行号**(`client.ts` / `core.ts` / `types.ts` / `renderer.ts` / `vertex.ts` / `hero.ts` / `moving.ts` / `map/types.ts`);⑤ `renderWithoutCheck` 的消费者调用点仍为 3 处且接口上确无替代;⑥ `fallback/load.ts` 与 `load/loader.ts` 的命中行号;⑦ `packages/` 与 `src/` 的对照扫描结论;⑧ `pnpm exec vue-tsc --noEmit` 的当日总数与 texture 子集。**任一与规划日数值不同即以当日实测为准**写入文档并在 SUMMARY 中说明差异,不得按本计划的规划日数值硬写(规划日 2026-09-22、HEAD = `d36ea69`)。"
|
||||
- "**用户可能有执行日的并发未提交改动:** 一律以 Task 1 步骤 (0a) 当日实测为基线(规划日实测含 `.planning/phases/04-render-adaptation/04-CONTEXT.md` 的既有未提交改动,须逐字保留),**不得回滚 / 暂存 / 提交 / 修改**用户的任何未提交改动;若基线中出现 `packages` / `packages-user` / `src` 下的条目,属于本次清点范围内的既有改动,须一并记录并原样保留。"
|
||||
- "**D-42 的用户自有面可能在清点过程中继续变化:** `packages-user/client-base/src/material/` 由用户持续重构(`d36ea69` 即为其一次提交),故该文件夹内的命中(规划日已知 `material/utils.ts:2`)以**当日实测**为准;本计划只登记、不修改、不规划。"
|
||||
- "**无运行时验证可得(诚实降级):** 本步为只读清点,不产生任何运行时行为(不启动渲染、不改代码、不新增测试),因此承载体是「只读门禁 + 类型门禁一致性 + 静态内容门禁 + 符号零命中复验 + 人工代码复核」。**不得**以任何无法运行的门禁冒充通过。"
|
||||
- "**`.planning/graphs/*` 是过期工装态:** 其中的接口标签早于 `d36ea69`(2026-09-22);该文件**不得**作为基准或命中依据,只作 E 类登记(是否重建由用户决定,见 F 类)。"
|
||||
prohibitions:
|
||||
- "不得在用户明确回复「可以执行」四个字之前执行本计划的任何任务、或派发任何执行子代理(AGENTS.md 的第一个 block 点约束;不因触发方式或 `yolo` / `auto_advance` 模式而放宽)。"
|
||||
- "不得修改任何生产源码:`packages/**`、`packages-user/**`、`src/**` 的生产文件一律零改动;不得新增 / 删除 / 改写任何 `.ts` / `.tsx` 文件;不得触碰用户 committed 的基准接口(`client-base/src/material/**` 与 `client-base/src/types.ts` 一字不动)。"
|
||||
- "不得在 `packages-user/client-base/src/material/` 文件夹内规划任何修改(D-42:该文件夹已由用户重构完毕,AI 只修改消费者);该文件夹内命中一律只登记、并向用户反馈,不得自拟替代方案。"
|
||||
- "不得为「加载相关」内容提出修改方案:`client-base/src/load/loader.ts` 与 `client-modules/src/fallback/load.ts` 的命中(含 `addGrid` / `addRowAnimate` / `addAutotile` / `addTileset` 的参数个数错误)一律只报告(D-39 / D-41),用户将自行适配新加载系统。"
|
||||
- "不得改写 / 覆盖 / 改号 `04-01`..`04-07` 的既有 `*-PLAN.md` 与 `*-SUMMARY.md`;除本 `04-08-PLAN.md`、`04-TEXTURE-INTERFACE-IMPACT.md` 与 `04-08-SUMMARY.md` 外不得写任何其它文件。"
|
||||
- "不得规划或实施第二步:不得给出修复方案、不得给出代码改动建议、不得产出 `04-09+` 或任何新 `*-PLAN.md`;接口被删且无替代者只登记事实并请用户反馈。"
|
||||
- "不得修改任何既有 jsDoc / 注释文本(AGENTS.md);不得新增公共 / 受保护 / 私有成员(本步零代码改动);不得新增或删除 `// @ts-expect-error` 指令。"
|
||||
- "不得修改 `.planning/phases/04-render-adaptation/04-CONTEXT.md`(当前工作树内有用户未提交改动,须逐字保留、不得回滚 / 暂存 / 提交)。"
|
||||
- "不得把 `packages/` 与 `src/` 的命中写成待修改项、不得为其提出修改建议;该二者只登记事实与核对命令。"
|
||||
- "不得把 A / B / C / D / E 混为一类:A 记符号级(改名 / 移除)引用点、B 记签名级(参数与类型变化)调用点、C 只做定位索引并交叉引用、D 记被删且无替代、E 记加载与添加素材;同一事实若跨类,拆条并互相引用,不得互相冒充。"
|
||||
- "不得把「类型错误」当作「接口设计结论」:`tileType` 应填何值、`renderWithoutCheck` 的替代是什么、自建 `AutotileProcessor` 是否应复用 `ITextureManager.autotile`,一律进 F 类,不得自行裁定、不得写成缺失或残留。"
|
||||
- "不得引入 `core.*` / `client.*` legacy 适配或清退建议(D-12 / D-23);不得为 `render/elements/cache.ts`、`render/elements/misc.ts`、`render/components/textbox.tsx` 的 legacy 路径提出清退计划(属 Phase 5 边界,本次只作对照登记)。"
|
||||
- "不得新增依赖、不得修改 `package.json` / `pnpm-lock.yaml` / `tsconfig.json`;出现安装需求即暂停并告知用户。"
|
||||
- "不得新增、删除或修改任何测试文件与既有测试。"
|
||||
- "不得以「无运行时」为由弱化验证:每条 `<automated>` 必须有 `<fails_when>`;确实无法运行的门禁必须显式声明为不可得并降级为静态 + 人工,不得伪造绿。"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Phase 4 第七个增量(用户裁定 2026-09-22 · D-38 / D-39 / D-40 / D-41 / D-42 **第一步**)—— **TextureManager 新接口影响范围清点(只读)**。
|
||||
|
||||
**要解决的问题:**
|
||||
|
||||
1. **贴图存储层被用户重写,消费者未跟上(D-38)**:用户以提交 `d36ea69 refactor: 贴图存储方式` 重构了 texture 存储层——`MaterialManager` 改名并重写为 **`TextureManager`**(构造器改为 `(state, tiles, tilesetReserve, tilesetUnit)`,不再无参)、`client.autotile` / `IClientBase.autotile` 删除、`AutotileProcessor` 重写、`IAutotileProcessor` 的 `render` / `renderWith` / `renderWithoutCheck` 合并为单一 `render(tile, connection)`、`renderAnimatedWith` → `renderAnimated`、`BlockCls` 枚举整体删除且 `IMaterialFramedData.cls` → `tileType: TileType`、barrel 与入口调整(`material/index.ts` 的 `createMaterial()`、`client-base/src/index.ts` 的 `create()` 删除)、新增 logger codes。用户明示「影响面大、**主要在地图渲染部分**」。
|
||||
2. **影响面未知,不能直接动手(D-40)**:用户裁定本目标同样走**两步**——先收集(只读清点)再修复;第一步产出只读影响清单文档,第二步待用户审阅后再规划。没有第一手的范围台账就直接改,会按旧形状改错或漏改。
|
||||
3. **AI 只改消费者,`material/` 归用户(D-42)**:`packages-user/client-base/src/material/` 已由用户**重构完毕**;AI **只修改消费者**(如地图渲染)。**若某接口被删除且无替代,必须向用户反馈**,不得自行发明替代方案。
|
||||
4. **加载相关整体排除(D-39 / D-41)**:「加载本身」以及「向 `TextureManager` 中添加素材的内容」由用户自行适配新加载系统,本任务**不得修改**——须单列报告,让用户清楚哪些是他自己的面。
|
||||
5. **范围与边界(D-33 / D-32 沿用)**:范围限 `packages-user`;`packages/` 与 `src/` 命中**仅报告、不修改**;只修复与本次 texture 接口适应相关的项,不追求解决全部类型错误(整仓既有错误大量与本次无关)。
|
||||
|
||||
**大致解决方案:** 只做**只读清点**,产出唯一交付物 `.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md`。文档 11 节:`## 背景` / `## 方法` / `## 基准变更(d36ea69)` / `## 类型门禁实测基线` / `## A 符号改名与移除的引用点` / `## B 成员与签名变化的调用点` / `## C 地图渲染消费者定位索引` / `## D 被删且无替代(需用户反馈)` / `## E 加载相关与添加素材(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`。A–E 每节一张固定列序的表 `| ID | 符号/成员名 | 命中处 | 基准侧锚点 | 问题描述 | 影响 | 置信 |`,**每行至少两个 `file:line` 锚点**(命中处 + 基准侧),一条记录只归一类、跨类拆条并互相引用;F 类逐条登记静态阅读无法定论项(只登记不判定)。
|
||||
|
||||
**分列规则(写死,防止类别互相冒充):**
|
||||
|
||||
| 类别 | 含义 | 归属规则 |
|
||||
|---|---|---|
|
||||
| A | **符号级**:改名 / 移除的符号引用点 | `TextureManager`(新名消费者 `client.ts:15,83`)、`MaterialManager` / `renderAnimatedWith` / `getIdentifierByAlias` / `getAliasByIdentifier` / `getBlockCls(ByAlias)` 的**旧名引用点**(规划日多为 0,须给机器证据)、`BlockCls` 消费者 import、`IMaterialFramedData.cls` 消费者读写点、`AutotileProcessor` 构造器调用点、`IClientBase.autotile` 与 `create()` / `createMaterial()` 的消费者 |
|
||||
| B | **签名级**:成员在但参数 / 类型变更 | `addGrid` / `addRowAnimate` / `addAutotile` / `addTileset` 的调用点、`ITextureManager` 新增成员(`tiles` / `autotile` / `tilesetReserve` / `tilesetUnit` / `getFrameCount`)与 `IClientCoreConfig` 新增必填字段的实现 / 传入点 |
|
||||
| C | **定位索引**(不新增独立事实) | 第二步将触及的 `file:line` 按文件汇总,逐条交叉引用其 A / B / D 记录 ID |
|
||||
| D | **被删且无替代**(需用户反馈) | `renderWithoutCheck`、`BlockCls` 及其 `@deprecated` 依赖(`material/utils.ts`,用户自有面)、`manager`、`renderWith`、`getIdentifierByAlias` / `getAliasByIdentifier`、`IClientBase.autotile`、`create()` / `createMaterial()` |
|
||||
| E | 加载相关与添加素材(仅报告) | `client-base/src/load/loader.ts`(加载本身)+ `client-modules/src/fallback/load.ts`(向 `TextureManager` 添加素材)+ `packages/` / `src/` 对照扫描 |
|
||||
| F | 未能从阅读确定 | 只登记,不得写成错配 / 缺失 / 残留 |
|
||||
|
||||
**规划日实测(A–F 各类命中数为内容门禁下限;类型错误总行数为机器门禁断言值、texture 子集为规划日人工归类;执行日一律以当日实测为准):**
|
||||
|
||||
| 类别 | 规划日实测结果(2026-09-22,HEAD `d36ea69`,工作树) |
|
||||
|---|---|
|
||||
| 基准变更 | 改名 1 类(`MaterialManager`→`TextureManager`);barrel 删除 2 个入口函数;`BlockCls` 枚举删除;`IMaterialFramedData.cls`→`tileType`;`renderAnimatedWith`→`renderAnimated`;`IAutotileProcessor` 三方法合为一;`IClientBase.autotile` 删除;新增 `tiles` / `autotile` / `tilesetReserve` / `tilesetUnit` / `getFrameCount` / `flatten` / `AutotileType` |
|
||||
| A(符号级) | `BlockCls` 3 处 import + `cls` 6 处读写;`AutotileProcessor` 构造器 1 处(`renderer.ts:234`);`TextureManager` 新名 2 处;旧名 `MaterialManager` / `renderAnimatedWith` / `getIdentifierByAlias` / `getAliasByIdentifier` / `getBlockClsByAlias` 源码面 **0** 引用 |
|
||||
| B(签名级) | `ITextureManager` 新增 5 个成员 + `IClientCoreConfig` 新增 2 个必填字段;`addGrid` / `addRowAnimate` / `addAutotile` / `addTileset` 的调用点全部落在 `fallback/load.ts`(→ E 类) |
|
||||
| C(定位索引) | 8 个文件:`render/map/renderer.ts`、`render/map/vertex.ts`、`render/map/extension/hero.ts`、`render/map/moving.ts`、`render/map/types.ts`、`client-modules/src/client.ts`、`client-modules/src/types.ts`、`client-modules/src/core.ts` |
|
||||
| D(被删无替代) | ≥ 6 项:`renderWithoutCheck`(3 调用点)+ `BlockCls` + `manager` + `renderWith` + `getIdentifierByAlias` / `getAliasByIdentifier` + `IClientBase.autotile` + `material/utils.ts` 依赖(用户自有面) |
|
||||
| E(加载与添加素材) | `fallback/load.ts` **9** 条 TS2554(`:76,:77,:80,:81,:82,:83,:84,:95,:105`);`client-base/src/load/loader.ts` 加载本身(6 条错误属加载系统重构既有);`packages/` texture 记号 **0** 命中;`src/types/declaration/*` 仅 legacy 声明 |
|
||||
| F(未确定) | ≥ 8 项(见 must_haves) |
|
||||
| 类型门禁 | `pnpm exec vue-tsc --noEmit` 错误总行数 **202**(texture 归属 **23** = `client-base` 1 + `client-modules` 22;加载系统重构既有 **15**;其余既有 **164**) |
|
||||
|
||||
**范围与硬边界:** 被查对象为 `packages-user` 全量(消费者面);基准为 `packages-user/client-base/src/material/types.ts`(+ `manager.ts` / `autotile.ts` / `index.ts`)与 `packages-user/client-base/src/types.ts`(`d36ea69` 后);`packages/` 与 `src/` **仅报告**(D-32 沿用);`material/` 文件夹**只登记、不修改**(D-42);「加载本身 + 向 `TextureManager` 添加素材」**只报告**(D-39 / D-41);接口被删且无替代者**必须请用户反馈**(D-42)。生产源码零改动;本步不规划第二步。
|
||||
|
||||
**两步走(D-40):** 本 run = **第一步(只读清点)**;**第二步(TextureManager 新接口适应实施)不在本 run 规划**,待用户审阅本文件后另行规划。
|
||||
|
||||
## Source Audit(多源覆盖审计)
|
||||
|
||||
| SOURCE | ID | Feature/Requirement | Plan | Status | Notes |
|
||||
|--------|----|---------------------|------|--------|-------|
|
||||
| GOAL | — | Phase 4:「渲染端通过新数据层接口驱动,并同时支持移动端与桌面端布局」 | 04-08 | COVERED(增量·texture 只读清点子切片) | 本 run 只产出 TextureManager 新接口的消费者影响台账;其余渲染适配与双布局属后续增量(REND-02 见 assumptions) |
|
||||
| REQ | REND-01 | 渲染端适配新数据层接口 | 04-08 | COVERED(子切片·只读;需求保持 Pending) | texture/素材接口(`client-base`)是渲染端素材公共面;本 run 只清点其消费者影响面,不实施适配;验收边界未提供 → assumptions 的 FLAGGED ASSUMPTION |
|
||||
| REQ | REND-02 | 渲染端同时支持移动端与桌面端布局 | 04-08 | COVERED(不涉及) | 本 run 范围不含双布局;REND-02 验收边界未提供 → assumptions 的 FLAGGED ASSUMPTION |
|
||||
| RESEARCH | — | (本阶段无 `04-RESEARCH.md`) | — | N/A | Phase 4 未产出 RESEARCH.md;等价输入为 04-01 / 04-02 / 04-06 账本与 `d36ea69` 的接口改动 |
|
||||
| CONTEXT | D-38 | 用户已完成 TextureManager 相关重构(`d36ea69`),影响面大、主要在地图渲染部分;下一目标 = 适应新接口 | 04-08 | COVERED(第一步) | Task 1/2/3 清点消费者面并突出地图渲染(C 类);实施属第二步(未规划) |
|
||||
| CONTEXT | D-39 | 不得修改加载相关的内容(用户自行适配新加载系统) | 04-08 | COVERED(排除) | `load/loader.ts` 与 `fallback/load.ts` 归 E 类只报告;prohibitions 明列不得提出修改方案 |
|
||||
| CONTEXT | D-40 | 分两步:先收集(只读清点,产出只读影响清单文档)再修复;第二步待用户审阅后再规划 | 04-08 | COVERED | 只读、唯一交付物、`## 处置` 明写第二步未规划;Task 3 计划范围门禁禁 `04-09+` |
|
||||
| CONTEXT | D-41 | 「加载相关」的排除边界:加载本身 + 向 `TextureManager` 添加素材的内容(均由用户自行适配) | 04-08 | COVERED(排除) | E 类标题下明写该边界;`addGrid` / `addRowAnimate` / `addAutotile` / `addTileset` 调用点全部归 E |
|
||||
| CONTEXT | D-42 | `client-base/src/material/` 已重构完毕;AI 只修改消费者;接口被删且无替代必须反馈、不得自拟替代 | 04-08 | COVERED | `material/utils.ts:2` 命中归 D 类「用户自有面」;D 类每条明写「无替代、请用户反馈」;prohibitions 禁在 `material/` 内规划修改 |
|
||||
| CONTEXT | D-33 | 范围外一律不改;不追求解决全部类型错误,只修与本次接口适应相关的项 | 04-08 | COVERED(边界) | 类型基线单列 texture 归属 23 与既有 179;第二步范围由用户据本文件裁定 |
|
||||
| CONTEXT | D-07 | 每条记录精确到接口名 + 所属文件 + 问题描述 + 影响 | 04-08 | COVERED(粒度) | 固定列序 + 每行 ≥2 个 `file:line` 锚点 + 门禁机器判定 |
|
||||
| CONTEXT | D-09 | 允许派只读子代理扫描(不得修改任何文件) | 04-08 | COVERED | Task 2 允许只读子代理回传事实表;子代理不得写文件;最终由主执行者门禁统一验证 |
|
||||
| CONTEXT | D-12 | `core.*` 属旧引擎适配,归第五阶段 | 04-08 | COVERED(边界) | `render/elements/cache.ts` / `misc.ts` / `textbox.tsx` 的 `core.material.*` 与本地 `autotile` 概念路径只作对照登记,不提出清退计划 |
|
||||
| CONTEXT | D-18 | `HeroRendering` 相关暂不处理 | 04-08 | COVERED(边界) | `render/map/extension/hero.ts` 仅作 material 引用点登记;`hero.ts:167` 是否落入 D-18 边界列入 F 类,不裁定 |
|
||||
| CONTEXT | D-19 | 移动控制由用户手动修改,AI 暂不处理 | 04-08 | COVERED(排除) | `action/move.ts` 与移动控制不在本计划的命中面枚举;`render/map/moving.ts` 仅因 `IMaterialFramedData` 类型变化被登记 |
|
||||
| CONTEXT | D-22 | 跟随者暂缓 | 04-08 | COVERED(排除) | 跟随者族不在本计划范围 |
|
||||
| CONTEXT | D-23 | 不使用 `client` / `state` 全局单例(仅约束新增/后续) | 04-08 | COVERED | 本计划零生产改动、不新增代码;`state` 的注入方式不属本步 |
|
||||
| CONTEXT | D-01..D-06, D-08, D-10, D-11, D-13..D-17, D-20, D-21, D-24..D-29, D-30..D-37 | 前序决策与已执行增量 | 04-01..04-07 | COVERED(前序计划) | 已由 04-01..04-07 落地;本计划是其后的新增量(D-30..D-37 的产物 `04-MATERIAL-INTERFACE-IMPACT.md` / `04-07-SUMMARY.md` 是本步的版式与基线输入) |
|
||||
| CONTEXT | Deferred Ideas | 阶段 4 后续步骤(适配实施、双布局);`packages` 全部、`entry-client`、`legacy-plugin-*`、`data-fallback` | — | DEFERRED | 未写入任何任务;`packages/` 仅作 E 类对照扫描 |
|
||||
|
||||
## Estimate Basis(估算依据)
|
||||
|
||||
`estimate-calibration` 返回 `factor: 1`、`applied: false`、`sample_count: 0`、`confidence: low`(项目无历史样本),故 `tokens == raw_tokens` 并如实标注 `confidence: low`。按「执行者实际触及量」估算(`estimate.tasks: 4` = Task 0 汇报关卡 + 三个工作任务):Task 0 只读汇报并等待用户确认(约 5k,不写文件);Task 1(tracer)起始基线(porcelain + `pnpm exec vue-tsc --noEmit` 全量,约 1–3 分钟;规划日实测 202 行)+ 交付文档骨架 + `## 基准变更(d36ea69)` + `## 类型门禁实测基线` + A 类首条端到端切片(约 32k);Task 2 横向补齐 A/B/C/D/E/F 六类(约 30k);Task 3 定稿 + 六道门禁 + 人工复核 + `04-08-SUMMARY.md`(约 12k);固定开销约 3k;合计约 82k。
|
||||
|
||||
</objective>
|
||||
<execution_context>
|
||||
@C:/Users/book/.config/opencode/gsd-core/workflows/execute-plan.md
|
||||
@C:/Users/book/.config/opencode/gsd-core/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/STATE.md
|
||||
@.planning/REQUIREMENTS.md
|
||||
@.planning/phases/04-render-adaptation/04-CONTEXT.md
|
||||
@.planning/phases/04-render-adaptation/04-MATERIAL-INTERFACE-IMPACT.md
|
||||
@.planning/phases/04-render-adaptation/04-RENDER-INTERFACE-AUDIT.md
|
||||
@.planning/phases/04-render-adaptation/04-HERO-MOVER-INTERFACE.md
|
||||
@.planning/phases/04-render-adaptation/04-06-PLAN.md
|
||||
@.planning/phases/04-render-adaptation/04-07-PLAN.md
|
||||
@.planning/phases/04-render-adaptation/04-07-SUMMARY.md
|
||||
@.planning/phases/04-render-adaptation/04-PATTERNS.md
|
||||
@AGENTS.md
|
||||
@dev.md
|
||||
</context>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="checkpoint:decision" gate="blocking-human">
|
||||
<name>Task 0: 预执行汇报关卡 —— 汇报 TextureManager 新接口影响清点(D-38/D-40 第一步)的范围、基准、A–F 六类分列规则与唯一交付物、D-39/D-41/D-42 三条硬边界与只读证明方式,等待用户回复「可以执行」</name>
|
||||
<precondition>用户对 TextureManager 新接口适应的裁定 D-38 / D-39 / D-40 / D-41 / D-42 已写入 `.planning/phases/04-render-adaptation/04-CONTEXT.md`(以文件内实际存在 D-38..D-42 为准);`d36ea69 refactor: 贴图存储方式` 已在当日 HEAD(`git rev-parse HEAD` 以 `d36ea69` 开头)</precondition>
|
||||
<files>(只读汇报,不修改任何文件)</files>
|
||||
<read_first>
|
||||
- AGENTS.md(「任何计划的执行,其第一个 block 点必须是向我汇报计划内容并等待我确认」;只有明确回复「可以执行」四个字之后才允许开始执行;「如果发现任何问题,永远不要擅自将其视为问题并记录,必须经由我确认」;「任何公共、受保护、私有方法、字段等内容的命名必须先向我反馈」)
|
||||
- .planning/phases/04-render-adaptation/04-CONTEXT.md(D-38 / D-39 / D-40 / D-41 / D-42 裁定原文;D-33 范围、D-07 粒度、D-09 子代理、D-12 / D-18 / D-19 / D-22 / D-23 边界;Deferred Ideas)
|
||||
- .planning/phases/04-render-adaptation/04-07-SUMMARY.md(前一个已执行增量:material 接口适应实施的落点与「第二步已完成、REND 仍 Pending」的声明;本步是其后的 texture 新接口增量)
|
||||
- .planning/phases/04-render-adaptation/04-08-PLAN.md(本计划全文:objective 的三类差异与分列规则 / tasks / 禁令 / 门禁)
|
||||
- packages-user/client-base/src/material/types.ts(基准:`:12-17` `AutotileType`、`:75-86` `IMaterialFramedData.tileType`、`:94-163` `IAutotileProcessor`、`:165-215` `ITextureGetter` / `ITextureAliasGetter`、`:217-404` `ITextureManager`(`:220` `tiles`、`:222` `autotile`、`:241` `tilesetReserve`、`:246` `tilesetUnit`、`:336` `getFrameCount`))
|
||||
- packages-user/client-base/src/material/manager.ts:37-94(`export class TextureManager implements ITextureManager` 与构造器 `(state, tiles, tilesetReserve, tilesetUnit)`)
|
||||
- packages-user/client-base/src/material/autotile.ts:64(`export class AutotileProcessor implements IAutotileProcessor`)
|
||||
- packages-user/client-base/src/index.ts 与 packages-user/client-base/src/material/index.ts(barrel:`create()` / `createMaterial()` 已删;`export * from './utils'` 仍在)
|
||||
</read_first>
|
||||
<action>
|
||||
**停下并向用户汇报,等待明确回复后才继续;汇报本身只读,不写任何文件、不改任何生产代码、不派发子代理。**
|
||||
|
||||
① **要解决的问题(D-38 / D-39 / D-40 / D-41 / D-42)**:用户以 `d36ea69 refactor: 贴图存储方式` 重构了贴图存储层——`MaterialManager` 改名并重写为 **`TextureManager`**(构造器从无参改为 `(state, tiles, tilesetReserve, tilesetUnit)`)、`client.autotile` 与 `IClientBase.autotile` 删除、`AutotileProcessor` 重写、`IAutotileProcessor` 的 `render` / `renderWith` / `renderWithoutCheck` 合并为单一 `render(tile, connection)`、`renderAnimatedWith` → `renderAnimated`、`BlockCls` 枚举整体删除且 `IMaterialFramedData.cls` → `tileType: TileType`、barrel 与入口调整(`createMaterial()` / `create()` 删除)、新增 logger codes。用户明示**影响面大、主要在地图渲染部分**,故裁定**分两步**:第一步只读清点影响范围(本 run),第二步再规划修改。用户并明确三条硬边界:**加载相关不得修改**(加载本身 + 向 `TextureManager` 添加素材,用户自行适配新加载系统);**`material/` 已重构完毕、AI 只改消费者**;**接口被删且无替代必须向用户反馈,不得自拟替代**。
|
||||
|
||||
② **`d36ea69` 基准的三类差异(须逐条汇报)**:
|
||||
- **改名 1 类**:`MaterialManager` → `TextureManager`(`material/manager.ts:37`),且构造器改为 `(state, tiles, tilesetReserve, tilesetUnit)`(`manager.ts:84-89`)。
|
||||
- **移除**:`BlockCls` 枚举整体删除(消费者 `packages-user/client-modules/src/render/map/extension/hero.ts:15` / `render/map/renderer.ts:10` / `render/map/vertex.ts:27` 三处 import,规划日实测均报 TS2305)、`IMaterialFramedData.cls` 改为 `tileType`、`IAutotileProcessor.renderWithoutCheck` / `renderWith` / `render(autotile: number, connection)` 三者合并为 `render(tile, connection)`、`IAutotileProcessor.manager` 删除、`ITextureManager.getIdentifierByAlias` / `getAliasByIdentifier` 删除、`ITextureGetter.getBlockCls` / `ITextureAliasGetter.getBlockClsByAlias` 删除、`IClientBase.autotile` 删除、`material/index.ts` 的 `createMaterial()` 与 `client-base/src/index.ts` 的 `create()` 删除。
|
||||
- **新增 / 收紧**:`ITextureManager` 新增 `readonly tiles: ITileStore`(`types.ts:220`)与 `readonly autotile: IAutotileProcessor`(`:222`)、`readonly tilesetReserve`(`:241`)/ `readonly tilesetUnit`(`:246`)/ `getFrameCount(num)`(`:336`);`addGrid` / `addRowAnimate` / `addAutotile` / `addTileset` 四者参数收紧(分别新增 `width`+`height` / `width` / `type: AutotileType` / `cellWidth`+`cellHeight`);`IAutotileProcessor.flatten(source, type, frames)` 新增;`renderAnimatedWith` → `renderAnimated`;`IClientCoreConfig` 新增 `tilesetReserve` / `tilesetUnit` 两个必填字段。
|
||||
|
||||
③ **规划日实测的影响面(A–F 各类命中数为内容门禁下限;类型错误总行数为机器门禁断言值、texture 子集为规划日人工归类)**:`pnpm exec vue-tsc --noEmit` 当前 **202** 条错误,其中 **23** 条由本次 texture 接口改动直接造成(`client-base` 1 条 = `material/utils.ts(2,10)`;`client-modules` 22 条 = `fallback/load.ts` 9 + `render/map/extension/hero.ts` 2 + `render/map/renderer.ts` 5 + `render/map/vertex.ts` 6);另有 **15** 条属加载系统重构(`cc434a6`)既有(`load/loader.ts` 6 + `render/ui/load.tsx` 9),**不算**本次改动;其余 **164** 条为数据端测试 / 寻路等既有错误(该划分口径须用户确认)。具体:A 类符号级——`BlockCls` 3 处 import + `cls` 6 处读写 + `AutotileProcessor` 构造器 1 处;旧名 `MaterialManager` / `renderAnimatedWith` / `getIdentifierByAlias` / `getAliasByIdentifier` / `getBlockClsByAlias` 在源码面 **0** 引用(须给机器证据)。B 类签名级——`ITextureManager` 新增 5 个成员 + `IClientCoreConfig` 新增 2 个必填字段;四个 `add*` 方法的调用点全部落在 `fallback/load.ts`(归 E 类只报告)。C 类定位索引——8 个文件:`render/map/renderer.ts`、`render/map/vertex.ts`、`render/map/extension/hero.ts`、`render/map/moving.ts`、`render/map/types.ts`、`client-modules/src/client.ts`、`client-modules/src/types.ts`、`client-modules/src/core.ts`。D 类被删且无替代——`renderWithoutCheck`(`renderer.ts:1253`、`vertex.ts:461,874` 共 3 处调用点,接口上已无同名或等价成员)+ `BlockCls` + `manager` + `renderWith` + `getIdentifierByAlias` / `getAliasByIdentifier` + `IClientBase.autotile` + `material/utils.ts` 的两处 `BlockCls` 依赖(用户自有面)。
|
||||
|
||||
④ **大致解决方案**:只读清点,唯一交付物 `.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md`;11 节结构(`背景` / `方法` / `基准变更(d36ea69)` / `类型门禁实测基线` / `A 符号改名与移除的引用点` / `B 成员与签名变化的调用点` / `C 地图渲染消费者定位索引` / `D 被删且无替代(需用户反馈)` / `E 加载相关与添加素材(仅报告)` / `F 未能从阅读确定(未猜测)` / `处置`);A–E 每节固定列序表(`ID | 符号/成员名 | 命中处 | 基准侧锚点 | 问题描述 | 影响 | 置信`),每行 ≥2 个 `file:line` 锚点;**分列规则**:A = 符号级、B = 签名级、C = 定位索引(交叉引用 A/B/D 的 ID)、D = 被删且无替代(每条明写「请用户反馈」)、E = 加载与添加素材(仅报告);F 类只登记不判定。重型整文件读取可按 **D-09** 派**只读**子代理(仅回传事实表,不得写文件)。
|
||||
|
||||
⑤ **范围与硬边界**:被查 = `packages-user` 全量消费者面;基准 = `packages-user/client-base/src/material/{types,manager,autotile,index}.ts` + `client-base/src/types.ts`(`d36ea69` 后);`packages/` 与 `src/` 命中**仅报告、不修改**;**D-42**:`packages-user/client-base/src/material/` 只登记、不规划任何修改;**D-39 / D-41**:`client-base/src/load/loader.ts`(加载本身)与 `client-modules/src/fallback/load.ts`(向 `TextureManager` 添加素材)单列 E 节只报告。**生产源码零改动**;唯一写入为上述交付文档(外加本 PLAN 与 `04-08-SUMMARY.md` 两份簿记)。
|
||||
|
||||
⑥ **计划号与 wave(须原样告知)**:本计划为 **04-08**(第七个增量),`wave: 7`,`depends_on` 列 `04-01`..`04-07`;phase 目录内既有 `04-01`..`04-07` 的 `*-PLAN.md` 与 `*-SUMMARY.md` **一律不得改写 / 覆盖 / 改号**。
|
||||
|
||||
⑦ **验证方式与只读证明(须原样告知)**:本步为只读清点,**无运行时行为可观察**。证明方式 = ①**只读门禁**:`git status --porcelain -- packages packages-user src` 在 Task 1 起始逐行记录(规划日实测集合为空),Task 1 / Task 3 断言其后逐条一致;②**类型门禁一致性**:`pnpm exec vue-tsc --noEmit` 在 Task 1 起始记录**错误总行数**与 texture 子集两个数字(规划日 202 / 23),Task 3 重跑**只断言错误总行数**与记录值一致;texture / 加载既有 / 其余既有的划分属规划日人工归类(口径须用户确认),执行日按实测重新归类并逐行列出,由人工复核保证,**不作为机器门禁**;③**静态内容门禁**:11 节结构、A–F 行数下限与关键词、每行 ≥2 个 `file:line` 锚点、C 类交叉引用 ID 齐备、D 类「无替代·请用户反馈」措辞齐备、E 类只报告口径;④**符号零命中复验**:`MaterialManager` / `renderAnimatedWith` / `getBlockClsByAlias` / `getIdentifierByAlias` / `getAliasByIdentifier` 在 `packages-user` 源码面无引用;⑤**既有计划保护 + 计划范围门禁**:`04-01`..`04-07` 的 `*-PLAN.md` / `*-SUMMARY.md` porcelain 为空;phase 目录内 `-PLAN.md` 仅 `04-01`..`04-08`;⑥**CRLF 门禁**;⑦**人工代码复核**。**不冒充任何无法运行的门禁。**
|
||||
|
||||
⑧ **第二步不被规划**:本 run **不含**修复方案、不含代码改动建议、不产出 `04-09+`;第二步(TextureManager 新接口适应实施)待用户审阅本清点文件后另行规划(D-40)。
|
||||
|
||||
⑨ **关卡性质(必须原样告知用户)**:无论触发方式(`/gsd-execute-phase`、`/gsd-manager`、`/gsd-autonomous`、子代理/执行器派发)或配置模式(`.planning/config.json` 的 `mode: yolo`、`workflow.auto_advance`)如何,**执行者/子代理都必须在此停下并等待**用户明确回复「可以执行」四个字;未收到这四个字前不得执行任何任务、不得派发执行子代理,也不得以「自动化模式」为由自动放行。
|
||||
|
||||
⑩ **失败语义(等同硬门禁,非自动命令)**:用户未回复「可以执行」即继续,或回复的是其它任何内容(含修订意见、沉默、`yolo` / `auto_advance` 模式下的自动推进、或子代理/执行器的自行放行),一律视为**未通过本关卡**:必须立即停止执行,不派发任何执行子代理,保持只读、不写任何文件,直到用户在对话中明确回复「可以执行」四个字后方可继续。本条只以本 `<action>` 与 `<acceptance_criteria>` 表达,不写成 XML 失败声明元素(人工关卡没有可运行的自动命令可与之绑定)。
|
||||
|
||||
⑪ **若用户给出修订意见**(含不同意 A–F 分列规则 / 不同意 texture 与「加载既有 / 其余既有」的划分口径 / 不同意范围或基准 / 希望把加载面纳入本步):退出本计划、修订 `04-08-PLAN.md` 后重新汇报,不得自行改道执行。
|
||||
</action>
|
||||
<decision>是否按本计划(TextureManager 新接口影响范围只读清点:唯一交付物 `04-TEXTURE-INTERFACE-IMPACT.md`,11 节 / A–F 六类,范围限 `packages-user` 消费者面,`packages/` 与 `src/` 仅报告,`material/` 与「加载相关」按 D-39 / D-41 / D-42 只报告,生产代码零改动,第二步不规划)开始执行</decision>
|
||||
<context>
|
||||
AGENTS.md 要求任何计划的第一个 block 点必须是向用户汇报计划内容并等待用户确认;本计划虽是只读清点,仍不得例外。`.planning/config.json` 为 `mode: yolo`(execute-plan 默认自动推进),因此该关卡必须显式声明为 `blocking-human` 并置 `autonomous: false`,否则计划层面不提供任何 block 点。此外本次清点存在三条会改变范围归属的用户裁定(D-39 / D-41 加载排除、D-42 `material/` 归用户),必须在关卡中先行澄清,避免 AI 把用户自有的面当成自己的工作范围。
|
||||
</context>
|
||||
<options>
|
||||
<option id="execute">
|
||||
<name>可以执行</name>
|
||||
<pros>按本计划执行:只读清点,零生产代码改动,唯一写入为交付文档 + 两份簿记;产出可供用户审阅并据此裁定第二步 texture 接口适应的修复范围</pros>
|
||||
<cons>无(只读;只读性与类型门禁一致性由 Task 1 / Task 3 机器判定)</cons>
|
||||
</option>
|
||||
<option id="revise">
|
||||
<name>修订范围 / A–F 分列规则 / 类型归属口径后再执行</name>
|
||||
<pros>避免带着错误的范围(如把加载面或 `material/` 纳入第二步)或错误的分类(把签名变化报成符号移除)落地</pros>
|
||||
<cons>退出本计划并修订 PLAN.md 后重新汇报,增加一轮往返</cons>
|
||||
</option>
|
||||
<option id="renumber">
|
||||
<name>可以执行,但改用其它编号</name>
|
||||
<pros>按用户指定的编号落地,避免后续引用混淆</pros>
|
||||
<cons>需用户先指定文件名;phase 目录内既有 `04-01`..`04-07` 产物不得改写 / 覆盖</cons>
|
||||
</option>
|
||||
</options>
|
||||
<resume-signal>回复「可以执行」四个字(或给出修订意见)</resume-signal>
|
||||
<verify>
|
||||
<human-check>用户在对话中明确回复「可以执行」四个字(人工核对用户回复原文;本关卡为人工关卡,无自动命令,失败语义写在 Task 0 的 action ⑩ 与 acceptance_criteria 中)</human-check>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- 用户回复中明确包含「可以执行」四个字
|
||||
- 汇报内容涵盖:要解决的问题(D-38 / D-40 第一步)、`d36ea69` 的三类差异(改名 1 类 / 移除:`BlockCls` / `cls`→`tileType` / 三方法合一 / 两个别名查找方法与 barrel 入口 / 新增:`tiles` / `autotile` / `tilesetReserve` / `tilesetUnit` / `getFrameCount` / 四个 `add*` 参数收紧 / `IClientCoreConfig` 两个必填字段)、规划日实测的影响面(202 总错误与 23 条 texture 归属,及 A–F 六类具体命中)、大致解决方案(11 节结构 + 固定列序 + A/B/C/D/E 分列规则 + F 只登记不判定)、范围与硬边界(`packages-user` 消费者面、`packages/` 与 `src/` 仅报告、`material/` 与加载面只报告、生产代码零改动)、唯一交付物与两步走
|
||||
- 汇报中已原样告知 **D-39 / D-41**(加载本身 + 向 `TextureManager` 添加素材 → E 类只报告、用户自理)与 **D-42**(`material/` 归用户、接口被删无替代必须反馈)
|
||||
- 汇报中已原样告知**编号与 wave**(04-08 / wave 7 / `depends_on` 04-01..04-07)以及既有 `04-01`..`04-07` 产物不得改写 / 覆盖 / 改号
|
||||
- 汇报中已原样告知**验证方式与只读证明**(只读门禁 / 类型门禁一致性 / 静态内容门禁 / 符号零命中复验 / 既有计划保护与计划范围门禁 / CRLF / 人工复核),并声明无运行时行为可观察
|
||||
- 汇报中已原样告知**关卡性质**:执行者/子代理必须停下等待,不因触发方式或 `yolo` / `auto_advance` 模式自动放行
|
||||
</acceptance_criteria>
|
||||
<done>用户明确回复「可以执行」;在此之前未执行任何任务、未修改任何文件、未派发任何执行子代理</done>
|
||||
</task>
|
||||
|
||||
<task type="tracer">
|
||||
<name>Task 1(tracer):交付文档骨架 + 一条端到端清点切片 —— 起始基线(porcelain + `pnpm exec vue-tsc --noEmit`)+ 11 节结构 + `## 基准变更(d36ea69)` 三类差异定稿 + `## 类型门禁实测基线` 实测数字 + A 类 `#04-08-A-01` 双锚点实测,结构 / CRLF / 只读门禁转绿</name>
|
||||
<precondition>Task 0 已闭环:用户在对话中明确回复「可以执行」四个字(未收到则不得开始本任务)</precondition>
|
||||
<files>.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md</files>
|
||||
<read_first>
|
||||
- .planning/phases/04-render-adaptation/04-MATERIAL-INTERFACE-IMPACT.md:1-50(前进量的元信息块、`## 背景`、`## 方法`、固定列序表与「只读起始基线」的既有写法,可直接对齐版式)
|
||||
- .planning/phases/04-render-adaptation/04-06-PLAN.md(前进量的 objective / tasks / 门禁结构,可对齐版式与证据纪律)
|
||||
- .planning/phases/04-render-adaptation/04-CONTEXT.md(D-38 / D-39 / D-40 / D-41 / D-42 原文;D-33 范围;D-07 粒度;D-09 子代理;D-12 / D-18 / D-19 / D-22 / D-23 边界)
|
||||
- .planning/phases/04-render-adaptation/04-08-PLAN.md(本计划全文:objective 的三类差异表与分列规则、tasks、禁令、门禁)
|
||||
- packages-user/client-base/src/material/types.ts(整文件:`:12-17` `AutotileType`、`:75-86` `IMaterialFramedData`(`tileType: TileType`)、`:94-163` `IAutotileProcessor`(`:101-105` `flatten`、`:148-151` `render`、`:159-162` `renderAnimated`)、`:165-189` `ITextureGetter`、`:191-215` `ITextureAliasGetter`、`:217-404` `ITextureManager`;确认 `BlockCls` 不在其中)
|
||||
- packages-user/client-base/src/material/manager.ts:37-94(`export class TextureManager implements ITextureManager`;构造器 `(readonly state, readonly tiles, readonly tilesetReserve, readonly tilesetUnit)`;`:40` `textures`)
|
||||
- packages-user/client-base/src/material/autotile.ts:64(`export class AutotileProcessor implements IAutotileProcessor` 与构造器签名)
|
||||
- packages-user/client-base/src/index.ts 与 packages-user/client-base/src/material/index.ts(barrel:`create()` / `createMaterial()` 确已删除;`export * from './utils'` 仍在,`utils.ts` 依赖 `BlockCls`)
|
||||
- packages-user/client-base/src/types.ts:1-32(`IClientBase.materials` 是唯一公共面;`autotile` 已删)
|
||||
- packages-user/client-modules/src/client.ts:12-19,45-95,125(`TextureManager` 构造点与 `AutotileProcessor` / `IAutotileProcessor` 未使用 import)
|
||||
- packages-user/client-modules/src/types.ts:1-12 与 packages-user/client-modules/src/core.ts:1-11(`IClientCoreConfig` 新增必填字段与单例传入值)
|
||||
- packages-user/client-modules/src/render/map/renderer.ts:8-15,217,234(A 类首条切片与构造点)
|
||||
- dev.md(「项目结构」的单向依赖;「命名规则」;「其他要求」的 CRLF 要求)
|
||||
</read_first>
|
||||
<action>
|
||||
(0a) **起始基线快照(只读前置,先做这一步)**:执行 `git status --porcelain -- packages packages-user src`,把输出**原样逐行**记为「只读起始基线」写入 `## 方法`:先写 bullet `- **只读起始基线(packages / packages-user / src)**:`,其后逐行抄录输出(每条一行,行首为两字符状态码;输出为空则写 `(无)`)。规划日 2026-09-22 实测该输出为**空**(工作树内唯一的未提交改动是 `.planning/phases/04-render-adaptation/04-CONTEXT.md`,不在该路径集合内)。**不得回滚、暂存、提交或修改**任何既有改动;若当日实测出现 `packages` / `packages-user` / `src` 下的条目,逐条记录并原样保留(属本次清点范围内的既有改动,需在 `## 方法` 注明)。同时记下 `git rev-parse HEAD` 的当日值写入元信息块(规划日为 `d36ea69`)。
|
||||
|
||||
(0b) **类型门禁实测基线(只读前置,与 (0a) 同批完成)**:执行 `pnpm exec vue-tsc --noEmit`,把完整输出的**错误总行数**与**texture 归属错误行数**两个数字写入 `## 类型门禁实测基线`:bullet 逐字写 `- **错误总行数**:<N>` 与 `- **texture 归属错误行数**:<M>`,其中 N = `node -e "const{execSync}=require('child_process');let o='';try{o=execSync('pnpm exec vue-tsc --noEmit',{encoding:'utf8',maxBuffer:1<<28,stdio:['ignore','pipe','pipe']})}catch(e){o=(e.stdout||'')+(e.stderr||'')}console.log((o.match(/error TS\d+/g)||[]).length)"` 的输出值(与 Task 3 门禁使用**同一正则**,保证可逐字比对)。规划日 2026-09-22 实测 **N = 202**、**M = 23**(texture 23 = `client-base` 1 条 `material/utils.ts(2,10)` TS2305 + `client-modules` 22 条:`fallback/load.ts` 9 条 TS2554(`:76,:77,:80,:81,:82,:83,:84,:95,:105`)、`render/map/extension/hero.ts` 2 条(`:15` TS2305、`:167` TS2353)、`render/map/renderer.ts` 5 条(`:10` TS2305、`:234` TS2554、`:1252` / `:1263` TS2339、`:1253` TS2339)、`render/map/vertex.ts` 6 条(`:27` TS2305、`:461` / `:874` TS2339、`:517` / `:561` / `:852` TS2339))。同时在该节**逐行列出全部 texture 归属错误**(`file:line` + `error TSxxxx` + 原文摘要),并把所述三分类**单列**:① texture 归属 **23**;② 加载系统重构(提交 `cc434a6`)既有 **15**(`client-base/src/load/loader.ts` 6 条 TS2305 + `client-modules/src/render/ui/load.tsx` 9 条 TS2339);③ 其余既有 **164**(`data-base` / `data-state` / `data-system` 的测试与寻路等)。**明写「texture / 加载既有 / 其余既有」的划分口径是规划日的人工归类、须用户确认**(见 assumptions)。**以当日实测为准**,与规划日数值不同即按实测写入并在 `## 处置` 说明差异,不得按规划日数值硬写。
|
||||
|
||||
(1) **新建交付文档** `.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md`,先写标题与 6 行元信息块:`**日期:**`(当日日期);`**范围:**` 被查对象 `packages-user` 全量消费者面;`packages/` 与 `src/` 命中仅报告、不修改(D-32 沿用);**`packages-user/client-base/src/material/` 按 D-42 只登记、不修改**;`**性质:**` 只读清点(D-38 / D-40 第一步),未修改任何生产代码;`**接口基准:**` `packages-user/client-base/src/material/{types,manager,autotile,index}.ts` 与 `packages-user/client-base/src/types.ts`(`d36ea69` 后);`**基准提交:**` `d36ea69 refactor: 贴图存储方式`(当日工作树 HEAD);`**下一步:**` 第二步(TextureManager 新接口适应实施)未规划,待用户审阅本文件后另行规划(D-40)。**全文使用 CRLF 换行**(dev.md「换行使用 CRLF 格式」);若写入工具产出 LF,用 `node -e "const fs=require('fs');const p='.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md';fs.writeFileSync(p,fs.readFileSync(p,'utf8').replace(/\r?\n/g,'\r\n'))"` 统一转换后落盘;Task 2 / Task 3 追加内容同样保持 CRLF,不得出现孤立 LF。
|
||||
|
||||
(2) 写 `## 背景`:D-38(用户已完成 TextureManager 重构 `d36ea69`,影响面大、主要在地图渲染部分;下一目标 = 适应新接口)、D-39(不得修改加载相关内容,用户自行适配新加载系统)、D-40(分两步,本步只读清点,产出只读影响清单;第二步待用户审阅后再规划)、D-41(「加载相关」排除边界 = 加载本身 + 向 `TextureManager` 添加素材的内容)、D-42(`material/` 已由用户重构完毕,AI 只修改消费者;接口被删且无替代必须向用户反馈、不得自拟替代)。并沿用 D-33 的范围约束(范围外一律不改、不追求解决全部类型错误、只清点与本次 texture 接口适应相关的项)。明写本步**只清点、不修改、不规划第二步**。
|
||||
|
||||
(3) 写 `## 方法`((0a) 的「只读起始基线」bullet 也在本节):枚举两侧面 ——(a)**基准面** = `packages-user/client-base/src/material/types.ts`(`ITextureManager` / `ITextureGetter` / `ITextureAliasGetter` / `IAutotileProcessor` / `IMaterialFramedData` / `AutotileType` 等现行成员)+ `manager.ts`(`TextureManager` 构造器)+ `autotile.ts`(`AutotileProcessor` 构造器)+ `index.ts` / `client-base/src/index.ts`(barrel)+ `client-base/src/types.ts`(`IClientBase.materials`)+ `client-modules/src/types.ts`(`IClientCoreConfig`);(b)**命中面** = `packages-user` 全量(`client-base` / `client-modules` / `client-system` / `entry-*` / `legacy-plugin-*` / `data-fallback`),另对 `packages/` 与 `src/` 做**对照扫描**(只登记、不修改)。判定口径固定为 **A 符号改名与移除的引用点 / B 成员与签名变化的调用点 / C 地图渲染消费者定位索引 / D 被删且无替代(需用户反馈)/ E 加载相关与添加素材(仅报告)/ F 未能从阅读确定** 六类,**一条记录只归一类**,跨类拆条并互相引用;**分列规则写死**:A 记「符号级(旧名 / 被删符号的消费者引用)」,B 记「签名级(成员在但参数 / 类型变化的消费者调用)」,C 记「第二步将触及的定位汇总(不新增独立事实,逐条交叉引用 A / B / D 的 ID)」,D 记「接口已删且 AI 未发现替代(每行明写需用户反馈)」,E 记「加载本身 + 向 `TextureManager` 添加素材(D-39 / D-41 归用户)」,F 记「静态阅读不能定论」。证据纪律:每行含 `符号/成员名 + 命中处 file:line + 基准侧锚点 file:line + 问题描述 + 影响 + 置信`,**每行至少两个锚点**;静态阅读不能定论者一律进 F 类,**不得写成错配 / 缺失 / 残留**。**D-42 纪律**:命中 `packages-user/client-base/src/material/` 内的记录一律归 D 类并标注「用户自有面」,不得写成 AI 工作项。允许按 **D-09** 派**只读**子代理做重型整文件扫描(子代理只回传事实表「符号 / 成员名 + 所属 `file:line` + 形态或签名」,**不得写文件、不得贴大段源码**),最终由主执行者按 `file:line` 切片复核。同时记录 (0b) 的类型门禁命令与两个数字的口径(正则 `error TS\d+` 的匹配数)。
|
||||
|
||||
(4) 补齐 11 个二级标题(`## 背景` / `## 方法` / `## 基准变更(d36ea69)` / `## 类型门禁实测基线` 已在前几步写入,此处补齐其余 7 个占位,其后 Task 2 在同一骨架上横向补齐,不再改结构):`## A 符号改名与移除的引用点` / `## B 成员与签名变化的调用点` / `## C 地图渲染消费者定位索引` / `## D 被删且无替代(需用户反馈)` / `## E 加载相关与添加素材(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`。**每个类别标题下先写一行记录编号模板**(供 Task 2 横向补齐时对齐):A 类 `#04-08-A-NN`、B 类 `#04-08-B-NN`、C 类 `#04-08-C-NN`、D 类 `#04-08-D-NN`、E 类 `#04-08-E-NN`,行形如 `| #04-08-X-NN | 符号/成员名 | 命中处 file:line | 基准侧锚点 file:line | 问题描述 | 影响 | 置信 |`;F 类条目形如 `- **#04-08-F-NN**:现象 + 为什么读不出来 + 需要用户裁决的点`。模板行用 `NN` 占位、不含数字,故不计入任何行数门禁。
|
||||
|
||||
(5) **`## 基准变更(d36ea69)` 定稿(本任务的核心横向切片)**:以 `git show d36ea69 --stat` 与 `git show d36ea69 -- packages-user/client-base/src/material/types.ts packages-user/client-base/src/index.ts packages-user/client-base/src/material/index.ts packages-user/client-base/src/types.ts packages-user/client-modules/src/{client.ts,core.ts,types.ts}` 为依据,并与当日工作树**逐条比对**后写入三类差异:① **改名** —— `MaterialManager` → `TextureManager`(现 `material/manager.ts:37`),并记录构造器由无参改为 `(state, tiles, tilesetReserve, tilesetUnit)`(`manager.ts:84-89`)与 `AutotileProcessor` 构造器(`autotile.ts:64`);② **移除** —— `BlockCls` 枚举整体删除(附「现行 `material/types.ts` 成员集合不含」的锚点,如 `:75-86` 的 `IMaterialFramedData` 现为 `tileType: TileType`)、`IMaterialFramedData.cls` → `tileType`、`IAutotileProcessor` 的 `render(autotile: number, connection)` / `renderWith` / `renderWithoutCheck` 三者合并为 `render(tile: IMaterialFramedData, connection)`(`:148-151`)、`IAutotileProcessor.manager` 删除、`renderAnimatedWith` → `renderAnimated`(`:159-162`)、`ITextureManager.getIdentifierByAlias` / `getAliasByIdentifier` 删除、`ITextureGetter.getBlockCls` / `ITextureAliasGetter.getBlockClsByAlias` 删除、`IClientBase.autotile` 删除(`client-base/src/types.ts` 现仅 `:18` `materials`)、`material/index.ts` 的 `createMaterial()` 与 `client-base/src/index.ts` 的 `create()` 删除;③ **新增 / 收紧** —— `ITextureManager` 新增 `readonly tiles: ITileStore`(`:220`)/ `readonly autotile: IAutotileProcessor`(`:222`)/ `readonly tilesetReserve`(`:241`)/ `readonly tilesetUnit`(`:246`)/ `getFrameCount`(`:336`),`addGrid`(`:261-266`)/ `addRowAnimate`(`:275-280`)/ `addAutotile`(`:289-293`)/ `addTileset`(`:302-307`)四者参数收紧,`IAutotileProcessor.flatten`(`:101-105`)新增,`AutotileType`(`:12-17`)新增,`IClientCoreConfig` 新增 `tilesetReserve` / `tilesetUnit`(`client-modules/src/types.ts:8-10`)。另记录同提交内的**相邻变更**(登记,不作本步裁定):`client-modules/src/core.ts` 单例改传 config(`tilesetReserve: 100000` / `tilesetUnit: 5000`)、`entry-client/src/create.ts` 删除 `UserClientBase.create()` 调用、`packages/common/src/logger.json` 新增 8 行。**不得**修改任何被引用文件。
|
||||
|
||||
(6) **A 类首条切片(本任务唯一实测清点行)**:在 `## A 符号改名与移除的引用点` 下先写固定列序表头 `| ID | 符号/成员名 | 命中处 | 基准侧锚点 | 问题描述 | 影响 | 置信 |`,再写 `#04-08-A-01` 一行:符号 = `AutotileProcessor`(导出类,构造器改为单参 `constructor(readonly state: ICoreState)`;**请先打开 `autotile.ts:75` 的构造器逐字核对后在文档中写明形参**);命中处 = `packages-user/client-modules/src/render/map/renderer.ts:234`(`new AutotileProcessor(manager, manager.state)`)与 `packages-user/client-modules/src/client.ts:16`(`AutotileProcessor` 在 `client.autotile` 删除后成为未使用 import);基准侧锚点 = `packages-user/client-base/src/material/autotile.ts:75`(`constructor(readonly state: ICoreState)`)与 `packages-user/client-base/src/material/manager.ts:90`(`this.autotile = new AutotileProcessor(state)`);问题描述 = 消费者仍按旧形参个数构造(传 2 参),且 `client.ts` 的两处 import 已无使用点;影响 = 编译报 TS2554(`renderer.ts:234`,期望 1 参得 2 参)与潜在未使用 import 的 lint 诊断;置信 = 高;依据 = 上述锚点 + 实测错误行。同一行内**不得**出现修复建议或替代写法(替代是否成立属 F 类)。同时在 `## 类型门禁实测基线` 中确证该错误行已逐字列出。
|
||||
|
||||
(7) 写 `## 处置` 初稿:本步只读、未改任何生产代码、`files_modified` 仅本文件;相对 (0a) 记录的只读起始基线零变化;本步**不规划第二步**(D-40),第二步(TextureManager 新接口适应实施)待用户审阅本文件后另行规划;范围限 `packages-user` 消费者面、`packages/` 与 `src/` 仅报告(D-33 沿用);`material/` 与「加载相关」按 D-39 / D-41 / D-42 只报告并归用户;接口被删且无替代者一律请用户反馈(D-42);`core.*` legacy 适配(D-12)与移动控制(D-19)、跟随者(D-22)、`HeroRendering` 语义(D-18)不属本步;`REND-01` / `REND-02` 保持 Pending。
|
||||
|
||||
(8) **本任务只写该交付文档一个文件**;不得改动任何被查源码(含用户既有的未提交改动),不得派发会写文件的子代理,不得新增计划文件。
|
||||
</action>
|
||||
<reversibility rating="reversible">交付文档是只读清点的记录,可随时修订或废弃;它不引入生产代码、公共接口或契约约束,因此这一步的任何取舍都不难回退。</reversibility>
|
||||
<verify>
|
||||
<automated>node -e "const fs=require('fs');const p='.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md';const t=fs.readFileSync(p,'utf8');const need=['## \u80cc\u666f','## \u65b9\u6cd5','## \u57fa\u51c6\u53d8\u66f4','## \u7c7b\u578b\u95e8\u7981\u5b9e\u6d4b\u57fa\u7ebf','## A \u7b26\u53f7\u6539\u540d','## B \u6210\u5458\u4e0e\u7b7e\u540d','## C \u5730\u56fe\u6e32\u67d3\u6d88\u8d39\u8005','## D \u88ab\u5220\u4e14\u65e0\u66ff\u4ee3','## E \u52a0\u8f7d\u76f8\u5173','## F \u672a\u80fd\u4ece\u9605\u8bfb\u786e\u5b9a','## \u5904\u7f6e'];const miss=need.filter(h=>t.indexOf(h)<0);if(miss.length>0){console.error('MISSING HEADINGS '+miss.length+' :: '+miss.join(' ; '));process.exit(1)}if(t.indexOf('\u53ea\u8bfb\u8d77\u59cb\u57fa\u7ebf')<0){console.error('MISSING READONLY BASELINE');process.exit(1)}if(!/d36ea69/.test(t)){console.error('MISSING BASELINE COMMIT');process.exit(1)}console.log('OK headings '+need.length)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "MISSING HEADINGS" / "MISSING READONLY BASELINE" / "MISSING BASELINE COMMIT"(11 个二级标题未齐备,或 `## 方法` 未记录只读起始基线,或未登记基准提交 `d36ea69`)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const seg=(h)=>{const i=t.indexOf(h);if(i<0)return '';const rest=t.slice(i+h.length);const j=rest.search(/\r?\n## /);return j<0?rest:rest.slice(0,j)};const bs=seg('## \u57fa\u51c6\u53d8\u66f4');const need=['MaterialManager','TextureManager','BlockCls','tileType','renderAnimatedWith','renderAnimated','renderWithoutCheck','renderWith','getIdentifierByAlias','getAliasByIdentifier','getBlockCls','IClientBase','tiles','tilesetReserve','tilesetUnit','getFrameCount','addGrid','addRowAnimate','addAutotile','addTileset','AutotileType','createMaterial','IClientCoreConfig'];const miss=need.filter(k=>bs.indexOf(k)<0);if(miss.length>0){console.error('BASELINE SECTION MISSING '+miss.join('|'));process.exit(1)}if(!/[A-Za-z0-9_\-\/]+\.tsx?:\d+/.test(bs)){console.error('BASELINE SECTION WITHOUT ANCHOR');process.exit(1)}console.log('OK baseline tokens '+need.length)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "BASELINE SECTION MISSING" / "BASELINE SECTION WITHOUT ANCHOR"(`## 基准变更(d36ea69)` 未覆盖改名 / 移除 / 新增收紧三类差异的关键符号,或该节无任何 `file:line` 锚点)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const a=t.match(/\u9519\u8bef\u603b\u884c\u6570\uff1a\s*(\d+)/);const b=t.match(/texture \u5f52\u5c5e\u9519\u8bef\u884c\u6570\uff1a\s*(\d+)/);if(!a||!b){console.error('MISSING TSC BASELINE FIGURES');process.exit(1)}if(Number(b[1])<1||Number(b[1])>Number(a[1])){console.error('TSC BASELINE FIGURES INCONSISTENT '+a[1]+' '+b[1]);process.exit(1)}const n=(t.match(/error TS\d+/g)||[]).length;if(n<10){console.error('TOO FEW TEXTURE ERROR ANCHORS '+n);process.exit(1)}console.log('OK tsc total '+a[1]+' texture '+b[1]+' listed '+n)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "MISSING TSC BASELINE FIGURES" / "TSC BASELINE FIGURES INCONSISTENT" / "TOO FEW TEXTURE ERROR ANCHORS"(未记录错误总行数与 texture 归属行数,或两数自相矛盾,或未逐行列出 texture 归属错误)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const rows=t.split(/\r?\n/).filter(l=>/^\|\s*#04-08-A-\d+\s*\|/.test(l));if(rows.length<1){console.error('NO A ROWS');process.exit(1)}const bad=rows.filter(l=>((l.match(/[A-Za-z0-9_\-.\/]+\.tsx?:\d+/g)||[]).length<2));if(bad.length>0){console.error('A ROW MISSING TWO-SIDED ANCHOR '+bad.length);process.exit(1)}console.log('OK A rows '+rows.length)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "NO A ROWS" / "A ROW MISSING TWO-SIDED ANCHOR"(A 类未写端到端切片行,或该行缺命中处 / 基准侧锚点之一)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const s=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const lf=(s.match(/\n/g)||[]).length;const crlf=(s.match(/\r\n/g)||[]).length;if(lf!==crlf){console.error('NON-CRLF LINE ENDINGS '+(lf-crlf));process.exit(1)}console.log('OK CRLF lines '+crlf)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "NON-CRLF LINE ENDINGS"(交付文档出现非 CRLF 换行,违反 dev.md「换行使用 CRLF 格式」)</fails_when>
|
||||
<automated>node -e "const fs=require('fs'),{execSync}=require('child_process');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const seg=(h)=>{const i=t.indexOf(h);if(i<0)return '';const rest=t.slice(i+h.length);const j=rest.search(/\r?\n## /);return j<0?rest:rest.slice(0,j)};const ms=seg('## \u65b9\u6cd5');if(ms.indexOf('\u53ea\u8bfb\u8d77\u59cb\u57fa\u7ebf')<0){console.error('READONLY BASELINE NOT RECORDED');process.exit(1)}const rec=(ms.match(/^[ MARCUD?!]{2} (?:packages|packages-user|src)[^\r\n]*/gm)||[]).map(s=>s.replace(/\s+$/,''));let raw='';try{raw=execSync('git status --porcelain -- packages packages-user src',{encoding:'utf8'})}catch(e){console.error('GIT STATUS FAILED '+(e.message||''));process.exit(1)}const out=raw.replace(/\s+$/,'');const cur=out.length>0?out.split(/\r?\n/).map(s=>s.replace(/\s+$/,'')):[];const extra=cur.filter(l=>rec.indexOf(l)<0);const gone=rec.filter(l=>cur.indexOf(l)<0);if(extra.length+gone.length>0){console.error('READONLY BASELINE CHANGED extra=['+extra.join(' ; ')+'] missing=['+gone.join(' ; ')+']');process.exit(1)}console.log('OK read-only baseline verbatim entries '+cur.length)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "READONLY BASELINE NOT RECORDED" / "READONLY BASELINE CHANGED"(`## 方法` 未把起始 `git status --porcelain -- packages packages-user src` 输出逐行原样记录,或记录内容与当前状态不一致 —— 违反只读约束)</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- 交付文档存在于 `.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md`,11 个二级标题逐字存在(`## 背景` / `## 方法` / `## 基准变更(d36ea69)` / `## 类型门禁实测基线` / `## A 符号改名与移除的引用点` / `## B 成员与签名变化的调用点` / `## C 地图渲染消费者定位索引` / `## D 被删且无替代(需用户反馈)` / `## E 加载相关与添加素材(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`)
|
||||
- 元信息块 6 行齐备(日期 / 范围 / 性质 / 接口基准 / 基准提交 / 下一步),且「范围」明写限 `packages-user` 消费者面、`packages/` 与 `src/` 仅报告、`material/` 按 D-42 只登记
|
||||
- `## 方法` 含「只读起始基线」条目,**逐行原样**记录起始 `git status --porcelain -- packages packages-user src` 的输出(规划日为空 → 写「(无)」);门禁断言记录条目与当前状态逐条一致
|
||||
- `## 方法` 写死 A/B/C/D/E/F 六类判定口径与分列规则(A 符号级 / B 签名级 / C 定位索引并交叉引用 / D 被删无替代须反馈 / E 加载与添加素材只报告 / F 只登记不判定),并写明每行须含命中处与基准侧两个 `file:line` 锚点
|
||||
- `## 基准变更(d36ea69)` 覆盖三类差异:改名(`MaterialManager`→`TextureManager` 与构造器)、移除(`BlockCls` / `cls`→`tileType` / 三方法合一 / `renderAnimatedWith` / 两个别名查找方法 / `getBlockCls(ByAlias)` / `IClientBase.autotile` / `create()` 与 `createMaterial()`)、新增收紧(`tiles` / `autotile` / `tilesetReserve` / `tilesetUnit` / `getFrameCount` / 四个 `add*` 参数 / `flatten` / `AutotileType` / `IClientCoreConfig`),并登记同提交相邻变更(`core.ts` config、`entry-client/src/create.ts`、`logger.json`)
|
||||
- `## 类型门禁实测基线` 逐字记录 `- **错误总行数**:<N>` 与 `- **texture 归属错误行数**:<M>`(规划日 202 / 23,执行日以实测为准),逐行列出全部 texture 归属错误,并把「加载系统重构既有 15」与「其余既有 164」**单列**,明写该划分口径「须用户确认」
|
||||
- A 类含固定列序表头与至少 1 条 `#04-08-A-*` 行,该行含命中处与基准侧两个 `file:line` 锚点,且行内无修复建议
|
||||
- 相对记录在 `## 方法` 的只读起始基线零变化(porcelain 条目逐条一致);未修改任何生产源码;未新增计划文件;全文 CRLF
|
||||
</acceptance_criteria>
|
||||
<done>交付文档骨架(11 节)+ `## 基准变更(d36ea69)` 三类差异 + `## 类型门禁实测基线` 实测数字(202 / 23 及三分类单列)+ A 类 `#04-08-A-01` 端到端双锚点切片全部落位;结构 / 基准关键词 / 类型基线 / A 行双锚点 / CRLF / 只读基线六道门禁转绿;Task 2 只需在同一模板上横向补齐</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2:A–F 六类横向补齐 —— 符号级引用点与旧名零命中证据 / 签名级调用点 / 地图渲染定位索引(交叉引用)/ 被删且无替代逐条反馈 / 加载与添加素材仅报告 / 未确定项只登记</name>
|
||||
<files>.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md</files>
|
||||
<read_first>
|
||||
- .planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md(Task 1 的产出:在同一骨架上横向补齐,**不改结构、不改元信息块、不改已定稿的 `## 基准变更` 与 `## 类型门禁实测基线` 数字**)
|
||||
- .planning/phases/04-render-adaptation/04-CONTEXT.md(D-38 / D-39 / D-40 / D-41 / D-42 原文;D-33 范围;D-07 粒度;D-09 子代理;D-12 / D-18 / D-19 / D-22 / D-23 边界)
|
||||
- packages-user/client-base/src/material/types.ts(基准侧锚点:`:75-86` / `:94-163` / `:165-215` / `:217-404`;`BlockCls` 确不在其中)
|
||||
- packages-user/client-base/src/material/manager.ts:37-94(`TextureManager` 类与构造器;`:90` `new AutotileProcessor(state)`)
|
||||
- packages-user/client-base/src/material/autotile.ts:64 与 packages-user/client-base/src/material/utils.ts:1-53(用户自有面:`AutotileProcessor` 类与 `utils.ts` 依赖 `BlockCls` 的两个 `@deprecated` 函数)
|
||||
- packages-user/client-base/src/index.ts 与 packages-user/client-base/src/material/index.ts(barrel 现状)
|
||||
- packages-user/client-base/src/types.ts:1-32(`IClientBase.materials`,`autotile` 已删)
|
||||
- packages-user/client-modules/src/client.ts:1-136(`:14` / `:16` 未使用 import、`:50` `materials`、`:83-88` 构造点、`:93-96` `fallbackLoad` 接线、`:125` `new MapRenderer(this.materials)`)
|
||||
- packages-user/client-modules/src/types.ts:1-20 与 packages-user/client-modules/src/core.ts:1-11(`IClientCoreConfig` 必填字段与单例值)
|
||||
- packages-user/client-modules/src/render/map/renderer.ts:8-15,59-72,217,234,1243-1271,1638-1651(A/B/C 类:`BlockCls` import、`IAutotileProcessor` 属性、构造点、`useTileBackground` 的 `tex.cls` 与 `renderWithoutCheck` / `renderAnimated`、`addMovingBlock` 签名)
|
||||
- packages-user/client-modules/src/render/map/vertex.ts:24-30,440-479,510-528,537-582,846-880(A/B/C 类:`BlockCls` import、`renderWithoutCheck` 两处、`tile.cls` 三处、`cls` 解构)
|
||||
- packages-user/client-modules/src/render/map/extension/hero.ts:12-18,150-173,235-250,355-375,420-435(A/C 类:`BlockCls` import、`IMaterialFramedData` 构造、`getTile` 三处已适配点)
|
||||
- packages-user/client-modules/src/render/map/moving.ts:1-110(`IMaterialFramedData` 消费者;`cls` 字段不再存在的影响面)
|
||||
- packages-user/client-modules/src/render/map/types.ts:1-14,195-230,320-345,525-545(`IAutotileProcessor` / `ITextureManager` / `IMaterialFramedData` 接口面)
|
||||
- packages-user/client-modules/src/fallback/load.ts:1-137(E 类:向 `TextureManager` 添加素材的 9 处参数个数错误)
|
||||
- packages-user/client-base/src/load/loader.ts:1-30,53-60,123-160(E 类:加载本身;其 6 条错误属加载系统重构既有)
|
||||
- packages-user/client-base/package.json(依赖声明面,仅登记现状)
|
||||
- packages-user/entry-client/src/create.ts:1-42 与 packages-user/entry-data/src/mota.ts:1-40(`@user/client-base` 整体注册进 legacy 插件系统的面;`UserClientBase.create()` 调用已删)
|
||||
- src/types/declaration/{core.d.ts,enemy.d.ts,map.d.ts,status.d.ts}(E 类:legacy 声明与 `core.getBlockCls`,仅报告)
|
||||
- dev.md(「项目结构」单向依赖;「双端分离」)
|
||||
</read_first>
|
||||
<action>
|
||||
(1) **A 类补齐(符号改名与移除的引用点)**:按固定列序表逐条写满 —— ① `TextureManager`(新名)的消费者:`client-modules/src/client.ts:15`(import)、`:83`(构造点);② `MaterialManager`(旧名)在 `packages-user` 源码面的**引用点 0 处**,并给出核对命令 `git grep -n -c MaterialManager -- packages-user` 的原样输出(无输出即 0);③ `renderAnimatedWith`(旧名)**引用点 0 处**(已适配点为 `render/map/renderer.ts:1264` 的 `this.autotile.renderAnimated(tex, 0b1111_1111)`,须写清「旧名 0、新名 1」);④ `IMaterialFramedData.cls` → `tileType` 的消费者读写点:`render/map/extension/hero.ts:167`(对象字面量 `cls: BlockCls.Unknown`)、`render/map/renderer.ts:1252` / `:1263`(`tex.cls`)、`render/map/vertex.ts:517` / `:561` / `:852`(`tile.cls` 与 `const { cls, ... } = block.texture`),基准侧锚点统一引用 `packages-user/client-base/src/material/types.ts:75-86`(现行成员为 `texture` / `tileType` / `frames` / `offset` / `defaultFrame`);⑤ `BlockCls` 枚举被删除的消费者 import:`render/map/extension/hero.ts:15`、`render/map/renderer.ts:10`、`render/map/vertex.ts:27`,基准侧锚点 = `material/types.ts`(该文件现行导出集合不含 `BlockCls`);⑥ `AutotileProcessor` 构造点:`render/map/renderer.ts:234` 与 `client.ts:16`(未使用 import),基准侧锚点 = `material/autotile.ts:64`;⑦ `IClientBase.autotile` 删除的消费者面:`packages-user/client-base/src/types.ts`(现行仅 `materials`,锚点 `:18`)与 `client-modules/src/client.ts:14` / `:16`(两处 import 失去使用点);⑧ `ITextureManager.getIdentifierByAlias` / `getAliasByIdentifier` / `getBlockCls(ByAlias)` 的消费者**引用点 0 处**,各附 `git grep -n` 原样输出(无输出即 0);⑨ `material/index.ts` 的 `createMaterial()` 与 `client-base/src/index.ts` 的 `create()` 删除后的消费者:`entry-client/src/create.ts:26` 仍整体注册 `@user/client-base` 命名空间(该命名空间内 `create` 已不在),须写清「包内调用点 0(原调用点在 `entry-client/src/create.ts` 已随提交删除)」并附 `git grep -n -E "createMaterial|UserClientBase\.create" -- packages-user src` 的原样输出。**行内不得出现修复建议或替代写法**(替代是否成立属 F 类)。
|
||||
(2) **B 类补齐(成员与签名变化的调用点)**:逐条写 —— ① `ITextureManager` 新增 `readonly tiles: ITileStore`(基准 `material/types.ts:220`)、`readonly autotile: IAutotileProcessor`(`:222`)、`readonly tilesetReserve`(`:241`)、`readonly tilesetUnit`(`:246`)、`getFrameCount`(`:336`)的实现 / 传入点:`material/manager.ts:37-44,84-89`(用户自有面,只登记)与 `client-modules/src/client.ts:83-88`;② `IClientCoreConfig` 新增 `tilesetReserve` / `tilesetUnit` 两个必填字段(基准 `client-modules/src/types.ts:8-10`),传入点 `client-modules/src/core.ts:6-11`(`100000` / `5000`)与消费点 `client-modules/src/client.ts:62,86-87`;③ `addGrid`(基准 `material/types.ts:261-266`,现收 `ArrayLike<number>` + `width` + `height`)、`addRowAnimate`(`:275-280`,现收 `width`)、`addAutotile`(`:289-293`,现收 `identifier: number` + `type: AutotileType`)、`addTileset`(`:302-307`,现收 `cellWidth` + `cellHeight`)四个方法的调用点**全部落在** `client-modules/src/fallback/load.ts`(`:76,:77,:80,:81,:82,:83,:84,:95,:105`),须写明「按 D-39 / D-41 归 E 类只报告,不属第二步 AI 工作项」并交叉引用对应 E 行;④ `IAutotileProcessor.flatten`(基准 `:101-105`)消费者:`material/manager.ts:456`(用户自有面,只登记);`getFrameCount` 消费者 0 处(须给机器证据)。**每行须含基准侧声明 `file:line` + 命中侧调用 `file:line`。**
|
||||
(3) **C 类补齐(地图渲染消费者定位索引)**:逐条登记第二步将触及的定位点,每条给 `file:line` 并**交叉引用其 A / B / D 记录 ID**(本类不新增独立事实)——`render/map/renderer.ts`(`:10`、`:234`、`:1252`、`:1253`、`:1263`)、`render/map/vertex.ts`(`:27`、`:461`、`:517`、`:561`、`:852`、`:874`)、`render/map/extension/hero.ts`(`:15`、`:167`)、`render/map/moving.ts`(`:3`、`:31`、`:75`、`:103`:`IMaterialFramedData` 消费者,`cls` 字段不再存在的影响面)、`render/map/types.ts`(`:8-12`、`:204`、`:217`、`:329`、`:334`、`:536`)、`client-modules/src/client.ts`(`:14`、`:16`、`:83-88`、`:125`)、`client-modules/src/types.ts`(`:8-10`)、`client-modules/src/core.ts`(`:6-11`)。**C 行不得把 E 类(加载相关)或 `material/` 内(D 类的用户自有面)的定位点写成 AI 工作项**;C 行须显式注明「第二步是否纳入由用户据本文件裁定」。
|
||||
(4) **D 类补齐(被删且无替代·需用户反馈)**:逐条写「接口成员 / 命中处 / 基准侧锚点 / 现象 / 为什么认为无替代 / 请用户反馈的问题」——① `IAutotileProcessor.renderWithoutCheck`(原接口成员,现 `material/types.ts:148-151` 只有 `render(tile, connection)`):消费者 `render/map/renderer.ts:1253`、`render/map/vertex.ts:461`、`render/map/vertex.ts:874`(**3 处**;须写明 `vertex.ts:460` 附近既有注释表达了「使用不带检查的版本可以减少分支数量、提升性能」的意图,故不能仅凭签名判断 `render` 可等价承接);② `BlockCls` 枚举整体删除:消费者 3 处 import(A 类已登记)+ `material/utils.ts:2`(**用户自有面**,该文件 `getClsByString` / `getTextureFrame` 两个函数均带 `@deprecated` 标注并强依赖 `BlockCls`);③ `IAutotileProcessor.manager` 删除:基准 `material/types.ts:94-163` 无该成员,消费者引用点 0 处(须给机器证据);④ `IAutotileProcessor.render(autotile: number, connection)` 与 `renderWith(tile, connection)` 删除并合并入 `render(tile, connection)`:消费者引用点 0 处(须给机器证据);⑤ `ITextureManager.getIdentifierByAlias` / `getAliasByIdentifier` 删除:消费者引用点 0 处;⑥ `IClientBase.autotile` 删除:消费者 `client-modules/src/client.ts:14,16`(未使用 import)与 `MapRenderer` 自建 processor 的关系(交叉引用 F 类第 ④ 条);⑦ `createMaterial()` / `create()` 入口函数删除:包内调用点 0,但 `@user/client-base` 被整体注册进 legacy 插件系统(`entry-client/src/create.ts:26`),插件面是否仍调用须用户裁决(交叉引用 F 类第 ⑦ 条);⑧ `material/utils.ts` 的两处 `BlockCls` 依赖(用户自有面,与 ② 交叉引用)。**每条必须明写「接口已删、AI 未发现替代、请用户反馈」;不得自拟替代、不得写成「应改为 X」。**
|
||||
(5) **E 类补齐(加载相关与添加素材·仅报告)**:标题下明写 `**本节仅报告:D-39 / D-41 边界内的内容归用户自行适配新加载系统,本阶段不修改、不提修改方案。**` 逐条登记 —— ① `client-modules/src/fallback/load.ts` 的 9 条 TS2554(`:76` / `:77` `addGrid` 期望 4 参得 2 参;`:80` / `:81` / `:82` / `:83` / `:84` `addRowAnimate` 期望 4 参得 3 参;`:95` `addAutotile` 期望 3 参得 2 参;`:105` `addTileset` 期望 4 参得 2 参),并登记其 `extractClsBlocks`(`:9-29`)产出 `IBlockIdentifier[]` 而新 `addGrid` / `addRowAnimate` 收 `ArrayLike<number>` 的事实(是否属用户加载面进 F 类);② `packages-user/client-base/src/load/loader.ts` 的加载本身(`:25` / `:58` 使用 `ITextureManager`、`:77-78` `imageStore.addTexture` / `alias`、`:104` `addImage`、`:151` `core.material.images.autotile`、`:270-287` autotile 加载流程),并**明写其 6 条 TS2305(`:17`-`:21`、`:28`)属加载系统重构提交既有、与 `d36ea69` 无关**;③ 接线点 `client-modules/src/client.ts:93-96`(`loading.once('loaded', () => { fallbackLoad(this.materials); ... })`);④ `packages/` 的**对照扫描**结论与核对命令 `git grep -n -i -E "bigImage|BlockCls|IMaterialManager" -- packages` 的原样输出(规划日为空);⑤ `src/types/declaration/{core.d.ts:1286,enemy.d.ts:65,map.d.ts:354,map.d.ts:1006,map.d.ts:1443,status.d.ts:387-391,status.d.ts:602}` 的 legacy 声明(`bigImage` 字段与 `core.getBlockCls`,与渲染端 `ITextureManager` 无调用关系);⑥ `packages-user/client-base/package.json` 的依赖声明现状(只登记事实)。全节**不得**出现针对 `src/` 与 `packages/` 的修改性措辞。
|
||||
(6) **F 类(未能从阅读确定·未猜测)**:每条以 `- **#04-08-F-NN**:` 开头,写「现象 + 为什么读不出来 + 需要用户裁决的点」,至少覆盖 must_haves 列出的 8 个方向:① `renderWithoutCheck` 的语义与性能意图能否由新 `render(tile, connection)` 等价承接;② `BlockCls` 删除后消费者应改用 `TileType`(`@user/data-common`)还是 `AutotileType`,以及「自动元件」在 `TileType` 中的取值;③ `hero.ts:167` 构造 `IMaterialFramedData` 时 `tileType` 应填何值(勇士贴图不是地图图块),以及该点是否落入 D-18 的 `HeroRendering` 暂不处理边界;④ `MapRenderer` 自建的 `new AutotileProcessor(manager, manager.state)`(`renderer.ts:234`)与新增的 `ITextureManager.autotile`(基准 `material/types.ts:222`)是否重复、第二步应复用还是保留自建(并交叉引用 D 类第 ⑥ 条);⑤ `ITextureManager.textures` / `tileStore` / `tiles`(`ITileStore`)三者的职责边界与地图背景取值应走哪一个;⑥ `textures` 的写入侧(04-07 已记录「本次范围内无写入者」)归属哪一步;⑦ 删除 `create()` / `createMaterial()` 是否破坏 legacy 插件面(`Mota.register('@user/client-base', UserClientBase)`);⑧ `fallback/load.ts` 的 `IBlockIdentifier[]` → `ArrayLike<number>` 转换是否属用户加载面(D-41)。**不得**把本节任何一条写成错配、缺失或残留。
|
||||
(7) **重型整文件读取可按 D-09 委派只读子代理**(`material/types.ts`、`material/manager.ts`、`material/autotile.ts`、`material/utils.ts`、`client.ts`、`renderer.ts`、`vertex.ts`、`hero.ts`、`fallback/load.ts`):子代理只回传事实表(每行:符号 / 成员名 + 所属 `file:line` + 形态或签名),**不得写文件、不得贴大段源码**;主执行者按 `file:line` 切片复核后落笔。
|
||||
(8) **只修改该交付文档**;不得改动任何生产源码、不得新增计划文件、不得修改 Task 1 已定稿的数字与结构。
|
||||
</action>
|
||||
<!-- plan-criteria-allow: R4 - `|` 位于 grep -E 双引号内的选择分支中,不是 shell 管道;该命令由 node 捕获输出与 status 并自行判定 -->
|
||||
<verify>
|
||||
<automated>node -e "const fs=require('fs');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const seg=h=>{const i=t.indexOf(h);if(i<0)return '';const rest=t.slice(i+h.length);const j=rest.search(/\r?\n## /);return j<0?rest:rest.slice(0,j)};const A=seg('## A \u7b26\u53f7\u6539\u540d'),B=seg('## B \u6210\u5458\u4e0e\u7b7e\u540d'),C=seg('## C \u5730\u56fe\u6e32\u67d3\u6d88\u8d39\u8005'),D=seg('## D \u88ab\u5220\u4e14\u65e0\u66ff\u4ee3'),E=seg('## E \u52a0\u8f7d\u76f8\u5173'),F=seg('## F \u672a\u80fd\u4ece\u9605\u8bfb\u786e\u5b9a');const cnt=(s,re)=>(s.match(re)||[]).length;const rows=s=>cnt(s,/^\|\s*#04-08-[ABCDE]-\d+\s*\|/gm);const anch=l=>cnt(l,/[A-Za-z0-9_\-.\/]+\.tsx?:\d+/g);const p=[];if(!A||!B||!C||!D||!E||!F)p.push('MISSING SECTION');if(rows(A)<5)p.push('A ROWS '+rows(A));if(rows(B)<4)p.push('B ROWS '+rows(B));if(rows(C)<8)p.push('C ROWS '+rows(C));if(rows(D)<6)p.push('D ROWS '+rows(D));if(rows(E)<4)p.push('E ROWS '+rows(E));if(cnt(F,/^- \*\*#04-08-F-\d+/gm)<8)p.push('F ITEMS '+cnt(F,/^- \*\*#04-08-F-\d+/gm));for(const pr of [['A',A],['B',B],['C',C],['D',D],['E',E]]){const bad=pr[1].split(/\r?\n/).filter(l=>/^\|\s*#04-08-[ABCDE]-\d+\s*\|/.test(l)).filter(l=>anch(l)<2);if(bad.length>0)p.push(pr[0]+' ROWS WITHOUT TWO-SIDED ANCHOR '+bad.length)}const needA=['TextureManager','MaterialManager','renderAnimatedWith','BlockCls','tileType','AutotileProcessor','IClientBase','getIdentifierByAlias','getAliasByIdentifier','createMaterial'];const mA=needA.filter(k=>A.indexOf(k)<0);if(mA.length>0)p.push('A MISSING '+mA.join('|'));const needB=['tiles','autotile','tilesetReserve','tilesetUnit','getFrameCount','addGrid','addRowAnimate','addAutotile','addTileset','AutotileType','IClientCoreConfig'];const mB=needB.filter(k=>B.indexOf(k)<0);if(mB.length>0)p.push('B MISSING '+mB.join('|'));const needC=['renderer.ts','vertex.ts','hero.ts','moving.ts','client.ts','types.ts','core.ts','#04-08-'];const mC=needC.filter(k=>C.indexOf(k)<0);if(mC.length>0)p.push('C MISSING '+mC.join('|'));const needD=['renderWithoutCheck','BlockCls','manager','renderWith','getIdentifierByAlias','getAliasByIdentifier','utils.ts'];const mD=needD.filter(k=>D.indexOf(k)<0);if(mD.length>0)p.push('D MISSING '+mD.join('|'));if(cnt(D,/\u8bf7\u7528\u6237\u53cd\u9988/g)<6)p.push('D FEEDBACK PHRASE '+cnt(D,/\u8bf7\u7528\u6237\u53cd\u9988/g));const needE=['fallback/load.ts','loader.ts','packages','src/types/declaration'];const mE=needE.filter(k=>E.indexOf(k)<0);if(mE.length>0)p.push('E MISSING '+mE.join('|'));if(p.length>0){console.error('CATEGORY GATE FAILED :: '+p.join(' ;; '));process.exit(1)}console.log('OK categories A'+rows(A)+' B'+rows(B)+' C'+rows(C)+' D'+rows(D)+' E'+rows(E)+' F'+cnt(F,/^- \*\*#04-08-F-\d+/gm))"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "CATEGORY GATE FAILED"(A/B/C/D/E 任一类行数低于下限、任一行缺命中处或基准侧锚点、A 未覆盖符号级关键词、B 未覆盖新增成员与签名、C 未覆盖 8 个定位文件或未交叉引用 ID、D 未覆盖关键被删成员或缺「请用户反馈」措辞、E 未覆盖加载文件与对照扫描、F 少于 8 条)</fails_when>
|
||||
<automated>node -e "const{execSync}=require('child_process');const names=['MaterialManager','renderAnimatedWith','getBlockClsByAlias','getIdentifierByAlias','getAliasByIdentifier'];const bad=[];for(const n of names){let o='',st=0;try{o=execSync('git grep -n -- '+n+' -- packages-user',{encoding:'utf8',stdio:['ignore','pipe','pipe']})}catch(e){o=(e.stdout||'')+(e.stderr||'');st=e.status}const lines=o.replace(/\s+$/,'').length>0?o.replace(/\s+$/,'').split(/\r?\n/):[];if(lines.length>0){bad.push(n+' => '+lines.slice(0,3).join(' ; '))}else if(st!==0&&st!==1){bad.push(n+' grep status '+st)}}if(bad.length>0){console.error('STALE SYMBOL STILL REFERENCED: '+bad.join(' || '));process.exit(1)}console.log('OK zero stale symbol references ('+names.length+' names)')"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "STALE SYMBOL STILL REFERENCED"(`MaterialManager` / `renderAnimatedWith` / `getBlockClsByAlias` / `getIdentifierByAlias` / `getAliasByIdentifier` 在 `packages-user` 源码面仍存在引用,即 A 类的「0 引用」结论为臆造)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const s=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const lf=(s.match(/\n/g)||[]).length;const crlf=(s.match(/\r\n/g)||[]).length;if(lf!==crlf){console.error('NON-CRLF LINE ENDINGS '+(lf-crlf));process.exit(1)}console.log('OK CRLF lines '+crlf)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "NON-CRLF LINE ENDINGS"(追加内容未保持 CRLF)</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- A 类 **≥ 5 行**,覆盖 `TextureManager`(新名)与 `MaterialManager` / `renderAnimatedWith` / `getIdentifierByAlias` / `getAliasByIdentifier` / `getBlockClsByAlias` 的「0 引用」机器证据、`BlockCls` 3 处 import、`cls` 6 处读写、`AutotileProcessor` 构造点、`IClientBase.autotile` 与 `create()` / `createMaterial()` 的消费者面;行内无修复建议
|
||||
- B 类 **≥ 4 行**,覆盖 `ITextureManager` 新增 `tiles` / `autotile` / `tilesetReserve` / `tilesetUnit` / `getFrameCount`、`IClientCoreConfig` 新增两个必填字段、四个 `add*` 方法的调用点(并注明归 E 类只报告);每行含基准侧声明与命中侧调用两个锚点
|
||||
- C 类 **≥ 8 行**,覆盖 `render/map/renderer.ts` / `render/map/vertex.ts` / `render/map/extension/hero.ts` / `render/map/moving.ts` / `render/map/types.ts` / `client-modules/src/client.ts` / `client-modules/src/types.ts` / `client-modules/src/core.ts`,每条带 `file:line` 并交叉引用其 A / B / D 记录 ID;未把 E 类或 `material/` 内命中写成 AI 工作项
|
||||
- D 类 **≥ 6 行**,逐条覆盖 `renderWithoutCheck`(含 3 处调用点与性能意图说明)、`BlockCls`、`IAutotileProcessor.manager`、`renderWith`、`getIdentifierByAlias` / `getAliasByIdentifier`、`IClientBase.autotile`、`createMaterial()` / `create()`、`material/utils.ts` 的用户自有面;多条含「请用户反馈」措辞;**无任何自拟替代或「应改为 X」**
|
||||
- E 类 **≥ 4 行**,覆盖 `fallback/load.ts`(9 条 TS2554 逐一列出)、`client-base/src/load/loader.ts`(并注明其 6 条错误属加载系统重构既有、与 `d36ea69` 无关)、`client.ts:93-96` 接线、`packages/` 零命中(附命令与结论)、`src/types/declaration/*` legacy 声明;节内明写「仅报告,不修改、不提建议」
|
||||
- F 类 **≥ 8 条** `#04-08-F-*` 未确定项,覆盖 8 个既定方向,且均未写成错配 / 缺失 / 残留
|
||||
- 所有 A–E 行至少含命中处与基准侧两个 `file:line` 锚点;相对记录在 `## 方法` 的只读起始基线零变化;未修改任何生产源码;全文 CRLF
|
||||
</acceptance_criteria>
|
||||
<done>A–F 六类横向补齐:符号级引用点与旧名零命中机器证据、签名级调用点、地图渲染定位索引(交叉引用)、被删且无替代逐条反馈、加载与添加素材仅报告、未确定项只登记;类别行数 / 双锚点 / 关键词 / 符号零命中 / CRLF 门禁转绿</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 3:`## 处置` 定稿 + 只读/类型/类别/符号零命中/既有计划保护与计划范围/CRLF 六道门禁 + 人工复核 + `04-08-SUMMARY.md` 落盘与提交</name>
|
||||
<files>.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md, .planning/phases/04-render-adaptation/04-08-SUMMARY.md</files>
|
||||
<read_first>
|
||||
- .planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md(Task 1/2 产出,做定稿而非重写)
|
||||
- .planning/phases/04-render-adaptation/04-CONTEXT.md(D-38..D-42;Deferred Ideas)
|
||||
- .planning/phases/04-render-adaptation/04-07-SUMMARY.md:1-50,130-200(既有 SUMMARY 的元信息块、「执行前核对」「门禁输出摘要」「人工复核」「运行时 UAT 不可得声明」的写法,可对齐版式)
|
||||
- .planning/phases/04-render-adaptation/04-MATERIAL-INTERFACE-IMPACT.md:250-261(既有清点文档的 `## 处置` 写法)
|
||||
- .planning/phases/04-render-adaptation/04-08-PLAN.md(本计划:门禁与禁令)
|
||||
- dev.md(「其他要求」的 CRLF 要求;「双端分离」)
|
||||
</read_first>
|
||||
<action>
|
||||
(1) **`## 处置` 定稿**:明写 —— 本文件是 TextureManager 新接口适应(D-38 / D-40)**第一步(只读清点)**的交付物;本步**未修改任何生产代码**、`files_modified` 仅本文件;相对 `## 方法` 记录的只读起始基线零变化;**第二步(TextureManager 新接口适应实施)未规划**,待用户审阅本文件后另行规划(D-40);范围限 `packages-user` 消费者面,`packages/` 与 `src/` 仅报告(D-33 沿用);A / B / C / D / E / F 六类中:**A / B 是事实层、C 是定位索引(第二步的候选工作集,最终由用户裁定)**,**D 类须用户反馈后才可能进入第二步**,**E 类归用户自行适配新加载系统(D-39 / D-41)**,**`material/` 内命中归用户(D-42)**,F 类须用户裁决;`tileType` 应填何值、`renderWithoutCheck` 的替代、自建 `AutotileProcessor` 是否复用一律由用户裁决(不得由 AI 裁定);`core.*` legacy 适配(D-12)与移动控制(D-19)、跟随者(D-22)、`HeroRendering` 语义(D-18)不属本步;`REND-01` / `REND-02` 保持 Pending;若当日实测数值与规划日(202 / 23)不同,在本节说明差异与原因。
|
||||
|
||||
(2) **运行六道门禁并按实测结果如实记录**:① 只读门禁(`git status --porcelain -- packages packages-user src` 与 `## 方法` 记录逐条一致);② 类型门禁一致性(重跑 `node -e "const{execSync}=require('child_process');let o='';try{o=execSync('pnpm exec vue-tsc --noEmit',{encoding:'utf8',maxBuffer:1<<28,stdio:['ignore','pipe','pipe']})}catch(e){o=(e.stdout||'')+(e.stderr||'')}console.log((o.match(/error TS\d+/g)||[]).length)"`,输出必须等于文档记录的**错误总行数**);③ 类别门禁(A ≥ 5 / B ≥ 4 / C ≥ 8 / D ≥ 6 / E ≥ 4 / F ≥ 8、每行双锚点、A 的符号关键词、B 的新成员关键词、C 的 8 个定位文件与交叉引用 ID、D 的「请用户反馈」措辞、E 的加载文件与对照扫描);④ 符号零命中复验(`MaterialManager` / `renderAnimatedWith` / `getBlockClsByAlias` / `getIdentifierByAlias` / `getAliasByIdentifier` 在 `packages-user` 源码面仍为 0);⑤ 既有计划保护 + 计划范围门禁(`04-01`..`04-07` 的 `*-PLAN.md` / `*-SUMMARY.md` 的 porcelain 为空;phase 目录内 `-PLAN.md` 仅允许 `04-01`..`04-08`;`04-08-SUMMARY.md` 已落盘);⑥ CRLF 门禁。任一门禁失败即停下修正文档后重跑,**不得**改门禁口径或伪造通过。
|
||||
|
||||
(3) **人工代码复核(不可自动化,如实记录结论)**:抽查 A 类中 `renderer.ts:10` / `hero.ts:15` / `vertex.ts:27` 三处 `BlockCls` import、`hero.ts:167` 的 `IMaterialFramedData` 对象字面量、`vertex.ts:852` 的 `cls` 解构、D 类中 `renderWithoutCheck` 的三处调用(`renderer.ts:1253`、`vertex.ts:461`、`vertex.ts:874`)与 `material/utils.ts:2` 的用户自有面命中、E 类中 `fallback/load.ts` 的 9 处参数个数错误,逐条打开当日源码确认「命中处锚点指向的确实是该符号 / 成员的引用」「基准侧锚点指向的确实是该接口的现行声明行」,并把复核结论(通过 / 发现偏差及修正)写入 SUMMARY。发现偏差即回到文档修正。
|
||||
|
||||
(4) **写 `04-08-SUMMARY.md`**:按执行日实际结果写(元信息块:phase / plan / subsystem / tags / requires / provides / affects / tech-stack / key-files / key-decisions / actuals / metrics),并逐条记录:本 run 的实际产出(唯一交付文档 + 本 PLAN + 本 SUMMARY)、A–F 六类的实际行数与关键结论(旧名 0 引用、`BlockCls` 消费者 3 处 import、`renderWithoutCheck` 3 处调用点无替代、E 类 9 条参数个数错误归用户)、`git status --porcelain -- packages packages-user src` 与 `pnpm exec vue-tsc --noEmit` 的当日实测值(与规划日差异须说明)、六道门禁的实际结果、人工复核结论、与规划日数值的差异说明、以及 `REND-01` / `REND-02` 仍为 Pending 的声明与「第二步未规划」。**不得**把未运行的检查写成通过;**不得**把任何被删接口的替代方案写进 SUMMARY(替代由用户裁决)。
|
||||
|
||||
(5) **提交**:以 `docs(04-08): TextureManager 新接口影响范围清点(只读,D-38/D-40 第一步)` 提交**仅** `.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md`、`.planning/phases/04-render-adaptation/04-08-PLAN.md` 与 `.planning/phases/04-render-adaptation/04-08-SUMMARY.md` 三个文件;**不得**把任何生产源码改动或用户既有的未提交改动纳入本次提交(尤其不得提交 `.planning/phases/04-render-adaptation/04-CONTEXT.md` 的既有未提交改动),不得改写 / 覆盖 / 改号 `04-01`..`04-07` 的既有产物。
|
||||
</action>
|
||||
<verify>
|
||||
<automated>node -e "const fs=require('fs'),{execSync}=require('child_process');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const seg=h=>{const i=t.indexOf(h);if(i<0)return '';const rest=t.slice(i+h.length);const j=rest.search(/\r?\n## /);return j<0?rest:rest.slice(0,j)};const ms=seg('## \u65b9\u6cd5');if(ms.indexOf('\u53ea\u8bfb\u8d77\u59cb\u57fa\u7ebf')<0){console.error('READONLY BASELINE NOT RECORDED');process.exit(1)}const rec=(ms.match(/^[ MARCUD?!]{2} (?:packages|packages-user|src)[^\r\n]*/gm)||[]).map(s=>s.replace(/\s+$/,''));let raw='';try{raw=execSync('git status --porcelain -- packages packages-user src',{encoding:'utf8'})}catch(e){console.error('GIT STATUS FAILED '+(e.message||''));process.exit(1)}const out=raw.replace(/\s+$/,'');const cur=out.length>0?out.split(/\r?\n/).map(s=>s.replace(/\s+$/,'')):[];const extra=cur.filter(l=>rec.indexOf(l)<0);const gone=rec.filter(l=>cur.indexOf(l)<0);if(extra.length+gone.length>0){console.error('READONLY BASELINE CHANGED extra=['+extra.join(' ; ')+'] missing=['+gone.join(' ; ')+']');process.exit(1)}console.log('OK read-only unchanged entries '+cur.length)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "READONLY BASELINE NOT RECORDED" / "READONLY BASELINE CHANGED"(`packages` / `packages-user` / `src` 下出现了新增 / 消失 / 状态码变化的 worktree 条目 —— 违反只读约束;用户既有改动不得回滚 / 暂存 / 提交)</fails_when>
|
||||
<automated>node -e "const fs=require('fs'),{execSync}=require('child_process');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const a=t.match(/\u9519\u8bef\u603b\u884c\u6570\uff1a\s*(\d+)/);const b=t.match(/texture \u5f52\u5c5e\u9519\u8bef\u884c\u6570\uff1a\s*(\d+)/);if(!a||!b){console.error('MISSING TSC BASELINE FIGURES');process.exit(1)}let o='';try{o=execSync('pnpm exec vue-tsc --noEmit',{encoding:'utf8',maxBuffer:1<<28,stdio:['ignore','pipe','pipe']})}catch(e){o=(e.stdout||'')+(e.stderr||'')}const n=(o.match(/error TS\d+/g)||[]).length;if(String(n)!==a[1]){console.error('TSC TOTAL CHANGED '+n+' vs '+a[1]);process.exit(1)}console.log('OK tsc total unchanged '+n+' texture '+b[1])"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "MISSING TSC BASELINE FIGURES" / "TSC TOTAL CHANGED"(类型错误总行数与文档记录不一致 —— 生产源码被改动或基线未如实记录;后者使只读证明失效)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const seg=h=>{const i=t.indexOf(h);if(i<0)return '';const rest=t.slice(i+h.length);const j=rest.search(/\r?\n## /);return j<0?rest:rest.slice(0,j)};const A=seg('## A \u7b26\u53f7\u6539\u540d'),B=seg('## B \u6210\u5458\u4e0e\u7b7e\u540d'),C=seg('## C \u5730\u56fe\u6e32\u67d3\u6d88\u8d39\u8005'),D=seg('## D \u88ab\u5220\u4e14\u65e0\u66ff\u4ee3'),E=seg('## E \u52a0\u8f7d\u76f8\u5173'),F=seg('## F \u672a\u80fd\u4ece\u9605\u8bfb\u786e\u5b9a'),Z=seg('## \u5904\u7f6e');const cnt=(s,re)=>(s.match(re)||[]).length;const rows=s=>cnt(s,/^\|\s*#04-08-[ABCDE]-\d+\s*\|/gm);const anch=l=>cnt(l,/[A-Za-z0-9_\-.\/]+\.tsx?:\d+/g);const p=[];if(!Z)p.push('MISSING DISPOSITION');if(rows(A)<5)p.push('A ROWS '+rows(A));if(rows(B)<4)p.push('B ROWS '+rows(B));if(rows(C)<8)p.push('C ROWS '+rows(C));if(rows(D)<6)p.push('D ROWS '+rows(D));if(rows(E)<4)p.push('E ROWS '+rows(E));if(cnt(F,/^- \*\*#04-08-F-\d+/gm)<8)p.push('F ITEMS '+cnt(F,/^- \*\*#04-08-F-\d+/gm));for(const pr of [['A',A],['B',B],['C',C],['D',D],['E',E]]){const bad=pr[1].split(/\r?\n/).filter(l=>/^\|\s*#04-08-[ABCDE]-\d+\s*\|/.test(l)).filter(l=>anch(l)<2);if(bad.length>0)p.push(pr[0]+' ROWS WITHOUT TWO-SIDED ANCHOR '+bad.length)}const needD=['renderWithoutCheck','BlockCls','utils.ts'];const mD=needD.filter(k=>D.indexOf(k)<0);if(mD.length>0)p.push('D MISSING '+mD.join('|'));if(cnt(D,/\u8bf7\u7528\u6237\u53cd\u9988/g)<6)p.push('D FEEDBACK PHRASE');if(cnt(E,/\u4ec5\u62a5\u544a/g)<1)p.push('E REPORT-ONLY PHRASE');if(p.length>0){console.error('CATEGORY GATE FAILED :: '+p.join(' ;; '));process.exit(1)}console.log('OK final categories A'+rows(A)+' B'+rows(B)+' C'+rows(C)+' D'+rows(D)+' E'+rows(E)+' F'+cnt(F,/^- \*\*#04-08-F-\d+/gm))"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "CATEGORY GATE FAILED"(A/B/C/D/E 行数低于下限、任一行缺命中处或基准侧锚点、D 未覆盖关键被删成员或缺「请用户反馈」措辞、E 缺「仅报告」措辞、F 少于 8 条、缺 `## 处置`)</fails_when>
|
||||
<automated>node -e "const{execSync}=require('child_process');const names=['MaterialManager','renderAnimatedWith','getBlockClsByAlias','getIdentifierByAlias','getAliasByIdentifier'];const bad=[];for(const n of names){let o='',st=0;try{o=execSync('git grep -n -- '+n+' -- packages-user',{encoding:'utf8',stdio:['ignore','pipe','pipe']})}catch(e){o=(e.stdout||'')+(e.stderr||'');st=e.status}const lines=o.replace(/\s+$/,'').length>0?o.replace(/\s+$/,'').split(/\r?\n/):[];if(lines.length>0){bad.push(n+' => '+lines.slice(0,3).join(' ; '))}else if(st!==0&&st!==1){bad.push(n+' grep status '+st)}}if(bad.length>0){console.error('STALE SYMBOL STILL REFERENCED: '+bad.join(' || '));process.exit(1)}console.log('OK zero stale symbol references')"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "STALE SYMBOL STILL REFERENCED"(A 类的「0 引用」结论为臆造)</fails_when>
|
||||
<automated>node -e "const fs=require('fs'),{execSync}=require('child_process');const dir='.planning/phases/04-render-adaptation';const prot=['04-01','04-02','04-03','04-04','04-05','04-06','04-07'].map(n=>dir+'/'+n+'-PLAN.md').concat(['04-01','04-02','04-03','04-04','04-05','04-06','04-07'].map(n=>dir+'/'+n+'-SUMMARY.md'));const args=prot.map(p=>'\"'+p+'\"').join(' ');const o=execSync('git status --porcelain -- '+args,{encoding:'utf8'}).replace(/\s+$/,'');if(o.length>0){console.error('EXISTING 04-01..04-07 ARTIFACTS MODIFIED: '+o);process.exit(1)}const plans=fs.readdirSync(dir).filter(f=>/-PLAN\.md$/.test(f)).sort();const extra=plans.filter(p=>!/^04-0[1-8]-PLAN\.md$/.test(p));if(extra.length>0){console.error('UNEXPECTED PLAN FILES '+extra.join(','));process.exit(1)}if(plans.length!==8){console.error('PLAN COUNT '+plans.length+' expected 8');process.exit(1)}if(!fs.readdirSync(dir).some(f=>f==='04-08-SUMMARY.md')){console.error('MISSING 04-08 SUMMARY');process.exit(1)}console.log('OK 04-01..04-07 untouched; plans '+plans.join(','))"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "EXISTING 04-01..04-07 ARTIFACTS MODIFIED" / "UNEXPECTED PLAN FILES" / "PLAN COUNT" / "MISSING 04-08 SUMMARY"(既有前序增量产物被改写,或出现了未授权的 `04-09+` 计划文件——即提前规划了第二步,或 `04-08-SUMMARY.md` 未落盘)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const s=fs.readFileSync('.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md','utf8');const lf=(s.match(/\n/g)||[]).length;const crlf=(s.match(/\r\n/g)||[]).length;if(lf!==crlf){console.error('NON-CRLF LINE ENDINGS '+(lf-crlf));process.exit(1)}console.log('OK CRLF lines '+crlf)"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "NON-CRLF LINE ENDINGS"(交付文档出现非 CRLF 换行)</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- `## 处置` 定稿,明写:本步只读、生产代码零改动、唯一交付物、相对只读起始基线零变化、**第二步未规划**(D-40)、范围限 `packages-user` 消费者面(`packages/` 与 `src/` 仅报告)、**D 类须用户反馈后才可能进入第二步**、**E 类归用户自行适配新加载系统(D-39 / D-41)**、**`material/` 内命中归用户(D-42)**、`tileType` / `renderWithoutCheck` 替代 / 自建 processor 由用户裁决、D-12 / D-18 / D-19 / D-22 边界、`REND-01` / `REND-02` 保持 Pending,并(如与规划日不同)说明实测差异
|
||||
- 六道门禁全部转绿:只读门禁(porcelain 逐条一致)、类型门禁一致性(错误总行数等于记录值)、类别门禁(A ≥ 5 / B ≥ 4 / C ≥ 8 / D ≥ 6 / E ≥ 4 / F ≥ 8 且每行双锚点与关键词齐备)、符号零命中复验、既有计划保护 + 计划范围门禁(`04-01..04-07-*` 未被改写、无 `04-09+`、`04-08-SUMMARY.md` 已落盘)、CRLF 门禁
|
||||
- 人工代码复核结论已记录(抽查 A 类 3 处 `BlockCls` import 与 `hero.ts:167` / `vertex.ts:852`、D 类 3 处 `renderWithoutCheck` 与 `material/utils.ts:2`、E 类 `fallback/load.ts` 9 处),偏差均已修正
|
||||
- `04-08-SUMMARY.md` 已产出,如实记录当日实测值(porcelain / 类型错误数)、A–F 实际行数与关键结论、六道门禁结果、人工复核结论、与规划日的差异说明、`REND-01` / `REND-02` 仍 Pending 与「第二步未规划」;**未写入任何被删接口的替代方案**
|
||||
- 提交仅含 `04-TEXTURE-INTERFACE-IMPACT.md`、`04-08-PLAN.md`、`04-08-SUMMARY.md` 三个文件;未纳入任何生产源码改动,未提交 `04-CONTEXT.md` 的既有未提交改动,未改写 `04-01..04-07-*`
|
||||
</acceptance_criteria>
|
||||
<done>TextureManager 新接口影响台账定稿并交付:六道门禁全绿、既有前序产物零改写、`04-08-SUMMARY.md` 落盘并提交;用户可据此审阅 A / B / C 三类定位与事实、D 类待反馈项、E 类自有面,并裁定第二步的修复范围</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<threat_model>
|
||||
## Trust Boundaries
|
||||
|
||||
| Boundary | Description |
|
||||
|----------|-------------|
|
||||
| 生产源码 → 清点文档 | 只读引用 `packages-user` / `packages` / `src` 的代码与行号;不得产生任何写回(`packages` / `packages-user` / `src` 的 porcelain 必须零变化) |
|
||||
| 类型检查结果 → 清点文档 | `pnpm exec vue-tsc --noEmit` 的输出被用作只读证据;记录值与重跑值必须一致,否则只读证明失效 |
|
||||
| 基准(`material/types.ts` 等)→ A–E 分类 | 基准决定「什么算改名 / 被删 / 签名收紧」;基准读错会整类错分 |
|
||||
| 用户自有面(`client-base/src/material/`)→ AI 工作范围(D-42) | 该文件夹已由用户重构完毕;若把其内部命中写成 AI 待改项,即越权改动用户代码 |
|
||||
| 「加载相关」(D-39 / D-41)→ AI 工作范围 | 加载本身与向 `TextureManager` 添加素材的内容归用户自行适配;若被写成 AI 待改项,即越权 |
|
||||
| 实现残留 / 类型错误 → 接口设计结论 | 把「编译器报错」当作「接口该怎么改」的结论会替用户设计公共接口(AGENTS.md 禁止) |
|
||||
| 执行者 / 子代理 → 执行前置关卡 | AGENTS.md 要求第一个 block 点先汇报并等待用户回复「可以执行」;`yolo` / `auto_advance` 或子代理派发都不是放行理由(Task 0 为 `blocking-human`、`autonomous: false`) |
|
||||
| 既有 04-01..04-07 产物 → 本次编号 | phase 目录内已有 7 个已执行增量的计划与 SUMMARY;改号/覆盖会破坏既有执行记录 |
|
||||
| 清点范围 → Phase 5 / 后续增量 | 把 `src/` / `packages/` 命中或 `core.*` legacy 清退写成本阶段待办会扩大范围(D-12 / D-33) |
|
||||
| 清点文档 → 第二步规划 | 第二步计划由用户审阅本文件后另行规划(D-40);文档若夹带修复方案即越权替用户设计 |
|
||||
|
||||
## STRIDE Threat Register
|
||||
|
||||
| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
|
||||
|-----------|----------|-----------|----------|-------------|-----------------|
|
||||
| T-04-08-01 | Tampering | 生产源码 `packages-user` / `packages` / `src` | high | mitigate | Task 1 步骤 (0a) 记录 `git status --porcelain -- packages packages-user src` 的逐行基线(规划日为集合空);Task 1 / Task 3 门禁断言其后逐条一致;Task 3 另以 `pnpm exec vue-tsc --noEmit` 错误总行数等于记录值作为第二重只读证明;`files_modified` 仅含交付文档;prohibitions 明列生产文件零改动、不得触碰用户 committed 的 `material/**` 与 `client-base/src/types.ts` |
|
||||
| T-04-08-02 | Elevation of Privilege | 执行前置关卡(AGENTS.md 要求的第一处 block 点) | high | mitigate | Task 0 为 `checkpoint:decision` + `gate="blocking-human"` 且本计划 `autonomous: false`;Task 0 的 action ⑨/⑩ 与 acceptance_criteria 明示未收到用户「可以执行」四个字即必须停止、不派发执行子代理;`yolo` / `workflow.auto_advance` 不得自动放行 |
|
||||
| T-04-08-03 | Tampering | 用户自有面 `packages-user/client-base/src/material/`(D-42) | high | mitigate | `## D` 类对 `material/utils.ts:2` 只登记并标注「用户自有面」;prohibitions 明列不得在 `material/` 内规划任何修改;Task 2 步骤 (1) 要求 `material/` 内命中一律归 D 类、不得写成 AI 工作项 |
|
||||
| T-04-08-04 | Tampering | 「加载相关」范围(D-39 / D-41) | high | mitigate | `## E` 节标题下明写「仅报告、不修改、不提修改方案」;B 类四个 `add*` 调用点交叉引用 E 行并注明归用户;Task 3 类别门禁要求 E 节含「仅报告」措辞;prohibitions 明列不得为加载面提出修改方案 |
|
||||
| T-04-08-05 | Spoofing | A / B / C / D / E 分类 | high | mitigate | 分列规则写死(A 符号级、B 签名级、C 定位索引并交叉引用、D 被删无替代须反馈、E 加载与添加素材、F 未确定);每行强制两侧 `file:line` 锚点;C 行必须携带交叉引用 ID;D 行必须含「请用户反馈」措辞;门禁机器判定行数下限、关键词、双锚点与措辞计数 |
|
||||
| T-04-08-06 | Spoofing | A 类「旧名 0 引用」结论 | high | mitigate | 不以文档自述为准:Task 2 / Task 3 门禁直接运行 `git grep -n -- <name> -- packages-user`(5 个符号逐一),非零输出即失败;`.planning/graphs/*` 的过期标签单列为工装态并声明不计入源码命中 |
|
||||
| T-04-08-07 | Repudiation | A–E 各行条目不可追溯 | medium | mitigate | 固定列序(`ID | 符号/成员名 | 命中处 | 基准侧锚点 | 问题描述 | 影响 | 置信`)+ 每行 ≥2 个 `file:line` 锚点 + 行数下限 + 关键词齐备,由 Task 2 / Task 3 门禁机器判定 |
|
||||
| T-04-08-08 | Elevation of Privilege | 清点范围(`src/` / `packages/` / `core.*` legacy 清退 / 第二步实施) | medium | mitigate | D-12 / D-33 / D-40 为显式边界:E 类标题下明写「仅报告,不修改、不提建议」;prohibitions 禁止为 `src/` / `packages/` 与 `render/elements/cache.ts` 提修改建议;Task 3 门禁禁止出现 `04-09+` 计划文件与前序产物改写 |
|
||||
| T-04-08-09 | Denial of Service | 只读子代理越权写入(D-09) | low | mitigate | Task 2 步骤 (7) 明确子代理仅回传事实表、不得写文件、不得贴大段源码;最终由主执行者以只读门禁 + 类型门禁一致 + 类别门禁统一验证 |
|
||||
| T-04-08-10 | Information Disclosure | 清点文档引用的源码行与接口名 | low | accept | 记录只含符号名、文件行号、成员签名与编译错误摘要,不含凭据 / 密钥 / 个人数据 |
|
||||
| T-04-08-SC | Tampering | npm / pip / cargo 安装面 | high | mitigate | 本计划不新增依赖、不安装任何包(prohibitions);若出现安装需求即暂停并告知用户;门禁以 porcelain 基线覆盖 `package.json` / `pnpm-lock.yaml`(本计划零改动),无需包合法性核对 |
|
||||
</threat_model>
|
||||
|
||||
<verification>
|
||||
- **只读门禁**:`node -e "const{execSync}=require('child_process');console.log(JSON.stringify(execSync('git status --porcelain -- packages packages-user src',{encoding:'utf8'})))"` 的输出与交付文档 `## 方法` 的「只读起始基线」条目逐条一致(不新增、不消失、状态码不变)。
|
||||
- **类型门禁一致性**:`node -e "const{execSync}=require('child_process');let o='';try{o=execSync('pnpm exec vue-tsc --noEmit',{encoding:'utf8',maxBuffer:1<<28,stdio:['ignore','pipe','pipe']})}catch(e){o=(e.stdout||'')+(e.stderr||'')}console.log((o.match(/error TS\d+/g)||[]).length)"` 的输出等于文档记录的「错误总行数」(规划日 202);「texture 归属错误行数」(规划日 23 = `client-base` 1 + `client-modules` 22)为规划日人工归类、执行日按当日实测重新归类,只要求文档逐行列出(**非机器断言**,由人工复核保证)。
|
||||
- **类别门禁**:交付文档的 A ≥ 5 行 / B ≥ 4 行 / C ≥ 8 行 / D ≥ 6 行 / E ≥ 4 行 / F ≥ 8 条,A–E 每行 ≥2 个 `file:line` 锚点,A 覆盖符号级关键词,B 覆盖新增成员与签名关键词,C 覆盖 8 个定位文件并携带交叉引用 ID,D 覆盖关键被删成员与 `material/utils.ts` 且含「请用户反馈」措辞,E 包含加载文件与对照扫描结论并含「仅报告」措辞。
|
||||
- **符号零命中复验**:`git grep -n -- <name> -- packages-user`(`MaterialManager` / `renderAnimatedWith` / `getBlockClsByAlias` / `getIdentifierByAlias` / `getAliasByIdentifier`)逐一无输出。
|
||||
- **既有计划保护 + 计划范围门禁**:`git status --porcelain -- <04-01..04-07 的 PLAN 与 SUMMARY>` 为空;phase 目录内 `-PLAN.md` 恰为 `04-01`..`04-08` 共 8 个;`04-08-SUMMARY.md` 已存在。
|
||||
- **CRLF 门禁**:交付文档的 `\n` 总数等于 `\r\n` 总数(无孤立 LF)。
|
||||
- **人工复核**:抽查 A 类 3 处 `BlockCls` import 与 `hero.ts:167` / `vertex.ts:852`、D 类 3 处 `renderWithoutCheck` 与 `material/utils.ts:2`、E 类 `fallback/load.ts` 的 9 处参数个数错误,结论与偏差修正记录在 `04-08-SUMMARY.md`。
|
||||
- **不可自动化项的诚实说明**:本步为只读清点,无运行时行为可观察;除上述命令外不存在可运行门禁,不得以任何无法运行的门禁冒充通过。
|
||||
</verification>
|
||||
|
||||
<output>
|
||||
Create `.planning/phases/04-render-adaptation/04-08-SUMMARY.md` when done
|
||||
</output>
|
||||
|
||||
## Artifacts this phase produces
|
||||
|
||||
| Artifact | Kind | Purpose |
|
||||
|----------|------|---------|
|
||||
| `.planning/phases/04-render-adaptation/04-TEXTURE-INTERFACE-IMPACT.md` | 交付文档(**唯一** `files_modified`) | `d36ea69` TextureManager 基准在 `packages-user` 消费者面的只读影响台账:元信息块 + 背景 / 方法 / 基准变更(d36ea69)/ 类型门禁实测基线 / A 符号改名与移除的引用点 / B 成员与签名变化的调用点 / C 地图渲染消费者定位索引 / D 被删且无替代(需用户反馈)/ E 加载相关与添加素材(仅报告)/ F 未能从阅读确定(未猜测)/ 处置 |
|
||||
| `.planning/phases/04-render-adaptation/04-08-PLAN.md` | 计划簿记 | 本计划(编号 04-08;`wave: 7`;`depends_on` 04-01..04-07) |
|
||||
| `.planning/phases/04-render-adaptation/04-08-SUMMARY.md` | 执行簿记 | 当日实测值(porcelain / `pnpm exec vue-tsc --noEmit` 错误数)、A–F 实际行数与关键结论、六道门禁结果、人工复核结论、与规划日的差异说明、`REND-01` / `REND-02` 仍 Pending 与「第二步未规划」 |
|
||||
| 门禁结果(会话内可复跑) | 验证证据 | 只读门禁(porcelain 逐条一致)、类型门禁一致性(错误总行数等于记录值)、类别门禁(A ≥ 5 / B ≥ 4 / C ≥ 8 / D ≥ 6 / E ≥ 4 / F ≥ 8 与双锚点 / 关键词 / 措辞)、符号零命中复验、既有计划保护 + 计划范围门禁(`04-01..04-07-*` 未改写、无 `04-09+`、SUMMARY 已落盘)、CRLF 门禁 |
|
||||
| 显式**不**产出 | 边界声明 | 任何生产代码改动、任何测试文件、任何依赖变更、任何修复方案或第二步实施计划(D-40:第二步待用户审阅本文件后另行规划)、任何针对 `material/` 与加载面的修改方案(D-39 / D-41 / D-42) |
|
||||
|
||||
Loading…
Reference in New Issue
Block a user