Calibrated negative result · the naive selective-suppressor atlas doesn't survive matched-arm stats

Find the knockdowns that switch off allergy without switching on inflammation.

A one-page spec and playable primer. Start at the top knowing nothing about T cells; leave able to defend a genuinely novel finding to the people who built the dataset.

The one line: From the Marson genome-scale CD4⁺ T-cell Perturb-seq atlas, surface gene knockdowns that selectively collapse the Th2 program (↓ IL4/IL5/IL13/GATA3) without pushing cells into Th1 (↑ IFNG/TBX21) — each with a data-grounded mechanism and the single cheapest experiment that would confirm it.
Dataset ~22M cells · 4 donors · CRISPRi Result calibrated negative — GATA3 is a Th1-skewer Tool Claude Science Th2 disease asthma · eczema Method streams a 16.8 GB matrix, no download Personal I live with asthma + alopecia Prize hook Gladstone “overcome disease”
●

What we found — live results

Independent re-analysis of the full genome-scale atlas — and an honest reversal.

Pipeline built ✓ Hardening + triage ✓ Verification → reversal ✓

⚑ Outcome: a calibrated negative result

The naive selective-suppressor atlas does not survive rigorous statistics. Under a clean matched Th1-vs-Th0 arm, the apparent "top selective hit" GATA3 is actually a Th1-skewer — its knockdown induces the Th1 program (≈ +2.8 SD), textbook reciprocity, not selective suppression. STAT6, IL4R, and even ARNT flag the same way. The earlier positive shortlist rode a noisy Th1 signature plus a magnitude-confounded scoring metric. What is real: the reproducible streaming pipeline, the QC catch below, and the negative result itself.

Th1-skewer
GATA3 — the apparent top hit — induces Th1 under a matched arm
≈ +2.8 SD
FDR ≈ 1
the "selective" set is not enriched over random gene sets
permutation null
artifact
the +0.49 arm "confound" was mostly a scoring artifact
+0.54 → +0.18 competitive
2.5 MB
the one real win: a QC catch fixed a silent gene-scramble — no 16.8 GB download
kept

◆ A QC guardrail caught a silent gene-label scramble

The arm scores turned out to be in a different row order than the annotation table (only 0.9% overlap) — attaching them naively mislabeled every gene, so the "top suppressors" came out as biological nonsense. A targeted 2.5 MB read of the atlas's row index (instead of the 16.8 GB matrix) recovered the true order. After the fix, the top hits are a clean cluster of chromatin/transcription regulators and GATA3 lands at #6 — the calibration that says the whole ranking can be trusted.

⚠ Finding: Th2 master regulators do not phenocopy each other

Knocking down GATA3 vs STAT6 vs IL4R produces nearly orthogonal transcriptomes (GATA3–STAT6 correlation ≈ −0.1). They're all "Th2 regulators" but act through distinct routes — so you can't validate a novel regulator just by transcriptome-similarity to GATA3. That tempered our confidence in one signal (coherence) and is itself a clean methodological result.

The shortlist that looked promising — and why it didn't hold

Under the naive two-arm scoring these ranked highest (validity × novelty × druggability). Kept here for transparency: none survive the matched-arm + permutation tests — most are global-effect / housekeeping false positives, and the E3/ubiquitin theme, while a tidy story, is not statistically enriched. This is what a plausible-but-wrong shortlist looks like.

GeneTh2↓ zEvidenceNoveltyDruggabilityWhy it stands out
AMBRA1 ← top−2.74QC✓ · donor-robust · coherent (z2.6)novelE3-adaptorstrong on every axis; Cullin-4 E3 substrate-receptor
UBA6−2.72QC✓ · coherent (z4.0 — top)novelubiquitin E1strongest coherence in the set; E3/ubiquitin theme
ARNT−3.24QC✓ · donor-robust · stability 1.0moderateTF (hard)selective across every threshold — rock-solid, but hard to drug
DPP4−2.12QC✓novelapproved-target classDPP4 / CD26 — the gliptin drug class; on T cells
RAB21−2.53QC✓ · donor-robust · coherent (z2.3)moderate—dual evidence: arm + phenocopy
KDM4C−2.21QC✓noveldruggable epigenetichistone demethylase — small-molecule tractable
SAP130−2.70QC✓ · coherent (z2.0)novel—Sin3A corepressor; dual evidence
P2RY8 · STK38≈−2.1QC✓novelGPCR · kinaseclassic druggable classes

Full ranked table lives in triage_ranked.csv. "Coherent" = its knockdown reshapes the transcriptome like GATA3/STAT6 — rare (only 10/172).

The mechanism layer — worked example: AMBRA1

Illustrative, not a claim. AMBRA1 was the least-bad candidate (modest Th2-down, Th1 roughly flat) but does not clear the hardened bar. It's kept to show the mechanism-card format — data + literature → a hypothesis with every claim tagged observed known speculative, plus the cheapest experiment to test it. The point of this layer is that it forces the speculative leap into the open — which is exactly why the honest verdict is "test, don't trust."

Mechanism card

Why does knocking down AMBRA1 suppress Th2?

Hypothesis: AMBRA1 sustains the Th2 program through its PP2A-regulatory role (PP2A promotes Th2); knocking it down reduces PP2A-dependent Th2 support, collapsing IL4/5/13 without engaging Th1. AMBRA1 is also the substrate receptor of a CRL4 E3 ligase that degrades cyclin D — a secondary, cell-cycle route.

ClaimTagConf.Source
AMBRA1-KD selectively suppresses Th2 (Th2↓, Th1 flat)observed0.85our data
AMBRA1-KD reshapes the transcriptome like GATA3-KDobserved0.65coherence z2.6
AMBRA1 is the CRL4 E3-ligase receptor for cyclin Dknown0.95Nature 2021
AMBRA1 regulates CD4 differentiation via PP2Aknown0.70Sci Rep 2024
PP2A promotes Th2 differentiationknown0.60PP2A lit
∴ AMBRA1 → PP2A → Th2 (so loss ↓ Th2)speculative0.40inferred — test this
Cheapest discriminating experiment: intracellular cyclin D + GATA3 co-stain after AMBRA1-KD. Cyclin D ↑ with GATA3 ↓ → the cell-cycle route; GATA3 ↓ with cyclin D flat → the PP2A route. ~1 week, existing antibodies. Falsification flag: AMBRA1's best-evidenced role is cyclin-D / cell-cycle, not direct Th2 — so the PP2A link is the speculative leap to nail down.

What actually holds up

• The reproducible streaming pipeline — reads a 16.8 GB matrix over HTTP byte-ranges, no download. • The QC catch — a silent arm-to-annotation gene-scramble, fixed with a 2.5 MB read. • The calibrated negative result itself — Th1/Th2 are genuinely reciprocal, so single-gene "selective" suppression is rare and this screen + metric can't establish it. • Before any target claim: a functional IL-4/5/13 readout and a control-guide FDR — not more transcriptomic scoring.

01

The biology, from zero

Four ideas. That's the whole ladder you need to climb before the project makes sense.

1 · A CD4⁺ T cell is a conductor. It doesn't kill anything itself. When its receptor senses a threat, it commits to a role — and each role is defined by one master transcription factor (a gene that switches on a whole program) plus the signalling proteins (cytokines) it then secretes. Click a role to see what it does. Th2 is ours.

Interactive

The four fates of a helper T cell

2 · Th2 is the allergy program — and a proven drug target. Th2 cells drive asthma, eczema and allergic inflammation through IL-4, IL-5 and IL-13. The blockbuster drug dupilumab works by blocking exactly this signalling. So “a ranked list of genes whose removal quiets Th2” reads directly as “candidate targets for allergic disease.” That's the sentence that wins the Gladstone “overcome disease” award.

3 · Perturb-seq = break one gene per cell, then read the whole cell. You use CRISPR to silence a different gene in each of millions of cells, then sequence every cell's full set of active genes (its transcriptome). Each cell carries a barcode saying which gene was silenced. Aggregate the cells that share a target and you learn: “what does the cell's program do when gene X is gone?”

How the data is made

One experiment, millions of single-gene knockdowns

01

Pool

Millions of identical CD4⁺ T cells in one dish.

02

Silence

A virus drops one CRISPRi guide per cell — silencing one gene + leaving a barcode.

03

Stimulate

Activate the cells; sample at Rest, 8 h, 48 h.

04

Read

Sequence each cell → a cell×gene count matrix + its guide label.

05

Aggregate

Pool cells per guide → the average effect of losing that gene.

4 · Two catches that make this real work, not a lookup. First, this dataset's cells are only stimulated, never chemically forced into Th2 — so “the Th2 program” is a signature score you compute from marker genes, not a cell type you can see. Second, CRISPRi silencing is partial and only works for roughly 40–50% of targeted genes — so “no effect” is ambiguous until you check the knockdown actually happened. Both catches are where careful engineering beats naive analysis.

02

Why the obvious project is already dead

The most important slide. The people judging you wrote the paper last month.

⚠ The atlas already exists — and the judges shipped it

The natural idea — “a genome-wide, confidence-ranked atlas of Th2 regulators across stimulation states, split into known vs novel” — is literally a published table from the Marson paper: polarization_prediction_…_coefficients.csv (Fig 4). It's already ranked, already condition-split, already known/novel-flagged, already validated on held-out genes. Gladstone/Marson are on the judging panel. Handing them a re-run of their own figure is the worst outcome.

The meta-lesson generalizes: this dataset was published weeks ago by your judges, so any vanilla analysis is a novelty trap. The only way to win is to find the axis, the control, or the mechanism they didn't chase. Below is the cleanest one that exists.

03

The wedge: their axis can't tell two things apart

Their model scores Th2-vs-Th1 as one number. Play with the toggle to see what that number hides.

The paper ranks regulators along a single bidirectional Th2-vs-Th1 axis. But “suppress Th2” and “flip the cell to Th1” are different biological events with the same score. For an allergy drug you want the first (quiet the allergy) and not the second (don't trade allergy for inflammation). A one-dimensional axis structurally cannot separate them. This plot can.

Interactive · the core idea

The Th2 × Th1 selectivity plane

synthetic values — teaches the method
Selective Th2 suppressor — the finding Flips to Th1 — a trap Known Th2 regulator — calibration Nonspecific / weak

◆ Confirmed on real data (Haltavey's run)

Scoring every perturbation on the two arms: the selective quadrant is real — 172 knockdowns push Th2 down while Th1 stays flat, and true Th1-skewers are rare (~4). The surprise: the two arms are positively correlated (r ≈ +0.49) — the dominant axis across the screen is global response magnitude (cells broadly dampened), not polarization.

That's what makes the Th1 arm a two-sided internal control: “Th1 not down” removes the global-dampening artifacts (the real dominant confound), “Th1 not up” removes the skewers. One 2-D decomposition was meant to isolate Th2-specific suppression — but see the Results section: under a clean matched Th1-vs-Th0 arm it doesn't survive. The 2-D framing is a good idea this particular data + metric can't support.

◆

Why this one is personal

You live on both ends of this exact axis — which is precisely why selectivity is the whole game, not a footnote.

Th2 pole · turn DOWN

Asthma

allergic · IL-4 / IL-5 / IL-13

A textbook Th2-driven disease — the very program this project hunts to switch off. A selective Th2 suppressor is, almost by definition, a candidate asthma target. The drug dupilumab (which blocks IL-4/IL-13 signalling) already proves that quieting this axis treats allergic disease.

↓ the target
the see-saw
Th1 pole · must NOT trip

Alopecia areata

autoimmune · IFN-γ / Th1-type

Autoimmune hair loss driven largely by IFN-γ / Th1-type immunity — which is why JAK inhibitors (baricitinib, ritlecitinib) treat it. It sits on the opposite pole. A careless Th2 suppressor that shoves cells toward Th1 is exactly the direction you'd fear here.

↑ the guardrail

Your two conditions are the two ends of the see-saw this project has to balance. Asthma is the program we turn down; Th1-driven autoimmunity like alopecia is the direction we must not tip into. “Quiet the allergy without inflaming the other side” isn't an abstract constraint — it's your own immune system. You aren't just building the tool; you're the patient it's for.

Reality check, kept honest: this is target discovery, likely years from any therapy — and alopecia's biology is dominantly Th1/CD8, so here it's more the guardrail than the direct target. But asthma is a direct fit, and painstaking target-discovery exactly like this is how drugs such as dupilumab began.

04

Turn the knobs, watch the finding fall out

Every slider is a real quality gate from the dataset. This is the analysis, made tangible.

A credible candidate has to clear four gates at once: the knockdown truly happened, the Th2 effect is strong, the Th1 effect is near zero (selectivity), and it reproduces across the four donors. Drag the knobs — genes sort live into rejected, known (your calibration that the pipeline works), and novel (the actual finding).

Interactive · the pipeline as knobs

Candidate filter

synthetic values — teaches the method
How hard the knockdown must push the Th2 program down.
The wedge. Low = reject anything that flips cells toward Th1.
signif_knockdown — did CRISPRi actually silence the gene?
Consistent across all 4 donors, not one lucky replicate.
Rejected0
Known · calibration0
Novel · the finding0

The known column is your built-in proof: if the pipeline reliably recovers established regulators like GATA3 STAT6 IL4R, the novel column earns trust. That recall number is your whole evaluation — most hackathon demos have none.

05

How you actually build it in Claude Science

Claude Science = an AI workbench with a live Python kernel and reproducible artifacts. You drive it; it runs scanpy and shows its work.

P0

Load & orient · today

Pull only the pseudobulk + DE-stats objects (skip the 22M-cell raw matrix). Ask Claude Science to summarize the perturbations, conditions and donors.

pseudobulk.h5adDE_stats.h5ad
P1

Knockdown-QC gate

Keep only perturbations that truly silenced their target. This alone removes ~half the genome and is where naive analyses quietly break.

guide_kd_efficiency.suppl_table.csv → signif_knockdownontarget_significant
P2

Two scores, not one

Build separate Th2-up and Th1-up signatures (from the published DE signature + marker sets). Score every perturbation × condition, per donor. This is the step that breaks the paper's single axis into two.

Th2_Th1_polarization_signature_…csv
P3

Selectivity + specificity filter

Rank by (Th2 ↓ × donor reproducibility) with (Th1 ≈ 0). Kill nonspecific hits using the built-in activation-signature control, the K562 cross-cell-type control, and the core-essential gene list.

activation signature (neg-control)K562_comparison.csvcore_essentials_hart.tsv
P4

Mechanism + experiment · your edge

For each surviving novel hit, build the mechanism strongest-evidence-first: the data's own co-perturbation structure (which knockdowns phenocopy this one) as the primary signal, a directed GRN for wiring, and Krogan's PPI only as corroboration. The agent assembles an evidence ledger — every claim tagged known / speculative / observed-in-our-data with a citation — runs a falsification pass, and proposes the single cheapest experiment that discriminates between competing mechanisms.

co-perturbation graphdirected GRNKrogan PPI (corroboration)discriminating-experiment optimizer
P5

Evaluate & ship

Report recall of the known-regulator list (calibration), the shortlist of selective novel suppressors (the finding), and hand it in as one reproducible Claude Science notebook.

th1_th2_known_regulators.yaml → recall@k
06

Who does what

Max team size is 2. This split is the pitch to Haltavey — complementary, not overlapping.

You

agents · systems · rigor
  • The QC + selectivity + target-triage scoring (real vs false positive)
  • Co-perturbation-coherence + donor-reproducibility hardening of the 172
  • The mechanism-card layer (co-perturbation → ledger → experiment)
  • The discriminating-experiment optimizer
  • The reproducible Claude Science pipeline + write-up

Haltavey

T-cell immunology · published on E3 ligases in Th2
  • Already ran the validating two-arm analysis (172 hits, r +0.49)
  • Defining & validating the Th2 / Th1 signatures
  • Judging which novel hits are plausible and druggable
  • E3-ligase / target-class expertise (a Nat Comms paper on it)
  • Framing the disease story; keeping the science honest
07

Honest risk ledger

What could sink this, and the mitigation for each. Naming them is half the defense.

highOverlap with the paper

Their bidirectional axis already ranks Th2/Th1 regulators. Mitigation: never present an atlas — present the decoupled selective subset their axis conflates, with a diff against their published CSV.

highGlobal dampening — the confirmed dominant confound

Real data shows the arms correlate r ≈ +0.49: the biggest signal is cells getting broadly dampened, which drags the Th2 score down artifactually. Mitigation (now built in): the Th1 arm as a two-sided control kills it — “Th1 not down” removes dampeners — plus core-essential + knockdown-QC gates.

medNovel hits have no literature to lean on

Most hits aren't classic Th2 genes (expected for a genome-scale screen) — but novelty removes external corroboration. Mitigation: novel hits held to a higher internal-evidence bar — co-perturbation coherence with GATA3/STAT6 + donor reproducibility carry the proof. See §11③.

medFailed knockdowns pollute the ranking

CRISPRi silences only ~40–50% of targets. Mitigation: hard signif_knockdown gate before any ranking (Phase 1).

medTh2 signal is weak at Rest

The program barely exists in unstimulated cells, so “context-dependence” can be an artifact of the program only turning on when stimulated. Mitigation: interpret Rest vs Stim carefully; anchor claims in the 8 h / 48 h conditions.

medMechanism layer hallucinates

The agent could invent a plausible-sounding path. Mitigation: every edge checked against a structured source, tagged known vs speculative, with a citation — the ledger is the defense.

highPPI path-tracing is easy to undercut

GATA3 is a hub — a short PPI path to it exists from almost any gene (study-bias artifact), and PPI edges are undirected + ~80% incomplete. Mitigation: co-perturbation structure is primary evidence; PPI is corroboration only, used via propagation not shortest-path. See §08.

08

Does this already exist? — the lasting wedge

Checked against the 2026 literature. The full loop isn't built — but every piece is, so the novelty has to be surgical.

◆ Two genuinely-open pieces — bet the project on these

1 · The cheapest discriminating experiment. Everyone else (BioDiscoveryAgent, PerTurboAgent, Robin) proposes batches to maximize discovery — the opposite goal. Nobody optimizes the one minimal-cost experiment that separates two competing mechanisms.

2 · The “observed-in-our-data” tag. Fusing the literature/DB evidence ledger with your own Perturb-seq observation as a first-class known / speculative / observed label. Existing ledgers (INDRA) carry belief scores but no such tag.

Everything else is built — INDRA (typed-claim ledger + signed causal path-finding), POPPER (falsification), PaperQA2 / ContraCrow (literature + contradiction), GeneAgent (claim-checking). So compose these, don't rebuild them, and don't pitch “an agent that generates hypotheses” — informed judges read that as plumbing. Honest note: the “evidence-ledger + typed epistemic claims” idea is already published — in chemistry (npj AI 2026) — so frame it as porting a proven pattern to Perturb-seq biology, not inventing it.

⚠ Competitive risk to name out loud

Stanford's SNAP/Zou lab (BioDiscoveryAgent, Biomni, POPPER, GEARS) and the Gyori lab (INDRA, EMMAA) each already own most of the parts and could ship this in a sprint. Your defensibility is the specific framing — Perturb-seq hit → cheapest discriminating experiment, with an observed-in-data ledger — not the underlying tech.

durable refs · Cowen 2017 (network propagation) · Replogle 2022 (co-perturbation recovers complexes, r=0.61) · Norman 2019 (epistasis) · BEELINE (GRN benchmark) · CausalBench (graph inference ≯ baselines) · Ahlmann-Eltze 2025 (deep ≯ linear) · Nat Rev Genet 2026 review · INDRA · POPPER
09

Do now — the message to Haltavey

Paste-ready. Signals you did the homework without overselling the biology.

Yeah I really like the Th2 direction — spent a while digging through the paper + their analysis repo before replying to sanity-check it. One thing that jumped out: they already publish a confidence-ranked atlas of Th2/Th1 regulators across Rest/8hr/48hr (a coefficients table in their supplement, basically Fig 4). So a straight "genome-wide Th2 atlas" risks looking like a re-run of their own figure, which feels a bit sketchy given Gladstone/Marson are judging 😅 But there might be a real crack in it: their Th2-vs-Th1 score is a single bidirectional axis, so it can't separate "this knockdown *selectively* suppresses Th2" from "this one just flips the cell toward Th1." Those feel pretty different biologically? (correct me — you'd know way better.) For something like allergy you'd want the first and specifically *not* the second. So the angle I'm into is hunting **selective Th2 suppressors** — knockdowns that drop the Th2 markers without pushing the Th1 ones up. I'm way more confident on the engineering/pipeline side than the biology, so I'd lean on you a lot and might be framing bits clumsily. Rough split: I own the pipeline, the QC + selectivity metric, and a mechanism/experiment layer; you drive the Th2 biology and gut-check which hits are actually plausible. Keeping your known/novel bucket idea too — it's a clean built-in calibration. Does that resonate?Optional personal line to add: “honestly a bit personal too — I've got asthma + alopecia, so ‘calm the allergy side without inflaming the other’ is something I actually care about.”
10

Run first — the Phase 0–1 starter

The one check that de-risks everything: do selective Th2 suppressors actually exist in the data? Paste into Claude Science's kernel; adapt names after inspecting.

selective_th2.py · Claude Science / scanpy
# ============================================================
#  Phase 0-1 starter · selective Th2-suppressor discovery
#  Marson genome-scale CD4+ T-cell Perturb-seq  (CZI VCP)
#  Paste into Claude Science's kernel; adapt names after inspecting.
# ============================================================
import scanpy as sc, pandas as pd, numpy as np, yaml
import matplotlib.pyplot as plt
BASE = "data/"          # your download path

# ---- STEP 0 · get the data (once, in a terminal) -----------
#  aws s3 ls --no-sign-request s3://genome-scale-tcell-perturb-seq/marson2025_data/
#  need: DE_stats.h5ad, guide_kd_efficiency.suppl_table.csv,
#        Th2_Th1_polarization_signature_DE_results_full.suppl_table.csv,
#        th1_th2_known_regulators.yaml, core_essentials_hart.tsv

# ---- STEP 1 · load DE stats (one row per perturbation x condition)
de = sc.read_h5ad(BASE + "GWCD4i.DE_stats.h5ad")
print(de); print(de.obs.columns.tolist())     # INSPECT — names below may differ
#  .X (or a layer) = per-gene DE z-score for that perturbation

# ---- STEP 2 · build the DECOUPLED Th2 and Th1 gene sets -----
sig = pd.read_csv(BASE + "Th2_Th1_polarization_signature_DE_results_full.suppl_table.csv")
sig = sig.dropna(subset=["zscore"])            # +zscore = Th2-associated, - = Th1-associated
present = set(de.var_names); TOPN = 50
th2_genes = [g for g in sig.sort_values("zscore", ascending=False)["gene"] if g in present][:TOPN]
th1_genes = [g for g in sig.sort_values("zscore", ascending=True )["gene"] if g in present][:TOPN]

# ---- STEP 3 · score every perturbation on BOTH programs -----
#  effect = mean DE z-score across the program's genes.
#  th2_effect < 0  =>  the knockdown SUPPRESSES Th2 (what we want)
th2 = de[:, th2_genes].to_df().mean(axis=1)
th1 = de[:, th1_genes].to_df().mean(axis=1)
res = de.obs.copy(); res["th2_effect"] = th2.values; res["th1_effect"] = th1.values

# ---- STEP 4 · quality gates (drop untrustworthy rows) -------
ess = set(pd.read_csv(BASE + "core_essentials_hart.tsv", sep="\t", header=None)[0])
res = res[res["ontarget_significant"] == True]     # the knockdown had a real effect
res = res[res["offtarget_flag"] == False]          # no off-target contamination
res = res[~res["target"].isin(ess)]                # not core-essential (viability)
#  also require signif_knockdown by merging guide_kd_efficiency on target+condition

# ---- STEP 5 · the SELECTIVITY metric (the wedge) -----------
MIN_SUPPRESSION, MAX_TH1 = 0.40, 0.25
res["selective"] = (res.th2_effect <= -MIN_SUPPRESSION) & (res.th1_effect.abs() <= MAX_TH1)
res["score"] = (-res.th2_effect) - res.th1_effect.abs()      # reward Th2 down, punish Th1 move

# ---- STEP 6 · known (calibration) vs novel (the finding) ---
known = set(yaml.safe_load(open(BASE + "th1_th2_known_regulators.yaml"))["th2"])
sel = res[res.selective].sort_values("score", ascending=False)
sel["bucket"] = np.where(sel["target"].isin(known), "known", "novel")
recall = sel[sel.bucket == "known"]["target"].nunique() / len(known)
print(f"selective hits: {len(sel)}  |  known regulators recovered: {recall:.0%}")
print(sel[["target","culture_condition","th2_effect","th1_effect","bucket"]].head(30))

# ---- STEP 7 · the real selectivity plane (the payoff) ------
plt.scatter(res.th1_effect, res.th2_effect, s=6, alpha=.3)
plt.axhline(-MIN_SUPPRESSION, ls="--"); plt.axvline(0)
plt.xlabel("Th1 effect"); plt.ylabel("Th2 effect  (down = suppressed)")
#  >>> is the bottom-centre zone populated (selective suppressors exist),
#      or is it all a diagonal (Th2-down coupled to Th1-up)?  Either is a result.
The payoff is STEP 7: if the bottom-centre zone is populated, selective suppressors exist — that's your finding. If everything falls on a diagonal (Th2-down always drags Th1 up), the finding flips to “Th2 suppression is intrinsically coupled to Th1 gain in CD4 T cells.” Both are real, defensible results — which is how you know the question is well-posed.
11

Build-ready — the two novel pieces

The parts that make this defensible rather than plumbing. Everything else you compose from INDRA / POPPER / PaperQA2.

① The mechanism card + evidence ledger

mechanism_card.json · one per hit
{
  "hit": { "gene": "C-114", "condition": "Stim48hr",
           "th2_effect": -0.79, "th1_effect": 0.03,
           "kd_efficiency": 0.74, "donor_reproducibility": 0.85,
           "known_regulator": false },
  "hypothesis": "C-114 sustains GATA3 induction; its knockdown collapses
                 IL4/IL5/IL13 without engaging the Th1 / T-bet axis.",
  "claims": [
    { "id": 1, "statement": "C-114 knockdown phenocopies GATA3 knockdown",
      "evidence": "co-perturbation r=0.71 vs the GATA3 signature",
      "source": "DE_stats.h5ad (this study)", "confidence": 0.90,
      "tag": "observed" },                 # <- the novel piece #2
    { "id": 2, "statement": "C-114 co-occurs with NuRD subunits (CHD4/MTA2)",
      "evidence": "physical complex membership",
      "source": "CORUM:123 / Krogan map", "confidence": 0.60,
      "tag": "known" },
    { "id": 3, "statement": "C-114 directly represses the IL4 locus",
      "evidence": "none found",
      "source": null, "confidence": 0.25,
      "tag": "speculative" }               # <- what the experiment must test
  ],
  "counter_evidence": [
    { "claim_id": 2, "statement": "NuRD reported GATA3-independent in Tregs",
      "source": "PMID:XXXXXXXX" }                # from the falsification pass
  ],
  "discriminating_experiment": "GATA3-OE rescue after C-114 knockdown",
  "overall_confidence": 0.62
}

② The cheapest-discriminating-experiment optimizer

Given a hit with two competing mechanisms, score every feasible assay by how differently the two hypotheses predict its readout, per unit cost — return the winner. Nobody else does this; everyone else proposes batches to maximize discovery.

discriminate.py · pseudocode
# two competing mechanistic hypotheses for one hit
H1 = "acts through GATA3"       # predicts: GATA3 protein down; rescue restores IL4/5/13
H2 = "acts parallel to GATA3"   # predicts: GATA3 protein flat; rescue does nothing

best = None
for e in ASSAY_LIBRARY:                     # each assay e has a cost and a readout
    p1 = predict_readout(e, H1)             # distribution H1 expects
    p2 = predict_readout(e, H2)             # distribution H2 expects
    discrimination = divergence(p1, p2)     # how differently they predict e
    score = discrimination / e.cost         # cheap AND separating
    best = keep_max(best, e, score)

return best   # the single cheapest experiment that splits H1 from H2

Worked example — the hit's competing hypotheses H1 “acts through GATA3” vs H2 “acts parallel to GATA3”:

AssayCostReads outSplits H1 / H2?
GATA3-overexpression rescue after KD ← winnermedare IL4/5/13 restored?strongly — H1 yes, H2 no
GATA3 intracellular stain after KDlowGATA3 protein levelyes — H1 ↓, H2 flat
X × GATA3 double perturbationhighepistasis / pathway orderyes, but costly
ChIP / ATAC at the IL4 locushighdirect bindingpartial
IL4/IL5/IL13 secretomelowprogram outputno — both predict ↓

The optimizer picks the GATA3 stain or OE-rescue (high discrimination ÷ low–med cost), not the expensive double-perturbation and not the secretome (which can't tell the hypotheses apart). That per-hit choice is the crown jewel.

③ Target triage — real vs false positive · Haltavey's ask

Score every candidate on two independent axes — don't fold “is it real?” and “is it exciting?” into one number. Fast triage over all 172 before the deep mechanism cards.

FeatureAxisCatches / means
signif_knockdown = Truevalidity gatefailed knockdowns
not core-essential · offtarget = Falsevalidity gateviability & off-target FPs
Th2 effect size · Th1-flatnessvalidityweak hits · skewers · dampeners
donor reproducibility (4 donors)validitynoise / one-donor flukes
co-perturbation coherence vs GATA3/STAT6/IL4R ← keyvalidityrandom dampener vs real Th2-module member — needs no literature
Th2 literature prior (low = novel)noveltythe finding vs the textbook
druggable class (E3 ligase / kinase / receptor)druggabilitytranslational value — E3s are gold

Shortlist = high validity ∩ (novel + druggable), with novel hits held to a higher validity bar. Co-perturbation coherence is the strongest real-vs-false discriminator — interventional, internal, and literature-free, exactly what a novel hit requires. An E3-ligase hit clears the druggability axis outright.