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:
@@ -208,6 +208,8 @@ export function createAutoRunner(deps: AutoRunnerDeps): {
|
||||
kept.add(keyText(key));
|
||||
}
|
||||
let localDropped = 0;
|
||||
/** 已随「数据工单确认」落地、prune 不动它的行数 —— 跳过要说给人听(debt 那条的原话要求) */
|
||||
let localLandedKept = 0;
|
||||
/*
|
||||
* **人正在件上编辑的时候不 prune**(2026-08-29 终审 F3)。
|
||||
* `prune` 的语义是「这一笔投影出来的行就是这张表的全部,多出来的撤掉」——
|
||||
@@ -221,14 +223,23 @@ export function createAutoRunner(deps: AutoRunnerDeps): {
|
||||
const key: Record<string, string> = {};
|
||||
for (const column of decl.keys) key[column] = String(stale[column] ?? '');
|
||||
if (kept.has(keyText(key))) continue;
|
||||
const { dropped: gone } = await deps.data.draftDrop({ taskId: context.taskId, domain: decl.domain, object: decl.object, key });
|
||||
/*
|
||||
* `skipLanded`:已随「数据工单确认」落进正式表的行不撤、也不炸(2026-08-31)。
|
||||
* 从前这里不传,已落地的陈旧行让整个配方抛错停摆(2026-08-30 e2e 案例 2),
|
||||
* ②③ 那两笔被迫整个放弃 prune —— 连**没落地的**陈旧行(人改了类型选择,
|
||||
* 旧类型的字典/字段行)也跟着积在屏上。现在已落地的原地留下(它是世界的
|
||||
* 一部分),没落地的照撤 —— 两种行各得其所。
|
||||
*/
|
||||
const { dropped: gone, landed } = await deps.data.draftDrop({ taskId: context.taskId, domain: decl.domain, object: decl.object, key, skipLanded: true });
|
||||
if (gone) {
|
||||
localDropped += 1;
|
||||
dropNames.push(rowName(key, decl.caseKey));
|
||||
} else if (landed === true) {
|
||||
localLandedKept += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (localWrote > 0 || localDropped > 0 || localExisting > 0 || localUnkeyed > 0) {
|
||||
if (localWrote > 0 || localDropped > 0 || localExisting > 0 || localUnkeyed > 0 || localLandedKept > 0) {
|
||||
/*
|
||||
* **kind: 'observation' + `internal: true`**(2026-08-29 终审 I5,控制端裁定 F2)。
|
||||
* `kind` 必须是 `observation`:`result` 不在 `task-log.ts` 的 `SKELETON` 里,进不了工作日志(R10)。
|
||||
@@ -253,7 +264,9 @@ export function createAutoRunner(deps: AutoRunnerDeps): {
|
||||
/* 撤了要点名(M2):不点名的话,下一拍的读者(人或模型)对不上是哪几行没了 */
|
||||
(localDropped === 0 ? '' : `,撤掉 ${localDropped} 行(${nameList(dropNames)})`) +
|
||||
/* 少写了几行要出声(M1):静默 continue 的那几行,表里少了谁也查不出为什么 */
|
||||
(localUnkeyed === 0 ? '' : `,${localUnkeyed} 行因主键算不出来没写(主键列:${decl.keys.join('、')})`),
|
||||
(localUnkeyed === 0 ? '' : `,${localUnkeyed} 行因主键算不出来没写(主键列:${decl.keys.join('、')})`) +
|
||||
/* 已落地的陈旧行跳过也要出声 —— 「这几行已经入库、这一笔没法帮你清」的实情说给人听 */
|
||||
(localLandedKept === 0 ? '' : `,${localLandedKept} 行已随数据工单入库、这一笔不清它`),
|
||||
detail: {
|
||||
auto: `${context.stepId}#${index + 1}`,
|
||||
ledger: action.into,
|
||||
|
||||
Reference in New Issue
Block a user