{"status":"degraded","updated_at":"2026-10-19T00:54:58.775Z","phase":"C","source":"quantdb-api","host":"oc-quant-dev-prod","groups":{"live":{"status":"ok","checks_ok":7,"checks_warning":0,"checks_critical":0,"checks_unknown":0},"adtv":{"status":"critical","checks_ok":1,"checks_warning":3,"checks_critical":2,"checks_unknown":0},"runtime":{"status":"unknown","checks_ok":5,"checks_warning":0,"checks_critical":0,"checks_unknown":1}},"checks":[{"id":"P-1M-AGE","group":"live","name":"Live 1m bar age","status":"ok","severity":"ok","message":"1m closed-bar lag 60s (wall_age 176s)","value":60,"unit":"seconds","thresholds":{"warn_sec":120,"crit_sec":300},"details":{"max_ts":"2026-10-19T00:52:00.000Z","wall_age_sec":176,"closed_lag_sec":60,"always_on":true},"alert_policy":"page","duration_ms":97},{"id":"P-COV-15M","group":"live","name":"Live 1m coverage (15m)","status":"ok","severity":"ok","message":"2498/2500 instruments in last 15m (99.92%)","value":2498,"unit":"instruments","thresholds":{"expected":2500,"warn_ratio":0.95,"crit_ratio":0.9},"details":{"coverage_ratio":0.9992},"alert_policy":"page","duration_ms":7},{"id":"N-OHLC","group":"live","name":"Impossible OHLC","status":"ok","severity":"ok","message":"0/19984 impossible OHLC rows (0.000%) last 10m","value":0,"unit":"bad_rows","thresholds":{"window_min":10,"sample_limit":50000,"bad_warn":1,"bad_crit":10,"ratio_warn":0.001,"ratio_crit":0.01},"details":{"sampled":19984,"bad_rows":0,"bad_ratio":0,"high_lt_low":0,"negative":0,"null_ohlc":0,"range_break":0,"note":"Single-tick o=h=l=c is normal for this feed; only geometry/null/negative fails"},"alert_policy":"page","duration_ms":519},{"id":"N-FLAT","group":"live","name":"Sustained flatline OHLC","status":"ok","severity":"ok","message":"1959/2498 instruments fully flat (≥5 bars, same close, o=h=l=c) last 20m (78.4%)","value":1959,"unit":"instruments","thresholds":{"window_min":20,"min_bars":5,"ratio_warn":0.9,"ratio_crit":0.98,"count_warn":500,"count_crit":1500},"details":{"instruments":2498,"eligible":2498,"flatline_instruments":1959,"flat_ratio":0.7842,"avg_bars_eligible":18,"note":"Requires multi-bar same close + single-tick geometry; ignores one-bar o=h=l=c"},"alert_policy":"page","duration_ms":304},{"id":"N-RATE","group":"live","name":"Bar write rate (10m band)","status":"ok","severity":"ok","message":"bars_last_10m=19984 vs baseline≈24980/window (ratio=0.80, instr=2498)","value":19984,"unit":"bars","thresholds":{"window_min":10,"baseline_min":50,"ratio_warn":0.4,"ratio_crit":0.1,"abs_crit":50},"details":{"bars_cur":19984,"bars_baseline_total":124900,"expected_per_window":24980,"rate_ratio":0.8,"instruments_cur":2498,"note":"Catches ~0 writes while historical baseline was healthy; pairs with R-FEED"},"alert_policy":"page","duration_ms":357},{"id":"N-COV-DROP","group":"live","name":"Coverage drop vs baseline","status":"ok","severity":"ok","message":"cov_last_10m=2498 vs baseline≈2498 (ratio=1.00)","value":2498,"unit":"instruments","thresholds":{"window_min":10,"drop_warn":0.85,"drop_crit":0.7,"baseline_min_abs":100},"details":{"cov_cur":2498,"cov_prev1":2498,"cov_prev2":2498,"cov_prev3":2498,"baseline":2498,"drop_ratio":1,"note":"Relative drop detector; absolute coverage remains P-COV-15M"},"alert_policy":"page","duration_ms":316},{"id":"N-GAP","group":"live","name":"Sample minute gaps","status":"ok","severity":"ok","message":"0/30 sampled instruments have gap>12m (max_gap=1m) last 60m","value":0,"unit":"instruments","thresholds":{"sample":30,"window_min":60,"max_ok_gap_min":12,"instr_warn":5,"instr_crit":15},"details":{"sampled_instruments":30,"instruments_with_big_gap":0,"total_big_gaps":0,"avg_max_gap_min":1,"max_gap_min":1,"note":"Feed batches ~2–3m; gap threshold is above normal batch spacing"},"alert_policy":"page","duration_ms":1347},{"id":"A-STALE","group":"adtv","name":"ADTV freshness","status":"warning","severity":"warning","message":"ADTV stale_days=3, coverage_20d=0.8439","value":3,"unit":"days","thresholds":{"max_stale_days_ok":2,"max_stale_days_warning":5,"min_coverage_ratio_ok":0.8,"min_coverage_ratio_warning":0.5},"details":{"latest_data_as_of":"2026-10-16","coverage_ratio_20d":0.8439,"adtv_20d_coverage":2286,"active_stock_etf_instruments":2709,"billing_blocked":true},"alert_policy":"ticket_ack_only","duration_ms":6},{"id":"A-COV-20D","group":"adtv","name":"ADTV 20d coverage","status":"ok","severity":"ok","message":"coverage_ratio_20d=0.8439","value":0.8439,"thresholds":{"min_ok":0.8,"min_warn":0.5},"alert_policy":"ticket_ack_only","duration_ms":6},{"id":"A-MCAP","group":"adtv","name":"Market cap coverage","status":"warning","severity":"warning","message":"market_cap_coverage_ratio=0.4166","value":0.4166,"thresholds":{"min_ok":0.5,"min_warn":0.3},"details":{"market_cap_coverage":714},"alert_policy":"ticket_ack_only","duration_ms":6},{"id":"A-JOB","group":"adtv","name":"ADTV refresh job watermark","status":"critical","severity":"critical","message":"refresh_adtv watermark row missing","alert_policy":"ticket_ack_only","duration_ms":1},{"id":"A-CRON","group":"adtv","name":"ADTV refresh schedule present","status":"critical","severity":"critical","message":"ADTV refresh schedule missing (no timer/cron marker)","value":false,"details":{"timer_marker":"/home/quantdev/ops/dq/timers/adtv-preflight.installed","cron_marker":"/home/quantdev/ops/dq/timers/adtv-preflight.cron","cron_line":null},"alert_policy":"ticket_ack_only","duration_ms":0},{"id":"W-MCAP","group":"adtv","name":"Market cap refresh watermark","status":"warning","severity":"warning","message":"refresh_market_cap watermark missing","alert_policy":"ticket_ack_only","duration_ms":1},{"id":"R-API","group":"runtime","name":"API dependencies","status":"ok","severity":"ok","message":"db=connected redis=connected","details":{"database":true,"redis":true},"alert_policy":"page","duration_ms":1},{"id":"R-FEED","group":"runtime","name":"Price feed health/ready","status":"ok","severity":"ok","message":"price-feed ok/ready (direct-write; downstream not reported)","value":57,"unit":"seconds","details":{"health_http":200,"ready_http":200,"lastPoll":"2026-10-19T00:53:58.878Z","lastPollAgeSec":57,"instrumentCount":2498,"candlesPerMinute":2998,"totalCandlesWritten":82181702,"pollErrors":0,"downstream":{},"downstreamReported":false,"mode":"direct-write"},"alert_policy":"page","duration_ms":1},{"id":"R-OUTBOX-LAG","group":"runtime","name":"Outbox lag","status":"ok","severity":"ok","message":"outbox pending=0","value":0,"thresholds":{"pending_warn":1000,"pending_crit":5000,"oldest_warn_sec":60,"oldest_crit_sec":300},"details":{"outbox":{},"failed":0,"oldestPendingSeconds":null},"alert_policy":"page","duration_ms":1},{"id":"R-DISK","group":"runtime","name":"Disk usage /","status":"ok","severity":"ok","message":"root disk 20% used","value":20,"unit":"percent","thresholds":{"warn_pct":70,"crit_pct":85},"alert_policy":"page","duration_ms":4},{"id":"R-OUTBOX-SIZE","group":"runtime","name":"Outbox relation size","status":"unknown","severity":"unknown","message":"outbox size probe failed","alert_policy":"page","error":"relation \"price_feed.outbox_events\" does not exist","duration_ms":0},{"id":"W-FEED-DURABLE","group":"runtime","name":"Feed durable write watermark","status":"ok","severity":"ok","message":"live 1m write age 176s","value":176,"unit":"seconds","thresholds":{"warn_sec":180,"crit_sec":600},"details":{"source":"price_history_1m","lastSuccessfulDurableWrite":"2026-10-19T00:52:00.000Z","live_max_ts":"2026-10-19T00:52:00.000Z","live_age_sec":176,"watermark_age_sec":null,"watermark_last_success":null,"candlesPerMinute":2998,"totalCandlesWritten":82181702},"alert_policy":"page","duration_ms":6}],"acks":[],"alerts":[{"level":"P3","check_id":"A-STALE","message":"ADTV stale_days=3, coverage_20d=0.8439","page":false,"alert_policy":"ticket_ack_only"},{"level":"P3","check_id":"A-MCAP","message":"market_cap_coverage_ratio=0.4166","page":false,"alert_policy":"ticket_ack_only"},{"level":"P2","check_id":"A-JOB","message":"refresh_adtv watermark row missing","page":false,"alert_policy":"ticket_ack_only"},{"level":"P2","check_id":"A-CRON","message":"ADTV refresh schedule missing (no timer/cron marker)","page":false,"alert_policy":"ticket_ack_only"},{"level":"P3","check_id":"W-MCAP","message":"refresh_market_cap watermark missing","page":false,"alert_policy":"ticket_ack_only"}],"contracts":{"registry_path":"/home/quantdev/ops/dq/contracts","checks_documented":19,"phase_b_checks":["A-JOB","A-CRON","R-OUTBOX-SIZE","W-FEED-DURABLE","W-MCAP"],"phase_c_checks":["N-OHLC","N-FLAT","N-RATE","N-COV-DROP","N-GAP"]},"meta":{"collector_ms":2845,"snapshot_path":"/home/quantdev/ops/dq/last.json","price_feed_url":"http://127.0.0.1:3063","expected_live_instruments":2500,"notes":["Phase C: anomaly layer N-OHLC/N-FLAT/N-RATE/N-COV-DROP/N-GAP on live 1m price_history","Phase B: contracts registry + watermarks + ADTV preflight timer + outbox size","Live price checks always-on (not session-gated)","ADTV critical = ticket_ack_only (no page spam while billing blocked)","ADTV refresh default PREFLIGHT_ONLY (no spend) until ADTV_ALLOW_SPEND=1","Outbox retention is dry-run/alert-first; no mass DELETE without explicit confirm","Anomaly paging: N-OHLC/N-RATE/N-COV-DROP critical pages; N-FLAT/N-GAP warning-first","Alert delivery stub writes /home/quant/ops/dq/alert-hook.jsonl; WA webhook TODO"]}}