# 仓库修复实训：重复退款事故

全为合成业务。Python 3.10+，仅标准库，无需下载依赖，无网络调用。建议在独立目录运行。不要接入真实支付系统。

## Brief → 需求冻结
退款金额必须大于零，按十进制ROUND_HALF_UP保留两位；同一订单累计退款不得超过已付金额。只允许订单所有者操作已支付订单。幂等键全局唯一：相同请求重试仅返回既有结果，不重复退款；不同订单/金额复用键必须拒绝。重启后仍可识别重试；失败不能残留账目。
范围：单SQLite数据库、串行请求及事务恢复。多进程竞争、服务鉴权令牌、跨币种、真实资金、性能与灾备未在此覆盖。

## 复现
解压后进入本目录，用 `python --version` 记录环境。可选 `python -m venv .venv` 后激活虚拟环境。
运行 `python run_tests.py`。初始版本应该失败，退出码1；report.json与控制台保留证据。若全部通过，检查是否误用了reference目录。

## 任务
阅读service.py和测试，定位五类缺陷。修改自己的service.py，不改测试来“刷绿”。每项修复写：失败样本、根因、修复范围、可能影响的旧行为。增加一项自己的边界测试。重复执行同一命令。必要时对照reference/service.py，但对照过要标记“已看答案”。

## 回归与交付
交付补丁、Python版本、初次与最终完整日志、report.json、自增测试和范围说明。基线通过项是PASS_TO_PASS；失败/异常项是FAIL_TO_PASS。不能只贴19/19截图而不提供日志和代码版本。
评分100：环境复现15、根因20、修复30、旧行为回归15、额外边界测试10、范围说明10。建议教学准入80且不能有越权退款/累计超额。此阈值为本练习规则，不是行业标准。

## Owner如何验收
要求工程审核员独立复跑；核对原始测试是否被删除；检查越权、幂等冲突、累计退款与舍入；区分测试通过与生产安全。Owner不必自行证明并发正确性，应把未覆盖并发作为工程准入条件。reference只是本教学范围内的修复版，不是生产级支付服务。
