ADR-025 FinBayes agent 骨架范式定型(纯 ReAct + 输出要素规范 + 快慢两条线)
状态
accepted(owner 2026-06-07 拍板)。本 ADR 是 FinBayes agent 骨架范式的决策锚,下位文档(白皮书向下指针 / 架构 / 子系统 / engineering-packs / §9)的对齐矫正全部引用本 ADR。
🔧 范式判定经实证精炼(owner 2026-06-07 晚):本 ADR 的证据基 catalog v1 被 owner 判定为模块级印象,遂做 6 仓内外循环 call-graph 实证 + Tier 2 实跑(见 catalog v2)。头号铁律「不在 ReAct 外架控制墙」成立且强化;但「静态流水线 / Plan-and-Execute 一律否决」范围过宽——经实证收窄为「只否决 outer-loop / 控制流结构(pre-router 改写、router 收拢、绕过主回路);inner-loop 工具化结构(WorkflowTool 静态步骤+主 LLM 推进、子 agent fork)与输出投影结构(按需 forced schema)允许且被强 agent 采用」。§决策 3「目的保留、实现重构」立场不变,重构形态由 ADR-028 承载。范式三分细节以 catalog v2 §6 为准。
🛠 慢线现状回写(2026-06-24):§决策 4 / §骨架形态 的「慢线 = 事后复盘线」当时(2026-06-07)尚属设计;至 2026-06-24 其核心闭环已在阶段 1「切片」工作中落地并接线——判断台账(
finbayes/judgmentlog.py)+ 候选→确认两步写入(watchlist.py)+ 心跳每日失效条件复盘(heartbeat/service.py)+ 校准 Brier/ECE/可靠性(calibration.py)。原文「慢循环应比 martin 更进一步」的目标已部分兑现;剩余工作 = 补诚实 + 健壮缺口(头号 = 前视偏差 / 快照冻结)。详见 慢线现状与补缺设计。本回写不改原决策、仅记现状。
背景
ADR-024 选定 CurvatureLabs/FinBayes 作基线后,owner 与主控就「FinBayes 该用哪种 agent 骨架范式」做了一轮深度核证:
- 七仓实地核证:并行派 7 个只读 sub-agent 核证 7 个有代表性的 agent 仓库(通用:Openclaw、Hermes;coding:Claude Code、Opencode;金融:martin-Finclaw、Chelae-FinClaw、aifinlab-FinClaw),每仓产出 9 维结构化报告,所有判定带
file:line证据。沉淀为 agent 骨架范式参考(下称 catalog)。 - 关键发现:
- 6 个真 agent 主回路全部是 ReAct,无一例外(跨 Python/TS/JS、跨通用/coding/金融)。Plan-and-Solve / Plan-and-Execute / 静态流水线 / Ralph 没有任何一个被用作主回路。
- Plan-and-Solve / Plan-and-Execute 只有 Claude Code、Opencode 真做了,且都是作为 ReAct 主回路里 LLM 可选的工具/模式,不替代主回路(Claude Code「everything-is-tool」哲学)。
- 事后复盘线 / 校准 / 跨任务学习 7 仓全员缺席——§9 在这块是领先 7 仓的真创新,不是过时方法论。
- owner 实测 Chelae(ReAct + 规则 pre-router + router-of-routers)远弱于 martin(纯 ReAct + 扁平工具)——结构化程度与实际表现负相关。
- 对 FinBayes 旧版的诊断:FinBayes 旧版的金融认知模块(代码在
finclaw/cognition/)是静态流水线(plan 不是 LLM 产物,而是dispatcher静态表写死的「意图→DAG 节点」映射;金融意图命中即绕过 ReAct 走旁路,finclaw/agent/loop.py:503-565)。它比 Plan-and-Execute 还低一档,且放在了绕过 ReAct 的主路径位置——两个错误叠加。这是待重构/可能整体抛弃的部分。(命名注记:这是 FinBayes 自家仓库的旧实现,与 OpenAI 的 Codex coding agent 无关。)
决策
头号设计铁律:不在 ReAct 之外另架控制墙
任何切换/绕过/接管 ReAct 主回路的外部控制结构,都禁止。 允许的扩展只有一种形态:作为工具暴露给 ReAct,由 LLM 自己决定要不要调(Claude Code「everything-is-tool」哲学)。这条铁律同时否决:
- FinBayes 旧版「金融意图命中 → 绕过 ReAct 进静态流水线」的旁路
- Chelae 式「规则 pre-router 在 LLM 看消息前改写/路由」(owner 实测更弱)
- 任何「LLM 给出答案后由外部 validator 强制重做」的 blocking 墙
骨架六条结论
- 主回路 = 纯 ReAct:LLM 每步基于观测决策下一步,金融意图识别交给主回路 LLM 自主完成,工具措辞诚实到让模型按市场/任务自选(martin 已验证这条最强)。
- 规划能力 = ReAct 内 LLM 可选的工具:Plan-and-Solve(LLM 当场产计划)/ Plan-and-Execute(预编 workflow 模板)作为工具暴露,不替代主回路(参 Claude Code EnterPlanMode/WorkflowTool、Opencode 双 agent)。
- 旧版静态金融认知流水线:实现抛弃、目的保留。它承载的「输出要素规范」(结构化金融判断输出:方向/证据/失效条件)目的有价值,保留;承载它的静态流水线实现(taxonomy 静态表 + 静态 DAG + 绕过主回路)抛弃。具体 schema 代码复用还是重写,待重构时定,不预先承诺。
- 快慢两条线(= §9「双时间尺度」):即时应答线(ReAct,秒/分钟,当场答完)+ 事后复盘线(独立 daemon,天/季度,失效条件监控 + 事后市场验证 + 准确度校准)。两者经判断存储松耦合,事后复盘线不进 ReAct 进程。校准回灌即时应答线用 feature flag,默认只进 dashboard,开关打开后才激活回灌、且回灌方式可切换、按实际体验调(理由:在事后复盘线的真验证器证明能诚实工作之前,不让它的输出去改 agent 行为)。
- 自检 = audit 不 blocking:原 synthesis_validator 降级为「LLM 可主动调的自检工具 + 不阻断的 audit hook」。高危类别(如具体仓位建议)走用户主权两步确认(产品层的门,用户拍),不在 loop 里架 blocking 墙。
- 术语白话化(叙述层)+ 技术词留代码层(owner 2026-06-07 拍):产品/方法论叙述层用白话——即时应答线(=快循环)/ 事后复盘线(=慢循环)/ 输出要素规范(=数据契约口语义);但 ADR-008 supplement 已锁定的工程术语「契约层 / 输出契约 / StructuredCognitionResult」保留不动(换了会断事实源链)。glossary 双登记「白话名(= 旧技术词)」,两边不失联。
骨架形态(非分层堆叠,是快慢两条线)
┌─ 事后复盘线(独立 daemon,时钟 = 天/季度)──────────────────┐
│ 失效条件监控 → 事后市场验证 → 准确度校准(统计累积) │
│ ▲ │ │
│ │ 写判断 读校准后基准(默认关)│
│ ┌───┴──────────────────────────────────────────▼────────┐ │
│ │ 即时应答线(ReAct,时钟 = 秒/分钟) │ │
│ │ 用户消息 → LLM 决策 → 工具调用 → 观测 → 重决策 → 答案 │ │
│ │ ↑ 贯穿:输出要素规范(工具产出 + 最终答案的格式约束) │ │
│ │ ↑ 可选:规划工具 / 自检工具(LLM 主动调,非外部强制) │ │
│ └────────────────────────────────────────────────────────┘ │
│ 共享状态 = 判断存储 │
└──────────────────────────────────────────────────────────────┘
下位对齐 backlog(本 ADR 授权的矫正清单)
2026-06-07 派 4 个只读 audit agent 摸清了上下位冲突面。矫正在 commit 前一轮完成,verify-kb 全绿。
保留资产明确不动(指文档/契约作为「输出要素目的」的事实源不动,与 §决策3「代码实现层面复用还是重写待定」不冲突——保留的是目的与契约口径,不是承诺旧代码原样复用):所有 cognition schema 契约(契约层 Pydantic 口径,ADR-008 锁定的字段名/类型/必选可选作迁移事实源)、architecture 已矫正的 agent 锚点(§2/§5/§9.2)、eval-harness(事后复盘线雏形)、v-dimension(judge 非 blocking)、凭证脱敏 hook(INV-11 合规,本就是 PreToolUse hook)、用户两步确认(已对齐)、engineering-packs 的 schema 层文档(cognition-1.1-contract / cognition-output-spec / matrix / snapshot-seed,作为输出要素规范的事实源)。
矫正手法(owner 2026-06-07 拍):上下位文档直接改正文到正确形态(ReAct 内工具 / 自检 audit / 事后复盘线 daemon),不加「失效标记 / 变更批注」式脚手架——审计轨在本 ADR + git,文档本身读起来即正确。
波 1 · 6 个 P0 震中 + §9 两处回写
| # | 位置 | 现状 | 矫正方向 |
|---|---|---|---|
| P0-1 | strategic-whitepaper.md:1144 | 「综合层的非可选契约」焊成 blocking 墙 | 改为:事实空间约束 = 输出要素规范的横切约束,由 audit hook 校验、非 blocking;删对「综合层」实现层绑定 |
| P0-2 | commons/references/2026-06-06-financial-agent-skeleton.md:113-119 | 代理验收门写得像产出前 blocking 门 | 直接改 §9 措辞:自检 = LLM 可调自检工具 + 非阻断 audit,高危走用户主权两步确认(§决策5) |
| P0-3 | 同上 :124-128 | Plan-and-Solve 当「独立一层」(带重规划回边) | 直接改 §9 措辞:规划 = ReAct 内 LLM 可选工具,不另起 planner 层(§决策2) |
| P0-4 | subsystems/mca-classifier.md:16,188 | pre-router 墙「调用前必须先取得 mca_bucket」「强先验」「强制下发」 | 重定位为 ReAct 内 LLM 可选的「市场上下文标注工具」;删「调用前必须先取得 / 强制」控制流语义;评测分桶(事后线用)可留但不得反推主回路必先跑 MCA |
| P0-5 | subsystems/consistency-middleware.md:16,24,62-72 | blocking validator「结论产出前必须过一次」+ N=3 回路 + 反向强制重算 | 重定位为 ReAct 内可选自检工具 + 非阻断 audit hook;删「必须过」+ 强制重算回路;矛盾交主回路 LLM 自主重决策 |
| P0-6 | engineering-packs/m0-walking-skeleton.md:84,182,261 | 主链路 = dispatch_task→run_task→synthesize 静态单 shot 流水线 + 「意图识别层」dispatch 时填 MCA(pre-router) | 主回路改写为纯 ReAct(观测-重决策循环);删意图识别预分类层;补「M2 循环 = ReAct 主回路、不架控制墙」 |
| P0-7 | subsystems/README.md:13-29 | 「4 子系统架构」把 MCA/CM 立为与通路层正交的固定认知阶段 | 框架级重写:4 固定阶段 → 3 个 ReAct 内工具/hook(MCA 标注工具 / KG 图谱工具 / CM 自检工具)+ 1 个事后线 daemon(Eval) |
波 2 · P1 冲突
- 白皮书 3 处向下指针(
:1176架构 §6 任务分类、:521-5237 类任务锁表、:1318-1320StructuredCognitionResult「正式锁定」)→ 改为目的层声明,实现/schema 待重构定。 architecture.md§9 认知承接层(:6090-61098 机制 + MCA 7 轴 + S1 子流程)→ 整段标「待重构」,旧静态流水线结构抛弃、目的保留。m1_5-cognition-realization.md:31,45,71综合层 synthesis.py 单点一次成型 → 明确算 ReAct 内可选工具产出,schema 复用待定。knowledge-graph-service.md:173强制前置依赖 mca_bucket → 解绑,KG 作 ReAct 可选工具。architecture.md:1133复合任务 TaskGroup「显式拆解、不依赖 LLM」→ 改 ReAct 内 LLM 自主分解,拆解作可选规划工具。architecture.md:1434+recommendations.md:78-92L3「缓存+规则前置路径」→ 默认路径直入 ReAct,缓存作工具/后置优化。
波 3 · 术语统一(白话叙述层)+ glossary 登记
- 循环三词(双时间尺度/快循环/慢循环)非对照表用法约 27 处 + 「数据契约」口语 3 处 → 白话三词 + 输出要素规范。涉 §9 / CURRENT-MILESTONE / ADR-024。
- 「契约层 / 输出契约 / StructuredCognitionResult」50+ 处 = ADR-008 锁定工程术语,不动。
ecosystem/glossary.md补登记 4 条白话新词(双登记「白话名(= 旧技术词)」+ status: draft)+ 弃用表 4 行。(动 ecosystem/** 走生态级流程。)
后果与边界
- 本 ADR 定文档层范式与对齐;文档对齐阶段把上下位正文直接改写到正确形态(不删改工程代码、不加失效标记式脚手架)。具体子系统在工程层是「重定位为工具(复用部分代码)」还是「删除重写」,是阶段 2 工程实施的事。
- 工程仓(
CurvatureLabs/FinBayes)的实际重构归阶段 2 工程会话;本 ADR 是它的 spec 依据。 - 阶段 1(基线不退化)纪律不受影响:阶段 1 全程不动 cognition,本 ADR 的重构属阶段 2。
- 留阶段 2 专研:「一个判断事后算不算对」的诚实定义(事后复盘线落地命门),可复用治理仓已有 14-case 校准研究当素材库。
关联资产
- 七仓骨架范式参考(全证据):agent-skeleton-paradigm-catalog
- 上游依据 §9:financial-agent-skeleton
- 基线选定:ADR-024
- 输出契约工程锁定:ADR-008 supplement(本 ADR §决策6 明确其术语保留不动)
- 变更协议:变更协议