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

---

# BENCH-RUN T06 R01

**状态：PASS**

- 冻结提交：`ed2390f2df8252f062abd9123e20f6fffca7e5ed`（workspace 为该提交的独立副本，开始时 `git status` 干净）
- 耗时：UNKNOWN（未使用计时工具；实际为一次会话内完成，约数分钟）

## 实际改动（仅限 workspace 内，共 4 个文件）

1. `ledger/query.py`
   - 新增 `filter_by_category(transactions, category=None)`：`category is None` 时返回全部（列表副本）；否则对查询值和每条记录的类别分别做 `strip().casefold()` 后精确相等比较，返回的记录保留原始类别拼写（不修改记录本身）。
   - `list_transactions` 签名扩展为 `(transactions, start_date=None, end_date=None, category=None)`（新增参数仅追加默认值，公开接口向后兼容）：先 `filter_by_date` 再 `filter_by_category`，类别过滤与日期过滤叠加生效，不绕过日期过滤。
2. `ledger/cli.py`
   - `build_parser` 中 list 子命令新增 `--category` 选项（附 help 文本）。
   - `main` 中调用改为 `list_transactions(transactions, args.start_date, args.end_date, category=args.category)`；空输出仍由既有 `if output: print(output)` 处理，未匹配时退出码 0。
3. `tests/test_category_filter.py`（新增文件，未删改任何已有测试）
   - `FilterByCategoryUnitTests`：casefold 匹配 `Food`/`food` 两种原始拼写、查询值 strip、数据侧 strip、Unicode casefold（`Straße` ↔ `STRASSE`/`straße`）、`None` 返回全部、未匹配返回空列表。
   - `ListTransactionsStackingTests`：类别与日期叠加（`food` + `2025-01-01..2025-02-01` 仅剩 C-01）、类别不绕过日期过滤（日期区间排除全部时为空）、无选项行为不变。
   - `CategoryCliTests`：CLI 层 `--category food` 命中两种拼写、`" FOOD "` strip+casefold、`nosuch` 空输出且退出码 0、与 `--start-date/--end-date` 组合。
4. `docs/usage.md`：新增「按类别过滤」小节，说明 strip+casefold 语义、保留原始拼写、空结果退出码 0、可与日期选项叠加。

未增加任何运行时依赖（仅标准库），未修改题目源文件、基准仓库或其他运行目录；`tests_t08/` 未触碰；`filter_by_date` 的排他边界语义（T04 冻结基线）未改动。

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

以下命令均在 workspace 根目录执行（Python 3.9.6）。

### 1. 测试套件 `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_range (test_category_filter.CategoryCliTests) ... ok
test_category_combines_with_dates_for_other_category (test_category_filter.CategoryCliTests) ... ok
test_category_food_matches_both_spellings (test_category_filter.CategoryCliTests) ... ok
test_category_query_is_stripped_and_casefolded (test_category_filter.CategoryCliTests) ... ok
test_unmatched_category_exits_zero_with_empty_output (test_category_filter.CategoryCliTests) ... ok
test_casefold_matches_original_spellings (test_category_filter.FilterByCategoryUnitTests) ... ok
test_data_category_is_stripped_before_matching (test_category_filter.FilterByCategoryUnitTests) ... ok
test_none_category_returns_all_rows (test_category_filter.FilterByCategoryUnitTests) ... ok
test_query_is_stripped_before_matching (test_category_filter.FilterByCategoryUnitTests) ... ok
test_unicode_casefold_matching (test_category_filter.FilterByCategoryUnitTests) ... ok
test_unmatched_category_returns_empty_list (test_category_filter.FilterByCategoryUnitTests) ... ok
test_category_and_date_filters_stack (test_category_filter.ListTransactionsStackingTests) ... ok
test_category_does_not_bypass_date_filter (test_category_filter.ListTransactionsStackingTests) ... ok
test_no_options_keeps_existing_behavior (test_category_filter.ListTransactionsStackingTests) ... ok

----------------------------------------------------------------------
Ran 18 tests in 0.003s

OK
```

（18 个测试全部通过：4 个既有基线测试 + 14 个新增测试。）

### 2. `python3 -m ledger list --category food`（exit=0）

```
A-02 | 2025-01-01 | Food | $12.00
A-01 | 2025-01-01 | Food | $-1.95
C-01 | 2025-01-31 | food | $0.01
```

同时匹配 `Food` 与 `food` 两种原始拼写并原样输出。

### 3. `python3 -m ledger list --category " FOOD "`（exit=0）

```
A-02 | 2025-01-01 | Food | $12.00
A-01 | 2025-01-01 | Food | $-1.95
C-01 | 2025-01-31 | food | $0.01
```

strip + casefold 生效，结果与上一条一致。

### 4. `python3 -m ledger list --category nosuch`（exit=0）

```
（无输出）
```

空结果且成功退出。

### 5. `python3 -m ledger list --category food --start-date 2025-01-01 --end-date 2025-02-01`（exit=0）

```
C-01 | 2025-01-31 | food | $0.01
```

日期过滤（基线排他语义）排除了 2025-01-01 的 A-02/A-01，类别过滤仍生效，仅剩 C-01——两个条件叠加。

### 6. `python3 -m ledger list --category travel --start-date 2025-01-01 --end-date 2025-02-01`（exit=0）

```
B-01 | 2025-01-02 | Travel | $100.10
```

### 7. `python3 -m ledger list --category food --start-date 2025-01-01 --end-date 2025-01-31`（exit=0）

```
（无输出）
```

类别存在但日期区间排除全部，空结果、退出码 0（证明类别过滤未绕过日期过滤）。

### 8. `python3 -m ledger list`（无选项基线回归，exit=0）

```
A-02 | 2025-01-01 | Food | $12.00
A-01 | 2025-01-01 | Food | $-1.95
B-01 | 2025-01-02 | Travel | $100.10
C-01 | 2025-01-31 | food | $0.01
D-01 | 2025-02-01 | 家庭 | $3.50
E-01 | 2024-12-31 | Transit | $2.00
```

与改动前输出逐字节一致。

### 9. `python3 -m ledger summary`（exit=0）

```
Transactions: 6
Total: $117.56
```

summary 子命令不受影响。

### 10. `python3 -m ledger list --category 家庭`（exit=0）

```
D-01 | 2025-02-01 | 家庭 | $3.50
```

非 ASCII 类别精确匹配正常。

## 尚未完成的要求

无。题面全部要求已实现并验证。

## 会话隔离状态

- 所有读写均限制在本次运行目录内：代码/测试/文档改动仅发生在 workspace（`.../T06/R01/workspace`），本结果文件写在规定的运行目录根部（`.../T06/R01/BENCHMARK_RESULT.md`）。
- 未修改题目源文件、基准仓库（DeepSeek Harness 检出）或其他 T/R 运行目录；未联网、未增加依赖、未删改既有测试。
- workspace 最终 `git status --short`：`M docs/usage.md`、`M ledger/cli.py`、`M ledger/query.py`、`?? tests/test_category_filter.py`（相对冻结提交 ed2390f 的全部差异）。
