6.1 KiB
Executable File
6.1 KiB
Executable File
PPI ID 修订代码收敛设计
日期:2026-07-10
目标
在不丢失已经生效的 PPI ID 功能、不增加新功能的前提下,收敛本轮修订产生的代码和测试复杂度,使生产执行路径易读、可维护、可用真实 Ft→soe 数据验证。
本轮要保留的用户价值只有:
- 目标 canonical ID 始终保留,不被参考物种或 STRING ID 替换。
- 保留 canonical ID → Ortholog reference ID 的逐关系证据。
- 使用参考注释包中的 accession、NCBI GeneID 等本地证据完成 STRING ID 映射。
- 输出 STRING
preferredName和完整 ID 对照表。 - 区分“STRING 正常返回空网络”和“HTTP/JSON/API 请求失败”。
当前基线
只读盘点显示:
skills/ppi/run.py:Task 3 前 574 行,当前约 1301 行,净增加约 690 行。- 新增
gfa_core/id_resolution.py:约 396 行。 - 新增
gfa_core/string_rate_gate.py:约 163 行。 tests/unit/test_ppi_id_resolution.py:约 1523 行。tests/unit/test_id_resolution.py:约 281 行。
这些数字用于发现复杂度,不作为机械删代码指标。任何收敛都必须以功能等价和真实数据验证为前提。
约束
必须保留
- 已由生产路径实际调用、并直接支持上述五项用户价值的行为。
- 已经生效的空网络与 API 失败分类。
- 已经生效的 ID provenance 和 preferred name 输出。
- 当前确实参与生产请求的基本超时、请求节流和错误处理。
- 参考包
ncbi_gene_id字段以及共享本地别名读取能力。
不得发生
- 不整体回滚 PPI 修订。
- 不永久删除本轮已有实现或测试;移出活跃路径的内容必须先归档。
- 不增加 Reset、CLI 新参数、Manifest 新结构、前端新展示或新的 STRING 协议能力。
- 不为单一调用点创建新的通用框架、插件层、配置层或额外兼容层。
- 不因为追求行数而改坏已经通过的科学语义。
归档策略
修改前,将本轮相关文件完整复制到:
项目记录/代码归档/2026-07-10_PPI_ID修订收敛前快照/
归档至少包含:
skills/ppi/run.pygfa_core/id_resolution.pygfa_core/string_rate_gate.pygfa_core/ppi_string_policy.pyapps/web/pipeline_backend.py的完整快照- 三个相关单元测试文件
- 当前测试命令、结果和代码行数记录
活跃文件中不保留数百行被注释代码。确认不参与生产路径的实现进入归档,原位置只保留必要的简短说明。
收敛方法
1. 建立可信基线
当前会话曾在修改过程中被中断,因此不得直接假设磁盘状态仍是最后一次绿色状态。
先运行现有聚焦测试、后端相关测试和静态检查。若当前状态不绿,只处理被中断的局部修改,使其回到可验证基线;不得借此增加新功能。
2. 标记真实生产路径
以 CodeGraph 和直接调用检查确认唯一活跃流程:
pipeline_backend → skills/ppi/run.py → 本地 ID map → STRING mapping → STRING network → resolution/network artifacts
每个保留的类、函数和字段必须至少满足一项:
- 位于这条生产调用链;
- 直接生成用户需要的 ID/provenance 产物;
- 是保证现有请求成功、空网络分类或错误分类所必需的最小逻辑。
3. 简化而不改变行为
- 合并只在一个位置使用的薄封装。
- 合并重复的字符串、taxon、候选 ID 转换。
- 减少只为中间状态存在的数据对象;保留最终逐关系结果结构。
- 删除活跃路径中已经确认无调用的兼容分支,但在归档中保存原实现。
- 保留共享别名模块边界,但把单用途证据对象和重复索引压缩为最小实现。
- 保留请求节流能力;若现有实现能在更少代码下保持相同并发行为,允许等价重写,否则原样保留。
每次重写必须先有等价测试,不能一次性重写整个 PPI 文件。
4. 测试收敛
活跃测试重点保留约 15–25 个行为场景:
- canonical/Ortholog 逐关系保留;
- exact accession 与 versionless accession;
- GeneID fallback;
- 收敛与歧义;
- 部分映射和零映射;
- 24 条关系、12 个查询的真实形状;
- preferredName 输出;
- 空网络成功;
- HTTP/JSON 失败;
- 生产路径确实使用解析后的 STRING ID;
- 参考包 numeric GeneID 不覆盖 LOC gene ID;
- 一个节流/并发核心测试。
重复验证同一内部实现、只覆盖极端伪造协议响应的测试移入归档。核心测试必须面向行为,不绑定可以被简化的内部类和私有方法。
验证
分步验证
- 收敛前基线:记录测试结果、行数和生产调用路径。
- 每个小改动:运行相关最小测试集合。
- 收敛完成:运行 PPI/ID/backend 聚焦回归和 Python 静态检查。
- 真实数据:使用现有 Ft→soe 项目数据执行 PPI ID 解析和网络阶段。
真实数据验收
真实 Ft→soe 结果必须证明:
- canonical target ID 数量和原输入一致;
- 每条 Ortholog relationship 都保留 exact reference accession;
- raw accession 和 GeneID fallback 均能在对照表中解释;
- 输出包含 STRING ID 和
preferredName; - 网络为 0 条时,如果 API 正常返回空列表,阶段仍为成功且标记 empty network;
- API 故障不能伪装成 0 interactions;
- 不依赖测试 fake 得出最终结论。
如果当前环境无法访问 STRING,必须如实报告,并至少完成真实本地 ID map 与请求前 selected STRING ID 验证;不得声称完成在线网络验证。
完成标准
- 已生成可恢复的收敛前归档。
- 活跃生产路径没有确认无调用的兼容分支或重复实现。
- 活跃测试聚焦用户行为,重复/极端内部测试已归档。
- 所有保留功能通过收敛前后对比验证。
- 完成真实 Ft→soe 验证或明确记录唯一外部阻塞。
- 最终报告给出:归档位置、修改文件、收敛前后行数、测试结果、真实数据结果和未验证风险。
- 不以达到某个行数为完成条件,但不得再出现与一个 PPI ID 功能不成比例的新增框架。