Summary
Implement PRP-24 — ForecastOps Control Center (PRPs/PRP-24-forecastops-control-center.md).
Add an operator-facing dashboard that connects ForecastLabAI's isolated Explorer/Visualize pages into one workflow.
Scope
- Backend — new read-only vertical slice
app/features/ops/ with two endpoints:
GET /ops/summary — system health, job-status counts, run/alias health, data freshness, and a "needs attention" list.
GET /ops/retraining-candidates?limit= — a (store, product) queue ranked by a deterministic retraining-priority score.
- Frontend — new
frontend/src/pages/ops.tsx Control Center page wired into the top nav, consuming both endpoints and reusing existing KPICard / StatusBadge / Card / Table components.
Constraints
- No new tables, no Alembic migration, no new external dependency.
- Read-only slice; cross-slice ORM imports of
jobs/registry/data_platform models are an explicit locked decision (mirrors the analytics precedent) — to be called out in the PR description per .claude/rules/product-vision.md.
Acceptance
See PRP-24 Success Criteria and Final Validation Checklist. All five backend gates (ruff, mypy --strict, pyright --strict, pytest) plus the frontend gates must pass.
Summary
Implement PRP-24 — ForecastOps Control Center (
PRPs/PRP-24-forecastops-control-center.md).Add an operator-facing dashboard that connects ForecastLabAI's isolated Explorer/Visualize pages into one workflow.
Scope
app/features/ops/with two endpoints:GET /ops/summary— system health, job-status counts, run/alias health, data freshness, and a "needs attention" list.GET /ops/retraining-candidates?limit=— a(store, product)queue ranked by a deterministic retraining-priority score.frontend/src/pages/ops.tsxControl Center page wired into the top nav, consuming both endpoints and reusing existingKPICard/StatusBadge/Card/Tablecomponents.Constraints
jobs/registry/data_platformmodels are an explicit locked decision (mirrors theanalyticsprecedent) — to be called out in the PR description per.claude/rules/product-vision.md.Acceptance
See PRP-24 Success Criteria and Final Validation Checklist. All five backend gates (ruff, mypy --strict, pyright --strict, pytest) plus the frontend gates must pass.