文档护栏

护栏

mind 与链之间有四段,任何一段都能单独否决。如果你只读一篇,读这篇。

mind → policy → signer → chain

  1. 工具 schema —— 让危险的事说不出口

    没有任何工具接受地址。 recipient / destination 这类字段直接被 schema 拒绝。收款人由平台从链上快照算出,模型只能引用平台放进它上下文里的 id。

  2. 策略引擎 —— 确定性,而且 mind 改不了

    一个零依赖的纯函数:不碰链、不碰 LLM、不碰数据库。入参是拟执行动作加状态快照,出参是放行、或者全部触发的拒绝码。自主动作与人工动作走的是同一份实现。

  3. 隔离签名器 —— 独立把整件事重做一遍

    独立服务、独立密钥,mind 到它没有网络路径。它自己重算可用余额、自己重跑模拟、按动作类型校验 program 白名单、只付给签名那一刻链上确实持币的钱包。它还有一个自己的熔断器,不管策略引擎批没批都会跳。

  4. 链 —— 只有确认结果才改账本

    报价和预估永远不入账。买回按链上确认的余额变化量结算,与报价之间的差额记为滑点。

没有任何工具接受地址

这是其余一切的地基,所以值得把这句话的含义说准。

这不是用提示词让模型别乱转账。是模型在结构上无法表达「转给任意地址」。

整个工具面里根本不存在一个地址形状的参数供它填。一个声明了地址字段的工具定义会编译失败 —— 约束写在类型里,所以不会被某个赶时间加工具的人重新引入。

派发类工具接受的是筛选条件而不是地址:「余额高于某值、且已持有超过某时长的持币人」。平台拿这个条件去自己的持仓索引里解析。模型从头到尾看不到、也给不出一个收款地址。

策略引擎

由策略强制,不是靠模型自觉。

限额分单笔 / 每小时 / 每日三个维度,都是该币自己可用金库的比例。之上还有储备地板、价格冲击上限、敞口上限和冷却期。mind 没有任何工具能修改其中任何一项。

它返回全部拒绝码,而不是第一个

只返回第一个会让调试变成逐个击破;而对一个当众花钱的 agent 来说,「这次动作一共踩了哪几条线」本身就是值得公开的信息。目前共 21 个码:

分组拒绝码
额度SINGLE_ACTION_LIMIT · HOURLY_LIMIT · DAILY_LIMIT · PROGRAM_COMMIT_LIMIT · TOO_MANY_PROGRAMS · REWARD_LIMIT · COOLDOWN
资金INSUFFICIENT_FUNDS · RESERVE_POLICY · ETH_RESERVE · DUST_DISTRIBUTION · INVALID_AMOUNT
市场PRICE_IMPACT · EXPOSURE_LIMIT · STALE_QUOTE
数据新鲜度STALE_DATA · PRICE_UNAVAILABLE
状态UNKNOWN_COIN · STATE_CHANGING · MIND_HALTED
抗女巫SYBIL_INELIGIBLE

隔离签名器

第三段不信任任何别人递给它的数字。这里的「独立」指的是它重做一遍工作,而不是复查一遍结论:

  1. 自己从账本重算可用余额。
  2. 自己重跑一次模拟。
  3. 按动作类型校验 program 白名单。
  4. 只付给签名那一刻链上确实持币的钱包。
  5. 施加自己的单笔与每小时流出上限。
  6. 先持久化已签名的原始交易,再广播。

熔断是 latch

一旦跳闸就保持跳闸,直到有人按书面 runbook 手工解锁,而且解锁动作本身也要留审计。它不是一个会自愈的限速器。

原因与这套设计直接相关:金库是链下账本,没有链上托管兜底,所以偿付能力对不上时,我们无法区分「瞬时抖动」和「正在漏钱」。自动恢复就等于在原因未知时继续花钱。

全局不变量

每一笔都对照该币自己的可用余额检查,原子预留,并在签名前由隔离签名器再复核一遍。

这句话对每一条花钱路径都成立 —— 自主的还是人工的,奖励、买回还是 program 预算。真正起作用的是两处:「原子预留」保证一个币永远花不到另一个币的钱;「签名器再复核」保证策略引擎本身的一个 bug 还不足以丢钱。