mirror of
https://github.com/motajs/template.git
synced 2026-10-17 11:40:16 +08:00
fix(04): revise plans based on checker feedback
This commit is contained in:
parent
bb1364b495
commit
f55a76297f
@ -39,7 +39,7 @@ must_haves:
|
||||
- "**D-37(E 类)落地**:`packages-user/client-base/package.json` 的 `dependencies` 补上 `\"@user/data-state\": \"workspace:*\"`(其源码 `material/types.ts:9` 与 `types.ts:3` 早已 import 该包);**不执行任何依赖安装、不修改 `pnpm-lock.yaml`**——Task 0 必须把「仅补声明 / 不同步 lockfile」这一处置原样告知用户并请其确认(若用户要求同步 lockfile,退出本计划、修订 `04-07-PLAN.md` 后重新汇报,不得自行改道)"
|
||||
- "**D-33(范围硬边界)落地**:只修复 material 归属的诊断,**不追求解决全部类型错误**。执行前先记录当日 `pnpm exec vue-tsc --noEmit` 的基线(本次规划日实测:错误总行数 **199**、material 归属 **19**,与 `04-MATERIAL-INTERFACE-IMPACT.md` 记录一致);完工后要求 ① material 归属诊断为 **0**;② 错误总行数 **不超过基线总行数减 material 条数(≤ 180)**;③ 十个在范围文件内**不再有任何诊断**。`src/types/declaration/*`(E 类只报告)与 `packages/**` 一律不修改;其余约 180 条既有/无关诊断(加载系统重构 16 条 + 数据端测试与寻路 164 条)**一条都不追**"
|
||||
- "**契约面与命名仅两处经批准的变更**:① `MaterialManager` / `AutotileProcessor` / `AssetBuilder` 三个**已导出类**的构造器各新增一个 `state: ICoreState` 形参(Task 0 单独列为待批准项);② `MaterialManager` 新增 `readonly textures: ITextureStore` 成员。`IMapHeroRenderer` / `IMapExtensionManager` / `IAutotileProcessor` / `IAssetBuilder` / `ITrackedAssetData` / `ITextureManager` 的**成员集合与既有 jsDoc 一字不改**(`textures` / `state` 本就是 `4e305e3` 已声明的接口成员,本次只是补实现);不新增 / 删除任何接口成员,不新增任何方法名"
|
||||
- "**既有注释零改写**:不修改任何既有 jsDoc / 注释文本(AGENTS.md);被 D-34 / D-36 删除的成员按其定义**连注释整体删除**(「删除 / 移动成员及其 jsDoc」属 AGENTS.md 预授权范围),不新增任何无价值注释;`renderer.ts` `getOffsetPool` 中随 big-image 循环一起删除的行内注释属同一次删除"
|
||||
- "**既有注释零改写**:不修改任何既有 jsDoc / 注释文本(AGENTS.md);被 D-34 / D-36 删除的成员按其定义**连注释整体删除**(「删除 / 移动成员及其 jsDoc」属 AGENTS.md 预授权范围),不新增任何无价值注释;`renderer.ts` `getOffsetPool` 中随 big-image 循环一起删除的行内注释属同一次删除。**本条的失败检查(truth 第 7 条的判定条件)**:Task 3 人工复核第 ⑪ 条要求对 10 个在范围文件逐 hunk 执行 `git diff`(`git diff HEAD~1 -- <文件>` 或 `git show HEAD -- <文件>`)确认每一处既有 jsDoc / 注释文本要么**原样保留**、要么**随其所属成员被整体删除**;一旦发现任何既有注释文本被改写 / 重排 / 局部编辑(区别于整段随成员删除),即判本计划失败并把该 hunk 写入 SUMMARY"
|
||||
- "**范围外零改动**:`action/move.ts` 与全部移动控制 API(D-19)、`packages/**`、`src/**`、所有数据端包(`data-common` / `data-base` / `data-system` / `data-state`)、贴图与不透明度来源(D-18)、跟随者族(D-22)、`core.*` / `client.*` legacy(D-12)、存量 `state` 单例使用(D-28)、`.planning/graphs/*`(E 类只报告,F-06 待用户裁决)一律不动;`hero.ts` 的 `state.roleFace.getFaceOf(...)` 三处与 `import { state } from '@user/data-state'` 逐字保留(D-28)"
|
||||
- "**验证可运行且不臆造通过**:改动前先记录当日 `pnpm exec vue-tsc --noEmit` 的基线(总行数 + material 归属行数,逐行原样入 SUMMARY)与并发改动基线(porcelain + 内容 `sha256` 摘要);改动后要求 material 归属诊断为 0、十个在范围文件诊断为 0、总行数 ≤ 基线总行数减 material 条数;`pnpm exec eslint` 对全部被改 TS 文件 0 错误;静态门禁(`packages-user` 内 `bigImage` 记号归零、`textures` 声明就位、四个实现类 `state` 就位、7 处 `getTile(` 就位、`getOffsetPool` 已清理、`@user/data-state` 在 `client-base/package.json`)、CRLF 门禁、基线感知范围门禁与并发改动基线门禁全部转绿。渲染端**无测试设施**,本增量虽在运行时路径上(构造器注入)但**无可运行的渲染或 UAT 设施**,故实质验证为「scoped 类型 + 静态 + eslint / CRLF + 范围 / 并发基线」机器门禁加人工代码复核;**不得**以任何无法运行的门禁冒充通过"
|
||||
- "用户并发的未提交改动(以 Task 1 起始 `git status --porcelain` 当日实测为准;规划日实测工作树内唯一未提交项为 ` M .planning/phases/04-render-adaptation/04-CONTEXT.md`)在 Task 1 起始记录基线(porcelain 条目 + 各文件内容 `sha256` 摘要),Task 3 复验逐条与摘要未变;**不回滚 / 不暂存 / 不提交 / 不修改**它们。本次基线**不沿用** 04-04 / 04-06 的旧列表,一律以 Task 1 当日实测为准"
|
||||
@ -131,6 +131,7 @@ Phase 4 第七个增量(D-32 **第二步**)—— **material 接口适应实
|
||||
| `cache.ts` 11 处 | `RenderableDataBase.bigImage`、`AutotileRenderable.bigImage`、5 处字面量、`faceIds` / `bigImage` 解构 + `enemys` 特判、`if (bigImage) {...}` 分支 | **整体删除**(含随之未使用的 `enemys` 声明) | legacy 概念路径(走 `core.material.*`),big-image 概念删除(D-31)后旧兼容可痛丢弃 |
|
||||
| `client-base/package.json` | 无 `@user/data-state` | `"@user/data-state": "workspace:*"` | 声明补全(源码已 import;不安装、不同步 lockfile) |
|
||||
|
||||
- **替换计数的既有基线(必须知悉,避免门禁误判)**:`vertex.ts` 在本次 7 处替换面之外**已存在**一处 `getTile(` 调用(`packages-user/client-modules/src/render/map/vertex.ts:516`,`checkAutotileConnectionAround`),该行语义合法、**不属本次改动面、不得删除或改写**。故替换后 `vertex.ts` 的全文件 `getTile(` 计数为 **2**(既有 `:516` 一处 + 本次由 `:546` 的 `getIfBigImage(` 改写而来的一处);静态门禁据此**实测后**的期望值断言:door 2 / hero 3 / renderer 1 / vertex 2。
|
||||
- **D-35 注入链(C 类)**:`ClientCore extends CoreState`(`client.ts:45`)→ `new MaterialManager(this)`(`:84`)→ `MaterialManager.constructor(readonly state: ICoreState)` → `new AssetBuilder(this, state)`(`manager.ts:86`)→ `AssetBuilder.constructor(readonly materials, readonly state)` → `new TrackedAssetData(materials, this, state)`(`builder.ts:28`)→ `TrackedAssetData.constructor(readonly materials, readonly builder, readonly state) { super(0); }`;另有 `new AutotileProcessor(this.materials, this)`(`client.ts:85`)与 `new AutotileProcessor(manager, manager.state)`(`renderer.ts:234`,从已注入的 `ITextureManager` 取 `state`,不取全局单例,D-23)。`MaterialManager` 同时补 `readonly textures: ITextureStore`(承担 store 由 Task 0 裁定,建议默认新建专用 `TextureStore`)。
|
||||
- **范围硬边界(D-33)**:只修 material 归属诊断;约 180 条既有/无关诊断一条不追;`src/**`、`packages/**`、数据端只读;D-18 / D-19 / D-22 / D-23 / D-28 边界照旧。
|
||||
|
||||
@ -173,7 +174,7 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
|
||||
`estimate-calibration` 返回 `factor: 1`、`sample_count: 0`、`confidence: low`(项目无历史样本),故 `tokens == raw_tokens`,并如实标注 `confidence: low`。按「执行者实际触及量」估算(`estimate.tasks: 4` = Task 0 汇报关卡 + 三个工作任务):Task 0 只读汇报并等待用户确认(约 5k,不写文件);Task 1(tracer)起始复核 + 构造器注入链 + `textures` + `package.json` + scoped 类型门禁(约 26k,含 `manager.ts` 602 行与 `builder.ts` / `autotile.ts` 的定向读取);Task 2 `MaterialManager` big-image 删除 + 5 个消费者文件改写 + `getOffsetPool` 清理 + 门禁(约 26k);Task 3 `cache.ts` 删除 + 原子提交 + 全部门禁 + 人工复核 + SUMMARY(约 20k);固定开销约 5k;合计约 82k。
|
||||
|
||||
**为何不拆分:** D-33 明令不追无关错误,A 类的删除与其消费者改写**不可分离编译**(删掉 `getIfBigImage` 后 7 处调用点立即报错),故本增量是一个不可再切的最小整体;本计划的四类改动落在同一条「material 接口适应」纵切面上,拆成多计划只会制造中间不可编译状态。按 context-budget 的 Phase Sizing 规则,本计划列为一个计划(3 个工作任务),估算超 smart-zone 预算属**建议性**提示,不阻塞。
|
||||
**为何不拆分:** D-33 明令不追无关错误,A 类的删除与其消费者改写**不可分离编译**(删掉 `getIfBigImage` 后 7 处调用点立即报错),故本增量是一个不可再切的最小整体;本计划的四类改动落在同一条「material 接口适应」纵切面上,拆成多计划只会制造中间不可编译状态。按 context-budget 的 Phase Sizing 规则,本计划列为一个计划(3 个工作任务);本计划估算为校准预算(100000)的约 **82%**(`over_budget: false`;`confidence: low`,项目无历史样本),属**建议性**提示,不阻塞。
|
||||
|
||||
</objective>
|
||||
|
||||
@ -372,7 +373,7 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
- packages-user/client-modules/src/render/map/extension/door.ts(整文件 73 行:`openDoor` `:30-43`、`closeDoor` `:45-56`)
|
||||
- packages-user/client-modules/src/render/map/extension/hero.ts:225-251,350-390,415-438(`moveEntity` / `addFollower` / 跟随者循环三处取值点;`:238` / `:363` / `:423` 的 `state.roleFace.getFaceOf` 属 D-28 保留)
|
||||
- packages-user/client-modules/src/render/map/renderer.ts:640-690(`getOffsetPool` 现行实现,`:651-657` 为待删的 big-image 循环)、`:1238-1278`(`useTileBackground`,`:1250` 为待改取值点)
|
||||
- packages-user/client-modules/src/render/map/vertex.ts:530-600(`updateVertexArray`,`:546` 为待改取值点;其后 `tile.cls` / `tile.texture.render()` / `tile.frames` / `tile.offset` 的用法必须保持不变)
|
||||
- packages-user/client-modules/src/render/map/vertex.ts:530-600(`updateVertexArray`,`:546` 为待改取值点;其后 `tile.cls` / `tile.texture.render()` / `tile.frames` / `tile.offset` 的用法必须保持不变;另 `:516`(`checkAutotileConnectionAround`)为范围外既有 `getTile(` 调用,不得改动)
|
||||
- .planning/phases/04-render-adaptation/04-MATERIAL-INTERFACE-IMPACT.md 的 `## A 已移除符号的剩余引用` 与 `## D big-image 残留(实现与消费者)`(本任务的两张事实表)
|
||||
- packages-user/data-common/src/common/mover.ts(若需确认 `MovingBlock.setTexture` 的形参类型——通过 `render/map/moving.ts` 的 `IMovingBlock`)
|
||||
</read_first>
|
||||
@ -392,7 +393,7 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
(2d) `render/map/extension/hero.ts:364`:`getIfBigImage(faced?.face ?? image)` → `getTile(faced?.face ?? image)`(`addFollower`)。
|
||||
(2e) `render/map/extension/hero.ts:428-430`:`getIfBigImage(nextFace.identifier)` → `getTile(nextFace.identifier)`(跟随者循环)。
|
||||
(2f) `render/map/renderer.ts:1250`:`const tex = this.manager.getIfBigImage(tile);` → `const tex = this.manager.getTile(tile);`(`useTileBackground`)。
|
||||
(2g) `render/map/vertex.ts:546`:`const tile = this.renderer.manager.getIfBigImage(num);` → `const tile = this.renderer.manager.getTile(num);`(`updateVertexArray`)。
|
||||
(2g) `render/map/vertex.ts:546`:`const tile = this.renderer.manager.getIfBigImage(num);` → `const tile = this.renderer.manager.getTile(num);`(`updateVertexArray`)。**注意既有基线**:`vertex.ts:516`(`checkAutotileConnectionAround`)本就有一处范围外的 `getTile(` 调用,属既有代码——本任务不触碰该行;替换后 `vertex.ts` 的全文件 `getTile(` 计数为 2(既有 `:516` 一处 + 本次 `:546` 一处),门禁按此期望值断言。
|
||||
**不得**改动这 7 处周围的分支结构、变量名、注释、`logger` 调用与后续用法(`status.useSpecifiedFrame` / `moving.useSpecifiedFrame` / `block.setTexture` / `tex.frames` / `tile.texture.render()` / `tile.offset` 等一律保持)。**不得**改动 `hero.ts:238` / `:363` / `:423` 的 `state.roleFace.getFaceOf(...)` 与 `import { state } from '@user/data-state'`(D-28)。
|
||||
(3) **`renderer.ts` 的 `getOffsetPool` 清理**:删除 `:651-657` 的整段(`:651` 的行内注释「其他的都是 bigImage 了,直接遍历获取」+ `for (const identifier of this.manager.bigImageStore.keys()) { const data = this.manager.getBigImage(identifier); if (!data) continue; const offset = data.texture.width / data.frames; pool.add(offset); }`)。**保留** `const pool = new Set([32]);`、其后的「还有勇士图片」注释段与 `imageStore.values()` 循环、`pool.size > 64` 的 DEV 告警、`MAX_VERTEX_UNIFORM_VECTORS` 的错误分支与 `return [...pool];`。**不得**改方法名、签名与其它逻辑。
|
||||
(4) **不做的事**:不碰 `cache.ts`(Task 3)、不碰 `material/types.ts` 与 `client-base/src/types.ts`、不碰 `action/move.ts`、不碰任何数据端文件与 `packages/**`、不改 `getOffsetPool` 之外的 renderer 逻辑、不新增注释、不新增 `as` 断言。
|
||||
@ -403,8 +404,8 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
<verify>
|
||||
<automated>node -e "const fs=require('fs'),{execSync}=require('child_process');let out='';try{out=execSync('pnpm exec vue-tsc --noEmit',{encoding:'utf8',maxBuffer:1<<28,stdio:['ignore','pipe','pipe']})}catch(e){out=String(e.stdout||'')+String(e.stderr||'')}const lines=out.split(/\r?\n/).filter(l=>/: error TS\d+/.test(l));const MRE=/ITextureManager|IAutotileProcessor|IAssetBuilder|ITrackedAssetData|IBigImageReturn|getIfBigImage|getBigImage|isBigImage|setBigImage|getBigImageByAlias|bigImageStore|IMaterialManager|IMaterialGetter|IMaterialAliasGetter/;const isMat=l=>/client-base[\\/]src[\\/]material[\\/]/.test(l)||MRE.test(l);let t='';try{t=fs.readFileSync('.planning/phases/04-render-adaptation/04-07-SUMMARY.md','utf8')}catch(e){t=''}const bm=t.match(/<!-- TYPE-BASELINE:START -->([\s\S]*?)<!-- TYPE-BASELINE:END -->/);if(!bm){console.error('NO TYPE BASELINE');process.exit(1)}const dm=bm[1].match(/错误总行数:(\d+);material 归属行数:(\d+)/);if(!dm){console.error('NO BASELINE NUMBERS');process.exit(1)}const N=+dm[1],M=+dm[2];const mat=lines.filter(isMat);if(mat.length){console.error('MATERIAL DIAGNOSTICS REMAIN '+mat.length+'\n'+mat.join('\n'));process.exit(1)}const touched=['packages-user/client-base/src/material/manager.ts','packages-user/client-modules/src/render/map/renderer.ts','packages-user/client-modules/src/render/map/vertex.ts','packages-user/client-modules/src/render/map/extension/door.ts','packages-user/client-modules/src/render/map/extension/hero.ts'];const hit=lines.filter(l=>touched.some(p=>l.indexOf(p.replace(/\//g,'/'))>=0||l.indexOf(p)>=0));if(hit.length){console.error('DIAGNOSTICS IN TOUCHED FILES '+hit.length+'\n'+hit.join('\n'));process.exit(1)}if(lines.length>N-M){console.error('TOTAL INCREASED total='+lines.length+' allowed '+(N-M));process.exit(1)}console.log('OK A-class: material 0; touched 0; total '+lines.length+'<='+(N-M))"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "NO TYPE BASELINE" / "NO BASELINE NUMBERS"(SUMMARY 未按固定格式记录类型基线)/ "MATERIAL DIAGNOSTICS REMAIN"(material 归属诊断未清零)/ "DIAGNOSTICS IN TOUCHED FILES"(五个在范围文件仍有诊断,说明删除或改写引入了新问题)/ "TOTAL INCREASED"(错误总行数超过「基线总行数 - material 条数」)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const F={man:'packages-user/client-base/src/material/manager.ts',ren:'packages-user/client-modules/src/render/map/renderer.ts',ver:'packages-user/client-modules/src/render/map/vertex.ts',doo:'packages-user/client-modules/src/render/map/extension/door.ts',her:'packages-user/client-modules/src/render/map/extension/hero.ts'};const S={};for(const k of Object.keys(F))S[k]=fs.readFileSync(F[k],'utf8');const left=Object.keys(S).filter(k=>/bigimage/i.test(S[k]));if(left.length){console.error('BIGIMAGE TOKENS REMAIN IN '+left.join(','));process.exit(1)}const cnt=(s,t)=>(s.match(new RegExp('getTile\\(','g'))||[]).length;if(cnt(S.doo)!==2||cnt(S.her)!==3||cnt(S.ren)!==1||cnt(S.ver)!==1){console.error('getTile( COUNT WRONG door='+cnt(S.doo)+' hero='+cnt(S.her)+' renderer='+cnt(S.ren)+' vertex='+cnt(S.ver));process.exit(1)}if(!/const pool = new Set\(\[32\]\);/.test(S.ren)||!/imageStore\.values\(\)/.test(S.ren)||!/return \[\.\.\.pool\];/.test(S.ren)){console.error('getOffsetPool TAIL LOGIC LOST');process.exit(1)}const sd=S.man.indexOf('setDefaultFrame(');if(sd<0){console.error('setDefaultFrame MISSING');process.exit(1)}const sdBody=S.man.slice(sd,S.man.indexOf('}',sd)+1);if(!/defaultFrames\.set\(identifier, defaultFrame\)/.test(sdBody)){console.error('setDefaultFrame BODY WRONG');process.exit(1)}const h=S.her;const gf=(h.match(/state\.roleFace\.getFaceOf/g)||[]).length;if(gf<3||!h.includes(\"from '@user/data-state'\")){console.error('D28 STATE USAGE LOST getFaceOf='+gf);process.exit(1)}console.log('OK D34 deletions + 7 getTile + getOffsetPool cleaned')"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "BIGIMAGE TOKENS REMAIN IN"(五个在范围文件仍含 `bigimage` 记号)/ "getTile( COUNT WRONG"(7 处替换的分布不是 door 2 / hero 3 / renderer 1 / vertex 1)/ "getOffsetPool TAIL LOGIC LOST"(`getOffsetPool` 的其余偏移来源或返回被误删)/ "setDefaultFrame MISSING" / "setDefaultFrame BODY WRONG"(`setDefaultFrame` 被误删或其剩余本体不正确)/ "D28 STATE USAGE LOST"(存量 `state.roleFace` 用法被误删)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const F={man:'packages-user/client-base/src/material/manager.ts',ren:'packages-user/client-modules/src/render/map/renderer.ts',ver:'packages-user/client-modules/src/render/map/vertex.ts',doo:'packages-user/client-modules/src/render/map/extension/door.ts',her:'packages-user/client-modules/src/render/map/extension/hero.ts'};const S={};for(const k of Object.keys(F))S[k]=fs.readFileSync(F[k],'utf8');const left=Object.keys(S).filter(k=>/bigimage/i.test(S[k]));if(left.length){console.error('BIGIMAGE TOKENS REMAIN IN '+left.join(','));process.exit(1)}const cnt=(s,t)=>(s.match(new RegExp('getTile\\(','g'))||[]).length;const gbLeft=Object.keys(S).filter(k=>/getIfBigImage\(/.test(S[k]));if(gbLeft.length){console.error('getIfBigImage( REMAINS IN '+gbLeft.join(','));process.exit(1)}const gt=(s)=>(s.match(/getTile\(/g)||[]).length;if(gt(S.doo)!==2||gt(S.her)!==3||gt(S.ren)!==1||gt(S.ver)!==2){console.error('getTile( COUNT WRONG door='+gt(S.doo)+' hero='+gt(S.her)+' renderer='+gt(S.ren)+' vertex='+gt(S.ver)+' (vertex 含范围外既有 vertex.ts:516)');process.exit(1)}if(!/const pool = new Set\(\[32\]\);/.test(S.ren)||!/imageStore\.values\(\)/.test(S.ren)||!/return \[\.\.\.pool\];/.test(S.ren)){console.error('getOffsetPool TAIL LOGIC LOST');process.exit(1)}const sd=S.man.indexOf('setDefaultFrame(');if(sd<0){console.error('setDefaultFrame MISSING');process.exit(1)}const sdBody=S.man.slice(sd,S.man.indexOf('}',sd)+1);if(!/defaultFrames\.set\(identifier, defaultFrame\)/.test(sdBody)){console.error('setDefaultFrame BODY WRONG');process.exit(1)}const h=S.her;const gf=(h.match(/state\.roleFace\.getFaceOf/g)||[]).length;if(gf<3||!h.includes(\"from '@user/data-state'\")){console.error('D28 STATE USAGE LOST getFaceOf='+gf);process.exit(1)}console.log('OK D34 deletions + 7 getTile + getOffsetPool cleaned')"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "BIGIMAGE TOKENS REMAIN IN"(五个在范围文件仍含 `bigimage` 记号)/ "getIfBigImage( REMAINS IN"(五个在范围文件仍含未替换的 `getIfBigImage(` 调用)/ "getTile( COUNT WRONG"(替换后全文件 `getTile(` 计数不是 door 2 / hero 3 / renderer 1 / vertex 2——vertex 的 2 含范围外既有 `vertex.ts:516`)/ "getOffsetPool TAIL LOGIC LOST"(`getOffsetPool` 的其余偏移来源或返回被误删)/ "setDefaultFrame MISSING" / "setDefaultFrame BODY WRONG"(`setDefaultFrame` 被误删或其剩余本体不正确)/ "D28 STATE USAGE LOST"(存量 `state.roleFace` 用法被误删)</fails_when>
|
||||
<automated>pnpm exec eslint packages-user/client-base/src/material/manager.ts packages-user/client-modules/src/render/map/renderer.ts packages-user/client-modules/src/render/map/vertex.ts packages-user/client-modules/src/render/map/extension/door.ts packages-user/client-modules/src/render/map/extension/hero.ts</automated>
|
||||
<fails_when>non-zero exit 或输出含 "error"(ESLint / Prettier 违规,含未使用变量 / 未使用 import——务必确认删除 big-image 后无 import 变为未使用)</fails_when>
|
||||
<automated>node -e "const fs=require('fs');const F=['packages-user/client-base/src/material/manager.ts','packages-user/client-modules/src/render/map/renderer.ts','packages-user/client-modules/src/render/map/vertex.ts','packages-user/client-modules/src/render/map/extension/door.ts','packages-user/client-modules/src/render/map/extension/hero.ts'];for(const f of F){const s=fs.readFileSync(f,'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 '+f+' lone-lf='+(lf-crlf));process.exit(1)}}console.log('OK CRLF')"</automated>
|
||||
@ -415,7 +416,7 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
- `door.ts` / `hero.ts` 的 7 处取值全部改为 `getTile(...)`(door 2 / hero 3),`renderer.ts:1250` 与 `vertex.ts:546` 同样改为 `getTile(...)`;这些调用点周围的分支、变量与后续用法未变
|
||||
- `renderer.ts` 的 `getOffsetPool` 已删除 big-image 循环,保留 `new Set([32])`、`imageStore.values()` 循环、DEV 告警与 `return [...pool]`
|
||||
- `hero.ts` 的 `state.roleFace.getFaceOf` 三处与 `import { state } from '@user/data-state'` 逐字保留(D-28);`action/move.ts`、`cache.ts`、`material/types.ts`、`client-base/src/types.ts`、任何数据端文件均未被本任务触碰
|
||||
- 四条 `<automated>` 全部转绿:scoped 类型门禁(material 归属 0、五个在范围文件 0、总行数 ≤ 基线减 material 条数)、删除 / 替换门禁(`bigimage` 记号归零、`getTile(` 分布正确、`getOffsetPool` 尾部逻辑在、`setDefaultFrame` 正确、D-28 保留)、eslint 0 错误、CRLF
|
||||
- 四条 `<automated>` 全部转绿:scoped 类型门禁(material 归属 0、五个在范围文件 0、总行数 ≤ 基线减 material 条数)、删除 / 替换门禁(`bigimage` 记号归零、`getIfBigImage(` 全部消失、`getTile(` 全文件计数为 door 2 / hero 3 / renderer 1 / vertex 2——vertex 的 2 含范围外既有 `vertex.ts:516`、`getOffsetPool` 尾部逻辑在、`setDefaultFrame` 正确、D-28 保留)、eslint 0 错误、CRLF
|
||||
- 本任务**未**提交任何改动
|
||||
</acceptance_criteria>
|
||||
<done>`MaterialManager` 的 big-image 实现面全部删除、7 处消费者取值改为行为等价的 `getTile`、`getOffsetPool` 的 big-image 偏移收集删除,material 归属诊断清零且总行数降至 ≤ 基线减 19,D-28 保留项未动,四条机器门禁转绿</done>
|
||||
@ -451,8 +452,8 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
(3) **范围门禁(基线感知,先跑,防止越界改动)**:把当前 `git status --porcelain` 的**生产路径**(`^packages(-user)?/`)与 SUMMARY 中 `CONCURRENT-BASELINE` 段记录的基线条目做差集;只有**基线之外**、且不属于上述 10 个在范围文件的生产改动才算越界。特别断言 `action/move.ts`(D-19)、`packages-user/client-base/src/load/**`、`client-base/src/material/types.ts`、`client-base/src/types.ts`、`data-common` / `data-base` / `data-system` / `data-state`、`packages/**`、`src/**` 均无基线之外的新改动。若出现基线之外的第九 / 第十一个生产文件改动:停止、汇报、修订计划(不得自行扩面)。
|
||||
(4) **并发改动基线门禁**:用与 Task 1 步骤 (0c) 完全相同的固定命令重算(排除本计划在范围文件的四类前缀与 `.planning/phases/04-render-adaptation/`),断言 porcelain 条目集合与内容摘要 `sha256` 均与 SUMMARY 的 `CONCURRENT-BASELINE` 段记录一致。
|
||||
(5) **复跑全部机器门禁**:scoped 类型门禁(material 归属 0、10 个在范围文件诊断 0、总行数 ≤ 基线总行数减 material 条数)、静态门禁 A(D-34 / D-35 / D-36 / D-37 全量)、静态门禁 B(D-28 保留 + `cache.ts` 删除面 + `getOffsetPool` 保留面)、`pnpm exec eslint` 对 9 个被改 TS 文件 0 错误、CRLF 门禁。
|
||||
(6) **人工复核(写进 SUMMARY 的「人工复核」段,逐条给结论)**:① D-34 的 7 处调用逐条对位(旧 `getIfBigImage` → 新 `getTile`)并复核「行为保持」论据(`bigImageData` 的唯一写入者 `setBigImage` 消费者调用点为 0,现场用 `git grep` 复验);② `getOffsetPool` 删除后池的来源只剩 `ImageStore` 与常量 32,说明该变化对 shader uniform 池的语义(不再有 big-image 偏移);③ `MaterialManager` 的五个 big-image 方法与三个字段确实全部删除、`setDefaultFrame` 本体与签名未变;④ D-35 的注入链逐环节对位(`client.ts:84` 的 `this` → `manager.ts` 构造器 → `manager.ts:86` → `builder.ts:28`;`client.ts:85`;`renderer.ts:234` 的 `manager.state`)并说明**未引入任何全局单例**(D-23);⑤ `textures` 的承担 store 与 Task 0 用户裁定一致(并在 SUMMARY 明写「本次范围内无写入者」的事实);⑥ D-36 的 `cache.ts` 11 处命中逐条对位(字段 / 字面量 / 解构 / 特判 / 分支 / 未使用声明),并记录其行为影响(大图怪物落回后续分支)与「未经运行验证」;⑦ D-37 的声明就位、`pnpm-lock.yaml` 未动、未执行安装;⑧ D-33 范围核对:`git diff --stat` 只含 10 个文件、其余约 180 条诊断未被触碰;⑨ D-28 保留:`hero.ts` 的 `state.roleFace.getFaceOf` 三处与 `state` import 未动;⑩ 运行时 UAT 不可得的理由已写明(无测试设施、不启动渲染)。
|
||||
(7) **SUMMARY 定稿**:写 `.planning/phases/04-render-adaptation/04-07-SUMMARY.md`,含:10 个文件的改动清单与职责;D-33..D-37 的逐条处置对照表(含逐处替换映射与「`getIfBigImage ≡ getTile`」论据、`textures` 承担 store 的用户裁定、`cache.ts` 的行为影响);执行前核对结论(带 `file:line`);`CONCURRENT-BASELINE` 段 + `基线摘要 sha256`;`TYPE-BASELINE` 段(含两个基线数字与 material 归属诊断逐行);完工后的类型门禁实测值(material 归属 0、总行数实测值、10 个在范围文件 0);全部机器门禁的实际输出摘要;人工复核十条;未实现 / 显式延后项清单;REND-01 / REND-02 仍为 Pending 与运行时 UAT 不可得的明确声明。全文 CRLF。
|
||||
(6) **人工复核(写进 SUMMARY 的「人工复核」段,逐条给结论)**:① D-34 的 7 处调用逐条对位(旧 `getIfBigImage` → 新 `getTile`)并复核「行为保持」论据(`bigImageData` 的唯一写入者 `setBigImage` 消费者调用点为 0,现场用 `git grep` 复验);② `getOffsetPool` 删除后池的来源只剩 `ImageStore` 与常量 32,说明该变化对 shader uniform 池的语义(不再有 big-image 偏移);③ `MaterialManager` 的五个 big-image 方法与三个字段确实全部删除、`setDefaultFrame` 本体与签名未变;④ D-35 的注入链逐环节对位(`client.ts:84` 的 `this` → `manager.ts` 构造器 → `manager.ts:86` → `builder.ts:28`;`client.ts:85`;`renderer.ts:234` 的 `manager.state`)并说明**未引入任何全局单例**(D-23);⑤ `textures` 的承担 store 与 Task 0 用户裁定一致(并在 SUMMARY 明写「本次范围内无写入者」的事实);⑥ D-36 的 `cache.ts` 11 处命中逐条对位(字段 / 字面量 / 解构 / 特判 / 分支 / 未使用声明),并记录其行为影响(大图怪物落回后续分支)与「未经运行验证」;⑦ D-37 的声明就位、`pnpm-lock.yaml` 未动、未执行安装;⑧ D-33 范围核对:`git diff --stat` 只含 10 个文件、其余约 180 条诊断未被触碰;⑨ D-28 保留:`hero.ts` 的 `state.roleFace.getFaceOf` 三处与 `state` import 未动;⑩ 运行时 UAT 不可得的理由已写明(无测试设施、不启动渲染);⑪ **既有注释零改写(AGENTS.md;truth 第 7 条的可失败检查)**:对 10 个在范围文件逐 hunk 复核 `git diff`(用 `git diff HEAD~1 -- <10 个文件>` 或 `git show HEAD -- <10 个文件>`,视执行环境是否强制每任务提交而定),确认每一处既有 jsDoc / 注释文本要么**原样保留**、要么**随其所属成员被整体删除**(「删除 / 移动成员及其 jsDoc」属 AGENTS.md 预授权范围);若发现任何既有注释文本被改写 / 重排 / 局部编辑(区别于整段随成员删除),即**判本计划失败**,并把该 hunk 与结论写入 SUMMARY 的人工复核段。
|
||||
(7) **SUMMARY 定稿**:写 `.planning/phases/04-render-adaptation/04-07-SUMMARY.md`,含:10 个文件的改动清单与职责;D-33..D-37 的逐条处置对照表(含逐处替换映射与「`getIfBigImage ≡ getTile`」论据、`textures` 承担 store 的用户裁定、`cache.ts` 的行为影响);执行前核对结论(带 `file:line`);`CONCURRENT-BASELINE` 段 + `基线摘要 sha256`;`TYPE-BASELINE` 段(含两个基线数字与 material 归属诊断逐行);完工后的类型门禁实测值(material 归属 0、总行数实测值、10 个在范围文件 0);全部机器门禁的实际输出摘要;人工复核十一条;未实现 / 显式延后项清单;REND-01 / REND-02 仍为 Pending 与运行时 UAT 不可得的明确声明。全文 CRLF。
|
||||
(8) **提交 SUMMARY**:`docs(04-07): record execution state`,仅含 `04-07-SUMMARY.md`。
|
||||
(9) **不做的事**:不接线任何被注释的接线点、不改 `action/move.ts`、不新增测试文件、不改任何数据端文件与 `packages/**`、不修任何无关诊断、不重建 `.planning/graphs/*`、不修改 `04-01..04-06` 的任何产物。
|
||||
</action>
|
||||
@ -479,7 +480,7 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
- 10 个在范围文件已一次原子提交(`refactor(04-07)`),提交不含用户并发改动、不含 `.planning/**`
|
||||
- 终验类型门禁通过:material 归属 0、9 个在范围 TS 文件诊断 0、错误总行数 ≤ 基线总行数减 material 条数(规划日 199 / 19 → 期望 ≤ 180)
|
||||
- 静态门禁(D-34 / D-35 / D-36 / D-37 全量)、范围门禁(基线感知)、并发改动基线门禁、eslint 0 错误、CRLF 门禁全部转绿
|
||||
- `04-07-SUMMARY.md` 含执行前核对结论(带 `file:line`)、`CONCURRENT-BASELINE` 段 + `基线摘要 sha256`、`TYPE-BASELINE` 段(含两个基线数字与 material 归属诊断逐行)、D-33..D-37 处置对照、`textures` 承担 store 的用户裁定、`cache.ts` 行为影响与「未经运行验证」、门禁输出摘要、人工复核十条、未实现 / 延后项清单、REND-01 / REND-02 仍 Pending 与运行时 UAT 不可得的明确说明;并以 `docs(04-07)` 提交(仅含该 SUMMARY)
|
||||
- `04-07-SUMMARY.md` 含执行前核对结论(带 `file:line`)、`CONCURRENT-BASELINE` 段 + `基线摘要 sha256`、`TYPE-BASELINE` 段(含两个基线数字与 material 归属诊断逐行)、D-33..D-37 处置对照、`textures` 承担 store 的用户裁定、`cache.ts` 行为影响与「未经运行验证」、门禁输出摘要、人工复核十一条、未实现 / 延后项清单、REND-01 / REND-02 仍 Pending 与运行时 UAT 不可得的明确说明;并以 `docs(04-07)` 提交(仅含该 SUMMARY)
|
||||
</acceptance_criteria>
|
||||
<done>`cache.ts` 的 legacy big-image 路径删净、10 个文件原子提交、material 归属诊断清零且总行数不增加、多类机器门禁全绿、用户并发改动零变化、范围无越界、SUMMARY 定稿并提交;用户可据此继续裁决后续渲染适配增量(`textures` 写入侧、`.planning/graphs/*` 重建、其余渲染适配与 REND-02 双布局)</done>
|
||||
</task>
|
||||
@ -533,13 +534,13 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
0. 执行前置关卡(Task 0,AGENTS.md 第一个 block 点):向用户汇报「要解决的问题(A / C / D / E 四类 + 199 / 19 总账)/ 大致解决方案与逐处替换映射表 / 成员命名清单 / 三个已导出类构造器签名变更 / `textures` 承担 store 的候选与建议默认 / `cache.ts` 删除范围与行为影响 / `pnpm-lock.yaml` 处置 / 范围边界 / 验证方式的诚实降级」后**停下等待**用户明确回复「可以执行」四个字;未收到前不得执行任何任务、不得派发执行子代理,任何触发方式与 `yolo` / `auto_advance` 模式均不得自动放行(人工核对:用户回复原文)。
|
||||
1. 执行前核对与基线(Task 1 步骤 0):十项接口 / 构造面复核结论(带 `file:line`)、类型门禁基线(`TYPE-BASELINE` 段:错误总行数与 material 归属行数两个数字 + material 归属诊断逐行)、并发改动基线(`CONCURRENT-BASELINE` 段 + `基线摘要 sha256`)写入 SUMMARY;任一与规划不一致即停止并修订计划;**不得沿用 04-04 / 04-06 SUMMARY 的旧并发列表**。
|
||||
2. scoped 类型门禁(Task 1 / 2 / 3):`pnpm exec vue-tsc --noEmit` 过滤后要求——Task 1 完工时 C 类三形态诊断(`incorrectly implements interface` / `Property 'state' is missing` / `missing the following properties from type 'ITextureManager'`)为 0、material 归属数 == 基线减 9、且余下 material 归属全部命中 `bigimage`(大小写不敏感)、总行数 ≤ 基线减 9;Task 2 / Task 3 完工时 material 归属数为 0、在范围文件诊断为 0、总行数 ≤ 基线总行数减 material 条数(规划日 199 / 19 → 期望 ≤ 180)。整仓其余既有诊断不属本计划,不得以「整仓非 0 退出」判定失败,也不得漏判在范围文件的新诊断。
|
||||
3. 静态门禁(Task 1 / 2 / 3):① `MaterialManager` 含 `readonly textures: ITextureStore`;② 四个实现类各含 `readonly state: ICoreState`(或构造器形参形式);③ 五处构造点就位(`new MaterialManager(this)` / `new AutotileProcessor(this.materials, this)` / `new AutotileProcessor(manager, manager.state)` / `new AssetBuilder(this, state)` / `new TrackedAssetData(materials, this, state)`);④ 三个 client-base 文件的 `@user/data-state` import 只引入 `ICoreState`,无 `import type`、无 `state` 单例 import;⑤ `client-base/package.json` 的 `dependencies['@user/data-state'] === 'workspace:*'`;⑥ `git grep -i bigimage -- packages-user` 无输出;⑦ 7 处 `getTile(` 分布为 door 2 / hero 3 / renderer 1 / vertex 1;⑧ `getOffsetPool` 保留 `const pool = new Set([32]);`、`imageStore.values()` 循环与 `return [...pool];`;⑨ `setDefaultFrame` 本体只剩 `defaultFrames.set(...)`;⑩ `cache.ts` 保留 `interface RenderableDataBase` 且无 big-image 记号、`enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80` 声明已消失。
|
||||
3. 静态门禁(Task 1 / 2 / 3):① `MaterialManager` 含 `readonly textures: ITextureStore`;② 四个实现类各含 `readonly state: ICoreState`(或构造器形参形式);③ 五处构造点就位(`new MaterialManager(this)` / `new AutotileProcessor(this.materials, this)` / `new AutotileProcessor(manager, manager.state)` / `new AssetBuilder(this, state)` / `new TrackedAssetData(materials, this, state)`);④ 三个 client-base 文件的 `@user/data-state` import 只引入 `ICoreState`,无 `import type`、无 `state` 单例 import;⑤ `client-base/package.json` 的 `dependencies['@user/data-state'] === 'workspace:*'`;⑥ `git grep -i bigimage -- packages-user` 无输出;⑦ 7 处 `getIfBigImage(` 全部消失(五个在范围文件的 `getIfBigImage(` 计数为 0),且全文件 `getTile(` 计数为 door 2 / hero 3 / renderer 1 / vertex 2(vertex 的 2 = 范围外既有 `vertex.ts:516` 一处 + 本次由 `:546` 替换而来的一处;`vertex.ts:516` 不得改动);⑧ `getOffsetPool` 保留 `const pool = new Set([32]);`、`imageStore.values()` 循环与 `return [...pool];`;⑨ `setDefaultFrame` 本体只剩 `defaultFrames.set(...)`;⑩ `cache.ts` 保留 `interface RenderableDataBase` 且无 big-image 记号、`enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80` 声明已消失。
|
||||
4. D-28 保留门禁(Task 2 / 3):`hero.ts` 的 `state.roleFace.getFaceOf` 计数 ≥ 3 且 `from '@user/data-state'` 仍在(这是**正向**门禁:D-28 要求保留存量用法)。
|
||||
5. 范围门禁(Task 3,基线感知):将当前 `git status --porcelain` 的生产路径(`^packages(-user)?/`)与 `CONCURRENT-BASELINE` 段做差集;只有基线之外、且不属于 10 个在范围文件的生产改动才判越界;`action/move.ts`、`client-base/src/load/**`、`client-base/src/material/types.ts`、`client-base/src/types.ts`、数据端各包、`packages/**`、`src/**` 均无基线之外的新改动。
|
||||
6. 并发改动基线门禁(Task 3):排除本计划在范围文件的四类前缀与 `.planning/phases/04-render-adaptation/` 后,porcelain 条目集合与内容 `sha256` 与 SUMMARY 的 `CONCURRENT-BASELINE` 段记录一致(用户改动未被回滚 / 暂存 / 提交 / 修改)。
|
||||
7. ESLint / CRLF 门禁(Task 1 / 2 / 3):`pnpm exec eslint` 对全部被改 TS 文件(Task 1 五个、Task 2 五个、Task 3 九个)0 错误;9 个源文件无孤立 LF(dev.md「换行使用 CRLF 格式」)。SUMMARY 不施加该硬门禁(工具写出的 markdown),改由人工复核遵循仓库 markdown 惯例。
|
||||
8. 提交门禁(Task 3):`refactor(04-07)` 仅含 10 个在范围文件、不含 `.planning/**` 与用户并发改动;`docs(04-07)` 仅含 SUMMARY;`04-01..04-06` 的任何产物未被改写 / 覆盖 / 改号。
|
||||
9. 人工复核(Task 3):十条逐条给结论(D-34 的 7 处对位与「行为保持」论据现场复验、`getOffsetPool` 池来源变化、`MaterialManager` 删除面完整性、D-35 注入链与「无全局单例」、`textures` 承担 store 与「本次无写入者」事实、D-36 的 `cache.ts` 11 处对位与行为影响、D-37 声明与 lockfile 未动、D-33 范围核对、D-28 保留、运行时 UAT 不可得理由)。
|
||||
9. 人工复核(Task 3):十一条逐条给结论(D-34 的 7 处对位与「行为保持」论据现场复验、`getOffsetPool` 池来源变化、`MaterialManager` 删除面完整性、D-35 注入链与「无全局单例」、`textures` 承担 store 与「本次无写入者」事实、D-36 的 `cache.ts` 11 处对位与行为影响、D-37 声明与 lockfile 未动、D-33 范围核对、D-28 保留、运行时 UAT 不可得理由、既有注释零改写(第 ⑪ 条:逐 hunk `git diff` 确认既有 jsDoc / 注释文本未被改写,truth 第 7 条的可失败检查))。
|
||||
10. 运行时验证(诚实降级):渲染端无测试设施,本计划不启动渲染、不新增测试、不接线被注释的接线点,故**无运行时门禁可跑**;本计划的「运行结果」仅由上述编译 / 静态 / 格式 / 范围 / 并发基线机器门禁与人工复核承载。任何以「编译通过」代替运行时结论的表述都视为失败。
|
||||
</verification>
|
||||
|
||||
@ -568,7 +569,7 @@ Output: 10 个文件的生产改动(一次原子提交)+ 会话内可复跑
|
||||
| 生产源码(修改) | `packages-user/client-modules/src/render/map/extension/door.ts` | `openDoor` / `closeDoor` 取值改 `getTile` |
|
||||
| 生产源码(修改) | `packages-user/client-modules/src/render/map/extension/hero.ts` | `moveEntity` / `addFollower` / 跟随者循环三处取值改 `getTile`;D-28 的 `state.roleFace.getFaceOf` 与 `state` import 逐字保留 |
|
||||
| 生产源码(修改) | `packages-user/client-modules/src/render/elements/cache.ts` | legacy big-image 路径整体删除(字段 / 字面量 / 解构 / `enemys` 特判 / 大图分支 / 未使用声明) |
|
||||
| 摘要 | `.planning/phases/04-render-adaptation/04-07-SUMMARY.md` | 执行前核对结论(带 `file:line`)、`CONCURRENT-BASELINE` 段 + `基线摘要 sha256`、`TYPE-BASELINE` 段(两个基线数字 + material 归属诊断逐行)、D-33..D-37 处置对照与逐处替换映射(含「`getIfBigImage ≡ getTile`」论据与 `cache.ts` 行为影响)、`textures` 承担 store 的用户裁定、门禁输出摘要、人工复核十条、未实现项清单、REND-01 / REND-02 Pending 声明与运行时 UAT 不可得说明 |
|
||||
| 摘要 | `.planning/phases/04-render-adaptation/04-07-SUMMARY.md` | 执行前核对结论(带 `file:line`)、`CONCURRENT-BASELINE` 段 + `基线摘要 sha256`、`TYPE-BASELINE` 段(两个基线数字 + material 归属诊断逐行)、D-33..D-37 处置对照与逐处替换映射(含「`getIfBigImage ≡ getTile`」论据与 `cache.ts` 行为影响)、`textures` 承担 store 的用户裁定、门禁输出摘要、人工复核十一条、未实现项清单、REND-01 / REND-02 Pending 声明与运行时 UAT 不可得说明 |
|
||||
|
||||
<output>
|
||||
Create `.planning/phases/04-render-adaptation/04-07-SUMMARY.md` when done
|
||||
|
||||
Loading…
Reference in New Issue
Block a user