Ruflo harness-learn:用 `metaharness learn` 跑通 GEPA 学习循环,让 Harness 策略从手写 Prompt 走向受测进化

发布时间:2026/10/14 21:37:27
Ruflo harness-learn:用 `metaharness learn` 跑通 GEPA 学习循环,让 Harness 策略从手写 Prompt 走向受测进化
Ruflo harness-learn用metaharness learn跑通 GEPA 学习循环让 Harness 策略从手写 Prompt 走向受测进化【免费下载链接】ruflo The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo在 ruflo 的 metaharness 集成插件中harness-learn技能把上游metaharness learnupstream ADR-235metaharness0.3.0这一 GEPA 学习循环暴露为一条可脚本化、可结构化解析的命令它针对 SWE-bench 风格的 slice manifest 优化 harness 策略基因组genome默认是 $0 的 dry-run 报价只有显式传入--run才会产生模型调用与 Docker 沙箱开销。读完本文你将掌握该技能的完整参数语义、checkout 前置条件与checkout-required/degraded两类结构化报告的区分方法、默认超时策略以及从 learn.mjs 与 _harness.mjs 源码看版本钉扎、硬超时与优雅降级的实现细节。它解决什么问题从手动调 Prompt 到受测进化harness-learn 技能定义将 GEPAgenetic-evolution prompt-adaptation遗传进化式的 Prompt 自适应定位为一个“学习”而非“生成”操作候选策略genome在保留 sliceheld-out 任务切片上被打分只有实测胜出者才会被晋升promote。技能文档中给出的第一个真实晋升案例是随包发布的 cand-6 基因组holdout gold 从 2/12 提升到 3/12且零回归。这意味着它面向的使用动机与手工迭代 Prompt 有本质区别策略 Prompt 在某个任务家族上表现不佳你想要的是一套“可测量的改进循环”而不是一次次凭手感改 prompt。GEPA 把每个候选放在 held-out 切片上打分避免了“在训练任务上调好、换个任务就翻车”的过拟合陷阱在真正花钱之前先给一次学习运行“报价”——默认的 dry-run 只解析 slice manifest 并报告成本不发起任何模型调用适合在提交预算前评估一次学习循环的规模在一次 learn 运行晋升了 genome 之后配合harness-gepa --op render查看被晋升策略实际编译出的 system prompt——harness-gepa 技能明确建议“读 render 出来的 prompt而不是裸读 genome JSON”因为行为存在于渲染后的 Prompt 与组件交互中而不是原始字段里。前置条件为什么learn需要一个本地 metaharness checkout与其他 metaharness 技能不同learn的上游实现GEPA SWE-bench Docker 沙箱对 ruflo 的 npm 包来说太重无法随 npm 包一起发布。因此上游设计上要求本地克隆一份 metaharness 仓库git clone https://github.com/ruvnet/metaharness.git node scripts/learn.mjs --repo ./metaharness --host claude-code --model haiku --slice slices/lite.json仓库内定位 checkout 的优先级是--repo参数 → 环境变量$METAHARNESS_REPO→ 当前就运行在克隆目录内。learn.mjs 把--repo通过env: { METAHARNESS_REPO: ARGS.repo }传给上游子进程上游据此找到学习基础设施。没有 checkout 时脚本不会报错而是输出一条结构化前置报告并以退出码 0 结束{ status: checkout-required, hint: git clone https://github.com/ruvnet/metaharness.git, then re-run with --repo /path/to/metaharness (or set METAHARNESS_REPO). The learning harness (GEPA SWE-bench Docker) is not shipped in the npm package., dryRun: true, durationMs: 0 }这一点在 learn.mjs 的检出消息检测逻辑中由正则CHECKOUT_RX /requires a metaharness repo checkout/i实现——它匹配上游输出中的提示文本然后转成上述 JSON 并process.exit(0)。技能文档特意强调这是一种“前置条件报告不是错误”与degraded: true表示 npm 包本身缺失、优雅降级路径被触发是两种不同的语义。至于“托管服务路径”gateway 侧的 learn 作业、无需本地 checkout上游 ADR-235 将其列为后续跟进项在当前仓库对应的版本中尚不可用。CLI 参数完整的调用面技能的 argument-hint 是--host h --model m --slice manifest [--repo checkout] [--run] [--alert-on-fail]而 learn.mjs 的完整参数解析还支持--format默认json与--timeout-ms。逐项说明参数必填说明--host h否目标宿主 harness例如claude-code、codex逐字透传给上游metaharness learn --host--model m否学习所用的模型 id如haiku透传--model--slice manifest否SWE-bench 风格 slice manifest 的 JSON 路径候选基因组将在其 held-out 切片上被打分--repo checkout否metaharness 仓库克隆路径先经existsSync校验路径不存在直接退出码 2再导出为$METAHARNESS_REPO--run否唯一的花费开关spend opt-in。不传则是 $0 dry-run传了才产生模型调用 Docker 沙箱开销--alert-on-fail否learn 运行报告失败时以退出码 1 结束供 CI/钩子消费默认只报告不报警--format否输出格式默认json--timeout-ms否覆盖子进程硬超时不传时按--run与否取 600s / 120s 默认值参数组装后main() 把learn --host --model --slice [--run]交给runMetaharnessAsync调用上游二进制。注意一个刻意的设计由于上游 0.3.x 各版本对--json的支持不一致learn路径显式传入json: false不注入--json旗标改为在输出端做“宽容解析”见下文第 5 步。典型的端到端调用# 1) 免费报价解析 slice、估算成本无任何模型调用 node scripts/learn.mjs --host claude-code --model haiku --slice slices/lite.json # 2) 带 checkout 的显式花费运行 node scripts/learn.mjs --repo ~/src/metaharness --host codex \ --model gpt-5-mini --slice slices/lite.json --run --timeout-ms 3600000算法五步从参数校验到结构化报告技能文档给出的算法骨架与 learn.mjs 源码逐条对应第 1 步校验并导出--repo。若给了--repo但路径不存在直接打印错误并process.exit(2)配置错误语义区别于运行失败存在则通过环境变量$METAHARNESS_REPO导出给上游。第 2 步调用钉扎版本的metaharness二进制。上游版本钉在metaharness~0.3.0tilde 范围只允许补丁级更新解析顺序是“已安装的本地包 → 一次性版本化缓存”永不使用latest。这一层由 _harness.mjs 的resolveMetaharnessBins实现源码注释把动机写得很直白latest是一个 HIGH 级安全隐患——上游一旦发布被污染的包下一次技能调用就会在用户机器上执行任意代码同时它还给每次调用强加一次 npm 注册表元数据检查。钉扎后解析要么命中node_modules中满足 pin 的本地安装零成本向上查找要么触发一次npm install --prefix ~/.ruflo/metaharness-cache-pin的缓存安装之后每次调用都是纯粹的node abs-path-to-cli本地 spawn零网络。两个 bin 入口metaharness与harness均从解析出的 package.jsonbinmap 读取而非硬编码避免钉扎范围内上游布局变动悄悄打断调用链见 readBinMap。第 3 步默认超时。defaultTimeoutMs() 返回ARGS.run ? 600_000 : 120_000——dry-run 只受仓库扫描而非模型调用支配120 秒足够--run的 600 秒被源码注释明确定位为“小切片的下限不是预算”。真实的大切片运行应当显式传--timeout-ms其量级应匹配“slice 大小 × 单任务模型成本”。第 4 步检出缺失检测。合并 stdout/stderr 后匹配CHECKOUT_RX命中即输出checkout-required结构化载荷并退出 0前文已述。第 5 步宽容解析上游报告。上游learn输出人类可读的报告是否附带 JSON 不确定。learn.mjs 用正则提取 stdout 中所有{...}块并从最后一个开始尝试JSON.parse解析成功放入report字段全部失败则把原始报告文本截断到 20,000 字符放入rawReport——“即使上游没吐 JSON原始报告本身也是交付物”。最终 stdout 上是一个统一的结构化对象{ status: ok, dryRun: true, exitCode: 0, report: { …: 上游 JSON若存在 }, rawReport: 仅在上游无 JSON 时出现, durationMs: 843 }MCP 工具入口metaharness_learn的 120 秒预算除了直接跑脚本learn还通过 MCP 工具metaharness_learn暴露给 Agent。该工具定义在 metaharness-tools.ts输入 schema 与 CLI 一一对应host、model、slice、repo、run、alertOnFail、timeoutMshandler 只做参数映射后转发给插件脚本learn.mjs——CLI 命令入口 commands/metaharness.ts 的动词表中learn同样映射到learn.mjs。这条“MCP 工具 → 插件脚本 → 上游二进制”的链路保证了 ADR-150 的架构约束MCP 工具文件对metaharness/*的静态导入为零所有调用都留在_harness.mjs子进程桥后面。技能文档的 Cost note 在此有具体含义--run是唯一会花钱的路径——dry-run、checkout 探测、degraded 路径全部 $0而 MCP 工具侧的子进程预算只有 120 秒真正的学习循环应当从终端跑ruflo metaharness learn ... --run --timeout-ms big退出码与成本语义三种“没跑成”的精确区分退出码语义learn.mjs 尾部0— 产出了报告或 dry-run、checkout-required、degraded。脚本“按设计运行并告诉了你下一步该做什么”这些都是正常状态而非失败1— 传了--alert-on-fail且上游 learn 运行报告失败exitCode ! 0供自动化流水线把“学习没成”当作一等错误处理2— 配置错误--repo路径不存在等参数级问题。加上两条降级语义调用方能精确区分五种“没得到学习结果”的原因状态语义是否花钱下一步status: okreport/rawReport上游正常运行并出报告取决于--run检查报告status: checkout-required缺本地 metaharness 克隆否clone 后加--repo重跑degraded: true, reason: metaharness-not-availablenpm 包缺失/不可安装优雅降级否检查 optionalDependencies 安装子进程超时classifyDegraded归类超过timeoutMs硬超时被杀可能调大--timeout-msstatus: failedexitCode ≠ 0上游运行失败是--run时视--alert-on-fail决定是否以 1 退出其中“优雅降级”是整个 ruflo-metaharness 插件的承重约束ADR-150ruflo 在移除全部 MetaHarness 包后必须仍可运行。每个脚本捕获MODULE_NOT_FOUND/网络失败输出{ degraded: true, reason: metaharness-not-available }并以 0 退出——降级是默认行为而非特殊分支_harness.mjs 的degradedResult统一构造该载荷退出码 127、degraded: true并由emitDegradedJsonAndExit供各技能脚本直接复用。晋升之后与harness-gepa --op render配对一次 learn 运行若晋升了新 genome文档建议的下一步是“配对harness-gepa --op render检查被晋升策略到底说了什么”。harness-gepa走的是另一条通道——它不经过 CLI 二进制而是 dynamic-importmetaharness/darwin/gepa库入口本地解析优先~/.ruflo/darwin-cache-0.8.0版本化缓存兜底支持genome加载校验默认即随包 cand-6、validate结构校验可--alert-on-invalid作为 CI 门禁、rendergenome → 编译出的 system prompt、analyze按 GEPA 失败分类学对运行 transcript 分类失败模式。值得注意的边界gepaOptimize自带 evaluator 的优化循环因 evaluator 是 in-process 回调、无法跨子进程边界刻意保留为 library-only沙箱打分的进化应走harness-evolve。小结harness-learn的设计可以概括为三句话dry-run 免费报价--run显式花钱checkout 缺失与包缺失都以结构化 JSON 退出码 0 报告把“前置条件未满足”与“运行失败”严格分开版本钉扎 硬超时 优雅降级由 _harness.mjs 统一提供使这一上游学习循环在 ruflo 中始终是一个可随时移除的增强件而非运行时硬依赖。对读者而言最短路径是先跑一次不带--run的报价120 秒内、$0拿到 slice 规模与成本报告确认可接受后从终端以--run --timeout-ms big执行真实学习循环再用harness-gepa --op render审阅被晋升的基因组。【免费下载链接】ruflo The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考