From 89f0be8b81301708fce160b04b5701cd320e5797 Mon Sep 17 00:00:00 2001 From: xcs Date: Sat, 29 Aug 2026 16:15:10 +0800 Subject: [PATCH] =?UTF-8?q?docs(w05):=20Task=2010=20=E4=BF=AE=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E7=BC=BA=E9=99=B7=20=E2=80=94=E2=80=94=20=E9=80=80?= =?UTF-8?q?=E5=BD=B9=E6=B8=85=E5=8D=95=E6=BC=8F=E5=9B=9B=E4=B8=AA=E6=96=87?= =?UTF-8?q?=E4=BB=B6,=E6=96=AD=E8=A8=80=E5=86=99=E5=9C=A8=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E5=AD=97=E6=AE=B5=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Files 清单漏了 container.ts(容器里那行 handler 覆盖)、tools-w05.ts(两枚工具的 契约定义整份)、seed-activities.ts 与 seed-mvp.ts(它的两个消费方)。只改点名的 五个文件,工具会在一处退役、在另几处照常注册。 Step 2 的断言 registry.find(t => t.name...).enabled 三处都不成立:该文件里没有 registry;FIRST_PARTY_TOOLS 是 [name, handler] 元组数组,元素上没有 .name,取它 得 undefined 再 .includes() 当场抛;本仓工具也没有 enabled 这个概念。改成断言 「不在注册表里」,同样拦得住手滑重新注册。 Step 1 的预期由「零命中」改成实测的那几处,并写明冒出清单之外的命中要停下来报。 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet --- .../plans/2026-08-29-act-work-05-rewrite.md | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/docs/superpowers/plans/2026-08-29-act-work-05-rewrite.md b/docs/superpowers/plans/2026-08-29-act-work-05-rewrite.md index c0696cb..e3e9749 100644 --- a/docs/superpowers/plans/2026-08-29-act-work-05-rewrite.md +++ b/docs/superpowers/plans/2026-08-29-act-work-05-rewrite.md @@ -1925,9 +1925,18 @@ Run 红:`pnpm exec vitest run activities/part-substitution-assessment/__tests__/ ### Task 10: 退役 —— 两枚工具、两张判定表、技能戳 -**Files:** -- Modify: `apps/api/src/app/tools/first-party.ts`(两枚工具停用 + 墓志铭) -- Modify: `apps/api/src/app/__tests__/first-party-substitution.test.ts` +**Files:**(2026-08-29 控制端实地核过,**原清单漏了四个文件**,见下方 Step 1 的实测结果) +- Modify: `apps/api/src/app/tools/first-party.ts` —— 摘掉 `FIRST_PARTY_TOOLS` 里那两行(`:680-681`), + 连同只服务于它们的实现:`compareParameters`(`:650`)· `recommend`(`:656`)· `compareParametersWith`(`:592`)· + `ParameterLedger` 类型(`:515`);`parseParamValue`(`:393`)/ `describeParsed`(`:415`)**先查还有没有别的调用方**, + 没有才一并摘。留墓志铭。 +- Modify: `apps/api/src/app/container.ts` —— `parameterLedger`(`:424-431`)与那一行 handler 覆盖(`:434`)一并撤, + 连 `ParameterLedger` 的 import。**这一处原清单没有,不撤则工具在容器里照常注册。** +- Delete: `apps/api/src/app/tools-w05.ts` —— 整份就是这两枚工具的契约定义(`W05_TOOLS` / `W05_TOOL_SAMPLE`), + 没有第三个消费方。**原清单没有。** +- Modify: `apps/api/src/app/seed-activities.ts`(`:19` import)与 `apps/api/src/app/seed-mvp.ts`(`:15` import) + —— `tools-w05.ts` 的两个消费方,随它一并清。**原清单没有。** +- Modify: `apps/api/src/app/__tests__/first-party-substitution.test.ts`(见 Step 2 —— 改成退役断言,不是删文件) - Delete: `activities/part-substitution-assessment/src/skills.ts` - Modify: `.../src/manifest.ts`(`assets.skills` 清空、`assets.businessModel.dmn` 去掉 D01/D02) - Modify: `.../src/constants.ts` @@ -1942,22 +1951,41 @@ Run 红:`pnpm exec vitest run activities/part-substitution-assessment/__tests__/ Run: ```bash -grep -rn "compare-parameters\|recommend" activities apps/api/src --include='*.ts' | grep -v __tests__ | grep -v first-party +grep -rn "compare-parameters\|part-substitution-assessment\.recommend" activities apps packages --include='*.ts' \ + | grep -v "app/tools/first-party.ts" | grep -v "activities/part-substitution-assessment" ``` -Expected: **零命中**(除 `first-party.ts` 自身)。有命中就先处理它,别硬拆。 + +**Expected(2026-08-29 控制端实地跑过,不是零命中)**:恰好这几处,全部在上面的 Files 清单里 —— +`container.ts:434` · `tools-w05.ts:21,64` · `seed-activities.ts:19` · `seed-mvp.ts:15` · +`__tests__/first-party-substitution.test.ts` 若干。 + +**冒出清单之外的命中就停下来报上来,别硬拆。** - [ ] **Step 2: 改测试(先描述目标)** 把 `first-party-substitution.test.ts` 里断言这两枚工具**可用**的用例,改成断言它们**已停用且留了墓志铭**: +> **⚠️ 计划原先在这里写错了(2026-08-29 控制端核出并改正)。** 原稿写的是 +> `registry.find((t) => t.name.includes(...))?.enabled).toBe(false)` —— **三处都不成立**: +> 该文件里没有 `registry` 这个名字;`FIRST_PARTY_TOOLS`(`first-party.ts:669`)是 +> `ReadonlyArray` —— **元组数组,元素上没有 `.name`**,取它得 `undefined`、 +> 再 `.includes()` 当场抛 TypeError;而且**本仓的工具压根没有 `enabled` 这个概念**,退役的既有做法是 +> **摘掉注册 + 留墓志铭**(见 quote-archive / quote-intake 的 declarations 头注)。 +> +> 断言改成**「不在注册表里」** —— 它同样拦得住「哪天有人手滑又把它注册回来」: + ```ts -it('两枚工具已退役 —— W05 重写之后没有消费方,规则活在配方里', () => { - expect(registry.find((t) => t.name.includes('compare-parameters'))?.enabled).toBe(false); - expect(registry.find((t) => t.name.includes('recommend'))?.enabled).toBe(false); +it('两枚工具已退役 —— 规则活在 S2 的配方里,不再有第二处真源', () => { + const names = FIRST_PARTY_TOOLS.map(([n]) => n); + expect(names).not.toContain('part-substitution-assessment.compare-parameters'); + expect(names).not.toContain('part-substitution-assessment.recommend'); }); ``` -(`registry` 用该文件里既有的取注册表的方式;名字与形状**照文件里真有的**写。) +**这个文件其余的用例怎么办**:它们逐条测的是 `compare-parameters` 的比对行为,而那段代码这一步就删了 —— +**测试跟着它测的东西一起走**,这不是「删测试让门禁变绿」(本仓禁止的是后者)。 +把整份文件缩成上面这一条退役断言,文件头注改写成墓志铭:说清这两枚工具做过什么、 +规则现在活在哪儿(`case-model.ts` 的 `S2_assess.auto`)、以及为什么不留第二份。 - [ ] **Step 3: 停用并留墓志铭**