{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
Dynamic Workflow
代码内计划扇出、对抗验证、波次。
Skill 元数据
| 来源 | 可选——用 hermes skills install official/autonomous-ai-agents/dynamic-workflow 安装 |
| 路径 | optional-skills/autonomous-ai-agents/dynamic-workflow |
| 版本 | 2.0.0 |
| 作者 | Teknium + Hermes Agent |
| 许可证 | MIT |
| 平台 | linux, macos, windows |
| 标签 | orchestration, fan-out, subagents, delegation, verification, migration, audit, research, campaign |
| 相关 skill | hermes-agent、simplify-code |
参考:完整 SKILL.md
以下是 Hermes 在触发该 skill 时加载的完整 skill 定义。这是 agent 在 skill 激活时所看到的指令内容。
Dynamic Workflow Skill
把大扇出工作作为工作流运行:计划、循环和每个中间结果住在脚本和磁盘上,因此父上下文只持已验证结果。覆盖一次性扇出、对抗收敛(尝试 + 反驳者)和整合数十 worker 分支的多波战役。它不使 delegate_task 跨重启持久;那是看板 swarm 的事。
何时使用
当工作单元清晰(一个文件、一个端点、一条记录)且单元数超过一个上下文容量时用它。约 10 单元以下或串行链跳过。对 hermes-agent 自身的重构或修复战役,并行加载 hermes-agent(开发工作流);本 skill 拥有扇出形态。
前置条件
delegate_task可用,且delegation.max_concurrent_children为波次调好(默认 10;运行时会以明确错误拒绝更大的tasks=[],而非排队)。仅当子代理须自己扇出时delegation.max_spawn_depth >= 2。
- 从 terminal 环境临时目录解析的可写运行目录(
$TMPDIR,否则平台临时目录)。绝不字面/tmp:Termux 无此目录,原生 Windows 会坏。用<tmp>/wf_<name>_<uuid>/,每次运行唯一,使中断的早先运行不留过期输出被误读。 execute_code用于确定性层(其内仅有web_search、web_extract、read_file、write_file、search_files、terminal、patch)。
运行方式
两层,按真实能力边界分:
A 层——execute_code 脚本 | B 层——delegate_task 批 | |
|---|---|---|
| 用于 | 确定性工作:抓 N URL、解析 N 文件、跑 N 命令、模板化 N 输出、构建清单、合并输出 | LLM 判断工作:分类、评审、决定、写、反驳、重构一个单元 |
| 持有 | 循环、分支、中间变量 | 无;一次带 tasks=[...] 调用,每任务自己隔离 agent |
| 工具 | 上面沙箱集;它不能调 delegate_task | 父工具集,原样继承(无逐任务收窄);子代理丢 delegate_task、clarify、memory、send_message、cronjob_manage |
| 并发 | 你的(ThreadPoolExecutor、批) | 由 delegation.max_concurrent_children 限定 |
| 成本 | 仅工具调用 | 每任务一棵完整 agent 树;线性倍增 |
先在 A 层做确定性部分,仅把不可约 LLM 步骤扇出到 B 层,在父上综合。
后台优先:结果作为消息重入
顶层 delegate_task 立即返回,每任务一个句柄;每个子代理结果完成时作为新消息重入对话。你不能在调用下一行读 out_*.csv。完成不依赖子代理的事,给一行状态,然后结束你的轮次;结果消息落地时逐个处理。普通后续用户消息不取消子代理;/stop、/new 和进程退出会。仅编排者子代理(深度 > 0)发出的委派是同步的。
快速参考
- 单元必须在无兄弟输出下可答,否则是串行。
- 清单:
<run>/manifest.jsonl每行一单元;打印计数 + 运行目录。 - 每子代理:约 8-12 处机械编辑,或约 2-3k 行阅读,或约 50-70 KB 语料;按最大单元定大小。结构化输出进文件,绝不进
summary字段(负载下截断);用分隔符分行而非 JSON。 - 父在合并前验证文件数和逐运行新鲜度。
- "stalled" 子代理通常已完成写入;先查文件系统。
- 先范围切片(一目录、20 记录),报告 token 成本,再扩展。
流程
一次性扇出
- 分解为独立单元。
- A 层预遍写清单。
- 对照上述限制定块大小;任务数超过
max_concurrent_children时自己发有界波次。 - B 层:一次
delegate_task(tasks=[...]);每任务读自己切片,写<run>/out_<i>.csv,打印状态词,停。 - 结束轮次。结果消息到达时,读文件、验证、合并;横切综合留在父上。
对抗收敛(发现质量工作)
- 独立尝试:同一问题给 N 个子代理(2-4),每个
context用不同框架,每个每行写一条论断到<run>/attempt_<i>.md。仅定位、可单独证伪的论断("src/routes/users.ts:142中POST /api/users/:id/role无角色检查");反驳者打不破"认证层有问题"。 - 在父上合并去重;记每论断的一致数。
- 反驳者:第二批奉命用反证打破每论断,发
claim_idx|survives|counter_evidence。给它们来源,不给尝试的推理。 - 仅呈交存活者;以一行理由丢弃被驳论断。
- 把第 2 轮新论断再喂一轮反驳;某轮无存活者时停,封顶 3 轮。
同一机制保护父免受自己错误前提:当你给子代理一个启发式("facade 上每个 patch 目标都是死接缝"),告诉它们在行动前用证据反驳它。四个小队这样做,把 647 处的 blanket 重写变成 59 个真实修复,保住 130+ 绿测试。
战役形态(数十 worker、数波、数小时)
一次性配方扩展不到全代码库遍历。有效的是:
- 先度量(LOC、热点、死符号、oracle 语料),写一份共享
BRIEF.md加每簇task_<cluster>.md。每个子代理读两者。舰队漂移时(子代理削 docstring 而非删代码),一次 patch brief 并转向;重派子代理继承修复。 - 排他所有权:每 worker 一簇文件,其外编辑在集成时丢弃。单文件内子扇出拥有行范围,在范围内定义 helper,使 diff 干净合并。
- 每验证步骤本地 commit,不 push、不 PR、不子代理 rebase。已提交状态是唯一交接;每个战役中途死掉的 worker 恰好丢它未提交的尾部。共享 worktree 索引的 worker 仅用
git commit -- <paths>提交;裸 commit 会卷走兄弟暂存的 hunk。 - 舰队规模 12-16 并发。单一 OAuth grant 上约 40 进程以上,每小时 token 刷新会踩踏成 401 并杀掉波次。其余排队。
- 父存活性:报告
completed但只有几十行日志、或其分支 0 commit 的子代理并未完成;找它的子分支或用前驱的 worktree 和 diff 重派。 - 逐轮集成:冻结 base SHA,机械 rebase 干净分支,给每个冲突分支自己的 rebase worker("main 行为胜出,在新结构内重应用"),合并到一个集成分支,在合并树上跑全套测试。每个分支单独通过的碰撞只在这里出现。下轮从集成 commit 分支,使其 worker 互不冲突。
- 宣布一轮集成前:每个分支
git rev-list --count <integration>..<branch>为 0。worker 在你合并其 tip 后继续提交;六个切片跨 168 commit 曾这样被丢下。 - 测试运行:机器上恰好一个 runner,在锁文件后,高
-j。多个并行低-jrunner 更慢且互相杀进程组。红文件在同一 venv 的裸origin/mainworktree 重跑;逐文件失败集相同的是既有,非你的。 - 末尾 forward-port,而非逐轮:冻结 main SHA,按目录把冲突文件扇出给编辑一个无 commit merge worktree 的 worker,然后父提交一次 merge。CI 从不在冲突 PR 上跑,因此每次 push 前重 merge main。
- 实时 QA 自成一波:每表面一小队,隔离
HERMES_HOME,检查前写期望,证据落盘,仅报告,且 PR-vs-main 差异才算回归。绿单元测试漏了那一个 P0(无测试覆盖的已登录代码路径)。 - 评审者论断受与子代理论断同等待遇:在"恢复"任何东西前对照 base 做 A/B。几个自信陈述的评审 delta 在 base 上早已如此。
- 父重启需
HANDOFF.md:为何死、哪些句柄死、逐分支记分卡(LOC delta、import 冒烟、目标测试)和确切重派文本。先把每个脏 worktree 快照成wip:commit。
常见陷阱
- 在
execute_code脚本内调delegate_task:不在沙箱里。 - 与扇出调用同轮综合:文件还不存在。
- 承诺
delegate_task后台持久数天:它轮次作用域,随进程死。持久图 = 看板 swarm;一次性 =cronjob。 - 信
summary拿内容,或信status=completed拿完成。 - 每个"独立"尝试同框架:它们塌成一个答案。
- worktree 战役里任何地方
git stash:refs/stash跨 worktree 共享,另一 worker 会 pop 你的编辑。经临时 worktree 比较。 - 诚实数字更低时却报命中目标数。说"目前 16%,这是到 30% 的路径",跑下一轮。
验证
- 清单行数匹配预期单元数。
- 每个
out_*.csv存在且本次运行写入。 - 每个丢弃论断有记录反证;每个呈交论断经反驳。
- 战役:每分支 0 未合并 commit,集成树全套测试且红对照裸 main 分拣,每表面实时 QA 报告,范围切片在全量运行前报告 token 成本。