Effort: extensive
Scientific consensus does shift — sometimes gradually, sometimes
sharply (the amyloid-cascade reframing, the trem2-microglia turn,
the gut-brain-axis emergence). When consensus moves, SciDEX should
notice and emit a structured Field Shift Report that names the
shift, identifies the hypotheses that moved, summarizes the
triggering evidence, and asks which agent personas were ahead vs.
behind the shift (a calibration signal).
Today, no detector exists. The data is there: composite_score
trajectories per hypothesis, debate verdict flips, market price
swings, paper-citation surges. Compose them into a detector +
report generator that runs weekly.
scidex/senate/field_shift_detector.py:detect_shifts(field_slug: str, lookback_days: int = 60)
-> list[dict] — returns shift candidates each shaped{shift_id, field_slug, kind: 'consensus_change' |
'new_hypothesis_dominance' | 'old_hypothesis_collapse' |
'evidence_reframing', confidence, trigger_artifacts,
movers: [...], summary_md}. Detection thresholds:compose_shift_report(shift_id) -> str LLM-drivenfield_shifts and field_shift_reports withfield_shift_report artifacts viaregister_artifact, discussable under Q-DSC, rankable+calibration_credit written intoagent_personas.calibration_history JSONB.
scidex-field-shifts-weekly.timerGET /field-shifts index lists all detected shiftsGET /field-shifts/{shift_id} renders the full reportq-time-research-front-velocity: anyvelocity_band='red-hot' gets ahypothesis_history_events (q-time-hypothesis-history-summary_md; full report linked.
priority_artifact=true so theywhats-changed dashboard for the weekq-time-hypothesis-history-viewer — supplies persona-stanceq-time-research-front-velocity — triggers off-scheduleq-synth-brief-writer-agent — composer pattern reuse.scidex.senate.calibration — calibration credit storage.migrations/add_field_shift_tables.py creates field_shifts and field_shift_reports tables with proper indexesscidex/senate/field_shift_detector.py with:detect_composite_score_shifts() — detects ≥0.25 score changes in 30 days using hypothesis_score_historydetect_market_reversal_shifts() — detects price reversals against 65-day trend using price_historydetect_debate_verdict_flips() — detects verdict flips after ≥3 consistent verdictsaggregate_shift_candidates() — combines signals with confidence normalizationcompose_shift_report() — LLM-driven 600-word narrative with fallbackrun_weekly_detection() — batch processing for top-N shiftsget_shift_index() / get_shift_report() — DB queries for API layer
GET /api/senate/field-shifts, GET /api/senate/field-shifts/{shift_id}, POST /api/senate/field-shifts/detect in api_routes/senate.pyfield-shift-weekly registered in scheduled_tasks.py with 10080 min (weekly) intervaltests/test_field_shift_detector.py — 11 tests covering aggregation logic, API shape, LLM mocking