
=== attempt 1 (timeout=False) ===
`data/` (135MB, `run.sh` re-downloads it) is excluded from delivery per the spec, so I'm leaving it in place. All required deliverables are present and verified.

实验实际做了什么：在 12 张 DLPFC Visium 切片上，对零学习的空间 kNN 邻居平滑做了完整对照实验——sweep 了 5 个 k 值 × 2 种聚类器(kmeans/gmm_full) × 3 个种子 = 360 次真实拟合，外加两个空模型(表达乱序、纯几何噪声)各 3 种子×12 切片，全部前台跑完(约 11.5 分钟)。

关键数字（全部可在 logs/run.log 里查到出处）：
- 最优配置 k=24 邻居 + gmm_full 聚类：平均 ARI = 0.348，比不用坐标的基线(0.207)高 +0.141，12 张切片配对 Wilcoxon p=0.0005（12/12 切片全部提升，非个别样本驱动）。
- 几何空模型(真坐标+随机高斯噪声表达)：ARI 仅 0.050，远低于 0.15 的阈值——说明这个提升不是几何白捡的假分数。
- 表达乱序空模型：ARI 0.005，接近随机，平滑本身不会凭空造结构。

预测结果：P1（平滑基线 ARI≥0.40 且提升显著）**被推翻**——提升幅度和显著性都达标，但绝对 ARI 0.348 没过 0.40 这条预注册的门槛。P2（几何空模型 ARI≤0.15）**被证实**。整体标记为 negative_result=true，如实照报。

踩的坑：第一版把"P1推翻但P2证实"的组合结果标成了"inconclusive"，这个逻辑有误——P1 是主张，它的推翻条件在方案里是二元的（没有灰区），P2 通过不能救回一个没达标的主张。发现后直接修正了判定逻辑并回填了 results.json（只改了这个派生标签，headline/arms 里的实测数字全部未动），没有重新跑那 11 分钟的 sweep。
