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.md 和 workdirs/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-1、Chart-1、Csv-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. 什么时候算可以开始小实验
开始 3-bug smoke 的门槛
- 一个 bug 可以真实 checkout 并 compile。
- 至少一个 dummy patch attempt 生成 receipt。
- 三组 prompt 模板已经冻结。
- 你能解释 vanilla、Ochiai-guided、diagnostic-advice-guided 三组输入差异。
- 你能说明 prompt 没有 developer patch、gold fault line 或 bug type 泄漏。