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

---

# BENCH-RUN T02 R01

- 状态：PASS
- 任务类型：只读配置与错误路径分析（未修改任何文件）

## 实际执行的命令

```text
$ git rev-parse HEAD → ed2390f2df8252f062abd9123e20f6fffca7e5ed（workspace 与冻结基线一致）
```

（直接阅读 `ledger/cli.py`、`ledger/settings.py`、`ledger/storage.py` 源码进行追踪。）

## `python3 -m ledger list` 的数据文件配置流程

配置入口是 `ledger/cli.py::main` 中的一行调用：

```text
path = resolve_data_file(cli_path=args.data_file, environ=os.environ, config_path=args.config)
```

其中 `--config` 与 `--data-file` 是全局选项，在 `ledger/cli.py::build_parser()` 中由 `argparse` 注册（对 `list`、`summary` 两个子命令均生效）。

### 实际优先级（高 → 低）

由 `ledger/settings.py::resolve_data_file` 的 if/elif 链直接确认（非推断）：

1. **全局 `--data-file` 参数**（`cli_path`）：若提供即选为 `selected`。
2. **环境变量 `LEDGER_DATA_FILE`**：仅当未给 `--data-file` 时生效（`environ.get("LEDGER_DATA_FILE")`，空字符串视为未设置）。
3. **JSON 配置文件（`--config`）**：仅当前两者都未提供时生效。`settings.py` 以 `utf-8` 读取该 JSON，取其中 `data_file` 键。
4. **默认文件**：以上均未提供时返回 `ledger/settings.py::DEFAULT_DATA_FILE` = `ledger/data/transactions.csv`（由 `Path(__file__).resolve().parent / "data" / "transactions.csv"` 推导，即相对包安装位置，非进程 CWD）。

### 相对路径解析（`settings.py::resolve_data_file`）

- 所有来源先经 `Path(selected).expanduser()`（支持 `~`）。
- 来自 **JSON 配置**的相对路径：以**配置文件所在目录** `config_file.parent` 为基准拼接（`selected_base / path`）。
- 来自 `--data-file` 或 `LEDGER_DATA_FILE` 的相对路径：`selected_base` 为 `None`，不做基准拼接，最终 `path.resolve()` 以**进程当前工作目录（CWD）**为基准解析。〔由 `pathlib.Path.resolve` 语义推断，源码无显式 CWD 处理〕
- 默认值本身已是绝对路径，不经此逻辑。

### 错误处理

均在 `ledger/settings.py::resolve_data_file` 抛出，由 `ledger/cli.py::main` 的
`except (FileNotFoundError, ValueError, OSError)` 捕获，向 stderr 打印
`ledger: error: <msg>` 并返回退出码 **2**：

| 情形 | 行为 |
| --- | --- |
| `--config` 指向的文件不存在 | `FileNotFoundError("config file not found: ...")` |
| 配置 JSON 语法错误 / 非 UTF-8 | `ValueError("invalid config file ...: ...")`（捕获 `json.JSONDecodeError`、`UnicodeDecodeError`） |
| 配置不是对象、缺 `data_file` 或值非非空字符串 | `ValueError("config must contain a non-empty string 'data_file'")` |
| 最终数据文件不存在 | 在 `ledger/storage.py::load_transactions` 打开时抛 `FileNotFoundError`，同样由 `main` 捕获，退出码 2 |

### 最终读取者

无论路径来自哪个来源，最终都由 `ledger/storage.py::load_transactions(path)` 读取（`csv.DictReader`，utf-8），逐行构造 `ledger/model.py::Transaction`；CSV 缺列或行数据非法时抛 `ValueError`（行错误包装为 `invalid transaction at line N: ...`），亦由 `main` 捕获并以退出码 2 结束。

## 会话隔离状态

仅在本题独立 workspace `输出/cursor/T02/R01/workspace/` 中读取。耗时约 1 分钟。无未完成项；不确定处已在文中标注为推断。
