From c9bf0c63a849d7d923106a9e3e9fbccd039fa5f2 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Thu, 24 Sep 2026 13:12:15 +0800 Subject: [PATCH] docs(04-10): fix ledger section count (10 sections + metadata block) --- .../phases/04-render-adaptation/04-10-PLAN.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.planning/phases/04-render-adaptation/04-10-PLAN.md b/.planning/phases/04-render-adaptation/04-10-PLAN.md index be7a6a4..b609c08 100644 --- a/.planning/phases/04-render-adaptation/04-10-PLAN.md +++ b/.planning/phases/04-render-adaptation/04-10-PLAN.md @@ -26,7 +26,7 @@ estimate: confidence: low must_haves: truths: - - "**本计划的第一个 block 点是 Task 0 的 `blocking-human` 汇报关卡(AGENTS.md 硬要求)**:Task 0 必须先向用户汇报「要解决的问题(`packages-user/client-modules/src/render/` 下的通用渲染内容放错层,须下沉到渲染系统层 `packages-user/client-base/src/`)、锁定裁定(D-51..D-57:移植集合 / 目标布局 / 不移植集合 / legacy 不考虑 / 用户并发改动不可触碰 / 第一步交付物)、大致解决方案(只读影响清点,唯一交付物 `04-STRUCTURE-MIGRATION-IMPACT.md`,11 节结构 / A–F 六类分列 / 每行 ≥2 个 `file:line` 锚点)、**本步为只读、不引入任何命名变更**(不新增 / 不改名任何公共、受保护、私有成员或字段,也不裁定 `client-base/src/{components,elements,map,layout}` 下的文件名 / barrel 名)、验证方式与只读证明」,然后必须**停下等待**用户明确回复「可以执行」四个字;收到该回复前不得执行任何任务、不得派发任何执行子代理。无论触发方式(`/gsd-execute-phase`、`/gsd-manager`、`/gsd-autonomous`、子代理/执行器派发)或配置模式(`.planning/config.json` 的 `mode: yolo`、`workflow.auto_advance`)如何,均不得自动放行。" + - "**本计划的第一个 block 点是 Task 0 的 `blocking-human` 汇报关卡(AGENTS.md 硬要求)**:Task 0 必须先向用户汇报「要解决的问题(`packages-user/client-modules/src/render/` 下的通用渲染内容放错层,须下沉到渲染系统层 `packages-user/client-base/src/`)、锁定裁定(D-51..D-57:移植集合 / 目标布局 / 不移植集合 / legacy 不考虑 / 用户并发改动不可触碰 / 第一步交付物)、大致解决方案(只读影响清点,唯一交付物 `04-STRUCTURE-MIGRATION-IMPACT.md`,10 节结构 / A–F 六类分列 / 每行 ≥2 个 `file:line` 锚点)、**本步为只读、不引入任何命名变更**(不新增 / 不改名任何公共、受保护、私有成员或字段,也不裁定 `client-base/src/{components,elements,map,layout}` 下的文件名 / barrel 名)、验证方式与只读证明」,然后必须**停下等待**用户明确回复「可以执行」四个字;收到该回复前不得执行任何任务、不得派发任何执行子代理。无论触发方式(`/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-24 实测为 ` M packages-user/data-base/src/enemy/types.ts` 单条,属用户并发改动 D-56),Task 1 / Task 3 门禁断言其后**逐条一致**(不新增、不消失、状态码不变);`files_modified` 只含 `04-STRUCTURE-MIGRATION-IMPACT.md` 一个交付物;本 PLAN 与 `04-10-SUMMARY.md` 属计划/执行簿记,不算生产改动。" - "**被移集合清单完整(39 个文件,一个不少、一个不多)**:`## 被移集合清单(39 文件)` 必须逐条列出 D-52 明示的移植集合全部文件并给出各文件职责与 D-53 目标落点——`render/components/` **13** 个(`choices.tsx` / `floorSelect.tsx` / `icons.tsx` / `index.ts` / `input.tsx` / `list.tsx` / `misc.tsx` / `page.tsx` / `scroll.tsx` / `textbox.tsx` / `textboxTyper.ts` / `thumbnail.tsx` / `tip.tsx`)、`render/elements/` **5** 个(`cache.ts` / `index.ts` / `misc.ts` / `props.ts` / `types.ts`)、`render/map/` **20** 个(`block.ts` / `constant.ts` / `element.ts` / `index.ts` / `moving.ts` / `renderer.ts` / `status.ts` / `types.ts` / `vertex.ts` / `viewport.ts` + `extension/{door,hero,index,manager,text,types}.ts` **6** + `shader/{back.frag,back.vert,map.frag,map.vert}` **4**)、`render/utils/layout.ts` **1**;并写明目标落点(三个文件夹直接落 `client-base/src/{components,elements,map}/`,`layout.ts` 单独开 `client-base/src/layout/`,**不新建 `render/` 目录**),且明写本步**不移动、不复制、不预建**任何目标文件。" - "**A 类(被移集合内部交叉引用)逐条给两侧 `file:line` 锚点**:至少覆盖 ① `components → elements`(`tip.tsx:7` / `textbox.tsx:33` / `textboxTyper.ts:5`);② `elements → map`(`elements/index.ts:2` / `elements/props.ts:4`);③ 被移集合 → **留在 `render/` 顶层**的 `renderer`(`elements/index.ts:3` / `components/textboxTyper.ts:6` / `components/misc.tsx:14`);④ 被移集合 → **留在 `render/`** 的 `use.ts`(`components/choices.tsx:8` / `tip.tsx:4` / `scroll.tsx:31` / `input.tsx:14` / `misc.tsx:10`);⑤ 被移集合 → **`client-modules/src/shared.ts`**(`map/vertex.ts:25` / `map/element.ts:5` / `map/renderer.ts:53` / `map/extension/door.ts:9`);⑥ 被移集合 → **`@user/client-base`(自包引用)**(`map/extension/hero.ts:16` / `map/moving.ts:3` / `map/renderer.ts:13` / `map/types.ts:12` / `map/vertex.ts:28`);⑦ `map/extension/*` → `map/types`(`extension/{door.ts:7,hero.ts:13,manager.ts:8,types.ts:4,text.ts:8}`)。**每行须含「导入处 `file:line`」+「被导入符号的声明 / barrel `file:line`」两个锚点。**" @@ -37,7 +37,7 @@ must_haves: - "**F 类(未能从阅读确定·未猜测)非空且只登记不判定**,至少覆盖:① 目标文件名(`client-base/src/layout/layout.ts` 还是 `layout/index.ts`;`client-base/src/{components,elements,map}/index.ts` 是否沿用同名 barrel)——**命名须用户反馈并获同意后才能使用**(AGENTS.md);② `client-base/src/index.ts` 是否新增 `export * from './{components,elements,map,layout}'`(导出面是否扩张 / 如何补 `render/index.tsx` 的断链);③ 被移集合对留在 `client-modules` 的 `shared.ts` / `renderer` / `use.ts` / `render/utils` 的依赖如何解耦;④ `@user/client-base` 自包引用的改写方式;⑤ `render/utils/index.ts` 在 `layout.ts` 移出后的归属(D-54 明示 `utils/index.ts` 不移植 ⇒ 断链处置);⑥ `client-base/package.json` 的依赖缺口是否在第二步补齐(D-37 有先例,本步不裁定);⑦ shader `?raw` 在 `client-base` 构建链下是否仍可用;⑧ `packages/legacy-ui` 经 `Mota.require('@user/client-modules')` 运行时取 `mainRenderer` / `client` 的插件面影响(legacy);⑨ `render/elements/index.ts` 的 `createElements()` 注册点(`mainRenderer.registerElement(...)`)在 `client-base` 无渲染器实例时如何接线。**不得把本类任何一条写成错配、缺失、残留或待办。**" - "**第二步(移植实施)不被规划**:文档只清点、分类、定位、分组,**不含**移植方案、不含 import 重写方案、不含任何代码改动建议、不产出 `04-11-PLAN.md` 或任何新 `*-PLAN.md`;`## 处置` 明写「第一步只读清点完成;第二步(移植实施)待用户审阅本文件后另行规划」(D-51 / D-57)。" - "**REND-01 / REND-02 在本 run 后仍保持 Pending**:本计划只清点结构性重构(分层纠正)的影响面,既未实施移植,也未实施渲染端接口适配与移动端 / 桌面端双布局(见 assumptions 的两条 FLAGGED ASSUMPTION)。" - - "**验证可运行且不臆造通过**:本计划的「运行结果」= 只读门禁(porcelain 基线逐条一致 + 用户 `04-CONTEXT.md` 未提交改动仍在)+ 静态内容门禁(11 节结构、被移集合 39 文件路径齐备、A–F 六类行数下限与关键词、每行 ≥2 个 `file:line` 锚点、F 类条数)+ 机器证据复验(`client-base` 对 `client-modules` 零反向引用、被移集合对 `ui`/`fx`/`weather` 零引用、`packages` / `src` 对 `render/(components|elements|map)` 零命中)+ 既有产物保护门禁(`04-01..04-09-*` 的 porcelain 为空)+ 计划文件范围门禁(phase 目录内不得出现 `04-11+`)+ CRLF 门禁 + 人工代码复核;本步为只读清点,**无运行时行为可观察**,故不得以任何无法运行的门禁冒充通过。" + - "**验证可运行且不臆造通过**:本计划的「运行结果」= 只读门禁(porcelain 基线逐条一致 + 用户 `04-CONTEXT.md` 未提交改动仍在)+ 静态内容门禁(10 节结构、被移集合 39 文件路径齐备、A–F 六类行数下限与关键词、每行 ≥2 个 `file:line` 锚点、F 类条数)+ 机器证据复验(`client-base` 对 `client-modules` 零反向引用、被移集合对 `ui`/`fx`/`weather` 零引用、`packages` / `src` 对 `render/(components|elements|map)` 零命中)+ 既有产物保护门禁(`04-01..04-09-*` 的 porcelain 为空)+ 计划文件范围门禁(phase 目录内不得出现 `04-11+`)+ CRLF 门禁 + 人工代码复核;本步为只读清点,**无运行时行为可观察**,故不得以任何无法运行的门禁冒充通过。" artifacts: - path: .planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md provides: "渲染端结构性重构(通用内容由 `client-modules/src/render/` 迁往 `client-base/src/`,D-51..D-57)**第一步·只读影响台账**:元信息块 + 背景 / 方法 / 被移集合清单(39 文件,含各文件职责与目标落点)/ A 被移集合内部交叉引用 / B 外部导入点 / C barrel 与导出面 / D 分层与循环依赖风险 / E legacy 命中(仅报告)/ F 未能从阅读确定(未猜测)/ 处置;每行含文件或符号名 + 命中处 `file:line` + 目标锚点 `file:line` + 问题描述 + 影响 + 置信,供用户审阅后裁定第二步的移植方案与 import 重写集" @@ -87,7 +87,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) 5. **用户并发改动不可触碰(D-56)**:用户正在并发修改数据端(规划日基线已含 ` M packages-user/data-base/src/enemy/types.ts`);一律零触碰、零提交。 6. **本步零命名变更**:只读清点不引入任何公共 / 受保护 / 私有成员或字段的命名变更,也不裁定目标文件名 / barrel 名(命名须先向用户反馈并获同意,AGENTS.md)。 -**大致解决方案:** 只做**只读清点**,产出唯一交付物 `.planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md`。文档 11 节(外加 6 行元信息块):`## 背景` / `## 方法` / `## 被移集合清单(39 文件)` / `## A 被移集合内部交叉引用` / `## B 外部导入点` / `## C barrel 与导出面` / `## D 分层与循环依赖风险` / `## E legacy 命中(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`。A–E 每节一张**固定列序**表 `| ID | 文件/符号 | 命中处(源) | 目标锚点 | 问题描述 | 影响 | 置信 |`,**每行至少两个 `file:line` 锚点**(源侧 + 目标 / 基准侧),一条记录只归一类、跨类拆条并互相引用;F 类逐条登记静态阅读无法定论项(只登记不判定)。 +**大致解决方案:** 只做**只读清点**,产出唯一交付物 `.planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md`。文档 10 节(外加 6 行元信息块):`## 背景` / `## 方法` / `## 被移集合清单(39 文件)` / `## A 被移集合内部交叉引用` / `## B 外部导入点` / `## C barrel 与导出面` / `## D 分层与循环依赖风险` / `## E legacy 命中(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`。A–E 每节一张**固定列序**表 `| ID | 文件/符号 | 命中处(源) | 目标锚点 | 问题描述 | 影响 | 置信 |`,**每行至少两个 `file:line` 锚点**(源侧 + 目标 / 基准侧),一条记录只归一类、跨类拆条并互相引用;F 类逐条登记静态阅读无法定论项(只登记不判定)。 **分列规则(写死,防止类别互相冒充):** @@ -131,7 +131,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) | CONTEXT | D-54 | 不移植 `render/utils/` 其余(`index.ts` / `saves.ts` / `use.ts`);`ui` / `fx` / `weather` 与 `render` 顶层文件均不移植 | 04-10 | COVERED(边界) | 台账把 `render/use.ts`、`render/renderer.ts`、`render/utils/index.ts`、`saves.ts`、`fallback/ui.ts` 登记为「留下但被引用」的反向依赖候选 / 第二步必改点 | | CONTEXT | D-55 | 不考虑任何 legacy:legacy 报错不管、不修、不登记为待办;只报告 | 04-10 | COVERED(排除) | `## E legacy 命中(仅报告)` 标题下明写该边界;prohibitions 明列不得把 legacy 写成问题 / 待办 | | CONTEXT | D-56 | 用户会同步进行其它修改;不得触碰、不得提交用户的并发改动 | 04-10 | COVERED | Task 1 步骤 (0a) 逐行记录当日基线(规划日含 ` M packages-user/data-base/src/enemy/types.ts`);Task 1 / Task 3 门禁断言逐条一致并断言 `04-CONTEXT.md` 未提交改动仍在;prohibitions 明列 | -| CONTEXT | D-57 | 第一步 = 只读影响清点,至少覆盖:被移文件清单 / 内部交叉引用 / 外部导入点(含其它 monorepo 包)/ barrel 导出现状 / `package.json` 依赖现状 / 分层与循环依赖风险(`client-base` 不得反向依赖 `client-modules`)/ legacy 命中 / 未确定项;生产代码零改动 | 04-10 | COVERED | 11 节结构与 A–F 六类一一对应:清单节 / A / B / C / D(含 `package.json`)/ E / F;Task 3 门禁逐项断言 | +| CONTEXT | D-57 | 第一步 = 只读影响清点,至少覆盖:被移文件清单 / 内部交叉引用 / 外部导入点(含其它 monorepo 包)/ barrel 导出现状 / `package.json` 依赖现状 / 分层与循环依赖风险(`client-base` 不得反向依赖 `client-modules`)/ legacy 命中 / 未确定项;生产代码零改动 | 04-10 | COVERED | 10 节结构与 A–F 六类一一对应:清单节 / A / B / C / D(含 `package.json`)/ E / F;Task 3 门禁逐项断言 | | CONTEXT | D-33 | 范围外一律不改;不追求解决全部类型错误 | 04-10 | COVERED(边界) | 本步零代码改动;`packages/` 与 `src/` 仅报告 | | CONTEXT | D-42 / D-49 | `client-base/src/material/` 归用户、AI 不得改;不考虑 legacy 兼容 | 04-10 | COVERED(边界) | 本步不触碰 `material/`;legacy 归 E 类只报告 | | CONTEXT | D-07 / D-09 | 记录精确到符号 + 所属文件;允许派只读子代理扫描 | 04-10 | COVERED(粒度) | 固定列序 + 每行 ≥2 个 `file:line` 锚点 + 门禁机器判定;Task 2 允许只读子代理回传事实表 | @@ -193,7 +193,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) ③ **规划日实测的影响面(2026-09-24,HEAD `3bc37b5`,分支 `refine/data-client`;执行日以当日实测为准)**:A 类内部交叉引用 **8** 个方向(约 30 处)——`components→elements` 3(`tip.tsx` / `textbox.tsx` / `textboxTyper.ts`)、`elements→map` 2(`elements/index.ts` / `elements/props.ts`)、→ 留在 `render/` 的 `renderer` 3、→ 留在 `render/` 的 `use.ts` 5、→ `client-modules/src/shared.ts` 4(`map/vertex.ts` / `map/element.ts` / `map/renderer.ts` / `map/extension/door.ts`)、→ `@user/client-base` 自包引用 5、`map/extension/*→map/types` 5;另记「被移集合 → `ui`/`fx`/`weather` **0** 命中」的机器证据。B 类外部导入点 **8** 个文件族(约 17 处)——`client-modules/src/{client.ts:25,types.ts:2}`、`render/index.tsx:5,45,46`、`render/ui` 8 文件 10 处、`render/utils/saves.ts:2`、`render/utils/index.ts:1`(barrel 引用被移文件)、`fallback/ui.ts:2`;另有 3 个包经 `@user/client-modules` 公共面间接依赖(`entry-client/src/create.ts:10,27`、`entry-data/src/mota.ts:11,32`、`packages/legacy-ui/src/preset/ui.ts:86,96,105`);`packages/` 与 `src/` 对 `render/components|elements|map` **零命中**。C 类 barrel **7** 个节点(`components/index.ts` 12 条 / `elements/index.ts` `createElements` + 3 条 / `map/index.ts` `extension` + 9 条 / `render/index.tsx:45,46,51` / `render/utils/index.ts:1` 移出即断链 / `client-modules/src/index.ts:15` / `client-base/src/index.ts` 4 条)。D 类风险 **9** 条(反向依赖候选 4 族共 13 处、自包引用 5 处、`client-base/package.json` 依赖缺口:缺 `@motajs/render-vue` / `@motajs/system` / `@motajs/common` / `@user/data-common`、现状零反向引用机器证据、`?raw` shader 4 处、`dev.md` 规则对照)。E 类 legacy **8** 个文件(`core.*` 约 31 处;`loading` / `Mota.require('@user/data-base')` 3 处;`client.*` 0 命中)。F 类未确定 ≥ **9** 条。 - ④ **大致解决方案**:只读清点,唯一交付物 `.planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md`;11 节结构(`## 背景` / `## 方法` / `## 被移集合清单(39 文件)` / `## A 被移集合内部交叉引用` / `## B 外部导入点` / `## C barrel 与导出面` / `## D 分层与循环依赖风险` / `## E legacy 命中(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`)+ 6 行元信息块;A–E 每节固定列序表(`ID | 文件/符号 | 命中处(源) | 目标锚点 | 问题描述 | 影响 | 置信`),**每行 ≥2 个 `file:line` 锚点**;**分列规则**:A = 被移集合内部交叉引用、B = 外部导入点、C = barrel 与导出面、D = 分层与循环依赖风险(含 `package.json` 依赖现状)、E = legacy 命中(仅报告)、F 类只登记不判定。重型整文件读取可按 **D-09** 派**只读**子代理(仅回传事实表,不得写文件)。 + ④ **大致解决方案**:只读清点,唯一交付物 `.planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md`;10 节结构(`## 背景` / `## 方法` / `## 被移集合清单(39 文件)` / `## A 被移集合内部交叉引用` / `## B 外部导入点` / `## C barrel 与导出面` / `## D 分层与循环依赖风险` / `## E legacy 命中(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`)+ 6 行元信息块;A–E 每节固定列序表(`ID | 文件/符号 | 命中处(源) | 目标锚点 | 问题描述 | 影响 | 置信`),**每行 ≥2 个 `file:line` 锚点**;**分列规则**:A = 被移集合内部交叉引用、B = 外部导入点、C = barrel 与导出面、D = 分层与循环依赖风险(含 `package.json` 依赖现状)、E = legacy 命中(仅报告)、F 类只登记不判定。重型整文件读取可按 **D-09** 派**只读**子代理(仅回传事实表,不得写文件)。 ⑤ **范围与硬边界**:被查 = 移植集合 39 文件与其全部 importer;基准 = 当日工作树 + `dev.md` 单向依赖 / 双端分离规则 + 两个包的 `package.json`;`packages/` 与 `src/` 命中**仅报告、不修改**;**D-55**:legacy 一律只报告,不修、不登记为待办;**D-56**:用户并发改动零触碰。**生产源码零改动**;唯一写入为上述交付文档(外加本 PLAN 与 `04-10-SUMMARY.md` 两份簿记)。 @@ -201,7 +201,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) ⑦ **计划号与 wave(须原样告知)**:本计划为 **04-10**(第十个增量),`wave: 9`,`depends_on` 列 `04-01`..`04-09`;phase 目录内既有 `04-01`..`04-09` 的 `*-PLAN.md` 与 `*-SUMMARY.md` **一律不得改写 / 覆盖 / 改号**。 - ⑧ **验证方式与只读证明(须原样告知)**:本步为只读清点,**无运行时行为可观察**。证明方式 = ①**只读门禁**:`git status --porcelain -- packages packages-user src` 在 Task 1 起始逐行记录(规划日实测单条 ` M packages-user/data-base/src/enemy/types.ts`),Task 1 / Task 3 断言其后逐条一致;②**静态内容门禁**:11 节结构、被移集合 **39** 文件路径逐条齐备、A–F 行数下限与关键词、每行 ≥2 个 `file:line` 锚点、F 类条数;③**机器证据复验**:`git grep -n -F "client-modules" -- packages-user/client-base` 零命中、`git grep -n -F "render/components"` / `-F "render/elements"` / `-F "render/map"`(同限 `packages` 与 `src`)在 `packages-user` 之外零命中、被移集合对 `ui`/`fx`/`weather` 零引用、`client.*` 在被移集合内零命中;④**既有产物保护 + 计划范围门禁**:`04-01`..`04-09` 的 `*-PLAN.md` / `*-SUMMARY.md` porcelain 为空;phase 目录内 `-PLAN.md` 仅 `04-01`..`04-10`;⑤**CRLF 门禁**;⑥**人工代码复核**。**不冒充任何无法运行的门禁。** + ⑧ **验证方式与只读证明(须原样告知)**:本步为只读清点,**无运行时行为可观察**。证明方式 = ①**只读门禁**:`git status --porcelain -- packages packages-user src` 在 Task 1 起始逐行记录(规划日实测单条 ` M packages-user/data-base/src/enemy/types.ts`),Task 1 / Task 3 断言其后逐条一致;②**静态内容门禁**:10 节结构、被移集合 **39** 文件路径逐条齐备、A–F 行数下限与关键词、每行 ≥2 个 `file:line` 锚点、F 类条数;③**机器证据复验**:`git grep -n -F "client-modules" -- packages-user/client-base` 零命中、`git grep -n -F "render/components"` / `-F "render/elements"` / `-F "render/map"`(同限 `packages` 与 `src`)在 `packages-user` 之外零命中、被移集合对 `ui`/`fx`/`weather` 零引用、`client.*` 在被移集合内零命中;④**既有产物保护 + 计划范围门禁**:`04-01`..`04-09` 的 `*-PLAN.md` / `*-SUMMARY.md` porcelain 为空;phase 目录内 `-PLAN.md` 仅 `04-01`..`04-10`;⑤**CRLF 门禁**;⑥**人工代码复核**。**不冒充任何无法运行的门禁。** ⑨ **第二步不被规划**:本 run **不含**移植方案、不含 import 重写方案、不产出 `04-11+`;第二步(移植实施)待用户审阅本清点文件后另行规划(D-57)。 @@ -211,7 +211,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) ⑫ **若用户给出修订意见**(含不同意移植集合 / 目标布局 / A–F 分列规则 / 不同意把某些内容归 E 类只报告 / 希望把命名一并裁定 / 希望调整范围):退出本计划、修订 `04-10-PLAN.md` 后重新汇报,不得自行改道执行。 - 是否按本计划(渲染端结构性重构·第一步只读影响清点:唯一交付物 `04-STRUCTURE-MIGRATION-IMPACT.md`,11 节 / A–F 六类,被移集合 39 文件,范围含全部 importer 与其它 monorepo 包,`packages/` 与 `src/` 仅报告,legacy 按 D-55 仅报告,生产代码零改动且零命名变更,第二步不规划)开始执行 + 是否按本计划(渲染端结构性重构·第一步只读影响清点:唯一交付物 `04-STRUCTURE-MIGRATION-IMPACT.md`,10 节 / A–F 六类,被移集合 39 文件,范围含全部 importer 与其它 monorepo 包,`packages/` 与 `src/` 仅报告,legacy 按 D-55 仅报告,生产代码零改动且零命名变更,第二步不规划)开始执行 AGENTS.md 要求任何计划的第一个 block 点必须是向用户汇报计划内容并等待用户确认;本计划虽是只读清点,仍不得例外。`.planning/config.json` 为 `mode: yolo`,因此该关卡必须显式声明为 `blocking-human` 并置 `autonomous: false`,否则计划层面不提供任何 block 点。此外本次存在两条会改变范围归属的用户裁定(D-55 legacy 只报告、D-56 用户并发改动零触碰)与一条会改变权限边界的项目规则(AGENTS.md 的命名须先反馈),必须在关卡中先行澄清,避免 AI 把 legacy 写成待办、或替用户给目标文件命名。 @@ -238,7 +238,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) - 用户回复中明确包含「可以执行」四个字 - - 汇报内容涵盖:要解决的问题(D-51 分层放错 + D-57 两步走)、锁定裁定(D-52 移植集合 39 文件 / D-53 目标布局 / D-54 不移植 / D-55 legacy / D-56 并发 / D-57 第一步交付物)、规划日实测的影响面(A 8 方向 / B 8 文件族 + 3 包 / C 7 barrel / D 9 风险 / E 8 文件 / F ≥9)、大致解决方案(11 节结构 + 固定列序 + A/B/C/D/E 分列规则 + F 只登记不判定)、范围与硬边界、唯一交付物与两步走 + - 汇报内容涵盖:要解决的问题(D-51 分层放错 + D-57 两步走)、锁定裁定(D-52 移植集合 39 文件 / D-53 目标布局 / D-54 不移植 / D-55 legacy / D-56 并发 / D-57 第一步交付物)、规划日实测的影响面(A 8 方向 / B 8 文件族 + 3 包 / C 7 barrel / D 9 风险 / E 8 文件 / F ≥9)、大致解决方案(10 节结构 + 固定列序 + A/B/C/D/E 分列规则 + F 只登记不判定)、范围与硬边界、唯一交付物与两步走 - 汇报中已原样告知 **D-55**(legacy 一律只报告,不修、不登记为待办)与 **D-56**(不得触碰 / 提交用户并发改动) - 汇报中已原样告知**本步零命名变更**,且目标文件名 / barrel 名等命名一律进 F 类、须先向用户反馈并获同意 - 汇报中已原样告知**编号与 wave**(04-10 / wave 9 / `depends_on` 04-01..04-09)以及既有 `04-01`..`04-09` 产物不得改写 / 覆盖 / 改号 @@ -249,7 +249,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) - Task 1(tracer):交付文档骨架 + 被移集合全量清单 + 一条端到端清点切片 —— 起始只读基线 + 11 节结构 + 元信息块 + `## 背景` / `## 方法` + 39 文件清单(含目标落点)+ `render/utils/layout.ts` 贯穿 A–F 六节的端到端行,结构 / 清单 / 切片双锚点 / CRLF / 只读基线 / 分层基线六道门禁转绿 + Task 1(tracer):交付文档骨架 + 被移集合全量清单 + 一条端到端清点切片 —— 起始只读基线 + 10 节结构 + 元信息块 + `## 背景` / `## 方法` + 39 文件清单(含目标落点)+ `render/utils/layout.ts` 贯穿 A–F 六节的端到端行,结构 / 清单 / 切片双锚点 / CRLF / 只读基线 / 分层基线六道门禁转绿 Task 0 已闭环:用户在对话中明确回复「可以执行」四个字(未收到则不得开始本任务) .planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md @@ -279,7 +279,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) (4) **写 `## 被移集合清单(39 文件)`**:四张子表 + 一行单文件 ——(i)`render/components/` **13** 个:`choices.tsx` / `floorSelect.tsx` / `icons.tsx` / `index.ts` / `input.tsx` / `list.tsx` / `misc.tsx` / `page.tsx` / `scroll.tsx` / `textbox.tsx` / `textboxTyper.ts` / `thumbnail.tsx` / `tip.tsx`;(ii)`render/elements/` **5** 个:`cache.ts` / `index.ts` / `misc.ts` / `props.ts` / `types.ts`;(iii)`render/map/` **20** 个:`block.ts` / `constant.ts` / `element.ts` / `index.ts` / `moving.ts` / `renderer.ts` / `status.ts` / `types.ts` / `vertex.ts` / `viewport.ts` + `extension/{door,hero,index,manager,text,types}.ts`(6)+ `shader/{back.frag,back.vert,map.frag,map.vert}`(4);(iv)`render/utils/layout.ts` **1**。每行含 `现路径 | 目标路径(按 D-53) | 职责(一句话,据当日阅读) | 备注`。**目标路径写法**:`components` / `elements` / `map` 三个文件夹内的文件按同名相对路径映射到 `packages-user/client-base/src/{components,elements,map}/…`;`layout.ts` 映射为 `packages-user/client-base/src/layout/…`(**具体文件名是否仍为 `layout.ts` 属 F 类,须写「命名待用户裁定」,不得拍板**)。同时写明「**不新建 `client-base/src/render/` 目录**」与「**本步不移动、不复制、不预建任何目标文件**」。 - (5) **补齐 11 个二级标题**(`## 背景` / `## 方法` / `## 被移集合清单(39 文件)` 已在前几步写入,此处补齐其余 8 个占位,其后 Task 2 / Task 3 在同一骨架上横向补齐,不再改结构):`## A 被移集合内部交叉引用` / `## B 外部导入点` / `## C barrel 与导出面` / `## D 分层与循环依赖风险` / `## E legacy 命中(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`。**每个类别标题下先写一行记录编号模板**(供后续横向补齐对齐):A 类 `#04-10-A-NN`、B 类 `#04-10-B-NN`、C 类 `#04-10-C-NN`、D 类 `#04-10-D-NN`、E 类 `#04-10-E-NN`,表头固定为 `| ID | 文件/符号 | 命中处(源) | 目标锚点 | 问题描述 | 影响 | 置信 |`;F 类条目形如 `- **#04-10-F-NN**:现象 + 为什么读不出来 + 需要用户裁决的点`。模板行用 `NN` 占位、不含数字,故不计入任何行数门禁。 + (5) **补齐 10 个二级标题**(`## 背景` / `## 方法` / `## 被移集合清单(39 文件)` 已在前几步写入,此处补齐其余 8 个占位,其后 Task 2 / Task 3 在同一骨架上横向补齐,不再改结构):`## A 被移集合内部交叉引用` / `## B 外部导入点` / `## C barrel 与导出面` / `## D 分层与循环依赖风险` / `## E legacy 命中(仅报告)` / `## F 未能从阅读确定(未猜测)` / `## 处置`。**每个类别标题下先写一行记录编号模板**(供后续横向补齐对齐):A 类 `#04-10-A-NN`、B 类 `#04-10-B-NN`、C 类 `#04-10-C-NN`、D 类 `#04-10-D-NN`、E 类 `#04-10-E-NN`,表头固定为 `| ID | 文件/符号 | 命中处(源) | 目标锚点 | 问题描述 | 影响 | 置信 |`;F 类条目形如 `- **#04-10-F-NN**:现象 + 为什么读不出来 + 需要用户裁决的点`。模板行用 `NN` 占位、不含数字,故不计入任何行数门禁。 (6) **端到端切片:`render/utils/layout.ts` 一条线贯穿 A–F 六节(本任务唯一实测清点对象)**——这是本 tracer 的「一条路径走通全部层」: - **清单节**:已在 (4) 中登记 `render/utils/layout.ts` → `client-base/src/layout/`(文件名待裁定)。 @@ -298,7 +298,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) 交付文档是只读清点的记录,可随时修订或废弃;它不引入生产代码、公共接口、契约约束或命名,因此这一步的任何取舍都不难回退。 - node -e "const fs=require('fs');const p='.planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md';const t=fs.readFileSync(p,'utf8');const heads=(t.match(/^## /gm)||[]).length;if(heads!==11){console.error('HEADING COUNT '+heads);process.exit(1)}const need=['## A ','## B ','## C ','## D ','## E ','## F ','## \u5904\u7f6e'];const miss=need.filter(h=>t.indexOf(h)<0);if(miss.length>0){console.error('MISSING HEADINGS '+miss.join(' ; '));process.exit(1)}if(t.indexOf('\u53ea\u8bfb\u8d77\u59cb\u57fa\u7ebf')<0){console.error('MISSING READONLY BASELINE');process.exit(1)}if(!/\b[0-9a-f]{7,40}\b/i.test(t)){console.error('MISSING BASELINE COMMIT');process.exit(1)}console.log('OK headings '+heads)" + node -e "const fs=require('fs');const p='.planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md';const t=fs.readFileSync(p,'utf8');const heads=(t.match(/^## /gm)||[]).length;if(heads!==10){console.error('HEADING COUNT '+heads);process.exit(1)}const need=['## A ','## B ','## C ','## D ','## E ','## F ','## \u5904\u7f6e'];const miss=need.filter(h=>t.indexOf(h)<0);if(miss.length>0){console.error('MISSING HEADINGS '+miss.join(' ; '));process.exit(1)}if(t.indexOf('\u53ea\u8bfb\u8d77\u59cb\u57fa\u7ebf')<0){console.error('MISSING READONLY BASELINE');process.exit(1)}if(!/\b[0-9a-f]{7,40}\b/i.test(t)){console.error('MISSING BASELINE COMMIT');process.exit(1)}console.log('OK headings '+heads)" non-zero exit, 或 stderr 含 "HEADING COUNT" / "MISSING HEADINGS" / "MISSING READONLY BASELINE" / "MISSING BASELINE COMMIT"(二级标题数不等于 11,或 A–F 与 `## 处置` 任一缺失,或 `## 方法` 未记录只读起始基线 / 元信息块未登记基准 HEAD) node -e "const fs=require('fs');const t=fs.readFileSync('.planning/phases/04-render-adaptation/04-STRUCTURE-MIGRATION-IMPACT.md','utf8');const f=['components/choices.tsx','components/floorSelect.tsx','components/icons.tsx','components/index.ts','components/input.tsx','components/list.tsx','components/misc.tsx','components/page.tsx','components/scroll.tsx','components/textbox.tsx','components/textboxTyper.ts','components/thumbnail.tsx','components/tip.tsx','elements/cache.ts','elements/index.ts','elements/misc.ts','elements/props.ts','elements/types.ts','map/block.ts','map/constant.ts','map/element.ts','map/index.ts','map/moving.ts','map/renderer.ts','map/status.ts','map/types.ts','map/vertex.ts','map/viewport.ts','map/extension/door.ts','map/extension/hero.ts','map/extension/index.ts','map/extension/manager.ts','map/extension/text.ts','map/extension/types.ts','map/shader/back.frag','map/shader/back.vert','map/shader/map.frag','map/shader/map.vert','utils/layout.ts'];const miss=f.filter(x=>t.indexOf(x)<0);if(miss.length>0){console.error('MOVE-SET MISSING '+miss.length+' :: '+miss.join(' ; '));process.exit(1)}if(t.indexOf('client-base/src/')<0){console.error('MISSING TARGET LAYOUT');process.exit(1)}console.log('OK move-set files '+f.length)" non-zero exit, 或 stderr 含 "MOVE-SET MISSING" / "MISSING TARGET LAYOUT"(39 个被移文件未逐条列出 D-52 的全部路径,或未写明 D-53 的目标落点) @@ -321,7 +321,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) - `## 处置` 初稿含「只读 / 零命名变更 / 第二步未规划 / legacy 仅报告 / 命名与解耦由用户裁定 / REND 保持 Pending」 - 相对记录在 `## 方法` 的只读起始基线零变化;未修改任何生产源码;未预建 `client-base/src/{components,elements,map,layout}`;未新增计划文件;全文 CRLF;分层基线机器证据为零 - 交付文档骨架(11 节)+ 元信息块 + `## 背景` / `## 方法`(含只读起始基线)+ `## 被移集合清单(39 文件)` + `render/utils/layout.ts` 贯穿 A–F 的端到端切片 + `## 处置` 初稿全部落位;结构 / 清单 / 切片双锚点 / CRLF / 只读基线 / 分层基线六道门禁转绿;Task 2 只需在同一模板上横向补齐 A / B / C + 交付文档骨架(10 节)+ 元信息块 + `## 背景` / `## 方法`(含只读起始基线)+ `## 被移集合清单(39 文件)` + `render/utils/layout.ts` 贯穿 A–F 的端到端切片 + `## 处置` 初稿全部落位;结构 / 清单 / 切片双锚点 / CRLF / 只读基线 / 分层基线六道门禁转绿;Task 2 只需在同一模板上横向补齐 A / B / C @@ -515,7 +515,7 @@ Phase 4 第十个增量(用户裁定 2026-09-23 · D-51..D-57 **第一步**) - **只读门禁**:`git status --porcelain -- packages packages-user src` 的输出与交付文档 `## 方法` 的「只读起始基线」条目逐条一致(不新增、不消失、状态码不变);并断言 `.planning/phases/04-render-adaptation/04-CONTEXT.md` 的未提交改动仍在(D-56)、`.planning/REQUIREMENTS.md` 未被改动且 `REND-01` / `REND-02` 仍为 `Pending`。 -- **静态内容门禁**:交付文档恰好 11 个二级标题;被移集合 **39** 个文件路径逐条出现(`components` 13 / `elements` 5 / `map` 20 / `utils/layout.ts` 1);A ≥ 8 行 / B ≥ 8 行 / C ≥ 7 行 / D ≥ 9 行 / E ≥ 6 行 / F ≥ 9 条;A–E 每行 ≥2 个 `file:line` 锚点;A / B / C / D / E 覆盖各自关键词集合;E 含「仅报告」措辞;`## 处置` 存在。 +- **静态内容门禁**:交付文档恰好 10 个二级标题;被移集合 **39** 个文件路径逐条出现(`components` 13 / `elements` 5 / `map` 20 / `utils/layout.ts` 1);A ≥ 8 行 / B ≥ 8 行 / C ≥ 7 行 / D ≥ 9 行 / E ≥ 6 行 / F ≥ 9 条;A–E 每行 ≥2 个 `file:line` 锚点;A / B / C / D / E 覆盖各自关键词集合;E 含「仅报告」措辞;`## 处置` 存在。 - **机器证据复验**:`git grep -n -F "client-modules" -- packages-user/client-base`,以及 `git grep -n -F "../ui"` / `-F "../fx"` / `-F "../weather"` 三个**独立**检索(同限被移集合四个路径),逐一无输出(退出码 1);`git grep -n -F "render/components"` / `-F "render/elements"` / `-F "render/map"` 三个**独立**检索(同限 `packages` 与 `src`)在 `packages/` 与 `src/` 零命中。 - **既有产物保护 + 计划范围门禁**:`git status --porcelain -- <04-01..04-09 的 PLAN 与 SUMMARY>` 为空;phase 目录内 `-PLAN.md` 恰为 `04-01`..`04-10` 共 10 个;`04-10-SUMMARY.md` 已存在。 - **CRLF 门禁**:交付文档的 `\n` 总数等于 `\r\n` 总数(无孤立 LF)。 @@ -535,5 +535,5 @@ Create `.planning/phases/04-render-adaptation/04-10-SUMMARY.md` when done | `.planning/phases/04-render-adaptation/04-10-PLAN.md` | 计划簿记 | 本计划(编号 04-10;`wave: 9`;`depends_on` 04-01..04-09;`autonomous: false`) | | `.planning/phases/04-render-adaptation/04-10-SUMMARY.md` | 执行簿记 | 当日实测值(porcelain 基线、被移集合实际文件数)、A–F 实际行数与关键结论、五道门禁结果、人工复核结论、与规划日的差异说明、`REND-01` / `REND-02` 仍 Pending 与「第二步未规划」 | | `.planning/ROADMAP.md`(Phase 4 的 Wave 9 登记 + register note) | 计划簿记 | 登记第十个增量 `04-10`(只读影响清点)与执行前置关卡要求 | -| 门禁结果(会话内可复跑) | 验证证据 | 只读门禁(porcelain 逐条一致 + 用户改动仍在 + `REQUIREMENTS.md` 未改动且 REND 仍 Pending)、静态内容门禁(11 节 / 39 文件 / A–F 行数与双锚点)、机器证据复验(两处零命中)、既有产物保护 + 计划范围门禁(`04-01..04-09-*` 未改写、无 `04-11+`、SUMMARY 已落盘)、CRLF 门禁 | +| 门禁结果(会话内可复跑) | 验证证据 | 只读门禁(porcelain 逐条一致 + 用户改动仍在 + `REQUIREMENTS.md` 未改动且 REND 仍 Pending)、静态内容门禁(10 节 / 39 文件 / A–F 行数与双锚点)、机器证据复验(两处零命中)、既有产物保护 + 计划范围门禁(`04-01..04-09-*` 未改写、无 `04-11+`、SUMMARY 已落盘)、CRLF 门禁 | | 显式**不**产出 | 边界声明 | 任何生产代码改动、任何文件移动 / 复制 / 预建、任何测试文件、任何依赖变更(含 `package.json` 补声明)、任何命名、任何移植方案或 import 重写方案(D-57:第二步待用户审阅本文件后另行规划)、任何针对 legacy 的修复方案(D-55) |