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

---

# BENCH-RUN T01 R01

# T01：仓库调用链（只读）— 结果：PASS

## 题面（逐字）

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

## 实际执行路径（按调用顺序）

1. **入口**：`python3 -m ledger` 执行 `ledger/__main__.py`：`from .cli import main`（第 1 行）并 `raise SystemExit(main())`（第 4 行）。【直接调用】
2. **参数解析**：`ledger/cli.py` 的 `main(argv=None)`（cli.py:38）调用同模块 `build_parser()`（cli.py:26），构造 `argparse.ArgumentParser`：全局 `--config`、`--data-file`，子命令 `list`（带 `--start-date`、`--end-date`）与 `summary`；随后 `parser.parse_args(argv)`（cli.py:40）完成解析。【直接调用】
3. **数据文件选择**：`main` 在 cli.py:42 调用 `ledger/settings.py` 的 `resolve_data_file(cli_path, environ, config_path)`（settings.py:8）。本题无 CLI/env/config 输入，走 settings.py:29-30 的 else 分支，返回 `DEFAULT_DATA_FILE`（settings.py:5，即包内 `ledger/data/transactions.csv` 的绝对路径）。【直接调用】
4. **数据读取**：`main` 在 cli.py:43 调用 `ledger/storage.py` 的 `load_transactions(path)`（storage.py:11）：`Path(path).open("r", encoding="utf-8", newline="")` 打开（storage.py:13，唯一文件打开点，只读模式），`csv.DictReader` 逐行解析并校验必需列；每行构造 `ledger/model.py` 的 `Transaction` 数据类（model.py:6，`@dataclass(frozen=True)`），其中日期经 `datetime.date.fromisoformat`（storage.py:23）、金额经 `ledger/money.py` 的 `parse_money(row["amount"])`（money.py:4，storage.py:25 调用）。【直接调用】
5. **查询前 CLI 日期校验**：`_parse_cli_date(args.start_date, "start_date")` 与 `_parse_cli_date(args.end_date, "end_date")`（cli.py:45-46，函数定义 cli.py:13）；本次均为 `None`，直接返回 `None`。【直接调用】
6. **查询**：`main` 在 cli.py:47 调用 `ledger/query.py` 的 `list_transactions(transactions, start_date, end_date)`（query.py:30），其整体委托给同模块 `filter_by_date`（query.py:16）；两个边界均为 `None` 时不做任何剔除，按输入顺序返回全部 6 条记录。【直接调用】
7. **格式化**：`main` 在 cli.py:48 调用 `ledger/formatting.py` 的 `format_transactions(rows)`（formatting.py:15），逐条经 `format_transaction`（formatting.py:8）拼出 `id | date | category | amount`，金额由同模块 `format_money(cents)`（formatting.py:1）格式化，各行以 `"\n"` 连接。【直接调用】
8. **stdout 输出**：`main` 在 cli.py:51-52 `if output: print(output)` —— 这是整条链路唯一的 stdout 写入；`main` 返回 `0`，由 `ledger/__main__.py` 的 `SystemExit` 结束进程，退出码 0。【直接调用】

## 是否写入持久化存储

**否。** 直接证据：对 `ledger/` 全包检索 `write|open(.*w|dump|save`，唯一的文件打开是 `ledger/storage.py:13` 的只读 `"r"` 模式；整条链路无任何写文件/写数据库调用。辅助观察证据：在本题 workspace 实际运行 `python3 -m ledger list` 后，`git status --porcelain` 输出为空（工作区无任何改动）。

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

```text
$ cd 输出/qoder/T01/R01/workspace && 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
$ git status --porcelain   # 输出为空
```

（观察备注：第二行 `$-1.95` 是冻结基线上 T10 待修的负数格式化缺陷的可见表现，与本题只读追踪无关。）

## 实际改动

无（只读任务）。`git status --porcelain` 确认为空。

## 耗时

UNKNOWN（未使用计时工具精确测量；本题在数分钟内完成）。

## 未完成项

无。

## 会话隔离状态

本题使用独立 workspace（`输出/qoder/T01/R01/workspace/`，自冻结提交 `ed2390f2df8252f062abd9123e20f6fffca7e5ed` 完整复制，含 `.git/`），未读取或修改其他题目/轮次目录、基准仓库或题面源文件。
