OmX Runtime 权威语义契约:Authority 租约、Backlog、Replay 与 Readiness 的 Rust 侧真相源

发布时间:2026/9/10 13:07:44

OmX Runtime 权威语义契约:Authority 租约、Backlog、Replay 与 Readiness 的 Rust 侧真相源 OmX Runtime 权威语义契约Authority 租约、Backlog、Replay 与 Readiness 的 Rust 侧真相源【免费下载链接】oh-my-codexOmX - Oh My codeX: Your codex is not alone. Add hooks, agent teams, HUDs, and so much more.项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-codex导读本篇文章以 docs/contracts/runtime-authority-backlog-replay-readiness.md 为核心骨架系统梳理 OmXOh My codeX中由 Rust 完全持有的运行时语义契约。该契约取代了历史 JS 侧的运行时真相从同一时刻至多一个权威租约的 Authority 状态机到 Backlog 的四态流转、基于游标的持久化 Replay 恢复再到由derive_readiness()唯一产出的 Readiness 快照以及WorkerCli驱动的派发分类策略。读完本文你将掌握这套运行时契约的每一个状态转换规则、对应的源码实现与集成测试位置并能在实际运维中精确解释为何 recovery 被暂停这类诊断问题。背景为什么运行时真相必须由 Rust 持有OmX 是一个给 codex 注入 hooks、Agent 团队、HUD 等能力的工具其运行时涉及多进程协作leader、worker、tmux pane。在多进程、可能崩溃重启的场景下运行时状态必须有一个权威、可持久化、可重放的真相源而不是由某个 CLI 在读取时刻推断出来的临时观点。从仓库结构看crates/omx-runtime-coreCargo.toml承载了这套纯 Rust 的状态机实现crates/omx-runtimesrc/main.rs则把它暴露成可被外部进程调用的 CLI 接口。文档开头一句 This document captures the Rust-owned runtime semantics that replace JS-side truth 点明了设计动机运行时语义的权威性从 JS 迁移到 Rust 侧JS 侧team / doctor / HUD 等只能读取由 Rust 产出的快照而不是自行推断。Authority同一时刻至多一个活动租约租约的三元组文档定义运行时任意时刻最多持有一个活动 authority lease权威租约租约由三个字段构成字段含义owner持有租约的所有者标识如 worker 名lease_id租约唯一标识leased_until租约到期时间ISO 8601 字符串此外源码在 authority.rs 中还额外维护了stale: bool与stale_reason: OptionString用于标记过期/失效状态及原因——这正是 Readiness 判断是否可用的关键输入之一。状态机三个转换方法AuthorityLeasecrates/omx-runtime-core/src/authority.rs实现了一个严谨的租约状态机仅允许三种转换1.acquire(owner, lease_id, leased_until)—— 获取租约成功条件当前无人持有租约或请求者已经是当前 owner可视为续租式重获失败条件租约被其他 owner 持有返回AuthorityError::AlreadyHeldByOther { current_owner }。实现上authority.rsacquire 会顺带把stale与stale_reason清空。2.renew(owner, lease_id, leased_until)—— 续租成功条件当前租约确实由同一 owner 持有失败条件无人持有 →NotHeldowner 不一致 →OwnerMismatch { current_owner }。源码authority.rs通过match self.owner精确区分这两种错误。3.force_release()—— 无条件释放清空全部租约字段包括 stale 状态authority.rs用于兜底回收。文档补充的硬性约束A stale or expired lease must be marked stale before another owner is granted authority.即租约过期或失效后必须先被mark_stale(reason)标记为 stale才允许其他 owner 获得权威。mark_stale/clear_stale/is_stale/is_held/current_owner等辅助方法在 authority.rs 中均有实现to_snapshot()则将内部状态投影为可序列化的AuthoritySnapshot定义于 lib.rs。测试证据authority.rs 内置了完整测试acquire_and_renew_happy_pathacquire 后is_held()为 true同 owner renew 成功acquire_fails_if_held_by_otherworker-2 尝试获取 worker-1 的租约 →AlreadyHeldByOtheracquire_succeeds_for_same_owner同 owner 二次 acquire 放行renew_fails_if_not_held/renew_fails_if_owner_mismatch分别验证NotHeld与OwnerMismatchforce_release_clears_everything强制释放后is_held()与is_stale()均为 false。Backlog派发工作的四态生命周期状态迁移规则文档给出 Backlog 的严格流转路径pending ──notification── notified ──completion── delivered └───────────── failed新工作以pending入队通知notification把工作从pending移到notified完成completion把工作从notified移到delivered或failedpending/notified/delivered/failed是运行时快照中的四个计数见 BacklogSnapshot。DispatchLog 与 DispatchRecordDispatchLogcrates/omx-runtime-core/src/dispatch.rs逐条跟踪DispatchRecord每条记录携带字段说明request_id派发请求唯一 IDtarget目标如 worker / panestatusPending/Notified/Delivered/Failedcreated_at/notified_at/delivered_at/failed_at各阶段时间戳ISO 8601reason失败或通知通道等补充原因metadata可选附加元数据serde_json::ValueDispatchStatus枚举dispatch.rs以snake_case序列化Display输出pending/notified/delivered/failed。非法转换被强制拒绝文档强调非法转换如pending - delivered必须返回DispatchError::InvalidTransition。源码中每个mark_*方法都做了前置校验queue(request_id, target, metadata)空request_id→InvalidRequestId重复 ID →DuplicateRequestId入队即Pendingdispatch.rsmark_notified(request_id, channel)仅允许Pending - Notified并把channel记入reasondispatch.rsmark_delivered(request_id)仅允许Notified - Delivereddispatch.rsmark_failed(request_id, reason)允许从Pending或Notified两态失败——源码注释明确Allow failed from both Pending (target resolution failure) and Notified (delivery failure)与历史 TS 行为保持一致dispatch.rs。DispatchError的四个变体DuplicateRequestId/InvalidRequestId/NotFound/InvalidTransition及其 Display 文案见 dispatch.rs。快照与清理to_backlog_snapshot()遍历记录按状态累加pending/notified/delivered/failed四个计数dispatch.rsprune_terminal_records()移除已到达Delivered/Failed终态的记录dispatch.rs配合引擎层compact()控制事件日志与记录规模。测试方面dispatch.rs 覆盖了 happy path、Pending - Failed、InvalidTransition、NotFound、快照计数、剪枝、带 metadata 的序列化往返、终态后重复 ID 仍被拒绝等场景。Replay / Recovery游标式、持久化、去重ReplayState 三要素ReplayStatecrates/omx-runtime-core/src/replay.rs把恢复语义浓缩为三部分游标cursorrequest_replay(cursor)记录当前重放位置去重dedup内部用HashSetString按event_id去重——record_event(event_id)返回true表示新事件false表示已见过replay.rs延迟的 leader 通知defer_leader_notification()/clear_deferred()显式标记是否故意推迟对 leader 的通知让观察者能分辨为什么投递结果还没浮出水面。ReplaySnapshotlib.rs对外暴露cursor、pending_events、last_replayed_event_id、deferred_leader_notification四个可序列化字段。引擎层的重放实现文档的cursor-based and durable落实到 engine.rs持久化persist()在独占锁engine.lock保护下写入snapshot.json、events.json、dispatch.json、mailbox.json以及专门记录已见派发 ID的dispatch-seen.json账本engine.rs重放load()读取events.json后逐个事件调用replay_event()重建全部状态engine.rs严格性重复或乱序的派发历史会被replay_event拒绝而不是被静默修复——对应集成测试load_rejects_duplicate_and_out_of_order_legacy_dispatch_eventsengine.rs验证了重复 ID 报duplicate dispatch request id、乱序投递报dispatch record not found永久账本dispatch-seen.json采用 schema_version2、ledger_epoch1 的格式engine.rs保证已被 compact 或移除的派发 ID 在重载后依然永久保留、不可复用测试见 engine.rs。文档所说Replayed items must be deduplicated在派发维度上由此账本兜底而ReplayState的HashSet则负责事件维度的去重。Readiness由 Rust 产出的快照而非 CLI 推断核心结论文档强调三点Readiness 是Rust 侧产出的快照RuntimeSnapshot.readiness不是 CLI 的临时观点租约缺失、stale 或非法时运行时不 ready快照必须携带精确的阻塞原因exact blockers让运维者能直接看到为什么 recovery 被暂停。derive_readiness() 的计算逻辑derive_readiness()engine.rs基于AuthorityLease、DispatchLog、ReplayState三个输入计算ReadinessSnapshot只会在同时满足以下条件时返回ReadinessSnapshot::ready()权威租约被持有且非 stale没有 pending 的 replay 事件。所有阻塞原因被逐条收集进readiness.reasonsVecString阻塞条件写入的 reason 文案租约未被持有authority lease not acquired租约被标记 staleauthority lease is stale: {stale_reason}存在待重放事件replay has {n} pending eventsReadinessSnapshot结构ready: boolreasons: VecString定义于 lib.rs默认值为blocked(authority lease not acquired)——即全新运行时天然处于未就绪状态直到租约被成功获取。快照的默认行为与测试佐证lib.rs 的snapshot_defaults_to_blocked_state断言新建RuntimeSnapshot的ready()为 falsereasons恰为[authority lease not acquired]engine.rs 的snapshot_shows_blocked_without_authority验证同一结论derive_readiness_stale_authorityengine.rs验证 stale 租约下ready false且 reason 含staleprocess_acquire_authorityengine.rs验证成功 acquire 后快照ready()为 true。兼容视图喂给旧 TS 读者的只读快照为了不破坏 legacy TS 侧team / doctor / HUD读取习惯write_compatibility_view()engine.rs会把RuntimeSnapshot拆分成authority.json、backlog.json、readiness.json、replay.json、dispatch.json、mailbox.json等独立文件。测试compatibility_view_writes_section_filesengine.rs验证了这些文件均存在且内容合法——这就是Rust-authored snapshot如何成为 JS 读者唯一可信来源的落地方式。Dispatch 分类提交策略与结果判定WorkerCli 提交策略文档规则WorkerCli决定提交按键次数——Claude 按 1 次Codex/其他按 2 次。源码实现于 lib.rsWorkerCli::from_label(label)按小写去空白匹配claude/codex其余归入Other(String)submit_presses_for_worker_cli()Claude 1Codex | Other(_) 2测试worker_cli_submit_policy_matches_current_dispatch_behaviorlib.rs验证三种分支。结果分类DispatchOutcomeReason 与 QueueTransitionDispatchOutcomeReason枚举lib.rs统一了派发结果语义覆盖确认送达、延迟与失败三类送达确认DeliveredConfirmed、DeliveredConfirmedActiveTask在活跃任务上确认送达送达未确认DeliveredUnconfirmed延迟DeferredLeaderPaneMissingleader pane 缺失、DeferredShellNotInjectable失败FailedMissingTarget、FailedTargetResolution(reason)、FailedPreflight(reason)、FailedSend(reason)。QueueTransitionlib.rs把结果映射为对 Backlog 的三类动作KeepPending/MarkNotified/MarkFailed每个都携带reason。classify_dispatch_outcome() 的判定顺序classify_dispatch_outcome(target_present, target_resolved, preflight_ok, send_ok, confirmed, active_task, retry_remaining)lib.rs按优先级逐级短路目标 pane 缺失 →MarkFailed(FailedMissingTarget)目标无法解析 →MarkFailed(FailedTargetResolution)预检失败 →MarkFailed(FailedPreflight)发送失败 →MarkFailed(FailedSend)发送成功且已确认 →MarkNotified活跃任务则用DeliveredConfirmedActiveTask发送成功但未确认仍有重试机会retry_remaining→KeepPending(DeliveredUnconfirmed)保持 pending 等待重试重试用尽 →MarkFailed(DeliveredUnconfirmed)。与文档语义的对应文档最后的三个要点在此被源码精确承接Deferred leader-missing cases stay pendingDeferredLeaderPaneMissing场景由ReplayState.deferred_leader_notification显式跟踪且派发记录保持 pending运行时可在 pane 可用时重试Unconfirmed sends can stay pending while retries remain即classify_dispatch_outcome的第 6 步retry_remaining true时回到 pendingotherwise they fail with an unconfirmed reason重试耗尽后以DeliveredUnconfirmed落入 failed。对应测试dispatch_outcome_classification_distinguishes_confirmation_and_retry_pathslib.rs把四条路径confirmed / active_task / unconfirmed_retry / unconfirmed_failed全部断言了一遍。实操通过 omx-runtime CLI 观察运行时语义crates/omx-runtime是一个可直接运行的二进制入口 src/main.rs把上述契约暴露为子命令。其行为被 tests/execution.rs 以集成测试形式锁定查看契约摘要omx-runtime schema # 输出形如runtime-schema1 / commands... / events... / transporttmux / queue-transitionnotified omx-runtime schema --json # 输出 JSON含 schema_version、commands、events查看运行时快照omx-runtime snapshot # 未获取租约时authorityownernone ... readinessblocked(authority lease not acquired) omx-runtime snapshot --json omx-runtime snapshot --state-dirdir # 从持久化状态目录加载后出快照集成测试snapshot_json_subcommand_prints_valid_jsonexecution.rs断言快照 JSON 必然包含authority/backlog/replay/readiness四个对象且初始readiness.ready为 false。执行命令驱动状态机omx-runtime exec {command:AcquireAuthority,owner:worker-1,lease_id:lease-1,leased_until:2026-09-10T00:00:00Z} --state-dirdir omx-runtime exec {command:QueueDispatch,request_id:req-1,target:worker-2,metadata:null} --state-dirdir omx-runtime exec {command:MarkNotified,request_id:req-1,channel:tmux} --state-dirdir omx-runtime exec {command:MarkDelivered,request_id:req-1} --state-dirdir --compactexec会加独占锁runtime-mutation.lock、执行命令、可选--compact清理终态事件并持久化主快照与兼容视图文件。命令全集见RUNTIME_COMMAND_NAMESlib.rsacquire-authority、renew-authority、queue-dispatch、mark-notified、mark-delivered、mark-failed、remove-dispatch-records、request-replay、capture-snapshot及 mailbox 相关命令。初始化与 mux 契约检查omx-runtime init state-dir omx-runtime mux-contract # 输出 adapter-status / submit-policy / confirmation 等小结一套闭环的运行时一致性契约把五个部分串起来可以看到 OmX 的运行时一致性设计闭环Authorityauthority.rs保证同一时刻只有一个权威持有者过期必须显式 staleBacklogdispatch.rs用强制的状态转换保证派发记录永远可解释非法跳转直接报错Replayreplay.rs engine.rs以游标 去重 持久化事件日志支撑崩溃恢复并以dispatch-seen.json账本保证 ID 永久唯一Readinessengine.rs把前三者的健康度汇总成带精确 blockers 的官方快照Dispatch 分类lib.rs把发送结果严格映射回 Backlog 状态让未确认与延迟场景都可重试、可观测。对于任何需要在 OmX 上排查运行时为何不就绪派发为何卡在 pending的开发者这份契约docs/contracts/runtime-authority-backlog-replay-readiness.md加上上述源码路径就是最权威的排查起点。【免费下载链接】oh-my-codexOmX - Oh My codeX: Your codex is not alone. Add hooks, agent teams, HUDs, and so much more.项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-codex创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 13:07:44

Python基础语法与核心特性全解析

1. Python基础语法概述 Python作为当下最流行的编程语言之一,以其简洁优雅的语法和强大的功能库著称。我最初接触Python时,最让我惊喜的就是它近乎伪代码的语法设计——用最少的代码表达最清晰的逻辑。比如经典的"Hello World"在其他语言中可…

2026/9/10 14:07:55

保密技术专业毕设选题:信息安全与加密技术实践

1. 保密技术专业毕设选题方向解析作为保密技术专业的核心方向,信息安全领域每年都会涌现出大量具有研究价值的课题。对于2026届毕业生而言,选择既符合专业要求又具备创新性的毕设题目尤为关键。从当前技术发展趋势来看,文件加密、信息隐藏和隐…

2026/9/10 14:07:55

ADB设备无法识别问题排查与解决方案

1. 问题现象与背景解析 当我们在小众机型或特殊设备上使用 adb devices 命令时,终端只显示 List of devices attached 而没有实际设备列表,这种情况在维修店和开发者社区每月能收到上百例咨询。上周就有位用户在Redmi Note 11T Pro上调试时遇到此问题…

2026/9/10 14:07:55

Python机器学习入门:从基础到实战的完整指南

1. 为什么选择Python开启机器学习之旅 刚接触机器学习的新手常会陷入工具选择的困境。我2015年刚开始学习时,曾在R和Python之间犹豫不决。直到参与了一个电商用户行为分析项目后,才真正理解Python在机器学习领域的独特优势: 语法友好性 &am…

2026/9/10 14:07:55

激光雷达外参标定工具包实战:从lidar_calibration到可靠结果

简介:这份资源面向使用ROS进行激光雷达开发的技术人员,用于解决单激光雷达安装外参的自标定问题。程序基于ROS平台实现,覆盖点云滤波、设置ROI、地平面分割、计算变换矩阵、系统评价、参数输出与最优输出等完整流程,并自带标定效果…

2026/9/10 14:07:55

工业无损检测技术解析与湖北地区应用实践

1. 工业设备无损检测的核心价值与行业现状在工业生产领域,设备长期运行带来的金属疲劳、腐蚀和结构损伤就像人体器官的慢性疾病,初期症状不明显却可能引发灾难性后果。2021年某化工厂压力容器爆裂事故的直接原因,就是未及时发现焊缝处的应力腐…

2026/9/10 14:02:55

JavaScript高级特性:原型链、闭包与内存优化实战

1. JavaScript 学习文档(五)概述作为前端开发的核心语言,JavaScript 的学习曲线往往呈现出"入门容易精通难"的特点。这个系列文档已经进行到第五部分,意味着读者已经掌握了基础语法和简单应用,现在需要向更深…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码