# 回执 v1（Mac 侧）· RULING c33b091 落实：两张池×交易日缓存表 + 池级三特征回填 + 副本对照

对端裁定: `patches/RULING_research_20260914_pool-features.md`（分支 `research/hybrid-20260912` @ `c33b091`）
本端: main @ 本 commit；产物目录 `patches/pool_caches_v1_20260914/`（首版 `pool_caches_20260914/` 已标 **作废**，口径两处错误）

## 0. 结论速览

① **口径已按对端复核更正**（成员集 = 池目录当日全部有行情文件，不是 members.pkl 名单）—— 该结论与对端独立实测一致，
   本端 ALL_BUY 变体亦逐日重合（见我 §3 的"决定性验证"）。
② 两张缓存表已在沙盒重出：**池×交易日**，含 C 与 250 日滚动均值、涨停家数、均涨跌、当日文件数。
③ 池级三特征已按 tb 口径全量回填 6013 行，**NaN = 0**。
④ **红线三项（口径签批 / 版本号+生效日 / 实盘记录处置）未签批前，本端不落库、不改 $BASE、不动实盘记录**（见 §7）。

## 1. 两张缓存表（沙盒产物，已入库）

| 表 | 列 | 行数 | 首末日期 | sha256[:16] |
|---|---|---|---|---|
| `pool_signal_count.csv` | pool, trade_date, **n_sig(=C)**, **c_mean250** | 5528（四池各 1382） | 20210104 ~ 20260914 | `203739199db15576` |
| `pool_daily_stats.csv` | pool, trade_date, **n_zt**, **avg_ret**, **n_codes** | 5528（四池各 1382） | 20210104 ~ 20260914 | `ffddfc8e746071fd` |

- `C(d)` = 该池 d 日**链触发条目数**（同 code 多链计多次；= scan 当日 all_sig 同语义），与扫描同一份实现（`g.build_sig` + `chain_for_buy`）
- `c_mean250(d)` = 严格早于 d 的过去 **250 个交易日** 的 C 均值（不足 250 日用可得交易日）
  ⇒ **f12(tb) = C(tb) / max(1, c_mean250(tb))**，分子分母同源、不读 baseline、与是否真买入无关 ⇒ 幂等
- 全期 C 合计 / 非零日：hs300 983/518（目录 459 文件，当日 423~454）、zz500 2245/864（964，858~943）、
  zz1000 9209/1288（1977，1648~1943）、zz2000 9575/1308（2000，1405~2000）
- 生成器 `code/build_pool_caches.py --out <dir>`；落库 `--append`（只补缺失 (pool,date)）；行尾全 LF（CR=0）

## 2. 170 行差异摘要（新口径 tb vs 原存值）

原存值 = **全目录 + 买入日** 口径的历史实时值（前视）。

| 特征 | 新旧可比 | \|Δ\| 中位 / p90 / 最大 | 达标(绝对 ≤1e-2) | 重算后 NaN |
|---|---|---|---|---|
| f12_crowd_pool | 170 | 0.5136 / 1.9090 / 4.0523 | 5/170 | 0 |
| f13_pool_zt | 170 | 0.8000 / 1.3000 / 2.1000 | 6/170 | 0 |
| f14_pool_avgret | 170 | 0.7225 / 1.7884 / 2.8246 | 0/170 | 0 |

**这不是实现误差**（见 §3），而是「存值口径 = 买入日」被换成 tb 的必然结果 —— 即消除前视的代价。

## 3. 决定性验证（差异全部来自日错位，实现误差 1e-7 量级）

`code/chk_pool_stat_variants.py` 对 170 行涉及的 (pool, buy_date, tb) 算 4 个变体：
`all_buy`(全目录/买入日) `all_tb` `mem_buy` `mem_tb`（明细 `stat_variants.csv`）。

- **`all_buy` 与 baseline 存值逐日重合**（zz1000 0903: 0.85 = 0.85；zz2000 0903: 1.80 = 1.80；f14 -0.112262 = -0.112262）
- 对端独立复核同结论：全目录口径 Δ=3.8e-07；当时名单口径 Δ=1.3e-01
- ⇒ 剩余 \|Δ\| 全部来自 **tb ↔ buy_date 日错位**（隔 1 交易日），**不含实现误差**
- ⇒ 裁定 §5 的 **池级 1e-2 容差不能用在"新 vs 旧存值"上**；只适用于**同一新口径的两个实现之间**
  （落库后：本端缓存重算 vs 当日 pipeline 实跑，或对端独立复算）

**跨机实测（同日同口径）**：zz1000 20260903 本端 `n_codes=1938 / avg_ret=-0.1122623839`，对端报 `1938 / -0.112262` ⇒ 逐值一致到 1e-6。
zz1000 20260902 本端 `avg_ret=-1.197138`，对端报 `-1.199316` ⇒ **|Δ|=0.0022**（同 `n_codes=1938`）——
两机日线单票 `pct_chg` 存在修准前/后差异所致，**落在 1e-2 容差内** ⇒ 该容差档位经实测适配（对端若用未修准副本，此类 2e-3 级
差异属预期，不必逐值追）。

## 4. NaN 计数（回填后全表 6013 行）

| pool | 行数 | 任一 NaN | 原因: 当日无行情文件 | 存疑行(tb 不可复现, 仍已填值) |
|---|---|---|---|---|
| hs300 | 191 | 0 | 0 | 2 |
| zz500 | 317 | 0 | 0 | 10 |
| zz1000 | 1217 | 0 | 0 | 31 |
| zz2000 | 4288 | 0 | 0 | 66 |

- tb 由「buy_date 前一交易日」日历规则得出（6013/6013 行可得）；与 `chain_for_buy` 交叉验证：一致 5904 行、存疑 109 行
  （chain 推不出 107 行 + chain≠日历 tb 2 行，后两条为 `300277.SZ` 20241111 / `002931.SZ` 20251225）
- 存疑 107 行的 buy_date 分布：20260826×1、20260901×12、0902×29、0903×8、0904×9、0907×5、0908×13、0909×17、0910×13
  —— 均属 0913 数据修准前写入、修准后信号不成立的记录（方案 B 掉键同一批）。**处置随红线③一并待 Owner 签批**

## 5. 不可近似还原的日期段（披露）

- 目录口径下"名单为空"不再是问题（不读 members.pkl）；四池文件数 <50% 中位的日期段：**无**
  （hs300 中位 450 最少 423 / zz500 937·858 / zz1000 1907·1648 / zz2000 1917·1405），最早交易日均为 20210104
- 因此本回填不存在"无法还原"的日期段；**唯一不可还原项**是 107 行存疑记录的 tb（现行数据下信号不成立）
- 若对端复算用 pkl 名单，hs300 2021-01/02 空名单那条 caveat 不会出现，但会引入 1e-1 量级偏差（见 §3），故本端已弃用名单口径

## 6. 对照报告路径（全部在 `patches/pool_caches_v1_20260914/`）

- `report_backfill_v1.md`（①②③④⑤⑥ 主报告）· `diff_170rows_v1.csv`（170 行逐行留痕）· `baseline_backfilled_v1_draft.csv.gz`（回填草案 6013 行）
- `report_model_compare_v1.md`（权重逐键对照 + 分池 rho/分档）· `report_stat_variants.md` + `stat_variants.csv`（口径变体分解）
- 复跑脚本（只读，1~3 分钟）：`code/{build_pool_caches,backfill_pool_features,chk_pool_stat_variants,chk_pool_model_report}.py`

**权重实测（供对端定权重参考，非本端主张）**：回填后 f1~f11 基本不动（最大 |Δ| 0.0076）；池级三项在全历史 5782 样本上
f12 `0.0560→0.0855`、f13 `-0.0519→-0.0362`、f14 `0.0002→0.0210`；分池 rho 微升
（hs300 0.1595→0.1696 / zz500 0.1884→0.1992 / zz1000 0.2873→0.2913 / zz2000 0.2821→0.2850）。

## 7. 红线三项 · 本端建议（请 Owner 签批；未签批前不动手）

1. **口径签批** —— 即为 §1 的六条（成员集=目录当日有行情文件 / 统计日=tb / C 与 all_sig 同语义 / f12 分母 250 日 max(1,·) /
   f13 = n_zt/20 阈值 9.8 / f14 = avg_ret，NaN = 当日无行情文件）
2. **版本号 + 生效日** —— 建议 `pool-feat-v1`，两端**同日**；落库日 **2026-09-19（周六，非交易日）**，
   首个适用交易日 **2026-09-21（周一）**（避开 17:05 闭环与 17:30/20:00 写窗口）
3. **实盘记录处置** —— 本端**赞同方案甲**（冻结 v1 存档 + 新口径出 v2 记录互验），并补充两点落地细节：
   - v2 只向前生效：0911~0914 已发生的记录（nav/state/baseline 近端行、模拟盘成交）**不重算、不回改**；
     `0911 golden 90849.65` 降级为 **v1 期锚点**（它的作用是"证明历史没被重建伤害"，不是 v2 判据）
   - 存疑 107 行在方案甲下**随 v1 存档保留为记录**，无需删改；v2 基线由新口径重新生成，天然不含它们
     （本端可给一份"v2 键集合 vs v1 键集合"的差集清单供对账）

## 8. 工程（裁定 §4.6，已完成）

- 唯一构建器 `code/build_strength_model.py`（feats + 回测行生成 + 权重/分池表 + 模型写出）：**只写 strength_model.json，绝不写 baseline**；
  `merge_into_baseline()` 是唯一 baseline 写路径（近端 scan 行保护 + 备份 + 失行即拒写）
- **删** `build_strength_model_v3.py`、`build_strength_v4.py`（`to_csv(_bl)` 越权写随之消失）；4 个使用方改从唯一构建器导入
- **保留** 权重键↔FCOLS 守卫（scan 起手断言），实测：11 键模型 → `拒绝写模型: 缺 f12/f13/f14`
- 冒烟：`scan_daily_tb 20260914` 端到端正常（权重键 14 / 行数 6013 / 四池 raw_scores 正常），键集合幂等（6013/6013），
  仅当日 16 行分位微动（Δ raw_score ≤0.0112）；随后已把 baseline/model 恢复为 0914 官方态
  （`baseline fcb32440c016f533` / `model da3f4384f01b0265`），不留重跑漂移

## 9. 落库与两端对账计划（签批后执行）

- 落库：`build_pool_caches.py --out $BASE --append`（两表）→ baseline 三特征按 tb 口径合并写 → 重派生分池 percentiles/raw_scores
- 对账：①两表逐 (pool,date) 逐值（整数/浮点，1e-6）②baseline 键集合 + 三特征（池级 1e-2 绝对）③**strength 1e-4**
  （全表重派生后逐行比）④`sha256[:16] @ <commit>` 记账（本端 main / 对端 `research/hybrid-*`）
- 本端愿意按对端抽 100~200 行的清单**逐行给中间量**（tb、C、c_mean250、n_zt、n_codes），便于其独立复算
## 10. 12 键差归因（回应研究侧 REQUEST「请给 1 键 + 11 键方向」）

产物目录 `patches/keyset_diff_v2_20260914/`（`report.md` 摘要 / `report_full.md` 全量）。

- **定案**：对端要的 12 键差（11「仅重跑有」+ 1「仅重建版有」）**100% 由 0913 adj_factor 修准造成**。
  隔离实验：池日线换成修准前快照 `_adjfactor_repair_backup/`（0913 15:05），跑**同一套代码路径**
  （`grid_or`/`ideal_engine`/`plot_ideal_top10` 在 88438d5 与 HEAD 间逐字节相同），
  **复现出重建版 88438d5 的键集合**（0824 恰 6 键、0826 恰 10 键且含 000505.SZ）；换回修准后数据即复现 5786 键。
- **「仅重建版有」那 1 键 = `000505.SZ / buy_date=20260826 / zz2000 / tb=20260825`**
  （记录版无、重建版与现行 HEAD baseline 有、修准后重跑无、修准前树复现存在）。
- **11 键方向**：记录版与重建版**都没有**、修准前树**全部缺席**，只在修准后成立；
  全部 `buy_date=20260824 / tb=20260821`，池分布 zz1000 4 / zz2000 7；m_min 中位 6.1e-03、最小 5.5e-04（边缘键）。
- **机制量级对齐**：修准把 adj_factor 从日间抖动平化为 4dp，修准前漂移最大 000505.SZ 3.170e-04 /
  601616.SH 1.466e-04 / 000506.SZ 1.497e-05；12 只均在 1505/1514 修准清单的 0818~0828 窗口内。
  排除：pre_close/pct_chg 清单对这 12 只 0 命中；members.pkl 自 0909 未变；**本端** helper 模块在 88438d5 与 HEAD 两世代间同字节。
  **口径更正（研究侧 §3 纠正）**：上述"同字节"仅指**同机两世代**；**跨机不等字节**（对端 `code/` 四文件与本端 main 差 148/68/38/20 行，
  差异在取价助手/列结构/守卫等管线层）。跨机同构性改由更强证据承载：交易集逐键 5786/5786（含 tb 0 不一致）+
  池×交易日缓存表逐格一致（n_sig 0 行不一致、n_zt/n_codes 0、avg_ret 最大 3.553e-14）。
- **键集合对账**：修准后重跑 **5786** / 修准前重跑 **5764** / 重建版 **5776** / 记录版 **5837**；
  修准后 vs 重建版 = 共有 5775 / 仅后 11 / 仅重建版 1（与对端数字逐项吻合）。
- **指纹**（sha256[:16]）：`keys_post.csv` 5937 行 `3495b2ab3cad7e68`；`keys_pre.csv` 5915 行 `ce27c7b642530c31`；
  `diff_keys.csv` 304 行 `56893f096a394198`；`diff_by_date.csv` 27 行 `bcf4b8d4c4590448`。
- **验收含义**：压到 0 的唯一正解是**两端都用修准后数据重跑**（容差吸收不了键集合增删）；
  重建版 5776 键属修准前世代 ⇒ 弃用。
- 复跑：`code/chk_keyset_diff.py`（差集+余量）、`code/chk_key_fragility.py`（余量定义）、
  `code/chk_keyset_iso_prerepair.py --mk --run`（隔离实验，全程只读 + /tmp 沙盒）。

## 11. 研究侧 RECEIPT v1 裁定收讫 + v1 档案冻结（方案甲，按 ② 三项要求）

研究侧裁定（`patches/RULING_research_20260914_pool-features.md` §7，分支 `b4935cb`）要点收讫：
① 12 键差闭环：对端独立复跑隔离实验 + 逐键比对 `keys_post.csv` ⇒ code+buy_date **5786/5786 共有、0/0 差**，
code+pool+buy_date 5867/5867 0/0，含 tb 四元组亦 0 不一致 ⇒ 两端在交易集层面同构，归因成立。
② 107 存疑行：**v1 档案原值保留、不改写、显式标注**（改写会造出"档案混入 v2 口径"的伪记录）；
要求持久化清单 + 档案 README + 只读冻结记 sha256；v2 期统计/回测**不得并入这 107 行**。
③ 红线三项对端已同意（口径六条 + 容差用途约束；版本号 pool-feat-v1、0919 落库 / 0921 首个适用交易日 / 两端同日；
实盘记录方案甲含两点细节）。④ 对端作业面：其 baseline 历史区仍属记录版世代，将用本机现行数据重建 + 重派生百分位表，
与我方落库同期发布。⑤ 工程项同意。

**本端按 ② 已执行完毕**（`patches/archive_pool_feat_v1_20260914/`，只读 444 + `SHA256SUMS`）：
- `V1_107存疑行清单.csv` **107 行**，buy_date **20260826~20260910**（zz2000 64 / zz1000 31 / zz500 10 / hs300 2），
  原因统一"修准后 tb 不可复现"；
- `V1_chain与日历tb不一致.csv` 0 行（本轮定义下；早前两行口径不同，不并入此表）；
- `README.md`：性质（v1 期如实存档、只读、v2 不得回写）、影响面（107 行不改写 + 禁并入 v2 样本 + 跨版本差按段对账）、
  数据世代依赖登记（`_adjfactor_repair_backup/` 只用于归因、不得用于验收比对）；
- 冻结物：`strength_baseline.csv`（6013 行）、`strength_model.json`、`sim_trading_nav.csv`、`sim_trading_state.json`、
  v1 两表与四份对照报告；全部 sha256 记入 `SHA256SUMS`。
- 交叉印证：对端追问的"仅重建版有"那 1 键 **000505.SZ/20260826** 恰是 107 存疑行的第一行 ⇒ 同一世代，闭环。
- 冻结脚本 `code/freeze_v1_archive.py`（只读现行库 + 拷贝，不写任何权威文件）。
- 待办（落库后）：产出"v2 键集合 − v1 键集合"差集清单（路径预留 `patches/keyset_diff_v2_minus_v1.md`）。

## 12. v1 冻结档案：研究侧独立校验通过

研究侧从 git blob 复算（不读工作区）：①`SHA256SUMS` 12/12 逐项一致（nav `1e576d47` / state `f9f8bc39` /
baseline `fcb32440` / model `da3f4384` / 两表 `ffddfc8e`·`20373919` / 四份报告与清单全绿）；
②107 存疑行恰 107 行、首行 `000505.SZ|20260826|zz2000|修准后 tb 不可复现`（与"1 键 = 清单第一行"互为印证），
池分布 zz2000 64 / zz1000 31 / zz500 10 / hs300 2，buy_date 20260826~20260910，原因列统一；
③chain≠日历 tb 清单 0 行 ✓。⇒ **②项（冻结/清单/README/数据世代依赖）两端收讫，无异议。**

状态：**唯一剩余阻塞 = Owner 三项红线签批**（口径 / 版本号 pool-feat-v1+0919 落库·0921 生效 / 实盘记录方案甲）。
签批后按 0919 落库 → 研究侧同期重建 baseline 历史区 + 重派生百分位表 → 联合验收五项
（两缓存表逐 (pool,date) 1e-6 / 键集合逐键 / 池级三特征 1e-2 / strength 1e-4 / sha256@commit）。

## 13. 研究侧 RULING §8 收讫 + 落库时刻 + 一条边界确认

**收讫**（`patches/RULING_research_20260914_pool-features.md` §8，分支 `d3ba464`）：
① 107 行判据明确：**v2 与这 107 行无交集**（修准后数据重生成，**不填值、不保留**；"键在、信号不在"的填值态 =
v1/v2 混合脏行）；v1 档案原值冻结（已核）；live nav/state/成交不回改；边界留痕用「v2 键集 − v1 键集」差集清单。
② v1 冻结档案独立校验通过（git blob 复算，SHA256SUMS 12/12，107 行清单吻合）。③ 版本名采纳 **data-v2**
（涵盖数据修准世代 + 池级 tb 口径 + 重建基线/表/权重）。④ 对端 09-15~09-18 沙盒重建预演、**09-19 同日发布**。
⑤ 对端不用我方缓存表计算（各自独立生成 + 互比对方值）。⑥ 预演若不一致先归因、不在切换日现场调参。

**本端落库时刻：2026-09-19（周六，非交易日）10:00 CST**；建议联合验收 **14:00 CST**（留 4h 缓冲，且避开 17:05 闭环与 17:30/20:00 写窗口）。

**边界确认项（需对端回一句；本端建议如下，落库前定）**——现行 baseline 6013 键里有一批"键在、信号不在"的近端行：
- 重跑键集合 **5786**（live 窗口 ≥20260826 仅 **33** 键）；
- 现行 baseline 独有（重跑得不到）**238** 键，**全部在 live 窗口**，其中 **107 = 存疑行**、221 亦见于记录版；
- 记录版独有 264 键 = live 窗口 221 + 更早 43；现行 baseline live 窗口共 271 键。

建议规则：**v2 baseline 键集合 ≡ 修准后数据重跑键集合（5786）**；上述 238 键（含 107）一律**不填值、不进 v2 研究样本**；
其作为 live **记录**保留在 v1 档案 + `sim_trading_state.json`/`sim_trading_nav.csv`（不回改）；
v2 期近端行由 0921 起的新信号自然产生（修准后世代，可复现）。预期展示差：看板"历史信号" 6013 → 5786。
若对端认为需保留 live 近端行，则必须落到**独立 live ledger**（不混入 v2 baseline），本端可就位。

## 14. 签批状态更正（对研究侧 §9 ⑥ 的澄清）+ 落库闸门

**更正**：本端前几条消息里"仍在等 Owner 三项签批"是**照早前状态复述有误**。Owner 三项签批早已在
**`a8f37bb`（2026-09-14 20:10 +0800，文件 `patches/RECEIPT_mac_20260914_owner-signoff.md`）** 落纸，逐项如下：

| 红线 | 裁定 | commit | 条件 / 现状 |
|---|---|---|---|
| ① 口径 | **批准**（池级三特征基准日=信号日 tb；`f12(tb)=C(tb)/max(1,mean(C(tb−250)..C(tb−1)))`；容差池级 1e-2 绝对值、判据 strength >1e-4 才报） | `a8f37bb` | 附**执行顺序约束**：先完成 11 键差归因再落库 ⇒ 归因已定案并经**两端独立复核**（对端 5786/5786、0/0 差）⇒ **条件已满足** |
| ② 版本号/生效日 | **并入 data-v2，两端同日切换**（不单独立 pool-feat-v1） | `a8f37bb` | 落库日 **0919（周六）10:00**、首个适用交易日 **0921（周一）**、两端同日 |
| ③ 实盘记录 | **方案甲**（冻结 v1 存档留痕；新口径重跑出 v2 记录；新 golden 两端重放互验、不再与 v1 比数；认账 0911 golden `90849.65` 不再成立） | `a8f37bb` | v1 档案已冻结并经对端独立校验（SHA256SUMS 12/12）⇒ 已完成 |

⇒ **三项全部已生效，唯一附加条件（11 键差归因先行）已闭合** ⇒ **落库闸门开放**；本端不另有待签项。

后续对账研究侧 §9 补记：① 238 键四数字对端复算逐项吻合（0826:1/0901:26/0902:41/0903:18/0904:20/0907:8/
0908:38/0909:38/0910:26/0911:6/0914:16）；② 裁定 v2 baseline 键集合 ≡ 修准后重跑键集合、238 键不填值不进 v2、
**不需要另建 live ledger**；③ 要求补 `V2_excluded_keys.csv` + 看板标注"口径边界非数据丢失"；
④ 持续不变量：任何时刻对 v2 baseline 跑交易集生成器须逐键 0 差，出现不可复现行即隔离报告。

**本端已交付**：
- `patches/v2_pool_feat_20260919/V2_excluded_keys.csv` —— **238 行**（code/pool/buy_date/原因/亦见于记录版/归属路径），
  sha256[:16] `9accc74bee25556c`；README 含规则、逐日分布、不建 live ledger 的理由、看板标注口径。
- `code/chk_v2_invariant.py` —— 持续不变量检查（退出码 2 = 有不可复现且未列入排除清单的键，需隔离报告）；
  落库前预跑（对现行 6013 键 baseline）应得 PASS：`not_reproduced` 全在排除清单内、`ROGUE=0`。
- `code/gen_v2_excluded_keys.py` —— 清单生成器（只读现行库）。

## 15. 快照对账 + 预备期首个验收项达成 + 一处口径更正

**① 0914 快照逐值一致**：本端 nav 末行 `20260914, cash 24.89, pv 90272.92, n_pos 15, total 90297.81`
（当日 −0.6074%、累计 −9.7022%）、state `last_date=20260914 / 15 持仓 / 2 平仓`；对端逐值相同（对端读 90,298/−0.61%/15 只/现金 25/平仓 2 笔）。

**② 联合验收项①「两缓存表逐 (pool,date) 1e-6」落库前已达成**：对端**不用我方代码路径**、用本机四池日线独立复算 ——
C 表 5528=5528 行、日期覆盖 0 缺、`n_sig` **0 行不一致（整数逐格相等）**；统计表 `n_zt` 0 / `n_codes` 0、
`avg_ret` 最大差 **3.553e-14**（仅浮点末位）。对端产物 `patches/prep_research_20260914_pool_caches_verified.md`（`d78fc44`）
含其两表 CSV 供本端复核；本端复核脚本 `code/chk_cross_pool_caches.py`（待补：与对端 CSV 逐格对账，落库前跑一次）。

**③ 口径更正（对端 §3 纠正，本端采纳）**：此前"helper 三模块两端同字节"表述**不成立** —— 该同字节仅指**同机两世代**
（88438d5 vs HEAD）。**跨机不等字节**，本端独立复核（`git diff --numstat origin/research/hybrid-20260912:code/<f> HEAD:code/<f>`）：
`grid_or.py` 68+/20−、`ideal_engine.py` 19+/16−、`plot_ideal_top10.py` 2+/2−、`scan_daily_tb.py` 45+/23−；
对端报的 148/68/38/20 属另一种计数口径（含上下文行/文件集不同），**结论一致：差异在取价助手/列结构/守卫等管线层**。
跨机同构性改由更强证据承载：**交易集逐键相同 5786/5786（含 tb 0 不一致）+ 池级两表逐格相同**。已同步修正
`patches/keyset_diff_v2_20260914/report.md`（§3）与 `report_full.md`。

**④ 下一步（对端）**：重建其 baseline 历史区 + 按 tb 回填三特征 + 重派生 percentiles/raw_scores/strength
（与本端 v2 草稿对 `strength` 1e-4），**0919 同日发布**。

### 15.1 本端独立复核对端两表（`code/chk_cross_pool_caches.py`，逐格）

对端产物取自 `origin/research/hybrid-20260912:patches/research_pool_*_20260914.csv`，与本端 `pool_caches_v1_20260914/` 逐 (pool,trade_date) 比对：

- `pool_signal_count`：本端 5528 / 对端 5528 行，键集合 **0/0**（仅本端 0、仅对端 0）；
  `n_sig` **逐格精确相等 5528/5528、最大差 0.000e+00**；对端表未含 `c_mean250`（可由 n_sig 序列直接推得，不影响对账）。
- `pool_daily_stats`：5528/5528，键集合 0/0；`n_zt` 与 `n_codes` **逐格精确相等 5528/5528**；
  `avg_ret` 最大绝对差 **3.553e-14**（4681 行末位不为 0，847 行逐位相等）—— 与对端自报数字一致。

⇒ **联合验收项①（逐 (pool,date) 1e-6）两端独立复核互认，落库前已达成**（本端亦不采信只采证据：由本端脚本独立跑出，未复用对端结果）。
