Virtual Embryo Challenge更新于 10-03 20:13(北京时间) / 每 5 分钟更新

← 工作原理 · 原文件 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 extrapproxy官方心脏 E9.5ideas_T2__heart__val_extrap.md 第 5、14、28 行;method_cards_t2.md 风险、推荐文件、外推网格;种子 damped_shift、copy_last READMEE9.5 RMS 335、细胞 53,742、同名类型 5(+17/−28)、E8.75→E9.5 TV 0.774、“final 上一步是长大”高(已被节点 5 利用,+4.15 全在尺寸项)全部改写为“由程序从视图输入现场算、不写死”,并明说不得设由已发布阶段尺寸算出的回退常数;目标换成 proxy_noscale(§3)
T2 heart interpproxy官方心脏 E8.75ideas_T2__heart__val_interp.md 第 5、11、28、29 行;method_cards_t2.md(代理实测、插值风险、推荐文件);种子 mix READMEE8.75 RMS 217、细胞 24,826、与 E8.25 的同名类型 31、“括号跨过缩小再长大的谷”高(可直接拟合尺寸项和对齐)改写,去掉全部阶段数字和走向
T2 embryo interpproxy官方全胚 E7.25ideas_T2__embryo__val_interp.md 第 5、28、33、34 行;method_cards_t2.md(代理实测、胚风险“真值 147”);种子 mix、copy_last READMEE7.25 RMS 147.3、细胞 13,295、Δln RMS / Δln n、同名类型 11、切片间距 10高改写,去掉全部阶段数字
T2X2MOSTA E15.5—没有找到—新检查覆盖 E15.5
T1proxy / proxy2 / proxy10官方 E9.5method_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.5modeling/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.5scoring_rules_t1.md §3.5、ideas_T1__val.md 第 26、44 行定性:E8.5→E9.5 演练里组成改动带来收益低保留(定性、无数字)
T1X3Qiu 心脏 E9.5—没有找到(见 §1)——
T1X1 / X4 / X5 / X6Qiu E17.5–18.75 / Imaz 20–24 体节—没有找到—新检查覆盖
T3Mab21l2 留一基因 proxyMab21l2 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.jsonKO/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.py PROTOCOL_TASKS,protocol noscale,常数 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-mode service_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}。