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

---

# BENCH-RUN T07 R01

**状态：PASS**

## 任务
将 `ledger/cli.py` 与 `ledger/query.py` 中重复的 ISO 日期边界解析逻辑抽取到 `ledger/dates.py`，CLI 校验与查询过滤共用同一实现，同时保持 `filter_by_date` 签名/返回类型/`ValueError` 行为及 CLI 错误输出（stderr `ledger: error: ...`，退出码 2）兼容。

## 重构前后职责变化
- **重构前**：`ledger/cli.py:_parse_cli_date`（`datetime.strptime("%Y-%m-%d")` + `isoformat()` 回校验）与 `ledger/query.py:_parse_date_bound`（`date.fromisoformat` + `isoformat()` 回校验）各自实现一份 ISO `YYYY-MM-DD` 边界解析，均对非法输入抛 `ValueError(f"{field_name} must use YYYY-MM-DD")`，`None` 返回 `None`。
- **重构后**：新增 `ledger/dates.py:parse_date_bound(value, field_name)`，采用 `date.fromisoformat` + `isoformat()` 回校验。由于两份旧实现都带有"解析结果 isoformat 必须等于原字符串"的回校验，两者接受的集合恰好都是规范零填充的 `YYYY-MM-DD` 合法日期（strptime 虽能解析 `2025-1-1`，但回校验拒绝；fromisoformat 在 Python 3.9 上本就只接受严格 `YYYY-MM-DD`），因此共用实现与原两种实现行为一致（已通过对比测试验证，见下）。`query.filter_by_date` 与 `cli.main` 均改调 `parse_date_bound`；`cli._parse_cli_date` 保留为薄别名以兼容可能的外部引用。CLI 错误风格仍由 `cli.main` 的 `try/except` 输出 `ledger: error: ...` 并返回 2，未改动。

## 实际改动（均在 workspace 内）
1. 新增 `ledger/dates.py`：`parse_date_bound(value, field_name)`（fromisoformat + isoformat 回校验，`None` → `None`，非法 → `ValueError(f"{field_name} must use YYYY-MM-DD")`）。
2. `ledger/query.py`：删除 `_parse_date_bound`，`filter_by_date` 改为调用 `parse_date_bound`；签名 `filter_by_date(transactions, start_date=None, end_date=None)`、返回 list 及边界排他语义（T04 冻结行为）不变。
3. `ledger/cli.py`：`_parse_cli_date` 的重复实现删除，改为调用 `parse_date_bound` 的薄别名；移除不再使用的 `from datetime import datetime` 导入。`main` 的错误处理逻辑未动。
4. 新增兼容性测试 `tests/test_dates_compat.py`（未删改 `tests/test_baseline.py`）：覆盖 None/合法/非法输入、与旧 strptime 实现的逐例对比（含 `2025-1-1`、`2025-13-01`、`2025-02-29`、`2024-02-29` 等）、`filter_by_date` 签名默认值与排他边界、CLI stderr 文案与退出码 2。

无运行时依赖新增；仅使用标准库；未做无关格式化或改名。

## 实际运行的命令与原始结果

### 重构前基线
- `python3 -m unittest discover -s tests -v` → 4 个测试全部 ok，`OK`。
- `python3 -m ledger list --start-date 2025-13-01` → stderr `ledger: error: start_date must use YYYY-MM-DD`，exit=2。
- `python3 -m ledger list --start-date 2025-1-1` → stderr `ledger: error: start_date must use YYYY-MM-DD`，exit=2。
- `python3 -m ledger list --start-date 2025-01-01 --end-date 2025-12-31` → 输出 B-01 / C-01 / D-01 三行，exit=0。
- `python3 -m ledger summary` → `Transactions: 6` / `Total: $117.56`，exit=0。

### 重构后
- `python3 -m unittest discover -s tests -v`：
  ```
  Ran 13 tests in 0.002s
  OK
  ```
  13 个测试全部 ok（4 个基线 + 9 个新增兼容性测试）。
- `python3 -m ledger list --start-date 2025-13-01` → stderr `ledger: error: start_date must use YYYY-MM-DD`，exit=2。
- `python3 -m ledger list --start-date 2025-1-1` → stderr `ledger: error: start_date must use YYYY-MM-DD`，exit=2。
- `python3 -m ledger list --end-date 2025-13-01` → stderr `ledger: error: end_date must use YYYY-MM-DD`，exit=2。
- `python3 -m ledger list --start-date 2025-01-01 --end-date 2025-12-31` → 输出与基线完全一致（B-01 / C-01 / D-01），exit=0。
- `python3 -m ledger list` → 6 行全量列表，exit=0。
- `python3 -m ledger summary` → `Transactions: 6` / `Total: $117.56`，exit=0。

重构前后所有 CLI 行为逐字节一致。Python 版本：3.9.6（系统 python3）。

## 耗时
UNKNOWN（未计时；实际工作量为数分钟内的单次会话完成）

## 尚未完成项
无。题面全部要求已完成并验证。

## 会话隔离说明
本次运行所有读写严格限制在 `<评测根目录>/deepseek-harness/输出/deepseek-harness/T07/R01/workspace` 内（及本结果文件所在运行目录）。未修改题目源文件、基准仓库（`【本机路径已脱敏】 harness/` 检出）或任何其他运行目录（如 T07 其他轮次、其他题目的目录）；未访问网络；未新增依赖；未删改既有测试（`tests/test_baseline.py` 逐字未动）；`tests_t08/` 等其他目录未触碰。
