# Harness² 融合说明 状态:方法层(`cloud/harness2.py` + `cloud/tests/test_harness2.py` + `examples/harness2_demo.py`)与接线层(`cloud/harness2_tasks.py` + `cloud/tests/test_harness2_tasks.py` + `examples/harness2_run.py`) 均已落地,在独立分支 `feat-harness2`(已 rebase 到生产 #133 的 c757810)上,不碰主线与生产,**未合并、未部署**。控制台评审页 与 `auto_apply` 开关仍是下一步,见文末。 ## 上游是什么 Google Research 的 harness2(Apache 2.0,arXiv:2610.14224):模型权重 不动,只优化模型周围的 harness——系统提示、guardrails、记忆、工具 指引、子代理、技能、脚本、插件。两层递归: - 任务层:Propose–Probe–Compose。对同一任务提 INV(通用做法)与 DOM (领域做法)两类候选 harness,每个候选真实跑一次(探针),合成器 只把有行为证据支撑的改动合成终版;没有标准答案,靠行为对比。 - 经验层:采纳后反思出一条有证据的经验(cue / lesson / evidence), 连同被采纳 harness 的完整树存进分领域经验库,供后续任务参考。 上游报告:单步改进在三个专业 benchmark 上最高 +11.5 / +4.5 / +11.8 个点;k=5 并行递归在 WorkBuddy 上到 80.8。这些数字是上游 benchmark 上的,不是本项目的承诺——本项目没有 benchmark,接线后 必须先在自己的重复任务集上跑 base 对照,才能谈收益。 ## 融合映射:照搬 / 改写 / 不引 | 上游东西 | 本项目做法 | |---|---| | c1–c8 可编辑树(codex surface) | 照搬:AGENTS.md(8000 字符上限)、`.agents/skills/*/SKILL.md`、`.agents/skills/*/scripts/*`、`sub_agents/*/AGENT.md`、`scripts/*.py`、`.codex/hooks.json`;白名单外一律不读不写;校验含技能 description、触发行、脚本 compile、脚本引用存在、钩子 JSON 与事件名 | | Propose–Probe–Compose,parallel / sequential | 照搬语义,改写实现:`run_parallel` / `run_sequential`,提议被拒给一次按反馈修正的机会,再拒回落到当前 harness;探针失败记为死探针,不炸整轮 | | 匿名选择(只比产物) | 照搬:终版产物按任务+k+模式定种子洗牌匿名化,选择器看不到 harness 来源;选失败回落到已交付终版;k=1 且终版池只有唯一候选时 trivial 直出(与选择器是否提供无关;2026-10-29 对照纠正了此前“无选择器才 trivial”的误写) | | 经验库(分领域、整树 + EXPERIENCE.md + INDEX.md) | 照搬存储格式,改写生效语义:入库 ≠ 自动生效(见下) | | Ledger(会话/探针账本)与成本 | 改写:成本汇总进 `ModeResult.total_cost_usd`,由调用方接现有 `cloud/cost.py` / 租户配额计费;另有 `budget_usd` 超支门与 `max_sessions` 会话数门(计探针 + 阶段尝试会话;edit 内 fmt2 纠正与选择/反思会话不计入):任一超支后不再调用编辑器/探针,剩余阶段回落,且该轮不入库;上游的 R=4k/P=3k 事后强校验未引(本项目结构与上游计数不完全同构,门控代替断言) | | run_tag 形状与建任务前预检 | 对照补齐:`validate_run_tag`(字符集、首字符不为 -、不以 s 数字段开头)与 `preflight_checks`(base 目录与 AGENTS.md、source 目录、提示、tag、控制面 health 探针);CLI `--check` 只预检不建任务 | | 分角色模型(SOLVER / IMPROVER / JUDGE) | 已引(机制):`run_improvement_via_tasks` 的 `role_models`(probe / editor / selector / reflector)+ CLI `--model-<角色>`;非空值覆盖该角色,缺键回落共享 `--model`,两者都空走服务端默认——默认行为不变,模型选择权仍在调用方(有价模型产生真实成本) | | 产物资产(deliverable_files / deliverable_assets / images)与选择 assets note | 已引(两层):①服务端 `GET /tasks/{id}/files`(任务 worktree 读取,路径安全解析、文本 ≤256KB、列表 ≤200 条;本地任务走本地 worktree,租户 Docker 任务走 `tenants/<项目>/work/host-worktrees/<任务id>`——worker 按任务建子目录,只 serves 任务级子目录、绝不 serves 共享的 `/app/work` 本身;cloud/跨机任务 409);②探针回复里的 `DELIVERABLE FILE` 块(所有执行器可用,端点结果优先、坏块丢弃不炸轮次)。产物进 `Rollout.deliverable_files`,并写入选择/编辑/反思上下文的 `deliverables/