mirror of
https://github.com/motajs/template.git
synced 2026-10-17 11:40:16 +08:00
fix(04): revise plan 04-06 verification-strength claim (must_haves truth vs Task 3 gate)
This commit is contained in:
parent
a5bb5550d3
commit
3fadf34fff
@ -23,7 +23,7 @@ must_haves:
|
||||
truths:
|
||||
- "**计划号冲突(必须在 Task 0 原样汇报)**:`packages-user`/phase 目录下**已存在** `.planning/phases/04-render-adaptation/04-05-PLAN.md` 与 `04-05-SUMMARY.md`(第五个增量·`#04-01-M-06` / `#04-01-M-09` 收口,2026-09-20 已执行且改动在工作树中:`RendererLayerHook`、`getFinalAttribute`),故本增量按顺序号落为 **04-06**(`depends_on` 仍列 04-01..04-04 以保持 `wave: 5`,与编排给定的 wave 一致;04-05 的已完成改动属本计划的**基线**,不是本计划的产出)。`04-05-PLAN.md` / `04-05-SUMMARY.md` 一律**不得改写、不得覆盖、不得改号**;Task 0 必须把该冲突原样汇报并请用户确认编号(若用户要求改号,须先裁决 04-05 存量产物的归属,再由用户指定文件名,不得自行覆盖)。"
|
||||
- "**本计划的第一个 block 点是 Task 0 的 `blocking-human` 汇报关卡**:先向用户汇报「要解决的问题(material 接口在 `4e305e3` 后的影响面未清点,剩余实现/消费者仍在引用已删除或已改名的成员,且新增约束未实现)、大致解决方案(只读清点,唯一交付物 `04-MATERIAL-INTERFACE-IMPACT.md`,11 节结构 / A–F 六类分列 / 每行精确到符号 + file:line)、`4e305e3` 基准的三类差异(移除 7 个符号、改名 3 个接口、新增 `textures` 与 4 处 `ICoreStateExtended` 约束)、范围与禁令、**计划号冲突(04-05 已被占用 → 本计划为 04-06)**、验证方式与只读证明」,然后必须**停下等待**用户明确回复「可以执行」四个字;收到该回复前不得执行任何任务、不得派发任何执行子代理。无论触发方式(`/gsd-execute-phase`、`/gsd-manager`、`/gsd-autonomous`、子代理/执行器派发)或配置模式(`.planning/config.json` 的 `mode: yolo`、`workflow.auto_advance`)如何,均不得自动放行(AGENTS.md)"
|
||||
- "**只读硬约束(生产代码零改动)**:本 run 生产源码改动为 **0**——`git status --porcelain -- packages packages-user src` 在 Task 1 步骤 (0a) 起始逐行原样记录进 `## 方法`(规划日 2026-09-21 实测为「(无)」),Task 1 / Task 3 门禁断言其后**逐条一致**(不新增、不消失、状态码不变);`pnpm exec vue-tsc --noEmit` 的**错误总行数**与 **material 相关错误行数**在 Task 1 步骤 (0b) 记录(规划日实测 **199 / 19**,其中 material 19 = `client-base` 7 + `client-modules` 12,非 material 180),Task 3 门禁重跑并断言两个数字**完全一致**。`files_modified` 只含 `04-MATERIAL-INTERFACE-IMPACT.md` 一个交付物;本 PLAN 与 `04-06-SUMMARY.md` 属计划/执行簿记,不算生产改动。"
|
||||
- "**只读硬约束(生产代码零改动)**:本 run 生产源码改动为 **0**——`git status --porcelain -- packages packages-user src` 在 Task 1 步骤 (0a) 起始逐行原样记录进 `## 方法`(规划日 2026-09-21 实测为「(无)」),Task 1 / Task 3 门禁断言其后**逐条一致**(不新增、不消失、状态码不变);`pnpm exec vue-tsc --noEmit` 在 Task 1 步骤 (0b) 记录**错误总行数**与 **material 相关错误行数**两个数字(规划日实测 **199 / 19**,其中 material 19 = `client-base` 7 + `client-modules` 12,非 material 180);**可失败的机器门禁只覆盖错误总行数**——Task 3 重跑 `pnpm exec vue-tsc --noEmit` 并以同一正则统计,断言其等于 Task 1 记录的错误总行数(不等即非零退出);**material / 非 material 的划分是规划日的人工归类**(口径须用户确认,见 assumptions),执行日以当日实测重新归类并逐行列出,其数字由人工复核保证、**不由任何门禁断言**(门禁只要求文档中逐行列出 material 相关错误锚点)。`files_modified` 只含 `04-MATERIAL-INTERFACE-IMPACT.md` 一个交付物;本 PLAN 与 `04-06-SUMMARY.md` 属计划/执行簿记,不算生产改动。"
|
||||
- "**A 类(已移除符号的剩余引用·引用侧)**:必须逐一登记 D-31 点名的 **7 个已移除符号** `IBigImageReturn` / `isBigImage` / `getBigImage` / `getIfBigImage` / `getBigImageByAlias` / `setBigImage` / `bigImageStore`,每个符号给出**引用侧 `file:line`**;`client-modules` 侧 9 处调用点一条不漏——`getIfBigImage` 7 处(`render/map/extension/door.ts:36,46`;`render/map/extension/hero.ts:239,364,428`;`render/map/renderer.ts:1250`;`render/map/vertex.ts:546`)、`bigImageStore` 1 处(`render/map/renderer.ts:652`)、`getBigImage` 1 处(`render/map/renderer.ts:653`);无调用点的 `setBigImage` / `isBigImage` / `getBigImageByAlias` 必须**显式登记为「调用点 0 处」**(不遗漏、不臆造);`IBigImageReturn` 的引用侧为 `client-base/src/material/manager.ts:20`(import 自 `./types`,该符号已不在基准导出中)。"
|
||||
- "**B 类(改名的剩余引用)必须给出机器证据的「0 命中」结论**:`IMaterialManager` → `ITextureManager`、`IMaterialGetter` → `ITextureGetter`、`IMaterialAliasGetter` → `ITextureAliasGetter`,三个旧名在**源码面**(`packages`、`packages-user`、`src`,排除 `node_modules`)的当日命中数必须为 **0**,并原样记录核对命令 `git grep -n -E \"IMaterialManager|IMaterialGetter|IMaterialAliasGetter\" -- packages packages-user src` 的输出;`.planning/graphs/graph.json` 与 `.planning/graphs/.last-build-snapshot.json` 中仍存在的 `IMaterialManager` / `IMaterialGetter` 标签属**过期工装态**(快照时间戳 2026-09-07,早于 `4e305e3` 的 2026-09-21),只作 E 类登记,**不得**算作源码命中、**不得**作为基准。"
|
||||
- "**C 类(新增与收紧约束的未实现)必须逐实现类登记 5 项,并带当日实测错误码**:① `ITextureManager.textures`(基准 `client-base/src/material/types.ts:262-263`)未实现于 `MaterialManager`(`material/manager.ts:38`,成员停在 `tileStore`/`tilesetStore`/`imageStore`/`assetStore`/`bigImageStore`,无 `textures`)→ 实测 `client.ts:84` 报 TS2739;②③④⑤ `ICoreStateExtended`(定义源 `packages-user/data-state/src/types.ts:45-49`)被 `ITextureManager`(`material/types.ts:261`)、`IAutotileProcessor`(`:104`)、`IAssetBuilder`(`:430`)、`ITrackedAssetData`(`:462-463`)四处 `extends`,而四个实现类 `MaterialManager`(`manager.ts:38`)、`AutotileProcessor`(`autotile.ts:42`)、`AssetBuilder`(`builder.ts:12`)、`TrackedAssetData`(`builder.ts:99`)**均无 `state` 成员** → 实测 `manager.ts:38`/`autotile.ts:42`/`builder.ts:12`/`builder.ts:99` 报 TS2420,构造点 `manager.ts:86`(`new AssetBuilder(this)`)、`builder.ts:91`(`TrackedAssetData`)、`client.ts:85`(`new AutotileProcessor(this.materials)`)、`render/map/renderer.ts:234`(`new AutotileProcessor(manager)`)报 TS2741。`state` 的语义来源与注入方式**不在本步裁定**(进 F 类)。"
|
||||
@ -33,7 +33,7 @@ must_haves:
|
||||
- "**`## 基准变更(4e305e3)` 与 `## 类型门禁实测基线` 两节必须齐备**:前者逐条记录三类差异(移除 7 符号 / 改名 3 接口 / 新增 `textures` 与 4 处 `ICoreStateExtended` 约束)并点名定义源 `packages-user/data-state/src/types.ts:45-49`,核对方式为 `git show 4e305e3 -- packages-user/client-base/src/types.ts packages-user/client-base/src/material/types.ts` 与当日工作树逐条比对;后者逐字记录 `pnpm exec vue-tsc --noEmit` 的 `- **错误总行数**:<n>` 与 `- **material 相关错误行数**:<n>`(规划日实测 199 / 19,执行日以实测为准)并逐行列出 material 相关错误,同时单列与本改动无关的既有错误(data-state / data-base / data-system 的测试与寻路、`client-base/src/load/loader.ts` 与 `client-modules/src/{core.ts,render/ui/load.tsx}` 的加载系统重构结果)——**不得**把它们算作本次 material 改动的后果。"
|
||||
- "**第二步(修改工作)不被规划**:文档只清点、分类、分组,**不含**修复方案、不含代码改动建议、不产出 `04-07-PLAN.md` 或任何新 `*-PLAN.md`;`## 处置` 明写「第一步只读清点完成;第二步(material 接口适应实施)待用户审阅本文件后另行规划」(D-32),并保留第一条清点步骤与第六条材料的原话口径。"
|
||||
- "**REND-01 / REND-02 在本 run 后仍保持 Pending**:本计划只清点 material 接口的影响面,既未实施 material 适应,也未实施移动端 / 桌面端双布局(见 assumptions 的两条 FLAGGED ASSUMPTION)。"
|
||||
- "**验证可运行且不臆造通过**:本计划的「运行结果」= 只读门禁(porcelain 基线逐条一致 + 类型错误总数与 material 子集一致)+ 静态内容门禁(11 节结构、A–F 六类行数下限与关键词、每行 ≥2 个 `file:line` 锚点、B 类 0 命中、E 类只报告口径)+ 既有计划保护门禁(`04-05-PLAN.md` / `04-05-SUMMARY.md` porcelain 为空)+ 计划文件范围门禁(不得出现 `04-07+`)+ CRLF 门禁 + 人工代码复核;本步为只读清点,**无运行时行为可观察**,故不得以任何无法运行的门禁冒充通过。"
|
||||
- "**验证可运行且不臆造通过**:本计划的「运行结果」= 只读门禁(porcelain 基线逐条一致 + 类型错误**总行数**与记录值一致;material 子集为规划日人工归类、逐行列出并由人工复核,**不由门禁断言**)+ 静态内容门禁(11 节结构、A–F 六类行数下限与关键词、每行 ≥2 个 `file:line` 锚点、B 类 0 命中、E 类只报告口径)+ 既有计划保护门禁(`04-05-PLAN.md` / `04-05-SUMMARY.md` porcelain 为空)+ 计划文件范围门禁(不得出现 `04-07+`)+ CRLF 门禁 + 人工代码复核;本步为只读清点,**无运行时行为可观察**,故不得以任何无法运行的门禁冒充通过。"
|
||||
artifacts:
|
||||
- path: .planning/phases/04-render-adaptation/04-MATERIAL-INTERFACE-IMPACT.md
|
||||
provides: "`4e305e3` material 接口基准在 `packages-user` 全量的只读影响台帐:元信息块 + 背景 / 方法 / 基准变更(4e305e3)/ 类型门禁实测基线 / A 已移除符号的剩余引用 / B 改名的剩余引用 / C 新增与收紧约束的未实现 / D big-image 残留(实现与消费者)/ E 范围外命中(仅报告)/ F 未能从阅读确定(未猜测)/ 处置;每行含接口或成员名 + 命中处 `file:line` + 基准侧锚点 + 问题描述 + 影响 + 置信,供用户审阅后另行规划第二步"
|
||||
@ -44,7 +44,7 @@ must_haves:
|
||||
- "`client-modules` 的消费者调用点(`render/map/extension/door.ts:36,46`、`render/map/extension/hero.ts:239,364,428`、`render/map/renderer.ts:652,653,1250`、`render/map/vertex.ts:546`)↔ 基准 `ITextureManager` 上已不存在的成员 → 实测 9 条 `error TS2339` / `TS2551`"
|
||||
- "构造 / 接线面(`client-modules/src/client.ts:84` 的 `new MaterialManager()`、`client.ts:85` 的 `new AutotileProcessor(this.materials)`、`render/map/renderer.ts:234` 的 `new AutotileProcessor(manager)`、`manager.ts:86` 的 `new AssetBuilder(this)`、`builder.ts:28` 的 `new TrackedAssetData(materials, this)`)—— `state` 与 `textures` 的注入/实现面必须在本清点文件中登记,本步不作裁定"
|
||||
- "`git status --porcelain -- packages packages-user src`(Task 1 步骤 (0a) 逐行记录)↔ Task 1 / Task 3 门禁的逐条一致断言 ↔ 只读(生产代码零改动)证明"
|
||||
- "`pnpm exec vue-tsc --noEmit` 的错误总行数与 material 相关子集(Task 1 步骤 (0b) 记录、规划日实测 199 / 19)↔ Task 3 门禁的重跑一致断言 ↔ 只读证明"
|
||||
- "`pnpm exec vue-tsc --noEmit` 的错误**总行数**(Task 1 步骤 (0b) 记录、规划日实测 199)↔ Task 3 门禁的重跑一致断言 ↔ 只读证明;material 相关子集(规划日 19 = `client-base` 7 + `client-modules` 12)为规划日人工归类、逐行列出,执行日按当日实测重新归类并由人工复核,**不是门禁断言项**"
|
||||
assumptions:
|
||||
- "**FLAGGED ASSUMPTION(specless fallback)— REND-01 edge unresolved:** 未提供 REND-01(渲染端适配新数据层接口)的验收边界;本计划**不发明**阈值,只交付 material 接口影响的只读清点(D-30 / D-31 / D-32 第一步)。用户须在推进第二步与其余渲染适配前补齐 REND-01 的边界判据。"
|
||||
- "**FLAGGED ASSUMPTION(specless fallback)— REND-02 edge unresolved:** 未提供 REND-02(移动端与桌面端双布局)的验收边界;本计划不涉及双布局,也不发明其验收阈值。"
|
||||
@ -95,7 +95,7 @@ Phase 4 第六个增量(用户裁定 2026-09-21 · D-30 / D-31 / D-32 **第一
|
||||
| E | 范围外(`src/`、`packages/`、`.planning/graphs/*`、依赖声明) | 只报告,不修改、不建议 |
|
||||
| F | 未能从阅读确定 | 只登记,不得写成错配 / 缺失 / 残留 |
|
||||
|
||||
**规划日实测(作为起点与门禁下限,执行日以当日实测为准):**
|
||||
**规划日实测(A–F 各类命中数为内容门禁下限;类型错误总行数为机器门禁断言值、material 子集为规划日人工归类;执行日一律以当日实测为准):**
|
||||
|
||||
| 类别 | 规划日实测结果(2026-09-21,HEAD `4e305e3`,工作树) |
|
||||
|---|---|
|
||||
@ -186,7 +186,7 @@ Phase 4 第六个增量(用户裁定 2026-09-21 · D-30 / D-31 / D-32 **第一
|
||||
- **改名 3 个接口**:`IMaterialManager` → `ITextureManager`、`IMaterialGetter` → `ITextureGetter`、`IMaterialAliasGetter` → `ITextureAliasGetter`。
|
||||
- **新增 / 收紧约束**:`ITextureManager` 新增 `readonly textures: ITextureStore`(`material/types.ts:262-263`),且由 `ITextureManager`(`:261`)、`IAutotileProcessor`(`:104`)、`IAssetBuilder`(`:430`)、`ITrackedAssetData`(`:462-463`)四处 `extends ICoreStateExtended`(定义源 `packages-user/data-state/src/types.ts:45-49`:`readonly state: ICoreState`)。
|
||||
|
||||
③ **规划日实测的影响面(作为起点与门禁下限)**:`pnpm exec vue-tsc --noEmit` 当前 **199** 条错误,其中 **19** 条由本次 material 接口改动直接造成(`client-base` 7 条 + `client-modules` 12 条);其余 180 条属用户既有的加载系统重构 / 寻路 / 测试等,**不算**本改动的后果(该划分口径须用户确认)。具体:A 类 `client-modules` 侧 **9** 处调用点(`getIfBigImage` 7 处:`door.ts:36,46`、`hero.ts:239,364,428`、`renderer.ts:1250`、`vertex.ts:546`;`bigImageStore` 1 处:`renderer.ts:652`;`getBigImage` 1 处:`renderer.ts:653`)+ `manager.ts:20` 的 `IBigImageReturn` import;B 类源码面 **0** 命中;C 类 **5** 项(`textures` 未实现 + 4 个实现类缺 `state`);D 类 `MaterialManager` **10** 项 + `cache.ts` legacy 路径 1 项;E 类 `src/types/declaration/*` **5** 处、`packages/` **0** 命中、`.planning/graphs/*` 过期标签、`client-base/package.json` 未声明 `@user/data-state`。
|
||||
③ **规划日实测的影响面(A–F 各类命中数为内容门禁下限;类型错误总行数为机器门禁断言值、material 子集为规划日人工归类)**:`pnpm exec vue-tsc --noEmit` 当前 **199** 条错误,其中 **19** 条由本次 material 接口改动直接造成(`client-base` 7 条 + `client-modules` 12 条);其余 180 条属用户既有的加载系统重构 / 寻路 / 测试等,**不算**本改动的后果(该划分口径须用户确认)。具体:A 类 `client-modules` 侧 **9** 处调用点(`getIfBigImage` 7 处:`door.ts:36,46`、`hero.ts:239,364,428`、`renderer.ts:1250`、`vertex.ts:546`;`bigImageStore` 1 处:`renderer.ts:652`;`getBigImage` 1 处:`renderer.ts:653`)+ `manager.ts:20` 的 `IBigImageReturn` import;B 类源码面 **0** 命中;C 类 **5** 项(`textures` 未实现 + 4 个实现类缺 `state`);D 类 `MaterialManager` **10** 项 + `cache.ts` legacy 路径 1 项;E 类 `src/types/declaration/*` **5** 处、`packages/` **0** 命中、`.planning/graphs/*` 过期标签、`client-base/package.json` 未声明 `@user/data-state`。
|
||||
|
||||
④ **大致解决方案**:只读清点,唯一交付物 `.planning/phases/04-render-adaptation/04-MATERIAL-INTERFACE-IMPACT.md`;11 节结构(`背景` / `方法` / `基准变更(4e305e3)` / `类型门禁实测基线` / `A 已移除符号的剩余引用` / `B 改名的剩余引用` / `C 新增与收紧约束的未实现` / `D big-image 残留(实现与消费者)` / `E 范围外命中(仅报告)` / `F 未能从阅读确定(未猜测)` / `处置`);A–E 每节固定列序表(`ID | 接口/成员名 | 命中处 | 基准侧锚点 | 问题描述 | 影响 | 置信`),每行 ≥2 个 `file:line` 锚点;**分列规则**:A = 消费者调用点、D = `client-base` 内已不属接口的实现残留与 `cache.ts` 的 legacy 概念路径(二者分列并互相引用);F 类只登记不判定。重型整文件读取可按 **D-09** 派**只读**子代理(仅回传事实表,不得写文件)。
|
||||
|
||||
@ -194,7 +194,7 @@ Phase 4 第六个增量(用户裁定 2026-09-21 · D-30 / D-31 / D-32 **第一
|
||||
|
||||
⑥ **计划号冲突(必须原样告知用户)**:phase 目录下**已存在** `04-05-PLAN.md` 与 `04-05-SUMMARY.md`(第五个增量·`#04-01-M-06` / `#04-01-M-09` 收口,2026-09-20 已执行;其改动 `RendererLayerHook`(`render/map/renderer.ts:435,1775`)与 `client.hero.attribute.getFinalAttribute`(`render/ui/main.tsx:103+`)在工作树中)。编排给定的「04-05」与该存量冲突,故本计划按顺序号落为 **04-06**,`depends_on` 列 04-01..04-04 以保持 `wave: 5`;**04-05 一律不得改写 / 覆盖 / 改号**。请用户确认 04-06 这一编号(或指定其它编号,但须先裁决 04-05 存量产物的归属)。
|
||||
|
||||
⑦ **验证方式与只读证明(须原样告知)**:本步为只读清点,**无运行时行为可观察**。证明方式 = ①**只读门禁**:`git status --porcelain -- packages packages-user src` 在 Task 1 起始逐行记录(规划日实测为「(无)」),Task 1 / Task 3 断言其后逐条一致;②**类型门禁一致性**:`pnpm exec vue-tsc --noEmit` 的错误总行数与 material 子集(规划日 199 / 19)记录后,Task 3 重跑断言完全一致;③**静态内容门禁**:11 节结构、A–F 行数下限与关键词、每行 ≥2 个 `file:line` 锚点、B 类 0 命中、E 类只报告口径;④**既有计划保护门禁**:`04-05-PLAN.md` / `04-05-SUMMARY.md` 的 porcelain 为空;⑤**计划范围门禁**:不得出现 `04-07+`;⑥**CRLF 门禁**;⑦**人工代码复核**。**不冒充任何无法运行的门禁。**
|
||||
⑦ **验证方式与只读证明(须原样告知)**:本步为只读清点,**无运行时行为可观察**。证明方式 = ①**只读门禁**:`git status --porcelain -- packages packages-user src` 在 Task 1 起始逐行记录(规划日实测为「(无)」),Task 1 / Task 3 断言其后逐条一致;②**类型门禁一致性**:`pnpm exec vue-tsc --noEmit` 在 Task 1 起始记录**错误总行数**与 material 子集两个数字(规划日 199 / 19),Task 3 重跑**只断言错误总行数**与记录值一致;material / 非 material 的划分属规划日人工归类(口径须用户确认),执行日按实测重新归类并逐行列出,由人工复核保证,**不作为机器门禁**;③**静态内容门禁**:11 节结构、A–F 行数下限与关键词、每行 ≥2 个 `file:line` 锚点、B 类 0 命中、E 类只报告口径;④**既有计划保护门禁**:`04-05-PLAN.md` / `04-05-SUMMARY.md` 的 porcelain 为空;⑤**计划范围门禁**:不得出现 `04-07+`;⑥**CRLF 门禁**;⑦**人工代码复核**。**不冒充任何无法运行的门禁。**
|
||||
|
||||
⑧ **第二步不被规划**:本 run **不含**修复方案、不含代码改动建议、不产出 `04-07+`;第二步(material 接口适应实施)待用户审阅本清点文件后另行规划(D-32)。
|
||||
|
||||
@ -341,6 +341,7 @@ Phase 4 第六个增量(用户裁定 2026-09-21 · D-30 / D-31 / D-32 **第一
|
||||
|
||||
(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-MATERIAL-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 \u5df2\u79fb\u9664\u7b26\u53f7');const B=seg('## B \u6539\u540d\u7684\u5269\u4f59\u5f15\u7528');const C=seg('## C \u65b0\u589e\u4e0e\u6536\u7d27\u7ea6\u675f');const D=seg('## D big-image');const E=seg('## E \u8303\u56f4\u5916\u547d\u4e2d');const 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-06-[ABCDE]-\d+\s*\|/gm);const anch=l=>cnt(l,/[A-Za-z0-9_\-.\/]+\.tsx?:\d+/g);const problems=[];if(rows(A)<9)problems.push('A ROWS '+rows(A));if(rows(C)<5)problems.push('C ROWS '+rows(C));if(rows(D)<9)problems.push('D ROWS '+rows(D));if(rows(E)<5)problems.push('E ROWS '+rows(E));if(cnt(F,/^- \*\*#04-06-F-\d+/gm)<5)problems.push('F ITEMS '+cnt(F,/^- \*\*#04-06-F-\d+/gm));for(const pair of [['A',A],['C',C],['D',D],['E',E]]){const bad=pair[1].split(/\r?\n/).filter(l=>/^\|\s*#04-06-[ABCDE]-\d+\s*\|/.test(l)).filter(l=>anch(l)<2);if(bad.length>0)problems.push(pair[0]+' ROWS WITHOUT TWO-SIDED ANCHOR '+bad.length)}const rm=['IBigImageReturn','isBigImage','getBigImage','getIfBigImage','getBigImageByAlias','setBigImage','bigImageStore'];const missA=rm.filter(k=>A.indexOf(k)<0);if(missA.length>0)problems.push('A MISSING SYMBOLS '+missA.join('|'));const missB=['IMaterialManager','IMaterialGetter','IMaterialAliasGetter'].filter(k=>B.indexOf(k)<0);if(missB.length>0)problems.push('B MISSING OLD NAMES '+missB.join('|'));const missC=['textures','MaterialManager','AutotileProcessor','AssetBuilder','TrackedAssetData','ICoreStateExtended'].filter(k=>C.indexOf(k)<0);if(missC.length>0)problems.push('C MISSING '+missC.join('|'));const missD=['bigImageStore','bigImageData','bigImageId','setBigImage','isBigImage','getBigImageByAlias','IBigImageReturn','cache.ts'].filter(k=>D.indexOf(k)<0);if(missD.length>0)problems.push('D MISSING '+missD.join('|'));if(E.indexOf('src/types/declaration')<0)problems.push('E MISSING SRC DECL');if(E.indexOf('.planning/graphs')<0)problems.push('E MISSING GRAPH ARTIFACT');if(problems.length>0){console.error('CATEGORY GATE FAILED '+problems.join(' ; '));process.exit(1)}console.log('OK A '+rows(A)+' C '+rows(C)+' D '+rows(D)+' E '+rows(E)+' F '+cnt(F,/^- \*\*#04-06-F-\d+/gm))"</automated>
|
||||
<fails_when>non-zero exit, 或 stderr 含 "CATEGORY GATE FAILED"(A/C/D/E 任一类行数低于下限、任一行缺命中处或基准侧锚点、A 未覆盖 7 个已移除符号、B 未列三个旧名、C 未覆盖 `textures` 与四个实现类、D 未覆盖关键残留成员或 `cache.ts`、E 未覆盖 `src/types/declaration` 与 `.planning/graphs`、F 少于 5 条未确定项)</fails_when>
|
||||
@ -441,7 +442,7 @@ Phase 4 第六个增量(用户裁定 2026-09-21 · D-30 / D-31 / D-32 **第一
|
||||
|
||||
<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)"` 的输出等于文档记录的「错误总行数」(规划日 199),且「material 相关错误行数」(规划日 19 = `client-base` 7 + `client-modules` 12)在文档中逐行有对应的数据行。
|
||||
- **类型门禁一致性**:`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)"` 的输出等于文档记录的「错误总行数」(规划日 199);「material 相关错误行数」(规划日 19 = `client-base` 7 + `client-modules` 12)为规划日人工归类、执行日按当日实测重新归类,只要求文档逐行列出(**非机器断言**,由人工复核保证)。
|
||||
- **类别门禁**:交付文档的 A ≥ 9 行 / C ≥ 5 行 / D ≥ 9 行 / E ≥ 5 行 / F ≥ 5 条,A–E 每行 ≥2 个 `file:line` 锚点,A 覆盖全部 7 个已移除符号,B 覆盖三个旧接口名,C 覆盖 `textures` 与四个实现类,D 覆盖关键残留成员与 `cache.ts`,E 覆盖 `src/types/declaration` 与 `.planning/graphs`。
|
||||
- **B 类 0 命中复验**:`git grep -n -E "IMaterialManager|IMaterialGetter|IMaterialAliasGetter" -- packages packages-user src` 无输出。
|
||||
- **既有计划保护 + 计划范围门禁**:`git status --porcelain -- .planning/phases/04-render-adaptation/04-05-PLAN.md .planning/phases/04-render-adaptation/04-05-SUMMARY.md` 为空;phase 目录内 `-PLAN.md` 仅 `04-01..04-06`;`04-06-SUMMARY.md` 已存在。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user