研究提案

HarnessForge v2:6-Agent 代码任务数据工厂(可执行规格书)

从精选 GitHub Repo 的 release 历史中,通过 6 个 Agent 协作流水线,批量生产带完整探索轨迹的中高难度代码开发任务。本文档是可直接交给 Coding Agent 执行的完整规格书。

HarnessForge 数据生产 多Agent 代码任务 RL训练 可执行规格书

HarnessForge v2:6-Agent 代码任务数据工厂

本文档的定位:这不是研究论文,是可执行规格书。给到 OpenClaw / Claude Code / 任何 Coding Agent,它应该能直接按照本文档搭建并运行整个流水线。

与 v1 的关系:v1(HarnessForge 原始 proposal)是从”反向重建 repo 演进历史”出发的研究性设计。v2 是从”数据生产实操”出发的简化版——砍掉 PR 聚类等复杂步骤,直接利用 release tag 作为 ground truth,6 个 Agent 角色分工清晰,流水线可串行执行。


一、目标

批量生产格式为 (环境, 任务描述, test, solution) 的代码开发任务数据,用于 Coding Agent 的 RL / SFT 训练。

每条数据包含:

  • Docker 环境(可复现)
  • 自然语言任务描述(PM 视角,不暴露实现)
  • 测试套件(可自动验证 pass/fail)
  • Solution(Dev 的完整开发轨迹,含探索、失败、回退、被提示后调整方向)
  • 渐进提示序列(L0-L2,用于构造 DPO 对)
  • 难度标签(基于 Dev 是否需要提示才能完成)

目标规模:首批 30 个 repo → 3,000-5,000 个 verified tasks


二、总体架构

阶段 1:任务设计(离线,每个 repo 一次)
┌─────────────┐     ┌──────────────┐
│ Repo         │────→│ Task         │────→ task_blueprints/
│ Selector     │     │ Designer     │      {repo}-blueprints.yaml
└─────────────┘     └──────────────┘

阶段 2:任务执行(在线,每个 task 一次)
┌──────┐     ┌──────┐     ┌──────┐
│  PM  │────→│ Dev  │←───→│ Test │
└──────┘     └──────┘     └──────┘
   │              ↑            │
   └── hint ──────┘            │
   ←── 失败反馈 ───────────────┘

阶段 3:质检输出(离线,批量)
┌──────────┐
│ Reviewer │────→ verified_tasks/
└──────────┘      {task-id}.yaml

三、Agent 1: Repo Selector

职责

从 GitHub 筛选适合生产任务数据的仓库。

执行步骤

# 1. 从种子列表开始(人工提供,见下方)
# 2. 对每个候选 repo 执行以下检查:

筛选条件(全部必须满足):

条件检查方式阈值
有 CI检查 .github/workflows/ 或 .circleci/必须存在
测试覆盖运行 pytest --co -q 或等价命令,统计测试数≥ 50 个测试
近 6 月活跃git log --since="6 months ago" --oneline | wc -l≥ 100 commits
代码规模cloc --json 统计核心语言行数10K-500K 行
有 release taggit tag -l "v*" | wc -l≥ 3 个 release
依赖可锁定检查 requirements.txt / package-lock.json / go.sum必须存在
环境可构建尝试构建并运行测试必须通过

种子列表(30 个):

python:  # 12 个
  - django/django
  - pallets/flask
  - tiangolo/fastapi
  - psf/requests
  - pandas-dev/pandas
  - scikit-learn/scikit-learn
  - pydantic/pydantic
  - celery/celery
  - encode/httpx
  - sqlalchemy/sqlalchemy
  - pytest-dev/pytest
  - python-poetry/poetry

typescript:  # 10 个
  - microsoft/TypeScript
  - vercel/next.js
  - prisma/prisma
  - trpc/trpc
  - vitejs/vite
  - vitest-dev/vitest
  - remix-run/react-router
  - drizzle-team/drizzle-orm
  - colinhacks/zod
  - date-fns/date-fns

go:  # 5 个
  - gin-gonic/gin
  - go-chi/chi
  - stretchr/testify
  - spf13/cobra
  - hashicorp/terraform

rust:  # 3 个
  - tokio-rs/tokio
  - serde-rs/serde
  - clap-rs/clap

输出

# repos/selected-repos.yaml
repos:
  - name: "django/django"
    language: "python"
    releases: ["4.0", "4.1", "4.2", "5.0", "5.1"]
    test_cmd: "python -m pytest tests/ -x -q --tb=short"
    setup_cmd: "pip install -e ."
    loc: 285000
    test_count: 16842
    status: "selected"
  - name: "vitejs/vite"
    language: "typescript"
    # ...

四、Agent 2: Task Designer

职责

分析每个 repo 的 release 历史,设计具体的开发任务。每个任务对应一个”从版本 A 到版本 B 的某个 feature 开发”。

执行步骤

对每个 selected repo:

1. 列出所有 release tag,按时间排序
2. 对相邻的两个 release(v_old → v_new):
   a. 读取 release notes / changelog
   b. 读取两个版本之间的所有 commit 和 PR
   c. 识别 3-5 个有挑战性的 feature(标准见下)
   d. 对每个 feature:
      - 确定 base_commit(v_old 对应的 commit)
      - 确定 target_commit(feature 完成后的 commit,通常是 v_new 或中间某个 merge commit)
      - 从 target_commit 的 diff 中提取涉及的文件和测试
      - 设计验证方式:哪些测试在 base 上应该 FAIL,在 target 上应该 PASS
      - 确定运行环境
3. 环境验证(关键!):
   a. 在 Docker 中 checkout base_commit
   b. 安装依赖,确认能构建
   c. 运行测试框架,确认基础环境正常
   d. 如果有 target_commit,验证测试在 target 上 PASS

Feature 挑选标准:

标准说明原因
涉及 ≥3 个文件git diff --stat 查看太少的改动没有挑战
不是纯 refactor有新功能或行为变化纯重构难以写测试
有对应测试diff 中包含测试文件变更没测试的 feature 无法验证
不依赖外部服务不需要数据库/网络等沙箱环境限制
难度适中预估人类开发者 0.5-3 天太简单没价值,太难 Agent 做不出

输出

# task_blueprints/{repo}-blueprints.yaml
repo: "django/django"
language: "python"
blueprints:
  - task_id: "django-async-queryset-iter"
    base_commit: "abc123"           # v4.2.0
    base_version: "4.2.0"
    target_commit: "def456"         # v4.3.0 中的某个 merge commit
    target_version: "4.3.0"

    feature_summary: |
      QuerySet 支持异步迭代器 (async for),使得在 async view 中
      可以直接 `async for obj in MyModel.objects.filter(...)` 而不
      需要 sync_to_async 包裹。

    files_changed:
      - "django/db/models/query.py"
      - "django/db/models/sql/compiler.py"
      - "django/db/models/manager.py"
      - "tests/async/test_queries.py"

    verification:
      test_files: ["tests/async/test_queries.py"]
      test_cmd: "python -m pytest tests/async/test_queries.py -x -q"
      base_expected: "FAIL"    # 这些测试在 base 上应该失败
      target_expected: "PASS"  # 在 target 上应该通过
      base_verified: true      # 已实际验证
      target_verified: true    # 已实际验证

    environment:
      dockerfile: |
        FROM python:3.11-slim
        WORKDIR /workspace
        COPY . .
        RUN pip install -e ".[dev]"
      setup_cmd: "pip install -e ."
      test_cmd: "python -m pytest tests/async/test_queries.py -x -q"

    ground_truth:
      diff_file: "diffs/django-async-queryset-iter.patch"
      commit_count: 3        # 跨 3 个 commit
      additions: 245
      deletions: 12

    estimated_difficulty: 4   # 1-5

  - task_id: "django-json-field-lookups"
    # ...

五、Agent 3: PM

职责

  1. 把 Task Designer 的技术 blueprint 重写为用户/产品经理视角的需求描述
  2. 准备 3 级渐进提示
  3. 在 Dev 执行过程中,感知 Dev 状态,在 Dev 多次失败时释放提示

PM 的需求重写规则

输入:Task Designer 的 blueprint(含技术细节)
输出:PM 视角的任务描述(隐藏实现细节)

规则:
1. 描述"做什么"(期望行为),不说"怎么做"(实现方式)
2. 不给文件路径、不给代码片段
3. 包含背景动机(为什么要做这个 feature)
4. 包含明确的验收标准(可观测的行为)
5. 可以包含合理的约束(向后兼容、性能要求等)

示例转换:

技术 blueprint:
  "QuerySet 支持异步迭代器,修改 query.py 和 compiler.py"

PM 重写后:
  "## 背景
   我们的异步 Web 视图中大量使用了 sync_to_async 包裹数据库查询,
   代码冗长且容易出错。用户多次反馈希望能直接在 async 上下文中
   迭代查询结果。

   ## 需求
   让 QuerySet 支持 `async for` 语法,在异步视图中可以直接:
   ```python
   async for article in Article.objects.filter(published=True):
       ...

验收标准

  1. async for obj in queryset 正常工作
  2. 支持切片、filter 等链式操作后的异步迭代
  3. 同步使用方式不受影响(向后兼容)
  4. 新增测试覆盖上述场景”

### PM 的渐进提示设计

对每个任务准备 3 级提示:

```yaml
hints:
  L0: []  # hard 模式,零提示

  L1:     # 方向级:告诉 Dev 大致在哪个方向
    - "这个功能的核心在于让数据库查询支持 Python 的异步迭代协议"
    - "你需要关注 ORM 层的查询编译器如何生成和执行 SQL"

  L2:     # 模块级:告诉 Dev 具体涉及哪些文件和关键点
    - "核心改动在 django/db/models/query.py —— QuerySet 需要实现 __aiter__ 和 __anext__"
    - "compiler.py 的 execute_sql 需要支持异步数据库连接"
    - "参考现有的 sync 版本 __iter__ 实现作为起点"

PM 感知 Dev 状态的协议(关键设计)

PM 不是定时释放提示,而是根据 Dev 的实际状态决定是否介入。

pm_intervention_protocol:

  # PM 如何感知 Dev 状态
  monitoring:
    # PM 在 Dev 执行过程中持续接收以下信号:
    - test_results: "每次 Dev 运行测试后的 pass/fail 结果"
    - edit_count: "Dev 累计修改代码的次数"
    - files_touched: "Dev 修改过哪些文件"
    - direction_changes: "Dev 是否推翻了之前的方案"
    - explicit_help_request: "Dev 是否主动说'我需要帮助'"

  # 提示释放规则
  hint_release_rules:

    rule_1_consecutive_test_failures:
      trigger: "Dev 连续 3 次运行测试且均失败,且每次失败的 error 相同或相似"
      action: "释放 L1 提示"
      rationale: "Dev 卡在同一个问题上,需要方向指引"

    rule_2_thrashing:
      trigger: "Dev 在 2 个不同方向之间来回切换超过 2 次(修改→回退→修改→回退)"
      action: "释放 L1 提示"
      rationale: "Dev 迷失方向,需要定位"

    rule_3_wrong_direction:
      trigger: "Dev 已经修改了 5+ 个文件但测试通过数没有增加"
      action: "释放 L1 提示"
      rationale: "Dev 在错误方向上越走越远"

    rule_4_l1_ineffective:
      trigger: "释放 L1 后 5 轮内,Dev 仍然无法让任何新测试通过"
      action: "释放 L2 提示"
      rationale: "方向提示不够,需要更具体的指引"

    rule_5_explicit_request:
      trigger: "Dev 的 think 中出现'I'm stuck'、'not sure where to look'等表达"
      action: "释放当前未释放的最低级别提示"

    rule_6_never_intervene_too_early:
      constraint: "Dev 至少执行 8 轮(含至少 2 次测试运行)后,PM 才可以开始介入"
      rationale: "给 Dev 足够的自由探索空间"

  # PM 释放提示的消息格式
  hint_message_format: |
    [PM 反馈]
    你已经尝试了几种方案但都没有通过。这里有一些额外信息可能对你有帮助:

    {hint_content}

    请根据这个信息重新考虑你的方案。

  # 关键:记录提示释放时刻的完整上下文
  recording:
    on_each_hint_release:
      - turn_number: int          # 第几轮释放的
      - hint_level: "L1" | "L2"
      - trigger_rule: string      # 哪条规则触发的
      - dev_state_snapshot:        # Dev 当时的状态快照
          files_modified: [string]
          test_results_history: [{ pass: int, fail: int }]
          total_edits: int
      - dev_response_in_next_3_turns:  # Dev 收到提示后的反应
          direction_changed: bool
          new_files_touched: [string]
          test_improvement: bool

PM 的实现方式(给 Coding Agent 的指令)

# pm_agent.py — PM Agent 的核心逻辑

class PMAgent:
    """
    PM Agent 在 Dev 执行过程中作为观察者存在。
    它不主动干预,只在特定条件触发时释放提示。
    """

    def __init__(self, task_blueprint, hints):
        self.hints = hints           # {L0: [], L1: [...], L2: [...]}
        self.current_hint_level = 0  # 当前已释放的最高级别
        self.dev_turns = 0           # Dev 已执行的轮数
        self.test_history = []       # [(pass_count, fail_count), ...]
        self.consecutive_same_failures = 0
        self.direction_changes = 0
        self.hint_log = []           # 记录每次提示释放

    def observe_dev_turn(self, turn_info):
        """
        每次 Dev 执行一轮后调用此方法。
        turn_info 包含: action_type, test_result (if any),
                        files_touched, think_content
        """
        self.dev_turns += 1

        # 更新测试历史
        if turn_info.get("test_result"):
            result = turn_info["test_result"]
            self.test_history.append(result)
            self._check_consecutive_failures(result)

        # 检查是否需要介入(至少 8 轮后)
        if self.dev_turns < 8:
            return None

        hint = self._evaluate_intervention(turn_info)
        if hint:
            self.hint_log.append({
                "turn": self.dev_turns,
                "level": f"L{self.current_hint_level}",
                "trigger": hint["trigger"],
                "dev_state": self._snapshot_dev_state()
            })
        return hint

    def _evaluate_intervention(self, turn_info):
        """评估是否需要释放提示"""

        # Rule 1: 连续 3 次相同失败
        if self.consecutive_same_failures >= 3 and self.current_hint_level < 1:
            self.current_hint_level = 1
            return {
                "trigger": "consecutive_test_failures",
                "content": self._format_hint(1)
            }

        # Rule 4: L1 释放后 5 轮仍无进展
        if (self.current_hint_level == 1 and
            self._turns_since_last_hint() >= 5 and
            not self._any_test_improvement_since_hint()):
            self.current_hint_level = 2
            return {
                "trigger": "l1_ineffective",
                "content": self._format_hint(2)
            }

        # Rule 5: Dev 明确求助
        if self._dev_is_stuck(turn_info.get("think_content", "")):
            next_level = self.current_hint_level + 1
            if next_level <= 2:
                self.current_hint_level = next_level
                return {
                    "trigger": "explicit_request",
                    "content": self._format_hint(next_level)
                }

        return None

    def _format_hint(self, level):
        hints_at_level = self.hints.get(f"L{level}", [])
        content = "\n".join(f"- {h}" for h in hints_at_level)
        return (
            f"[PM 反馈]\n"
            f"你已经尝试了几种方案但都没有通过。"
            f"这里有一些额外信息可能对你有帮助:\n\n"
            f"{content}\n\n"
            f"请根据这个信息重新考虑你的方案。"
        )

六、Agent 4: Dev

职责

在 Docker 沙箱中执行开发任务,记录完整探索过程。

沙箱配置

sandbox:
  runtime: "docker"
  base_image: "根据语言选择 python:3.11-slim / node:20-slim / golang:1.22 / rust:1.78"
  network: "none"             # 禁止网络访问
  resources:
    cpu: 2
    memory: "4g"
    timeout: "30min"          # 单个任务最长 30 分钟
  mount:
    - "{repo_checkout}:/workspace:rw"
  workdir: "/workspace"

Dev 可用工具

tools:
  - name: "read_file"
    description: "读取文件内容"
  - name: "write_file"
    description: "写入/覆盖文件"
  - name: "edit_file"
    description: "精确替换文件中的指定内容"
  - name: "list_dir"
    description: "列出目录内容"
  - name: "search"
    description: "在代码库中搜索文本(ripgrep)"
  - name: "bash"
    description: "执行 shell 命令(包括运行测试)"
  # 禁止:web_search, web_fetch(纯离线)

Dev 执行协议

1. 读取任务描述
2. 浏览项目结构(list_dir, read_file)
3. 阅读相关代码和现有测试
4. 形成初始方案(在 think 中输出)
5. 迭代开发:
   a. 修改代码
   b. 运行测试(bash: pytest ... / npm test / go test)
   c. 检查结果
   d. 如果失败 → 分析错误 → 调整 → 重试
   e. 如果收到 PM 提示 → 重新评估方向
6. 所有测试通过 → 运行完整测试套件确认无回归 → 完成

约束:
  - max_turns: 50
  - 每次修改代码后必须运行测试
  - 不能修改测试文件(测试是验收标准,不能改)

轨迹记录格式

// 每一轮记录一行 JSON
{
  "turn": 1,
  "action_type": "read_file",
  "action": {"path": "django/db/models/query.py"},
  "observation": "class QuerySet:\n    def __iter__(self):\n        ...",
  "think": "我需要先理解现有的 QuerySet 迭代机制...",
  "test_result": null,
  "hint_received": null,
  "files_modified": [],
  "cumulative_test_results": null
}
{
  "turn": 8,
  "action_type": "bash",
  "action": {"cmd": "python -m pytest tests/async/test_queries.py -x -q"},
  "observation": "FAILED tests/async/test_queries.py::test_async_iteration - TypeError: ...",
  "think": "我的 __aiter__ 实现有问题,返回类型不对...",
  "test_result": {"passed": 2, "failed": 3, "total": 5},
  "hint_received": null,
  "files_modified": ["django/db/models/query.py"],
  "cumulative_test_results": [
    {"turn": 5, "passed": 0, "failed": 5},
    {"turn": 8, "passed": 2, "failed": 3}
  ]
}
{
  "turn": 15,
  "action_type": "think",
  "action": {},
  "observation": "",
  "think": "连续三次修改 compiler.py 都没有解决问题,测试 error 一样...",
  "test_result": null,
  "hint_received": {
    "level": "L1",
    "content": "这个功能的核心在于让数据库查询支持 Python 的异步迭代协议...",
    "trigger": "consecutive_test_failures"
  },
  "files_modified": [],
  "direction_change": true
}

七、Agent 5: Test

职责

  1. 在 Dev 过程中提供测试反馈
  2. Dev 完成后做最终验证

Test 的工作流程

阶段 A:Dev 执行前(预验证)
  1. 在 base_commit 环境中运行 Task Designer 指定的测试
  2. 确认测试在 base 上 FAIL(如果 PASS → 任务无效,跳过)
  3. 如果有 ground truth,确认测试在 target 上 PASS

阶段 B:Dev 执行中(实时反馈)
  Dev 每次运行测试,Test Agent 解析结果并:
  1. 统计 pass/fail 数量
  2. 将结果发送给 PM(PM 据此决定是否释放提示)
  3. 如果 Dev 试图修改测试文件 → 阻止并警告

阶段 C:Dev 完成后(最终验证)
  1. 运行目标测试套件 → 必须全部 PASS
  2. 运行 repo 完整测试套件 → 确认无回归
  3. 如果有 ground truth diff → 对比 Dev 的改动和 ground truth:
     - 不要求完全一致(实现方式可以不同)
     - 检查是否修改了相同的核心文件
     - 检查功能是否等价(通过测试即可)
  4. 输出验证报告

验证报告格式

verification_report:
  task_id: "django-async-queryset-iter"
  target_tests:
    total: 5
    passed: 5
    failed: 0
    status: "PASS"
  regression_tests:
    total: 16842
    passed: 16840
    failed: 2
    new_failures: 0       # 排除 base 上就失败的
    status: "PASS"
  ground_truth_comparison:
    available: true
    same_core_files: true  # Dev 修改了相同的核心文件
    additional_files: 1    # Dev 额外修改了 1 个文件
    functional_equivalence: "PASS"  # 通过相同测试 = 功能等价

八、Agent 6: Reviewer

职责

从 Dev 的轨迹中筛选有训练价值的数据,丢弃噪声,输出最终 task 卡片。

筛选维度

judgment:
  1_difficulty:
    score: 1-5
    criteria:
      5: "Dev 需要 L2 提示才完成,过程有多次方向调整"
      4: "Dev 需要 L1 提示,或自主探索超过 25 轮才完成"
      3: "Dev 无需提示但经历 3+ 次有意义的迭代"
      2: "Dev 2 次迭代内完成"
      1: "Dev 一次通过"

  2_trajectory_quality:
    good_signals:
      - "探索有逻辑(不是随机瞎试)"
      - "失败后分析了错误信息"
      - "收到提示后快速调整方向"
      - "有增量进展(fail 数逐步减少)"
    bad_signals:
      - "重复相同修改"
      - "忽略测试错误信息"
      - "收到提示后没有改变方向"

  3_discard_reasons:
    - "env_issue": "环境问题(依赖缺失、构建失败)→ 丢弃"
    - "too_easy": "difficulty 1,没有训练价值 → 丢弃"
    - "agent_loop": "Dev 在简单问题上打转 → 丢弃"
    - "flaky_test": "测试结果不稳定 → 丢弃"

  4_rl_training_value:
    high: "difficulty 4-5,有完整的探索-提示-突破链路"
    medium: "difficulty 3,有有意义的迭代"
    low: "difficulty 2,可作为 curriculum 起点"
    reject: "env_issue / too_easy / agent_loop / flaky_test"

最终输出格式

# verified_tasks/{task-id}.yaml
task_id: "django-async-queryset-iter"
repo: "django/django"
language: "python"
difficulty: 4
rl_training_value: "high"

# ── 环境 ──
environment:
  base_commit: "abc123"
  dockerfile: |
    FROM python:3.11-slim
    WORKDIR /workspace
    COPY . .
    RUN pip install -e ".[dev]"
  setup_cmd: "pip install -e ."

# ── 任务描述(PM 视角)──
task_description: |
  ## 背景
  我们的异步 Web 视图中大量使用了 sync_to_async 包裹数据库查询...

  ## 需求
  让 QuerySet 支持 async for 语法...

  ## 验收标准
  1. async for obj in queryset 正常工作
  2. 支持链式操作后的异步迭代
  3. 向后兼容
  4. 新增测试覆盖

# ── 测试 ──
test:
  cmd: "python -m pytest tests/async/test_queries.py -x -q"
  files: ["tests/async/test_queries.py"]
  total_tests: 5

# ── Solution(Dev 的完整轨迹)──
solution:
  trajectory_file: "trajectories/django-async-queryset-iter.jsonl"
  total_turns: 28
  edit_attempts: 6
  hints_received: ["L1"]   # 收到了 L1 提示
  key_moments:
    - { turn: 5, event: "first_test_run", result: "0/5 pass" }
    - { turn: 12, event: "partial_progress", result: "2/5 pass" }
    - { turn: 15, event: "stuck", detail: "连续 3 次相同失败" }
    - { turn: 15, event: "hint_received", level: "L1" }
    - { turn: 17, event: "direction_change", detail: "从 compiler.py 转向 query.py" }
    - { turn: 22, event: "near_completion", result: "4/5 pass" }
    - { turn: 28, event: "all_pass", result: "5/5 pass" }
  final_diff_file: "diffs/django-async-queryset-iter-dev.patch"

# ── 渐进提示(用于 DPO 构造)──
hints:
  L0: []
  L1:
    - "这个功能的核心在于让数据库查询支持 Python 的异步迭代协议"
    - "你需要关注 ORM 层的查询编译器如何生成和执行 SQL"
  L2:
    - "核心改动在 django/db/models/query.py —— QuerySet 需要实现 __aiter__ 和 __anext__"
    - "compiler.py 的 execute_sql 需要支持异步数据库连接"

# ── Ground Truth(可选)──
ground_truth:
  available: true
  target_commit: "def456"
  diff_file: "diffs/django-async-queryset-iter-truth.patch"

# ── 元数据 ──
pm_intervention_log:
  - { turn: 15, level: "L1", trigger: "consecutive_test_failures" }
tags: ["async", "orm", "cross-file", "feature-development"]

九、端到端执行流程(给 Coding Agent 的完整指令)

Step 1: 准备工作
  mkdir -p harnessforge/{repos,blueprints,tasks,trajectories,verified,diffs}

Step 2: Repo Selection
  对 seeds.yaml 中的每个 repo:
    git clone --depth=100 {repo_url} repos/{repo_name}
    运行筛选检查(CI 存在、测试数量、release tag 数量等)
    输出 repos/selected-repos.yaml

Step 3: Task Design
  对 selected-repos.yaml 中的每个 repo:
    分析 release 历史
    设计 3-5 个 feature 任务
    在 Docker 中验证环境和测试
    输出 blueprints/{repo}-blueprints.yaml

Step 4: PM + Dev + Test 执行循环
  对每个 blueprint 中的每个 task:
    4a. PM 重写需求,准备提示
    4b. 构建 Docker 环境,checkout base_commit
    4c. Test 预验证(测试在 base 上 FAIL)
    4d. Dev 在沙箱中执行,PM 实时监控:
        loop:
          Dev 执行一轮(read/edit/bash/test)
          记录轨迹
          if Dev 运行了测试:
            Test 解析结果
            PM.observe_dev_turn(turn_info)
            if PM 返回 hint:
              将 hint 注入 Dev 的下一轮 context
          if Dev 完成 or 超时:
            break
    4e. Test 最终验证(目标测试 PASS + 无回归)
    4f. 输出: tasks/{task-id}/trajectory.jsonl + report.yaml

Step 5: Review
  对 tasks/ 中的每个完成的 task:
    Reviewer 评估 difficulty + trajectory_quality + rl_value
    if rl_value != "reject":
      输出 verified/{task-id}.yaml
    统计: 总共 X 个 task, 通过 Y 个, 通过率 Z%

Step 6: 打包
  将 verified/ 目录打包为 harnessforge-v2-dataset.tar.gz
  生成 README.md 包含统计信息

十、规模与成本估算

阶段输入产出通过率
Repo Selection30 seeds~25 repos~83%
Task Design25 repos × 4 features/release × 3 releases~300 blueprints—
PM 重写300 blueprints300 tasks100%
Dev 执行300 tasks × 2 models600 trajectories—
Test 验证600 trajectories~400 passed~67%
Reviewer 筛选400 passed200-300 verified tasks~60%

首批规模:200-300 个 verified tasks。规模不大但每条数据包含完整探索轨迹(平均 25-40 轮交互)。

扩展到 3K-5K:扩展 repo 列表到 150-200 个 + 覆盖更多 release 版本对。

成本(首批 30 repos)

环节单价数量小计
Task Designer (Sonnet)~$0.08/task300$24
PM (Opus)~$0.12/task300$36
Dev (Sonnet, ~30K tokens)~$0.50/run600$300
Test (自动化)~$0.02/run600$12
Reviewer (Opus)~$0.15/task400$60
Docker 运行~$0.02/run600$12
总计~$444

十一、快速验证(PoC)

在投入全量之前,先用 3 个 repo 验证流水线可行性:

PoC 范围:
  - django/django(Python)
  - vitejs/vite(TypeScript)
  - gin-gonic/gin(Go)
  - 每个 repo 2 个 feature → 6 个 task

PoC 成功标准:
  1. 6 个 task 中 ≥ 3 个通过 Reviewer 筛选(通过率 ≥ 50%)
  2. 至少 1 个 task 的 difficulty ≥ 4(Dev 需要 PM 提示才完成)
  3. 所有 verified task 的环境可复现(Docker rebuild 后测试仍通过)
  4. 轨迹格式正确,可被 RL 训练框架(verl-agent / ms-swift)读取

PoC 预估成本:~$30
PoC 预估时间:1-2 天