 ChaiHaoandClaude Fable 5
|
ce59e4e1e4
|
spike:回边 reopen 的 Mastra 表达 —— 结论走路线 B(新 run = 新实例)
隔离验证(spike/mastra-reopen,@mastra/core@1.53.0,不属主工程、不受产线闸约束),
两条候选各写可跑原型 + 6 探针 + 2 反例,三场景全通。**结论有运行输出支撑**。
推荐**路线 B**(回跳 = 结束本 run,胶合层用同一份定义起新 run),两条决定性理由:
① 语义对齐:1 run = 1 实例 —— 新 runId / 新任务 ID / 旧快照冻结全是引擎自带;
路线 A(dowhile)里第二轮 A4 是同一 step 的重跑,**引擎会覆盖第 1 轮记录**
(实测:第 2 轮开始时内层快照 context 里 A5 那一格直接消失),与
「重开产生新实例、旧实例留痕不动」正面冲突;
② 健壮性:误 resume(迟到/重复回调 —— 我们的活动终态本就来自不受控的外部调用链)
在 A 下把整条 run 打成**不可恢复的 failed**(补正确 resume 也救不回),
在 B 下只是抛异常、run 毫发无伤。
其余实测事实(FINDINGS.md 全文):dowhile 内 suspend/resume 可用但**定位不到轮次**
(forEachIndex 对 dowhile 是哑参;不存在的 resumeLabel 会静默命中当前挂起 step);
.branch() 条件在源步终态后一次性全求值、拿得到 requestContext;
.branch() 输出含未命中的 undefined 键(收口步必须允许);
step 的 execute 在 resume 时从头重跑(副作用必须写在 if(!resumeData) 里)。
FINDINGS.md 第 6 节给出了走 B 的编译器七件事,下一步照它落地。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-29 00:04:35 +08:00 |
|
 ChaiHaoandClaude Fable 5
|
a06e5df90a
|
新流程包端到端:从零建一条流并跑通 —— 编排层可独立开工的验收证据
八例 unified-quote 证明的是「既有这条流能跑」;这一例证明另一件事:
**拿编排层去开一条新流,不碰活动一行代码**。走的正是设计者那条路 ——
建包(草稿,不生效)→ 链接已装载的活动 → 激活(双判据闸)→ 起单 → 走完。
六例(真库):
① 建包存下来是未生效草稿;未生效版起单被拒(一次只能激活一个版本)
② 激活闸判据一:图编排不闭合 → NotClosedError
③ 激活闸判据二:活动未装载(unknown-activity)→ NotClosedError
④ 两面都齐即可激活,一条流恰一个生效版本
⑤ 起单跑通:受理 → 审批(运营时分配审批人)→ 归档 → 闭环,末态 completed
⑥ 新流与老流引用同一批活动各跑各的 —— 建新流没动到活动
这条新流(quick-archive:受理→审批→归档)只用了编排层的能力:
节点两种、条件出边(审批点的 verdict 出边)、边映射五源、激活双判据。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 23:51:04 +08:00 |
|
 ChaiHaoandClaude Fable 5
|
f30f24e0ba
|
工具总线装配面测试:三路各穿各的缝
守开环 Agent 最容易出事的三条:
- 写类工具**过程中不落地**(只登记意向,并如实告诉 Agent 世界还没变)——
骗它说已执行,它会据此往下推而世界一步没动
- 调人 = 发工单 + 立监听,卡号记进 trace(引擎据此挂起,不重复发第二张)
- LLM 五件经模型网关、用活动声明的用途名;提示词归系统
六例全绿;顺带钉住 Mastra 的 tool id 规矩(点号 → 双下划线)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 23:48:40 +08:00 |
|
 ChaiHaoandClaude Fable 5
|
f96eff906a
|
工具总线 + Agent 开环:声明式工具、人类工具与 LLM 五件系统内化(Mastra tool 形状)
用户定:Agent 调用工具一律**声明式**;人类工具与 LLM 工具要系统内化;
工具总线基于 Mastra tool 设计。
**声明面**(`toolbox/internal/domain/tool-bus.ts`,纯逻辑零框架):
`compileToolBus(声明 × 目录) → 一张清单` —— 编译期定死这一单能调什么,
清单之外结构上调不到(白名单在缝里再把一次关);缺件/停用如实报不静默。
三路同一形状:
· `function` 功能工具:按活动白名单查目录,带出效应(read/write)
· `human` **人类工具**(系统内化、零声明即得):调人 = 发工单 + 立监听听人 ——
这是 Harness 给的能力,不进目录、不需白名单,每个活动天然可以调人
· `llm` **LLM 五件**(系统内化):extract/classify/summarize/judge/rewrite,
各有入参出参契约、经模型网关一缝;**仅当活动声明了模型用途名才上总线**
(没声明却会问模型 = 越权,用量也无从归因);提示词归系统,活动改不了
**装配面**(`app/tool-bus.ts`,Mastra `createTool`):清单 → 可调用工具,
JSON Schema 现译 zod(模型照它填参,填错当场被拦);三路各穿各的缝:
写类工具**过程中一律不落地**,只登记动作意向(骗 Agent 说已执行是最坏选项);
调人把卡号记进 trace,引擎据此把这一拍挂起。
**Agent 开环**(`app/mastra-agent-runner.ts`,M5-2 第二实现,用户选的路线):
Mastra `Agent` + 工具总线,拍内自主连环调工具,拍末交回结构化结论。
放开的是工具循环不是规矩:写类不落地、终局唯放行、调人即挂起(新增
`AgentAction.asked` 型 —— 卡已由总线发出,引擎只收尾,不重复发卡)、
用量按 usage 计入预算。`JCAI_AGENT_OPEN_LOOP=1` 开启,缺省仍是单拍版。
`ModelGateway.resolve` 新增:名 → 四元(密钥当场解出,只给 app 层装配用)。
代价如实记 debt M5-2:开环下模型**逐轮**调用不经录制回放(tool-calling 往返
`generate` 的 text-in/text-out 承载不了)—— 凭证隔离与工具调用一缝完整。
测试:tool-bus 六例(白名单/缺件/停用/人类工具恒在/LLM 按声明/五件契约);
四闸(typecheck/lint/depcruise/test)全过;spike 目录排除出 lint(验证性原型)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
|
2026-07-28 23:46:12 +08:00 |
|