Software Engineering Empirical Research Radar

Repair Starter Lab

读完这一页,应该能开始第一个 Defects4J repair smoke。

这页对应本地 starter kit:workdirs/10-ai-guided-program-repair/experiments/d4j-smoke-001/。目标不是让模型马上修对,而是让 checkout、测试、prompt、patch、receipt 五件事先稳定。

0. 先确认你在哪

cd "/Users/zyzhang/Nutstore Files/private/papers"
pwd
python3 --version
which defects4j || echo "Defects4J not in PATH yet"

如果在新工作机,先读根目录 HANDOFF_20260727_ZH.mdworkdirs/10-ai-guided-program-repair/STATUS_ZH.md。坚果云目录只存记录和小型模板,真实 checkout 和测试日志建议放 /tmp 或计算节点。

1. 看 manifest

sed -n '1,20p' workdirs/10-ai-guided-program-repair/experiments/d4j-smoke-001/manifest.csv

默认 smoke 包含 Lang-1Chart-1Csv-1 三个候选。第一次只跑 --limit 1

2. Dry-run 准备 checkout

python3 workdirs/10-ai-guided-program-repair/scripts/prepare_d4j_bug.py \
  --manifest workdirs/10-ai-guided-program-repair/experiments/d4j-smoke-001/manifest.csv \
  --out-root /tmp/d4j-repair-smoke \
  --limit 1 \
  --dry-run

这一步不需要 Defects4J 真正存在,只检查脚本和 receipt 路径。成功后会在 /tmp/d4j-repair-smoke/_prepare_receipts/ 写一个 prepare receipt。

3. 真实 checkout

python3 workdirs/10-ai-guided-program-repair/scripts/prepare_d4j_bug.py \
  --manifest workdirs/10-ai-guided-program-repair/experiments/d4j-smoke-001/manifest.csv \
  --out-root /tmp/d4j-repair-smoke \
  --limit 1

如果这里失败,先修环境,不要接 LLM。常见问题是 Java 版本、Defects4J PATH、Perl module、网络 checkout 或项目依赖。

4. 准备一个 dummy patch

mkdir -p /tmp/d4j-repair-smoke/patches
cat > /tmp/d4j-repair-smoke/patches/noop.patch <<'PATCH'
PATCH

真实使用时这里换成 LLM 返回的 unified diff。第一次可以故意给一个空 patch 或错误 patch,只要 receipt 能记录失败即可。

5. 验证一个 patch attempt

python3 workdirs/10-ai-guided-program-repair/scripts/validate_patch_attempt.py \
  --bug-key Lang-1 \
  --project Lang \
  --bug-id 1 \
  --arm vanilla \
  --round 1 \
  --model manual-dummy \
  --prompt-file workdirs/10-ai-guided-program-repair/experiments/d4j-smoke-001/prompts/vanilla.md \
  --patch-file /tmp/d4j-repair-smoke/patches/noop.patch \
  --worktree /tmp/d4j-repair-smoke/Lang-1 \
  --receipt-out workdirs/10-ai-guided-program-repair/experiments/d4j-smoke-001/receipts/Lang-1.vanilla.r1.json \
  --dry-run

先 dry-run,确认 receipt schema 和路径;真实跑时去掉 --dry-run。注意:当前脚本用 patch -p0 应用 diff;如果 LLM 输出的是 git-style 路径,后续可以扩展成自动判断 -p0/-p1

重要:dry-run receipt 只证明管道和记录格式可用,不代表补丁通过测试。脚本中只有真实 full_tests == pass 才会把 plausible 记为 true。

6. 接入 LLM 前必须有这些文件

文件为什么需要
manifest.csv固定 bug universe,防止挑结果。
prompts/*.md固定三组 prompt,防止边跑边改。
schemas/repair_receipt.schema.json固定 attempt 记录字段。
prepare receipt证明 checkout/compile/triggering export 的状态。
attempt receipt证明每个 patch 的 apply/compile/test 分层结果。

7. 什么时候算可以开始小实验

Go / No-Go

开始 3-bug smoke 的门槛