消耗的上限与外部观察¶
T1 完成后,M1 仍在等待 C1 的 CI,G1 仍在等待发布决定。预算还有余额,不代表应该反复调用模型;没有新消息,也不证明外部条件没有变化。本章把“是否行动”“何时再看”“谁去观察”与“何时改路”分开,再让它们共同支持一次可解释的等待。
先区分五种责任¶
| 问题 | 负责的事实或规则 | 不能替代的责任 |
|---|---|---|
| 当前可以推进哪项工作? | quota 与当前 interaction contract | 不授予额外外部权限 |
| 在观察什么,最近看到了什么? | Monitor 身份、目标与 observation metadata | 不凭空访问 CI 或创建运行进程 |
| 什么时候再看? | cadence、next due 与 scheduler/backoff | 不保证届时一定有可用 Host |
| 谁真正执行观察或唤醒? | 已接入且可用的 Host、运行器或事件通道 | 配置存在不证明运行健康 |
| 现有等待或路线是否值得继续? | frontier、Vision 与 replan policy | 不是简单缩短或拉长 cadence |
实际资源成本还有自己的来源:供应商账单、工具使用和机器时间。LoopX 的内部 quota 结算不能代替这些数据。一次合法 no-spend 观察仍可能有真实成本。
一个错误计数策略会怎样误导判断¶
以下是假设性的错误策略,不是声称当前实现仍有此缺陷:把“最近连续没有变化”只记在一个全局目标上,每次换目标就清零。
| 时间 | 到期工作 | 正确的工作项事实 | 假设的错误全局判断 |
|---|---|---|---|
| 10:30 | M1,cadence 30m | M1 第一次无变化 | 刚看到 M1 |
| 10:45 | M2,cadence 45m | M2 第一次无变化 | 换成 M2,清掉前一目标计数 |
| 11:00 | M1 | M1 第二次无变化 | 又换目标,重新计数 |
| 11:30 | M1、M2 各自到期 | 分别更新自己的观察 | 结果取决于处理顺序,而非目标真正停滞多久 |
错误不在阈值太高,而在于把不同目标的观察混成了一段历史。修正应保留每个 Monitor 自己的身份和计数,而不是不断降低阈值。相反,假如根本没有可用 Host 去执行 due observation,计数器再正确也只是一份静态记录:这是执行活性缺口,不是 no-change。
等 CI 时,观察频率怎样选择¶
| 方案 | 适合的条件 | 成本与限制 |
|---|---|---|
| 人工回来查看 | 低频、短期、允许较长延迟 | 依赖人的注意力,要保留接手信息 |
| 固定 cadence | 变化节奏可预计 | 长时间等待会产生重复观察 |
| 有上限的退避 | 长时间无变化 | 减少重复读取,但增加发现变化的延迟 |
| 真实事件通道加必要核验 | 已有可用通知和身份绑定 | 收到事件仍须核对目标、revision 和当前状态 |
M1 与 G1 不要求同一种动作。CI 需要外部结果读回,发布决定需要有权决定的人;不能以一次 CI passed 替代批准,也不应把用户待决定当成所有独立工作的全局冻结。
| M1 的实际观察 | 可保存的事实 | 合法后续 |
|---|---|---|
| C1 的 CI pending,结果未变 | 有来源与时间的无变化观察 | 更新观察状态,按当前策略等待 |
| C1 的 CI passed | 绑定 C1 的新证据 | 重新检查 T3,包括 G1 |
| 当前代码已是 C2 | 旧绿色结果只支持 C1 | 获取适用于 C2 的验证,不删除 C1 历史 |
| 读取失败或无权访问 | 无法确认当前 CI | 报告读取缺口,不记成 unchanged 或 passed |
Monitor 保存调用者完成的观察。本身不访问 CI,next_due_at 也不创建一个执行进程。等待健康需要目标、观察规则和实际执行面同时存在。
预算参与准入,但不独自授权¶
正常交付仍受预算限制:当前窗口 spent_slots >= allowed_slots 时会进入相应 throttling。余额不足不能通过换 Todo 或把交付叫作观察绕过;余额充足也不能绕过 Gate、当前身份、能力、工作区和依赖。
读取最终 contract,至少区分“允许交付”“需要恢复或修复”“观察”“等待”与“要求决定”。身份不明时拒绝交付资格,不等于整个诊断过程不消耗任何资源。quota should-run --codex-app 的相关准入路径可能创建 heartbeat receipt,不应当作无副作用的循环查询。现场读取见附录。
内部记账回答已接受的工作如何归因;scheduler cadence change、Gate 通知、dry-run、未变化的 poll、重复写回不能冒充新的 delivery spend。不要用“无费轮次”描述 no-spend,否则会掩盖观察本身的资源成本。
登记等待之后,谁可以继续?¶
T1 发现真实依赖时,等待需要有具体对象,例如 monitor_changed:<todo_id> 或 todo_done:<todo_id>。保留验收器、原工作身份和依赖关系,不能通过把 Todo 草率标 done 消除当前阻塞。
工作图中存在独立 T2,并不意味着已绑定 T1 的当前 Turn 可以直接改绑。应先完成原 Turn 按其合同要求的等待写回和收口,再由后续准入选择新工作。Turn 收口、Todo 等待与下轮选择是三件事。
Turn 章的等待时序用主线 f49b4a00… 的明确测试解释这条路径,并标注了它不属于旧发布版承诺。它验证不重复扣减、不强迫执行 Monitor poll、原 Todo 的等待和验证声明仍保留;不是一条适用于所有 Host 的全局调度顺序。
Cadence backoff 与路线重规划¶
Backoff 问的是“相同条件下,多久以后再观察”。它从已仲裁的 decision 和运行 profile 派生调度建议,并按对应 scheduler state 的 identity / reset_token 保持或重置退避。具体间隔、上限与 unchanged limit 应读取当前 profile,而不是把一组示例数值当作所有 Host 的共同协议。
如果没有事件通道,外部变化只能在下一次真实观察后被发现。reset 可以改变后续间隔,但不会追回已经等待的时间。Host apply 成功或已经匹配目标 cadence 后,才按绑定 ACK 路径确认;失败或超时要记录对应失败,不能伪造 ACK。详见调度入口。
Replan 问的是“继续等待是否仍符合目标,是否有更好的下一步”。当前 Monitor 策略会结合当前 Agent 的可选 advancement、Monitor 类型和无变化历史判断,不能只看一个计数。
| 当前输入 | 受对应测试支持的判断 |
|---|---|
| 当前 Agent 没有可选 advancement,符合条件的普通 monitor-only lane 已达阈值 | 可能形成 monitor_no_change_streak replan obligation |
| 当前 Agent 自己有可选 advancement | 相关测试中优先选择工作,不产生该 Monitor 派生的 obligation |
| 只有 peer 有工作 | 不以 peer 的进展抹掉当前 Agent 的停滞 |
Monitor 明确为 watch_only |
相关测试中即使计数很大,也不因此触发这项 replan |
策略测试中的阈值为 5。这是被测策略,不是所有等待必须改路的普遍定理。测试预置计数后检查 decision;它不证明真实交错 poll、并发计数写入或真实 Host 唤醒。更完整的预测练习见Monitor 检查。
因此,replan 不是“更强的 backoff”。一次可以改变观察频率,另一次需要重新判断路线并形成当前协议认可的结果;仅写“重新想过了”不能替代所需的变化或明确终止依据。
怎样定义一项可解释的观察¶
创建或修改 Monitor 前,确定稳定 target、可用观察句柄、cadence/next due、相关变化判据、观察边界和无变化的记录方式。
当前 metadata 合同允许 expires_at、resume_when 或显式 watch_only=true 作为 boundedness 的选择。expiry 与 due 不是同一个字段:前者约束何时结束,后者安排下一次观察;没有 expiry 不能直接推导 Monitor 非法。
变化判断必须与任务有关。服务响应中的无关时间戳变化不一定意味着验收前提改变;相同文本也不一定是同一 revision。把验证对象和解释保留在证据中,不把每次取回的原始响应无限塞进热路径。
monitor_metadata.ts处理观察元数据和重放。领域观察由调用者提供,受控写入负责验证和记录;不同 Monitor 的计数不能因别的 lane 刚运行而互相覆盖。已有 canonical observation/successor 事务的原子边界见状态机专题,不能把它扩展成“网络读取、结算和所有显示一起原子完成”。
故障时先定位缺哪一环¶
| 现象 | 先取证 | 后续与停止条件 |
|---|---|---|
| 没有消息 | due、真实 Host 状态、最近成功观察 | 无 Host 就报告执行缺口,不宣称外部无变化 |
| 持续重复观察 | 目标身份、fingerprint、各自计数与 cadence | 修负责该层的策略;不调低所有阈值碰运气 |
| 已有新证据却没推进 | 证据 revision、当前 Gate、依赖和准入 | 条件不足继续等待;不要只改显示状态 |
| 经常要求 replan | 当前 lane、可选工作、watch-only 与 ACK 结果 | 提交实际认可的 replan 结果;不伪造一次 ACK |
| 观察已经提交但显示仍旧 | 原操作回执、当前源与投影 | 恢复投影,不再次提交相同业务变化 |
观察频率越高,读取成本通常越高;退避越长,发现延迟可能越大。等待策略的好坏应由任务对延迟、资源和人工介入的要求判断,不以轮次数或通知数量衡量。
本章的完成标准是:能说明在等什么、谁来观察、何时再看、哪一种变化会改变下一步,以及这份等待是否还有实际运行条件。需要操作时回到Host 章节或CLI 路径,需要诊断时使用附录。