Archived
E04 修到零被拒线,harness 补七刀:跨进程租约与广播桥、原子写、引用墙、对话区按序号排
活动侧(E04 2.1.0 → 2.1.9,I01 1.2.2): - 覆盖闭合成为机检:基座新增 distinct 读数,「计划盖住的客户数 = 候选行数」钉进 S3 收步 / S4 哨兵 / 放行 L2;人加的候选客户不再被整单无视 - 「关键人待识别」占位句式全链退役:查无联系人先发数据录入卡收人;契约新增 refersTo, 计划/回执的 contact_code 只许引用真实存在的联系人(安装期核引用目标) - 台账更新确认摆全落库面:客户档案/联系人档案两张落库预览(touched: 数据源, 正式现值 + 草稿叠加),可补改、可加行(自增主键由基座续号);姓名升必填 - 更新明细:update_key 位置键 + 「同一处只留一条」L2;依据写人话不带机器键; 标题旁不摆单号;判据与文案不夹字段名;行标识去掉单标识那一段 - 回执骨架 = 计划行数钉进 S3 收步与 S4 哨兵;重做分支不许删计划凑数 - 阶段刻度对齐文档 7 步;起单样例预填满 基座侧: - 两个后端连同一个库:task-claim 跨进程租约(迁移 0030)+ Postgres LISTEN/NOTIFY 广播桥;对话区按任务内记忆序号排,不按墙上时钟;并卡「刚说过话」按记忆序列判紧邻 - 多行 write 整批先验后写(dryRun),被拒 = 一行都没落 - 决策卡意见与本单草稿字面比对,归属以观察进轨迹(note-anchors) - 括号栈补「补闭括号」两形(少一个 } / 行对象没关直接跟下一行) - 件上加行:空着的自增主键直进续号,不从别的行借号;未落下的行点名回给前端 - 人答复落库那一刻就把 runtime 翻 running(task.wake),两块同帧变脸 - 试跑单可落真库(land_master,迁移 0031,默认开);数据域按活动分组; JSON 列不再是 [object Object];按钮键感 + 在办进度条 + 防抖 - 报价链 A1–A7 从系统卸载(只卸不删源码),种子只装 E04/I01 契约变更(api-report 已刷新):FieldDeclaration.distinct / refersTo, objectDeclaration.file,landMaster,unkeyed,assetFiles,ledgerByActivityRoute。 1700 测 / typecheck / lint / depcruise / api:check 绿。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EEJX8Z7CHejvwmDQyPQuBX
This commit is contained in:
@@ -1026,6 +1026,274 @@
|
||||
归档的 .xlsx 落盘后 `file` 认作 **Microsoft Excel 2007+**、python `zipfile` 读得出
|
||||
整张对照表。新测 8 条(存哪些不存哪些 + 主键拼法);`reset-runs` 一并清这张表。
|
||||
|
||||
- **两个后端连同一个库,把同一张单推坏了**(2026-08-24 柴浩实测:E04 一单五拍熔断;
|
||||
用户中途提示「本机和局域网另一台机器的同一个后端都连着这个库」——最后一块拼图):
|
||||
症状是**两堵墙对着撞** —— `finish S2` 被拒「从没给它发过卡」,而重发那张卡又被拒
|
||||
「这件事刚问过,人也答过了」。查下来:卡确实发过(11:17:53 发、11:18:01 人答的),
|
||||
可局面里 **8 个计划项的 `worldTouched` 全是空**;同一步 S1 被收了两遍
|
||||
(两条 rationale 只差一个标点 —— 是两次独立采样,不是重放)。
|
||||
根因:两边的推进器各自 2 秒扫一次「running 的单」,**同时推同一张**,
|
||||
两拍并发写同一份 `sys.loop_state`,**后写的整份覆盖先写的** —— 发过卡这个事实就此消失。
|
||||
而互斥只在进程内(`task-lock.ts` 开头自己写着「MVP 单进程…多进程部署时再叠一层」)。
|
||||
**修**:`workers/task-claim.ts` —— 库里一列 `advancing_until`(迁移 0030)当跨进程租约,
|
||||
推之前一条 SQL 判+占(判与占分两句写就是经典竞态),推完就还,带 5 分钟过期
|
||||
(进程崩了不锁死);推进器与派发器两条推进路径都接上。
|
||||
实测:两条真连接对着真库抢 20 轮,**每轮恰好一个赢**;租约过期后另一方接得上。
|
||||
**还欠**(记 debt):`loop_state` 本身没有乐观并发(版本号 / CAS)——
|
||||
租约挡住了主路,但绕过它的第三条路仍会**悄无声息**地整份覆盖。
|
||||
排查法留一条:`worldTouched` 全空 + 同一步收两遍 = 并发覆盖的指纹。
|
||||
|
||||
- **点了要有反应,在办事要说出来**(2026-08-24 用户:「点击了都不知道点没点上」):
|
||||
两件事各缺一半。①**键感**:治理台整套 `g-*` 控件一条 `:active` 都没有,工作台只有零星几个;
|
||||
更糟的是有 `:active` 的那几个把 transform 一起塞进了 0.16s 的过渡里 ——
|
||||
一次点击常常比这还短,手抬起来时键帽才刚下去一半。新增 `styles/press.css`
|
||||
(三面共用、**装在最后**):按下 `scale(.97)`(整行整卡这类大件收到 `.995`,同样幅度会晃)、
|
||||
**按下这一刻不过渡**(松开仍走控件自己的过渡,回弹是软的)、`:focus-visible` 描圈。
|
||||
②**在办**:请求在路上的那几百毫秒屏上从前一动不动 —— 新增 `shared/Btn.tsx`,
|
||||
`busy`(递 `mutation.isPending`)或 `onClick` 返回的 Promise 一亮,按钮脚下走一道
|
||||
不定长进度条。**不给 `disabled`**:那会把按钮画成灰的,而它此刻正在**做**这件事,
|
||||
不是做不了(界面不撒谎)。全仓 40 余处会去请求服务端的钮都换成了它;
|
||||
勾选与下拉给不了键感,改成把**那一行**点亮(认 `mutation.variables`,只亮真正在路上的那一条)。
|
||||
途中两个坑各留一条账:**条不能画进按钮自己的 background** —— 第一版用 background-image,
|
||||
在真页面上量出来根本不存在:`.tbtn` 这类皮肤用 `background:` 简写上色,
|
||||
特异度压过 `[aria-busy]`,图片当场被顶回 none(动画照跑,条却没有);改用 `::after`
|
||||
(全仓按钮类没有一条定义过伪元素,审过)。**`<select>` 一律不挂 `aria-busy`** ——
|
||||
替换元素画不出伪元素,且它的下拉箭头本身就是 background-image。
|
||||
③**防抖按在唯一通道上**(`typed-fetch.call`):在途去重(同一笔还在路上,第二次点击
|
||||
拿到同一个 Promise)+ 落地后 450ms 的双击窗(**只管写请求**:读请求写完立刻重取的
|
||||
那一下不能被当成余震压掉);失败的不进窗 —— 那时候再点是重试,重试必须真的重试。
|
||||
按在这里,所有点击路径一次盖全,不必指望每个调用点自己记得。
|
||||
④顺手修一个**没接线的钮**:对话区空态那枚「发送」从来没有 `onClick`,
|
||||
只有文本框里按 Enter 才发得出去 ——「点了都不知道点没点上」在那儿是字面意思。
|
||||
实证:浏览器里量了层叠(探针类复制 `:active` 规则,`.tbtn`/`.jc-tnav-tab`/`.jc-topbar-logout`
|
||||
都真到 `scale(.97)`、`transition-duration: 0s`)、真点了会走网络的钮(条真现身真收掉)、
|
||||
连点三下只发出**一个**请求。新测 9 条(callKey / 在途去重 / 双击窗 / 读写分野 / 失败不进窗)。
|
||||
|
||||
- **四件事一起收**(2026-08-24 用户连报):
|
||||
①**进度条的刻度与业务步数对不上**(「E04 应该是有 7 步、给人确认是 4 步,这里要是 x/7 才对」):
|
||||
`COVERAGE_PHASES` 从前按归口粗分三段 → 屏上 x/4,而文档开篇写的是「整体流程(7 步)」——
|
||||
同一件事两个数。改成一段一步(6 段 + 基座那格「放行收口」= 7),与文档那张表逐行对齐;
|
||||
四张卡就是那 4 个「给人确认」的刻度。实测:`4/7 · 经营计划审批`。
|
||||
(踩了一脚:注释里写 `x/7` 那个星斜杠就是块注释的结束符,esbuild 当场报在几行之外。)
|
||||
②**件上新增的行被静默丢掉**(「新增了一个客户,推进到下一步直接就把这一行遗漏掉了」):
|
||||
主键那几格空着就凑不出钥匙,基座一句 `continue` 跳过,而接口照回 `{ok:true}` ——
|
||||
**保存说成功,东西却不在**。查的时候又逮出更凶的一面:表里恰好只有一行时,
|
||||
「全表一致」把那一行的客户编码当成常量补给新行,**当场把老行覆盖掉**
|
||||
(与 2026-08-23 序号型主键那次同一条规律,当时只按「是不是整数列」绕开了)。
|
||||
现按**他填得了吗**统一判:件上摆着的主键格,空着就不许基座替他编值;
|
||||
没落下的行点名回给前端(只点他填得了的那几列),件上方红字说清。
|
||||
I01 的序号型主键照旧由基座续号,不受影响。
|
||||
③**界面停在「AI 推进中」,刷新才发现已经在等人**:`createBroadcaster()` 是**进程内**的
|
||||
一个 Set —— 那会儿两个后端连同一个库,单子被另一台推着走,这一台的浏览器一个字没收到。
|
||||
加 `broadcast-bridge.ts`:Postgres `LISTEN/NOTIFY` 当桥(不引消息队列),自己发的自己不收,
|
||||
形状不对的载荷丢掉。实测:另一台 NOTIFY 一条,本机 SSE 立刻收到。
|
||||
④**数据域按活动重写**(用户定):从前按性质分组(主数据/单据/派生)——那是治理这张表的人的分法;
|
||||
而人跑完一单来这儿问的是「我这个活动写了哪几张表、现在各有几行、刚那一单落下了什么」。
|
||||
新增 `/api/gov/data/by-activity`:每个活动 → 它声明的表 + **正式行数** + **在办草稿行数** +
|
||||
最近三单。三个数各说各的:没物化就不给数(「声明了没写过」与「写过又空了」是两件事)。
|
||||
实测 E04 一单跑完,那一屏从「正式 18 行」变成「正式 24 行」、最近的单标「已放行」。
|
||||
- **试跑单也能「落真库」了**(2026-08-24 用户:「活动执行后数据并没有真实入到后台数据库里面」):
|
||||
实情是一半 —— **单据真落了**(`crm_coverage.*` 有行、有值),**主数据被挡在活动缓存里**
|
||||
(`ledger-service` 那道门:试跑往 `customer.profile` 建一位客户,那位客户就永久留在库里,
|
||||
「新客户来函」样例第二次跑就成了老客户)。可这条保护在演示时正好拦住要看的东西:
|
||||
台账更新明细白纸黑字写着「亲密度 3 → 10」,而 `customer.contact` 里还是 3 ——
|
||||
**单据说改了、主数据没改,两份事实对不上**。
|
||||
现给试跑一个开关:`sys.task.land_master`(迁移 0031)+ 起单入参 `landMaster` +
|
||||
试跑台上一个复选框;`isSimulated` 认这一列。
|
||||
**默认打开**(用户当场定:「那你就默认给它打开」)—— 跑一遍活动就该看见数据真的变了,
|
||||
这是本分;保护没取消,只是**换了落点**:要它的那个调用方自己关
|
||||
(`tools/e2e-a2.mjs` 显式传 `false` —— 只能测一次的样例归它管)。
|
||||
**默认值服务于人手点的那条路;脚本要什么,脚本自己说。**
|
||||
实测(不传任何参数起一单 E04):`land_master = t` → 放行写合并 16 行、**没有**「只留在活动缓存」,
|
||||
活动自己新建了两位关键人(CU-0142-02/03)、覆盖度 17 → 33。
|
||||
|
||||
- **人加的候选客户被整单无视:覆盖闭合成为机检**(2026-08-24 柴浩实测:「覆盖范围确认
|
||||
步骤我新增了一行要覆盖的用户,后面推进直接无视了」):行**落了**台账(candidate 两行、
|
||||
focus 段模型看得见、`_rows = 2` 也在),而 plan/receipt/收口全是 CU-0142 的 ——
|
||||
模型锚在轨迹「识别出 1 家」上;S3 收步判据只数 `plan_rows > 0`、放行也没有一条钉
|
||||
「盖没盖住每一家」,一路绿灯 released。三处合谋,三处一起修:
|
||||
①**基座新增 `distinct` 读数**(声明列标 `distinct: true` → `域_对象_distinct_<列>`,
|
||||
空值不算一种、零行铺 0,静态审计认它)—— 「计划盖住几家客户」从此是基座数得出来的数
|
||||
(计划行数 ≠ 客户数,一家几位关键人就几行);E04@2.1.1 把闭合
|
||||
`plan_distinct_customer_code = candidate_rows` 钉在 **S3 收步 / S4 入场哨兵 /
|
||||
放行 L2** 三处。②**「就地修订」痕点名新增的行**(从前只说「新增 1 行」,哪张表、
|
||||
哪家客户都不说;撤行 2026-08-02 就点名了,加行是同一条道理的另一半)+ 行动指南
|
||||
「人加的行同等作数,按台账现读全表办」;说明书立「人核对过的候选清单是每一步的
|
||||
输入契约」。③**墙要配路**:人加的客户常在主数据里零联系人,S3 给「首访建档」的路
|
||||
(计划行 contact_code 用 `-00` 占位引用、缺口按默认尺算、不往主数据建假号),
|
||||
S6 补写它的客户档案、回执带回真人再建真档。
|
||||
**验收**:e2e e04 复刻案例(件上加 CU-E2E-ADD)—— 决策卡改口「共4条,覆盖2家客户」、
|
||||
**released、被拒 0**,正式表里那行计划就是 `CU-E2E-ADD-00 · 本月内首访识别关键人并建档`;
|
||||
痕也点了名(「新增 1 行(CU-E2E-ADD/COV-…)」)。另两案例 released、被拒 11/1 ——
|
||||
全是 08-23 已记档的既有空转(S6 少写就 finish · no-missed-update 先写 2 条),
|
||||
没有一次撞在新闭合上;「E04 被拒 0」仍欠着(debt)。1663 测 / typecheck / lint /
|
||||
depcruise 绿;契约变更(`FieldDeclaration.distinct`)api-report 已刷新待提交。
|
||||
小尾巴:人加的候选行 S6 忘置 status(状态徽空着,不拦单),随「被拒 0」一并欠着。
|
||||
|
||||
- **驳回意见点名「测试111」,改动落到了 Itelma 头上:归属交给基座比对**(2026-08-24
|
||||
柴浩实测第二发):意见原话「测试111建议动作改成拜访CTO」,计划表里明明有一行
|
||||
`customer_name=测试111`,模型复述时把「测试111」当杂音丢了,按「谁有CTO」的自我
|
||||
推理挑了 CU-0142-01 改。与 E04 worldTouched 同一课:**指南让模型判的事,引擎有
|
||||
现成事实的,一律改成读事实** —— 归属是纯字符串包含。两手:①基座 `note-anchors.ts`:
|
||||
决策卡带意见回来那一刻,意见与本单草稿逐格字面比对(值 ≥3 字、非纯数字、命中 >5 行
|
||||
当没命中),命中的行以观察落在 card-reply 旁(「意见按字面点名对上了…先认归属;
|
||||
点名的行缺什么,改这一行自己的内容,不是挪到别的行头上」)—— harness 侧,在途单
|
||||
立即受益;②E04@2.1.2 S4 剧本立归属纪律(照观察认、四列逐行比、认不出唯一就重发卡
|
||||
把「你理解改哪一行」写进 ask 请人确认、重发卡的 ask 用人读名点名改了哪家哪位)。
|
||||
e2e 案例①升级:点名意见驳回 → 断言改动落在被点名那一行(`expectRevised`)。
|
||||
7 测(matcher)+ 1 测(guide 钉死);1671 测全绿。
|
||||
|
||||
- **落库的台账要摆全给签字的人,AI 填不出的字段在确认屏上就能补**(2026-08-24 柴浩
|
||||
连报四件:联系人没建上 · 新客户档案一堆空字段 · 两条无名联系人 · 确认屏没摆全):
|
||||
勘出两类病:①**模型替「计划要经营的岗位」凭空建联系人档**(人名职务全空、却标着
|
||||
关键人/亲密度3 —— 把计划冒充成档案;两条已人工删掉,CU-0142 覆盖度 100→17 改老实);
|
||||
②新客户档案连 name 都没抄(候选行里明明有)。修四层(E04@2.1.3):
|
||||
①声明:`customer.profile.name` / `customer.contact.name` 升必填 ——
|
||||
`_missing` 本就在 S6 收步与放行哨兵里,**无名档案从此进不了正式表**;
|
||||
industry/region 标建议档(AI 从来件/note 推得出才写,不许编造;推不出橘胶囊留给人);
|
||||
②**台账更新确认那份件补两张「落库预览」表**(将写入的客户档案/联系人档案,
|
||||
即签字后进正式表的行本身,不是摘要):可就地补改、联系人可**加行**,红带与放行哨兵
|
||||
同源(`customer_*_missing`);③基座:件上「加一行」遇声明 `auto` 的主键由基座续号
|
||||
(`writeEditedRows` 接 `autoKeys`,与录入卡同一段 —— 「自增列不问人」管到件上;
|
||||
拒回不再点名人填不了的 auto 列);④剧本:碰过的行把 name 照现值带上、
|
||||
没有真实姓名不建联系人行、新客户档案 name/cust_type 照候选行抄。
|
||||
1672 测全绿;e2e 案例 0 再扩:确认屏补一行联系人(编码留空)→ 断言基座续出
|
||||
`CU-E2E-ADD-01`。**验收(@2.1.4):三案例 3/3 released、全部被拒 0** ——
|
||||
E04 第一次到零被拒线(08-23 起欠着的那条就此销掉);案例 0 一单连过四关
|
||||
(加行进计划 / 点名驳回改在被点名行 / 确认屏补录联系人续号 CU-E2E-ADD-01 /
|
||||
名字必填的新墙零摩擦)。途中顺手治掉一条 guide 自招的空转:S3 ④「顺手补写
|
||||
cust_type/bt_level」没写「还空着」三个字,模型把有值的行照抄一遍白吃一拒 ——
|
||||
补上三个字(@2.1.4)。数据侧同批手术:两条无名联系人已删、CU-0142 覆盖度
|
||||
100→17 改老实、CU-2039 档案回填人给过的 name/cust_type。
|
||||
|
||||
- **落库预览要回显「签下去之后这一行长什么样」,不是草稿那半截**(2026-08-24 柴浩:
|
||||
「Itelma 的字段没回显,点编辑变空白输入框」):两层病 ——
|
||||
①预览绑的 `mine:` 只有模型本轮写过的列,Itelma 既有的客户类型/行业/区域、联系人的
|
||||
职务/角色全不在;②文本格用了手写 `<input>`,渲染器只给自动孪生件(`data-slot`+
|
||||
`data-col` 空 span)填值,手写的一开编辑就是白框。修(E04@2.1.5 + 基座):
|
||||
①新数据源 `touched:域.对象` = 正式现值 + 本单草稿叠加、按草稿键只取本轮碰过的行
|
||||
(engines `touchedRows` 纯函数;不进提示词,restPart 滤掉);②预览两表改绑 touched、
|
||||
文本格全部换自动孪生(select/textarea 本就有 current 填值);③**保存的「真改了吗」
|
||||
也对着叠加行比**(从前只对草稿:回显值一保存全算「改了」,痕写「改了 2 行」而人
|
||||
一格没动,日志撒谎)——「是不是新增」同理改判。
|
||||
连带逮出并修死一个**新增变覆盖**:人在确认屏加联系人,编码空着(自增列本分),
|
||||
而 `resolveRowKey` 的 findKnownRow 拿半把钥匙(只有 customer_code)把新行错配到
|
||||
该客户已有的草稿联系人行上 —— 编码从那行借来,模型刚建的那位被顶掉,痕还写
|
||||
「改了 1 行」。立规:**空着的自增列不是身份线索,是「给我续个号」**——声明 auto
|
||||
的列件上摆着却空着,一律不走 findKnownRow/全表一致,直进续号(2 测钉死);
|
||||
e2e 断言同批收紧(按填的姓名找行,防覆盖冒充新增再骗过一次)。
|
||||
**验收**:案例 0 released、被拒 0;定格的确认屏 HTML 六探针全中(Tier1 OEM /
|
||||
车规电子 / value="Itelma" / value="Ekaterina Volkova" / 测试CTO王工 /
|
||||
CU-E2E-ADD-01);痕三条全部老实(新增记新增)。1676 测 / 五门禁绿。
|
||||
|
||||
- **括号少一个,一拍全对也白跑:括号栈补上「补」这一档**(2026-08-24 柴浩:「怎么又
|
||||
推不动了」):卡在 S6 收口拍 —— 全流程括号最深的输出(decision_chain +
|
||||
interaction_timeline 两个嵌套 JSON 列),关思考的模型在 profile 行上**少吐一个 `}`**;
|
||||
drop 档(08-02 治「多括号」)把后面本该关 rows 的 `]` 当噪声丢掉,整段错位到尾,
|
||||
重问一次(温度 0.2)几乎原样复现,两连败 → 兜底卡「需要你判断下一步」交人,
|
||||
单子看着像卡死。修:`parseJsonLoose` 两档**有序**修复 —— 先 drop(多括号当噪声),
|
||||
失败再 close(闭括号对不上但栈更深处有它 → 把欠的补上;文本截断收尾 → 全补)。
|
||||
顺序不能反:close 先跑会把多括号那形的外层提前关掉、行动串截半(测钉死)。
|
||||
仍只合成闭括号,不发明内容。事故原文实测:三个 write 全解出。1679 测绿。
|
||||
**同夜第二形**(e2e 逼出):行对象没关、后面直接跟 `,{"key":…`(下一行)——括号到尾
|
||||
能配平、strict 与两档全看不出;close 档补第三条:**对象里逗号后面冒出 `{`/`[`,就是
|
||||
上一个对象没关**,把欠的 `}` 补在那个逗号之前(逗号其实属于外层数组)。两起原文
|
||||
全解出(11 测)。e2e 同批:认出「需要你判断下一步」兜底卡当场判失败收工,
|
||||
不再空转到 20 分钟超时。
|
||||
|
||||
- **数据域记录浏览的 JSON 列不再是 `[object Object]`**(2026-08-24 用户报):
|
||||
格子文本 `String(row[col])` 对对象一律糊成那七个字 —— 决策链地图 / 互动时间线两列
|
||||
整列不可读。补 `cellText`:对象/数组 stringify 原样摆,超 120 字截断加省略号、
|
||||
全文进 title(悬停可读)。别处早就对了(试跑草稿面 JSON.stringify、视图 displayValue),
|
||||
只有这张表漏了。浏览器实证:决策链格摆出 `{"nodes":[…` 真内容,全页无 [object Object]。
|
||||
|
||||
- **「关键人待识别」从计划渗进主数据又渗回来:占位句式全链退役 + 引用墙**(2026-08-24
|
||||
柴浩:「审批里怎么会有关键人待识别的项目」):三层病 ——
|
||||
①模型把 2.1.1 的占位句式(查无联系人客户的 -00 行)**泛化到缺口节点**,给 Itelma
|
||||
编 CU-0142-02/03 引用码 + 占位人名(措辞三连拦不住:反例描述/说明书纪律/禁令);
|
||||
②某单落库后这些占位行**以「关键人待识别」为姓名进了 customer.contact 主数据**,
|
||||
下一单从主数据读到它们照常规划 —— 污染自我强化;③一次 e2e 集合共用 bug
|
||||
(录入卡与决策卡共用已答名单,decideSeq 序号被顶,点名驳回被跳过)。
|
||||
修四层(E04@2.1.7 + 基座):①**占位句式全链退役** —— 查无联系人的候选客户改走
|
||||
**数据录入卡**先收第一位关键人(该问人的问人;骨架进 S3 剧本),真人建档后再排计划;
|
||||
一位联系人一行,缺口节点动作并进已知联系人那一行;②**契约新增 `refersTo`**
|
||||
('域.对象.列'):声明引用关系,基座 draftWrite 那一刻查引用表(正式+草稿叠加),
|
||||
查无此值当场拒、拒回指路;安装静态审核 refersTo 目标真实存在
|
||||
(`reference-target-unbound`,写错地址=永远查无此值的死墙);plan/receipt 的
|
||||
contact_code 都钉上;③主数据两次清污(占位联系人删除);④e2e:录入卡代答
|
||||
(entryValues)+ 计划违禁字样断言(forbidInPlan)+ 已答名单分家。
|
||||
**验收(@2.1.7,主数据清污后)**:三案例 3/3 released、全部被拒 0(16-18 拍);
|
||||
案例 0 计划恰 2 行全是真人(Ekaterina 那行把两个缺口节点的动作并进她名下、
|
||||
王工按点名改成约见CTO),录入卡先收人 → 确认屏再补一位续号 -02;案例 2 单人单行。
|
||||
注意:refersTo 墙在这轮从没响 —— 主数据干净时模型照 2.1.7 的「一位联系人一行」
|
||||
就不再编码了;墙是备份,不是主路。**清污是前提**:主数据里躺着占位联系人时,
|
||||
引用检查会「合法」放行它们(引用的确存在),病就从主数据渗回来。
|
||||
|
||||
- **报价链 A1–A7 从系统卸载,只留 E04 / I01**(2026-08-24 用户定,**只卸不删源码**):
|
||||
六个 quote-* 包在库里置 `uninstalled` + 禁用(registry.uninstall),两个 RFQ 触发器
|
||||
(trg-rfq / trg-rfq-manual)停用 —— 触发器对着已卸载的活动起单只会生出坏任务;
|
||||
种子同步:`REAL_PACKAGES` 只剩 E04/I01,`seedMvpFlow` 以 `SEED_QUOTE_FLOW=false`
|
||||
整段不播(统一报价流程包 / 触发器 / 询价邮箱 —— 装不上的活动激活流程包会被闭合
|
||||
校验拦下)。源码、e2e 套件、包内测试原样保留;`MVP_PACKAGE` 常量仍是流程编译与
|
||||
触发装配那几组测试的夹具。**库里 `unified-quote` 流程包仍在**(active,节点指向已卸载
|
||||
的活动 —— 蓝图待补清单会点它),等用户定要不要连流程包一起退。要装回:名字加回
|
||||
`REAL_PACKAGES` + 拨回 `SEED_QUOTE_FLOW`,跑 activities:install。
|
||||
|
||||
- **台账更新确认四件小账**(2026-08-24 柴浩连报,E04@2.1.8):①**重做后旧明细留在表里**
|
||||
(SQ-0031 的覆盖度同时挂着 50→50 与 50→100):主键是序号,重做时模型新开一行而不是
|
||||
同 seq 覆盖。结构治:明细表加 `update_key`(台账地址|客户|联系人|字段,必填,
|
||||
`distinct`),S6 收步 + 新 L2「同一处字段只留一条更新」钉 distinct = rows;
|
||||
T_release 重做分支写明过期行 `drop` 撤掉。②**依据列带机器键前缀**
|
||||
(「回执 contact_code=CU-0087-02:…」):说明书与技能改教人话(客户名·人名的回执:…),
|
||||
不写编码、不带前缀。③**标题旁的单号不摆**:`doc()` 的 `titleRef` 改可选,四份件全去掉
|
||||
(页脚单号仍在)。④**验收判据与「AI 已完成」文案夹着 `coverage_score`/`decision_chain`**
|
||||
→ 全改人读名。当前那单的草稿当场手术:删过期行、去六条前缀。包内测试 91 条钉死四条口径。
|
||||
|
||||
- **计划 7 行回执 6 行照样交卷、两堵墙对撞熔断、对话区偶发乱序**(2026-08-24 柴浩三连):
|
||||
①**多行 write 不是原子的** —— 第 2 行撞 refersTo 墙被拒时第 1 行已落草稿,轨迹只记
|
||||
「被拒」,模型与人都以为一行没写,回执骨架从此少一行;提交闸只数已有行缺不缺必填,
|
||||
数不出「少了一行」;放行门「每条计划都有回执」拒 → 模型删计划凑数 → 「每家候选都进了
|
||||
计划」拒 → 加回来 → 循环五拍熔断,而缺的那行回执只有人能填。修:loop 的 write
|
||||
**整批先验后写**(`draftWrite` 加 `dryRun`,两遍),被拒 = 一行都没落;E04@2.1.9
|
||||
把「回执行数 = 计划行数」钉进 S3 收步与 S4 入场哨兵(派回执单前就得齐),S4 剧本
|
||||
加/撤计划行同步骨架,T_release 写明回执少行 → 补骨架重派执行单、**不许删计划凑数**;
|
||||
e2e 回执单派出那一刻断言骨架 = 计划。②**对话区按任务内序号排,不按墙上时钟**
|
||||
(`chat-order.ts`):合并从前按 `at` 字符串排,两台后端交替推同一单、时钟一偏,
|
||||
上一拍的话就排到下一拍后面;记忆 `seq` 与时钟无关,AI/系统项本身是记忆条目、
|
||||
卡对 card-sent、自由输入对 human-input(`say` 现在把消息 id 记进 detail),
|
||||
找不到落点的老数据按时刻插位。3 测。
|
||||
**验收**:脚本 e2e 案例 0 released、被拒 0、回执骨架 = 计划;浏览器全链(AI 账号,
|
||||
不落主数据):件上加客户 → 录入卡收 CTO → 点名驳回改对行 → 回执单待回执 2/2、
|
||||
闸拦空手交卷、件上填两行保存即落库 → 验收判据全中文、落库预览回显 → **released**
|
||||
(17 拍、被拒 1 —— 模型在 S3 先写了计划再写回执骨架、中间撞了一次 doneWhen 收步,
|
||||
下一拍补齐);对话区 AI 气泡 23:52 → 23:55 → 23:57 单调;更新明细依据人话、位置键唯一。
|
||||
|
||||
- **摆给人看的行标识去掉单号那一段**(2026-08-25 柴浩:「COV-…/CU-0142-01 只保留斜杠右边」):
|
||||
缺项红带 / 执行卡提交闸 / 拒回主键名单 / 就地修订痕从前把主键各列全拼上 ——
|
||||
可人正在这一单里看件,单号是脚下的地面,不是区分行的信息。基座 `rowLabel(id, caseKey)`
|
||||
按声明的单标识(`caseKey`)去掉那一段,四处同源同改;去完一段都不剩(主键只有单号)
|
||||
退回整段。`missingReadings` 入参补 `caseKey`。4 测;在途单 `views.repush` 一帧即见。
|
||||
|
||||
- **点击后两块同一帧变脸:「在办事」写在回传返回之前**(2026-08-25 柴浩:「右边聊天框
|
||||
先有反应,中间的 html 过一会儿才变成 AI 正在推进中,看上去很不流畅」):人回传落库后
|
||||
runtime 要等派发器投递、推进器抢到租约、开跑前那一刻才翻成 `running` ——
|
||||
前端 onSuccess 那一次重取抓到的还是 `awaiting-event`:对话区(卡状态已落)先变,
|
||||
工作区(读 runtime)要等下一次推送。修:`TaskService.wake(taskId)` —— 只对
|
||||
awaiting-event / awaiting-human 翻 running 并 setPhase('active')(顺带广播),
|
||||
两条回传路由(工单 / 对话卡)在返回之前调它。浏览器探针实测(100ms 采样):
|
||||
点「通过」后 **401ms** 中间已是「AI 正在推进这单」、对话区同帧「你选了:通过 ·
|
||||
持续推进中」;8.2s 推进完成两块同帧换成回执件 + 下一张卡。3 测;CONTRACT.md 已记。
|
||||
|
||||
- **对话区「上一步的卡跑到这一步下面」的真病根:并卡判紧邻只看对话项**(2026-08-25
|
||||
柴浩第二次报):08-24 那刀(按记忆 seq 排序)治的是**跨机器时钟偏**,而这次时钟没偏 ——
|
||||
I01 一单:「两份初稿…请审核」→ 发决策卡 → 人答 → 收口 → 发验收卡;`projectChat`
|
||||
的「一个气泡 = 交代 + 卡」只看 `out` 末项是不是还没挂卡的 AI 发言,而决策卡 / 录入卡
|
||||
的 card-sent、人的答复、内部观察都**不进 out**,那句话在它眼里一直「空着」——
|
||||
41 秒后的验收卡被挂到了上一步那句话上,以它的时刻排到决策卡前面。修:「刚说过话」
|
||||
按**记忆序列**判(话与工单之间不许隔任何条目;装配戳这类信封件除外;跨人卡 / 决策卡
|
||||
的 card-sent 也算隔开),一句话只领一张卡。3 测(26 → 全绿)。**同一症状两条独立的路**
|
||||
(时钟偏 / 并卡误认),治完一条要把另一条也走一遍 —— 这是 08-23 灰底那课的第二次。
|
||||
|
||||
## 文档权威地图
|
||||
|
||||
| 层 | 文件 | 说明 |
|
||||
|
||||
Reference in New Issue
Block a user