Effort: thorough
The whats-changed weekly dashboard (q-synth-whats-changed)
shows week-over-week deltas, but a researcher asking "how has
the AD therapeutic landscape shifted in the last 12 months?"
gets nothing. Build a per-field longitudinal dashboard
plotting Elo distribution, citation accumulation, market
liquidity, and hypothesis-count trends over rolling 90/180/365-day
windows for any registered field.
The data exists — price_history, judge_elo historical rows,
papers.published_date, markets.created_at — but no surface
joins them on a per-field basis over time.
field-time-series-<field-slug>,register_dashboard. Eager seedingscripts/seed_field_time_series_dashboards.py for the sameq-edu-intro-to-field.
since: timestamp query param defaulting to NOW() -
INTERVAL '365 days':elo_distribution_over_time — for hypotheses taggedjudge_elo ratings.citation_accumulation — monthly count of paperspaper_entities /papers.tags).market_liquidity_over_time — monthly sum ofliquidity_usd across markets tagged to the field.hypothesis_count_growth — cumulative count oflost_traction line (count of hyps whosetop_movers_per_quarter — top-5 hypotheses by Elorender.template = new field_time_series.html with:q-live-market-liquidity-heatmapq-synth-whats-changed sparkline JS.
cache_ttl_seconds=3600. Snapshot ledger viascidex-field-time-series-monthly.timer on the 1st of eachGET /field-trends/{field-slug} route renders the dashboard/intro/{field-slug} and from thewhats-changed top-movers section.
dashboard_engine.py ALLOWED_TABLES and confirmprice_history, papers, markets, hypotheses,knowledge_edges are accessible.
date_trunc('month', ts) for monthly bucketing intags array (orentity_links join) — confirm via the existingq-live-ad-therapeutic-landscape query patterns.
POST /api/dashboard/{id}/snapshot.
since param via the existing dashboard parameterization.e352460b-2d76 — view_spec_json DSL.q-edu-intro-to-field — supplies the field registry.q-synth-whats-changed — sparkline component reuse.Delivered:
scidex/senate/dashboard_engine.py — Added field_time_series.html template_TEMPLATES. Template includes 4 SVG charts (line for score p10/p50/p90,DASHBOARD_PARAMS and calls the existing refreshDashboard().scripts/seed_field_time_series_dashboards.py — Seeds 27 dashboards acrossapi.py — Added GET /field-trends/{field_slug} route that looks upfield-time-series-{slug}, passes field_slug and optional since runtimerender_dashboard_page. Added "Field Trends" link to/science/{field_slug} dashboard grid.tests/test_field_time_series_dashboard.py — 10 tests: seeds 12 months ofsince param filters correctly. All 10 pass.Schema adaptation: The spec assumed tags arrays and a judge_elo table,
neither of which exist. Implemented field filtering via
hypotheses.disease ILIKE '%field_slug%', score distribution from price_history,
and market liquidity via markets.liquidity (not liquidity_usd).
Not yet implemented: scidex-field-time-series-monthly.timer systemd unit
(snapshot ledger) — requires infrastructure access outside this task scope.