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

---

# BENCH-RUN T06 R01

# T06：增加类别过滤 — 结果：PASS

## 题面（逐字）

> # T06：增加类别过滤
>
> 为 `python3 -m ledger list` 增加精确选项 `--category <NAME>`。比较前对查询值和数据类别都去除首尾空白，并使用 Unicode `casefold` 做不区分大小写比较；输出保留记录中的原始类别拼写。未匹配类别返回空结果且成功退出。类别过滤必须能与 `--start-date`、`--end-date` 同时生效，不能绕过日期过滤。
>
> 保持无选项时的现有行为和公开接口兼容；新增测试与简短用法说明，不删改已有测试、不增加运行时依赖。运行 `python3 -m unittest discover -s tests -v`，并报告实际结果。

## 实际改动

1. **`ledger/query.py`**：新增 `filter_by_category(transactions, category)` —— `category is None` 时返回全部记录的列表副本；否则对查询值与每条记录的类别分别 `str.strip().casefold()` 后做相等比较，命中记录原样返回（类别拼写不动）。
2. **`ledger/cli.py`**：`list` 子命令新增 `--category`；`main` 中在既有 `list_transactions(...)`（日期过滤）之后再串联 `filter_by_category(rows, args.category)`，两个条件同时生效、互不绕过。不带选项时 `args.category` 为 `None`，走原路径，行为与基线一致。
3. **`tests/test_category_filter.py`（新增）**：7 项测试 —— 大小写不敏感且保留原始拼写（`FOOD` 命中 `Food`/`food` 两条拼写）、查询值首尾空白剔除、未匹配空输出且退出 0、与日期过滤组合（见下注）、无选项时 6 条全量基线、`casefold` 语义单元测试（`Straße`/`STRASSE` 互命中、数据侧首尾空白剔除）、`None` 直通。
   - 注：本题 workspace 自冻结基线复制，日期过滤在基线上为**排他边界**（T04 的修复不属于本题范围，本题不改变日期行为），故组合用例的结束日期取 `2025-02-01` 使 `C-01` 落入区间，验证的是"类别过滤不绕过日期过滤"这一组合语义。首轮用 `2025-01-31` 断言失败（0 条），确认是基线排他语义所致后修正了**新增测试的期望**，未改动任何既有测试与日期生产代码。
4. **`docs/usage.md`**：补充 `--category` 一行用法说明。
5. 未删改已有测试，未增加运行时依赖。

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

```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_case_insensitive_match_preserves_spelling (test_category_filter.CategoryFilterCliTests) ... ok
test_combines_with_date_filter (test_category_filter.CategoryFilterCliTests) ... ok
test_no_option_keeps_baseline (test_category_filter.CategoryFilterCliTests) ... ok
test_query_value_whitespace_trimmed (test_category_filter.CategoryFilterCliTests) ... ok
test_unmatched_category_empty_success (test_category_filter.CategoryFilterCliTests) ... ok
test_casefold_semantics (test_category_filter.CategoryFilterUnitTests) ... ok
test_none_returns_all (test_category_filter.CategoryFilterUnitTests) ... ok
----------------------------------------------------------------------
Ran 11 tests in 0.003s
OK

$ python3 -m ledger list --category food
A-02 | 2025-01-01 | Food | $12.00
A-01 | 2025-01-01 | Food | $-1.95
C-01 | 2025-01-31 | food | $0.01      ← 大小写不敏感命中，原始拼写保留

$ python3 -m ledger list --category food --start-date 2025-01-02 --end-date 2025-02-01
C-01 | 2025-01-31 | food | $0.01      ← 与日期过滤同时生效

$ python3 -m ledger list --category Nope
exit=0                              ← 空输出，成功退出
```

`git status --porcelain`：`M docs/usage.md`、`M ledger/cli.py`、`M ledger/query.py`、`?? tests/test_category_filter.py`。

## 耗时

UNKNOWN（未使用计时工具精确测量；本题在十分钟内完成，含一次新增测试期望修正）。

## 未完成项

无。

## 会话隔离状态

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