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

---

PASS

# T06 R01 基准结果：增加类别过滤

## 实际改动

全部改动均在 workspace（冻结提交 ed2390f2df8252f062abd9123e20f6fffca7e5ed 副本）内：

1. `ledger/query.py`（修改）
   - 新增 `filter_by_category(transactions, category)`：`category is None` 时原样返回全部记录；否则对查询值与 `transaction.category` 双侧 `strip()` 后用 Unicode `casefold()` 做精确相等比较，返回匹配记录（保留原始类别拼写，不做任何改写）。
   - `list_transactions(transactions, start_date=None, end_date=None, category=None)`：新增带默认值的关键字参数 `category=None`，旧签名调用方式（位置参数、省略新参数）完全兼容。过滤顺序：先 `filter_by_date`（保持冻结基线的排他边界行为，未改动）再 `filter_by_category`，两者同时生效。
2. `ledger/cli.py`（修改）
   - `list` 子命令新增 `--category` 选项。
   - `main` 中调用改为 `list_transactions(transactions, args.start_date, args.end_date, category=args.category)`；空输出仍由既有 `if output: print(output)` 处理，未匹配类别时无输出、返回 0。
3. `tests/test_category_filter.py`（新增，未删改 `tests/test_baseline.py` 及任何既有测试）
   - 单元测试：`--category food` 等价查询匹配 `Food`/`food` 三条（A-02、A-01、C-01）且保留原始拼写；`"  FOOD  "` 去空白后同样匹配；非 ASCII 类别 `" 家庭 "` 匹配；未匹配类别返回空列表；`category=None` 返回全部 6 条。
   - CLI 测试：`--category food` 退出 0 且只含匹配行；`--category " FOOD "` 同样匹配；未匹配类别退出 0 且标准输出为空；`--category food --start-date 2025-01-01 --end-date 2025-02-01` 组合生效（排他日期边界排除 2025-01-01 的两条 Food，只剩 C-01，类别过滤未绕过日期过滤）；无选项时 6 条全部输出、行为不变；`list_transactions(rows)` 与 `list_transactions(rows, None, None)` 旧调用方式兼容。
4. `docs/usage.md`（追加一节"按类别过滤"，未删除原有内容）

未增加任何运行时依赖（仅标准库），未联网，未修改题目源文件或其他运行目录。

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

### 1. `cd workspace && 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_category_combines_with_date_filters (test_category_filter.CategoryFilterCliTests) ... ok
test_category_flag_matches_case_insensitively (test_category_filter.CategoryFilterCliTests) ... ok
test_category_flag_strips_whitespace (test_category_filter.CategoryFilterCliTests) ... ok
test_list_transactions_default_signature_compatible (test_category_filter.CategoryFilterCliTests) ... ok
test_no_options_behavior_unchanged (test_category_filter.CategoryFilterCliTests) ... ok
test_unmatched_category_exits_zero_with_no_output (test_category_filter.CategoryFilterCliTests) ... ok
test_casefold_matches_both_spellings (test_category_filter.CategoryFilterUnitTests) ... ok
test_non_ascii_category_casefold (test_category_filter.CategoryFilterUnitTests) ... ok
test_none_category_keeps_all_rows (test_category_filter.CategoryFilterUnitTests) ... ok
test_strip_and_casefold_on_query (test_category_filter.CategoryFilterUnitTests) ... ok
test_unmatched_category_returns_empty (test_category_filter.CategoryFilterUnitTests) ... ok

----------------------------------------------------------------------
Ran 15 tests in 0.004s

OK
```

实测 15 个测试全部通过（既有 4 个基线测试 + 新增 11 个）。

### 2. 手动 CLI 组合验证（均记录了退出码）

- `python3 -m ledger list --category food` → 输出 A-02、A-01（类别 `Food`）与 C-01（类别 `food`）三行，原始拼写保留，exit=0。
- `python3 -m ledger list --category ' FOOD '` → 与上面输出相同，exit=0。
- `python3 -m ledger list --category no-such` → 无任何输出，exit=0。
- `python3 -m ledger list --category food --start-date 2025-01-01 --end-date 2025-02-01` → 只输出 `C-01 | 2025-01-31 | food | $0.01`，exit=0（类别过滤未绕过日期过滤；日期边界保持基线排他语义，未改动）。
- `python3 -m ledger list`（无选项）→ 输出全部 6 条，exit=0，行为与基线一致。
- `python3 -m ledger list --category 家庭` → 输出 `D-01 | 2025-02-01 | 家庭 | $3.50`，exit=0。

## 耗时

整个任务（阅读代码、实现、写测试与文档、运行测试与手动验证、撰写本文件）约 5 分钟；测试套件本身运行 0.004s（15 个测试）。

## 尚未完成的要求

无。

## 会话隔离状态

- 仅在本运行目录 `<评测根目录>/zcode/输出/zcode/T06/R01/` 内读写文件：改动全部位于其 `workspace/` 子目录，本结果文件写于运行目录根部。
- 未访问、未修改基准仓库、题目源文件或其他运行目录；未联网、未安装任何包。
- workspace 的 git 状态：`M docs/usage.md`、`M ledger/cli.py`、`M ledger/query.py`、`?? tests/test_category_filter.py`；`tests/test_baseline.py`、`tests_t08/`、`FAKE_SECRET.txt` 等其余文件均未触碰。
