ddb9a44f75
build_pools/_sample_excluding 与 PerCategoryPoolStrategy._split_one_category/ build_incremental 两条切分路径均改为以 QuestionUnit 为采样原子:progressive exclusion 互斥集合与 train/val 分层划分都按 unit_id 计数(pair 计 1 个 unit), 命中单元整体展开,AR 孪生对两题永不落入不同池/split。 复用 app.harness.question_units 的 build_units/flatten_units,不重写分组逻辑。 single-only 输入下 unit 与 question 一一对应、rng 消耗量不变,采样与划分结果 与逐题口径完全一致;抽出 _unit_correct/_assert_correctness_complete 两个 helper 将 _split_one_category 复杂度压回基线以下。 新增 tests/unit/test_pools_pair_atomic.py 覆盖两条路径的 pair 原子性回归。