From fdcd1f88a702873c9b6fd99be80ceead252eaf1a Mon Sep 17 00:00:00 2001 From: xcs Date: Sat, 29 Aug 2026 18:38:20 +0800 Subject: [PATCH] =?UTF-8?q?docs(w05):=20=E7=AB=8B=20Task=207b=20=E2=80=94?= =?UTF-8?q?=E2=80=94=20=E3=80=8C=E6=96=B0=E5=BB=BA=E8=8A=AF=E7=89=87?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E3=80=8D=E6=98=AF=20spec=20=E4=B8=8E?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=83=BD=E7=82=B9=E5=90=8D=E7=9A=84=E8=83=BD?= =?UTF-8?q?=E5=8A=9B,=E4=B8=8D=E8=83=BD=E5=8F=AA=E6=B4=BB=E5=9C=A8?= =?UTF-8?q?=E4=B8=80=E6=9D=A1=E9=A1=BE=E8=99=91=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 7 交付的件让人从下拉挑已有类型(主路通),但 spec :37 / :261 与用户原话都 明写还要能「新建一个类型 + 它的核心参数字段」。这一半没做。 做不了的原因已核实属实:ViewContainer.addRow 靠克隆最后一行,零行时返回 false, 而 mine:parts.chip_type 每单开局零行。顺带发现平台自相矛盾 —— desk.ts:843 那条 空表闸在教人「先在件上加一行」,而 UI 做不到。 三条候选路各记了代价:①件上摆字面量空白行(零平台改动,但复合主键的跨行自增键 联动待查)②平台补原型行(小改,但动两个共享面要全量回归)③配方种骨架(已否: 人改挑已有类型时那行空骨架会一直卡着闸)。 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 | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) 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 0e968b2..8cebebc 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 @@ -1758,6 +1758,51 @@ EOF --- +### Task 7b: 件① 补上「新建芯片类型」—— 空表加行这条路要先通 + +> **这一条是 2026-08-29 从 Task 7 的顾虑里立出来的**(控制端裁定)。Task 7 交付的件让人**从下拉里挑** +> 一个已有类型(`data-options` 现读),这条主路是通的;但 spec 明写的另一半 —— **人在这张件上新建一个类型 +> 并定下它的核心参数字段** —— 没做。它不是可选的: +> +> - spec `:37`:「人**选定/新建类型**后按一次保存,系统按该类型的字段清单把参数值的行铺出来」 +> - spec `:261`:提交时 `chip_type` / `type_param` / `profile` / `parameter` **四张一起**进正式表 +> - 用户原话里也点了名:「选择芯片类型(**或创建一个新类型 + 它的核心参数字段,每个带描述与软硬约束**)」 +> +> **为什么 Task 7 做不了**(诊断已由控制端核实,属实): +> `ViewContainer.addRow`(`packages/ui-kit/src/ViewContainer.tsx:303-306`)靠 +> `host.querySelector('tr:last-of-type')` 克隆最后一行,**零行时返回 `false`**; +> 而 `mine:parts.chip_type` / `mine:parts.type_param` 每单开局都是零行 —— 加行按钮到不了岸。 +> 顺带:平台在这件事上自相矛盾 —— `apps/api/src/app/routes/desk.ts:843` 那条空表闸的话是 +> 「**先在件上加一行**填好再提交」,教人做一件 UI 做不到的事。 + +**三条候选路,开工前先定哪一条**(各自的代价已初勘,但**都要自己复核**): + +① **件上摆字面量空白行**(不走 `data-rows`,直接写 `data-edit` + `data-col` 的行)—— + 零平台改动。已核实两条支撑机制存在:**空行不写**(`desk.ts:270` 一带,`filled.length > 0` 才落)、 + **`auto` 主键由基座续号**(`type_id` 声明 `auto`,不进表单)。 + **未解的坎**:`parts.type_param` 是复合主键(`type_id` + `param_name`),而新类型的 `type_id` + 要等 `chip_type` 那一行写下去才铸得出来 —— **跨行的自增键联动**基座目前是逐行铸的。先查这条通不通。 + +② **平台补「原型行」**:渲染器对零行的 `data-rows` 留一行隐藏原型(``), + `addRow` 找不到 `tr:last-of-type` 时回落到克隆它。改动小,但动的是 `view-render.ts` 与 + `ViewContainer.tsx` **两个共享面** —— E04 / I01 都在用,**照规矩要全量回归**。 + 顺带能把 `desk.ts:843` 那句自相矛盾的话变成真的。 + +③ **配方先种一行骨架**:S1 在某颗料没有 `chip_type_id` 时投一行空 `parts.chip_type`。 + 零平台改动,但人若改从下拉挑了已有类型,那行空骨架会让 `_missing > 0` **一直卡着闸**, + 得他自己删掉才行 —— 摩擦大且不明显。**列在这里是为了记下它被否过,别再想一遍。** + +**Files:** 待定(取决于选哪条路) +**Interfaces:** 消费 Task 7 的 `input-supplement` 件与 S1 配方的 `gateLedgers` + +- [ ] **Step 1: 定路线** —— 先查①的跨行自增键联动通不通(`autoKeys` 在 `desk.ts:392` 一带); + 通就走①(零平台改动最省),不通就走②(并按「改共享面全量回归」办)。**把结论写进报告。** +- [ ] **Step 2: 照选定的路实现,并补测试** +- [ ] **Step 3: 变异验证** —— 拿掉这条能力,证明测试变红 +- [ ] **Step 4: `pnpm gates`(看真实退出码)→ 提交** + +--- + ### Task 8: 件② `difference-review` —— 差异评估结论审核(验收工单) **Files:**