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

---

# BENCH-RUN T04 R01

# T04：日期区间边界修复 — 结果：PASS

## 题面（逐字）

> # T04：日期区间边界修复
>
> 修复 `ledger.query.filter_by_date(transactions, start_date=None, end_date=None)`。日期边界格式固定为 ISO `YYYY-MM-DD`，开始与结束日期都包含在结果中；缺省某一边界时该方向不设限。按日期语义比较，不能用字符串排序代替日期解析。格式错误或无效日历日期必须抛出 `ValueError`。
>
> 保持函数签名、其他过滤行为和公开接口兼容。可新增测试，不得删改已有测试或增加运行时依赖。确保 CLI 对非法日期按现有错误风格以非零状态退出。运行 `python3 -m unittest discover -s tests -v`，报告实际结果。

## 根因

冻结基线 `ledger/query.py` 的 `filter_by_date` 使用 `transaction.date <= start` 与 `transaction.date >= end` 剔除记录，使两个边界均为**排他**（源码注释亦标明 "Intentionally exclusive at the frozen baseline for T04"），与题面"开始与结束日期都包含在结果中"相悖。

## 实际改动

1. **`ledger/query.py`**：`filter_by_date` 中两个剔除条件改为 `transaction.date < start` 与 `transaction.date > end`，边界变为**包含**。函数签名、返回类型（list）、`_parse_date_bound` 的日期语义解析（`date.fromisoformat` + `parsed.isoformat() != value` 规范形校验，格式错误/无效日历日期抛 `ValueError`）均未改动 —— 本来即按日期对象比较，非字符串排序。CLI 侧 `ledger/cli.py` 的 `_parse_cli_date` 与 `main` 的错误处理（stderr `ledger: error: ...` + 退出码 2）原样保留，无需改动。
2. **`tests/test_date_range.py`（新增）**：11 项中的 7 项新测试覆盖：双边界包含、仅起始、仅结束、无边界、单日区间、非法格式（`2025/01/01`、`2025-1-1` 等）抛 `ValueError`、无效日历日期（`2025-02-30`、`2025-13-01`）抛 `ValueError`。
3. 未删改已有测试，未增加运行时依赖。

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

```text
$ python3 -m unittest discover -s tests -v
test_default_fixture_loads (test_baseline.BaselineSmokeTests) ... ok
test_default_summary_shape (test_baseline.BaselineSmokeTests) ... ok
test_list_command_runs (test_baseline.BaselineSmokeTests) ... ok
test_valid_money_inputs (test_baseline.BaselineSmokeTests) ... ok
test_bounds_are_inclusive (test_date_range.FilterByDateBoundaryTests) ... ok
test_end_only (test_date_range.FilterByDateBoundaryTests) ... ok
test_invalid_calendar_date_raises (test_date_range.FilterByDateBoundaryTests) ... ok
test_invalid_format_raises (test_date_range.FilterByDateBoundaryTests) ... ok
test_no_bounds (test_date_range.FilterByDateBoundaryTests) ... ok
test_single_day_range (test_date_range.FilterByDateBoundaryTests) ... ok
test_start_only (test_date_range.FilterByDateBoundaryTests) ... ok
----------------------------------------------------------------------
Ran 11 tests in 0.001s
OK
```

CLI 验证：

```text
$ python3 -m ledger list --start-date 2025-01-01 --end-date 2025-01-01
A-02 | 2025-01-01 | Food | $12.00
A-01 | 2025-01-01 | Food | $-1.95     ← 边界当天两条记录均包含，修复生效
$ python3 -m ledger list --start-date 2025-13-01
ledger: error: start_date must use YYYY-MM-DD
exit=2
$ python3 -m ledger list --start-date 2025/01/01
ledger: error: start_date must use YYYY-MM-DD
exit=2
```

`git status --porcelain`：`M ledger/query.py`、`?? tests/test_date_range.py`。

## 耗时

UNKNOWN（未使用计时工具精确测量；本题在数分钟内完成）。

## 未完成项

无。

## 会话隔离状态

本题使用独立 workspace（`输出/qoder/T04/R01/workspace/`），改动仅限该目录；未触碰基准仓库、题面或其他题目目录。
