5.2 KiB
Executable File
5.2 KiB
Executable File
Plan: PPI stage-local STRING ID resolution on a reusable job-local alias core
Locked via discussion — Codex + user
Goal
Preserve canonical family-member IDs while making PPI resolve target/reference protein IDs through job-local PEP/CDS evidence and the official STRING get_string_ids API before network lookup, with explicit provenance and a correct distinction between ID failure, external API failure, and a successful empty network.
Approach
- Add a small reusable
gfa_core.id_resolutionmodule that reads job-local alias evidence and extracts RefSeq protein accession, LOC symbol, and numeric NCBI GeneID without performing network calls. - Extend future reference-bundle ID maps with an explicit
ncbi_gene_idcolumn while remaining compatible with existing maps by parsingcds_header. - Add typed STRING API methods for
get_string_ids,network, andversion; use the returned stable version address, POST identifier lists, includecaller_identity, respect STRING's request interval, and raise structured errors instead of returning an empty list. - Replace lossy query lists with explicit relationship records that retain every
canonical target -> versioned Ortholog referencepath; probe raw and GeneID candidates, then deduplicate only the final STRING network query set. - Pass the canonical input, exact scope-matched Ortholog relationship, and species-matched job-local ID map through main PPI and PPI Reset. Reset accepts canonical target IDs only, is bound to an exact source
scope_id, snapshots verified evidence before launch, and rejects undeclared/mixed namespaces or paths outside the job; direct-target Reset validates against its canonical member snapshot without requiring Ortholog. - Replace the old terminal mapping-rate threshold with
complete, nonterminalpartial, and terminalfailedresolution states; exclude ambiguous members from network queries. - Synchronize the PPI contract, skill docs, persisted success/failure manifests, diagnosis, status, and frontend labels using denominator-defined nested metrics shared by main, scoped, and Reset outputs.
- Validate with unit/contract/API tests and the full real
Ft.SPL -> soejob: 24 canonical provenance paths, 12 unique STRING queries, 12/12 query resolution, andsuccess + empty_networkfor zero edges; repeat the scoped Reset path.
Key decisions & tradeoffs
- Canonical
final_membersIDs are immutable; all external IDs are stage-local aliases. - Ortholog relationships are not aliases.
- The first release uses the existing job-local
pep_cds_idmap.tsvplus a reusable parser, not a global database or SQLite registry. - STRING-specific HTTP probing remains in the PPI adapter; generic local alias extraction lives in
gfa_core. - STRING returns one best match per submitted candidate. If different local candidates for one biological query resolve to different STRING IDs, the query is conflicting/ambiguous and is not silently selected.
- Resolution evidence has one summary row per canonical-to-reference relationship. Many canonical members may share one network query; deduplication never removes their provenance rows.
- Query resolution and network deduplication are separate metrics: every reference query may resolve even when several converge on one submitted STRING ID.
- Partial nonzero ID resolution proceeds with a warning; zero resolved IDs block PPI. The old minimum-count/rate failure threshold is retired for execution decisions.
- A normal zero-edge response is success with
network_status=empty_network; API failure is a separate failure. - Empty networks still emit a header-only
protein1/protein2/scoreTSV and a success manifest. Zero resolution and API failures emit failed manifests and nonzero CLI exits. - STRING mapping/network calls use one stable version and validated
queryIndex/taxon responses. Optional public web/image links are labeled non-authoritative if they are not version-pinned.
Risks / open questions
- STRING mapping aliases and database versions change; every probe must record taxon, version, and evidence.
- Existing ID maps lack
ncbi_gene_id; legacy header parsing must be covered by tests. - Existing PPI code strips protein versions before resolution; exact versions remain primary and versionless forms are lookup aliases only.
- PPI Reset currently selects a generic manifest first, accepts a client path, and loses the Ortholog relationship. Its scope/namespace contract must be corrected with the main path.
- Direct-target PPI jobs may not have a reference-bundle ID map and must still work through raw-ID probing.
- Every active PPI-path STRING HTTP request—including optional image fallbacks—uses one shared interprocess lock/timestamp gate because the light queue can run multiple workers; unit and multiprocessing tests cover the one-second production rule.
- The repository has no usable Git metadata, so commit checkpoints cannot be executed in this workspace.
Out of scope
- Ortholog/KaKs reference-state fixes and immutable scoped Ortholog artifacts.
- Migration of expression, enrichment, synteny, or other consumers.
- Global cross-job ID databases.
- Rewriting
final_members, Ortholog, or KaKs algorithms. - Treating a valid empty PPI network as failure.