> **发布元数据**：MiniMax Code · Kimi K3（评测者确认）· R01
> **来源**：`minimax-code/输出/minimax-code/T01/R01/BENCHMARK_RESULT.md`
> **原始文件 SHA-256**：`418523eef1cfc4ab829c4dc5c75176023d5934d56e52fe0e0460c5f09b8e11b5`
> **规程说明**：本工具报告记载 12 题在单个批量会话中执行；与冻结会话隔离规程不符，本轮暂不进入严格排名。
> 本公开副本已将评测机绝对路径归一化；下文 PASS/FAIL/BLOCKED 是执行报告自述状态，不等同于独立验收结论。

---

# BENCHMARK_RESULT

BENCH-RUN T01 R01

## 题面（逐字）

> # T01：仓库调用链（只读）
>
> 只读追踪 `python3 -m ledger list` 的实际执行路径。从 `ledger/__main__.py` 的用户入口开始，按调用顺序说明参数解析、数据文件选择与读取、查询、格式化和 stdout 输出分别由哪些模块/函数完成；说明结果是否写入持久化存储。每个结论附真实相对路径和符号名，并区分直接调用与推断。不要修改任何文件，也不要只根据 README 推测。

## 状态：PASS

## 调用链分析（基于对 workspace 内冻结提交 ed2390f 源码的逐行阅读，并用只读命令验证）

### 1. 用户入口
- `ledger/__main__.py`（第 1–4 行）：`from .cli import main`，随后 `raise SystemExit(main())`。
  即 `python3 -m ledger` 的执行入口把控制权交给 `ledger/cli.py` 的 `main()`，并把其返回值作为进程退出码。（直接调用）

### 2. 参数解析
- `ledger/cli.py` `main(argv=None)`（cli.py:38）直接调用 `build_parser()`（cli.py:26）：
  `argparse.ArgumentParser(prog="ledger")`，全局选项 `--config`、`--data-file`；`add_subparsers(dest="command", required=True)` 注册子命令 `list`（带 `--start-date`、`--end-date`，cli.py:32–33）和 `summary`。
- `main()` 内 `parser.parse_args(argv)`（cli.py:40）完成实际解析，得到 `args.command == "list"`。（直接调用）

### 3. 数据文件选择
- `ledger/cli.py` `main()` 直接调用 `ledger/settings.py` 的 `resolve_data_file(cli_path=args.data_file, environ=os.environ, config_path=args.config)`（cli.py:42）。
- `resolve_data_file`（settings.py:8）按 CLI `--data-file` > 环境变量 `LEDGER_DATA_FILE` > `--config` 指定 JSON 的 `data_file` 键 > 模块级常量 `DEFAULT_DATA_FILE`（settings.py:5，即 `ledger/data/transactions.csv`）的顺序选择路径。（直接调用；优先级为 if/elif 链的直接阅读结论）

### 4. 数据读取
- `ledger/cli.py` `main()` 直接调用 `ledger/storage.py` 的 `load_transactions(path)`（cli.py:43）。
- `load_transactions`（storage.py:11）以只读模式 `Path(path).open("r", encoding="utf-8", newline="")` 打开 CSV，用 `csv.DictReader` 逐行读取；校验必需列 `{"id","date","category","amount"}`（storage.py:8, 15–18），对每行构造 `ledger/model.py` 的冻结数据类 `Transaction`（model.py:6）；日期经 `datetime.date.fromisoformat` 解析（storage.py:23，标准库直接调用），金额经 `ledger/money.py` 的 `parse_money(row["amount"])`（storage.py:25，直接调用）。

### 5. 查询
- `ledger/cli.py` `main()`（list 分支，cli.py:44–47）：先两次直接调用模块内 `_parse_cli_date`（cli.py:13）校验 `args.start_date` / `args.end_date`，再直接调用 `ledger/query.py` 的 `list_transactions(transactions, args.start_date, args.end_date)`（cli.py:47）。
- `list_transactions`（query.py:30）直接调用同模块 `filter_by_date`（query.py:16）；`filter_by_date` 先经 `_parse_date_bound`（query.py:4）把边界解析为 `date` 对象，再逐条比较 `transaction.date`（冻结基线上为排除边界的 `<=` / `>=` 跳过逻辑，见 query.py:22–25）。（均为直接调用）

### 6. 格式化
- `ledger/cli.py` `main()` 直接调用 `ledger/formatting.py` 的 `format_transactions(rows)`（cli.py:48）。
- `format_transactions`（formatting.py:15）直接调用同模块 `format_transaction`（formatting.py:8）逐条生成 `id | date | category | amount` 行；`format_transaction` 直接调用同模块 `format_money`（formatting.py:1）格式化金额。（均为直接调用）

### 7. stdout 输出与退出
- `ledger/cli.py` `main()`（cli.py:51–53）：`if output: print(output)`，随后 `return 0`。
  `print` 未指定 `file` 参数，写入标准输出 stdout（Python 标准库默认行为——此为对标准库语义的推断，非本仓库代码显式指定）。
- `ledger/__main__.py` 的 `raise SystemExit(main())` 把返回码 0 变成进程退出状态（直接调用）。

### 8. 是否写入持久化存储
- **否。** 整条 `list` 路径中唯一的文件操作是 `ledger/storage.py` `load_transactions` 里以 `"r"` 只读模式打开 CSV（storage.py:13）；`ledger/cli.py`、`ledger/query.py`、`ledger/formatting.py`、`ledger/summary.py` 中不存在任何写文件、改数据或网络 IO 调用（对全部模块源码的直接阅读结论）。运行 `python3 -m ledger list` 与 `python3 -m ledger summary` 前后 `git status --porcelain` 均为空，实测工作区无任何文件变化。

## 实际改动的文件

无（本题只读）。workspace 运行前后 `git status --porcelain` 均为 0 行。

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

```
$ python3 --version
Python 3.9.6

$ PYTHONDONTWRITEBYTECODE=1 python3 -m ledger list
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
exit=0

$ PYTHONDONTWRITEBYTECODE=1 python3 -m ledger summary
Transactions: 6
Total: $117.56
exit=0

$ git status --porcelain | wc -l
       0
```

（用 `PYTHONDONTWRITEBYTECODE=1` 避免产生 `__pycache__`，保持只读语义。）

## 尚未完成的要求

无。

## 会话隔离状态

本题在 `输出/minimax-code/T01/R01/workspace/` 独立副本中执行（从冻结提交 ed2390f2df8252f062abd9123e20f6fffca7e5ed 整体复制，含 `.git/`，复制后 HEAD 与工作树核对一致）。执行入口要求"每题使用独立会话"；实际执行为单个批量会话内按题隔离的独立 workspace，未复用其他题目的工作区，未读取本测试目录之外的资料。除此之外的会话级隔离元数据：UNKNOWN。

## 耗时

约 4 分钟（含基线核对与源码通读；秒级精确耗时 UNKNOWN）。
