- 人工智能
- AI Agent
- 多智能体
- Agent 编排
- 代码智能体
- CLI
【免费下载链接】openrig
Multi-agent harness that runs Claude Code and Codex together as one system
导读
OpenRig v0.5.5 是官方代号"ambient-attention release"(环境感知版)的一次里程碑发布:它让整个 agent 集群(fleet)学会自主发现问题、自主重试、自主升级、自主诊断、自主入职,把"守护在途工作"这件事从人工轮巡变为系统内置能力。读完本文,你将掌握rig parked静默卡死诊断、自愈式 baton wake 升级阶梯、queue block --on停靠即唤醒、rig ps类型化 ACTIVITY 列、rig seat handover执行路径、Slack 人类决策层、自动入职 onboading 包与一文件 scope 约定等全部 0.5.5 新能力,并了解每条能力背后的 daemon 源码与测试验证。
本文依据 docs/releases/v0.5.5.md 与 CHANGELOG.md 的[0.5.5]条目撰写,所有命令行、参数与源码引用均来自当前仓库。
发布基础信息:v0.5.5 完整包含 v0.5.4("honesty release",诚实版)的全部内容,是一条已对账的统一 lineage;版本号从
0.5.4递增;Node engines 未变;API 保持向后兼容,全部新增动词均为增量叠加。
一、两个新迁移:072 与 073
v0.5.5 引入两条新数据库迁移,迁移头从071前进到073:
072_thread_seat_map.ts(源码):线程 ↔ seat 映射表,用于 Slack 人类层。设计要点是一张表承载完整映射:thread_ts为主键,记录channel、human、seat、conversation_id、state('open'/'closed')、opened_at、closed_at。线程被视为"一个人与一个 seat 之间的临时 DM",我方拥有映射的所有权,路由是对thread_ts的确定性查找——零推断。该表是事实的缓存,同时被盖章写入 queue 行(slack-posted thread_ts=… message_ts=…转移注释),因此即使表丢失也能从 queue 行重建映射,绝不自造映射。073_queue_transition_wakes.ts(源码):队列转移的唤醒证据表。设计哲学是"唤醒证据属于追加式park 转移,而非可变的 queue 行"。表结构为transition_id主键 +qitem_id+phase('armed'/'fired')+wake_kind('watchdog'/'timer'/'blocker')+wake_ref+delivery_status,并配有(qitem_id, transition_id)与(wake_ref, phase)两个索引。它保证queue_transitions本身保持不可变,且在 active→archive 生命周期中无需改写历史。
安装提示:升级到 0.5.5 时 daemon 会自动应用这两条迁移;迁移头为 071 的旧库(0.5.3/0.5.4)会平滑前进到 073。
二、rig parked [seat]:派生式静默卡死诊断
2.1 核心价值
0.5.5 之前,判断一个 seat 是否"悄悄卡死"需要人工做claimedAt时间算术 + 面板抓取(pane capture)。rig parked终结了这种猜测:它由 daemon在读取时动态派生诊断结果,输入是"活动性 oracle × 队列的义务面(obligation face)",并对两个输入分别返回置信度与内联教学式 remedy。
适用场景:一个 seat 看起来闲置、你怀疑有工作被丢掉时,在任何claimedAt算术或面板抓取之前,先用它。行表面的旧视图掩盖了 park(停靠)与 strand(搁浅)的区别,这个动词结束了这种混淆。
2.2 命令行用法
rig parked [seat] # 诊断整个 rig 或指定 seat rig parked <seat@rig> # 带 rig 坐标自界定作用域 rig parked --rig <name> # 显式指定 rig 作用域 rig parked --json # 输出完整诊断 JSON参数细节(来自 parked.ts):
seat:seat 节点 id 或规范 session 名(name@rig);省略则诊断整个 rig。--rig <rig>:rig 作用域,默认取OPENRIG_SESSION_NAME中的 rig;seat 参数携带@rig时自我界定作用域。--json:输出完整诊断 JSON(包含活动性与义务两侧的置信度)。
输出形态(测试夹具 parked-verb.test.ts 中的样例):
dev50-qa@v-openrig-build: PARKED — idle-at-prompt with 1 open obligation(s) — a turn ended without a handoff activity: idle-at-prompt [decided by window-sampling; confidence oracle] obligations: 1 open, 1 held [destination=dev50-qa@v-openrig-build state=pending,in-progress,blocked limit=500; complete] - pending qitem-1 — review - HELD qitem-held — waiting [no recorded wake] Remedy: attach a live watchdog id, arm an atomic timer, or name a live blocker qitem; deferred/not-imminent work with a workspace home belongs in its mission/slice.2.3 诊断引擎:活动性 × 义务
诊断核心在 parked-query.ts 的diagnoseSeatParked:
- 义务面按
destination=<session> state=pending,in-progress,blocked limit=500读取,查询绝不擅自放宽作用域;HELD 行(state=blocked)逐条解析其唤醒记录(watchdog/timer/blocker),当wake.live === true且未被消费时才判定为 healthy。 - 判定式:
(idle-at-prompt OR needs-input pending) × (存在 open 义务 或 不健康 HELD 行)→ PARKED。 - 置信度三元:活动性
oracle | unknown,义务complete | truncation-possible | unavailable。截断只会少算义务,因此正向 PARKED 结论在截断下依然成立。 - 诚实性底线:活动性为 unknown 时绝不猜测 NOT-PARKED,返回
INDETERMINATE(创始人最怕的"未检测到卡死"被上移一级);rig 级诊断中只要存在 indeterminate seat 就不宣布 all-clear,见 diagnoseRigParked。
HTTP 入口为GET /api/activity/parked[?seat=],挂载在 activity 路由组内(activity.ts),不新增顶层挂载;需要 activity oracle、queue 仓库、rig 仓库三者齐备,缺失时返回parked_query_unconfigured教学式拒绝。CLI 侧若 daemon 不可达,会明确提示"parked 诊断必须实时派生自 oracle 与 queue——需要可达的 daemon"(parked.ts)。
2.4 测试验证
parked-verb.test.ts 验证了:动词已接入createProgram(基线上没有任何命令回答"are we parked?");rig 级渲染只输出"感兴趣的格子"(parked 与 indeterminate 的 seat,跳过正常工作的 seat);JSON 透传;以及不可达 daemon 时的诚实报错路径。
三、自愈式 wake 阶梯(wake ladder)+ 升级视图
3.1 机制
失败的 baton wake(交接唤醒)现在自主重试、聚合、升级:
- 转移即阶梯状态(transitions ARE the ladder state):阶梯不另存可变状态,而是以追加式转移记录为唯一事实源,因此重启安全(restart-safe)——这正是迁移 073 存在的原因。
- 按目的地聚合(per-destination aggregation):同一目标的多条失败唤醒被聚合成一条可观测记录。
- 阶梯级(rungs)"投递即推进"(deliver-and-advance):每级投递成功后自动进入下一级,无需人工推进。
- 未确认且无人领取(unconfirmed-with-no-pickup)则升级,且不重发(escalates without re-send):避免重复骚扰。
操作方式:把行交接出去后,只需观察rig view show escalations查看聚合结果,不必再追着 nudge 跑。
3.2 escalations 视图
内置视图escalations同时承载"已关闭的升级行"与"S01 wake 阶梯的开放聚合升级"(后者是 operator 阶梯的投递兜底),见 view.ts。可通过rig view <name>运行内置或自定义视图(view.ts)。
四、常驻卡死清扫(standing stuck-sweep):无需你再定时运行
0.5.5 之前,你需要定时手动运行queue overdue/queue undelivered。现在逾期 + 未投递自动变为带派生证据的路由化发现(routed findings),直接消费清扫结论即可,无需手跑定时器。
Caveat(列入 0.5.6 backlog):跨主机后继可见性(cross-host successor visibility)已被证明是一类误报来源——普查时有 39 条活跃发现(20 条已证实 FP,19 条未验证)。已做舰队级"每条件一条"(one-per-condition)收敛;在 0.5.6 检测器修复落地前,跨主机 lineage 的发现一律按未验证处理,该 delta 本身会向你教学这一 caveat。
五、queue block --on <blocker>:停靠即唤醒(park-with-wake)
5.1 语义
0.5.5 让"停靠(park)可以自带唤醒并且读作 HEALTHY"。queue block --on <blocker-qitem>记录唤醒;持活唤醒的 HELD 行不会被标记;自动解除停靠的 owner 会收到诚实唤醒。
适用范围:只用于"即将发生但被阻塞"的工作(imminent-but-blocked)。非即将发生的工作应放在 mission 工作区——队列是输送带(conveyor),不是仓库。
5.2 完整命令族(来自 queue.ts)
queue block <qitemId> --on <blocker> # 停靠为 HELD 并命名延续与唤醒 --on <blocker> 必填:活的 blocker qitem / 类型化门禁 / 人类 seat session --wake-watchdog <jobId> 附加一个指向停靠 owner 的在途 watchdog id --wake-after <duration> 与停靠原子性地武装一个定时器(如 90s、15m、2h)每一条刻意的 HELD 行都应命名它的延续与一个活的唤醒:
--wake-watchdog <jobId>:附加在途 watchdog id;--wake-after <duration>:与 park 原子性武装定时器(时长须为正整数,可带s/m/h后缀,解析见 queue.ts);--on qitem-…:一个活的 blocker 的解除即是唤醒。
配套还支持queue update --state blocked --blocked-on <blocker>(queue.ts),其中 blocker 可以是活的 qitem id、人类 seat(FR-6 park,需 summary + evidence_ref),或类型化非 qitem 门禁fold:<what>/auth:<what>/external:<what>;--wake-watchdog要求 watchdog 存在且存活并指向行 owner。对"blocked on 人类 seat"的 leg-1 停靠行,queue resolve会持久记录决策文本、解除停靠并 nudge owner,属于非闭包操作(queue.ts)。
rig parked的 HELD 检查也会读取这些唤醒证据:唤醒已触发但未被消费会显示FIRED but unconsumed(见 parked.ts 与 parked-query.ts 的wake?.unconsumed判定)。
六、rig ps新增类型化ACTIVITY列:单一 oracle
6.1 类型化分类法
rig ps从单一 oracle 获得真正的ACTIVITY列,类型化分类法为四态:
| 状态 | 含义 |
|---|---|
working | 正在工作 |
idle-at-prompt | 停在提示符等待 |
needs-input | 需要输入,以count + reason呈现 |
unknown | 无法判定 |
6.2 证据阶梯
- 证据阶梯(evidence ladder),自报(self-report)在最顶端,可见的级差劣化(visible rung degradation):状态来源分层,最上层是 agent 自报,下层是窗口采样等旁证;当高级别证据不可用时逐级降级,且劣化在输出中可见(
decided by nothing — unknown等字样)。 - 跨交换按 seat 键控(seat-keyed across swaps):即使 seat 发生过换人,活动性列仍归属同一 seat。
- TUI 读取同一事实:终端 UI 与
rig ps共用同一 oracle,避免"两张嘴"。
源码佐证:ps的活动性过滤--filter agentActivity.state=只允许running / needs_input / idle / unknown四值(ps.ts、ps.ts);节点行渲染格式含ACTIVITY列(ps.ts、ps.ts)。
用途:任何"它是在思考还是卡住了"的问题,oracle 都优于面板抓取(capture 只作为回退的一瞥)。
七、rig seat handover --source fork:|rebuild:从规划到执行
7.1 两种执行来源
0.5.5 将 seat 交接从 dry-run 规划升级为可执行路径:
--source fork:<id>:原生 fork 源会话,后继者从第一个字节起继承在任者的对话(live context)。--source rebuild:从持久化链重建,指名其 priming 产物(primed artifacts 列表 + 缺口列表),无历史时给出 empty-chain 原因。
7.2 完整参数
rig seat handover <seat@rig> --reason <reason> [--source fresh|fork:<id>|rebuild|discovered:<id>] --reason <reason> 交接原因(缺失时 daemon 会给出教学式指引,见 seat.ts 的 handover 共享动作) --operator <address> 发起交接的操作者 --dry-run 只规划、不改拓扑 --json 输出 JSON示例(来自 seat.ts):
rig seat handover spec-writer@openrig-pm --reason context-wall --dry-run rig seat handover spec-writer@openrig-pm --source rebuild --reason context-wall --dry-run --json rig seat handover spec-writer@openrig-pm --source fork:0b0165d7 --reason successor-test --operator orch-lead@openrig-pm --dry-run rig seat handover spec-writer@openrig-pm --source discovered:01H... --reason mvp-proof --json7.3 诚实性
- 交接中失败被如实记录(handover_result / handover_at 状态位,见 seat.ts)。
- 交接后按来源不同给出差异化的交接说明:fork 的上下文随原生会话传递,无需 packet 投递;rebuild 的 priming packet 会投递给后继者(seat.ts)。
- 交接动作由
rig seat handover与顶层rig handover共享同一 daemon 路由(seat.ts)。
适用场景:替换在任 occupant 时,不再只有 dry-run 规划面。
八、Slack 人类层端到端上线
8.1 能力全景
- Gateway 常驻运行;每 seat 一线程(thread-per-seat);
- 恰好一次入站对账(exactly-once inbound reconciliation):由
072_thread_seat_map表提供确定性路由,重复事件不会重复投递; - 升级响度与日常区分:升级类消息以 mention 形式(loud)到达,与例行消息(routine)区分;
- 人类是可寻址成员(addressable members):可直接作为 queue 目的地;
rig gateway human具备完整 fragment 生命周期动词:add/show/effective等(gateway.ts)。
8.2 单人类边界(honesty marker)
0.5.5 明确只发布单人类表面:rig gateway human add在第二个不同人类被添加前即拒绝(refused: a human is already configured (…) — 0.5.5 ships the SIMPLE SINGLE-HUMAN surface…,见 gateway.ts);若确有多个人类,可手写 fragment YAML(如实渲染并附 0.5.7 建议),多人类管理排在 0.5.7。
fragment 以"每人类一文件"存于gateway/humans/,fragment 是事实、registry 是生成式投影;operator 绝不手建 fragment YAML,动词负责 校验→原子写入(gateway.ts)。
8.3 直连升级
任何 agent 都能直接升级(escalate directly),无需经过 orchestrator 中转;升级类投递在目的地手机上以响铃方式到达。
九、新安装自动入职(self-onboarding)
全新安装默认获得聚焦的 onboarding 包(配置可关闭;既有 rig 不受影响)。当你要新搭 rig 或 seat 时,不再需要手工走完"八块内容"。
配置键为onboarding.default_pack.enabled(settings-store.ts),对应环境变量OPENRIG_ONBOARDING_DEFAULT_PACK_ENABLED,也可经配置文件onboarding.defaultPack.enabled控制(settings-store.ts、settings-store.ts);daemon 启动时依据该设置决定是否启用默认 onboarding 包解析(startup.ts)。
onboarding 叙事(getting-started-narrative.ts)强调"证据累积"原则:每一步留下 commits、文件、proof packet、截图的持久证据轨迹,信任来自反复成功的检查而非单张 proof packet。
十、Refocus 只在应当发生时触发
Refocus 现在只在上下文阈值处或按需触发——绝不在会话启动时触发;压缩后(post-compaction)两个运行时(Claude Code 与 Codex)都可触发,而用量阈值(usage threshold)仅 Claude 侧。新 seat 一启动就收到 refocus 现在是应上报的 bug,而不是可忽略的噪音。
适用场景:长会话丢失主线时主动触发它。
十一、一文件 scope 约定(One-File Scope Convention)
11.1 新脚手架
scope mission create→NOTES.md(链名)+ 承载 intent 的SPEC.md;scope slice create→仅SPEC.md(不再生成IMPLEMENTATION-PRD)+ 验收轨PROGRESS.md;- 发布类 mission 获得 capability-delta 脚手架。
源码佐证(scope.ts):slice create脚手架只写SPEC.md与PROGRESS.md(scope.ts);mission create写SPEC.md、mission.yaml、PROGRESS.md并铸入稳定点 ID,--no-notes可跳过NOTES.md(scope.ts);已有 README 支撑的旧节点永不重写(scope.ts、scope.ts)。
11.2repair变为纯追加
scope repair/approve只追加印章(stamps APPEND),绝不重写作者 frontmatter。由此:
- 印章剥离(strip-reconstruction)重新变成机械化操作——按顺序剥离追加的 stamp 层即可还原作者原文;
- 旧的"per-lock 作者重建协议"(每次锁定时手工重建 frontmatter)正式退役;
- 锁只绑定
SPEC.md(locks bind SPEC-only)。
十二、Daemon bind 意图带来源(provenance)
继承来的OPENRIG_HOST环境变量永远不会被当作"选择单 bind"的依据;收养(adoption)门禁会测试所有必需 listener,而不只是部分。
效果:在任意受管环境中做 daemon 维护都不再需要env -u仪式——来源不明的环境变量无法悄悄改变 bind 语义,既有的多 listener 拓扑不会因继承变量而被误降级为单 bind。
十三、必须停止的 5 个旧习惯
以下每一项在 0.5.4 之下都是正确的,在 0.5.5 下已不再正确:
- 停止 per-lock 作者重建协议。印章现在是追加式,剥离重建是机械操作(
scope repair/approve不再重写作者 frontmatter)。 - 停止用
claimedAt算术 + 面板抓取诊断 park。用rig parked获取带置信度与教学式 remedy 的派生诊断;capture 只作为回退的一瞥。 - 停止把延期工作存成 queue 行。queue 是"即将发生的顺序工作"的输送带;延期工作在 mission 工作区,到期再重新铸造。
- 停止在新工作上编写
IMPLEMENTATION-PRD.md与MISSION_NOTES.md。SPEC.md是唯一 spec 文件;NOTES.md是链名。 - 停止默认经 orchestrator 路由联系。任何 agent 直接升级;orchestrator/PM 也可发送"值得判断"的更新。
十四、已落地但尚不可驾驶(Landed, not yet drivable)
| 已落地表面 | 缺失的活门 | 当前诚实做法 |
|---|---|---|
| A–D 投递偏好 + 可用性(已存储、已校验) | 规则引擎(0.5.6 slice 01) | 用rig gateway human动词设置可用性;预期暂无路由效果 |
| S01 operator 阶梯 | 人类层 connector 投递腿(0.5.6 S11 领域) | 升级视图 + daemon 健康承担底线 |
直发路径上的@external地址 | 路由回落到 tmux(0.5.6 wave-2 修复) | 走 gateway 路径(queue/escalation)联系人类,不要用裸rig send |
| 多人类拓扑 | 单人类发布(诚实标记);多人类在 0.5.7 | 注册一个人;按此设计假设 |
十五、行为与兼容性
- 迁移:两条新迁移(
072、073),头从071前进到073。 - API 兼容:既有命令全部保留,新动词均为增量。
- Lineage:0.5.5 产品 delta 通过聚合补丁身份对账到已发布的 0.5.4 线上。
- 发布边界:打 tag、npm publish、主机安装、daemon 切换仍是四个相互独立的授权动作。
十六、已知限制(0.5.6 backlog)
- 跨主机卡死清扫误报:普查时 39 条活跃发现(20 条已证实 FP、19 条未验证);舰队级已收敛;检测器修复在 0.5.6 wave 1。
@external直发路由:0.5.6 wave-2 路由修复。- 投递偏好 → 规则引擎:0.5.6 slice 01。
延伸阅读
- CHANGELOG.md:
[0.5.5]完整条目(安装摘要、headline、"What you can now do"逐项说明)。 - docs/releases/v0.5.4.md:上一个诚实版(0.5.5 完整包含之)。
- 核心实现:parked.ts、parked-query.ts、queue.ts、seat.ts、gateway.ts、ps.ts、view.ts。
- 迁移源码:072_thread_seat_map.ts、073_queue_transition_wakes.ts。
- 测试参考:parked-verb.test.ts。
- 人工智能
- AI Agent
- 多智能体
- Agent 编排
- 代码智能体
- CLI
【免费下载链接】openrig
Multi-agent harness that runs Claude Code and Codex together as one system
相关推荐
OpenZeppelin Contracts 全自动发布流程解析:Changesets、release-vX.Y 分支与 release-cycle 工作流
OpenZeppelin Contracts 全自动发布流程解析:Changesets、release vX.Y 分支与 release cycle 工作流 O
区块链Web3RxDB 版本发布流程详解:从 pre-release 检查清单到自动化 Release 工作流
RxDB 版本发布流程详解:从 pre release 检查清单到自动化 Release 工作流 本文以仓库 orga/release checklist.md
数据库NoSQL嵌入式数据库实时数据库Mithril.js 自动化发布流程解析:基于 pr-release 的 main→release 分支工作流
Mithril.js 自动化发布流程解析:基于 pr release 的 main→release 分支工作流 Mithril.js(当前仓库 package.
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考