context-infra 检查与复盘infra.guiming.net · 全内容自包含呈现 · 生成于 2026-07-21 16:28 UTC

workflow_manage_unexpected

Z3 全文↑ Z2 条目

道-方法 · 道层 skill 全文

← 返回道层 skill 索引 · 返回方法论区

本页是 <code>rules/skills/drafts/workflow_manage_unexpected.md</code> 的逐字投影(仅隐私清洗,零改写)。

时点提示:本页是仓内文件 rules/skills/drafts/workflow_manage_unexpected.md 的逐字投影(仅做隐私清洗:仓库根绝对路径→相对路径、家目录→~/;除此零改写)。若源文件后续有修订,以仓内真源为准。

遇阻处理与防过早终止判断(道 skill,draft)

元数据

目标(一句话)

遇阻时 agent 有两个相反的失败方向:一边是把外部约束当终止条件、过早写 blocked 当合规汇报(该继续没继续),另一边是无意义硬撞同一堵墙、循环烧 context(该停没停)。这个 skill 给的判断是:遇阻后按动作阶梯逐级试,只有阶梯走到底、每级都留下试过的证据,才允许精确 block;以及怎么用一个确定性检测器 + 第二 agent 判一个 block 是合法到墙还是过早放弃

它是 workflow_controller_loop 里「诚实汇报不是停止策略」那一段的独立可路由形态。判断逻辑的真源放在这里,controller loop 指过来,不在两处各写一份。

边界(不做什么)

遇阻时的动作阶梯(核心判断,逐级试)

撞到障碍时,先把它转成「下一个可执行动作」,按下面阶梯逐级尝试,能走通就走、走不通才下探一级。每一级都要记下试了什么、结果如何。

  1. 换路径:同一目标有没有别的实现路径 / 工具 / 入口。原路被堵不等于目标被堵。(例:一个命令被权限挡,换只读探针先确认状态;一个 MCP 源不在本仓,换本地等价数据。)
  2. 移资源进可控范围:缺的东西能不能搬进手够得到的地方。缺文件就生成 / 拷贝到可写位置,缺数据就先抓取,缺依赖就装到本单元的隔离环境。
  3. 降级范围:完整版做不了,有没有一个更窄但真实的切片能做完并被下游消费。bounded 的真东西好过 0。(这是 PROMOTE-ONE 的同一条逻辑。)
  4. proposal / no-mutation:连降级版都要等外部条件,那就产出 proposal-only 或 adhoc/no-mutation 的产物(写出方案、待授权清单、可复跑脚本),把球推到「只差一次授权」的位置,而不是停在「做不了」。
  5. 精确 block:只有上面四级全部走不通,才进入 await_user / block,且必须举证——逐级写清试过的动作和为什么这一级也死。blocked 是穷举之后的结论,不是遇阻的第一反应。

判断口诀:blocked 要可证伪。一个合法的 block 必须能回答「你换了哪些路径、搬了什么资源、降级到什么程度、为什么 proposal 也不行」;答不上来,就是过早放弃,不是到墙了。

合法 block 的验收标准(可测,附 receipt 结构)

声明 block 时落一份 block receipt,让「合不合法」可被第二方机械核对。结构:

{
  "task_id": "T648",
  "blocking_constraint": "一句话说清被什么挡住(权限 / 缺数据 / 外部系统 / 破坏性风险 / 用户明确停止)",
  "constraint_class": "permission | missing_data | external_system | destructive_risk | credential | user_stop",
  "tried_actions": [
    {"ladder_step": "alt_path",        "action": "试了什么", "outcome": "结果(含报错原文 / exit code)"},
    {"ladder_step": "move_resource",   "action": "...",      "outcome": "..."},
    {"ladder_step": "downgrade_scope", "action": "...",      "outcome": "..."},
    {"ladder_step": "proposal_only",   "action": "...",      "outcome": "..."}
  ],
  "why_all_paths_dead": "为什么四级都走不通,逐级对应",
  "requested_unblock": "需要谁做什么这一步才能解(具体到一条命令 / 一次授权)"
}

合法 block 的判据,逐条:

四条全过 = 合法 block,停得对。任一不过 = 过早 block,应回到阶梯继续。

共生检测器:premature_block(确定层误差信号)

光有上面的判断纪律不够——纪律是语义层,没有机械完成信号就会在注意力一变时漂回「遇阻即 blocked」。所以本 skill 同一工作单元里配一个确定性检测器,给「这次 block 合不合法」一个可操作、由第二方判定的误差信号。它遵循 workflow_complexity_drift_detection 的 V1–V6 有效性标准(行为轴的一个失败模式实例):

方法论建议(可按情况调整)

已知陷阱(来自真实案例)

运行事故的死法签名鉴别与恢复(Run3 实战沉淀,2026-07-03)

适用:无人值守/长运行编排中 worker、lane 或后台任务成批死亡时,先鉴别死法再选恢复路径。来源:buildout Run3 24h 内四类真实事故(编年史 adhoc_jobs/context_infra_base_tooling_buildout_20260615/Run3/logs/dispatch_log.md),每类都发生过至少一次误诊,鉴别表就是从误诊里提炼的。

先鉴别,后处置。 三次实例中两次初判错误(内存事故初判时把 harness 收割因素混入;两个脚本 bug 失败被误当配额拒绝)。误诊选错恢复路径的代价远高于花两分钟取证。取证三件:死亡时间分布、日志尾部遗言、当时资源水位。

死法签名特征恢复路径
配额耗尽各 lane 在各自下一个 turn 边界逐个倒下(时间错开分钟级);日志尾有明确遗言 turn.failed+usage limit;退出码 1断点等待:全部可 resume,不重跑;等窗口(滚动窗恢复是滴灌,见多 provider skill);探针确认再复活
系统资源(磁盘/内存)ENOSPC=退出码 101 或工具自身报 no space;OOM=静默死亡无遗言、同一窗口内秒差成批;死前资源水位异常(swap 见底/df 0G)先释放资源再复活;磁盘"满"先查 APFS 快照扣留(见下);内存超订先降并发再补位
harness 后台任务收割同一秒批量 killed;日志戛然而止无任何错误事件;死时资源健康与资源/配额无关,重启即可;根治=把长命进程迁出 harness 任务生命周期(非沙箱 tmux/独立进程组),巡检用 Monitor 类任务
脚本/工具自身 bug秒败且目标日志零新增;task output 里有 shell 报错先读失败任务自己的 stderr/output 再怪环境(实例:bash 3.2 不支持 declare -A,两个域的"配额失败"实为脚本炸在第 8 行)

配套经验:

输出规格

跨域根与联系


← 返回道层 skill 索引 · 返回方法论区