diff --git a/.planning/phases/07-data-fixes/07-15-PLAN.md b/.planning/phases/07-data-fixes/07-15-PLAN.md index f564b7c..6360d44 100644 --- a/.planning/phases/07-data-fixes/07-15-PLAN.md +++ b/.planning/phases/07-data-fixes/07-15-PLAN.md @@ -249,9 +249,16 @@ Phase 7 裁决对应(逐条引用):D-01: 本计划是 Phase 7 第 15 个 - 空 —— **尚未裁决**。本块为空表示「未裁决:停止」。执行者在收到用户逐条裁决前**不得**修改任何文件、**不得**按任何【建议默认】或【未选】分支推进;裁决取得后由计划修订把 Q1..Q4 的结论(含每条选定的分支与由此产生的对外可观测后果)逐条写入本块,然后重新执行 Task 1..5。 + 用户裁决(2026-09-17,逐条;本节由计划修订填入,执行者核对后直接进入 Task 1,不再重复询问): + - **Q1 = A**:CR-01 在比较克隆上**逐个 `modifier.clone()` 后 `addModifier`**,采样后删除**同一批克隆对象**;活属性上的原修饰器保持绑定、零扰动。对外可观测后果:现役装备参与比较时差值回到契约要求的符号与大小(实算对照:`-7`;修复前 `-12`);不改变返回类型与两个 146 早退分支。 + - **Q2 = A**:WR-01 的 `normalizeParam` 回退分支改为 `return null`,与该方法自身 jsDoc 的「无法用现有编码表示时返回 `null`」及 `normalizeParamList` 的「无法表示的参数会被丢弃」一致;告警 148 仍发出。对外可观测后果:含非法参数的命令其**参数计数**由 1 变 0(`get(i).params` 的个数随之变化),后续命令的字节偏移不再错位;不新增占位、不改既有 jsDoc。 + - **Q3 = A**:WR-02 的构造器校验由 `< 1` 收紧为 `<= 1`(告警 149 + 回退 2),与告警 149 文案「必须大于 1」一致;命令与参数两个分支同改。对外可观测后果:被接受的配置范围收紧——传 1 从「静默接受(随后栈溢出)」变为「告警 149 并按 2 处理」;已核查仓库内无配置/用例传 1(默认 1.2、测试用 2)。 + - **Q4 = A**:WR-03 的 `clone()` 恢复与 `addModifier` 同等的完整簿记——`modifierName`、`bindAttribute(cloned)`、按源修饰器可存性镜像 `modifierNosave`、再 `recalculateAttribute(name)`;不改 `cloneModifier: false` 的既有语义。对外可观测后果:克隆属性的 `saveState().modifiers` 不再为空、`iterateModifiers()` 可枚举、`getModifierIndex()` 可定位、克隆修饰器 `setValue` 能通知克隆重算。 + - **命名预审(AGENTS.md 要求)**:用户已确认——本计划**不新增任何公共/受保护/私有方法或字段**(生产代码零新增符号);仅新增方法内局部变量 `copy` / `addedA` / `modifiersA` 及 5 条新用例标题。 + - **未确认观察(不登记、不纳入)**:Task 0 context 中标注「未确认、不登记」的其它退化扩容配置(乘数恰为 1 之外者)**不**作为缺陷登记,也**不**在 Q3 一并封口。 + - **并行改动纪律(用户 2026-09-17 指示)**:执行期间用户会并行修改仓库其它文件,**可能产生与本计划无关的类型错误**;执行者**只对本计划声明的路径负责**——文件级 `vue-tsc` 门禁按改动文件相对路径过滤、忽略其它路径的诊断;仅 stage/commit 本计划声明的文件,绝不 `git add -A` / `git commit -a` / `git stash`。 - 逐条给出 Q1..Q4 的裁决(例如「Q1=A, Q2=A, Q3=A, Q4=A」);若要修订方案,回复修订点,执行者退出并按 D-09 修订本 PLAN.md 后重新执行 + 已裁决(2026-09-17):Q1=A, Q2=A, Q3=A, Q4=A(各分支的对外可观测后果见 ``);命名预审已确认;并行改动纪律已写入。执行者核对 `` 后直接进入 Task 1;若记录与用户实际意图不符,暂停并请用户澄清后再继续 向用户汇报四处口径,逐条讲清取舍与**对外可观测后果**:Q1(CR-01)A 分支在比较克隆上克隆加入/克隆删除、活属性零扰动,B 分支会制造「修饰器暂时未绑定」的窗口且本仓库禁用 try-catch 无法兜底,C 分支等于把一个会算错差值的公开 API 留成调用约定,并给出实算对照(现役剑场景下 `-12` vs 契约要求的 `-7`);Q2(WR-01)A 分支丢弃该参数(命令参数计数、`get(i).params` 个数与后续字节偏移同时变化,与 bigint 溢出路径同口径),B 分支保留 2 字节占位并必须改写两处既有 jsDoc/注释;Q3(WR-02)A 分支把乘数 1 从「静默接受(随后栈溢出)」改为「告警 149 并回退为 2」(收紧被接受的配置范围,已核查无既有配置/用例受影响),B 分支保留乘数 1 但改为严格增大并顺带封口其它退化配置,代价是码 149 文案与实现永久不一致;Q4(WR-03)A 分支恢复四处簿记,后果是**克隆属性 `saveState()` 的 `modifiers` 不再为空**、克隆修饰器可遍历可定位且 `setValue` 能通知克隆重算,B 分支不继承存档开关(源上不入档的修饰器在克隆上会变回可存档),C 分支会破坏 `cloneModifier` 的既有语义与既有用例。同时转述 context 中标注为「未确认、不登记」的观察(乘数恰为 1 之外的退化配置),请用户决定是否在 Q3 选 B 一并封口。**不得在裁决前修改任何文件**;不得自行采纳任何建议默认值。另按 AGENTS.md 的命名要求一并提请批准:本计划**不新增任何公共/受保护/私有方法或字段**(生产代码零新增符号),只新增三个方法内局部变量名 `copy`(被比较修饰器的克隆副本)、`addedA`(A 的克隆收集数组)与 `modifiersA`(`[...stateA.getModifiers()]` 的展开副本,用于让 `addedA` 取得与源迭代器同型的元素类型,见 Task 1),以及 5 条新用例的英文标题(见 objective 的「Artifacts this phase produces」);若用户对任一命名有异议,先修订本计划再执行。 `` 中 Q1..Q4 均有用户明确裁决(含 Q2 对参数计数/字节布局的影响、Q3 对可接受配置范围的影响、Q4 对克隆属性序列化内容的影响均已被告知并确认),且与用户实际意图一致