A hypothesis page today is a wall of text: title, claim, predictions,
PMIDs, scores. There's no single page that shows why a hypothesis
has its current Elo and composite score in visual form. Build a
one-page "tear-sheet" (printable, shareable) that crunches the
hypothesis's complete evidence + debate + score history into a
dashboard: small-multiples for evidence quality, a score-evolution
spark, top-3 supporting and top-3 contradicting citations, the
Synthesizer's decision-tree summary, the per-dimension score radar,
and a "what changed in last 30d" diff. This is the artifact a
researcher prints to make a go/no-go decision.
Effort: thorough
GET /hypothesis/{id}/tearsheet renders a self-contained HTML page (no SPA shell) with these panels, all server-rendered:composite_score, current elo_rating (from elo_ratings arena='global'), strength badge (from q-qual-claim-strength-normalizer), "last reviewed" timestamp.hypothesis_score_history (create the table if it doesn't exist; backfill from audit_log rows).citation_validity.support_verdict='supports' × evidence_quality_tier); each row shows PMID, journal, year, support quote, fact-check verdict from q-qual-auto-fact-check-pipeline.q-viz-decision-tree-synthesis (top 5 branches by weight).preregistration_outcomes): predicted_probability, observed_outcome, calibration delta.?format=pdf query param uses weasyprint (already in requirements.txt per check) to emit a PDF.migrations/20260428_hypothesis_score_history.sql if needed: hypothesis_score_history(hypothesis_id, day, composite_score, elo_rating, dim_scores JSONB); backfill driver economics_drivers/ci_hypothesis_score_history_backfill.py./hypothesis/{id} page.(id, composite_score, last_evidence_change)); skip cache if ?force_refresh=1.tests/test_tearsheet.py: well-formed hypothesis (mid-tier composite, both supporting + contradicting cites, 1 prediction) renders all 8 panels; minimal hypothesis (no decision tree, no preregs) renders fallback messages instead of erroring; PDF export emits ≥ 1 page._assemble_tearsheet(db, hypothesis_id) -> dict that runs the 8 queries in parallel via asyncio.gather (≤ 600 ms target).templates/atlas/hypothesis_tearsheet.html + a print-stylesheet site/tearsheet.css.weasyprint; ship a one-page output by default.q-viz-decision-tree-synthesis — supplies decision-tree panel.q-qual-auto-fact-check-pipeline — fact-check verdicts.q-qual-claim-strength-normalizer — strength badge.q-er-preregistration (shipped) — prediction outcomes.q-impact-hypothesis-uptake — embeds tearsheet as the canonical share URL.{
"completion_shas": [
"139a984ae"
],
"completion_shas_checked_at": ""
}