news 2026/9/30 6:48:38

OpenRig v0.5.5 环境感知版(Ambient-Attention Release)深度解析:让工作流自动发现、重试、升级与自愈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenRig v0.5.5 环境感知版(Ambient-Attention Release)深度解析:让工作流自动发现、重试、升级与自愈
  • 人工智能
  • AI Agent
  • 多智能体
  • Agent 编排
  • 代码智能体
  • CLI

【免费下载链接】openrig

Multi-agent harness that runs Claude Code and Codex together as one system

项目地址:https://gitcode.com/GitHub_Trending/op/openrig
点击查看免费下载

导读

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 --json

7.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 下已不再正确:

  1. 停止 per-lock 作者重建协议。印章现在是追加式,剥离重建是机械操作(scope repair/approve不再重写作者 frontmatter)。
  2. 停止用claimedAt算术 + 面板抓取诊断 park。用rig parked获取带置信度与教学式 remedy 的派生诊断;capture 只作为回退的一瞥。
  3. 停止把延期工作存成 queue 行。queue 是"即将发生的顺序工作"的输送带;延期工作在 mission 工作区,到期再重新铸造。
  4. 停止在新工作上编写IMPLEMENTATION-PRD.md与MISSION_NOTES.md。SPEC.md是唯一 spec 文件;NOTES.md是链名。
  5. 停止默认经 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

项目地址:https://gitcode.com/GitHub_Trending/op/openrig
点击查看免费下载
上一篇:VisualDL Trace视图完整指南:程序执行路径的可视化分析
下一篇:革命性轮腿机器人FOC:机械结构设计全解析,SolidWorks模型免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!