 ChaiHaoandClaude Opus 5
|
58d914b8a2
|
活动伪函数占位:机器步落台账 + 一张验收单 —— 顺手揪出三个引擎 bug
按你定的形态做:占位一律机器步,每个活动只留一张验收单要人签;
**不碰活动内部的业务判断** —— 打标、定价、比价那些一概不做。
## 占位怎么占
一枚纯工具 `slot.placeholder`:只穿透上游给的值、给显眼的默认(数值一律 0,
主键给「PN-占位」这类),行上写 `status: '占位'`。它不判断任何事。
骨架 = N 个机器步各落一行台账 + 末步一张验收单。
验收单的卡面要人填的正是**该活动该产出、而占位产不出的判断**(如两枚去向旗)——
人类步的回传值同样经 writeOutput 落台账、步序在后,所以人填的覆盖占位的默认。
占位期要走哪个分支,在验收时说,不必改代码。
六个槽位一律 flow 范式(A2/A3/A6 本该是 loop,但 loop 要 Agent 真调模型;
占位是固定序列,声明成 flow 才诚实),那份没人用的 loop 骨架顺手删了。
预算改成固定 humanCalls: 2(机器步不吃人工调用)。
## 三个引擎 bug,都是「无声卡住」
**① 异或汇合在等一条永远不来的分支。** `joinReady` 按并行汇合写(全部责任分支收敛才放行),
可 G2J 是异或 —— 两条分支互斥、结构上只来一条。于是「不需要寻源」这条路上永远在等 A3。
最坑的是**连死路事件都没有**:边是选中了的,只在汇合判定里被 continue 跳过,
从外面看就是 A1 办结后什么都不再发生。已改为异或汇合不等,加了三条测试。
**② 出口载荷取的是落地前的草稿值,不是落地事实。** `releaseWrite` 直接回 `draft.patch`。
人的回传值天生是字符串 `"true"`,列是 boolean,PG 存的时候转了,可发出去的口里还是字符串
—— 下游活动入参校验当场拒收「/needSourcing must be boolean」,节点报 blocked,
而台账里明明是对的。改为合并后**读回来**:出口载荷与台账逐字一致,类型由列定义说了算。
**③ 审批箱按岗位码筛,无视工作组绑定。** 引擎派审批时「绑定先于策略」(ADR-011),
装了组的单实际派给被绑定的人;而收件与裁决两处都只比 `me.position.code` ——
于是「审批派给了我、我的审批箱里没有」,单子谁也看不见,流永远卡在审批点(实测)。
`toChain` 早为同一件事修过一次,这是漏的两处,一并按派单口径改。
## 顺带
`cards.issue` 的验收分支写死 `fields: []`,而 `acceptanceWorkOrderSchema` 本来就有 `fields`
—— 是没填,不是设计上不要。执行与验收现在共用同一份字段解析。
我自己也踩了一个:验收步的出参映射键写成驼峰 `needSourcing`,但**键是台账列名**
(小写蛇形),draftWrite 抛「非法标识符」,而且是在放行之后抛 —— 任务卡在 running、
台账一行没有、推进器一秒一次无限重试。测试里加了「所有出参键必须匹配 ^[a-z][a-z0-9_]*$」。
## 实测走到哪
起单 → A1(两机器步落台账,一张验收单)→ 人填 needAlternative=false →
G1 判「不需要选型」→ G2 判「不需要寻源」→ **G2J 通过** → A4 成本定价办结 →
A5 审批点(审批箱可见)→ 裁决通过 → **G3 判到 A6**(链位 6/7)。
A6 的三个去向要选择组(T2),到那儿为止。
typecheck ✓ lint ✓ depcruise 374 模块 ✓ api:check ✓ 498 测试 ✓
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 13:16:17 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
b2f5f69d6a
|
流程包去掉发布机制 —— 严格检查 + 保存即生效,生效由运行时决定
用户要的是运行时机制:新建 + 编辑,存下去就生效,旧任务走完旧版本,
新任务调用时才加载新编排。所以「草稿 → 发布」两态整套去掉。
## 闸从「发布」挪到「保存」
`savePackage` 现在先跑闭合校验,不闭合抛 `NotClosedError`(路由 412 带报告)——
**一个字节都不落库**。存进来的每一版都能起单,所以不需要「已发布」这个标记。
`publish` 用例、路由、`publishPackage` 存储方法一并删掉。
实测:把进 A6 的边映射清空后保存 → 412,逐条点名「边 e-g3-a6 未完成载荷映射;
节点「报价议价」的必填字段未映射:rows」。
## 保存恒新增版本号,服务端说了算
这不是可选项,是「旧任务走完旧版本」的前提:工作流按 (包id, 版本) 去读定义,
就地覆盖 v1 就等于改掉所有在途 v1 任务正在读的编排 —— 它们会中途换了规则却毫不知情。
版本号由用例层算(当前最大 + 1),**不采信入参**。实测:入参故意填 version: 999,
落的是 v2。store 层因此改成**只插不改**:撞键宁可让唯一约束报错,也不静默覆盖。
起单取版从「最新已发布」改为「最新一版」(retired 除外);触发器的 requiredInputs 同口径。
实测:改完描述存成 v2 后,新起的单用 v2,早先那单仍挂 v1。
## 迁移:旧状态值不归一就是一读就炸
状态枚举从 draft/published/retired 收成 active/retired。列上和 definition 这个 jsonb 里
各存着一份 state,两处都要改 —— 不改,`processPackageSchema.parse` 读一行就抛。
这不是开发期小麻烦,任何已部署实例都会中招。加了迁移 0012。
## 界面:恒为 0 的假指标撤掉,不换个说法留着
- 编排面板:「已发布/草稿」芯片 → 「生效中/历史版本」(真正的区别是哪一版会被新起单取到);
发布按钮撤掉,保存按钮改成「保存并生效(存为 vN)」并在确认卡里说清影响面
- 历史版本只读,但就地指路:「去 v(N-1) 改(生效中)」,不让人自己找
- 蓝图面:「草稿 N · 未闭合 M」两个计数在新机制下**结构上恒为 0**(不闭合存不进来),
换成「共 N 个版本,保存即生效」
- 驾驶舱:「未闭合草稿」卡整张撤掉 —— 同理恒为 0。天然的第三张是「死路」
(route-dead-end 事件),但那需要一条按事件类型聚合的路由,没有之前不摆(同死信卡的规矩)
## 顺手修:种子的幂等判断本来是坏的
比对用 `JSON.stringify` 认键序,而 jsonb 从 PG 读回来键是重排过的 —— 永远判不等,
每播一次种就多存一版一模一样的定义(实测一口气堆到 v3)。改成递归按键名排序后比对。
连播三次,只第一次存。
## 契约变更(破坏性,一步到位)
`publish` 删除、`NotPublishableError` → `NotClosedError`、`publishable` → `closed`、
状态枚举收窄。按规矩破坏性变更该走三步弃用 —— 这里一步改完,因为:
① depcruise 反查下游全在仓内(374 模块无违规),同批改完;
② 要弃用的是一个**产品决定不再存在**的机制,留弃用窗口没有意义。
CONTRACT.md 已同步,快照单独说明。
typecheck ✓ lint ✓ depcruise 374 模块 ✓ 495 测试 ✓
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 12:49:24 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
78622b8799
|
审批点后面补上网关 G3,并让引擎**真的走它** —— 顺带给去向旗找到落脚处
两件事,都是「图上画着、实际走不到」这一类。
## ① 审批点后面没有网关(用户提出)
A5 只有一条出边 A5→A6,驳回走向藏在 `reject` 声明里,图上只是一枚牌子。
BPMN 的常规是审批的两个去向都由网关决定 —— 补 G3「审批结果」,
`verdict = "pass"` → A6,`verdict = "reject"` → A4(回边)。
补的时候撞上真问题:`onApprovalVerdict` 只在 pass 时走 `advanceFrom`,
而且 payload 里**不含 verdict** —— 于是 G3 没有判据可读。异或分叉的每条出边都得带条件、
没有无条件兜底边,判据一缺就全不成立,流会无声停在 G3。
能让闸过的最省事办法是在 `e-a5-g3` 上喂一枚常量 `verdict: "pass"`。**没那么做** ——
那样 G3 的条件恒真、驳回边永不可达,网关就是个摆设,又是一处「画着两个去向、
其中一个结构上走不到」的谎。
改的是引擎:裁决进载荷,通过与驳回**都先看图**,只有没画驳回边的包才退回 `reject` 声明
(它 schema 必填,且是通用机制)。`advanceFrom` 因此回报「有没有真的推出去」,
并加 `quiet` 参数 —— 「先试边、不成再退回声明」这一步试空是正常分支,不是死路,
不该报 route-dead-end 假警。
`reject` 保留:schema 必填、CONTRACT.md 的不变量、且审批人界面拿它渲染人读文案。
它与 `e-g3-a4` 必须字字对齐,加了测试守。
## ② 几何重排:两带换行,不回形
原坐标逐点抄自 MVP 的 SVG,是回形走线(row 0 左→右、row 1 右→左、row 2 折回最左)——
这正是上一轮流程链读成 A1→A7→A2 的根源。重排为两带:
受理·选型·寻源(y 60..100)→ 换行车道 y=190 → 定价·审批·议价·成交(y 310..350)→
未成交闭环(y 410..450)。每带内 x 随推进次序单调递增。
实测渲染(画布 639×325):带 0 的 A1 57→G1 159→A2 223→G2 325→A3 389→G2J 491,
带 1 的 A4 38→A5 153→G3 242→A6 293→G4 395,**零框重叠**。
两枚回 A4 的卡点同一条车道、同朝向(向上=回退)。
## ③ 顺带:两枚去向旗终于有地方落
上一轮我在债务簿写「A1 过不了 G1 是诚实状态、不是缺陷」——**判断错了**。
出口的标量字段只从落地事实取,而 `needAlternative` / `needSourcing`
在任何台账对象上都没有列,活动实现了也一样取不到。
新增 `project.intake_verdict`「受理结论」**一单一行**(主键只有询价单号)。
为什么不挂在按料号分行的「统一受理记录」上:`flat` 是把这一单所有落地行 reduce 展开,
六个料号就有六行同名列、最后合并的那行赢 —— 而归并规则是「任一条命中 C 即需选型」,
last-write-wins 会静默给出错的去向。测试正反两面都守:结论表主键只能是 rfq_ref,
且**其它对象上不许出现去向旗**。
A2 也要回写这一行,所以 `rfqRef` 进了 G1→A2 的边映射,并**正式声明进 A2 的入参**——
不声明也能偷渡(闭合校验遇到未声明的目标直接跳过),但那是默许不是正当。
A2 的 contract.version 因此升 0.2.0,包版升 0.5.0。
顺手删了一个陈旧草稿 v2:它是我早前测编辑器留下的旧图(14 节点、无 G3),
而种子刚把 v1 用新图重发布 —— 草稿内容比已发布版更旧,谁发布它 G3 就没了。
删前确认零工作流引用。系统没有「丢弃草稿」的入口,这条记进债务簿。
typecheck ✓ lint ✓ depcruise 374 模块 ✓ api:check ✓ 495 测试 ✓
发布闸实测:15 节点 / 18 边,边映射闭合校验通过。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 12:24:40 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
22aa44c775
|
手工走通整条流,揪出五处编排层问题 —— 最要命的是假成功
把 `unified-quote` 从起单一路手工答到底(这是逐个开发活动之前该做的验证),
一路撞出五处,按撞到的顺序:
① 七个活动派出七张一模一样的「请处理」
槽位骨架给的是 `card: {}`,工单标题/字段全落回默认。收卡的人不知道自己走到
哪一步、这一步要干什么,整条流没法手工走通。→ 卡面自述:标题就是步骤标签,
依据带「第几步 / 共几步」,并如实说「这一步的自动化还没开发,先由你来办」。
② 走到第 3 步就 `exhausted` 终态、工作流转 abnormal
六个槽位共用 `humanCalls: 3`,而 A1 声明了 6 个人类步 —— 活动**结构上永远走不完**。
→ `budgetFor(n)` 按各槽位自己的步数给。步/项清单提成 `STEPS` 常量,
预算与骨架共用同一个数组,数不上不会漂移。治理台申报值也同源(否则台上摆假数)。
③ 六步答完,任务卡在「等人,却没有任何东西等人答」
`flow-runner` 写死了 `released = lastStepIsAcceptance && lastVerdictPassed` ——
末步不是验收工单,活动就永远不 release。→ 声明的六步来自 MVP 作业指导书,
不篡改语义,在其后**追加**一步「收口验收」。
④ 只走了 A1(一个节点实例)却报 `completed` ← **最危险的一处**
状态聚合把「没有在跑的了」当成完成。界面上是一单已完成的报价,业务上一步没走。
→ 「完成」凭**到过终点节点**;收敛而未到终点 = 卡住 = `abnormal`,进驾驶舱异常卡。
`aggregateWorkflowState` 收第三个入参(终点 id 集),不传退回旧口径。
⑤ 异或网关一条边都选不中时,流无声停住
④ 让它至少报异常了,但只说「有问题」不说「哪儿」。→ 发 `route-dead-end` 事件:
哪个节点、各出边的条件、判据里当时有哪些键。只记键名不记值 —— 诊断够用,
载荷不进事件明文。实测这条痕直接指出「G1 要 needAlternative,而键里没有」。
顺带:改槽位内容必须升包版(0.1.0 → 0.4.0)。「安装恒为新增、版本并存」是硬不变量,
同版重装是 no-op、manifest 一字不动 —— 我第一次改完重播种,屏幕报「已装入」而库里还是旧的。
`installSlots` 现在先问库、如实报「已装」还是「已在库,未改动 —— 要换内容请升包版」。
**走查后的诚实状态**:A1 走得完、活动 released;流**过不了 G1**,因为出口的必填去向旗
产不出来。这不是缺陷 —— 出口载荷由台账落地事实推导,槽位没实现台账写入就没有事实,
凭空捏一个就是在系统内部 mock。于是 A1 的开发完成判据也具体了:必须让
`needAlternative` / `needSourcing` 成为落地事实,否则 G1 永远判不了。债务簿已记。
另记一条闸的盲点:api:check 只快照 index/contract/port.d.ts,而 index 是 re-export 名单 ——
给纯函数加形参它看不见(本次实测)。改签名要手动同步 CONTRACT.md,别指望闸提醒。
typecheck ✓ lint ✓ depcruise 374 模块 ✓ api:check ✓ 490 测试 ✓(均以退出码验)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 11:11:32 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
5826b6f976
|
流程链按拓扑序读 —— 图纸坐标不配决定推进次序
任务详情里的「流程链」在 MVP 包上读作 **A1 → A7 → A2 → A6 → A3 → A5 → A4**。
不是随机:`toChain` 按 `layout.col` 排,而 MVP 图是**回形走线**(第 0 行左→右、
第 1 行右→左、第 2 行折回最左),A7 的列位(1)正好跟 A1 并列、A6(3)跟 A2 并列。
原注释还写着「列位是流程的推进次序(拓扑的可视化)」—— 那句话只对 v1 那种一行
从左画到右的包成立,换一张图就是错的。图纸声明为「不影响语义」,那它也不配决定次序。
改为按**边**做拓扑序,新增 `advanceOrder`(process 的 domain,纯函数零 IO):
· 回边(reopen)排除在外 —— 它是重新入场不是往前推进;留着 G4 → A4 就成环,
A4 会等自己的下游,拓扑序无从下手
· 真并行支(G2 分出的 A2 / A3)图上本无先后,按**节点编号**定 ——
同一个包在谁手上都读作同一条链
· 进不了拓扑序的节点(不可达、或排除回边后仍有环)按编号缀在末尾:少排序,不丢节点
实测链已读作 A1 → A2 → A3 → A4 → A5 → A6 → A7(A1 current)。
六条 domain 测试盯住它,第一条就是那张回形图。
顺带修了两处会互相传染的闸:
· `api-report.mjs` 在 tsc 失败那条路径不清 `.api-tmp`,半成品留在盘上,
eslint 扫到生成的 .d.ts 报 1004 条假错 —— 于是 tsc 一红 lint 跟着红。实测踩到。
· eslint 只忽略了 `api-report/**`,把同为产物的 `.api-tmp/**` 一并忽略
契约变更(加法,非破坏):①depcruise 反查六处下游无违规 ②CONTRACT.md 已注明
③快照 api-report/…/process/index.d.ts 仅多一个导出名。
typecheck ✓ lint ✓ depcruise 374 模块 ✓ 487 测试 ✓(以退出码验,不以 echo 验)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 10:45:41 +08:00 |
|
 ChaiHaoandClaude Fable 5
|
ac85ecf2ea
|
基线:鉴权会话+工作组+工作台三区修复+编排工作区+产品设计文档
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 20:43:35 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
1577927214
|
判据 ⑨ 解锁:选择组 → 出口 → 网关判据,三处断点接通
A6 放行选了 lost,却始终走不到 A7。三处各断一截:
① 装配输出口只看**必交付口**。A6 根本没有必交付口(它的输出是选择组
won/revise/lost),于是得到一张空表,下游连判据都读不到。改为必交付口与
选择组的口一并装配。
② `onTaskTerminal` 只取**第一口**的载荷做路由作用域;没有必交付口时就什么都拿不到。
改为各口载荷合并成一份。
③ 网关拿到的是**边映射装配后**的载荷,而 A6→G4 这条边没有映射,装配出来是空的 ——
判据依据在这一步整个丢掉,异或网关一条分支都选不中,流悄无声息地停住。
改为:网关按**到达的东西**路由(上游载荷原样穿过);活动与审批点仍只收装配后的载荷,
它们有契约,不该被上游多余字段污染。
另立一条约定并写进注释:**选择组发射的那一口就是这次运行的 outcome**
(「恰发一口,随放行一并确认」),下游异或网关的判据读的就是它。
现在:A6 放行选 lost → G4 按 `outcome = "lost"` 判定 → **A7 情报归档起到冯兵工位**。
gates: tsc / eslint / depcruise / 399 测试 全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 05:48:04 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
9201f6b094
|
判据 ⑥ 解锁:容忍分支推得动汇合,汇合不再等一个永不到来的网关
三处修:
① `joinReady` 把**网关直连汇合的直通道**也算作一票要等的分支。
网关不是责任单元、永远不会有实例,于是汇合永远等不齐,整条流卡死。
改为:来源是网关的入边不参与等待 —— 分叉一发生它就算过了。
(统一报价图里这条直通道就是 TYPE-A 快路。)加了回归守卫测试。
② 容忍(tolerate)只把实例标成「已消化」就收手,不往下推 ——
`joinReady` 认 tolerated,可没人再去问一次汇合够不够齐。改为标完即续推。
③ 蒸馏钩子失败会把已落定的终态掀翻(治理台终止返回 500,任务卡在中间态)。
蒸馏是进化管线的入口、不是终态的一部分:失败就失败,终态照落。
失败也不再往任务记忆里追加 —— 此刻记忆已封卷,那个守卫拒得对。
结果:A1 released → G2 分叉 → A3 / A2 两个 loop 起在正确工位 →
按声明容忍收束 → **汇合回齐 → A4 成本定价起到冯兵工位**。
gates: tsc / eslint / depcruise / 397 测试 全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 05:03:58 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
9de33a5416
|
判据 ④⑤ 解锁:G2 并行网关起出 A3 / A2 —— 输出口发射的是落地事实
G2 之后一直不分流,根因三条,逐条修:
① 输出口载荷是空的。`outputPortsOf` 原先从**作用域**里捞字段拼载荷,
而放行那一刻草稿层已合并并清空,捞到的只剩起单入参 —— 下游节点必然缺字段。
改为:载荷取自**落地收敛的事实**,由 `releaseWrite` 回报合并了哪些行,
经 release → task → app 一路带上来。这也正是「落地收敛,输出口才发射」的字面意思:
发射的就该是已经落地的那些事实。
`LandedFacts` 给两种读法:铺平(标量取值)与逐行(数组取值),
输出口声明里 `type: 'array'` 的属性填逐行,标量属性填铺平值(驼峰/下划线两种写法都认)。
② 一条分支起不来,把整条终态上报连坐掀翻 —— 于是**上游任务的终态也报不上去**,
流停在原地,一行日志都没有。改为:该分支记 `node-start-failed` 事件 + 落一个
blocked 实例,其余分支照走,在治理台「需处置」里现形。
(这条是先修的:正因为它,前面两条才一直查不出来。)
③ 边映射引用了不存在的路径:`G2→A3` 的 pn 取 `intake.records`(那是想象中的 LLM 出参形状)、
`G2J→A4` 的 records 取 `initiation.records`(起单时根本还没有这些行)。
按输出口的真实声明改正。
结果:A1 released → G2 并行分叉 → **A3 渠道寻源落到林佩萱、A2 替代选型落到王梓名**,
两个 loop 活动同时在跑,岗位解析正确。
gates: tsc / eslint / depcruise(317 模块)/ api-report / 393 测试 全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 04:52:53 +08:00 |
|
 ChaiHaoandClaude Opus 5
|
3b9587563a
|
M6(4/n): 工作台五要素齐活 —— 审批 / 消息 / 纪要 / 汇报
四个 desk-* feature 自 workbench 原型 ModuleWorkspace.tsx 平移(jc-* 类名原样),
共用件落 shared/desk/module-kit;mock 数据换成服务端投影:
· desk-approval:审批点卡到审批人工位;依据快照、驳回走向(声明式)、驳回必附意见
· desk-message:通知 + 跨任务征答**就地作答**;卡面表单由 card.ts schema 驱动,
与后端回传校验同 schema;跨人卡不占任务清单,不开放任务对话流
· desk-minute:纪要维护 + 决议登记起单;正文可续、决议只增
· desk-report:四周期草案 + 度量八指标 + 确认即提交
左轨角标常驻(待批 / 未读),责任面要一眼看见什么在等我。
修一个真 bug:process.start 从不校验流程包的 callInterface,
先插工作流再由 task.start 撞活动契约 —— 失败就留下一条永远推不动的在途单。
改为**先校验后建单**(CallInterfaceViolationError),一条工作流都不留;
路由回 400 并带上缺哪个字段。已清掉这次触发出的两条孤儿单。
判据 ⑩ 纪要一环跑通:决议 → 登记触发 → 工作流 → A1 落到 BD 冯兵,
登记人即来源已记在单上;同一决议重复登记被 412 挡下。
gates: tsc / eslint / depcruise(316 模块)/ api-report / 380 测试 全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 03:53:36 +08:00 |
|
 JCAI Main AgentandClaude Opus 5
|
2f01eda3fb
|
M5 收官:六个活动包 + 统一报价全图 + 任务推进器
活动包(按 MVP示例工作流 归一化):
- quote-intake A1 受理归一(flow):LLM 抽取 → 条件跳步补全 → 查历史价 → DMN 打标 → 验收
- quote-pricing A4 成本定价(flow):DMN 利润模型 P-01 + 底价门禁 P-02;超限条目调人决策
- quote-negotiate A6 报价议价(flow):写类动作登记意向、放行即落地;建 D+3 跟进监听;
议价结果建模为选择组三口(成交/有异议/拒绝)—— 业务分支走输出口,不用异常终态编码
- quote-archive A7 情报归档(flow):写共享域(历史价格情报/客户资料库/落地率统计)
- quote-sourcing A3 渠道寻源(loop):CMMN 四阶段 + 里程碑 + 裁量项 + 两个时间监听;
DMN 采用策略判定;案例说明书与 XML 同版本
- quote-alternative A2 替代选型(loop):CMMN 三阶段 + userEventListener(客户改需求);
DMN 替代等级判定;禁区「差异没核清的不放行」有机检形态
流程包全图:7 节点 + 3 网关 + 1 审批点
- 已裁定①:A5 = 审批点,G3 并入驳回走向(驳回 → 回 A4 重开新实例)
- 已裁定②:G2 = 并行网关,A3/A2 失败走向 = 容忍
- 已裁定④:议价回环 = 流程层回边(reopen)
闭合校验在此拦下一个真实建模错误(A4 有两条并发入边映射同名字段),
按规范改拓扑:TYPE-A 直通也走汇合;同时把「回边不是并发汇合」写进判定 ——
reopen 边不参与隐式合并检查。
app:task-advancer worker —— 过程在后端,运行中的任务一拍一拍推,不依赖浏览器在线;
进入等待或终结即停手,不空转。第一方工具补齐 P-01/P-02/画像/落地率/出站发送。
已验证(真机):
- 六个活动包经安装通道装入,静态审各 0 条提示
- 流程包闭合校验通过并发布
- 台账自生长:11 张表由活动声明物化(含 shared 三张共享域表)
- 邮件入站 → 触发器 → 工作流 → A1 落到冯兵工位 → 推进器推 2 拍:
装载 5 步声明 → 执行 LLM 步 → 按声明重试 2 次 → 转人兜底 → awaiting-event
(LLM 端点是占位 key,失败路径因此走通了 —— 正是声明给定的兜底)
358 个测试通过,门禁五道全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 02:37:04 +08:00 |
|
 JCAI Main AgentandClaude Opus 5
|
a8f6eef610
|
M5(2/3): process 用例与流转 —— 流程引擎的确定性调度
- routing domain:选边(XOR 恰取一条 + 默认分支兜底;AND 全走)、边映射装配(四类来源 +
S-FEEL 转换)、AND 汇合回齐(容忍分支不阻汇合)、审批点驳回走向声明式
- process-service:起单 → 调度节点 → 负责人四策略解析(结果与依据留痕)→
活动起单 / 审批点卡工位 / 终点收束按来源回执;任务终态到达继续流转或走失败走向四选一;
审批驳回按声明回指定节点重开新实例;状态每次变动后重算聚合投影
- adapter:流程包(id × version)、工作流实例、节点实例三表持久 —— 崩溃后可续跑
ADR 待补项登记为 debt M5-1:§6.1 的 Mastra workflow 编译器作为可替换 adapter 后补,
当前由自持确定性状态机承担,语义等价、usecase 不动
325 个测试通过,门禁五道全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 02:01:08 +08:00 |
|
 JCAI Main AgentandClaude Opus 5
|
a919d2e961
|
M5(1/3): process 的 domain —— 闭合校验、四策略解析、状态聚合
- checkClosure:七类违规(边未映射 / 必填未齐 / 类型冲突 / 孤立节点 /
网关不平衡 / 汇合来源不明 / 容忍分支被必填依赖)+ 活动未安装 + 岗位不存在;
不闭合不得发布 —— 画布即时校验与后端裁决同源
- resolveOwner:四策略封闭(指定人 / 岗位唯一人 / 轮值 / 来源跟随);
岗上多人退轮值,并列按 staffId 稳定排序 —— 解析必须确定性
- aggregateWorkflowState:聚合投影,流程层不另设状态机;计量对象是节点实例,
XOR 未选分支不入集合,改道/容忍/升审批已消化即不入异常
- nextInstanceNumber:流级重做重开新实例,不复活旧任务
325 个测试通过,门禁五道全绿
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-27 01:55:47 +08:00 |
|