From legal-skills
Orchestrates multiple independent agents (Claude Code, Codex, OpenCode, etc.) in parallel within the same repo using isolated worktrees and tmux sessions. The PM session decomposes tasks, dispatches workers, monitors progress, and consolidates results, with escape-prevention gates for critical tasks.
How this skill is triggered — by the user, by Claude, or both
Slash command
/legal-skills:multi-agent-orchestrationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
PM 式多 Agent 本地执行编排。它回答一个问题:多个 Agent 如何在同一仓库里用独立 worktree/session 并行干活,并让当前主会话作为 PM 可巡检、可收口、可控制额度消耗。
CHANGELOG.mdLICENSE.txtconfig/claude-provider-settings.example.jsonreferences/01-model-selection-matrix.mdreferences/02-runtime-dependencies.mdreferences/03-checkpoint-files.mdreferences/04-sentinel-design.mdreferences/05-legal-domain-patterns.mdreferences/06-agent-cli-reference.mdreferences/07-qoderwork-cli-worker.mdreferences/08-workbuddy-cli-worker.mdreferences/09-parallel-lessons.mdreferences/10-agent-teams-troubleshooting.mdscripts/check-dependencies.shscripts/clean-worktree.shscripts/lint-wait-script.shscripts/pm-monitor.shscripts/render-runtime-profile.shscripts/sentinel.shscripts/smoke-provider-settings.shPM 式多 Agent 本地执行编排。它回答一个问题:多个 Agent 如何在同一仓库里用独立 worktree/session 并行干活,并让当前主会话作为 PM 可巡检、可收口、可控制额度消耗。
PM 是当前负责拆解、派工、验收和收口的主会话,不绑定具体产品。Codex 可以做 PM 调 Claude Code 或 OpenCode worker;Claude Code 也可以做 PM 调 Codex 或 OpenCode worker。Skill 只规定角色、隔离、启动、状态和收口协议。
使用本 Skill:
不使用本 Skill:
cross-agent-coordination。git-workflow。| 模式 | 适用 | 默认隔离 |
|---|---|---|
| PM 直接处理 | 轻量、低风险、无并行价值 | 当前工作区 |
| 同宿主 Subagent | 窄范围分析、审阅、局部修订 | 通常不新建 worktree |
| Claude Code Agent Teams | Claude Code 做 PM 且需要团队式协作 | worktree + branch |
| tmux 独立 CLI session | 需要跨产品 worker、长上下文、独立额度或独立进程 | worktree + branch |
| Claude Code agent view | 需要使用官方后台会话、peek/reply/attach 和 claude agents 总览 | 可用 Claude 官方 --worktree / --tmux,或手动 worktree |
| ACP adapter | 项目已提供稳定 adapter,且需要结构化事件流 | adapter 决定,仍建议 worktree + branch |
优先级由项目规则决定。若用户或项目明确要求使用 tmux / 独立 session / 开 worker,进入防逃逸门禁。
强制 session 触发条件:
tmux、独立 session、开 worker、多 Agent 并行、你做 PM / orchestrator、不要你直接写,或项目规则要求 tmux / 独立 session。触发后,PM 在任何业务实现前必须完成启动门禁:
--worktree --tmux 可作为 Claude 专用等价入口。tmux has-session / tmux list-sessions / claude agents --json 验证 session 存活,并确认 pane cwd 或 agent cwd 指向目标 worktree。STATUS.json 出现;若未出现,只能发送 checkpoint-only 纠偏或重启 worker,不得直接接管业务实现。降级规则:
--worktree --tmux 可用。Agent view / Agent Teams 只有在能证明独立后台会话、独立 cwd/worktree 和可巡检状态时才可替代。先分清角色,再选择后端:
| 角色 | 职责 | 可由谁担任 |
|---|---|---|
| PM | 读取任务源、分组、启动 worker、巡检、验收、合并收口 | 当前 Codex、Claude Code、OpenCode 或其他主会话 |
| Worker | 在指定 worktree/branch 内完成限定任务 | Claude Code、Codex、OpenCode、自定义 CLI、shell 脚本、未来 ACP agent |
| Reviewer | 检查 diff、测试、范围和风险 | PM、另一个 worker、code-review subagent |
PM 代理纪律:
后端选择规则:
claude-oauth-* profile,并清理第三方 provider 环境变量。opencode run / opencode acp 能力时,worker backend 选 OpenCode。tmux + worktree;触发 §2.1 时,tmux + worktree 是默认执行层,不是可静默跳过的建议。环境/profile 纪律:
Runtime Profile、settings/profile 路径、模型来源和关键环境变量处理方式,不假定 Claude Code、Codex、OpenCode 共享同一套 shell 环境。ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN / 默认模型映射;不要套用 OAuth 的清理命令。which claude/codex/opencode、版本号、cwd、关键 profile 名和 node/npm/python/cargo 等运行信息写入 STATUS.json,便于 PM 判断“环境不一样”是否影响任务。默认让 worker 与 PM 跑在同一个 Agent 工具里:Claude Code 做 PM 就用 Claude Code worker,Codex 做 PM 就用 Codex worker,OpenCode 同理。不要为了"分流额度"默认把 worker 路由到另一种 Agent 工具。 这条优先于 §2.2 的多 backend 路由建议。
为什么默认同宿主:
同宿主 worker 的 auth 约定(重要,避免误判环境):
claude 进程继承 PM 的 provider env(第三方 API 的 ANTHROPIC_AUTH_TOKEN / ANTHROPIC_BASE_URL,或 OAuth 会话)。即使目标 worktree 的 .claude/settings.json 为空或缺省,worker 也能用 PM 的 provider 跑起来,不需要额外的 config/*.settings.json。claude 版本和 provider 来源写进 STATUS.json;PM 看到 provider 来源为空或报 401/403 时,再决定是补 settings 还是降级,而不是默认先跨工具。何时可以跨工具(例外,不是默认):
触发跨工具时的硬要求:PM 必须在 Wave 计划里写明为什么跨、每个 worker 的 backend / profile / auth 来源,以及跨工具带来的额外排障点。§3.1 的 provider slot 分配仍适用,但 slot 默认全部落在 PM 宿主工具上;跨工具 slot 是显式例外,需要在 Wave 摘要里标注。
.claude/orchestration.config.json 或等价配置,先读取 trunk、任务源、验证命令、可复制配置和 hook 边界;再用 cross-agent-coordination 判断可执行项、依赖和归属。--worktree 能力时,才允许由 Claude Code 创建,但 PM 仍要验收分支、路径和隔离状态。STATUS.json 出现或已发送 bootstrap correction。.claude/agent-sessions/<session-id>/STATUS.json、RESULT.md、PATCH_SUMMARY.md、git status、commit/PR 状态;Claude 官方 Agent Teams 则优先读取 ~/.claude/teams/<team>/ 和 ~/.claude/tasks/<team>/,claude agents --json、tmux pane 或 agent view 作为兜底观察。发现偏题、阻塞、范围扩大或无阶段性提交时介入。git-workflow 合并和清理。goal-contract.md 或对应 RESULT.md。仅靠 typecheck / 单测 / lint / build 全部通过就宣称"完成"是不充分的——这些只证明"代码能编译",不证明"功能真的能用"。Wave 是在同一 base ref、同一批冲突假设下启动的一组并行 worker。它用来记录“本项目已经并行推进过几轮”、控制并发风险,并让 PM 在每轮结束后复盘 provider/model 表现。
Wave 启动前,PM 必须写清:
wave_id、base ref、目标、worker 清单、每个 worker 的分支/worktree/session。ui-wiring(低风险 UI 接线)、contract-extension(共享契约/依赖变更)、tauri-command(Rust/Tauri/本机依赖)、docs/research、custom。package.json、锁文件、src-tauri/、src/shared/、全局布局、DEC 编号或同一模块入口。并发数量不是固定 3 个。文件范围独立、验证命令独立、无共享契约冲突时,默认目标可提高到 4-6 个 worker;纯文档、翻译、i18n、互不重叠 UI 接线可以更多。涉及共享依赖、锁文件、Tauri command、全局布局、DEC race 或同一模块入口时,降到 1-3 个并按依赖顺序推进。
Provider slot 分配是 PM 的显式规划,不是脚本自动猜测:
backend + settings/profile path + provider + model + max_concurrency。config/minimax-M3.settings.json、config/glm-5.2.settings.json;真实 settings 文件保持本地 ignored,不提交。provider/model profile 区分;custom worker 写明实际命令来源。6-worker 示例:
| Worker | 任务风险 | Backend | Settings/Profile | Slot |
|---|---|---|---|---|
| W1 | 高 | Claude Code | config/minimax-M3.settings.json | minimax-1 |
| W2 | 中 | Claude Code | config/minimax-M3.settings.json | minimax-2 |
| W3 | 低 | Claude Code | config/glm-5.2.settings.json | glm-1 |
| W4 | 低 | Claude Code | config/glm-5.2.settings.json | glm-2 |
| W5 | 文档/研究 | Codex | codex:<profile> | codex-1 |
| W6 | 重复性低风险 | OpenCode/custom | <provider/model or command label> | opencode-1 |
Wave 收口时,PM 记录每个 worker 的 merged / done-unmerged / blocked / deferred / restarted,并评估模型/provider 表现:Isolation Gate、STATUS 心跳、commit 节奏、范围遵循、验证通过率、review 修复次数、diff 质量、阻塞/幻觉/环境误判。下一 Wave 根据该评估调整任务分配:高风险任务给指令遵循和工程可靠性更好的 profile,低风险重复任务给成本或吞吐更优的 profile。
Orchestration Goal 是 PM 层目标循环,用来让多轮 Wave 在条件满足前持续推进。它不把所有任务交给单个 worker;PM 仍按 Wave 从任务源取下一批安全可并行项,worker 仍只执行自己的窄范围任务。
启动 Goal Loop 前,PM 必须写清 Goal Contract,模板见 templates/orchestration-goal.md:
docs/TASKS.md、GitHub Issues、项目配置中的 issue file。merged / done-unmerged / blocked / deferred,主干验证通过,文档已同步。plan-only(只规划下一 Wave)、auto-launch(可自动开下一 Wave)、auto-review(可自动复核 worker 结果)、auto-merge(在项目规则允许时按 git-workflow 合并)。PM 可在支持的宿主中使用 Claude Code / Codex 的 /goal 来包住 PM loop,但 /goal 只负责让 PM 持续执行循环,不替代本 Skill 的 worktree、tmux、checkpoint、review 和 merge 门禁。Goal prompt 必须写明“PM 不直接实现业务代码;实现仍由 worker 完成”。
每轮 Wave 收口后,PM 按以下顺序决定是否自动继续:
自动继续条件:
merged、done-unmerged、deferred 或明确 blocked 且不会影响下一 Wave。git-workflow 处理,base ref、本地主干和远端主干一致或已明确记录差异。必须停止并汇报的条件:
failed、blocked 且影响下一 Wave,或连续两次纠偏无效。项目可放置 .claude/orchestration.config.json,模板见 templates/project-config.json。该配置只声明项目默认值,不替代 PM 判断,也不允许静默执行破坏性动作。
配置可声明:
.npmrc.example 或只读模板。配置安全规则:
.env、真实 settings、token、key、cookie、证书或账号凭证。allowed_config_copy 只允许非敏感文件;forbidden_config_copy 命中时必须停止并报告。spawn-worker.sh 不自动读取项目配置、不自动复制配置、不自动执行 hook,避免把可选约定升级成隐式副作用。main、不复制配置、不跑 hook、只使用 worker prompt 明确列出的验证命令。分支名面向远端协作和 PR,必须体现任务语义,不写执行来源。
docs/ch01-agent-intro
research/issue-13-ch08-materials
fix/agent-session-shell
worktree 路径只用于本地隔离,应加执行来源前缀:
.claude/worktrees/tmux-ch01-agent-intro
.claude/worktrees/team-agent-session-shell
.claude/worktrees/subagent-copyedit-ch02
不要把 tmux-、subagent-、team-、agentteam- 写进分支名。分支类型前缀和提交/PR 格式以 git-workflow 为准。
创建示例:
git worktree add .claude/worktrees/tmux-ch01-agent-intro -b docs/ch01-agent-intro
git worktree add .claude/worktrees/team-agent-shell -b fix/agent-session-shell
Worker 的本地状态统一写到当前 worktree 的 .claude/agent-sessions/<session-id>/(下文简称 Session Context),复用项目既有 .claude/ 协作空间,与 Claude Code 官方 Agent Teams 状态源明确区分。
.claude/agent-sessions/legal-ch01/METADATA.json
.claude/agent-sessions/legal-ch01/STATUS.json
.claude/agent-sessions/legal-ch01/RESULT.md
.claude/agent-sessions/legal-ch01/PATCH_SUMMARY.md
Claude Code 官方 Agent Teams 是另一套机制:团队配置在用户目录 ~/.claude/teams/<team-name>/config.json,任务状态在 ~/.claude/tasks/<team-name>/,inbox 在 ~/.claude/teams/<team-name>/inboxes/。使用官方 Agent Teams 时优先读写这些官方状态源;不要在项目里自造 .claude/teams/ 来冒充官方 team。
.claude/agent-sessions/ 是 PM 巡检状态,不属于业务 diff。PM 和 worker 都必须确认它不进入 commit / push / PR;需要时由 PM 在对应 worktree 的本地 exclude 中忽略。
Worker prompt 应像启动 subagent 一样给足上下文:任务来源、验收标准、允许文件、禁止文件、验证命令、checkpoint 协议、隔离自检和 PM 纠偏协议都要写清。不要只给一句“实现某功能”,否则 worker 容易把环境、依赖或相关技术债扩展成自己的任务。
模板放在 templates/worker-prompt.md,包含两个可复制段落:
STATUS.json,适合高延迟 provider 或 high-effort 模型的第一条消息。对高延迟 provider 或 high-effort 模型,优先用两段式启动:第一条消息使用 Bootstrap-only prompt 创建 Session Context/STATUS.json 并回报 runtime;PM 确认 checkpoint 后,再发送 Full worker prompt。这样能避免 worker 在长思考前没有可观测状态。
PM 派 worker 时必须以 templates/worker-prompt.md 的 Full Worker Prompt 为骨架,把业务任务(Issue / 任务卡 / .task-issueN.md 内容)填进 Background / Mission / Scope / Deliverables / Verification 字段。不要用自定义简化 prompt(例如只写一个 BOOTSTRAP.md 指向业务 .task 文件)替代模板骨架——即便业务 .task 文件写得很细,没有模板骨架的编排层硬约束,worker 仍会在流程层失守。
模板里这些段落是 worker 可观测性和收口正确性的硬约束,省略会直接导致收口失败(以下后果均有实测对应):
pwd / git branch,否则可能在 main 或错误 worktree 误改。phase=thinking-deep):PM 靠 STATUS.updated_at 检测 silent worker。省略则 worker 写一次初始 STATUS 后再也不更新,PM 巡检信号失真、无法判断卡点。git add + git commit 自己的产出。省略则 worker 改完文件不 commit,PM 收口时 git diff --check main...HEAD 验的是空 diff(HEAD 仍在 base,假通过),PM 只能替 worker commit。rebase / reset 后尤其要重新确认改动已 commit。status="done" 字面值):sentinel 状态机按字面 done 匹配。省略则 worker 可能写 completed / finished 同义词,sentinel 不退出、PM 不被 harness 唤醒、worker 孤儿到 --max-wait 超时。业务任务文件(.task-issueN.md 等)可作为 Mission / Scope 的附件让 worker 读取,但编排层骨架(Isolation Gate / Heartbeat / Commit / done 字面值)必须来自模板,不能靠业务文件或自定义 BOOTSTRAP 兜底。PM 若发现自己在手写 BOOTSTRAP 替代模板,应停下,改为套用 templates/worker-prompt.md 再派发。
默认工具面保持收敛:
check-dependencies.sh:新机器或启动 Wave 前做一次 preflight。render-runtime-profile.sh:为每个 worker 渲染 backend/settings/profile/model/slot 和启动命令。spawn-worker.sh:创建 worktree、Session Context 和 tmux session。sentinel.sh:每个 worker 一个,PM 用 run_in_background=true 启,worker 终态时唤起 PM(见 §7.2)。pm-monitor.sh:多 worker/Wave 巡检;单 worker 或宿主唤醒才用 wait-worker.sh。项目配置模板见 templates/project-config.json。PM 可以把其中的 trunk、验证命令和 provider slot 复制到本轮 Goal/Wave 计划,但脚本不会自动套用该配置。
其余脚本只在对应场景使用:worktree-status.sh 做只读总览,clean-worktree.sh 做 dry-run 清理,smoke-tmux-worker.sh / lint-wait-script.sh 只做 Skill 自测,terminal-split.sh 只是可选可视化辅助,不属于默认启动路径。
默认用 scripts/spawn-worker.sh 创建 worktree、Session Context 和 tmux session;它只负责隔离和启动,PM 仍必须发送 templates/worker-prompt.md 并确认 STATUS.json。不同 backend/profile 的启动命令可先用 scripts/render-runtime-profile.sh 生成,减少手写环境差异。
eval "$(bash scripts/render-runtime-profile.sh \
--backend claude-code \
--runtime-profile minimax \
--api-provider minimax \
--model claude-sonnet-4-5 \
--provider-slot minimax-1 \
--settings config/minimax-M3.settings.json)"
bash scripts/spawn-worker.sh \
--project /path/to/repo \
--branch docs/ch01-agent-intro \
--session legal-ch01 \
--worker-backend "$WORKER_BACKEND" \
--runtime-profile "$RUNTIME_PROFILE" \
--api-provider "$API_PROVIDER" \
--model "$MODEL" \
--provider-slot "$PROVIDER_SLOT" \
--verify-cmd 'npm run typecheck' \
--command "$WORKER_COMMAND"
启动后必须通过最小门禁:tmux has-session 存活、pane cwd 指向 worktree、git branch --show-current 等于目标分支、Session Context/METADATA.json 已记录 base/runtime/verification、Session Context/STATUS.json 在 1-2 分钟内出现。失败时停止 session 或发送 bootstrap correction,不要在 PM 主目录继续实现。
常用 worker command:
claude --settings <local-provider.settings.json> --permission-mode auto。真实 settings 不提交;模板见 config/claude-provider-settings.example.json。env -u ANTHROPIC_API_KEY -u ANTHROPIC_AUTH_TOKEN -u ANTHROPIC_BASE_URL claude --permission-mode auto。claude --settings <settings> -p --output-format stream-json --permission-mode acceptEdits < /tmp/task.prompt.md。codex exec -a never -s danger-full-access - < /tmp/task.prompt.md。opencode run --format json --model <provider/model> "$(cat /tmp/task.prompt.md)",或交互式 opencode --model <provider/model>。< redirect 必须用 bash -lc 包(FaroPDF Wave 1 实战,见 [DEC-033]):spawn-worker.sh:305 内部 tmux new-session -d -s "$SESSION" -c "$WORKTREE" "$COMMAND" 直接 exec command(不通过 shell),< / > / | / && 等 shell metachar 不展开。如果 --command 含 < 重定向,必须包 bash -lc 'real-command < /tmp/prompt.md',否则 worker 进程拿不到 stdin 立即退出,sentinel 等 --max-wait 才 timeout。错误:--command 'claude -p < /tmp/x.md';正确:--command "bash -lc 'claude -p < /tmp/x.md'"。
claude -p batch 模式有 autocompact thrash 风险(FaroPDF Wave 1 实战,见 [DEC-033]):-p 是 print-and-exit 一发跑完模式,PM 无法中途纠偏。大 prompt(> 5KB)+ 大项目 codebase 会触发 claude 内部 Autocompact is thrashing 3 次后自动终止,worker 永远不到达终态,sentinel 等到 --max-wait。规避:(a)拆小 prompt < 3KB;(b)改用交互式 claude + tmux send-keys 投递 prompt(可纠偏);(c)窄 scope worker(避免 claude 加载整个 codebase context)。
不要设 --max-turns:PM 重点是检测 worker 是否真在推进,而不是限制 turn 数。长任务通过 STATUS.json.updated_at、阶段性 commit、pm-monitor.sh stale 事件和 PM 纠偏控制。
Claude Code agent view / 官方后台会话可作为 Claude 专用后端:claude agents、claude agents --json、版本支持时的 --worktree --tmux、--bg 或 /bg。使用前以本机 claude --help / claude agents --help 为准;只有能证明独立 cwd/worktree、可巡检状态和可接管会话时,才可替代 tmux。
Agent Teams 适合 Claude Code 团队式协作;仍要使用 worktree 隔离并把 workdir 指向带来源前缀的 worktree。ACP 只在 adapter 已稳定、能输出结构化状态时启用。Subagent 仅用于轻量、边界窄、输入少的任务;需要长时间写作、独立提交 PR 或跨大量材料整合时升级为 tmux / agent view / Agent Teams。
PM 巡检信号:
.claude/agent-sessions/<session-id>/METADATA.json 是否记录 base ref、runtime profile、provider slot、验证命令和 PR 占位。.claude/agent-sessions/<session-id>/STATUS.json 是否更新,是否报告 blocked / needs_input / done。.claude/agent-sessions/<session-id>/RESULT.md 和 PATCH_SUMMARY.md 是否存在,摘要是否足够 PM 不读完整日志也能验收。介入规则:
Session Context/STATUS.json 时,先发送 checkpoint-only 纠偏;仍无响应时中断当前思考并重发 bootstrap 指令,不直接接管实现。Session Context,避免丢失已落盘产物。tmux 纠偏示例:
tmux send-keys -t legal-ch01 -l -- "PM correction: stop dependency/runtime changes now. Return to ISS-017 only. Do not modify package files or environment config. Update .claude/agent-sessions/legal-ch01/STATUS.json with needs_input=false and continue with the OCR quality report scope."
sleep 0.1
tmux send-keys -t legal-ch01 Enter
纠偏 prompt 应包含四件事:停止什么、回到哪个任务、哪些文件/动作仍然禁止、下一步最小可执行动作。不要只写“你偏题了”。
完整字段见 references/03-checkpoint-files.md,可复制模板见 templates/checkpoint-status.json、templates/checkpoint-result.md 和 templates/checkpoint-patch-summary.md。PM 默认只读这些 checkpoint 和最终 diff,不定时拉完整日志。
可选自动 PM 监控脚本(保留 Agent Teams inbox、任务状态、Git SHA、PR 状态和 tmux session 多维巡检能力):
bash scripts/pm-monitor.sh \
--project /path/to/repo \
--team-dir ~/.claude/teams/team-name \
--tasks-dir ~/.claude/tasks/tasks-uuid \
--claude-agents-cwd /path/to/repo \
--wave-id wave-5 \
--commit-stale-threshold 1800 \
--progress-stale-threshold 1800 \
--interval 60 \
--log-file .claude/agent-sessions/pm-monitor/events.log \
--branch docs/ch01-agent-intro:legal-ch01
经济型巡检规则:
pm-monitor.sh --once,由 PM 在需要判断是否介入时运行一次,只读取事件行。pm-monitor.sh --log-file ...,脚本持续写事件日志;PM 只在状态变化、用户询问、PR 收口或日志出现 AGENT_NEEDS_INPUT / CHECKPOINT_STALE / CHECKPOINT_TEST_FAILURE 时读取少量日志。--once 或低频读取 log tail,仍比前台反复巡检节省上下文。STATUS.json 只记录 PM 决策必需的结构化信号,详细实现说明继续写 RESULT.md 和 PATCH_SUMMARY.md。scripts/worktree-status.sh;清理用 scripts/clean-worktree.sh,默认 dry-run,真正删除必须显式 --execute。scripts/wait-worker.sh 是单 worker 等待器,不替代 pm-monitor.sh。它主读一个 STATUS.json,在 done、failed、blocked 或 stopped 时退出并输出 RESULT.md / PATCH_SUMMARY.md 路径。适合把“worker 完成时通知 PM”接到不同宿主。
状态源分层:
METADATA.json 是 PM 启动时写入的静态上下文,记录 base/runtime/provider/verification,不作为完成判定。STATUS.json / RESULT.md / PATCH_SUMMARY.md 是完成、阻塞、验证和收口的主协议。tmux capture-pane 是诊断窗口,只在 checkpoint 缺失、过期、终态或显式要求时读取尾部输出。Claude Code PM:
Bash background/run-in-background 只能让等待器在后台运行,不保证触发或唤醒当前 PM / agent session;多 worker 同时等待时尤其可能没有任何完成消息返回。
不要把 background Bash 当作可靠完成通知机制。它最多作为日志写入器或人工可查看的后台 job;PM 仍必须靠 STATUS.json、pm-monitor.sh --log-file、wait-worker.sh --once、tmux/agent view 显式巡检来收口。
单 worker 可临时用 background Bash 跑 wait-worker.sh,但启动时必须同时记录 log 文件或保留可查询命令;多 worker / Wave 默认使用 pm-monitor.sh --log-file,不要为每个 worker 启一个 background wait 并期待宿主逐个回调。
限定条件例外:§7.2 描述的 Sentinel 模式是本规则的"限定条件下可工作变体"——单 worker 单 sentinel、run_in_background=true 启、harness 100% re-invoke 可工作。Wave 6 启用 sentinel 之前仍按上述保守判断走。
bash scripts/wait-worker.sh \
--worktree .claude/worktrees/tmux-ch01-agent-intro \
--session legal-ch01 \
--tmux-session legal-ch01 \
--interval 30
Codex PM:
run_in_background。wait-worker.sh --once 接到当前 thread 的 heartbeat automation;完整 prompt 见 templates/codex-heartbeat-wait.md。创建、修改或删除 automation 时必须先查找并使用 automation_update 工具,不手写 raw RRULE。pm-monitor.sh --once 或 wait-worker.sh --once 低频手动巡检;长任务仍用 pm-monitor.sh --log-file 持续记录事件。wait-worker.sh 的职责是等一个 worker 到终态;它输出终态,不负责唤醒宿主。多 worker、PR 状态、git SHA、gate 和 stale 事件仍由 pm-monitor.sh 负责。
适用:Wave 6 之后,每个 worker 配套启一个 sentinel,PM 由 harness task-notification 事件驱动地唤醒,零 idle token 消耗,保留多轮纠偏能力。设计依据见
references/04-sentinel-design.md;DEC-031 supersede DEC-030 的限定条件判断。
模式:每个 worker 配一个 scripts/sentinel.sh 进程。Sentinel 轮询 STATUS.json,
读到 done | failed | blocked | stopped 时 capture tmux pane tail、tmux kill-session、
exit。Sentinel 由 PM 用 run_in_background=true 启,exit 触发 harness
task-notification → PM 被 re-invoke。
PM 端调用模式:每 worker 两次 Bash 调用:
# 1) Foreground: 创建 worktree + 启动 worker + 拿 gate 验证
bash scripts/spawn-worker.sh \
--project /path/to/repo \
--branch docs/ch01-agent-intro \
--session legal-ch01 \
--with-sentinel \ # 仅打印 SPAWN_WORKER_SENTINEL_CMD,不在内部启
--command "$WORKER_COMMAND"
# 2) Background: sentinel 事件驱动 wake
# 从 spawn-worker.sh 输出里复制 SPAWN_WORKER_SENTINEL_CMD 那行
bash scripts/sentinel.sh \
--status-file .claude/worktrees/tmux-docs-ch01-agent-intro/.claude/agent-sessions/legal-ch01/STATUS.json \
--tmux-session legal-ch01 \
--poll-interval 5 \
--max-wait 7200
# ↑ 用 Bash run_in_background=true 启
为什么不在 spawn-worker.sh 内部启 sentinel:
spawn-worker.sh 是 fg 工具,sentinel 是 bg 工具,职责分离run_in_background=true)是 harness re-invoke 的前提Sentinel 事件命名空间(独立于 WAIT_WORKER_*):
| 事件 | 触发 |
|---|---|
SENTINEL_START | 启动时 |
SENTINEL_PENDING | STATUS.json 缺失 |
SENTINEL_PANE_TAIL | capture pane 前(best-effort) |
SENTINEL_TERMINAL | 检测到 done / failed / blocked / stopped |
SENTINEL_TMUX_KILLED / SENTINEL_TMUX_GONE | kill tmux 之后 |
SENTINEL_TIMEOUT | --max-wait 到了还没看到终态 |
PM 收到 notification 后的标准动作见 templates/pm-sentinel-response.md:
--status-file / --tmux-session 与 spawn-worker 一致性降级路径:如果 sentinel 没启起来(auto mode 拒 / SIGKILL / 参数错),PM 回到 §7.1
行为:单 worker 用 wait-worker.sh --once,多 worker 用 pm-monitor.sh --log-file。
降级是 graceful 的,不是失败。
调优建议:
--poll-interval:默认 5s。worker 单次 thinking 短时降到 1s,长时保持 5s--max-wait:默认 7200s(2h)。长 worker 拆 sub-task,每个 sub-task 自己的 max-wait--keep-tmux-on-terminal:review 阶段不杀 tmux,便于 PM tmux capture-pane 看 worker 收尾--pane-tail-lines 0:不需要 pane 快照时关掉,少 1 个 tmux capture-pane 调用已知不覆盖:
templates/codex-heartbeat-wait.mdworker 提 PR 不是 PM 收口完成的信号。从提 PR 到合并之间,PM 必须做两件事避免外部抢跑:
提 PR 之后立即跑 mergeable 检查:
gh pr view <N> --json state,mergeable,mergeStateStatus,baseRefName,headRefName
mergeable=CONFLICTING / mergeStateStatus=DIRTY / baseRefName 落后:base 已被 doc-curator 或其他 PR 抢跑。立即按 git-workflow 的「base 落后 / 冲突处理」决策表(update branch vs rebase vs close-and-reopen)处理。mergeable=MERGEABLE 且 base 是最新:进入 review 流程。PM 本地 main 立即 push:
git push origin main,避免本地与 origin/main drift。git fetch origin + git switch -C main origin/main(不是 git pull,squash commit 不会自动 ff),再继续 PM 工作。worker backend 选择(subagent / tmux / Agent Teams)见 §2.1。
worker 完成后:
git status --short、git diff --check main...HEAD、PR diff 范围。writing-reviewer(或项目领域审稿 skill);研究 / 配置类 PR 用对应内容审查。项目应在自己的 AGENTS.md 里写明用哪个 review skill;没写时 PM 按项目性质判断,不假定 code-review。git-workflow。bash scripts/clean-worktree.sh --project /path/to/repo --branch docs/ch01-agent-intro --session legal-ch01
bash scripts/clean-worktree.sh --project /path/to/repo --branch docs/ch01-agent-intro --session legal-ch01 --execute
依赖按模式分层;只读文档不需要安装任何工具。首次在新机器上启动 worker 前,先运行:
bash scripts/check-dependencies.sh
bash scripts/check-dependencies.sh --backend claude-code --backend codex --check-gh
| 依赖 | 安装方式 |
|---|---|
git | 通常随开发环境提供 |
bash | 常规脚本需要 bash;pm-monitor.sh 需要 bash 4+ |
jq | macOS: brew install jqLinux: sudo apt-get install jq |
tmux | macOS: brew install tmuxLinux: sudo apt-get install tmux |
常见 Unix 工具如 awk、sed、grep、find、stat、date、mktemp 通常由系统提供;日期解析已兼容 macOS/Linux。
| 模式 | 依赖 |
|---|---|
| PR / mergeability 巡检 | gh,且需要已登录 |
| Claude Code worker | claude;第三方 provider 需要本地 settings 文件 |
| Codex worker | codex |
| OpenCode worker | opencode |
| Codex heartbeat | Codex App automation 能力;创建/修改 automation 必须使用 automation_update |
Claude 官方 agent view / --worktree --tmux | claude,必要时还需要 tmux |
scripts/terminal-split.sh 只在对应终端场景下需要额外工具:Kitty 需要 kitty @,WezTerm 需要 wezterm cli,macOS GUI 终端自动化依赖 osascript,Warp/Ghostty/Zed/Terminal.app 分屏或新标签能力取决于本机应用和辅助功能授权。
完整依赖矩阵见 references/02-runtime-dependencies.md。依赖检查脚本只报告状态,不安装软件、不启动 worker、不改配置。
只在需要细节时读取:
核心编排参考(机制 / 依赖 / 收口):
references/01-model-selection-matrix.md:模型与执行模式选择。references/02-runtime-dependencies.md:按模式拆分的本地依赖矩阵和安装建议。references/03-checkpoint-files.md:STATUS.json、RESULT.md、PATCH_SUMMARY.md 的字段和模板。references/04-sentinel-design.md:PM 巡检(sentinel)bash 模式设计与信号。references/05-legal-domain-patterns.md:法律项目拆解样例(诉讼/非诉阶段模型、任务字段、Agent 路由)。config/claude-provider-settings.example.json:Claude Code 第三方 API provider settings 模板。Agent CLI worker backend(先看总览,再查具体工具):
references/06-agent-cli-reference.md:本机所有 Agent CLI 完整参考手册(Claude Code / Codex / OpenCode / Hermes / Kimi / Gemini / QoderWork),含参数速查、tmux worker 模板、跨 CLI 对比矩阵和选用建议。references/07-qoderwork-cli-worker.md:QoderWork CLI(qoderclicn)作为 worker backend 的可行性研究,含 CLI 参数、模型列表、SDK 环境冲突、tmux 启动示例和适用场景。references/08-workbuddy-cli-worker.md:WorkBuddy / CodeBuddy CLI(codebuddy)作为 worker backend 的可行性研究,含 Kimi K2.6 书稿 worker 实测、权限模式、checkpoint/path 偏差和收口规则。实战经验与排障:
references/09-parallel-lessons.md:tmux/Agent Teams 实战坑点。references/10-agent-teams-troubleshooting.md:Agent Teams / agent view / Claude 原生 --worktree --tmux 后端排障。官方文档:
https://code.claude.com/docs/en/agent-viewhttps://code.claude.com/docs/en/worktreeshttps://code.claude.com/docs/en/cli-usagehttps://code.claude.com/docs/en/checkpointing脚本:
scripts/check-dependencies.sh:检查核心依赖、backend CLI、GitHub CLI 和终端分屏工具。scripts/render-runtime-profile.sh:按 backend/profile 生成 worker command、prompt context 和 spawn metadata。scripts/spawn-worker.sh:创建隔离 worktree、Session Context 和 tmux session,并输出启动 gate。scripts/pm-monitor.sh:自动 PM 巡检脚本,保留 checkpoint 文件、Agent Teams inbox、tasks、Git SHA、PR 状态、tmux session、Wave 和多信号进展监控。scripts/wait-worker.sh:单 worker 等待器,可接 Claude Code background Bash 或 Codex heartbeat automation。scripts/worktree-status.sh:单 worker 只读总览,展示 metadata、checkpoint、tmux 和 git 状态。scripts/clean-worktree.sh:worker session/worktree 安全清理,默认 dry-run,清理前展示 metadata 摘要。scripts/smoke-tmux-worker.sh:临时 repo 端到端 smoke test;只在修改 Skill 脚本后运行。scripts/smoke-provider-settings.sh:逐个验证 config/*.settings.json 能启动 Claude Code 并返回响应;新增或改 provider 后运行。scripts/lint-wait-script.sh:wait/monitor/custom wait 脚本 lint;只在修改 wait/monitor 脚本后运行。scripts/terminal-split.sh:可选可视化辅助,保留 iTerm2、Kitty、WezTerm、Warp、Ghostty、Zed、Terminal.app 支持;默认编排不依赖它。模板:
templates/worker-prompt.md:worker bootstrap 和完整派发 prompt 模板。templates/orchestration-goal.md:PM 级连续多 Wave Goal Contract 模板。templates/project-config.json:可选项目级编排配置模板,声明 trunk、任务源、验证命令、provider slot、非敏感配置复制和 hook 边界。templates/codex-heartbeat-wait.md:Codex App heartbeat 巡检 prompt。templates/wave-summary.md:每轮 Wave 收口和 provider/model 评估模板。templates/checkpoint-status.json:STATUS.json 模板。templates/checkpoint-result.md:完成/失败结果摘要模板。templates/checkpoint-patch-summary.md:PR review 用 diff 摘要模板。npx claudepluginhub cat-xierluo/legal-skills --plugin transcription-correctorSpawns isolated agents to execute independent working-tree tasks in parallel with wave-validity gating and disjoint file ownership checks.
Orchestrates multiple worktree agents using `workmux` CLI: spawn, monitor, communicate, and merge. Invoked via `/coordinator`, useful for parallelizing tasks across git worktrees.
Orchestrates consensus-loop sessions: reads handoffs, identifies unblocked tasks, distributes to parallel workers/agents, tracks assignments, manages corrections via SendMessage.