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

---

# BENCH-RUN T12 R01

- 状态：PASS（两轮均在本题同一会话内完成）

## 第一轮（`--by-category`，精确分组）

改动：
- `workspace/ledger/summary.py`：新增可复用的 `summarize_by_category(transactions)`（按原始类别文本精确分组求和）与 `format_by_category(transactions)`（每行 `类别: 金额`，类别按 Unicode 码点升序）。
- `workspace/ledger/cli.py`：`summary` 新增 `--by-category`（`store_true`）；不带时 `format_summary(summarize(...))` 默认输出不变。
- `workspace/tests/test_by_category.py`（新增）、`workspace/docs/usage.md` 用法说明。

第一轮验证：`python3 -m unittest discover -s tests -v` → Ran 9 tests, OK；`python3 -m ledger summary --by-category` 输出 `Food/Transit/Travel/food/家庭` 码点升序；默认 summary 输出不变。

## 第二轮（casefold 不区分大小写，本会话内在第一轮改动上继续）

补充约束落实：
- `summarize_by_category` 改为按 `category.casefold()` 分组；组内跟踪最小 `id`（Unicode 码点比较），显示该记录的原始类别拼写；返回 dict 按键的 casefold 升序排列。示例：默认数据中 `A-01(Food) < A-02(Food) < C-01(food)`，合并后显示 `Food`，合计 `1200-5+1=1196` 分；结果只依赖 id 与 casefold 键，**与 CSV 输入行顺序无关**（有专门乱序测试）。
- `format_by_category` 直接遍历已排序的合并结果。
- 测试更新为第二轮语义（合并、最小 id 拼写、casefold 升序、乱序稳定、CLI 输出），`test_cli_default_summary_unchanged` 保留不变；既有基线测试未动。
- `docs/usage.md` 说明同步更新。

第二轮验证：

```text
$ python3 -m unittest discover -s tests -v
Ran 11 tests in 0.002s
OK          （4 个基线 + 7 个本题测试，全部通过）

$ python3 -m ledger summary --by-category
Food: $11.96
Transit: $2.00
Travel: $100.10
家庭: $3.50

$ python3 -m ledger summary
Transactions: 6
Total: $117.56            → 默认汇总输出保持基准
```

## 会话隔离

两轮改动均仅限 `输出/cursor/T12/R01/workspace/`。耗时约 3 分钟。无未完成项。
