Archived
fix(w05): 数据工单三病一改 —— 档案卡上桌、类型守卫、prune 跳过已落地
2026-08-31 用户实测三连 + 「设计只是头上加了动画,操作感没变」: ① 类型「自己给上了」:data-by 行缺键落回外层同名字段(debt I3),查名 pill 摆出 案卷锚(原 PN)的类型 —— 这一行根本没有的值。守卫认 selectCurrent 按行作用域写的 option[selected]:真选上才摆名,没选摆「待选择」。守卫必须单层 :has —— :has() 里嵌 :has() 是非法选择器,整条被浏览器静默丢弃(第一版栽过,预览截图逮回)。 ② 「品牌…点保存根本不会保存」:块① 行源是 sub_eval.part,那张案卷表没有主数据列, renderTemplate 只认行作用域 —— 保存真落草稿,显示与孪生件永远空白(四步重写后的 潜伏缺陷:e2e 走 API、浏览器走查在 swap 版上,两条验证线都照不到,真人一填才现形)。 行源改 mine:parts.profile 本身(S1 ④ prune:true 恒有两行),行里天生有全部列。 ③ 「改回同一类型,下面还是两个类型」:②③ 自投影为绕「已落地行撤不掉」的死锁 (2026-08-30 e2e 案例 2)特意不带 prune,没落地的陈旧行也跟着积在屏上。 治在平台:draftDrop 加配方专用旗 skipLanded(跳过并出声「N 行已随数据工单入库、 这一笔不清它」,不炸;模型那一路的硬拒一个字不变),②③ 恢复 prune:true —— 死锁与积行两头都收,debt「prune 与确认即入库的架构性冲突」销账。 quiet 拍仍不撤行(F3),清理落在每次确认工单那一拍。 ④ 设计:块① 从 11 列横滑表推翻成电路板工作台 —— 深色板底上两张可就地编辑的 芯片档案卡(SOIC 封装 SVG + 角色/在库徽 + 类型行 + 双栏主数据格),编辑态整卡 变表单;三级占位(必填红/建议橘)上卡与参数值表;参数值表所属料号列加角色徽。 嵌套的角色/在库查表全只读(嵌套行里有 data-col 会被 collect 并成一条,测钉死)。 契约:loop-engine port draftDrop +skipLanded/+landed(纯新增,CONTRACT.md 已记, api-report 已刷)。测:107 包内(三锚变异验证)+ auto-runner skipLanded(变异验证) + 2520 全仓;2.7.0 装库 SQL 核过(档案卡宿主/守卫/胶囊/S1 四笔 prune)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
@@ -158,23 +158,24 @@ describe('S1 配方', () => {
|
||||
* 原样投一遍(值不变,幂等)——目的不是产出新数据,是让 `mine:` 这两张表不再天然为零行,
|
||||
* 好让它们能安全回到下面 ⑦ 卡的 `gateLedgers` 上(闸不会再拿「零行」误判)。
|
||||
*
|
||||
* **不带 `prune`**(2026-08-30 第二处修正,e2e 案例 2 撞出来的):这两张表在 ⑦ 的
|
||||
* `gateLedgers` 上,一旦人交回数据工单就随「数据工单确认即入库」落进正式表——已落地的行
|
||||
* `draftDrop`(`prune` 的撤行机制)撤不掉,配方原样抛错。字典类的表允许历史选型留在
|
||||
* 草稿层(不算错),不像 `parts.profile`/`parts.parameter` 那几笔(它们仍然 `prune:true`,
|
||||
* 见下面「主数据骨架」那笔)必须清掉不再相关的陈旧行。
|
||||
* **带 `prune`,已落地的行由基座 `skipLanded` 跳过**(2026-08-31 改回)。曾特意不带
|
||||
* `prune`(2026-08-30 e2e 案例 2:已落地的旧类型行撤不掉,配方整单炸)—— 代价是
|
||||
* **没落地的**陈旧行也不清:人把候选从 LDO 改回 DC-DC,LDO 的字典/字段行积在屏上
|
||||
* (2026-08-31 用户实测点名「下面还是显示两个类型」)。现在 `draftDrop` 对配方这一路
|
||||
* 跳过已落地的行(loop-engine/port.ts),prune 回来:没落地的陈旧选型照撤,
|
||||
* 已落地的原地留下 —— 案例 2 不再炸,用户那条路清得干净。
|
||||
*/
|
||||
it('②③ 两笔自投影都读 sub_eval.part 的 chip_type_id 去查字典/字段清单,原样抄回自己(不带 prune)', () => {
|
||||
it('②③ 两笔自投影都读 sub_eval.part 的 chip_type_id 去查字典/字段清单,原样抄回自己(带 prune,已落地由基座跳过)', () => {
|
||||
const chipType = acts[1];
|
||||
expect(chipType?.kind === 'project' && chipType.into).toBe('parts.chip_type');
|
||||
expect(chipType?.kind === 'project' && chipType.prune).toBeUndefined();
|
||||
expect(chipType?.kind === 'project' && chipType.prune).toBe(true);
|
||||
expect(chipType?.kind === 'project' && chipType.from).toMatchObject({
|
||||
each: 'mine:sub_eval.part',
|
||||
then: { each: 'parts.chip_type', where: { type_id: { outer: 'chip_type_id' } } },
|
||||
});
|
||||
const typeParam = acts[2];
|
||||
expect(typeParam?.kind === 'project' && typeParam.into).toBe('parts.type_param');
|
||||
expect(typeParam?.kind === 'project' && typeParam.prune).toBeUndefined();
|
||||
expect(typeParam?.kind === 'project' && typeParam.prune).toBe(true);
|
||||
expect(typeParam?.kind === 'project' && typeParam.from).toMatchObject({
|
||||
each: 'mine:sub_eval.part',
|
||||
then: { each: 'parts.type_param', where: { type_id: { outer: 'chip_type_id' } } },
|
||||
|
||||
Reference in New Issue
Block a user