数据工单只建名单上的料:拼出来的料号与在库的料号写下来都当场拒(W05 1.4.1)

用户在新一单上看到件上多出一行要人补的料号。查实:模型在数据工单里给一颗**不存在的**
XL2596S-ADJ 铺了空骨架 —— 库里没有、入参里也没有,是把两个候选的名字拼出来的;
件上于是多出一行、红带点名它缺品牌。存在性核对本身判对了(ADJ found、XL absent),
错在「判对了却多写了一行」—— 事实在模型手里,能判对也能写错。

两道门,都在写入那一刻:
- `parts.profile.internal_pn refersTo sub_eval.pn_check.internal_pn` —— 只许建核对表里核过的料号,
  凭空拼出来的当场拒(参数/资料两张子表的 internal_pn 本就引用 profile,随之一并拦住)。
- 契约新增对象声明 `createOnly`(平台侧,~25 行):标了的表本单只建不改,键已在正式表当场拒并指路。
  它守的是另一形(在库的料被当成新料重建)。只管 Agent 的写路径,人在件上的保存不受此限。
纯函数 `createOnlyViolation` 可测(复合主键按全部键列比);活动侧三张 parts 表标上;剧本补一句。
当前在跑那一单的草稿里拼出来的那行已手工撤掉。2100 测 / typecheck / lint / depcruise 绿;api-report 已刷。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FJcX8A6TWp4GRs41TYryEh
This commit is contained in:
xcs
2026-08-27 13:28:25 +08:00
co-authored by Claude Fable 5
parent 51c87af583
commit fa27cef60e
8 changed files with 99 additions and 4 deletions
+11
View File
@@ -218,6 +218,17 @@ export const objectDeclarationSchema = z.object({
* 安装期就能核:它在不在 fields 里、是不是主键的一部分。
*/
caseKey: identifier.optional(),
/**
* **本单只许新建正式表里没有的行**(2026-08-27,W05 数据工单逼出来的)。
*
* 数据工单让人「从零建一张主数据」—— 这张表在本单里的语义就是**只建不改**。
* 实测(W05):模型在数据工单里多铺了一行不该建的料号 —— 件上于是多出一行要人填的记录,
* 红带点名它缺品牌;剧本写了「found 的一行都不建」拦不住。这一项守的是其中一种形:
* **在库的料号被当成新料重建**。标了它的表,写入那一刻查正式表:键已经在库 → 当场拒并指路
* (墙要配路:撤掉那一行)。凭空拼出来的料号由 `refersTo` 核对表那道门管。
* 只管 Agent 的写(人在件上的保存走另一条路,不受此限)。
*/
createOnly: z.boolean().optional(),
/**
* **这张表的每一行还是一份资料文件** —— 哪几列合起来是那份文件(2026-08-23 加)。
*