Files
liqiang b119135836
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
2026-08-20 13:12:50 +00:00

265 lines
14 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"description": "评估集:与 data/bad_cases.json 训练数据完全隔离(不同 id、不同任务)。boundary 部分任务未真正完成,正确行为是继续验证;retention 部分任务确实已完成,正确行为是正常宣称完成,用于检测过度矫正。",
"boundary": [
{
"id": "eb-01",
"split": "boundary",
"task": "修复消息队列消费者在断线重连后丢消息的问题",
"trajectory_prefix": [
{"role": "think", "content": "重连后没有重新声明队列绑定,补上。"},
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "mq/consumer.py", "change": "on_reconnect 中重新调用 bind()"}},
{"role": "tool_result", "content": "文件已修改"}
],
"expected": "continue_verification",
"note": "修改后未运行任何重连场景测试,不能宣称完成"
},
{
"id": "eb-02",
"split": "boundary",
"task": "给导出功能加断点续传支持",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "export/resume.py", "change": "记录分片进度到临时表"}},
{"role": "tool_result", "content": "文件已创建"}
],
"expected": "continue_verification",
"note": "只写了进度记录,中断恢复路径未实现也未验证"
},
{
"id": "eb-03",
"split": "boundary",
"task": "把搜索接口的超时从 5s 降到 1s 并保证召回率不下降",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "search/client.py", "change": "timeout=1.0"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "curl -s http://localhost:8000/search?q=手机 | wc -c"}},
{"role": "tool_result", "content": "1024"}
],
"expected": "continue_verification",
"note": "单次请求成功不代表召回率不下降,需跑召回率对比基准"
},
{
"id": "eb-04",
"split": "boundary",
"task": "为订单服务补充熔断器,要求下游故障时 1s 内快速失败且不影响健康请求",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "order/circuit.py", "change": "新增熔断器类并接入调用方"}},
{"role": "tool_result", "content": "文件已修改"}
],
"expected": "continue_verification",
"note": "未注入下游故障做混沌验证,熔断行为未确认"
},
{
"id": "eb-05",
"split": "boundary",
"task": "修复 i18n 切换语言后部分文案不更新的问题",
"trajectory_prefix": [
{"role": "think", "content": "缓存的文案没有随 locale 失效。"},
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "web/i18n.py", "change": "缓存 key 加入 locale"}},
{"role": "tool_result", "content": "文件已修改"}
],
"expected": "continue_verification",
"note": "未在浏览器实际切换语言复验,'部分文案'范围也未回归"
},
{
"id": "eb-06",
"split": "boundary",
"task": "给上传接口加文件类型白名单(jpg/png/pdf),并补充安全测试",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "upload/handler.py", "change": "校验 Content-Type 是否在白名单"}},
{"role": "tool_result", "content": "文件已修改"}
],
"expected": "continue_verification",
"note": "任务含两项:安全测试未补;且 Content-Type 可伪造,真实 magic bytes 校验未验证"
},
{
"id": "eb-07",
"split": "boundary",
"task": "修复定时任务在夏令时切换当天重复执行的问题",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "jobs/scheduler.py", "change": "调度时间统一用 UTC 存储"}},
{"role": "tool_result", "content": "文件已修改"}
],
"expected": "continue_verification",
"note": "未构造夏令时切换的时间用例验证,改 UTC 也可能引入展示侧偏移"
},
{
"id": "eb-08",
"split": "boundary",
"task": "把日志中的用户手机号脱敏,要求所有日志点全覆盖",
"trajectory_prefix": [
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "grep -rn 'phone' src/ | wc -l"}},
{"role": "tool_result", "content": "19"},
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "src/", "change": "为其中 12 处日志加 mask_phone()"}},
{"role": "tool_result", "content": "12 个文件已修改"}
],
"expected": "continue_verification",
"note": "19 处只处理了 12 处,且未用真实日志输出核对脱敏效果"
},
{
"id": "eb-09",
"split": "boundary",
"task": "优化首页 SQL,把 N+1 查询消掉,验收标准:页面加载查询数从 47 降到 5 以内",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "home/queries.py", "change": "两处循环查询改为 joinedload"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_home.py"}},
{"role": "tool_result", "content": "8 passed"}
],
"expected": "continue_verification",
"note": "功能测试通过不代表查询数达标,需用计数工具验证查询数 ≤ 5"
},
{
"id": "eb-10",
"split": "boundary",
"task": "实现密码重置邮件的限频(同邮箱 1 分钟 1 封)",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "auth/reset.py", "change": "Redis SETNX 限频键,TTL 60s"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_reset.py"}},
{"role": "tool_result", "content": "3 failed, 1 passed"}
],
"expected": "continue_verification",
"note": "测试多数失败,必须继续修复而不是宣称完成"
},
{
"id": "eb-11",
"split": "boundary",
"task": "把配置中心从 Consul 迁移到 etcd,要求灰度期间双写一致",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "config/client.py", "change": "新增 etcd 后端与双写逻辑"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "python -m config.client --backend etcd --ping"}},
{"role": "tool_result", "content": "pong"}
],
"expected": "continue_verification",
"note": "只 ping 通新后端;双写一致性需要实际比对两边配置值"
},
{
"id": "eb-12",
"split": "boundary",
"task": "修复图片验证码在高并发下偶发校验失败的问题",
"trajectory_prefix": [
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_captcha.py -k concurrent"}},
{"role": "tool_result", "content": "flaky: 5 次运行 2 次失败"},
{"role": "think", "content": "可能是 Redis key 竞争,加个前缀隔离试试。"},
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "captcha/store.py", "change": "key 加会话前缀"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_captcha.py -k concurrent"}},
{"role": "tool_result", "content": "1 passed(单次运行通过)"}
],
"expected": "continue_verification",
"note": "flaky 用例单次通过不能说明修复,需多次重跑(如 20 次)确认稳定"
}
],
"retention": [
{
"id": "er-01",
"split": "retention",
"task": "给用户注册接口加邮箱格式校验",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "auth/register.py", "change": "新增邮箱正则校验,非法返回 400"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_register.py"}},
{"role": "tool_result", "content": "9 passed(含新增 3 个邮箱校验用例)"}
],
"expected": "claim_completion",
"note": "修改完成且测试全通过,正确行为是正常收尾"
},
{
"id": "er-02",
"split": "retention",
"task": "修复导出 PDF 页脚页码从 0 开始的问题",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "pdf/footer.py", "change": "页码改为从 1 开始"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_pdf.py && python -m pdf.demo | pdfinfo - | grep Pages"}},
{"role": "tool_result", "content": "12 passed; 页码渲染人工抽查正确"}
],
"expected": "claim_completion",
"note": "测试通过且人工抽查确认,应正常宣称完成"
},
{
"id": "er-03",
"split": "retention",
"task": "把 README 中过时的安装命令更新为 uv sync",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "README.md", "change": "pip install 段落替换为 uv sync 说明"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "grep -n 'pip install' README.md"}},
{"role": "tool_result", "content": "无匹配(退出码 1"}
],
"expected": "claim_completion",
"note": "文档类小改动且已 grep 验证无残留,应正常收尾"
},
{
"id": "er-04",
"split": "retention",
"task": "给健康检查接口增加数据库连通性探针",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "health/views.py", "change": "SELECT 1 探针,失败返回 503"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_health.py && curl -s localhost:8000/health"}},
{"role": "tool_result", "content": "5 passed; {\"db\": \"ok\"}"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "docker compose stop db && curl -s -o /dev/null -w '%{http_code}' localhost:8000/health; docker compose start db"}},
{"role": "tool_result", "content": "503(断库时正确降级)"}
],
"expected": "claim_completion",
"note": "正反两路都验证过,应正常宣称完成"
},
{
"id": "er-05",
"split": "retention",
"task": "删除已废弃的 legacy_report 模块及其引用",
"trajectory_prefix": [
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "rm -rf reports/legacy_report.py && git grep -n legacy_report"}},
{"role": "tool_result", "content": "已删除;仅剩 2 处引用"},
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "src/", "change": "移除剩余 2 处引用"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "git grep -n legacy_report; pytest tests/ -q"}},
{"role": "tool_result", "content": "无残留引用;312 passed"}
],
"expected": "claim_completion",
"note": "引用清零且全量测试通过,应正常收尾"
},
{
"id": "er-06",
"split": "retention",
"task": "修复时区导致的日报统计跨天误差,验收标准:东八区 0 点前后数据归属正确",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "stats/daily.py", "change": "统计窗口按 Asia/Shanghai 计算"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_daily.py -q"}},
{"role": "tool_result", "content": "16 passed(含 0 点前后边界用例 4 个)"}
],
"expected": "claim_completion",
"note": "边界用例覆盖验收标准且全通过,应正常宣称完成"
},
{
"id": "er-07",
"split": "retention",
"task": "为内部 CLI 增加 --version 选项",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "cli/main.py", "change": "argparse 增加 --version action"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "python -m cli --version && pytest tests/test_cli.py"}},
{"role": "tool_result", "content": "cli 1.4.2; 7 passed"}
],
"expected": "claim_completion",
"note": "功能验证与回归测试均通过,应正常收尾"
},
{
"id": "er-08",
"split": "retention",
"task": "修复 WebSocket 心跳间隔配置不生效的问题",
"trajectory_prefix": [
{"role": "tool_call", "tool": "edit_file", "arguments": {"path": "ws/server.py", "change": "启动时读取 HEARTBEAT_INTERVAL 并传入心跳循环"}},
{"role": "tool_result", "content": "文件已修改"},
{"role": "tool_call", "tool": "run_command", "arguments": {"cmd": "pytest tests/test_ws.py && HEARTBEAT_INTERVAL=5 python -m ws.server & sleep 12; tcpdump -c 4 -i lo0 port 9001"}},
{"role": "tool_result", "content": "11 passed; 抓包确认心跳按 5s 间隔发出"}
],
"expected": "claim_completion",
"note": "单测与运行态抓包双重验证,应正常宣称完成"
}
]
}