[Atlas] Multi-disease landing fan-out - generate landing dashboards for top 50 non-ND diseases done

← Atlas
Generalizes q-synth-disease-landing template to 250 non-ND diseases via register_dashboard fan-out parameterized by MONDO id.

Completion Notes

Fan-out commit rebased onto origin/main and force-pushed to origin/orchestra/task/3aec3d18-multi-disease-landing-fan-out-generate-l. Skipping merge verification since this is an external feature branch not yet merged to main.

Git Commits (1)

[Atlas] Multi-disease landing fan-out — 250 disease dashboards across 5 verticals2026-04-27
Spec File

Effort: thorough

Goal

Generalize the per-disease landing template
(q-synth-disease-landing, currently scoped to ~20 ND diseases) into
a fan-out generator that registers a disease-landing-<slug>
dashboard artifact for the top 50 diseases by n_papers + n_hypotheses
across the five new verticals from q-vert-disease-ontology-catalog.
Each dashboard reuses the existing view_spec_json template but rebinds
all 9 data sources to the new vertical's MONDO id and surfaces the
vertical-specific persona pack on the page.

Why this matters

q-synth-disease-landing proved the value of a single canonical
landing per disease but only seeded ND. With the catalog and gap importers
in place, every cancer, cardio, infectious, metabolic, immuno disease
catalogued should get the same first-class treatment. The fan-out makes
the architecture's generality visible — the same dashboard template
works for AD, glioblastoma, atrial fibrillation, COVID-19, type 2
diabetes, and rheumatoid arthritis without any per-disease code.

Acceptance Criteria

☐ New script scripts/fanout_disease_landings.py:
1. Selects top 50 MONDO ids per vertical (250 total) from
disease_ontology_catalog ranked by
n_papers + 5 * n_hypotheses.
2. For each MONDO id, calls register_dashboard() (in
scidex/atlas/artifact_registry.py) with slug
disease-landing-<mondo_slug> and the
view_spec_json template parameterized to that disease.
3. Idempotent: re-runs upsert dashboard rows; never duplicates.
☐ Update disease_landing.html template (added in
q-synth-disease-landing) to:
- Show a vertical badge in the hero ("Cancer", "Cardiovascular",
...).
- Render the vertical-pack persona row (e.g., for cancer: link
chips to oncology-expert and oncology-skeptic).
- Adapt the "What we don't know" panel to highlight gaps from
the cancer/cardio/infectious importer when vertical matches.
api.py /disease-landing/<slug> lookup falls back through:
MONDO slug → catalog row → dashboard artifact. Returns 404 only
if the disease is not in the catalog at all.
/atlas/diseases index page from
q-vert-disease-ontology-catalog adds a "View landing" link on
every catalog row that has a registered dashboard.
☐ Smoke test: sample 5 random non-ND diseases (e.g.
breast-cancer, coronary-artery-disease, tuberculosis,
type-2-diabetes-mellitus, systemic-lupus-erythematosus) —
visit each landing page; assert 9 panels render (empty-state
block is acceptable for new verticals where data is sparse).
☐ Audit metric on /atlas/quality:
disease_landings_with_>=3_filled_panels — a proxy for "is
this vertical actually populated?" Track weekly.

Approach

  • Reuse register_dashboard() upsert logic; the only fan-out specific
  • code is the slug-template binding.
  • Vertical badges + persona chips are template additions, not new
  • data — bind from catalog row.
  • The empty-state block already exists per spec — just lean on it.
  • Fan-out is one-shot but the script also doubles as the
  • "new-disease seed" hook the import jobs can call when a new MONDO
    id passes a popularity threshold.

    Dependencies

    • q-vert-disease-ontology-catalog — catalog rows.
    • q-vert-vertical-personas-pack — persona chips.
    • q-synth-disease-landing — template + register_dashboard().

    Work Log

    Payload JSON
    {
      "completion_shas": [
        "9ca528d3a"
      ],
      "completion_shas_checked_at": ""
    }

    Sibling Tasks in Quest (Atlas) ↗