8.7 KiB
Executable File
Plan Review Log: PPI stage-local STRING ID resolution
Act 1 discussion complete — plan locked with the user. MAX_ROUNDS=5.
Phase 0 evidence consolidation
Local code inventory
skills/ppi/run.pycurrently strips versions in both Ortholog and direct paths, has noget_string_ids, writesprobe_status=not_run, and conflates network API errors with[].apps/web/pipeline_backend.pycreatespep_cds_idmap.tsv, but storesLOC...ingene_id; numeric NCBI GeneID exists only insidecds_header.- PPI main and PPI Reset are separate backend entry points and both must pass the same ID evidence.
- Existing AlphaFold link generation already prefers
string_id, so a populated resolution report can be reused. - Existing frontend can preview the TSV; direct metric labels are an enhancement required by the approved acceptance criteria.
Official STRING API evidence
- Official docs: https://string-db.org/help/api/ and fixed v12 docs: https://version-12-0.string-db.org/help/api/.
get_string_idsreturns one best STRING match per input;limitis not a supported parameter.- Use
queryIndexrather than response order; unresolved inputs are omitted. - All-unresolved
get_string_idshas been observed/documented as HTTP 200 with[]or HTTP 404; network can also return 404 for unusable inputs. Endpoint, response shape, and request state—not status alone—must drive classification. networkshould explicitly setadd_nodes=0for input-only family networks.- Validate score, network type, taxon, and non-empty identifiers client-side.
- Version response currently uses
stable_address; client should also tolerate documentedstring_stable_address. - Official guidance recommends POST for lists,
caller_identity, stable-version URLs, and at least one second between requests.
Round 1 — Codex
The biological direction is sound—canonical IDs remain immutable, Ortholog remains a relationship, GeneID is a valid job-local bridge, partial mapping is distinguishable from an empty network, and the scope excludes unrelated Ortholog/KaKs redesign. However, the plan is not implementation-ready.
Blocking changes:
- Close the PPI Reset identity and scope path.
- Reset currently reloads Ft canonical IDs but does not carry the Ft→soe Ortholog relationship; the soe alias map alone is insufficient.
- Carry the exact scoped Ortholog file and verified ID map into Reset, select the exact scoped source manifest, constrain client-supplied paths, declare Reset input namespace, and test real Ft→soe Reset wiring.
- Make provenance cardinality explicit before deduplication.
- The real job has 24 Ft canonical members, 12 unique soe reference queries, and many-to-one relationships. Preserve every canonical→reference path and deduplicate only final STRING network queries.
- Cover conflicting references, versionless collisions, conflicting GeneIDs, and mixed-species ID-map rows.
- Define metric denominators and exact manifest locations.
- Distinguish canonical members, Ortholog relationships, unique reference queries, resolved STRING queries, returned network nodes, and edges.
- Main, scoped, and Reset manifests must expose the same scientific metrics; frontend tests must assert values, not label presence only.
- Reconcile partial mapping with
evaluate_string_mapping_quality().- Partial nonzero resolution must be nonterminal; zero resolution must fail; ambiguous entries must be excluded.
- Lock the STRING HTTP state machine.
- Handle all-unresolved
404and200 [], validatequeryIndexand taxon, test throttling, always sendadd_nodes=0, and distinguish stable scientific endpoints from optional visualization endpoints.
- Handle all-unresolved
- Specify header-only empty-network artifacts and persisted failure manifests, including CLI exit codes.
- Expand validation to scoped Reset, exact manifest selection, cross-job/species rejection, Reset APIs, stage status, 24→12 provenance, and manifest equivalence.
VERDICT: REVISE
Codex's response
Accepted all seven blockers because each is supported by current code or real-job evidence and remains inside the approved PPI-first boundary. The revised plan will:
- make Reset canonical-target-only, scope-bound, and dependent on both the exact Ortholog relationship and species-matched alias map;
- introduce an explicit per-canonical relationship record and retain 24 provenance rows before 12-query deduplication;
- replace ambiguous metrics with nested, denominator-defined ID-resolution and network metrics shared by main/scoped/Reset manifests;
- retire the old terminal low-rate threshold in favor of complete/partial/failed resolution states;
- define the STRING response validator, request pacing, empty-network TSV schema, failure manifests, exit codes, and expanded API/real-data validation.
The optional STRING image/link endpoint will remain explicitly non-authoritative visualization evidence if it cannot use the same stable version endpoint; it will not determine scientific stage status.
Round 2 — Codex
The revision closes the original seven blocker groups in substance. Four material issues remain:
query_mapping_rateuses the wrong numerator when multiple reference queries converge on one STRING entity. Addresolved_reference_query_count; keepselected_string_query_countas the deduplicated network-query count and test two references converging on one STRING ID.- Reset needs race-safe evidence snapshots and a separate direct-target policy. Snapshot and re-hash canonical input, Ortholog mapping, and ID map inside the isolated Reset directory before launch; validate direct-target IDs against the recorded canonical member set.
- Cross-process STRING pacing is not yet testably specified. PPI uses a light queue with concurrency four, so choose a shared interprocess gate or a dedicated single-concurrency queue and test it.
- Contract/failure validation is incomplete. Explicitly test persisted failed manifests and backend/status exposure for CLI exits 2/3/4; synchronize
skills/ppi/config.yaml; decide whethernetwork_typeis fixed or configurable; replace the stale flat metric schema in the project record.
VERDICT: REVISE
Codex's response
Accepted all four findings.
- Add
resolved_reference_query_countand use it for query mapping rate/status; network-query deduplication remains a separate count. - Record the canonical input hash and make Reset execute from verified snapshots copied into its isolated directory. Projected Reset validates against Ortholog sources; direct-target Reset validates against the recorded canonical member set.
- Use a host-shared
fcntl.flock+ timestamp file gate for all stable STRING version/mapping/network requests across main and Reset processes; production interval remains one second and a short-interval multiprocessing test proves serialization. - Add backend/status failure-manifest tests, synchronize
skills/ppi/config.yaml, and keep this phase's PPI analysis fixed tonetwork_type=functionalto avoid unrelated request/UI expansion. Update the original project-record metric section to the nested schema.
Round 3 — Codex
Round 2 is almost fully closed. Two material blockers remain:
- The shared STRING rate gate excludes automatic image requests; route every fallback attempt through the same interprocess gate or disable retrieval, and test a scientific request concurrent with an image request.
- The direct-target Reset rule conflicts with a following blanket rule requiring all added IDs to be Ortholog sources; qualify that rule as projected-only.
VERDICT: REVISE
Codex's response
Accepted both findings. The detailed plan now places the host-shared gate in gfa_core.string_rate_gate and requires every active PPI-path STRING HTTP call—including each optional image/SVG fallback—to use it with the same caller identity. The multiprocessing suite combines scientific and image callers. The Ortholog-source requirement is explicitly projected-Reset-only; direct-target Reset accepts only IDs present in the recorded canonical snapshot.
Round 4 — Codex
All prior blockers are closed.
gfa_core.string_rate_gateis the single host-shared gate for version, mapping, network, and every image/SVG fallback in main and Reset, with aligned caller identity and mixed scientific-plus-image multiprocessing coverage.- Projected Reset additions must be Ortholog sources; direct-target Reset accepts only IDs from its recorded canonical snapshot. The rules and tests no longer conflict.
- The earlier metric, snapshot, failure-manifest, configuration, network-type, and validation findings remain closed.
Non-blocking caution: the fcntl gate is intentionally host-local; a future multi-host worker deployment would require a distributed gate.
VERDICT: APPROVED