← 工作原理 · 原文件 notes/reports/dev/2026-10-03_proxy_target_leak_audit.md(Markdown 源文件已渲染;链接到其他文档的会跳转,指向源码的只显示路径)
本地尺子目标泄漏审计(2026-10-03)
起因见 T2 外推 / T3 尺子校准 §3.2:T2 心脏外推的方向库和方法卡给出了 E9.5 的 RMS,程序据此写出回退增长率 0.58/天 = log(335/217)/0.75,proxy 的 scale_log_ratio 因此 +4.15。E9.5 是已发布数据,不违反官方规则;问题在于本地尺子的答案被写进了程序,这把尺子就失去了意义。
范围:所有本地尺子;“智能体可见材料”= 角色提示(agent/prompts/*、agent/search/CONTRACT.md、notes/pitfalls/04_scorer_invariance.md)、方向库、方法卡、评分规则简报、知识库(agent/knowledge/,BM25 检索给 Researcher)、每个种子的 README / METHOD / 代码(复制进程序)、候选程序可 import 的 modeling_ro(runenv.CANDIDATE_MODELING)、视图 manifest 与 prior/README。
用户 2026-10-03 09:30 的范围决定:不要过度谨慎、按官方规则;只必须修“让尺子实际失效”的(T2 外推尺寸泄漏 + proxy_noscale)和违反官方规则的;T1 proxy10 的类型级文字保留已改部分、不再扩大;check_knowledge 只加警告级检查;T3 改名 + 稠密度检查;42.5 删掉即可(公开信息,不违规,只是无益)。T1 第二轮按 master 659a312 启动,不等本修复。
1. 结论
- T1 的 X3(目标 Qiu E9.5 心脏):没有泄漏。 Qiu E9.25 / E9.5 样本在 catalog 里自 G20 起是 test-only(
removed in G20 ... X3_qiu_heart_early),不挂进任何视图;Engineer 的沙箱只读目标分量的视图,看不到 final 视图;所有智能体可见材料只写到“Qiu E8.75 + E9.0 → E9.5”这个结构,没有 Qiu E9.5 的细胞数、组成、尺寸或基因统计。X1、X4、X5、X6 的目标同样没有找到统计量(新检查覆盖 E9.25、20–24 体节、E17.5–18.75)。 - T1 的 proxy / proxy2 / proxy10(目标官方 E9.5):有类型级泄漏,没有数值统计。 方法卡列出 E9.5 的 21 个类型名和“E8.5 独有、E9.5 已不在”的类型;知识条目 k036、k043–k060 写了 E8.5→E9.5 普查结果(改名、边的 OT 值、E9.5 Hepatocyte n=1190、“约一半 E9.5 细胞没有同名前身”);
modeling_ro的reweight.py的类型集合和权重是在这个 proxy 上定的;种子 composition_trend 的超参数是在同一目标的旧 proxy 上调的(调参偏差,METHOD 已披露)。proxy10 在 D / D_s1 里权重 1/3,所以 T1 第二轮的目标是“X3 干净 + proxy10 轻度乐观”。 - T2 三个榜:有数值泄漏,T2 心脏外推上已实际被利用。 方向库、方法卡(三个 T2 榜共用一张)和种子 README 给出了每个已发布阶段的 RMS、细胞数、同名类型数;心脏插值 proxy 的目标 E8.75、心脏外推 proxy 的目标 E9.5、全胚插值 proxy 的目标 E7.25 都在其中。
- T3:本地 proxy 的目标(Mab21l2 KO)的统计量在方法卡里(KO 检出率、KO−WT 差异大小、KO 类型对照的相关系数);方法卡和规则简报里有官网 Gata4 榜的分数(42.5、45.9、前 10 名分数段)。另外有一个结构性问题:T3 跑 agent mode,智能体能直接读到
data/raw/official里的 Mab21l2 KO 文件,所以这把尺子在 agent mode 下本来就看得到答案;文字修复只是去掉冗余的提示。
2. 审计表
严重度:高 = 已被程序利用、或能直接拟合尺子的数值;中 = 能在 proxy 视图上改变组成 / 选择、帮助拟合;低 = 定性说法或调参披露,不能直接拟合。
| 榜 | 尺子 | 目标 | 泄漏位置 | 内容 | 严重度 | 修复 |
|---|---|---|---|---|---|---|
| T2 heart extrap | proxy | 官方心脏 E9.5 | ideas_T2__heart__val_extrap.md 第 5、14、28 行;method_cards_t2.md 风险、推荐文件、外推网格;种子 damped_shift、copy_last README | E9.5 RMS 335、细胞 53,742、同名类型 5(+17/−28)、E8.75→E9.5 TV 0.774、“final 上一步是长大” | 高(已被节点 5 利用,+4.15 全在尺寸项) | 全部改写为“由程序从视图输入现场算、不写死”,并明说不得设由已发布阶段尺寸算出的回退常数;目标换成 proxy_noscale(§3) |
| T2 heart interp | proxy | 官方心脏 E8.75 | ideas_T2__heart__val_interp.md 第 5、11、28、29 行;method_cards_t2.md(代理实测、插值风险、推荐文件);种子 mix README | E8.75 RMS 217、细胞 24,826、与 E8.25 的同名类型 31、“括号跨过缩小再长大的谷” | 高(可直接拟合尺寸项和对齐) | 改写,去掉全部阶段数字和走向 |
| T2 embryo interp | proxy | 官方全胚 E7.25 | ideas_T2__embryo__val_interp.md 第 5、28、33、34 行;method_cards_t2.md(代理实测、胚风险“真值 147”);种子 mix、copy_last README | E7.25 RMS 147.3、细胞 13,295、Δln RMS / Δln n、同名类型 11、切片间距 10 | 高 | 改写,去掉全部阶段数字 |
| T2 | X2 | MOSTA E15.5 | — | 没有找到 | — | 新检查覆盖 E15.5 |
| T1 | proxy / proxy2 / proxy10 | 官方 E9.5 | method_cards_t1.md 标签节、生成表、“替代评测能验证什么” | E9.5 的 21 个类型名、类型数、E8.5 独有类型清单、改名 / 出生关系 | 中 | 改写为按两个输入的标签集合由程序划分的通用规则,不列名单 |
| T1 | 同上 | 官方 E9.5 | 知识 k036、k043、k044、k045、k047、k048、k050、k052、k055、k058、k060 | 普查结果:E9.5 改名 / 来源、OT 0.739 / 0.195 / 0.657、Hepatocyte n=1190、“约一半 E9.5 细胞没有同名前身” | 中 | 改写为“在视图输入上现场测量”,compliance.notes 记录本次删改 |
| T1 | 同上 | 官方 E9.5 | modeling/src/task1_temporal/reweight.py(modeling_ro,候选可 import) | 在 proxy 上定的类型集合与权重;注释“absent from E9.5”、proxy 分 55.97、“pseudobulk r 0.994” | 中 | 不改(字节不变):改它会改变 T1 评估规格的 candidate_modeling,第二轮之间的分数就不能复用;heart_jcf_peri 是回归 / 负对照,不在 D 的种子里。列入检查白名单并在此记录 |
| T1 | 同上 | 官方 E9.5 | 种子 composition_trend(D 的种子) | A_TP / A_CM / A_FATE 在旧 proxy(同一目标)上调过;METHOD 写了 proxy 上的收益 | 低(调参偏差,已披露) | 不改;本报告记录:proxy10 对这一系偏乐观 |
| T1 | 同上 | 官方 E9.5 | 种子 composition METHOD(final 份额 SV-CM 0.075 → 0.126 等)、ot_moscot METHOD(“21 nearest-E9.5 types”“±2 % of E9.5”) | E9.5 组成数字 | 低–中 | 删去数字 |
| T1 | 同上 | 官方 E9.5 | scoring_rules_t1.md §3.5、ideas_T1__val.md 第 26、44 行 | 定性:E8.5→E9.5 演练里组成改动带来收益 | 低 | 保留(定性、无数字) |
| T1 | X3 | Qiu 心脏 E9.5 | — | 没有找到(见 §1) | — | — |
| T1 | X1 / X4 / X5 / X6 | Qiu E17.5–18.75 / Imaz 20–24 体节 | — | 没有找到 | — | 新检查覆盖 |
| T3 | Mab21l2 留一基因 proxy | Mab21l2 KO(E9.5) | method_cards_t3.md 同义名、机制、选择、风险节 | KO 检出 0.19% vs WT 18.7%、KO−WT 中位 | Δ | 、基因自身 Δ=−0.97、KO 类型对照 r 值、全局 Spearman(−corr, LFC) |
| T3 | 同上 | 同上 | modeling/src/task3_perturbation/celltype_synonyms.json | KO/WT 类型对照、相关系数、marker 表达 | 低(不被任何预测函数读取;agent mode 下 KO 文件可见) | 不改,列入检查白名单并在此记录 |
| T3 | (官网 Gata4 榜) | — | method_cards_t3.md 第 5、63、67、68、70 行;scoring_rules_t3.md 第 3、34 行;initial_spec.md 第 33、44、62、64、66 行 | 官方基线 42.5、首次提交 45.9、前 10 名 64–78 / 63.7–77.9、“靠线上分数选择”;“从 Mab21l2 学响应形状” | 不违规(公开信息),但会误导 | 删除;改写为“本地尺子只做格式和流程检查,选择在 run 外由人完成” |
| 全部 | 视图 manifest | — | views.build_view:proxy 视图 min_cells / max_cells 用官方榜的上限(目标是 E10.5 等保留阶段,不是 proxy 目标),target 只有阶段名和时间 | 没有目标统计量 | — | — |
| 全部 | prior/README、CONTRACT、search / researcher / analyst / review spec、pitfalls 04 | — | 只有规则、视图结构、基因数 | 没有目标统计量 | — | — |
3. 修复
T2 心脏外推目标:proxy_noscale(校准报告 §3.3 的定义)。
- 尺子:同一个 proxy 视图上的预测,按官方规则打分,但
scale_log_ratio的 skill 固定为 copy_last 的值,再按官方聚合(含结构门)重算榜分。这个 proxy 视图上 copy_last 就是地板文件本身(E8.75 全部 24,826 个细胞,不超过上限,原样输出,proxy 50.00),所以这个值在任何真值半、任何 seed 上都是地板 skill 0.5。 - 打分服务任务
T2:heart:val_extrap/proxy_noscale(agent/scoring/service.pyPROTOCOL_TASKS,protocolnoscale,常数NOSCALE_METRIC/NOSCALE_SKILL);与原榜共用真值、fast 缓存和锚点(scoring_def.TASK_ALIASES)。 - 配置名
proxy_noscale(scoring_def.PROXY_TASKS["T2:heart:val_extrap"],VIEW_OF→proxy视图),可以当目标分量、record 视图或护栏尺子;Researcher / Engineer 的“分数定义”里有说明(context.objective_note)。 agent/configs/experiments/g24_t2_t3/t2_heart_extrap.yaml与t2_heart_extrap_D.yaml:目标proxy_noscale: 1,护栏尺子proxy_noscale,原 proxy 改为record(只记录)。没有启动。- 代价:真正会长大的方法在本地拿不到尺寸分,这一项(8.33 分 × 门)在本地是明说的盲区。
T3
- 打分服务里 T3 的本地尺子改名为
T3:gata4/proxy_mab21l2(T3_PROXY_TASK,BOARD_ALIASES指向原T3:gata4的真值和评分器)。对T3:gata4的请求按新名字回答和记录(Service._renamed);授权给T3:gata4的客户端改授新名字(add_client、agent-modeservice_config)。每个 T3 分数都带"label": "local proxy (Mab21l2 leave-gene-out), not the official score",记录里也有。原T3:gata4仍然注册,旧 run 的配置和scoring_log照样能加载。 - 输出稠密度护栏(
agent/scoring/density.py):最终 T3 输出的非零比例 / WT 输入(官方 WT E8.75)的非零比例必须在 0.8–1.25 之间。依据是评分器机制(variogram 对零值敏感),与真值无关;校准报告里 R2 是 8.2 倍,Q、R1 是 1.0 倍。接入:harness.py verify(agent mode 终验;越界即失败,WT 文件不在时只警告)和scripts/prepare_submission.py(CHECKLIST 里该榜一行写比值,越界即拒绝该榜)。规则简报scoring_rules_t3.md§3.5 和initial_spec.md告诉智能体有这条检查。 - 删除了 T3 智能体可见文字里所有官网 Gata4 榜分数和“靠线上分数选择”的说法。
文字:§2 表里标了“改写”的各处,原则是保留通用方法指导,去掉 proxy 目标阶段的统计量(尺寸、细胞数、类型清单 / 数量 / 组成、同名类型数、切片间距、KO 测量值),改成“程序从视图输入现场算”。
检查:scripts/check_knowledge.py 加了第二项检查 proxy_target_audit。它扫描全部智能体可见材料(比原检查多了全部 prompt、pitfalls 04、每个种子的 README / METHOD / 代码、modeling_ro 的 task1/2/3 与 baselines):一行里某个 proxy 目标阶段(按任务:T1 的 E9.5 / E9.25 / 20–24 体节 / E17.5–18.75;T2 心脏的 E8.75 / E9.5;T2 全胚的 E7.25;X2 的 E15.5;T3 的 Mab21l2 / KO / 敲除)前后 60 个字符内出现数字(去掉阶段名、日期、DOI、§ 编号、带数字的 id 之后),或者 T2 文字里出现尺寸 / 数量轨迹(“RMS 354”“217 → 335”),就报出来。经人工核对的 96 行列在 PT_WHITELIST 里(板头、规则陈述、基因面板数、尺子分数、文献年份),每行写了理由。按用户决定默认只警告、不改变退出码;--strict-proxy-targets 时失败。现在仓库在 strict 下也通过。
4. 没有改的、需要人决定的
- T3 agent mode 能直接读 Mab21l2 KO 文件:这把尺子在 agent mode 下的答案本来就可见。校准报告的建议是 T3 不设本地目标;本次只把这把尺子标成“本地 proxy,不是官网分”。
reweight.py与 heart_jcf_peri 的常数是在 proxy 上拟合的:作为回归和负对照保留,文件不改(保持 T1 评估规格不变)。- composition_trend 的超参数是在同一目标的旧 proxy 上调的:proxy10 对这一系偏乐观(D / D_s1 里 proxy10 权重 1/3)。
- T1 第二轮按 master 659a312 启动:它的锁里是修复前的提示和知识(方法卡的 E9.5 类型清单、k043–k060 的普查句子)。X3 部分不受影响。
5. 验证
python scripts/check_knowledge.py(以及--strict-proxy-targets):PASS。- 新测试
agent/search/tests/test_proxy_target_leak.py:检查规则(命中 / 不误报 / 默认只警告);proxy_noscale 的目标分量、护栏、record、服务请求、聚合(尺寸项满分时 proxy > 54,noscale 回到 50);端到端:真实 proxy 真值上,把 copy_last 的坐标绕质心放大 1.5 倍,普通 proxy 分偏离 50,proxy_noscale 正好 50;T3 改名、旧 id 按新名字回答、标签和记录、agent-mode 授权;没有官网 T3 分数;稠密度函数(稀疏 / 稠密)、harness.check_t3_density、prepare_submission.t3_density。 - 全量回归(Spark 私有目录
~/vec/dev/test_leak,-j 2,45 个模块):最终一轮 45/45 通过(failed modules: 0);第一轮只有test_score_parts失败,test_score_parts原来断言 T3 简报里有官网分 45.9、且不许出现 gata,已改为断言“非零比例”“local proxy”,重跑通过。 - dry run(
harness.py launch --dry-run,与 master 659a312 对照):t1_round2/D.yaml、D_s1.yaml通过,目标{proxy10, X3}不变;评估规格不变(e91759e9…,在reweight.py保持字节不变之后;只改它的注释时只有candidate_modeling一项不同)。锁哈希会变,因为锁里记录的提示、知识库、种子文件(方法卡、k036/k043–k060、composition / ot_moscot METHOD)变了。g24_t2_t3/t2_heart_extrap.yaml、t2_heart_extrap_D.yaml通过,目标{proxy_noscale: T2:heart:val_extrap/proxy_noscale}。