forked from ChaiHao/BPOS-MVP
A2-A7 全部补齐到验收线;顺手把几处「门拦住却不给路」的坑填了
活动:A2 选型 / A3 寻源 / A4 定价 / A6 议价 / A7 归档五件各补成真活动包 —— 契约宽进(input.required 空,归一在活动内)、台账必填声明(含行级 requiredWhen)、 入场哨兵与 L1/L2 判据一律读基座数、两份件(在办可编辑 + 办结静态快照)、 三案例常备、包内自测。e2e 各三案例 released、行动被拒 0、发口正确、提交闸每单真拦。 基座(共享面,改一处影响所有活动,故每处都带回归): · 重发判断走在站上场之前 —— 人答完那步常已收掉,readyToWork 先抛「不能再往它上面挂活」, 于是「重发已答过的卡 = 无事发生」这条唯一活路在最需要时够不着,A1 基线当场熔断; · 决策卡补幂等兜底(与执行工单同一把尺):头两次无事发生,第三次起才算被拒; · 输出没成形先就地重问一次,原话进工作日志、不再摆上卡面; · 工具调用读数 tool_<名>_calls —— 「机检只读基座数」这条纪律第一次覆盖到工具; · 执行卡 steps/standard 补进出参 schema(从前能到卡面全靠厂商 JSON 模式宽松); · 件的就地更新改逐节点 morph,保存先把新值镜像进只读那份 —— 不闪、不等回声。 A1(基线,全程守住):措辞三档对齐(必填/建议/选填)、禁止拿历史价当客户目标价、 卡骨架从步骤剧本搬进说明书(压成一拍连做时剧本没摊开,会发出没有指导书的裸卡)。 契约两处**新增可选字段**(非破坏):FieldDeclaration.requiredWhen、工单 finalHtml; api-report 同批更新。docs/adr 与 docs/archive 的 13 份文件在工作树里不见了, 本次予以恢复而非提交删除。 门禁:typecheck / lint / depcruise / test(1366)全绿。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+165
@@ -787,3 +787,168 @@ JS 拼的 class 与 `style="flex:N"`→`data-class-of`)。规范 §10.3.1 已立
|
||||
`customer.contact`(主数据)里,可老客户不重写主数据、本单草稿里根本没有那一行;
|
||||
顶层裸键又与 `customer.profile.name` 撞名(后写的赢)。
|
||||
**一张写着公司名的联系人卡比空着更坏**,所以跟 `customer_name` 同一笔写下。
|
||||
|
||||
## 算出来的口只在前端算数(2026-08-02,A2 e2e 逼出来的,已销)
|
||||
|
||||
A2 第一轮端到端:七拍零被拒、去向已算出 `to-sourcing`、验收 pass ——
|
||||
死在最后一步:「放行未确认分支结论:选择组 alt-route 未选出口」,台账已合并、单落 `blocked`。
|
||||
|
||||
查下来是 2026-08-01 那次「routedPort 那一路 selectedPorts 恒空」的修法**只修了一半**:
|
||||
补的是**前端**(chat-bubbles 回传时把算出的口塞进 `selectedPorts`)与
|
||||
**服务端返回值**(human-tool-service 的 outcome)。而放行落地读的是第三样东西 ——
|
||||
**人事件载荷**(`publishHumanEvent({ payload: { ...reply } })`,原始回传),
|
||||
那一份谁都没动。于是浏览器活着(它自带口)、返回值好看(没人读它),
|
||||
换个客户端(脚本、API 调用)就死在落地,而服务端注释还写着
|
||||
「人回传里带不带都不作数」—— **注释描述的行为在引擎读的那条路上从来不成立**。
|
||||
|
||||
修法:`replyWorkOrder` 在发事件**之前**算好有效口(routedPort 优先、算不出才认人选),
|
||||
事件载荷与返回值用同一份。**服务端说了算的事,不靠每个客户端自觉** ——
|
||||
前端那段照旧发,发什么都会被有效口盖掉。
|
||||
|
||||
顺带两条实测账(代答脚本要知道的):
|
||||
- 执行卡 `fields` 缺席时基座兜底加一枚**必填**「结果」回执字段(`fillCard`),
|
||||
交卷载荷要带 `values.result`,否则「必填字段未回填:结果」;
|
||||
- A3 的提交闸第一次真拦人:单飞归一出两颗料、脚本只填一颗,交卷被点名
|
||||
「还有 1 条必填没填 —— SRC-…/XC6206P332MR 缺底价」—— 与件上红带、放行门 L1
|
||||
同一个数同一套算法,拦的位置和话术都对。
|
||||
|
||||
## 2026-08-02 · A2 判稳该 decisionTask 化 —— 说明书拦不住「不查工具直接编」
|
||||
|
||||
单飞案例连续两轮走岔:S3 判稳一拍,模型**一次都没调** `crm.history-price-read`,
|
||||
直接给替代料写「历史 43 天·行情稳 → 转 A」(数是编的),去向从 to-sourcing
|
||||
岔成 to-pricing。说明书已写到头(「判稳的行情只有一条来路 —— 这一拍亲自查
|
||||
alt_pn」「不许拿上游的数顶替」都在),流内两案例被这些话治住了,单飞治不住:
|
||||
没有上游数可抄时它就自己编,措辞层面无解。
|
||||
|
||||
**该走的路**:判稳是死规则(≤90 天且稳 → A,否则 → B)+ 机器可得的入参
|
||||
(工具出参)—— 「能算的不问 LLM」,这一步本该像 A1 的 S5 那样交给引擎:
|
||||
① 判稳规则进 DMN 表(`ALT_DMN` 现在是空的);② S3 改 decisionTask 或
|
||||
第一方工具出参直接带 `type_tag`/`basis`(模型只照抄,抄错有对号检查);
|
||||
③ 收步判据加「凭据齐」(原 C 行 `history_days` 非空 —— 需要 `requiredWhen`
|
||||
或「非空行数」读数承载)。
|
||||
|
||||
**现状兜底没断**:验收页 `editableAtRelease` 含 `type_tag`,人改标去向即变
|
||||
(routedPort 读 tally 现算)—— AI 第一稿错,人签字前看得见改得动。
|
||||
|
||||
## 2026-08-02 · 入场哨兵读自报列 —— A2/A3 也有同一条缝
|
||||
|
||||
A1 踩实的病(用户实测单 584655b6,humanCalls 4/4 耗尽 exhausted):`s_parsed` 读
|
||||
模型自报的 `line_total`,模型把 record 三行在 S1 拍写完、没记这个数,S2 空手收步 ——
|
||||
门永不开,引擎报「依赖断点」,提示词「断点请调人」把模型推去发**补全卡**绕路,
|
||||
两张多余的卡烧光人环预算。已修:s_parsed 改读基座数的 `quote_intake_record_rows`
|
||||
(A1@46.0.0),该形态复跑 released、被拒 0、断点 0、补全卡 0。
|
||||
|
||||
**同一条缝还在 A2/A3 的入场哨兵里**(尚未咬人,记账待修):
|
||||
- A2 `s_normalized` 读自报 `alt_line_total`、`s_filled` 读自报 `filled_total`;
|
||||
- A3 对应哨兵同款。
|
||||
S1 的 guide 都教了「第一件事写这个数」,所以节奏对时不踩;但 A1 证明了
|
||||
节奏是模型抖出来的,不是承诺。照 A1 的方子换成 `_rows` 类基座读数即可
|
||||
(s_filled 这种「人环收回」型要另想承载 —— filled_total 是「答复处理过」的记账,
|
||||
基座数不出来,或可读 DONE 计数 `_sel_stage_done`)。
|
||||
|
||||
## 2026-08-02 · 补全卡退役的扫尾
|
||||
|
||||
行为已全局退役(归一层 ask→零输入执行工单;引擎直发拒;提示词/规范/三活动清理)。
|
||||
留着的旧物,后续轮清:
|
||||
- 契约类型 `ChatCard` 的 elicitation 分支与 `checkChatCard`/`checkChatCardReply`
|
||||
的对应校验(历史卡回放还要认,删除走三步弃用);
|
||||
- 前端补全卡渲染(历史对话里旧卡要能显示);
|
||||
- `process.start` 起单缺 required 顶层键时发补全卡的老路 —— 三活动 required
|
||||
全空后实际不触发,彻底移除时一并清。
|
||||
|
||||
|
||||
## 2026-08-02 · A2 已落的两条全局口径,A1/A3 待跟进
|
||||
|
||||
- **一张模版贯穿到底**(用户:「待处理的 HTML 报告完成后直接转变为静态的工作成果」):
|
||||
A2 已并成一张(alt-roster 退役);A1(四张按局面换)与 A3(worksheet/roster 两张)
|
||||
仍是旧制,按 A2 的样子归一。
|
||||
- **空占位三级统一**(必填红/建议填橘/选填灰):A2 已上;~~A1~~(2026-08-03 已上:
|
||||
品类/制造商/目标价按声明的 expect 标橘「建议」,quote-intake@48.0.0,用户点的是目标价)/
|
||||
A3 的占位词还是旧两级(待填红/选填灰),跟着声明的 required/expect 换新三级。
|
||||
|
||||
## 2026-08-03 · A4 补齐时发现、没动的两处共享面
|
||||
|
||||
- **放行门拒回仍会指向两扇打不开的门**:`_rows > 0` 但某个 `tally` 列一格没填时,
|
||||
拒回只给「改数 / 改行」两条路(而两者都对),模型原样重提到熔断。
|
||||
基座那条「`_rows = 0` → 直说那一步还没办」只覆盖了「一行都没写」,
|
||||
没覆盖「行写了但分类/处置列没填」。**拒回的话是下一拍的行动指南**(已立纪律),
|
||||
该按「哪一列还空着」点名。A4 靠独立成项 `S3_gate` 绕过去了,病根还在。
|
||||
- **单飞造号会借用正式表里别单的单号**(第三次现形:A2 借走 MD14.1、A4 借走 RFQ-2026-0777)。
|
||||
A2/A3/A4 三处都只靠说明书措辞防守(「只从本单来件取材」「必须 PRC- 开头」)。
|
||||
**措辞治不了的结构治**(设计律第六条):造号该由基座给(同组主键 + 序号,
|
||||
与 `FieldDeclaration.auto` 同一条路),不该让模型自己编。
|
||||
|
||||
~~**决策卡没有幂等兜底**~~(2026-08-03 已修:`resendVerdict` 抽成纯函数,
|
||||
执行工单与决策卡同一把尺,头两次无事发生、第三次起算被拒,6 测钉死)。
|
||||
|
||||
## 2026-08-03 · A6 补齐时发现、没动的三处基座欠账
|
||||
|
||||
- **`listen` 动作在引擎里恒挂起**:`turn-runner` 对 `listen` 返回 `awaiting`,要外部
|
||||
data/time 事件才唤得醒,而 desk 侧**没有任何路由能把 data 事件投给指定任务** ——
|
||||
「等客户回音」这类等外部的活,活动只能落在执行工单上(人收到信、把回音填进件里),
|
||||
时限那一侧靠 `declarations.listeners` 静态监听。A6 已按这条口径建模并有测钉死
|
||||
(剧本不许教 `listen`)。要让 `listen` 真能用,得补一条「把外部事件投给某任务」的入口。
|
||||
- **依赖断点那几拍,全局提示词只说「请调人或立监听」**,而当下可为为空时模型手上
|
||||
只剩计划项的**中文名** —— 它会拿中文名当 `itemId`(实测连拒两拍)。活动侧只能靠
|
||||
说明书兜(A6 把 itemId / ask / 选项值写死进说明书)。**治法在基座**:断点提示里
|
||||
把可用项的英文 id 一并摆出来。
|
||||
- **`mail.send` 至今没有活动敢用**:写类工具放行落地要过「入参 schema + `isInvocable`
|
||||
+ 目标预校验」三道,而治理台白名单授权口仍挂在 §15⑤。A6 `tools: []`,
|
||||
报价函靠执行单上那句话交给人发 —— 现状如实,但「谁真发了出去」系统并不知道。
|
||||
|
||||
## ~~2026-08-03 · A2 判稳偶发不查工具~~(当日已结构治)
|
||||
|
||||
**症状**:A2 单飞那条案例约十次一次 —— 替代料没查行情就判「稳」转 A,
|
||||
去向从 `to-sourcing` 走成 `to-pricing`(实测 2026-08-03 全量回归一次)。
|
||||
说明书已经写到头(「判稳的行情只有这一条来路 —— 这一拍亲自查 alt_pn」
|
||||
「不许传原 PN」「不许拿上游带进来的数顶替」),**措辞治不了的结构治**(设计律第六条)。
|
||||
|
||||
**可行治法**(基座已具备一半):工具出参本来就入痕 ——
|
||||
`turn-runner` 每次调完写一条 `kind: 'result'` / 标题 `${tool} 返回` / detail 带 output。
|
||||
所以「这一单到底调没调 `crm.history-price-read`」是**基座数得出来的事实**,
|
||||
不必让活动自报。补一类判据谓词(如 `tool_called_crm_history_price_read > 0`,
|
||||
与 `域_对象_rows` 同族的读数),A2 就能立一条 L2:
|
||||
**「转 A 的依据来自本单亲查的行情」** —— 机检只读基座数,这条纪律第一次真正覆盖到工具。
|
||||
|
||||
**当下兜底**(已在):验收页 `type_tag` 可改、去向跟着变;人在放行那一屏能纠。
|
||||
|
||||
**~~已落地~~**(2026-08-03 当日):基座新增读数 `tool_<工具名去符号>_calls`
|
||||
(`toolCallReadings`,按留痕数成功返回的次数,声明过的工具一律先铺 0;
|
||||
调失败不算查过 —— 调不通等于没拿到行情)。静态审与包内自测的「谓词绑得上」
|
||||
名单同批扩到这一类。A2@4.14.0 立 L2:
|
||||
`quote_alternative_list_type_tag_a = 0 or tool_crm_history_price_read_calls > 0`
|
||||
——**写成析取**:一颗都没转 A 就无需查行情(全 B 那条路合法),
|
||||
有 A 才必须有过这一次亲查。**「机检只读基座数」这条纪律第一次覆盖到工具**。
|
||||
|
||||
## 2026-08-03 · A2 常路案例会**跳过派给 FAE 的那一步**(未修,已定位)
|
||||
|
||||
**症状**:`a2` 案例①(两颗 C · 替代无历史)连续三轮 6 拍收口,**一张执行工单都没发**——
|
||||
轨迹里模型自称「2 颗替代料都查过行情、都转成 B 类」:替代料是它自己填的,
|
||||
FAE 从头到尾没被叫过,单子照样 released(去向还对)。案例②③ 正常派单(7 拍)。
|
||||
|
||||
**病根**:S2「派选型单」的 `doneWhen` 认的是**件上那几格填没填**
|
||||
(`alt_pn/alt_brand/alt_grade` 由 requiredWhen 钉在 orig_type=C 行)——
|
||||
而这几格模型自己也写得进去。它一写,收步条件当场成立,引擎就把这一步收了,
|
||||
**人环整个消失**。这正是「凡触达世界的项一律不给 `doneWhen`」那条纪律的反面教材:
|
||||
「把清单交给 FAE 选型」触达的是人,它的完成与否不该由数据形状推出来。
|
||||
同时它也踩了 `no-fake-alt` 禁令(没把握的替代不该编一个顶上)。
|
||||
|
||||
**治法**(与 T_release 同款,未施工):S2 改 **人工激活 + 不给 doneWhen** ——
|
||||
派单那一下由模型显式做,收步由人交回触发;并在剧本里写死「替代料三列一格都不许自己填」。
|
||||
**验证口径**:`a2` 三案例都必须出现「件上保存 / 交卷执行卡」两行,6 拍收口即判失败。
|
||||
|
||||
**排除项**:不是 2026-08-03 那条工具留痕判据引起的 —— 撤掉判据(@4.15.0)后原样复现。
|
||||
|
||||
## 2026-08-03 · 件上保存偶发不落那一格(间歇,两处独立撞见)
|
||||
|
||||
**症状**:`a1` 案例把 `DAG2400L321504XZB01-R0` 的年用量存进件上(`POST /tasks/:id/table`),
|
||||
返回 200,而紧接着的提交闸仍报「缺年用量 EAU」,连拦三次判失败;
|
||||
同一条案例前后几轮都正常。A6 那一轮独立撞见**同一行同一列**的同款症状。
|
||||
|
||||
**已排除**:不是提交闸失效(拿单直接空手交卷实测吃 400,且点名缺哪一行哪一格);
|
||||
不是那一轮的说明书改动(A1@49.x 只改措辞,保存走的是基座那条链)。
|
||||
|
||||
**下一步怎么查**:保存那一下服务端按「收件自己说的话」(`data-edit` 地址 + `data-col` 列名)
|
||||
落草稿层,主键靠行内 `data-col` 的主键格给出 —— 怀疑点在**主键补齐**那一段
|
||||
(A2 走查逮过一次「主键格没挂 data-col → 服务端按全表一致列补键 → 两行对到同一行」)。
|
||||
复现要碰运气,建议下次带着「保存请求体 + 落库后草稿行」两份留痕对着看。
|
||||
|
||||
Reference in New Issue
Block a user