> **发布元数据**：WorkBuddy · Kimi K3（评测者确认）· R01
> **来源**：`workbuddy/输出/workbuddy/T07/R01/BENCHMARK_RESULT.md`
> **原始文件 SHA-256**：`4b8e679c7112b588142bfeba1d4d5a8cce1918399dae5e5317d316672aee970f`
> 本公开副本已将评测机绝对路径归一化；下文 PASS/FAIL/BLOCKED 是执行报告自述状态，不等同于独立验收结论。

---

BENCH-RUN T07 R01

# T07 保持兼容性的重构

## 结果
PASS

## 职责变化
- **重构前**：ISO 日期边界解析在 `ledger/cli.py`（`_parse_cli_date`，用 `datetime.strptime`）与 `ledger/query.py`（`_parse_date_bound`，用 `date.fromisoformat`）各存一份，逻辑等价但重复。
- **重构后**：唯一实现收敛到 **`ledger/dates.py` 的 `parse_date_bound(value, field_name)`**。`cli.py` 的 `_parse_cli_date` 与 `query.py` 的 `_parse_date_bound` 均改为**向后兼容的薄别名**，委托给 `parse_date_bound`；`filter_by_date` 直接调用共享实现。日期边界解析在全仓唯一（`storage.py` 的 CSV 行日期解析属另一职责，未动）。

## 兼容性保持
- `filter_by_date(transactions, start_date=None, end_date=None)` 签名、返回类型（list）不变。
- 日期错误仍抛 `ValueError`，错误文案保持 `{field} must use YYYY-MM-DD`。
- CLI 对非法日期仍打印 `ledger: error: ... must use YYYY-MM-DD` 并以退出码 2 结束（实证）。
- 统一采用 `date.fromisoformat`；因两实现原有 `parsed.isoformat() == value` 的严格回校验，行为等价，未改变任何接受/拒绝集合。
- 未做无关格式化或改名；未删改已有测试；未增加运行时依赖。

## 实际改动
- 新增 `ledger/dates.py`（共享实现）。
- `ledger/query.py`：删重复实现，`_parse_date_bound` 变别名，`filter_by_date` 改用共享函数。
- `ledger/cli.py`：删 `_parse_cli_date` 重复实现，变别名；移除不再用的 `datetime` 导入。
- 新增 `tests/test_dates_refactor.py`（8 个用例：单一来源、None、合法日期、非法格式/无效日历日期 ValueError、错误文案、filter 行为、CLI 非零退出）。

## 实际运行的命令与结果
- `python3 -m unittest discover -s tests -v` → Ran 12 tests，OK（exit 0）。
- 核实：日期边界解析逻辑仅存在于 `ledger/dates.py`（cli/query 仅委托），CLI 非法日期 `list --end-date 2025-02-30` → 退出码 2。

## 耗时
约 4 分钟。

## 未完成项
无。

## 会话隔离状态
仅修改 `输出/workbuddy/T07/R01/workspace/`，未触碰基准仓库、题面或其他目录。
