workflow_orchestrator_mode
道-方法 · 道层 skill 全文
本页是 <code>rules/skills/drafts/workflow_orchestrator_mode.md</code> 的逐字投影(仅隐私清洗,零改写)。
时点提示:本页是仓内文件 rules/skills/drafts/workflow_orchestrator_mode.md 的逐字投影(仅做隐私清洗:仓库根绝对路径→相对路径、家目录→~/;除此零改写)。若源文件后续有修订,以仓内真源为准。
报告元数据(frontmatter)
name: workflow_orchestrator_mode
status: draft (Beta) — 2026-06-15 起草(OD 域);晋级前需在 ≥1 个真实长复杂任务上跑通"派 worker→检测产物→据剩余推进"端到端,过 landing_gate。**晋级证据已到位(2026-07-03,待人工确认+landing_gate)**:buildout Run3 以本模式(主协调只编排+13 个域编排 lane)真实跑通 22h campaign,13/13 域关闭(CAMPAIGN_CLOSED_BOUNDED,真源 Run3/reports/CAMPAIGN_REPORT.md);并行运行硬规则已沉淀进本文「多编排者并行运行硬规则」节
description: 纯编排器模式(道)。把一个长而复杂的需求交给主 Agent 时,让主 Agent 退化成只排 phase 的机器——观察状态 → 派独立 worker session(Codex/OpenCode/CC)→ 检测产物是否真完成 → 据剩余持续推进,绝不亲自实现。触发场景:用户说『用编排器模式 / 派 session 跑这个 / 把这个复杂需求拆开派出去做 / 一直推进直到做完』、或一个需求长到主 Agent 会被吸进实现细节而非安排 phase。配套术命令 `orchestrate`。
consumer: orchestrator纯编排器模式:主 Agent 只排 phase、只派发、只检测、只推进
道 skill。结果确定性优先;实现交 worker session;工具按名引用(路径查 tools/INDEX.md),skill 按名引用(查 rules/skills/INDEX.md)。
consumer: orchestrator(P1A-NEW-011):本 skill 的消费者是扮演编排者角色的 Agent 自己,不是被派发的 worker——skill_discovery 的 worker 首步发现(OD-9)据此把它排除在 worker 任务的适用 skill 清单之外,避免一个只负责 phase 安排的编排者纪律被误注入进具体执行任务的 worker prompt。字段约定见 bestpractice_skill_writing_guide.md。
一句话
收到长而复杂的需求时,主 Agent 的职责不是"我怎么做完",是"我怎么安排别人做完":观察当前状态 → 派一个 worker session 做一件 bounded 的事 → 检测它产物是否真完成 → 据还差什么决定下一步派什么 → 持续推进,直到彻底完成或触到必须人工介入的边界才停。主 Agent 的全部 context 用于编排,实现细节全部下放给 worker session。
解决的真问题
给一个很长很复杂的需求时,主 Agent 会被吸进"怎么完成这项任务",把 context 烧在实现细节上,而不是"怎么把它拆成 phase 派出去"。结果是单项任务做得有条理,但跨 phase / 同 phase 派多 session 的协调一塌糊涂。本模式用一条纪律(主 Agent 不实现)+ 一组编排原语(每个编排动作一条命令)把主 Agent 钉在编排层,让它没机会滑进实现。
何时用 / 不用
用:需求长、涉及多文件多维度、要拆成多个 phase / 多个 worker session 才做得完;要"派出去做 + 检测 + 持续推进直到完成";用户点名要编排器模式 / 派 session。
不用:trivial 单步任务(直接做);单文件小改(直接做);纯事实查询。判据:这件事值不值得拆成 ≥2 个 bounded 单元派出去——不值就别套编排器。
核心纪律:主 Agent 是纯编排者
主 Agent 在本模式下只做四件事,循环往复:
- 观察状态:读当前 phase 计划、已完成的、剩余的 gap(
orchestrate status)。 - 派发:给当前要做的一件 bounded 事派一个 worker session(
orchestrate dispatch)。一个 worker 一件事,≤3 个子任务。 - 检测产物:worker 回来后,检测它产物是否真完成(
orchestrate check),绝不信 worker 自报 done。 - 推进:据检测结果决定下一步——完成则 advance 到下一 phase,没完成则据可定位 gap 派 follow-up(retry/branch),遇到必须人工介入则 await_user。
承重墙(防漂移):主 Agent 在本模式下禁用 Edit/Write 到实现代码文件,只能写 phase 计划 / handoff / 编排记录。要改实现就派 worker。这条把"不亲自实现"从口头变成可检测约束——主 Agent 一旦自己动手写实现代码,就是脱离了编排器模式。
循环契约(每轮要留下什么)
每轮(派一个 worker → 检测 → 决定)至少留下:派了谁做什么(task_id + channel + result_path)、检测判据与结果(done / remaining 可定位 gap)、下一步决定及理由。这些经 orchestrate 的 receipt 自动留痕,不靠主 Agent 记忆。一轮 = 一个 bounded 单元的派发-检测-决定闭环,不是"把活全干完"。
完成检测纪律(OD-3 / OD-5,承重)
这是模式的承重墙。两层:
- worker 侧:每个 worker 的 prompt §1 必读含"先定位既有成果(全仓 find/grep)+ 检查上一个任务做完没 + 在既有基础上接着做"(landing 三件套)。新 session 先确认前序做完,再做后续——这正是用户要的检查机制。
- 编排器侧:每次 advance 前
orchestrate check:机械谓词(exit_criteria 是否满足)+landing_gate四条件(C1 运行证据 / C2 注册 / C3git cat-file -e HEAD:进 HEAD,staged 不算 committed 不算 / C4 真实消费)+ 复杂判断时派独立 verifier worker(第二 agent,forbidden_read 含执行者成功叙事)。下一个 dispatch 只在 check 确认前序 done 后才发生。
判据:worker 说"我做完了"不算数;文件存在不算数;staged 不算 landed。check 返回的 done 是机械 + 独立核验的结果。
Pre-dispatch 信息收集纪律(OO-02,候选 C)
纪律:对于任何声明了 requires_info_gather: true 的 phase,主 agent 在 orchestrate dispatch 前必须先完成以下三步,否则 orchestrate check 会通过 info_gather_gate 直接 FLAG。
三步流程:
- 派独立 clean session 收集:用
Agent()工具(或等价的独立 sub-agent)派一个专门的信息收集 session,让它读取相关文件、skill、设计文档,产出 info_manifest。该 session 只做信息收集,不做任何实现。
- 产 info_manifest(最小格式):
- ```yaml
- task: "<本 phase 要做什么,一句话>"
- reference_only: true # 必须标记:仅供参考,不是 worker 的强制指令
- sources:
- path: "<文件/工具/skill 路径>"
- why: "<为什么这个 source 对完成本 phase 有用,具体说明>"
- ...
- ```
- 写入
contexts/runtime/info_gather/<phase_id>_manifest.yaml(或主 agent 自定义路径,传--manifest给 gate)。
- 注入 §6 补充位:把 info_manifest 路径写进 worker prompt 的 §6 补充位,作为仅供参考的信息指针,不作为强制 required_read。
收口检测:orchestrate check 时传 --manifest <路径> --worker-output <结果路径> 给 info_gather_gate(工具路径 tools/info_gather_gate/check.py):
- IG1:manifest 在场且结构合规(task + sources with why)→ PASS;否则 FLAG。
- IG2:worker 产出包含
INFO_SUFFICIENCY:自查 receipt → PASS;否则 FLAG。
worker 侧义务(IG2 要求):收到标记了 requires_info_gather 的 phase prompt 后,worker 在完成工作后必须在产出中写一节 INFO_SUFFICIENCY:,列出信息已充分的条目(satisfied:)和仍不足的条目(unmet:)。不需要完美,但必须写,且 unmet: 非空时应在 §7 遇阻逻辑中标明缺失。示例:
INFO_SUFFICIENCY:
satisfied:
- orchestrator engine check_phase structure understood
- gate pattern from intake_gate confirmed
unmet:
- need production run history to assess false positive rate向后兼容:未声明 requires_info_gather: true 的 phase,gate 自动 SKIP,不 FLAG,不影响现有 phase 行为。
任务二分 task_type → skill 注入表(OO-02 Slice 2)
设计:轻量 tag 驱动,不做全模板分支。phase 作者在 YAML 里声明 task_type: reading 或 task_type: implementation;dispatch_phase 据此在 dao_skills 基础上追加对应类型的 skill,不改 §3 产出模板、不动 info_gather_gate、漏标退化为默认注入而非报错。
task_type 值域:reading | implementation | 缺省(不写)。其他值在 plan 加载时报 PlanValidationError(早期发现拼写错误)。
注入映射表(维护真源:tools/orchestrator/engine.py:TASK_TYPE_SKILL_MAP)
| task_type | 追加注入的 skill |
|---|---|
reading | workflow_precise_reading(精准阅读 + 覆盖义务自查)、workflow_requirement_analysis_quality(需求覆盖质量验收 MC1-MC4) |
implementation | workflow_what_to_how_execution_bridge(What→How 执行桥)、workflow_real_task_test_case_design(真实任务测试用例设计) |
| 缺省 / None | 无额外注入,injected_skills == phase.dao_skills(现有行为,完全向后兼容) |
分配执行 session 时的信息读取要求:
- 阅读型(
reading):worker 应优先阅读架构设计文档、现有 design_spec、相关 skill;workflow_precise_reading的覆盖义务自查格外重要;产出重点是设计分析、gap 报告、调研结论。 - 实现型(
implementation):worker 应优先定位既有实现(landing 三件套)、确认测试框架、读workflow_what_to_how_execution_bridge;产出重点是可运行代码 + 测试证据。
实现位置:
- phase schema:
tools/phase_runtime/plan_loader.py:Phase.task_type(str | None = None,由_parse_task_type校验) - 注入逻辑:
tools/orchestrator/engine.py:dispatch_phase(_type_skills = TASK_TYPE_SKILL_MAP.get(task_type, ()))
向后兼容:未声明 task_type 的 phase(所有现有 phase)注入行为完全不变,已有测试零回归(见 Slice 2 报告)。
派发 worker 首步强制 skill 发现(OD-9,承重)
派出去的 worker 该用哪些 skill,不靠编排者凭记忆在 plan 里手写——手写会漏,漏掉的 skill 永远不进 worker。所以每个 worker 的契约加一条强制首步:执行具体任务前,先派一个 skill-发现 sub-agent,拿本任务描述对照 _DAO_ROUTING(任务特征→skill 路由表)+ skill INDEX,产出适用 skill 清单,worker 读取后在执行中使用。
发现归 worker,不归编排者。编排者留给编排本身(观察状态、派发、检测、额度 / session 调度),把"这个任务该用哪些 skill"的判断下放给 worker,让 worker 轻量自治:开头思考怎么做任务的同时并发派出发现 sub-agent,发现回来就把清单里的 skill 读进来再动手。
三步(worker 侧):
- 首步并发派发:worker 读既有成果(landing 三件套)的同时对自己的任务跑 skill 发现,不阻塞思考。不支持并发的 channel(如 Codex exec 串行)串行跑,但必须在执行任务前完成发现。
- 明确产出:发现 sub-agent 出结构化清单——适用 dao / 术 skill 名 + 每条一行理由 + 置信度,落进发现 receipt。
- worker 使用:worker Read 清单里每个 skill(与编排者在
skill_injection给的可选种子的并集),再开始执行。
强制是结构化的,不是 prompt 里一句自觉(本项目历史上口头纪律约 40% 合规)。两层保障:worker prompt 的 §1.5 强制节写明首步发现;发现落 receipt(contexts/runtime/skill_discovery/<task_id>.json),编排者 check 核 receipt 在否——worker 跳过发现,check 直接 FLAG。发现跑在 worker 侧、可见性由 receipt 这个 artifact 兜底,不把发现搬回编排者。
channel 无关:发现 sub-agent 做成命令原语 skill_discovery(tools/skill_discovery/),CC worker 和 Codex worker 都能在首步调它、产物一致;CC worker 也可直接用 Task 工具自派等价 sub-agent。skill_injection 因此从"唯一来源"降级为编排者的可选种子,worker 的强制发现是系统补全层。
动态纪律(OD-7)
不盲目按固定计划走。check 报 remaining 就据可定位 gap 派 follow-up,不强行 advance。phase 计划可带 depends_on,某 phase 阻塞时让位先跑独立的 ready 兄弟节点(DagStrategy)。下一步派什么由主 Agent 对 check 的具体 gap 做判断,不是查死表。"持续推进"靠的是据剩余动态安排后续,不是一次排完所有 phase 就不管了。
遇阻 / 边界
- 遇阻先按
workflow_manage_unexpected动作阶梯(换路径 → 移资源 → 降级 → proposal → 仅全堵死才精确 block 且举证已试),不在第一条路撞死。 - 必须人工介入才停(用户原话:"除非确实遇到必须人工介入的部分,否则它不应停下来"):AskUserQuestion 类决策、live 系统变更(crontab / launchd / settings hook 接线,macOS TCC 会挡)打包成权限包 await_user,不代答、不假装完成。其余一律据剩余继续推进。
硬规则(从 landing / production push 真实踩坑倒推,非臆测)
- worker 默认走 Codex:派出的 claude-channel worker(kimi/zai)是完整 CC 实例,会被全局 phase hook 劫持(auto-arm + stop 驱动器),把任务 prompt 当 non-trivial 自己 arm phase 计划,turns 全耗在驱动器上。codex exec 免疫(不跑 CC hooks)。要派 claude-channel worker 必须先给 phase hooks 加 dispatched-worker 跳过守卫(env 检测
DISPATCH_ORIGIN_SESSION/TODO_ID)。 - 不在单 session 内被动等异步 worker:Stop 驱动器缺 await-async-worker 语义,单 session 等 Codex worker 会被误判 giveup。用同步阻塞派发(Bash 调 dispatch 阻塞到 worker 返回)或 background + 轮询 result_path,不靠驱动器等。
- 权限启动前就位:worker 内 agent 无法自提权。派前跑权限探针,不过就先解阻塞不 spawn。
- worker 注入最小化:固定注入(必读 + MEMORY + INDEX)吃 context,严格单任务早交接。
- 全绝对路径,不
cd子目录(防 cwd 漂移)。 - run_in_background 不叠 nohup &(叠加会丢 router 真完成事件)。
- 测试隔离台账:worker 跑测试显式传
TOOL_RECEIPTS_LEDGER/PHASE_STATE_DIR到 mktemp 隔离目录,不污染真实台账。 - git 多写走单写网关(
git_gateway),多 worker 并行不都直写.git。 - handoff 写清消费者是谁:worker 是执行者还是接力器,混淆会让 worker 自铺脚手架直接执行。
- worker 首步强制 skill 发现:派出的 worker 必须首步跑 skill 发现(
skill_discovery)产出适用 skill 再执行,发现落 receipt(contexts/runtime/skill_discovery/<task_id>.json),check核 receipt 在否(详见「派发 worker 首步强制 skill 发现」节)。
多编排者并行运行硬规则(Run3 实战沉淀,2026-07-03)
来源:buildout Run3(13 域并行 campaign,2026-07-02~03,事故与恢复编年史见 adhoc_jobs/context_infra_base_tooling_buildout_20260615/Run3/logs/dispatch_log.md)。全部条目来自实发事故或实测成功,非预测。
- 并发三闸(CPU+内存+磁盘,任一超限先分批/卸载):只看 CPU 负载会漏判。实测:10 并发编排者×8 核,CPU 达标但内存爆(swap 9.7G/11G→13:30 全灭);磁盘两度 0G 再全灭。稳态经验值=16-24G 内存的 8 核机 ≤6 个 xhigh 编排者。启动/补位前核三值:load、
vm_statfree、df -gavail(<5G 不启动)。 - 持锁原子提交:git 网关只串行化 commit 一步时,锁外 stage 会被别人的提交扫走(实锤 commit
5daf2821d:讯息是 worker γ 的、内容是 worker α 已 stage 的文件)。规则=stage、白名单核对、commit 三步在同一次网关持锁调用内(serialize --op commit -- bash -c 'git add … && git diff --cached --name-only && git commit …');持锁后发现他人残留 staged 只git reset -- <路径>解除 staging、绝不动工作树;锁外绝不git add。 - lane 生命周期与协调 session 解耦:harness 后台任务存在周期性批量收割(实测 3 次、间隔约 3-3.5h,与资源无关:死时磁盘 9G/内存 833M 均健康、日志无任何错误事件);
setsid分离在沙箱内同样被收割。终解=经用户授权用非沙箱 tmux 拉起编排者(tmux 壳退出留孤儿进程照跑也可接受);协调侧巡检用 Monitor 类任务(实测远比后台 Bash 抗收割)。 - 断点复活契约:
codex exec resume <thread_id>(thread_id 取 lane stdout jsonl 首行thread.started),零丢失的前提是恢复 prompt 三要素齐:①先核现场(git log --oneline -8+ 自己 timeline 尾部 + 白名单内git status);②半途产物收拾规则(不混提、不重复提交、已派 worker 先找 result 文件);③断点续做+新增资源纪律。复活后必须亲核「事件数在增长且尾部无 usage limit」才算成功——resume 命令不报错不算。 - RCL 账本域分片:
save_ledger全量读改写且无锁,N 编排者并行写同一账本必然静默丢行。每域独立分片rcl/<domain>.jsonl,收口按group_by(.req_id) | last聚合。 - 护栏按本意仲裁,不按字面:护栏谓词可能在执行中变得不可满足(实例 G-B:等"RPST 对 gate_registry 的 S1 改动 landed",但 RPST 以不触碰该文件的形态关域)。协调者按护栏本意(防同文件并发写)仲裁:并发方已关域且机械证明未触碰(
git show <SHA> --name-only为空)→冲突空集→判空满足。仲裁必须带证据链写进设计文档供 worker 亲验后再推进;worker 在仲裁前的拒进是正确的护栏执行,不是故障(实例:ddp 两次拒进均正确,第二次还抓出了协调者解锁通知的事实错误)。 - 诚实受阻→窄化重试环:worker 多轮跨通道派发零产物时的收敛路径(实例 fsa,两次受阻两次重试后完整关域):EXIT_STATE+收口账户全转 DEFERRED_WITH_BOUNDARY(诚实挂账不打 tag)→ 环境修复后先派 30 秒级金丝雀验证派发子系统 → 过则派最小工单(单文件+3 测试,工单写明「不读 skill、不写 plan、直接实现」压 worker 开销)→ 仍零产物则启用一次性受控亲写豁免(范围锁死到具名文件+测试自验+账本留痕,是对"只编排不实现"的显式记录例外而非默默破戒)→ landed 后用真实 harness 产物替换 synthetic 标记,正常关域。
- 巡检形态:每 30min 一行全 lane 快照(每 lane:日志 staleness / 事件数 / DONE 检测=last_message 落盘 / stderr 错误特征)+ 磁盘与内存水位告警线。staleness ≥30min 判 STALL 候选;已知主动停靠的 lane 在解读时豁免,防告警疲劳。
验收标准(无上下文 agent 可自判用对了没)
- 主 Agent 的动作是不是只有 status / dispatch / check / next(编排),没有 Edit/Write 实现代码?有自己写实现 = 脱离了模式。
- 每次 advance 前是否跑过
check(机械 + 独立核验),而不是信 worker 自报? - 遇到 remaining 是否据可定位 gap 派 follow-up,而不是停下来等用户或强行 advance?
- worker 是否默认 codex、prompt 是否带"先检查前序做完"、是否全绝对路径?
- 停下来时是不是真触到了人工介入边界(AskUserQuestion / live 变更),而不是中途畏难即停?
- worker 是否在执行前首步做了 skill 发现(receipt 落
contexts/runtime/skill_discovery/<task_id>.json),而不是直接凭编排者手写的 skill 清单就执行?
术命令(按名引用)
orchestrate(工具tools/orchestrator/):9 子命令status / dispatch / check / next / run / loop / loop2 / cell / cell-gate。dispatch派 worker(七段式 prompt,默认 codex)、check检测产物真完成、run是 headless 确定层兜底循环、loop/loop2跑现有循环入口、cell/cell-gate暴露严格 provider-cell 验证与 gate 包装。跨环境(CC / Codex / OpenCode / CLI)都能调。skill_discovery(工具tools/skill_discovery/):worker 首步 skill 发现原语。给任务描述,对照_DAO_ROUTING+ skill INDEX 产出适用 skill 清单,落 receipt 供 worker 消费 + 编排者check核验。channel 无关(CC / Codex 都能调)。
交叉引用
- 排 phase 计划:
workflow_phase_framework(每 phase 带需求锚 + 机械误差信号)。 - 检测 worker claim:
workflow_session_claim_audit(应然 vs 实然 diff,不信自报)。 - 完成判据:
workflow_landing_to_production(landed = 消费链走通 + landing_gate 四条件)。 - 遇阻:
workflow_manage_unexpected(动作阶梯 + block 可证伪)。 - 运行时机制:
workflow_phase_skill_trace_runtime(交互式钩子链 + spawn 派发两模式)。 - 需求 intake:
workflow_requirement_intake(中途新需求进真源 + 入序)。 - worker 首步 skill 发现:术原语
skill_discovery(tools/skill_discovery/),发现归 worker、receipt 供编排者核;消费_DAO_ROUTING路由表。
诚实 claim ceiling / 缺口
- 证据等级 bounded(draft Beta):本 skill 的纪律基于 landing / production push 真实踩坑 + 现有 primitive,未经多任务真实运行大规模验证。晋级 production 需 ≥1 个真实长复杂任务按本模式跑通端到端 + 过
landing_gate。 - 已知缺口:verifier worker 的成本/可靠性未测;claude-channel worker 的 hook 跳过守卫尚未实现(当前只能默认 codex);超长 worker(>10min)的 background+poll 路径未大规模验证。
- OD-9(worker 首步强制 skill 发现)证据 observational:prompt §1.5 + 发现 receipt 双层保障已设计,但 worker 真实首步合规率、轻量发现 sub-agent 的召回质量待 held-out 行为验证(本程序 OSD-P3)。