# Blood Test Explainer — Remaining Work **For:** Dimitris + agents **Repo:** `r0m4k/blood-test-explainer` **Space:** `build-small-hackathon/blood-test-explainer` **Last updated:** 2026-06-13 **Suggested order:** 1 → 2 → 3 & 4 (parallel) → 5 → 6 --- ## Status snapshot | Area | Now | |---|---| | Space / app | Fine-tuned Transformers (`build-small-hackathon/blood-test-minicpmv-4_6-medreason`) | | Knowledge graph | 107 markers in `kb/cbc_knowledge_graph.json` | | Marker videos | All 107 have `video_url`; ~44 unique YouTube IDs (many reused) | | Real eval labels | 2/13 reports fully labeled in `eval/data/real/labels.jsonl` | | Fine-tune pipeline | `train/modal_finetune.py` → merge → Hub push | | Article / demo video | Not started | --- ## 1. Insert the custom model **Owner:** Dimitris (Modal + HF Space vars) - [x] Fine-tuned Transformers repo on Hub: `build-small-hackathon/blood-test-minicpmv-4_6-medreason` - [x] Code default in `src/model_paths.py` → `DEFAULT_HF_REPO` - [ ] Confirm Space loads the model after redeploy (2–3 PDFs from `eval/data/real/`) - [ ] Set HF Space variable if still on base model: `ZEROGPU_MODEL_ID=build-small-hackathon/blood-test-minicpmv-4_6-medreason` (optional when code default is deployed) - [ ] Run before/after eval: `modal run train/modal_eval.py::compare` → save `eval/before_after.json` - [ ] *(Optional, Llama badge only)* GGUF via `scripts/convert_to_gguf.sh` + `LLAMACPP_VISION=1` vars (see `README.md`) **Done when:** Space uses custom model in production; we have a before/after metric for the article. --- ## 2. Fine-tune app wording **Owner:** Dimitris or copy agent **Edit:** `app.py` (hero, upload hints, status, disclaimers), `src/pipeline_trace.py` (step copy), `README.md` (Space card) - [ ] One clear pitch: upload → extract → explain → prepare for clinician conversation - [ ] Badge claims match reality (Well-Tuned reflects live fine-tuned model) - [ ] Consistent “educational, not diagnosis” disclaimer - [ ] Less dev jargon in user-facing text (“pipeline phase”, etc.) - [ ] Align hero badges with hackathon criteria (OpenBMB, Modal, HF, off-grid) **Done when:** Hero + upload + report readable in under 60 seconds. --- ## 3. Enlarge the knowledge graph **Owner:** Agent task (Dimitris to review) **Tools:** `src/markers.py`, `kb/knowledge_base.py`, `scripts/expand_lab_knowledge_graph.py`, `kb/cbc_knowledge_graph.json` - [ ] Expand canonical markers in `src/markers.py` (target: 150–200 common lab markers) - [ ] For each marker: description, importance, food/exercise/supplement guidance, age/sex stats (cite MedlinePlus / `kb/references/`) - [ ] Add IDs to `MARKER_IDS` in `scripts/expand_lab_knowledge_graph.py` - [ ] Run `python scripts/expand_lab_knowledge_graph.py` - [ ] Run `pytest tests/test_report_pipeline.py` - [ ] Spot-check 10 markers in UI after a real PDF upload **Done when:** KG covers target marker list; multi-panel PDFs enrich correctly. --- ## 4. Marker video review (per marker) **Owner:** Agent task (Dimitris to review) **Tools:** `kb/marker_videos.json`, `scripts/expand_lab_knowledge_graph.py`, `app.py` (`_youtube_embed_html`) - [ ] Replace generic reused YouTube URLs with marker- or category-specific explainers - [ ] Prefer: MedlinePlus, NHS, Cleveland Clinic, Osmosis-style education - [ ] Avoid: treatment promises, irrelevant content - [ ] Use category fallback when no single-marker video exists (CBC, liver, lipids, thyroid, etc.) - [ ] Regenerate graph; QA embeds on high / low / normal marker cards **Done when:** ≥80% markers have unique or category-specific videos; no empty `video_url`. --- ## 5. Create an article **Owner:** Dimitris (+ Roman review) **Publish to:** HF blog / Devpost / LinkedIn (pick one primary) - [ ] Problem → approach (vision extract + deterministic KB, not LLM medical facts) - [ ] Fine-tune story + before/after numbers from `eval/before_after.json` - [ ] Architecture: Gradio + ZeroGPU, no hosted API - [ ] 2 screenshots + Space link - [ ] Limitations + disclaimer - [ ] Links: Space, model repo, GitHub **Blocked by:** #1 (custom model live), #2 (copy pass), metrics from eval. --- ## 6. Demo video (Laytimely-style) **Owner:** Dimitris - [ ] Script (~400–600 words): hook → upload → trace → report → one marker → disclaimer - [ ] AI voiceover (same stack as Laytimely) - [ ] Screen record Space or local app; strong PDF (`02_cbc_umc_johndoe.pdf` or `06_drlogy_cbc.pdf`) - [ ] Show trace hover, marker card, embedded YouTube - [ ] Royalty-free background music under voice (−18 to −24 dB) - [ ] Captions + title/end cards with Space URL - [ ] Publish (YouTube unlisted or HF README embed); link in article + submission **Blocked by:** #1, #2, ideally #3/#4 so demo looks polished. --- ## Submission checklist - [x] Custom model wired in code (`DEFAULT_HF_REPO`); [ ] confirm on live Space after deploy - [ ] Before/after eval documented - [ ] Copy + badges accurate - [ ] KG + videos polished - [ ] Article published - [ ] Demo video with AI voice + music - [ ] README / Space card matches final story --- ## Key paths | Path | Purpose | |---|---| | `train/modal_finetune.py` | LoRA train + merge + Hub push | | `train/modal_eval.py` | Base vs fine-tuned comparison | | `eval/data/real/` | Real PDFs + labels | | `scripts/expand_lab_knowledge_graph.py` | Regenerate KB JSON | | `kb/marker_videos.json` | Video catalog | | `README.md`, `RUNBOOK.md`, `DEPLOY.md` | Deployment + llama.cpp docs | ## Agent notes - Default extraction: `EXTRACTOR_BACKEND=transformers` — do not change unless badge work requires llama.cpp. - Do not commit model weights, tokens, or PHI. - Push to `origin` (GitHub) and `space` (HF) after merged changes on `main`. - Workflow details: `RUNBOOK.md`