Skip to content

SRCADM-01:ADC_surfaceome_reference@0.3.0 来源准入审计(结论:有条件可纳入) - #63

Open
leezx wants to merge 1 commit into
mainfrom
task_20260805_srcadm-01-surfaceome-admission
Open

SRCADM-01:ADC_surfaceome_reference@0.3.0 来源准入审计(结论:有条件可纳入)#63
leezx wants to merge 1 commit into
mainfrom
task_20260805_srcadm-01-surfaceome-admission

Conversation

@leezx

@leezx leezx commented Aug 5, 2026

Copy link
Copy Markdown
Owner

这个 PR 是什么

PR #59 冻结并获批的九项审计 AUD-01..AUD-09实际执行结果。那份冻结范围本身就是本次审计的授权依据。

读了 builder 源码、raw manifest、checksums、license 声明与三个 processed 表,而不是描述它们。 每一项 verdict 都附可复核依据。

结论:admissible_with_conditions——有条件可纳入。无一项 FAIL

本 PR 不授予准入。 status: pending_review、两份文件的 admission_record_ref 都仍为 nullEVGAP-01authorises_extraction_run 仍为 false

main 基线 8aa7e87,5 个文件 +607/-0Ran 351 tests 全部通过。


九项结论

ID 审计项 verdict
AUD-01 builder 实现与版本 PASS
AUD-02 raw manifest 与 raw_manifest_sha256 PASS(实算复核)
AUD-03 来源清单与 release PASS_WITH_FINDING
AUD-04 license 与再分发 PASS_WITH_FINDING
AUD-05 family 独立性 PASS
AUD-06 去重逻辑 PASS_WITH_FINDING
AUD-07 discordance_flags 规则 PASS
AUD-08 代表性靶点逐行回溯 PASS
AUD-09 snapshot 可复现性 PASS_WITH_FINDING

AUD-05:独立性成立,而且恰好避开了你点名的失效模式

三家族的来源映射:

curated_knowledge        <- {goa_human, uniprot_reviewed_human}
imaging                  <- {hpa_subcellular_location}
cell_surface_capture_ms  <- {cspa}

goa_humanuniprot_reviewed_human 是同源的——GOA human 由 UniProt 策展流程产出。builder 把二者收进同一个 curated_knowledge 家族,因此不会计成两个独立家族。这正是你说的「同源数据重复计数」,builder 避开了它。

实例:GUCY2C 两个来源都 supportedfamily_count 仍为 1

两条加强验证:

  1. family 计数要求支持性证据,不是「有行即计」(builder 2112–2118)。反例检验:HPA 有行但 hpa_plasma_membrane = false 的基因共 11,334 个,其中 imaging 被计入的为 0 个
  2. family_count >= 2 必然包含至少一个实验型家族——curated_knowledge 是唯一可由两个来源喂养但只计一次的家族,要凑到 2 就必须再有 imagingcell_surface_capture_ms。所以 RQ-01 的门槛不是形式门槛。

AUD-04:license 歧义存在,但不触及 EVGAP-01 读取的任何字段

19 个来源全部声明 license,六个有歧义:cellphonedb_geneproteincomplexinteraction(not declared)、cellchatdb_human(GPL-3.0 repository licence)、omnipath_intercell_receptor(per-resource retained)。

决定性检查:这六个没有任何一个出现在 source_evidence.tsv 中。 它们只喂 cci_receptor_*,而该字段已被 PR #59 barred_fields 禁用。进入的四个来源中三个是 CC BY 4.0

这个结论是承重的——依赖 #59 的字段白名单。白名单一扩大,准入即失效(COND-02),测试也断言 cci_receptor_role 确实在 #59barred_fields 中。

顺带记一处命名不一致:processed 用 source_id = cspa,manifest 用 cspa_validated_surfaceomecspa_cell_type_matrix,无法直接 join。

AUD-09:完整性可验,可复现性有边界

shasum -a 256 -c checksums.sha256 对 19 个 raw 文件全部 OK。builder 唯一的时间依赖是第 268 行 datetime.now() 用于 processed_at_utc 时间戳字段,不参与计算;无 random、无 shuffle。给定同一 snapshot,构建确定。

uniprot_reviewed_humangoa_human 的 release 是 current_at_download,不是版本号。 从上游重新下载并重建不能保证逐字节复现。可复现性成立的前提是使用已归档的 raw snapshotCOND-03)。

四项准入条件

ID 条件
COND-01 仅限 0.3.0 / 2026-07-29-quant-topology-mm 这一个 snapshot(23 个校验和钉住),不覆盖其他版本或后续重建
COND-02 仅限 PR #59 的字段白名单;扩大到 cci_receptor_* 即失效
COND-03 基于已归档 snapshot,不基于可从上游复现
COND-04 重复键不得进入 EVGAP-01 判据;靶点轴扩大须重查

另两项 finding

AUD-03:manifest 的 release 字段全部为 null,release 字符串由 builder 另行赋值(processed 表中确有实义取值如 HPA 25.1; Ensembl 109);但四个在用来源中两个是 current_at_download

AUD-06:builder 中检索不到显式去重例程;实测 source_evidence.tsv 6 个重复键、membrane_topology_evidence.tsv 5 个。受影响基因 HERC3MATR3NPIPA9PINX1POLR2J3PRODHERVK-7NRXN1NRXN2NRXN3SIRPB1没有一个属于 41 个靶点;且 family 计数取自 support 布尔值而非行数,故重复行结构上不可能抬高 RQ-01(41 靶点的 family_countfamilies 列表实测 100% 一致)。

AUD-01 的一处如实记录

builder_version 由 config 传入而非脚本内常量,故「0.3.0」这个版本号依赖 build_manifest 自述、不能由脚本自身独立确证。不构成阻断(snapshot 由校验和钉住,版本号只是标签),但记录在案。

验证

Ran 351 tests 通过(基线 338 + 新增 13);boundary check 通过。测试把结论钉在 #59 冻结的范围上:九项 ID 必须与 required_audit_items 完全相等;无 FAIL;每项必须有可复核依据(PASS_WITH_FINDING 必须写出 finding);AUD-02 摘要必须是 64 位十六进制且与 #59 引用前缀一致;AUD-05 必须点名同源来源对并引用实测反例数;AUD-06 影响界定必须写明「没有一个属于 41 个靶点」并列出受影响基因;本审计不得授予准入。

11 个变异全部被捕获后精确回滚:自行授予准入、自填 admission_record_ref、删掉一项审计、AUD-05 去掉同源说明、AUD-05 声明「有行即计」、结论改为无条件可纳入、删掉 COND-02、抹去 AUD-09 的可复现性限制、AUD-06 影响界定改成含糊表述、删掉受影响基因清单、把某项判 FAIL 却不改总结论。

其中两个首轮逃逸,是我断言太松——assertIn("current_at_download", ...)assertIn("41", ...) 在部分删除后仍命中残留文本。已改为要求实质内容,重测全部捕获。

没有做什么

后续顺序

  1. 本审计 APPROVE,在 logs/ 留审核记录
  2. 另开 PRadmission_record_ref 指向该记录、authorises_extraction_runtrue
  3. 执行 EVGAP-01 抽取 → 结果 PR → binding,解除 EVGAP-01
  4. EVGAP-02 结果审核在 PR EVGAP-02 CRC linkage 抽取结果审核(Tier 1 已执行,20 条验证全通过) #62;获批后另开 PR 解除 EVGAP-02
  5. 两个缺口都解除后才能生成 ADC_POOL_LEVEL_01_ACCEPTED

本 PR 不适用 AGENTS.md「审核豁免」,须经 ChatGPT APPROVE。批准代表接受这份审计及其四项条件,并据此准入该单一 snapshot;不授权执行 EVGAP-01 抽取(须另开 PR 填 admission_record_ref),不解除任何证据缺口,不批准该数据集的其他版本。

Carries out the nine-item audit PR #59 froze and approved, which is the authority
for this work. The builder source, the raw manifest, the checksum file, the
licence declarations and the three processed tables were read rather than
described, and every verdict records a recheckable basis.

Conclusion: admissible with conditions. No item failed. Four items pass with a
finding, each with its impact bounded.

AUD-05 is the item the reviewer singled out, and it passes for a specific reason.
The three families map to curated_knowledge from goa_human and
uniprot_reviewed_human, imaging from hpa_subcellular_location, and
cell_surface_capture_ms from cspa. GOA human is produced by the UniProt curation
pipeline, so those two are the same origin - and the builder collapses them into
one family rather than counting two. GUCY2C is the worked example: both sources
support, family_count stays 1. That is exactly the double-counting failure mode
the reviewer named, and the builder avoids it. Two reinforcing checks: family
counting keys on supporting evidence, verified by counterexample over the 11,334
genes with an HPA row but hpa_plasma_membrane false, of which zero had imaging
counted; and because curated_knowledge is the only family two sources can feed
while counting once, family_count of two or more always includes an experimental
family, so RQ-01's bar is not a formality.

AUD-04 finds six sources with ambiguous licences - four cellphonedb files,
cellchatdb under a GPL-3.0 repository licence, and omnipath retaining per-resource
terms - and then bounds it: none of the six appears in source_evidence.tsv at all.
They feed only the cci_receptor fields, which PR #59 already bars. The three
sources that do reach it are CC BY 4.0. That conclusion is load-bearing on the
field whitelist, so widening the whitelist voids the admission, recorded as
COND-02.

AUD-09 verifies all 19 raw files against checksums.sha256 and finds the builder
deterministic apart from a timestamp field, but uniprot_reviewed_human and
goa_human carry current_at_download rather than a release, so re-downloading
cannot reproduce the snapshot byte for byte. Admission therefore rests on the
archived snapshot, recorded as COND-03.

AUD-06 finds no explicit dedup routine and 6 plus 5 duplicate keys, none of which
touches the 41 targets, and family counts derive from consensus booleans rather
than row counts, so duplicates cannot inflate RQ-01.

AUD-01 records honestly that builder_version comes from config rather than a
constant, so the 0.3.0 label cannot be confirmed by the script itself.

This PR grants nothing. Status stays pending_review, admission_record_ref stays
null in both files, and EVGAP-01's extraction stays unauthorised.

351 tests pass. Eleven mutations caught and rolled back exactly. Two of them
escaped the first pass because my assertions matched substrings that survived a
partial deletion; the assertions were tightened to require the substantive content
and the escapees were re-tested and caught.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant