你不可能通过逐条发送指令来管理一个员工。你要给他们一份合同、一个试用期,以及一种衡量他们是否还值得这份薪水的方式。Fable 5 也需要同样的对待。
问题是这样的。Fable 5 可以连续运行数小时而无需你干预,自主启动自己的子 Agent,并在一个晚上完成积压一周的工作。同时,它每个 token 都要花真金白银,只要你把范围留得开放,它就会超额交付,而且它捍卫一个错误答案的能力比大多数人类捍卫正确答案还要强。
如果不加管理,它就是一种产生自信胡说八道的昂贵方式。但如果签了合同,它就是你每天花几美元就能得到的、最接近全职员工的东西。
这就是那份合同。不是理论,而是实际的文件,按你编写的顺序,围绕一个真实的部署构建:我已经在巴黎的一台 VPS 上通过 pm2 运行的监控机器人。认证流程和计费表不是我的攻击面。RPC 密钥、钱包地址和实时区块链交易才是。下面的系统就是为此构建的,而不是为通用的 SaaS 仓库。
五个部分,每个部分交付一个文件。总设置时间:不到两小时。
设置
1claude CLI (Claude Code) 配有 Fable 5 访问权限 # 使用额度,有上限2llm CLI + OpenRouter 密钥 # 用于廉价模型3jq、git、pm2、cron4一台已经运行着机器人的 VPS
你最终得到的是:
1agent-contract/2 CONTRACT.md # 第 1 部分:雇佣条款3 ops/4 shift.sh # 第 3 部分:每日轮班5 dispatcher.md # 路由提示,仅限 Fable6 intake.md # 廉价读取器,先读取日志7 worker.md # 廉价模型,负责打字8 reviewer.md # 新的 Fable,检查工作9 boundaries.md # 第 2 部分:它可以和不可以接触的内容10 guardrails/signoff.sh # 第 2 部分:确定性的通过/不通过11 personnel/12 trust.tsv # 第 4 部分:谁赢得了自主权13 standing-checks/ # 第 4 部分:必须保持为真的事情14 incidents/15 log.tsv # 第 5 部分:什么坏了以及何时16 runbook.md # 第 5 部分:如何处理17 Makefile
在开始之前,有一条值得引用的规则,因为它为之后的一切定下了基调:
给自己作业打分的 Agent,就是给自己加薪的 Agent。
这个系统中没有任何东西会检查自己的工作。一次也没有。
第 1 部分:合同 (CONTRACT.md)
员工合同不是一堆建议,而是数字、硬性停止点和无论员工是否同意都会执行的条款。用同样的方式写这个文件。没有“请”或“尽量”。模型会优化绕开软性语言,就像实习生优化绕开从不检查的经理一样。
1# CONTRACT.md23## 硬性停止点(无例外,无需问两次)4- 未经批准,绝不触碰钱包密钥、.env 文件或 RPC 凭据。5- 未通过签收,绝不向正在运行的机器人进程推送更改(pm2 restart)。6- 单次提交的更改行数超过 150 行时,必须先询问。7- 绝不要仅凭自己对输出的理解就声称任务完成。8 完成意味着签收脚本返回了 0。其他任何东西都不算数。9- 绝不要发明 API 端点、合约地址或配置值。10 如果仓库中没有,停下来并询问。11- 绝不要添加新的依赖项。在 ops/shift-log.md 中记录并停止。12- 绝不要编辑或删除测试、告警阈值或监控条件,以使某些东西通过。13 那不是修复,而是欺诈。14- 在轮班内绝不要以“高”以上的努力度运行。“极高”只用于你手动触发的单次审查,绝不能用于自动化循环。15- 绝不要在响应中叙述或解释你的内部推理。这看起来很有帮助,但在 Fable 5 上,它反而可能触发拒绝分类器。1617## 工作路由(谁做什么,最便宜且能胜任的胜出)18| 模型 | 每任务成本 | 野心 | 判断力 | 品味 |19|--------------------|------------|------|--------|------|20| claude-fable-5 | 高 | 低 | 10 | 10 |21| claude-opus-4-8 | 中 | 中 | 8 | 9 |22| claude-sonnet-5 | 低 | 高 | 7 | 7 |23| 廉价开源 Worker | 最低 | 最高 | 5 | 4 |24251. 决定下一步做什么、审查 diff、打破平局 -> Fable 5,只读,高努力度。262. 读取原始日志、转储或任何超过 50k token 的内容 -> 廉价 Worker。27 绝不使用 Fable。那相当于用总监的费率去读一张电子表格。283. 任何用户或链直接交互的内容 -> 在发布前需要品味评分 8 或以上。294. 其他所有内容 -> sonnet-5,中等努力度,失败时升级一级。3031## 定义32- “判断力” = 能否在无人监督的情况下处理桌上最困难的任务33- “完成” = 签收脚本退出码为 0,句号34- “小” = 更改行数少于 50 行35- “清理” = 行为逐位相同,前后签收均为绿色3637## 唯一算数的“完成”定义38- 每个任务在开始工作前都有一个机器可检查的终点线。39- 一个既没有看到计划也没有看到草稿的评审者来检查。40- guardrails/signoff.sh 拥有最终投票权。不是评审者,而是脚本。41- 如果 Worker 和评审者连续两次意见不一致,则交给人类。42 没有第三次意见,没有平局打破模型。
换成你自己的数字。任何你 80% 的时间都会放过并仍然称之为“完成”的东西,都需要附上一个数字或一个“绝不”,否则就删掉它。
第 2 部分:边界和签收
没有对允许接触的内容进行背景调查,也没有经理在发布前签收,员工合同就毫无意义。两个文件。
ops/boundaries.md:
1## 可以独立完成2在分支上起草修复;更新 shift-log.md;重启*非生产*测试实例;标记过时的数据源34## 需要我的签名5wallet/、.env*、config/rpc.json 下的任何内容;任何超过 300 行的 diff;对正在运行的 pm2 进程的任何更改;任何发送交易的操作67## 立即唤醒我8评审者两次未能通过相同的修复;路由器提供了与请求不同的模型;每日支出超出限额;常规检查变红;任何要求提供私钥的行为
ops/guardrails/signoff.sh(编辑命令以匹配你的机器人):
1#!/usr/bin/env bash2set -e3npm run typecheck --if-present4npm test --if-present5pm2 describe "$BOT_NAME" | grep -q "status.*online" || exit 1
在系统中任何其他东西上线之前,手动运行一次。如果它在你当前的设置上不能干净地通过,那才是真正的第一个任务。所有下游都假设这个脚本说的是真话。
第 3 部分:轮班
这是成败的关键计算。让 Fable 5 全程打字,一次完整的会话很快就会花掉真金白银,如果让它写几个小时,就是四位数。而让 Fable 5 做决策,同时用廉价模型打字,则完全是另一笔账单——大约 15-20% 的 token 成本,却得到了 100% 的判断力。
所以轮班有四个雇员,而不是一个:
- 一个近乎免费的模型读取过夜日志和 pm2 输出。只说“安静”或“可操作”。仅此而已。
- Fable 5,只读,决定唯一最高价值的事情并写下工作指令。它不碰代码。
- 一个廉价的 Worker 模型在一个隔离的分支上执行工作指令。
- 一个全新的 Fable 5 实例,只看规格和 diff,投票通过或不通过。
第 2 部分中的确定性脚本每次都投出打破平局的一票。

ops/shift.sh:
1#!/usr/bin/env bash2set -euo pipefail3cd "$(dirname "$0")"4DAILY_BUDGET="${DAILY_BUDGET_USD:-5}"5INTAKE_MODEL="${INTAKE_MODEL:-openrouter/deepseek/deepseek-v4-flash}"6WORKER_MODEL="${WORKER_MODEL:-openrouter/moonshotai/kimi-k2.6}"78# 1. 输入,几分钱9pm2 logs --lines 100 --nostream | llm -m "$INTAKE_MODEL" -s "$(cat intake.md)" \10 >> shift-log.md11grep -q "status: actionable" shift-log.md || { echo "安静轮班"; exit 0; }1213# 2. 调度,Fable,极高,只读,决策并停止14claude -p "$(cat dispatcher.md)15LOG: $(cat shift-log.md)16TRUST: $(cat personnel/trust.tsv)17BOUNDARIES: $(cat boundaries.md)" \18 --model claude-fable-5 --effort xhigh --allowedTools "Read" \19 --output-format json > /tmp/order.json2021SERVED=$(jq -r '.modelUsage | keys[0] // "claude-fable-5"' /tmp/order.json)22[[ "$SERVED" != *fable* ]] && { echo "被重新路由,丢弃这次运行" >> shift-log.md; exit 2; }2324jq -r '.result' /tmp/order.json > work-order.json25ACTION=$(jq -r .action work-order.json)26[[ "$ACTION" == "stop" ]] && exit 027[[ "$ACTION" == "queue" ]] && { echo "已排队等待签名" >> shift-log.md; exit 0; }2829# 3. 执行,廉价 Worker,隔离分支30BR="shift-$(date +%s)"31git worktree add "../$BR" -b "$BR" >/dev/null32( cd "../$BR" && llm -m "$WORKER_MODEL" -s "$(cat "$OLDPWD/worker.md")" \33 "$(cat "$OLDPWD/work-order.json")" > shift-notes.md )3435# 4. 审查,全新的 Fable,仅看规格和 diff,其他不管36VERDICT=$(claude -p "$(cat reviewer.md)37SPEC: $(jq -r .spec work-order.json)38DIFF: $(cd "../$BR" && git diff)" \39 --model claude-fable-5 --effort high --allowedTools "" \40 --output-format json | jq -r .result)4142# 5. 唯一能发布东西的投票43if [[ "$VERDICT" == PASS* ]] && ( cd "../$BR" && "$OLDPWD/guardrails/signoff.sh" ); then44 echo "通过,根据信任等级已发布或排队" >> shift-log.md45else46 echo "失败: $BR 保留等待审查" >> shift-log.md47fi
由 Fable 做出的决策和由 Fable 打出的一行代码是两种不同的价格标签。只为决策支付更高的价格。
第 4 部分:人事档案
信任不是公司范围的设置,而是每项任务赢得的,就像你不会在第一天就把生产密钥交给新员工,无论他们的作品集看起来多好一样。
personnel/trust.tsv 按名称追踪每个重复性任务:运行次数、通过次数、当前等级。
- 观察:运行次数少于 10 次,或通过率低于 90%。仅限草稿,无例外。
- 试用:运行次数 10-19 次,通过率 90% 以上。每次都需要你的签名。
- 通过:运行次数 20 次以上,通过率 95% 以上。无需你即可发布。

一个通过的任务出错不会得到警告,而是直接降回试用,并打印到 stderr,你的 cron 会邮件通知你。自动降级是唯一真正有效的降级。
人事档案的另一半是 personnel/standing-checks/。每个完成的任务都会在这里毕业,成为一个必须永远返回 true 的命令,每天检查一次:
1# personnel/standing-checks/bankr-claim-monitor.md2predicate: pm2 describe bankr-claim-monitor | grep -q "status.*online" && \3 sqlite3 claims.db "select count(*) from claims where ts > strftime('%s','now','-1 day')" | grep -qv "^0$"4last-verified: 2026-07-085on-violation: 唤醒我,不要盲目自动重启
一个只验证过一次的任务并没有完成,它只是一个带时间戳的假设。
通过 cron 每天运行检查。失败的谓词意味着曾经为真的事情不再为真,而且没有这个文件,没人会注意到。
第 5 部分:事件报告
这是原始操作手册跳过的一节,但一旦系统在流动真实资金的基础设施上运行,这一节才是真正重要的。每个 Agent 系统最终都会做一些你不希望它做的事情。问题在于你是从干净的日志中发现,还是从干涸的钱包中发现。
ops/incidents/runbook.md:
1| 信号 | 含义 | 操作2|----------------------------------|---------------------------------------|--------3| exit 2 (被重新路由) | 不同的模型服务了请求 | 丢弃输出,绝不基于它构建,第二天重试4| stop_reason: refusal | 安全分类器拒绝,HTTP 200 | 不是错误,检查日志;如果某个任务反复被拒绝,那么该任务很可能触及了不该碰的东西5| 签收连续两次失败,相同的修复 | Worker 和评审者无法达成一致 | 移交给人工审查,不要自动重试第三次6| 常规检查变红 | 已经完成的事情不再为真 | 检查上次验证日期,比较自那以后发布的 diff,不要自动回滚7| 每日支出超出限额 | 预算超支 | 停止轮班,读取 shift-log.md,找出哪个阶段膨胀了8| 任务触及 wallets/.env/rpc | 边界违反尝试 | 硬停止,如果 boundaries.md 被遵守,这绝不应该发生;任何出现都视为系统本身的 bug
将所有这些都记录到 incidents/log.tsv 中,并带时间戳,无论你是否对其采取了行动。目标不是零事件,而是没有你太晚才知道的事件。
每周一次,做一次堆肥处理:阅读事件日志、信任文件中的降级,以及任何排队超过 3 天且未被签名的东西。最多提取三个提案:一个 CONTRACT.md 的新硬性停止点、一个职位描述的修复,或者一个你遗漏的常规检查。你需要手动签署所有三个。系统可以提议自己的下一条规则,但永远不能自己写一条。
试用期时间表
三个检查点,而不是三十天的保姆式监督:

检查点 1. 每天手动运行一次轮班,持续一周。阅读每一行。当连续三次轮班都按你本来会的方式路由时,毕业。
检查点 2. Cron 接管轮班。你一边喝咖啡,一边审查队列,而不是自己运行。当两个重复性任务跨越 20 次运行记录时,毕业。
检查点 3. 你表现最好的任务无人值守地发布。当它连续运行一周且你零干预时,毕业。
规则摘要
- 合同是一个数字或一个“绝不”。任何更软的东西都会被优化绕过。
- 调度者做决策,Worker 打字。两者都不检查自己的工作。
- Fable 的判断力值得这个价格,但 Fable 的打字通常不值。
- 信任是按任务定的,不是公司范围的,降级是自动且响亮的。
- 完成的任务如果不再检查,就不是完成,而是带日期的猜测。
- 边界存在一个你十秒就能读完的文件里,而不是你的记忆里。
- 事件日志的存在是为了让你从报告中发现问题,而不是从余额中发现问题。
- 绝不要在你没有要求的模型输出上构建。
- 每周一次,系统可以提议一条新规则。但你仍然是签署它的人。
模型从来不是难点。围绕它构建一个在无人监督时仍能保持诚实的东西,那才是真正的工作。这就是对于机器人舰队而不是代码库来说,它看起来的样子。
从 guardrails/signoff.sh 开始。手动运行一次轮班。为你最近发布的机器人写一条常规检查。第一次它抓住你原本确信没问题的东西时,剩下的就不再是可选的了。
关注 @GipArcAI 获取更多这样的分解,在 X 上找我: https://x.com/gippp69。


![成田悠辅的天才 AI 使用技巧 [珍藏版]](/cdn-cgi/image/width=1920,quality=90,format=auto,metadata=none/https%3A%2F%2Fcms-assets.youmind.com%2Fmedia%2F1784137658627_u4bwry_HNMS89bbsAAUPJI.jpg)


