bio-nexus-api / FEATURE_VERIFICATION_CHECKLIST.md
Samad14's picture
feat: techspec additions β€” de novo tier-6 branch, structure export, page capture + final synthesis
4939f56
|
Raw History Blame Contribute Delete
13.9 kB

Bio Nexus β€” Feature Verification Checklist

How to use this file: for each tool, click through the live app and tick every row. A row you can't tick is a missing feature you just found before a user did. Update "Last verified" when you finish a tool. Any tool not re-verified in 90 days is stale β€” see DEFINITION_OF_DONE.md Β§5.

Audit priority below is based on how detailed each tool's spec was in MASTER_PLAN.md/IMPLEMENTATION_LOG.md. A vague spec is a strong predictor of an incomplete build β€” those are marked πŸ”΄ and should be audited first.


πŸ”΄ Protein Interactions β€” AUDIT FIRST (spec: "interaction lookup module")

Last verified: 2026-08-06

  • Interaction partners list renders with source database attribution (header + JSON export both state STRING-DB)
  • Confidence/evidence score shown per interaction (and explained via LearnPopover)
  • Network graph visualization (or explicit decision that this tool is text/table-only, documented here) β€” Decision: network is rendered as the STRING-DB network image (with graceful fallback link if the image fails); full interactive graph is out of scope for now
  • Filter by evidence type (experimental / database / text-mining / co-expression) β€” client-side filter over the four STRING score channels, threshold 0.3
  • Export (JSON/CSV/image) works β€” PNG (network image), TSV (score table), JSON (raw payload) via fix(interactions) d2ea003
  • Loading / error / empty states present
  • Chains from a BLAST/UniProt result (cross-tool entry point) β€” chains exist from UniProt page, Domains page, and job detail page via sessionStorage["interaction_gene"]
  • Appears in pipeline wizard step list, or documented as intentionally excluded β€” Documented exclusion: not in the 5-step wizard chain (BLAST/UniProt β†’ MSA β†’ Phylo β†’ Domains β†’ AI Interpretation); interactions takes a single gene name, not a sequence, and is reachable as a standalone analyze tool + cross-tool chain
  • /learn entry exists for interaction confidence scoring β€” learn/interactions (STRING, score channels, network topology) wired to LearnPopover in the score table headers

πŸ”΄ Function Prediction β€” AUDIT FIRST (spec: "sequence β†’ function inference endpoint + job status")

Last verified: never

  • GO term output (molecular function / biological process / cellular component) β€” or documented as excluded
  • EC number prediction for enzymes β€” or documented as excluded
  • Confidence score per predicted function, using the same hedged-language rule as AI interpretation (RULES.md Β§6)
  • Distinguished visually/in copy from UniProt's existing function field, so the two don't read as duplicates
  • Loading / error / empty states present
  • Export works
  • /learn entry exists

πŸ”΄ Pathway Enrichment β€” AUDIT FIRST (spec: exists only as a pipeline step, no standalone feature list)

Last verified: never

  • Standalone pathway search (not just as a pipeline wizard step) works
  • Enrichment statistics shown (p-value, FDR, gene ratio) with LearnPopover
  • Pathway diagram viewer renders and is interactive
  • Reactome β†’ WikiPathways fallback actually triggers and is visible to the user (per RULES.md Β§4 fallback transparency rule)
  • Export works
  • /learn entry exists

πŸ”΄ Sequencing Annotation β€” AUDIT FIRST (spec: "variant calling β†’ annotation", no detail on annotation source)

Last verified: never

  • Variant table shows position, consequence, and reference/alt allele clearly
  • Annotation source is stated in the UI (what database/reference are variants being checked against)
  • Consensus sequence download works
  • QC report (pre/post trimming) renders, not just a pass/fail flag
  • Job correctly appears on dashboard and is shareable
  • Export works
  • /learn entry exists for variant-calling terms (VCF fields, consequence types)

🟑 Docking β€” spec has good detail, verify export/edge depth

Last verified: ___

  • Full Vina log viewer, no truncation (per your earlier requirement β€” confirm it shipped as scrollable panel, not truncated text)
  • RMSD table (l.b./u.b.) renders correctly
  • Run-config UI exposes exhaustiveness, num_modes, grid center/size
  • Binding pocket / blind docking option, or documented as fixed-pocket only
  • 3D viewer shows docked pose overlaid on receptor
  • Export (PDBQT/SDF/log) works
  • Job shows in MAX_CONCURRENT["docking"] correctly under concurrent load (cap = 2)

🟑 MD Simulation β€” spec has good detail, verify output depth

Last verified: ___

  • Trajectory or endpoint structure downloadable
  • Energy/RMSD-over-time plot, or documented as endpoint-only (no trajectory analysis)
  • Force field / solvent selector matches the verified matrix in the spec (ff14SB/ff15ipq/ff19SB/amberfb15/CHARMM36 Γ— OBC1/OBC2/GBN2)
  • 25-min run budget enforced with clear user-facing timeout messaging, not a silent failure
  • Job respects MAX_CONCURRENT["md"] = 1

🟑 ADMET β€” spec has good detail, verify all properties surfaced

Last verified: ___

  • All RDKit descriptors listed in the original spec are actually rendered (not just a subset)
  • Lipinski rule-of-5 pass/fail shown with reasoning, not just a badge
  • Traffic-light coloring matches a documented threshold table (link from LearnPopover)
  • Export works

🟒 BLAST β€” spec detailed, spot-check only

Last verified: ___

  • Global/local mode toggle works
  • DNA query support works alongside protein
  • program/db/max_hits params all actually reach the EBI request
  • "Align pair" from any hit works
  • 65-min poll cap surfaces a clear timeout message, not a stuck spinner

🟒 UniProt / AlphaFold / Structure Suite β€” spec detailed, spot-check only

Last verified: ___

  • UniProt: function, disease associations, active sites, organism all present
  • AlphaFold: pLDDT coloring in 3Dmol.js viewer, confidence legend visible
  • Ramachandran plot renders and is readable
  • Secondary structure assignment shown
  • Foldseek comparison returns results and handles no-hit case

🟒 MSA / Phylogenetics β€” spec detailed, spot-check only

Last verified: ___

  • All 5 MSA methods (ClustalOmega/MUSCLE/Kalign/MAFFT/T-Coffee) actually produce different, correct output
  • All 3 tree methods (NJ/UPGMA/ML) work
  • Bootstrap replicates shown as a color scale, correctly
  • SVG/PNG/Newick export all work (not just one of the three)

🟒 Domains β€” spec detailed, spot-check only

Last verified: ___

  • Pfam/InterPro fetch works
  • PROSITE raw-sequence scan works independently of InterPro
  • Reviewed/organism UniProt filters actually filter

πŸ”΄ Structure Prep β€” AUDIT FIRST (spec: techspec.md pre-work A1–A7)

Last verified: 2026-08-23 (backend shipped + unit-tested; live/Docker verification pending)

  • Chain health report renders: missing residues (REMARK 465 count + ranges) AND CA–CA chain breaks (chain/resnum/distance)
  • Repair outcome explicitly stated per run: intact / repaired / broken_unrepaired β€” a broken structure is never presented as equivalent to a clean one (A3) (backend chain_integrity tagging shipped in structure_prep.py router; UI display of the field pending)
  • Cleaned PDB produced (waters/heteroatoms removed) via pymol2 wheel; Biopython fallback logs a visible warning instead of failing silently (A1) (code shipped; live PyMOL run pending β€” Docker daemon down, venv lacks pymol wheel)
  • fpocket pockets table renders (id/volume/area/score/druggability/residue count); fpocket binary actually present in API images (A1) (both Dockerfiles build fpocket from source v4.0.0; image build unverified β€” daemon down)
  • CASTp result carries explicit castp_status (complete/timed_out/error/skipped) β€” timeout is never indistinguishable from "no pockets" (A7) (shipped; symmetric fpocket_status added)
  • Jobs persisted to Supabase (structure_prep_jobs), not in-memory; survives restart (A2) (router persists via Supabase + migration 008_structure_prep_jobs.sql written β€” migration must be applied in Supabase SQL Editor)
  • Status endpoint scoped to owning user (404 for other users' job IDs) (A6) (require_user_id + user_id filter on GET/POST)
  • Invalid pdb_id / uniprot_accession / template rejected with 400 before any network call (A4) (25 unit tests pass)
  • All outbound calls route through ssrf.validate_url() even for hardcoded hosts (A5) (unit-tested)
  • Loading / error / empty states present
  • Export works (feeds Β§2 structure-export endpoints once shipped)
  • Deferred: ESMFold window-splice gap repair (geometry risk β€” tag-and-proceed chosen per spec decision 2026-08-23); durable-worker execution for structure-prep jobs (stays in-process asyncio.create_task; if moved to worker, Dockerfile.worker needs fpocket+pymol2 parity)

πŸ”΄ De Novo Pipeline Branch (tier 6) β€” spec: techspec.md Β§1

Last verified: 2026-08-23 (backend + frontend shipped; mocked integration tests pass, live E2E against ESMFold/InterProScan pending)

  • Synthetic/random sequence that fails tiers 1–5 completes the pipeline without error state (acceptance criterion Β§1.4) (test_de_novo_branch.py::test_zero_hit_protein_run_completes_denovo β€” mocked; run status complete, not error)
  • Confidence badge on every downstream card, three states: identified / homolog / de_novo β€” homolog visually distinguished from tier-1 (Β§1.3) (ConfidenceBadge.tsx: cyan/amber/dashed-purple; rendered on results page; browser visual check pending)
  • De novo cards get distinct visual treatment (dashed border, "predicted, no database match") (Β§1.3) (DeNovoPanel dashed purple card; AlphaFoldViewer titled "Predicted structure (ESMFold)")
  • InterPro sequence-search mode used for de novo domain calls, not accession lookup (Β§1.2) (de_novo.interpro_sequence_search β†’ iprscan5 REST; normalized to domain shape; unit-tested)
  • Structure card sourced from ESMFold HF API for de novo runs, labeled as predicted (decision 2026-08-23) (esmfold_structure() with mean pLDDT from B-factors; inline pdb_text renders via new AlphaFoldViewer pdbData prop)
  • Function hints composition-level only, clearly unscored/heuristic (decision 2026-08-23) (function_hints() wraps _predict_from_sequence with "Heuristic" note; embedding scoring deferred below)
  • Pathway/interaction cards show "unavailable β€” no identified homolog", not empty tables (Β§1.2) (pathway unavailable notice on job page; msa/phylo/pathway steps marked failed with explicit message; interactions section auto-hides β€” no gene name exists)
  • Deferred: embedding-similarity function scoring (needs embedding infra β€” out of scope per spec Β§5); ESMFold window-splice for >768-residue de novo queries (API limit returns explicit failure today)

πŸ”΄ Structure Export β€” spec: techspec.md Β§2

Last verified: 2026-08-23 (shipped + unit-tested; live PyMOL/docking E2E pending)

  • Completed AlphaFold/structure job downloads .pdb, .cif, .pse (structure_export router; accessionβ†’AF-DB, PDB-IDβ†’RCSB)
  • .pse opens in PyMOL with cartoon + pLDDT spectrum pre-applied, no manual coloring (acceptance Β§2.5) (server-side pymol2 build: cartoon + spectrum b + transparent bg; stub-output guard tested. Live open-in-PyMOL check pending β€” venv lacks wheel, daemon down)
  • Docking job exports receptor+ligand merged .pdb and ligand-only .sdf (worker persists receptor_pdb+result_sdf; legacy rows get actionable re-run message)
  • Download menu on AlphaFoldViewer + DockingViewer with separate format items (Β§2.4) (StructureExportMenu: viewer toolbar + docking results page)
  • ChimeraX/VMD ship as preferred-format file + command script (.cif+cmd hints / .pdb+.tcl), NOT fake session files (Β§2.3b honest-scoping rule) (client-generated .cxc/.tcl alongside the coordinate download)
  • Deferred: ChimeraX .cxs and VMD state files (not freely scriptable headless β€” documented exclusion per Β§2.3b)

πŸ”΄ Page Capture + Final Synthesis β€” spec: techspec.md Β§3

Last verified: 2026-08-23 (shipped + unit-tested; live Supabase migration + real-run capture E2E pending)

  • page_captures row exists for every external source actually queried during a run (acceptance Β§3.4) (wired in _finalize_context: NCBI top hit, UniProt, RCSB, InterPro, AlphaFold DB, Reactome; de novo runs record none β€” correctly)
  • Human-facing page URLs captured (not just API endpoints), text sections + figure image URLs stored (stdlib HTML extractor: title + heading sections + og:image/figure srcs; fetch_status honest on failure)
  • Single "Final Report" panel rendered above per-tool breakdown, referencing confidence tier per finding (Β§3.3) (FinalReport.tsx above AIInterpretation; findings carry ConfidenceBadge tier + source-page links; LLM polish optional, deterministic fallback never invents content)
  • Capture respects ssrf.py allowlist + rate limits; no new SSRF surface (Β§3.2) (all fetches via validate_url + per-host 1.5s throttle; unit-tested)
  • Deferred: none yet (migration 009 must be applied in Supabase SQL Editor before captures persist)

Cross-cutting checks (apply to every tool above)

  • Tool's job type has a MAX_CONCURRENT entry if long-running (durable-worker-design.md Β§4.3)
  • Tool's output is included in PDF/JSON export (/api/export/job/{id})
  • Tool's job type is included in share-link support
  • Tool appears (or is deliberately excluded, and that's documented) in the pipeline wizard's 8-step chain
  • Tool has a Sentry-visible failure path, not a silent catch