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

---

PASS

# T01 R01：仓库调用链（只读）分析结果

## 一、完整分析结论

追踪目标：`python3 -m ledger list`（无额外参数，在 workspace 根执行）。
以下所有相对路径以 workspace 为根；每条结论标注"直接调用"（源码中存在的显式调用/语句）或"推断"（由代码阅读/运行验证得出的间接结论）。

### 1. 用户入口
- `ledger/__main__.py`：`from .cli import main`，随后 `raise SystemExit(main())`。进程退出码即 `main()` 的返回值（成功 0，错误 2）。（直接调用）

### 2. 参数解析
- `ledger/cli.py` `build_parser()`：构造 `argparse.ArgumentParser(prog="ledger")`，全局参数 `--config`、`--data-file`；子命令 `list`（带 `--start-date`、`--end-date`）和 `summary`。（直接调用）
- `ledger/cli.py` `main(argv=None)` 第 40 行：`args = parser.parse_args(argv)`，`argv=None` 时 argparse 读取 `sys.argv`。（直接调用 + argparse 标准行为推断）
- `ledger/cli.py` `_parse_cli_date(value, field_name)`：在 `main` 中对 `args.start_date` / `args.end_date` 仅做格式校验（YYYY-MM-DD），校验结果被丢弃，不参与后续过滤。（直接调用；注意它与 `query.py` 的 `_parse_date_bound` 是刻意重复的代码，源码注释自述为 T07 重构任务保留）

### 3. 数据文件选择
- `ledger/cli.py` `main` 第 42 行调用 `ledger/settings.py` `resolve_data_file(cli_path=args.data_file, environ=os.environ, config_path=args.config)`。（直接调用）
- `ledger/settings.py` `resolve_data_file()` 内部的选择优先级（函数体顺序逻辑）：`--data-file` CLI 参数 > 环境变量 `LEDGER_DATA_FILE` > `--config` 指定 JSON 文件中的 `data_file` 键（相对路径相对配置文件目录解析） > 默认 `DEFAULT_DATA_FILE`（`ledger/settings.py` 第 5 行：`Path(__file__).resolve().parent / "data" / "transactions.csv"`，即 `ledger/data/transactions.csv`）。（直接代码逻辑；本次运行无任何参数与环境变量，实际落到默认文件——经运行验证）
- 路径最终经 `Path(...).expanduser()` 与 `.resolve()` 规范化。（直接调用）

### 4. 数据文件读取
- `ledger/cli.py` `main` 第 43 行：`transactions = load_transactions(path)`。（直接调用）
- `ledger/storage.py` `load_transactions(path)`：以 `Path(path).open("r", encoding="utf-8", newline="")` 只读打开，用 `csv.DictReader` 解析；校验必需列 `{"id","date","category","amount"}`（缺列抛 `ValueError`）。（直接调用）
- 每行构造 `ledger/model.py` 的冻结 dataclass `Transaction(id, date, category, amount_cents)`；日期用 `datetime.date.fromisoformat`，金额用 `ledger/money.py` `parse_money(value)`（float 往返转分为单位 int）。（直接调用）

### 5. 查询
- `ledger/cli.py` `main` 第 47 行：`rows = list_transactions(transactions, args.start_date, args.end_date)`。（直接调用）
- `ledger/query.py` `list_transactions()` 直接委托给同模块 `filter_by_date()`（直接调用）；`filter_by_date()` 内部用 `_parse_date_bound()` 解析边界（直接调用），过滤逻辑为**排他边界**：`transaction.date <= start` 或 `transaction.date >= end` 的记录被跳过（源码注释自述"T04 冻结基线刻意排他"；经 `--start-date 2025-01-01 --end-date 2025-02-01` 运行验证：2025-01-01 的 A-01/A-02 与 2025-02-01 的 D-01 均被排除）。无排序，保持 CSV 原始顺序。（直接代码逻辑 + 运行验证）

### 6. 格式化
- `ledger/cli.py` `main` 第 48 行：`output = format_transactions(rows)`。（直接调用）
- `ledger/formatting.py` `format_transactions()` 对每条记录调用同模块 `format_transaction()`，以 `\n` 连接（直接调用）；`format_transaction()` 产出 `"{id} | {date.isoformat()} | {category} | {money}"`，金额部分调用同模块 `format_money(cents)`（直接调用；该函数对负数有刻意缺陷，输出如 `$-1.95` 表示 -0.05 美元——源码注释自述为 T10 保留，运行输出已复现）。

### 7. stdout 输出
- `ledger/cli.py` `main` 第 51–52 行：`if output: print(output)`，结果经内置 `print` 写入标准输出；随后 `return 0`。（直接调用）
- 错误路径：捕获 `FileNotFoundError / ValueError / OSError`，向 `sys.stderr` 打印 `ledger: error: ...` 并 `return 2`（直接调用；本次 list 运行未触发）。

### 8. 是否写入持久化存储
- **结论：不写入。** 整个 `ledger/` 包中唯一的文件打开操作是 `ledger/storage.py` 第 13 行的只读 `open("r", ...)`（`grep -n "write\|open(" ledger/` 验证，无任何写模式 open、`write_text`、数据库或网络调用）；`list` 子命令路径（`main` → `resolve_data_file`/`load_transactions`/`list_transactions`/`format_transactions`/`print`）不含 `ledger/summary.py`（仅 `summary` 子命令使用），也无任何持久化调用。结果仅打印到 stdout。（推断，基于全包源码审查 + grep + 实际运行后 workspace 无新文件）

## 二、实际运行的命令及原始输出

命令 1（在 workspace 根）：
```
$ time python3 -m ledger list; echo "EXIT=$?"
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
python3 -m ledger list  0.03s user 0.01s system 94% cpu 0.051 total
EXIT=0
```

命令 2（验证排他边界与只读性）：
```
$ grep -rn "write\|open(" ledger/   # 输出仅 ledger/storage.py:13 的只读 open
$ python3 -m ledger list --start-date 2025-01-01 --end-date 2025-02-01
B-01 | 2025-01-02 | Travel | $100.10
C-01 | 2025-01-31 | food | $0.01
EXIT=0
```

## 三、耗时
- `python3 -m ledger list` 单次约 0.05 秒（time 实测：0.03s user + 0.01s system，总计 0.051s）。
- 整个分析任务（读 9 个源码文件 + 2 次运行 + grep）估算约 3–5 分钟。

## 四、尚未完成的要求
无。

## 五、会话隔离状态
本题在独立会话执行；只访问了本题 workspace（<评测根目录>/zcode/输出/zcode/T01/R01/workspace）内的文件，未读取基准仓库、题目目录或其他任务目录；未联网；未新增依赖；未修改 workspace 内任何文件（只读分析，运行命令均为只读，运行后 workspace 无新增/变更文件）；BENCHMARK_RESULT.md 按要求写在本题运行目录根部，未触碰 workspace。
