[Atlas] Per-disease landing page synthesizes all artifacts (auto-updating) open

← Atlas
Live per-disease landing page joining hypotheses+debates+questions+markets+notebooks+citations+bounties+proposals.

Completion Notes

Released by supervisor slot 62 because credential acquisition failed after pre-claim. Reason: worktree_creation_failed:branch_held_by_other:held_by=/tmp/wt-d00d502f

Last Error

acquire_fail:worktree_creation_failed:branch_held_by_other:held_by=/tmp/wt-d00d502f

Git Commits (1)

[Atlas] Per-disease landing page synthesizing all artifacts [task:d00d502f-8d97-4ab3-bb77-d50f81ba4dc6]2026-04-27
Spec File

Effort: thorough

Goal

Today a researcher who lands on /disease/alzheimers is bounced through a
301 to a wiki page (see api.py:61436) that shows static prose. SciDEX
actually has, for each disease, hundreds of artifacts spread across every
layer — top hypotheses, debates, open questions, prediction markets,
notebooks, citations, challenges, funding flows. None of this is surfaced
in one place. Build a real per-disease landing page that pulls EVERY
artifact type linked to the disease and renders a synthesized
"state of the field" view, auto-refreshing as new artifacts arrive.

This is the canonical demonstration of the artifact-unification spine
(wave-1 Q-DSC/Q-OPENQ/Q-LIVE/Q-PROP/Q-PERC) paying off: cross-layer
synthesis no human or single agent can produce by hand.

Acceptance Criteria

☐ New route GET /disease-landing/{slug} in api.py. The legacy
/disease/{name} 301 redirect (api.py:61436) is updated so any
disease wiki page that has an entity_id pointing at a known
neurodegenerative disease ALSO gets a "View live landing page"
banner linking to /disease-landing/{slug}.
☐ Backed by a new dashboard artifact registered via
register_dashboard (scidex/atlas/artifact_registry.py:2318)
with slug pattern disease-landing-<slug>. One artifact per
disease — registered eagerly for the top-20 ND diseases by a
one-shot script scripts/seed_disease_landing_dashboards.py,
lazily on first hit otherwise.
☐ view_spec_json contains 9 data_sources, all safe-query-validated
against scidex/senate/dashboard_engine.py:_validate_query:
1. top_hypotheseshypotheses joined to hypothesis_entities
(or entity_links) on disease entity_id, ordered by
composite_score DESC, top 10.
2. open_debatesdebate_sessions joined to those hypothesis
ids, status not in (closed, archived), most recent 10.
3. unanswered_questions — Q-OPENQ artifacts (artifact_type =
open_question) tagged with the disease, ranked by score, top 10.
4. live_marketsmarkets joined on the hypothesis ids, status
= active, ordered by liquidity_usd DESC, top 10.
5. recent_notebooksartifacts WHERE artifact_type IN
('notebook','analysis','figure','dataset')
linked via
artifact_links, last 30 days.
6. key_citations — top 10 papers by citation_count whose
mesh_terms or wiki_entities link includes the disease.
7. funding_flowschallenges (Q-CW bounties) for the disease,
total dollars on the table.
8. recent_proposals — Q-PROP proposed_artifact rows from
eb6ff576-9d5 continuous-proposal pipeline tagged with
disease, last 14 days.
9. whats_changed — count of every artifact type from #1-8
created in the last 7 days vs. the prior 7 days, for a
"momentum" header strip.
render.template = new disease_landing.html added to
dashboard_engine._TEMPLATES. Layout:
- Hero strip: disease name, top mechanisms, momentum strip
(rising/falling arrows for each artifact-type count).
- Three-column "What we know / What we're debating / What we don't
know" grid mapping #1 / #2+#4 / #3+#5.
- Bottom row: funding flows, recent notebooks (with thumbnails),
key papers.
cache_ttl_seconds=600; manual refresh via existing
/api/dashboard/{id}/refresh.
☐ Pytest tests/test_disease_landing.py seeds 1 disease + 3 hyps +
2 debates + 4 questions + 1 market + 2 notebooks + 1 paper +
1 challenge and asserts each panel renders the correct counts.
☐ Human walkthrough: visit /disease-landing/alzheimers-disease and
/disease-landing/parkinsons-disease against production DB and
verify ≥1 row in every panel (or an explicit empty-state block
with a "no debates yet — be the first" CTA pointing at
/agora/new).

Approach

  • Read the disease wiki redirect at api.py:61436 to know the slug
  • convention (diseases-<name>).
  • Audit which entity-link table the codebase uses to tie artifacts to
  • diseases (likely entity_links, wiki_entities, or
    canonical_entity_links — see
    scidex/atlas/canonical_entity_links.py). One join per data_source
    will cover almost all of #1-7.
  • Reuse the _pc() ILIKE-escape helper landed for
  • q-live-ad-therapeutic-landscape (work log notes the bug it fixed).
  • The momentum strip is a single CTE with WHERE created_at >
  • NOW() - INTERVAL '14 days' and a CASE WHEN created_at >
    NOW() - INTERVAL '7 days'
    bucketing — keep all math in SQL so
    render stays stateless.
  • Add new template; mirror style of landscape_heatmap.html for visual
  • consistency.

    Dependencies

    • e352460b-2d76 — view_spec_json DSL (done)
    • Wave-1 Q-OPENQ — supplies open-question source
    • Wave-1 Q-PROP — supplies proposed-artifact source
    • 41620b88-115d — seed-dashboard pattern (done)

    Work Log

    Sibling Tasks in Quest (Atlas) ↗