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

---

BENCH-RUN T12 R01

# T12 多轮约束保留

## 结果
PASS

## 第一轮改动
- `ledger/summary.py`：新增可复用 `summarize_by_category(transactions)` 与 `format_by_category(transactions)`；`summary` 新增 `--by-category`，每行 `类别: 金额`，默认汇总输出不变。
- `ledger/cli.py`：`summary` 子命令加 `--by-category`。
- 新增 `tests/test_by_category.py`、`docs/usage.md` 用法说明。
- 验证：套件 OK；`Food: $11.95 / Transit: $2.00 / Travel: $100.10 / food: $0.01 / 家庭: $3.50`，精确分组、码点升序。

## 第二轮改动（在现有改动上叠加）
- `summarize_by_category` 改为：分组键用 `category.casefold()`（不区分大小写），仅大小写不同的类别合并为一组；每组显示该组中 **`id` 最小记录的原始类别拼写**（用 `min_id` 跟踪）；输出按 casefold 后的键升序。逻辑基于键聚合，与输入行序无关，结果稳定。
- `format_by_category`、`docs/usage.md`、测试同步更新；新增第二轮专项用例（大小写合并、最小 id 拼写大/小写两种、casefold 排序、行序无关稳定性、ß→ss、CLI 合并）。

## 实际运行的命令与结果
- 第一轮后 `python3 -m unittest discover -s tests` → Ran 9 tests，OK。
- 第二轮后 `python3 -m unittest discover -s tests` → Ran 14 tests，OK（exit 0）。
- 第二轮 CLI 实证：`summary --by-category` →
  ```
  Food: $11.96
  Transit: $2.00
  Travel: $100.10
  家庭: $3.50
  ```
  默认数据 `Food`(A-02 12.00 + A-01 −0.05) 与 `food`(C-01 0.01) 合并为 1196 分 `$11.96`；组内最小 id 为 A-01（拼写 `Food`），显示 `Food`；`food` 不再单列。默认 `summary` 输出不变。

## 耗时
约 5 分钟（两轮）。

## 未完成项
无。

## 会话隔离状态
两轮均在 `输出/workbuddy/T12/R01/workspace/` 同一题工作区内完成，未读取父目录或其他工具目录，未修改基准仓库或题面。
