MODS — Mission Spec
A goal-oriented briefing for an agent arriving with no prior context.
Version: 1.0 · Written: 2026-09-07 · Repo: whafa/Maple
0. What this document is, and how to read it
Every other planning document in this repository is organized around a system: the knowledge graph, the training pipeline, the PRS gates, the dashboards. This one is organized around the goal. It exists because the systems are now complex enough that a capable agent can spend a week doing excellent work on a subsystem that does not move the actual objective.
Read it in order. §1–§3 are the why and the who; skipping them will cause you to make locally-reasonable decisions that are globally wrong. §4–§6 are what has been built and what it has actually shown, stated honestly including the null results. §7 is the rules that were paid for in lost data or wrong clinical claims. §8 is the open frontier, ordered by expected value to the patient. §9–§11 are orientation.
This document goes stale. Anything with a number in it should be re-verified against the live source named beside it before you rely on it. §10 tells you how.
The one-line summary, if you read nothing else: we are trying to find drugs that might work for one specific woman with stage IV colorectal cancer, using a biomedical knowledge graph and a graph neural network conditioned on her own molecular data, and to do it rigorously enough that an oncologist would take the output seriously.
1. The mission
1.1 The objective
Extend Maureen’s life, and the quality of it, by finding treatments for her disease that the standard of care will not surface on its own.
That is the top of the goal tree. Everything below it is instrumental. The project is not “reproduce a paper,” not “build a knowledge graph,” and not “ship a dashboard,” although it has done all three. When a decision is genuinely ambiguous, resolve it by asking which branch gets closer to a defensible, actionable candidate list for this patient.
1.2 The goal hierarchy
| ID | Goal | Status |
|---|---|---|
| G0 | Treat Maureen’s disease. | Ongoing, indefinite |
| G1 | Produce a ranked, evidence-backed shortlist of repurposing candidates specific to her tumor, that her clinicians would actually discuss. | Not yet achieved. This is the deliverable. |
| G2 | Prove the ranking mechanism works, by showing it recovers biology we independently measured in her (see §6). | Unknown as of 2026-09-24. Every Tier-1/Tier-2 number to date was computed on pooled RGCC draws and is superseded pending restatement (GH #324). Previously read “Tier-2 passes; Tier-1 marginal.” |
| G3 | Personalize the ranking with her own genetics, expression, variants and history, rather than serving a generic “colorectal cancer” answer. | Mechanism built, signal not yet demonstrated. See §5.4. |
| G4 | Keep the pipeline reproducible, auditable and inspectable end to end, so that any candidate can be traced back to its evidence. | Largely achieved and worth protecting. |
G1 has never been shipped. Everything to date has been building and validating the machine that would produce it. That is the correct order of operations, but it is worth naming plainly: the project began in earnest in January 2026 and there is still no candidate list. Any plan that does not shorten the distance to one should justify itself.
1.3 The precedent this is modeled on
David Fajgenbaum, as a medical student, was dying of Castleman disease with no approved treatment and nobody working on a cure. He worked out that sirolimus, a 25-year-old immunosuppressant approved for something else entirely, should work on his pathway. He tried it. He is alive. He co-founded Every Cure in 2022 to do that systematically, scanning roughly 22,000 diseases against 3,000 drugs.
Richard heard Fajgenbaum tell this story on the Huberman podcast on 2025-11-03. That is the origin of this project — in his words, “it flipped some switch in my head.” When framing MODS in a writeup or an intro, anchor on Fajgenbaum and sirolimus, not on generic “AI for drug discovery.”
The bet MODS makes is the n-of-one version: among the ~20,000 approved drugs there may be one that nobody has thought to try for colorectal cancer, or for this colorectal cancer, and a knowledge graph plus a link-prediction model is a defensible way to look for it.
1.4 What this is not
- Not medical advice, and not a substitute for oncology. Maureen is on the standard of care and will stay on it while it works. Nothing produced here reaches her without going through her treating physicians.
- Not a decision maker. A high model score means “the literature’s geometry is consistent with this drug being relevant.” It does not mean the drug works, is safe in combination with her current regimen, or is compatible with her liver function and blood counts.
- Not a product. There is one user and one patient.
The value, if there is value, is precision. A tool that surfaces one surprising, plausible candidate her oncologist has not considered is worth building. A tool that surfaces fifty is not.
2. The patient
Everything in this section must trace to her actual data. Before asserting any clinical or genomic fact about Maureen, confirm it comes from a real report row, not from memory, not from a test fixture, and not from what is typical for colorectal cancer. See §7.1 — this rule was written because a phantom driver mutation propagated across six documents and produced a clinically inverted claim.
2.1 Who she is
Maureen, the user’s wife and the mother of their children. She is the primary
MODS patient. In the database she is mods_patient.id = a withheld UUID, user ID 26, with
role:patient and api:med:* permissions.
There is a second patient row (hu52B7E5, a Personal Genome Project stand-in used
for proxy-patient work). Any no-argument patient lookup resolves to the
earliest-created row, which is Maureen, by design. Do not write a resolver that
raises on ambiguity; three separate implementations have made that mistake.
2.2 Disease course
| When | What |
|---|---|
| Early 2024 | Diagnosed stage IV colon adenocarcinoma after persistent back pain. |
| 2024 | First-line FOLFOXIRI + bevacizumab (TRIBE-style). Aggressive polydrug regimen; she was young enough to tolerate it. Toxic but effective. |
| 2024 | Three consecutive quarterly CT scans show no evidence of disease. |
| Dec 2024 | Stops maintenance chemo. Adopts whole-food plant-based diet, juicing, fasting, daily exercise, QiGong, TCM under the TCM practitioner. |
| Spring 2025 | Blood markers creep up. CA 19-9 78 in May, flat into August. CTC counts rising. Mold exposure found and remediated; EBV and Lyme-associated viral titers positive. |
| Jul 2025 | RGCC SOT injection (Buffalo, NY). |
| Aug 2025 | Lump above the chemo port. CT 2025-08-12: enlarged lymph nodes in neck and chest, nothing in any other organ. Port and lump excised 2025-08-25. |
| Sep 2025 | Pathology confirms recurrent adenocarcinoma. Nodal-predominant recurrence, no liver metastases — see §2.5, this is load-bearing. |
| Late 2025 | Second course: FOLFOX + cetuximab + encorafenib (the BREAKWATER regimen, FDA-approved June 2025 for BRAF V600E mCRC). Six cycles. Roughly doubles expected progression-free time versus the TRIBE-era combination, with somewhat less toxicity. |
| 2026 | Maintenance: cetuximab + encorafenib + binimetinib. Albumin dropped to 3.1 in Feb 2026, attributed to the MEK inhibitor. CA 19-9 fell to 22. |
| Aug 2026 | NED on BREAKWATER maintenance (user-reported 2026-08-22). |
She also carries a separate melanoma primary (Caris the melanoma specimen, NRAS Q61K,
skin, likely treatment-associated). It is local and was definitively treated. It is
not a later timepoint of the colorectal disease, and any narrative that reads a
“BRAF to NRAS clonal switch” across her Caris specimens is wrong. Two cancers.
2.3 Current clinical state (verify before relying on it)
- NED by imaging on maintenance, as of the last user report.
- Signatera ctDNA negative monthly from 2025-12-05 to 2026-03-03, the last report on file. The series runs back to 2025-01-29; see §2.6. (⚠ 2026-09-28: no document of any kind has reached Maple since 2026-05-08 except one lab, so Apr–Sep 2026 results probably exist upstream. Keeping the record current is GH #512.)
- CA 19-9 trending down and flat: 30 → 22 → 20 → 18 → 18 across 2025-12 to 2026-08, reference ≤37 U/mL. One outlier of 78 on 2026-03-16 is suspect (sits between 23 and 22, coincides with null rows the same day) — treat as a probable mis-parse.
- CEA has no numeric value after 2025-09-16. Kaiser appears to have switched her surveillance marker to CA 19-9. Any analysis that uses CEA as the trajectory test case will train on a series that flatlines to null. Re-base on CA 19-9.
2.4 Verified molecular profile
Colorectal tumor, somatic. Sources: Caris MI Profile the 2024 colorectal specimen (2024-01-23) and
the 2025 colorectal specimen (2025-09-13), Guardant360 the 2025 liquid biopsy (2025-02-08), Genomic Health /
Natera Altera the tumour-informed ctDNA profile (2025-02-25).
| Gene | Variant | Type | Concordance |
|---|---|---|---|
| APC | T1556fs (c.4666dupA) | pathogenic frameshift, in the mutation cluster region | 4 reports |
| BRAF | V600E (c.1799T>A) | pathogenic | 4 reports |
| ATM | S151fs (c.450_453delTTCT) | pathogenic frameshift, somatic | 3 reports |
| TGFBR2 | D522fs | pathogenic | Caris 2024 |
| MGA | I945fs | pathogenic | Caris 2025 |
| NTRK2 | V717M | VUS | both Caris |
| MYC / EP300 | copy number | indeterminate | Caris |
Tumor characteristics: MSS (microsatellite stable), TMB 2–3 mut/Mb (low), PD-L1 0 by 22c3 TPS, CMS1 subtype called on the 2025 report. RAS wild type — which is why cetuximab is appropriate for her.
Germline: one pathogenic variant, confirmed on two platforms — the clinical panel and her own 30× WGS. Gene, variant class, coordinate and genotype are withheld here.
Two corrections that must not regress:
- She has no KRAS mutation. A phantom
KRAS G12Cpropagated through memory and documentation and produced the inverted claim that anti-EGFR therapy did not apply to her. KRAS is absent from all nine of her genomic reports. It was most likely seeded by a parser test fixture. Do not re-add it. - An earlier loss-of-heterozygosity reading did not survive scrutiny. An inference from allele fraction to loss of heterozygosity was overturned by B-allele-frequency analysis on the real specimens: the arm is balanced across all three, with a per-arm deviation of 0.02–0.03. A treatment rationale built on that reading does not hold as stated.
2.5 The single most important clinical fact for repurposing
Her recurrence is nodal-predominant with no liver metastases.
Active liver metastases are the strongest negative predictor for immunotherapy in MSS colorectal cancer; the mechanism is that liver involvement induces systemic immune tolerance. The no-liver-met subgroup is not a post-hoc slice, it is the entire efficacy story for checkpoint blockade in this disease.
Botensilimab + balstilimab (Fc-enhanced anti-CTLA-4 plus anti-PD-1) in refractory MSS mCRC without active liver metastases: ORR 20%, median duration of response 16.6 months, median OS ~21 months, 2-year OS 42%, 3-year OS 33% (n=123, phase 1b/2 C-800-01). For context, the expected ORR from checkpoint inhibitors in refractory MSS CRC is approximately zero.
Use this as the interpretive key when reading any MSS-CRC immunotherapy result: always ask what fraction of the cohort had liver metastases.
Caveats, current as of 2026-08-29 and worth re-checking:
- Not FDA approved; the agency discouraged the accelerated-approval pathway.
- The phase 3 BATTMAN trial (
NCT07152821) is TERMINATED as of 2026-07-13,whyStopped= “Pharmaceutical Sponsor discontinued trial financial support.” Agenus press releases announcing enrollment and a $340M raise are still live and still wrong. Sponsor financial durability is a material risk to the whole program. - France granted reimbursed compassionate access (AAC, ANSM, 2025-09-09) for exactly her phenotype. France-only; applicability to a US patient is unestablished.
NCT07227636(MSK, adjuvant BOT/BAL for ctDNA-positive CRC) is the closest fit to her situation but its cohorts require R0 resection of stage III disease or of a liver metastasis; stage IV nodal-only may map to neither.
The NED eligibility gap. Being NED by systemic therapy is its own category and fits neither trial bucket: too well for treatment trials, which almost all require measurable disease per RECIST; not the right kind of NED for adjuvant and minimal-residual-disease trials, which require R0 surgical resection. This will keep recurring. The highest-value unblocking action is tumor-informed ctDNA testing (Signatera) — CT resolution bottoms out around 5 mm, ctDNA positivity is the entry criterion for every MRD trial, and it informs maintenance duration regardless. (⚠ 2026-09-28: stale. She has had monthly Signatera since 2025-01-29, ordered through her integrative practice, and has been ctDNA-negative since 2025-12-05. So MRD trials that require a positive result do not apply while it stays negative. See §2.6 and GH #131.)
2.6 What she has that most patients do not
This is why an n-of-one approach is tractable here at all.
| Asset | Detail |
|---|---|
| Ex vivo drug sensitivity | RGCC Onconomics Plus ×2 (2025-02-15, 2025-09-19) — the only sensitivity source. 330 agent results, of which 224 carry a numeric score: 112 distinct drugs × 2 draws. Of each report’s 112, 59 sit on a graded % scale (the chemo panel) and 53 are MoAb/SMW agents RGCC grades on a binary “No sensitivity / Sensitivity” legend and encodes as 0. % cell death by Annexin V-PE flow cytometry on her own circulating tumor cells. Real per-patient supervision; the PDR papers have none. Corrected 2026-09-24 — see GH #317. |
| CTC burden + immune profile | RGCC OncoTrace (CTC enumeration: 2.7 cells/ml Feb 2025, 2.6 cells/ml Sep 2025, SD ±0.3; colon-cancer reference < 5 cells/ml) and IMMUNE-FRAME (ELISA cytokine + flow immunophenotype; reported down-regulated immunity via CD25/CTLA4 overproduction). Neither carries any drug-sensitivity data — they were miscounted as sensitivity sources until 2026-09-24. Not yet parsed into structured rows. |
| Full transcriptome | Caris WTS tabular export: 3 specimens × 59,960 genes × 41 reference lineages, TPM plus percentile. 179,880 rows ingested at matched lineage. |
| Germline WGS | 30× whole genome, sequencing.com kit the WGS kit, GRCh38, MGI/BGI DNBSEQ platform. 5.26M variants, 4.43M with rsIDs, 4,419,571 genotype rows loaded. |
| Tumor exome + RNA | Caris DNA and RNA BAMs, VCFs and FASTQs for all three tumors, ~140 GB on local disk. |
| Longitudinal clinical record | Kaiser EHR via Epic FHIR plus HTML import; the integrative clinic via Cerbo. Labs, conditions, medications, encounters. |
| Documents | 1,903 rows in mods_document; 9 genomic reports fully parsed. |
Nine Natera Signatera ctDNA reports are on file but unparsed — no parser exists for that report shape yet (GH #131). Given §2.5, this is a higher-value gap than its priority label suggests. (⚠ 2026-09-28: there are 21 documents, not nine: 19 distinct draws plus 2 duplicates, and one more draw appears only in the history tables. Each report carries one number, MTM/mL (circulating tumor DNA, not circulating tumor cells):
- 7.26 on 2025-01-29, rising off treatment to 20.74 on 2025-10-01. The first-ever draw was already positive, about a month after maintenance chemo stopped and about 7 months before the August CT.
- 0.15 on 2025-10-27, after FOLFOX + cetuximab + encorafenib began. Six rounds were complete by late December, so the start was around early October.
- Negative from 2025-12-05 on.
For model validation that is worth little. It gives one regimen-level response label
(BREAKWATER, a combination, so nothing can be attributed to a single drug) and an
untreated-growth period. At zero, it is a relapse tripwire, not a source of drug-level
labels. Parse the text layer; the OCR block in content_text misreads the history
table.)
2.7 Care team and context
- Her health plan’s oncology service — medical oncology. The conventional path.
- An integrative oncology clinic — all the genomic testing (Caris, Guardant, Invitae, RGCC) was ordered here and paid cash. Their EHR is Cerbo, not FHIR.
- A trial-strategy consultant — clinical-trial strategy, supplement protocol cycling around chemo, abscopal-effect thinking.
- A TCM practice — herbal formula, acupuncture.
She is doing everything that is not dangerous. The project sits alongside that, not in place of it.
3. The approach, and why it is shaped this way
3.1 The core idea in plain terms
A biomedical knowledge graph is a map of facts: drug X treats disease Y, gene Z is associated with disease Y, drug X targets protein P. Do this for a few million facts and you get a web connecting drugs, diseases, genes, proteins, phenotypes and pathways.
A graph neural network can learn the shape of that map — not the facts, the geometry. Once it has the geometry you can ask about edges that are not written down: if this drug and this disease are not linked in the data, how strongly does the geometry say the link should exist? That is the repurposing signal.
Then you condition it. A model trained on published facts gives the best answer the literature supports for “colorectal cancer” as a category. That is not what is needed. It has to be the best answer for this tumor, with its specific mutations, its specific expression profile, and its specific history of what has already been tried. That conditioning is the hard part, and it is where the project currently is.
3.2 The papers this is built on
Four papers form the lineage. Do not conflate them — they report different metrics
on different tasks, and cross-comparing their numbers is a recurring error. The core
papers are auto-loaded into every session via @-imports in CLAUDE.md; the full
text lives in docs/References/.
| Key | Paper | Role | Headline numbers |
|---|---|---|---|
| KG-Predict | Gao, Ding, Xu, JBI 2022 | Introduced GP-KG and the CompGCN+ConvE foundation model. | CV link prediction: AUROC 0.981, AUPR 0.409, MRR 0.261. Alzheimer’s case study: AUROC 0.868, AUPR 0.364. |
| PDR1 | Oğuztüzün et al., JBI 2025 | Individualized KG-Predict per patient using UK Biobank PRS and biomarker scalars. | Table 3 foundational: MRR 0.192, Hits@10 0.313, AUC 0.866. |
| PDR2 | Oğuztüzün et al., JBI 2026 (DOI 10.1016/j.jbi.2026.105039) | Re-architecture on ULTRA/NBFNet; personalization moves into the loss function. | Reports 1.3×–5.4× AUPRC improvement per patient. |
| NBFNet / ULTRA / PrimeKG | Zhu 2021 / Galkin 2024 / Chandak 2023 | The architectural and graph substrate underneath PDR2. | ULTRA on Hetionet (density comparable to PrimeKG): fine-tuned MRR 0.399 at 6 layers. |
3.3 Why two knowledge graphs
- GP-KG (61,097 entities, 1.24M relations) is the paper comparator only. If the pipeline reproduces the published numbers on the data the papers used, the tooling is trustworthy. It is insufficient for the real work: only 1 of Maureen’s 5 high-sensitivity RGCC drugs is in it, and most biologics are missing entirely.
- PrimeKG (129,157 entities, 7.99M relations) is the production graph. It contains the drugs she is actually on, and it carries indication, contraindication and off-label-use edges that most graphs lack — exactly the edges repurposing needs.
Agreement between the two on a candidate is a stronger signal than either alone.
3.4 Why a graph neural network rather than a language model
Large language models are trained on human language, not molecular language, and are weak at the chemistry and biology this requires. The knowledge graph gives explicit, traceable, multi-hop structure; the GNN learns over that structure; every prediction can be walked back to the edges that produced it. Interpretability is not a nicety here — a candidate that cannot be explained to an oncologist is not actionable.
4. What has been built
4.1 Maple, the platform
A terminal-centric web application that is also the workbench for all of this.
React/Vite frontend, FastAPI backend, PostgreSQL with pgvector, a Postgres-native
worker queue (SELECT FOR UPDATE SKIP LOCKED, no Redis), deployed on Google Cloud
Run, with MCP servers exposing the whole surface to Claude. Full architecture in
technical_guide.md and CLAUDE.md.
MODS is the oncology component inside Maple, split along three duty lines:
| Dashboard | Alias | Duty |
|---|---|---|
| Research | research | Knowledge graph: Explorer, Health, Compositions |
| Lab | lab | Modeling workbench, connectors, training runs |
| Clinic | clinic | Patient data |
| Genomic Browser | genome | Caris VCF/BAM/RNA — 11 tabs, oncoprint, lollipop, pileup, expression, copy/LOH |
| PRS Pipeline | prs | Polygenic score gates and manifest |
| Metro Map | metro | McLelland’s metabolic fuel lines, with her RGCC results and tumor expression on them. The one feature she has asked about (§8) |
4.2 The knowledge graph
Canonical schema is mods_kg_entity / mods_kg_entity_source / mods_kg_relation.
The legacy mods_kg_node / mods_kg_edge tables are deprecated and reading them
gives misleadingly empty answers.
Live totals, 2026-09-07 (mods_kg_canonical_stats):
3,695,039 entities · 19,478,158 relations · 11 sources
| Source | Entities | Relations | Note |
|---|---|---|---|
rtx_kg2 | 3,540,372 | 10,222,708 | PARTIAL — ~7% of upstream. Do not trust its coverage. GH #85 |
prime_kg | 129,157 | 7,987,620 | production graph |
gp_kg | 61,097 | 1,244,554 | paper comparator |
civic | 6,001 | 11,456 | variant evidence |
pharmgkb_variants | 5,017 | 9,376 | pharmacogenomics |
clinvar / oncokb | 932 / 176 | 1,622 / 483 | variant evidence |
maple_patient | 5 | 339 | Maureen and proxies |
Maureen is a first-class node: MAPLE_PATIENT:maureen-1173a8db, with roughly 250
outbound relations covering gene-level alterations, RGCC sensitivities, expression,
medications and phenotypes, materialized by
backend/mods_patient_kg_service.py::materialize_patient_kg.
Compositions are named, versioned graph recipes that training runs point at. Ten
exist. The two that matter: maureen_focus_v1 (PrimeKG domain-pruned plus the full
variant-evidence stack) and maureen_full_v1 (identical but with no PrimeKG domain
exclusions, for ablation).
4.3 The training platform
Vertex AI CustomJobs, submitted through the Maple worker queue so every run lands in
mods_research_run and appears in the Training Cockpit. Never submit via raw
gcloud — it makes the run invisible to the system and requires manual backfill.
The PDR2 container dispatches five modes via a MODE env var: train, fine_tune,
eval_patient, evaluate_personalized, score_edges.
47 runs recorded to date: 23 complete foundation runs, 5 complete fine-tunes, the rest failed, queued or halted.
4.4 Data assets on disk
backend/data/ is host-only, gitignored, and excluded from Docker images. It holds
roughly 140 GB: Maureen’s germline WGS and FASTQs, all three Caris tumor BAM/VCF sets,
the full-transcriptome WTS exports, the PGS Catalog cache (5,377 scoring files, 59 GB),
and the raw knowledge-graph dumps. Never commit any of it.
5. Where the science actually stands
This section is the honest ledger. Read the null results as carefully as the positive ones; they are the reason the project is where it is.
5.1 Paper reproduction (Phase 0) — mostly closed, one asterisk
GP-KG loaded and trained; ranking correlation against the published drug ranking is Spearman ρ = 0.740. Strong, not the ≥0.90 that would let us claim full reproduction. The gap is not a bug: the authors never shipped their train/test split and their split script sets no random seed, so the exact split is unrecoverable.
The Alzheimer’s case study sits at AUROC 0.79–0.81 against the paper’s 0.868, a ~7% gap from the same cause. Open decision: chase it or document it as an asterisk.
5.2 Architecture — a real finding
Vanilla CompGCN cannot go deeper than about 2 layers on PrimeKG. At average degree 125, a 2-hop neighborhood already covers 12% of the graph and a 3-hop one saturates it; this is textbook over-smoothing, and 1 layer empirically beats 2 by ~12%.
Depth is an architectural problem, not a hyperparameter one. Within CompGCN, embedding dimension is the lever, not depth. NBFNet and ULTRA use a labeling trick that makes per-query rooted features rather than whole-graph smoothing, which is why they scale to 6 layers on dense biomedical graphs. This is the justification for the whole PDR2 move.
5.3 Best patient-specific signal to date
| Run | Architecture | Tier-1 (Spearman ρ vs RGCC) | Tier-2 (AUROC) |
|---|---|---|---|
Run B primekg_corr_1l_400d_v1 | CompGCN, 1 layer, 400d | +0.351, p = 0.00018, n = 109 — ⚠ superseded, see below | — |
PDR2 v2 foundation maureen_focus_v1 | ULTRA/NBFNet from scratch | +0.181, p = 0.062 (marginal) — ⚠ superseded | 0.835 (pass) — ⚠ superseded |
⚠ Run B’s Tier-1 number is superseded pending restatement (GH #324; root cause GH #317, 2026-09-24). ρ = +0.351 (n=109) was computed against RGCC labels averaged across her two draws. For ~100 of the 112 panel drugs the average is harmless, but the 12 that moved ≥25 points — four taxanes down, eight anthracycline / topoisomerase-II up — were collapsed to a mid-range value that occurred at neither timepoint. So ~11% of the ranked points are artifacts of the averaging, the quantity is a correlation with the mean of two biological states rather than with her drug sensitivity, and the magnitude is not trustworthy. The sign probably survives. Re-run per timepoint through the fixed
compute_metrics_crc.pybefore citing it as a baseline. The same applies to every Phase 7.5 / PDR2 v2 Tier-1 and Tier-2 figure.
⚠ The PDR2 v2 row is leak-driven, not merely pooled (2026-09-27, GH #214, #439). That foundation (
916bdd2c) trained on 74 of her 135 RGCC edges.
- 4 of the 5 Tier-2 positives were in its training graph: oxaliplatin, cisplatin and mitomycin directly, pemetrexed through a PharmGKB twin.
- Carboplatin was the only held-out positive. It is the “outlier at rank 260” below.
- Per draw, Tier-1 is flat on clean drugs. On the 49 drugs whose label never reached training, ρ = −0.051 / −0.045 (n.s.); on the 56 whose label did, +0.363 / +0.407.
Read the v2 row as memorization. The first clean numbers will come from smoke run #1 (
docs/mods_smoke_run_1_playbook.md).
Run B remains the strongest correlation with her measured drug sensitivities. The PDR2 foundation has the better Tier-2 AUROC — it beats every PDR1 baseline at separating her high-sensitivity drugs from her resistant ones — but roughly half the Tier-1 correlation. One carboplatin outlier at rank 260 suppresses PDR2’s Tier-1; excluding it gives ρ ≈ +0.26.
Also established: training on a smaller, patient-focused composition beats a generic
one. maureen_focus_v1 lifted her own-edge filtered MRR from 0.0052 to 0.0167, a
224% improvement over training on the full graph. (⚠ 2026-09-27: unrestated. Almost all
of the lift sits on current_medication and sensitive_to_drug, the predicates both
foundations trained on, and the patient MRRs were computed on re-split data (GH #433).
The composition effect may still be real, but these numbers cannot show it.)
5.4 Personalization — the central open problem
The published PDR2 personalization mechanism does not, as released, produce lift on Maureen’s data. This is the most important negative result in the project.
PDR2 personalizes through two independent mechanisms that only combine at inference:
- Mechanism A, patient-as-a-node. Maureen is a first-class entity in the training
graph from epoch 1, so the foundation learns an embedding for her and queries of the
form
(Maureen, r, ?)are possible. This works and is required for anything else. - Mechanism B, the personalized loss. The foundation is frozen; the only trainable parameters are per-disease and per-protein weights inside the loss, multiplied by her polygenic risk scores and expression values. At test time these produce an additive bias on each candidate’s score.
Measured results on her Track A profile:
| Loss variant | λ | Baseline MRR | Personalized MRR | Δ |
|---|---|---|---|---|
Released code (paper_code) | 0.01 | 0.005152 | 0.005131 | −0.4% (null) |
| Paper-text formula | 0.01 | 0.005152 | 0.000391 | −92.4% (destructive) |
| Paper-text formula | 0.1 | 0.005152 | 0.000288 | −94.4% |
| Minimal patch | 0.01 | 0.005152 | 0.005215 | +1.2% (marginal) |
Four things are known about why:
- The released loss and the paper text disagree in four places: sign on the λ
terms, per-triple coupling to the prediction score, a
tanh, and L2 weight normalization. Implementing the paper text literally is catastrophic. Thetanhand normalization are load-bearing stability tricks the text omits. - The criterion is gradient-degenerate. Both loss terms are functions purely of (criterion weights, fixed patient values) and do not depend on the batch, so their gradient is identical at every step. The optimum is reachable in closed form; a 20-epoch fine-tune buys nothing after the first few.
- The criterion is edge-blind. In
apply_personalization, adjacency strength is hardcoded to 1.0, so asensitive_toedge and acontraindicationedge push the same direction. The identified fix is a learned signed per-relation term (Phase 12, GH #47, design indocs/pdr2_phase12_per_relation_criterion_planning.md). It requires no foundation retrain. - The genetic half has never been fed real numbers. Every run to date used
“Track A” — zero PRS. Disease weights stayed at random initialization because with
prs_values = 0there is no gradient. In the PDR1 paper, PRS was the single highest-impact feature (Cohen’s d = 1.05, dropping to 0.77 without it). We have been running the personalization with its most important input set to zero. (2026-09-28: the first release of her PRS: a v0 smoke release of 590 scores over 109 disease anchors (tagsmoke_v0, release runc3be9df0), normalized against the 667-sample EUR reference. Smoke run #1’s Track B fine-tunes are the first to feed it; §5.5.)
5.5 Polygenic risk scores — rebuilt, not yet computed
The PRS work is a cautionary tale worth understanding before you touch it.
The original scorer read a variant-only genotype store and treated an absent locus as dosage zero. For a scoring file whose effect allele is the reference allele — about half of all loci — a homozygous-reference call should contribute 2 × weight, not 0. Every score in the legacy fleet was wrong. The fleet was wiped on 2026-07-13. An external audit independently reproduced the ~49% drop across 40 scores.
The rebuild is gated:
| Gate | What it does | Status |
|---|---|---|
| A | Read the genome correctly — dense callset where hom-ref says 0/0 instead of being absent | Done, live on prod, merged (PR #235) |
| B | Catalog which published scores are computable | Done. All 5,377 cached GRCh38 scores classified. Classifier v4 (2026-09-24) promoted unplaceable_rows at a ≤1% threshold: 3,753 production-eligible (69.8%), 2.166B variant rows. (The earlier 3,863 was a v2-era figure; v3 fell to 2,322 when the hm_pos fallback was closed, then v4 recovered to 3,753.) |
| C | Rewrite the arithmetic onto the dense callset | Built (2026-09-22). backend/mods_prs_scorer.py; compute_prs_pure is deleted. Scores write at validity='quarantined' — Gate F releases. |
| D | Ancestry and percentile normalization | Built; first real pass 2026-09-28 on the v0 set (D1 61aaccdf, D2 d63b3439 under the #499 fix, D3 against 667 EUR samples). Not run fleet-wide, and ancestry PCs are not computed yet. Before that it was built, not run. The pgsc_HGDP+1kGP_v1 panel is downloaded, md5-verified and extracted (15 GB plink2, 3,942 samples / 84.3M variants; 3,330 unrelated after the KING cutoff). D3 (PC regression + percentile) was built in PR #386, and D1 (allele frequencies) and D2 (the panel, and the patient beside it, scored under her policy) in GH #396. The real pass waits on the worker-image rebuild (GH #339) and, for D2, on E3 (GH #422). Nothing yet computes the ancestry PCs D3 reads. |
| E | Actually compute the numbers | Done twice. E1 2026-09-24 (2,321 of 2,322 at v3 scope, a measurement run). E2 2026-09-26: 3,752 of 3,753 at v4 scope, all reconciling, none outside theoretical bounds, fleet outcomes summing to the manifest’s eligible rows exactly. |
| F | Biological sanity checks + PDR manifest | v0 writer built (#296; backend/mods_prs_release.py, scripts/prs/release_gate_f.py) and run: 590 released as of 2026-09-28 (smoke run #1, #296’s rules with recorded waivers): 590 scores over 109 anchors, smoke_v0. The final release is not started. Inputs now measured (927 scores carry an unverified weight scale). |
Superseded 2026-09-28: the first release of her PRS: a v0 smoke release of 590 scores over 109 disease anchors (tag
smoke_v0, release runc3be9df0), normalized against the 667-sample EUR reference. The final Gate F release is still ahead. The paragraph below describes the state before it.
No released PRS exists, and that is still true after E2. 3,752 scores are computed
and every one is quarantined; only Gate F promotes, so every reader correctly returns
nothing. The remaining blocker on §5.4 item 4, and therefore on G3, is D and F — the
reference FASTA and the panel are both staged.
One decision sits between E2 and release. Gate C defers palindromic SNVs (2.99% of
rows, but a median 10.4% of rows for each of the 1,687 affected scores), and their strand
can only be resolved from panel allele frequencies. So after D1 either palindromes stay
deferred and E2 is the release candidate, or they are resolved and Maureen needs one more
fleet pass. See docs/prs_primer.md §5.5 open decision 2.
Resolved (Richard, 2026-09-22): run both, every time, and mine the divergence.
This document used to say pgsc_calc v2.3.0 was “the scoring engine of record, not the
bespoke scorer”, while docs/prs_primer.md defined Gate C as building the bespoke scorer
and reconciling it against pgsc_calc. That either/or was the wrong frame. Both run on
every scoring pass; the delta between them is a first-class output, not a one-time
acceptance test.
The reason this is stronger than picking one: the July audit’s lesson was that a check
sharing the scorer’s assumptions cannot fail. A permanent second opinion is the structural
answer to that, where a one-off gate is only a snapshot. And the divergence decomposes —
pgsc_calc mean-imputes missing dosages to 2p and resolves palindromes by allele
frequency, both of which MODS deliberately does not do (§ prs_primer.md 5.4). So each
per-score delta splits into an imputation term, a palindrome term, and a residual that
should be zero. A non-zero residual points at a real defect in one of the two
calculators; the imputation term separately quantifies how much of a published score’s
value is invented rather than measured, which is worth knowing about a score no matter
who computed it.
Division of labour that follows: MODS is canonical for the released value (it is the only
one that emits the coverage_v1 payload the read layer renders, and it is reproducible
in-repo), pgsc_calc is the independent witness, and agreement within tolerance is a
Gate F release criterion. backend/scripts/prs/reconcile_pgsc_calc.py already exports
the bundle and diffs the sums; what it still needs is Nextflow and a container runtime —
plausibly the existing digest-pinned Vertex image_uri seam. Smaller question still open:
where the per-score delta is stored (a reconciliation_v1 block in the score’s metadata
is the obvious home, and needs no migration).
The other trap here, closed in code on 2026-09-28 (GH #244): the 13-entry list then
named UKB_TRAIT_TO_PGS_DEFAULTS silently sized the model’s disease axis (schema v1:
6 diseases, no colorectal cancer), and three of those 13 are labeled for the wrong
disease. It is now SMOKE_TEST_PGS_SET, used only where it is asked for by name. Axis
v2 is built from the released Gate F axis picks, one position per anchor, with
colorectal cancer’s MONDO:0005575 required, and v1 is never rewritten. Gate C does
not use the list either — an omitted pgs_ids resolves to the Gate B manifest’s
production-eligible set.
Ancestry note: Maureen is almost entirely European, corroborated from her own WGS at ancestry-informative loci. European-trained scores are best-case portability for her, so no elaborate per-score portability flagging is needed.
5.6 A validation flaw you must know about
mods_patient_kg_service._build_drug_sensitivity_edges materializes her RGCC
sensitivities as MAPLE:sensitive_to_drug edges on her patient node. Any foundation
exported with --include-source maple_patient therefore trains on the RGCC data we
then validate against. The reported Tier-1 and Tier-2 numbers are not a clean
holdout. Tracked as GH #214.
Quantified 2026-09-27. The de-facto foundation’s training split held 74 of 135 RGCC edges and 62 medication edges; §5.3 has what that did to the v2 numbers. The export also splits PrimeKG’s mirror pairs apart: 60.6% of that foundation’s test triples have their reverse in train, which inflates every PrimeKG foundation MRR (GH #432).
The design of record is: train on her orthogonal biology — genetics, expression, PRS,
variants — hold RGCC out entirely, and trust the ranking only if it recovers her
measured sensitivities. The fix is roughly one export flag. (2026-09-27: it is not one
flag. The overlay branch applies no predicate filter, and every downstream handler
re-exports and re-adds the overlay (GH #432, #433). The patient query also has to
change: a foundation trained without these edges cannot score MAPLE:sensitive_to_drug
at all.)
6. Validation doctrine
There is no ground truth for “which drug will work for Maureen.” There are proxies, and their quality determines what can be claimed.
6.1 The three tiers
RGCC gives 224 quantitative drug-sensitivity measurements on her own circulating tumor cells — 112 distinct drugs across two draws. This is the colorectal analogue of the papers’ Alzheimer’s case study, but stronger, because it is patient-specific and continuous rather than population-level and binary.
Three properties of this label set govern what can be claimed from it, all established 2026-09-24 (GH #317):
- Two grading schemes, one column. 59 of the 112 per report are graded on a percentage scale; the other 53 (MoAb, SMW) come off a binary “No sensitivity / Sensitivity” chart encoded as 0. They are real negatives, but a Spearman over all 112 carries 53 pairs tied at zero. Report Tier-1 both ways — all-panel and graded-only.
- The two draws are not replicates. All-panel test-retest is ρ = +0.9616 (n = 112); graded-only is ρ = +0.7635 (n = 59, mean |Δ| 14.5 points). The panel is globally stable, but 12 drugs move ≥25 points and they move as two coherent classes — four taxanes down (Abraxane 75→15, Paclitaxel 75→22, Docetaxel 70→20, Cabazitaxel 70→14) and eight anthracycline / topoisomerase-II agents up (Doxorubicin 24→79, Etoposide 22→71, Epirubicin 20→67, …). RGCC says so itself: its page-1 summary lists “Partial sensitivity: taxanes” in February and “inhibitors of topoisomerase I, inhibitors of topoisomerase II” in September, with taxanes dropped. That straddles the Aug 2025 recurrence and the BREAKWATER start.
- Therefore: never pool the draws. Averaging sends both classes to mid-range
and erases the only real longitudinal signal in the set while leaving the other
100 drugs almost unchanged.
compute_metrics_crc.pynow evaluates per timepoint and prints the test-retest figures on every run.
- Tier 1 — Spearman ρ between model score and % cell death. Works on any checkpoint, no fine-tuning. Most permissive test.
- Tier 2 — AUROC/AUPR with >80% cell death as positives, <35% as negatives. Direct analogue of KG-Predict’s AD case study.
- Tier 3 — leave-one-out personalization. Hold out one responsive drug, fine-tune on the rest, check whether the held-out drug climbs. Only feasible on PDR2, where fine-tuning is cheap.
Tiers 1 and 2 validate the base ranker. Tier 3 validates whether personalization adds anything, and is only worth running once the base ranker shows nonzero correlation.
6.2 What must be disclosed every time RGCC is cited
- In vitro circulating tumor cells at fixed drug concentrations, not in vivo response.
- Prodrugs such as capecitabine will underperform relative to their active metabolite.
- Two time points, which must be reported separately rather than averaged.
- Non-uniform panel coverage.
- Correlation is supportive, never conclusive.
- Single agents only, so it cannot see her working regimen. Encorafenib and binimetinib are not on the panel. The BRAF/MEK inhibitors it does test (dabrafenib, vemurafenib, trametinib) score 0 on both draws, and cetuximab scores 10 → 15. Yet her ctDNA fell from 20.74 to 0.15 MTM/mL between the 2025-10-01 and 2025-10-27 draws, after the combination began. In colorectal cancer, BRAF inhibition works only when EGFR feedback is also blocked (Prahallad 2012). So a ranker that correctly puts BRAF/MEK/EGFR agents high is penalized by RGCC; flag or exclude them in Tier-1/Tier-2. (Added 2026-09-28.)
- RGCC’s own outcome study. Guadagni et al., BMC Cancer 2022, co-authored by RGCC: 36 refractory CRC patients treated with RGCC-selected drugs. PPV 47%, specificity 5%, overall accuracy 47%. The design is selection-biased, but it is the only outcome validation the assay has. (Added 2026-09-28.)
6.3 Other validation surfaces
- Cross-KG agreement. A candidate scoring high on both GP-KG and PrimeKG is more trustworthy than one scoring high on either.
- Her medication history. The models should rank drugs she was actually
prescribed and responded to above random. 14 response episodes are labeled.
(⚠ 2026-09-27: circular on every foundation trained so far. All 14 episodes are
“beneficial”, every drug involved is a
tried_drugtarget, and 7 of the 8 had a patient→drug edge in the training split. The surface is usable only on a foundation exported without the medication predicates, and even then, with no negative episodes, it tests rank-above-random only.) - Literature review of top candidates. What the PDR2 paper did. Weakest form, but it is the last gate before anything goes to a clinician.
CV MRR is a poor proxy for any of this. Training-time metrics do not predict patient-specific generalization. Validate against RGCC directly.
One more warning: never trust an upstream evaluation function without auditing what
it computes. PDR2’s own validate() reported MRR ≈ 0.99 because of a
relation-aware filter bug. Use eval_maple.py full-ranking evaluation for any
cross-method comparison.
7. Rules
These were paid for. Several cost real data; two produced wrong clinical claims.
7.1 Clinical truth
- Trace every patient fact to her data. A driver that “sounds typical” for
colorectal cancer (KRAS, TP53) is exactly the failure mode. Cross-check
mods_list_alterationsand followalteration.document_idto the source report. - Trial status comes from the ClinicalTrials.gov v2 API, never from press
releases, sponsor sites, or news coverage. Read
overallStatusandwhyStopped. A wrong trial status can send Maureen and her oncologist chasing a dead program. - VAF across specimens is not a trajectory. Variant allele fraction scales with tumor purity and copy number. Every variant rising together across her two Caris reports is the signature of a purity shift, not three clonal expansions. Use serial plasma ctDNA for trajectory.
7.2 Data integrity (hard rules, from CLAUDE.md)
- Never collapse rows that look like duplicates but carry distinct semantics. A
(subject, object, source)triple appearing with twosource_predicatevalues is the source asserting two different things. A prior migration silently deleted 15,045 rows this way and lost the drug-metabolism distinction from the canonical graph. - Never decide an ontology or vocabulary mapping that is not crystal clear.
Propose the mapping as a table with the judgment calls flagged, get approval, then
commit.
biolink:related_tois the giving-up predicate. - Any new edge must preserve
source_predicate. - Register every schema change in
backend/migrations.py. Never ship a standalone.sqlfile. Pick the next migration number against all branches, not just HEAD.
7.3 Operating discipline
- Long jobs go through the worker queue, never raw
gcloud, so they are visible in the Training Cockpit. - Assume multi-step jobs fail on the first try. Build them batched and resumable up front, commit per item, and measure progress in the costly unit (bytes, rows), not item count.
- Do not edit
docs/PDR_PIPELINE_PLAN.md, its checklists, or the run catalog without being asked. Report results and wait. - Repository documents are the source of truth. Open the doc; do not infer from its title or a commit message.
- Verify before defending. When Richard pushes back, that is context you lack. Dump the actual data or open the actual file first, then concede or push back with evidence. He does not want a yes-AI.
7.4 Scope
- Mobile is maintained, not extended. New work needs no mobile view.
- Issues live in GitHub, not in markdown and not in memory. Memory is for durable lessons; lifecycle state belongs in issues.
- Richard handles the ethical and contractual calls. Surface a technical risk once, then defer.
8. The open frontier
Ordered by expected value to Maureen, not by how interesting the work is.
The executable sequence (2026-09-27). The issues that block the first end-to-end run
carry the critical-path label, paired with p0. Their order, the decisions to fix
first and the acceptance checks are in GH #439 and docs/mods_smoke_run_1_playbook.md.
That run is a machinery test; items 2–4 below become its science follow-up.
Metro is a priority lane (Richard, 2026-10-05, D-Q4-04, GH #612). The Metro Map is the only Maple feature Maureen has asked about or researched. A useful Metro is the fastest way to get her using the system, and her use is the only user feedback this project will get.
- Do as much with it as data and architecture allow.
- Look for ways to bring new work into it, and its ideas into other surfaces.
- Treat the metabolic hypotheses as research beside PDR, not a detour from it. The repurposing machinery can also be pointed at combinations of metabolic changes (diet, drugs or other), not only at single prescription drugs.
The lane is GH #595; the plan is docs/q4_2026_roadmap.md §4.5.
Tier 1 — directly on the critical path to G1
- Normalize and release her polygenic risk scores. PRS Gates D and F — the
computation is done. This unblocks the disease half of the personalization loss, which
has never seen a nonzero value. As of 2026-09-26, 3,752 scores are computed and
quarantined against the v4 callset (E2), the reference FASTA and the HGDP+1kGP panel
are both staged, and D1/D2/D3 are built (2026-09-27). What remains is running D1 → the
palindrome decision → E3 → D2 → ancestry PCs → D3 → F release. (2026-09-28: done for the v0 set: E3, D1, D2, D3 against EUR and a v0 Gate F release ran for smoke run #1. The palindrome decision, the final policy and ancestry PCs remain for the full release.) The last hop to the model is already
wired:
build_pdr2_input_pickle.pyreads the normalized field (z_score, elsepercentile) and refuses raw sums unless explicitly opted in (GH #297), so Gate D’s output has somewhere to go the moment it exists. - Fix the edge-blind criterion (Phase 12, GH #47). Learn a signed per-relation
strength so that
sensitive_topushes up andcontraindicationpushes down. No foundation retrain needed; each candidate is a fast criterion fine-tune. This is the most likely single cause of the null personalization result. (Implementation is GH #420; #47 was closed when the design doc was written. The released loss is also closed-form, ŵ → −PRS/‖PRS‖, so the fine-tune needs an outcome signal too.) - Clean the RGCC leak (GH #214). Export a foundation without the
MAPLE:*_to_drugedges, keeping her biology edges, then score all ~112 RGCC drugs as a genuine holdout. Until this is done, no validation number is defensible. (2026-09-27: GH #432, #433. The smoke run scores a disease query, because the patient relation disappears with the edges.) - Actually run the personalized ranking and look at it (GH #114). Launch the fine-tune on her profile, render the ranked drug list, annotate the top 30. This is G1. It has been blocked behind infrastructure for months.
- Order tumor-informed ctDNA (Signatera). Not a code task. It is the gating test for every MRD trial and it resolves the NED eligibility gap in §2.5. The Natera tissue pathway already exists from her Altera profiling. (⚠ 2026-09-28: already happening. It has run monthly since January 2025 (§2.6). The actions are to parse it (item 12) and to fetch the reports after March 2026 (GH #512). A more sensitive whole-genome assay built from the August 2025 block would be an optional add-on, likely self-pay, e.g. Personalis NeXT Personal.)
Tier 2 — high value, larger scope
- Variant-aware personalization (Phase 8.5). Her patient-to-variant edges are still gene-level, so BRAF V600E is indistinguishable from wild-type BRAF in the graph. The resolver fix is specified: HGNC to transcript, construct qualified HGVS, resolve to a ClinGen CAID, link. 71% of her variants resolved in the spike.
- Temporal modeling (Phase 13). The model sees CA 19-9 = 18 today, not that it halved over nine months. No published precedent exists in this lineage; this is genuine research. Tier 1 trajectory features are cheap and could ship anytime.
- Expand the expression channel from the 84-gene report panel to the full 59,960-gene transcriptome now sitting in the database. Note that rebuilding the feature schema against it is a schema-version change.
- Population-supervised training. Add cell lines, PDX models and public cohorts
(GDSC, CCLE, DepMap, TCGA, GENIE) as proxy patients so the model learns from
thousands of (subject, drug, outcome) triples rather than one. Design doc exists at
docs/population_supervised_outcome_planning.md.
Tier 3 — infrastructure that unblocks the above
- RTX-KG2 is 7% ingested; either finish it or stop treating it as a source (GH #85).
- Close or asterisk the Phase 0 Alzheimer’s gap.
- Parse the nine Signatera reports (GH #131). (⚠ 2026-09-28: 21 documents, 20 timepoints; see §2.6.)
- Ingest the melanoma Caris report (GH #213).
9. What “done” looks like
| Level | Done means |
|---|---|
| G4 | Any candidate on the list can be walked back to the edges, the model, the checkpoint and the source data that produced it, by someone who was not there. |
| G3 | Personalized and non-personalized rankings on the same checkpoint differ measurably in her favor: Tier-1 ρ improves by ≥0.05, or Tier-2 AUROC by ≥0.03. |
| G2 | On a clean holdout with RGCC excluded from training, the ranking still recovers her measured sensitivities at Tier-1 and Tier-2. |
| G1 | A ranked list of candidates exists, each with mechanism, evidence level, her own supporting data, interaction and contraindication flags, and an access path — trial, off-label, or compassionate use. Short enough that a physician will read all of it. |
| G0 | Not ours to declare. |
10. Orientation kit
10.1 Answer “what is true right now” here, not from this document
If you are reading this on the public site, you cannot reach any of the sources below. Every one of them — the MCP tools, the database tables, the REST endpoints, the issue tracker, the memory store — is private. That is not a reason to fall back on the numbers in this document as though they were live; it is a reason to quote them as of the
last-verifieddate at the top of the page, and to say that is what you are doing.What the public site does carry, in preference to any figure quoted elsewhere: §5 and §8 below for what has been built and what remains, the PRS primer’s gate table for where that pipeline actually stands, and the pipeline plan for where operational state lives. A manifest of the whole published corpus, with a
last-verifieddate per page, is at/llms.txt.Two corrections worth carrying, because both have propagated before: the patient has no KRAS mutation (§2.4), and every patient-specific correlation figure predating 2026-09-24 was computed on pooled ex vivo draws and awaits restatement (§5.3). Pages carrying those figures flag them inline.
| Question | Source |
|---|---|
| What should I work on? | GitHub issues labelled critical-path (tracking issue #439, docs/mods_smoke_run_1_playbook.md). The pdr_status task list is deprecated as of 2026-09-28; its in-flight runs and recent decisions are still current. |
| Open work items | gh issue list — labels are type + area + priority; auto means fix-now |
| Training run history | mods_research_run + mods_run_metric; GET /api/mods/research/runs |
| Decisions and learnings | pdr_note_search MCP tool (vector search) or docs/PDR_NOTES.md |
| KG state | mods_kg_canonical_stats, mods_kg_list_sources, mods_kg_list_compositions |
| Which sources are trustworthy | Memory project_kg_source_completeness; check status before trusting coverage |
| Her clinical facts | mods_get_patient, mods_list_alterations, mods_list_genomic_reports, mods_get_drug_sensitivity, mods_get_expression_profile |
| PRS state | mods_prs_status, mods_prs_manifest_stats |
10.2 Documents worth reading, in this order
CLAUDE.md— repository conventions and the hard rules. Non-optional.- This file.
- `PDR_PIPELINE_PLAN.md` — 80-line navigation kernel; tells you where state lives.
- `paan_planning.md` — the strategic architecture argument, including the supervision primer and the population-tapestry direction.
- `pdr_phase0_gpkg_writeup.md` — the canonical writeup format, and the first real reproduction.
- `pdr_personalization_writeup.md` — PDR1 vs PDR2 mechanism reference.
- `pdr2_alt_loss_ab_writeup.md` — why the paper-text loss is destructive.
- `KG_CATALOG.md` — every knowledge graph identified, with published baselines.
docs/essays/intro_the_project.md— the lay-audience framing, as of April 2026.docs/Project Post for Substack.txt— Richard’s own account. Read it for the why.
Full index: memory file docs_catalog.md.
10.3 Working environment
- Windows 11, PowerShell primary, Bash available. Docker Desktop runs the local stack.
- Port map: 5432 legacy Docker DB, 5433 production Cloud SQL proxy, 5434 local non-production test DB.
backend/data/is host-only and gitignored. Never commit it.- Long jobs run on workers, Vertex AI, or Colab, never in the foreground.
- Richard pays Cloud SQL egress by the byte. Design for one-time pulls and shared caches, not per-task streaming.
11. Glossary
| Term | Meaning |
|---|---|
| MODS | Maureen Oncologic Decision Support — the oncology component of Maple |
| PDR / PDR1 / PDR2 | Precision Drug Repurposing, the 2025 and 2026 papers this replicates |
| GP-KG | Genotypic-Phenotypic Knowledge Graph (KG-Predict, Case Western). Paper comparator |
| PrimeKG | Precision Medicine Knowledge Graph (Zitnik Lab, Harvard). Production graph |
| RGCC | Greek lab providing ex vivo chemosensitivity testing on circulating tumor cells |
| CTC | Circulating tumor cell |
| MSS / MSI | Microsatellite stable / instable. Maureen is MSS, which historically predicts immunotherapy failure |
| TMB | Tumor mutational burden. Hers is low (2–3 mut/Mb) |
| PRS / PGS | Polygenic risk score; PGS Catalog is the public repository of scoring files. Full arc: [[prs/prs_primer |
| KGIA | The patient feature schema for PDR2 fine-tuning: N diseases × M genes. Data QC: [[results/KGIA_PATIENT_PROFILE_QC |
| Track A / Track B | Zero-PRS (all runs to date) vs real-PRS (computed at E2; first released 2026-09-28 as smoke_v0, 590 scores over 109 diseases) |
| Composition | A named, versioned recipe of KG sources and filters that a run points at |
| PaaN | Patient-as-a-Node — the architecture where the patient is a first-class KG entity. Argued in [[planning/paan_planning |
| NED | No evidence of disease |
| MRD | Minimal residual disease |
| BOT/BAL | Botensilimab + balstilimab, the leading immunotherapy option for her phenotype |
| Breakwater | The trial that established FOLFOX + cetuximab + encorafenib for BRAF V600E mCRC |
12. Provenance
Assembled 2026-09-07 from: the MODS memory store, CLAUDE.md, docs/PDR_PIPELINE_PLAN.md,
docs/paan_planning.md, docs/pdr_framework_gap_analysis.md, docs/KG_CATALOG.md,
docs/temporal_patient_modeling_planning.md, docs/maureen_clinical_journal_archive.md,
docs/essays/intro_the_project.md, docs/Project Post for Substack.txt, the PDR2
writeups, live queries against the production database via the MODS MCP tools, the
GitHub issue backlog, and the mods_research_run catalog.
Clinical facts were verified against mods_get_patient, mods_list_alterations,
mods_list_genomic_reports and mods_list_functional_tests rather than taken from
memory, per §7.1.
Numbers current as of 2026-09-07. Re-verify via §10.1 before relying on any of them.