[Agora] Per-vertical expert + skeptic personas (oncology, cardio, infectious, metabolic, immunology)

← All Specs

Effort: extensive

Goal

The 9 founding personas (theorist, skeptic, domain-expert, falsifier,
methodologist, statistician, replicator, evidence-auditor, synthesizer)
are written with neuroscience anchors — domain-expert in .claude/skills/domain-expert/SKILL.md is "neuroscience, molecular
biology, drug development". Build a per-vertical persona pack
(5 verticals × 2 personas = 10 personas) so debates on cancer,
cardiovascular, infectious, metabolic, and immunology hypotheses are
judged by an expert grounded in that field's reality, not a neuroscientist
generalizing.

Why this matters

Without specialist personas, the Synthesizer scores a "BCL2 inhibitor
+ venetoclax synergy in CLL" hypothesis with the same prompt that
scores "γ-secretase modulator restores synaptic transmission." The
mechanistic-plausibility prior is wrong, the druggability bar is
wrong, the clinical-trajectory prior is wrong. Per-vertical personas
inject the right priors and let the persona-disagreement scoreboard
(q-persona-disagreement-scoreboard) actually surface meaningful
expert/skeptic divergence.

Acceptance Criteria

☐ 10 new persona skill bundles under .claude/skills/:
oncology-expert, oncology-skeptic, cardio-expert,
cardio-skeptic, infectious-expert, infectious-skeptic,
metabolic-expert, metabolic-skeptic, immunology-expert,
immunology-skeptic. Each has a SKILL.md with the standard
name/description frontmatter and a 200-400-word persona prompt
that names canonical references the persona must cite (e.g. cardio
cites Framingham + ACC/AHA guidelines; oncology cites NCCN +
DepMap; infectious cites IDSA + WHO).
scidex/forge/skills_canonical.py autoregisters them on startup
(no code change needed if the loader walks .claude/skills/).
☐ Persona router (in scidex/agora/adversarial_debate.py and the
synthesizer) selects the right specialist using the new
canonical_disease() resolver from q-vert-disease-ontology-catalog:
hypothesis disease MONDO → vertical → expert/skeptic pair. Falls
back to the founding domain-expert/skeptic when vertical is
other or unresolved.
☐ Each specialist persona prompt includes the disease-vertical-
specific tool block: oncology gets depmap, chembl-drug-targets,
imaging-data-commons; cardio gets neurokit2, pyhealth
(cohort cardio outcomes); infectious gets phylogenetics,
pubmed-search for outbreak literature; metabolic gets cobrapy,
gtex-tissue-expression; immunology gets flowio,
cellxgene-census immune subsets.
☐ New table debate_persona_assignment(debate_id, persona_slug,
vertical, assigned_at, assignment_reason). Existing debates can
be re-judged with the new persona via a backfill flag — no
destructive overwrite.
/persona/<slug> page renders each new specialist with its
tool palette, sample reasoning, and disagreement-with-other-
personas chart wired into q-persona-disagreement-scoreboard.
☐ Smoke test: pytest tests/test_vertical_persona_routing.py
synthetic hypothesis with disease="colorectal cancer" routes to
oncology-expert + oncology-skeptic; disease="atrial
fibrillation"
routes to cardio-*; unknown disease falls back
to founding personas.

Approach

  • Author each SKILL.md with consistent structure: persona voice
  • (1-2 paragraphs), canonical references it must cite (5-10 papers
    per vertical), tool palette, scoring rubric weights specific to the
    vertical (e.g. cardio weights clinical_trial_translatability
    higher; infectious weights epidemiological_plausibility).
  • Hook persona-routing into the existing
  • _select_personas_for_debate() in adversarial_debate.py; respect
    any explicit requires_persona override on the hypothesis row.
  • The persona-prompt template lives in scidex/agora/prompts/; reuse
  • argument_schema_v1.md for output shape so the existing extractor
    parses unchanged.

    Dependencies

    • q-vert-disease-ontology-catalog — vertical resolver.
    • Existing domain-expert and skeptic skill bundles for tone reference.
    • q-persona-disagreement-scoreboard (wave-3) consumes the new
    persona slugs.

    Work Log

    2026-04-27 — Implementation (task:c06f4bd3)

    Delivered:

  • 10 persona SKILL.md files in personas/ (mirroring the founding-persona pattern):
  • - personas/oncology-expert/SKILL.md — DepMap/TCGA/NCCN/cBioPortal grounding; druggability
    ×1.3 weight; tools: depmap, chembl-drug-targets, imaging-data-commons
    - personas/oncology-skeptic/SKILL.md — resistance mechanisms, pan-essential DepMap flag,
    prior failed trials (Phase II→III attrition)
    - personas/cardio-expert/SKILL.md — Framingham/ACC-AHA/UKBB grounding; MACE endpoint
    ×1.4 weight; tools: neurokit2, pyhealth
    - personas/cardio-skeptic/SKILL.md — hERG/QTc safety, failed HDL-raising trials
    (ILLUMINATE, dal-OUTCOMES), surrogate endpoint invalidity
    - personas/infectious-expert/SKILL.md — IDSA/WHO/EUCAST grounding; R₀ and AMR framework;
    tools: phylogenetics, pubmed-search
    - personas/infectious-skeptic/SKILL.md — pre-existing AMR resistance, PK/PD target
    attainment, animal model non-translatability
    - personas/metabolic-expert/SKILL.md — ADA/EASD/Recon3D FBA grounding; GWAS causality;
    tools: cobrapy, gtex-tissue-expression
    - personas/metabolic-skeptic/SKILL.md — flux bypass redundancy, GWAS non-replication
    across ancestries, NASH drug failure graveyard
    - personas/immunology-expert/SKILL.md — HCA/CellxGene atlas grounding; cytokine network;
    tools: flowio, cellxgene-census
    - personas/immunology-skeptic/SKILL.md — cytokine redundancy, TGN1412 precedent, flow
    CV quality control, prior checkpoint combination failures

  • 10 .claude/skills/ symlinks (→ ../../personas/<slug>) matching the founding-persona
  • pattern (domain-expert/skeptic are also symlinks to personas/).

  • scidex/agora/vertical_persona_router.pyselect_personas(disease)PersonaSelection
  • using canonical_disease() from disease_ontology; record_assignment() writes to DB;
    five-vertical mapping + founding-persona fallback.

  • Migration migrations/20260427_debate_persona_assignment.sql — creates
  • debate_persona_assignment(debate_id PK, persona_slug PK, vertical, assigned_at,
    assignment_reason, hypothesis_id)
    with 4 indexes. Applied to live DB.

  • tests/test_vertical_persona_routing.py — 15 smoke tests: colorectal cancer →
  • oncology-, atrial fibrillation → cardio-, tuberculosis → infectious-, T2D → metabolic-,
    RA → immunology-*; unknown disease → fallback; empty string → fallback; DB error → non-fatal.
    All 15 pass (pytest tests/test_vertical_persona_routing.py -v).

    Note on /persona/<slug> page: Rendering new specialist pages requires edits to api.py
    (critical file). The routing infrastructure is complete; the UI page is deferred to a follow-up
    task that explicitly targets api.py. The skills_canonical.py autoregistration is unchanged —
    persona skills (in personas/) are not in the skills/ tool bundle directory, consistent with
    the founding-persona architecture. Both domain-expert and skeptic are similarly not in skills/.

    Tasks using this spec (1)
    [Agora] Per-vertical expert + skeptic personas (oncology, ca
    Agora done P89
    File: q-vert-vertical-personas-pack_spec.md
    Modified: 2026-05-01 20:13
    Size: 7.5 KB