# Prompt 02：清理、Table 1 与固定划分

## 背景

这是流程的第二阶段：在已核查的数据上做规则清理、生成描述性 Table 1，并完成训练/测试固定划分与交叉验证折成员登记。从本阶段起，测试集被冻结，后续任何学习（插补、编码、筛选、调参、阈值）都不得接触它。对应 Book 3 第 2 章后半，参考实现见 `Demo_R_Project/R/02_clean_table1_split.R`。

## 数据说明

- 输入：上一阶段产出的原始快照（含行 ID 变量 `<行ID变量>`）；
- 数据字典：`<数据字典路径>` 或上一阶段生成并经确认的字典；
- 结局变量：`<结局变量>`；正类：`<正类>`；
- 划分参数：训练比例 `<训练比例>`，交叉验证折数 `<折数>`，随机种子 `<种子>`；
- 清理规则：以字典与预先约定的规则为准（类型修正、非法值处理、因子水平合并等），不临场发明规则。

## 当前任务

完成类型与编码核查、按规则清理并记录清理日志、生成 Table 1、按结局分层完成训练/测试固定划分、登记训练集内的 fold 成员。Table 1 只用于描述，不用于筛选变量。

先检查输入并给出简要计划，然后继续执行指定任务；不要在计划后等待用户再次确认。只有输入冲突、字典冲突、必须改变方法或命中暂停条件时停止。

## 方法

1. 读取快照，逐变量核对类型与编码是否与字典一致，不一致处记录并按预定规则处理；
2. 执行清理规则，将每一步处理（变量、规则、影响行数）写入清理日志；
3. 在清理后的全队列上生成 Table 1（按结局分组的描述统计，含缺失行），仅作描述；
4. 以 `<种子>` 设种子，按 `<结局变量>` 分层，以 `<训练比例>` 划分 Training / Holdout Test；
5. 写出 split 成员清单（`<行ID变量>` + split 标签），并断言训练与测试成员无交叠；
6. 仅在 Training 内按结局分层生成 `<折数>` 个 fold，写出 fold 成员清单（`<行ID变量>` + fold 编号），并断言 fold 恰好划分训练集；
7. 清理后的分析队列落盘，供后续阶段使用。

## 输出

- `data/derived/`（或约定目录）下的清理后队列；
- `results/tables/cleaning_log.csv`：清理日志；
- `results/tables/table1.csv`：Table 1；
- `results/tables/split_manifest.csv`：训练/测试成员清单；
- `results/tables/fold_manifest.csv`：fold 成员清单；
- 日志：记录划分参数、两侧样本量与事件数、断言结果。

## 约束

- 原始快照只读；清理只产生新文件，不回写原始数据；
- 描述与筛选分离：Table 1 不用于筛变量，不按单因素 P 值决定后续建模输入；
- 不按缺失比例自动删变量；插补不在本阶段做（后续在训练范围内学习）；
- 测试集自本阶段起冻结：不参与任何后续学习，直到模型锁定后仅评价一次；
- 种子、训练比例、折数只来自 `<种子>`、`<训练比例>`、`<折数>`，不在多处各存一份；
- 全程使用仓库内相对路径。

## 验收

- 清理日志每一步可查（变量、规则、影响行数），清理后队列行数与日志一致；
- Table 1 可读，各组人数与队列一致；
- `split_manifest.csv` 中训练/测试成员无交叠，合计等于队列行数，事件分层大致保持；
- `fold_manifest.csv` 的行 ID 集合与训练集完全一致，fold 数等于 `<折数>`；
- 日志记录的划分参数与指定值一致，断言全部通过。

## 暂停条件

出现以下任一情况，停止并报告，等待人工决定：类型/编码与字典冲突且无预定规则；清理规则需要临场改变；划分后训练或测试侧无事件；成员清单出现交叠或遗漏；fold 未能恰好划分训练集；结局编码与上阶段记录不一致。
