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*
- [x] Interaction partners list renders with source database attribution (header + JSON export both state STRING-DB)
- [x] Confidence/evidence score shown per interaction (and explained via LearnPopover)
- [x] 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
- [x] Filter by evidence type (experimental / database / text-mining / co-expression) β€” client-side filter over the four STRING score channels, threshold 0.3
- [x] Export (JSON/CSV/image) works β€” PNG (network image), TSV (score table), JSON (raw payload) via `fix(interactions)` `d2ea003`
- [x] Loading / error / empty states present
- [x] 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"]`
- [x] 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
- [x] `/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)*
- [x] 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)*
- [x] 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)*
- [x] Status endpoint scoped to owning user (404 for other users' job IDs) (A6) *(require_user_id + user_id filter on GET/POST)*
- [x] Invalid pdb_id / uniprot_accession / template rejected with 400 before any network call (A4) *(25 unit tests pass)*
- [x] 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)*
- [x] 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)*
- [x] 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)*
- [x] De novo cards get distinct visual treatment (dashed border, "predicted, no database match") (Β§1.3) *(DeNovoPanel dashed purple card; AlphaFoldViewer titled "Predicted structure (ESMFold)")*
- [x] 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)*
- [x] 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)*
- [x] 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)*
- [x] 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)*
- [x] Completed AlphaFold/structure job downloads `.pdb`, `.cif`, `.pse` *(structure_export router; accession→AF-DB, PDB-ID→RCSB)*
- [x] `.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)*
- [x] Docking job exports receptor+ligand merged `.pdb` and ligand-only `.sdf` *(worker persists `receptor_pdb`+`result_sdf`; legacy rows get actionable re-run message)*
- [x] Download menu on AlphaFoldViewer + DockingViewer with separate format items (Β§2.4) *(StructureExportMenu: viewer toolbar + docking results page)*
- [x] 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)*
- [x] `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)*
- [x] 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)*
- [x] 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)*
- [x] 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