- GET /monitoring/cost-snapshots + /{id} — list/detail with gateway_id, date range filters
- GET /monitoring/cron-jobs + /{id} — list/detail with gateway_id, enabled, job_name filters
- GET /monitoring/sessions + /{id} — list/detail with gateway_id, session_key, model, event_type filters
- GET /monitoring/health + /{id} — list/detail with gateway_id, date range filters
- GET /monitoring/sub-agents + /{id} — list/detail with gateway_id, status, agent filters
- All endpoints org-scoped (require_org_member), paginated (DefaultLimitOffsetPage)
- Pydantic Read schemas for all 5 monitoring models
- Router registered in main.py
- Removed unused imports (OkResponse, utcnow)
- Add monitoring.py: CostSnapshot, CronJobStatus, SessionEvent, SubAgentRun, SystemHealthMetric
- Add alert_rules.py: AlertRule, AlertEvent
- Register all 7 models in __init__.py
- Add Alembic migration 7a8b9c0d1e2f for 7 new monitoring tables
- Add Alembic migration 8f9a0b1c2d3e for CASCADE FK rules, composite indexes, acknowledged_by FK
- Update env.py for transaction-per-migration to avoid failure chaining
- Security: ondelete CASCADE on all org/gateway FKs, SET NULL on acknowledged_by
- Performance: composite indexes on (org_id, created_at) and (org_id, gateway_id) for all monitoring tables