#!/usr/bin/env bash # Phase 5 stabilization health snapshot for CUST-WP-0054-T05. # Usage: phase5-stabilization-check.sh set -euo pipefail API_BASE="${API_BASE:-http://127.0.0.1:8000}" KUBECONFIG_RAILIANCE="${KUBECONFIG_RAILIANCE:-$HOME/.kube/config-hosteurope}" KUBECONFIG_COULOMB="${KUBECONFIG_COULOMB:-$HOME/.kube/config}" echo "=== State Hub API (${API_BASE}) ===" curl -fsS "${API_BASE}/state/health" | python3 -m json.tool python3 -c " import json, urllib.request s = json.load(urllib.request.urlopen('${API_BASE}/state/summary')) t = s['totals'] print('totals: workstreams', t['workstreams']['total'], 'tasks', t['tasks']['total'], 'topics', t['topics']['total']) " echo echo "=== railiance01 state-hub + CNPG ===" KUBECONFIG="${KUBECONFIG_RAILIANCE}" kubectl -n state-hub get pods -l app.kubernetes.io/name=state-hub 2>/dev/null \ | awk 'NR==1 || /state-hub-/ {print}' KUBECONFIG="${KUBECONFIG_RAILIANCE}" kubectl -n databases get cluster state-hub-db \ -o jsonpath='phase={.status.phase} ready={.status.readyInstances}/{.spec.instances}{"\n"}' 2>/dev/null echo echo "=== coulombcore rollback copy ===" KUBECONFIG="${KUBECONFIG_COULOMB}" kubectl -n state-hub get deploy state-hub \ -o jsonpath='replicas={.spec.replicas}{"\n"}' 2>/dev/null || echo "coulombcore unreachable" echo echo "=== activity-core STATE_HUB_URL ===" KUBECONFIG="${KUBECONFIG_RAILIANCE}" kubectl -n activity-core get configmap actcore-runtime-config \ -o jsonpath='{.data.STATE_HUB_URL}{"\n"}' 2>/dev/null KUBECONFIG="${KUBECONFIG_RAILIANCE}" kubectl -n activity-core get deploy actcore-state-hub-bridge \ -o jsonpath='bridge_replicas={.spec.replicas}{"\n"}' 2>/dev/null echo echo "=== last 6 consistency sweeps ===" curl -fsS "${API_BASE}/progress/?event_type=consistency_sweep_remote_all&limit=6" | python3 -c " import json,sys for e in json.load(sys.stdin): d=e.get('detail') or {} print(e['created_at'][:19], 'src='+str(d.get('source','?')), 'exit='+str(d.get('exit_code')), 'err='+str(d.get('automation_error')), 'proc='+str(len(d.get('repos_processed') or [])), 'missing='+str(len(d.get('skipped_missing') or []))) " echo echo "=== last daily_triage ===" curl -fsS "${API_BASE}/progress/?event_type=daily_triage&limit=1" | python3 -c " import json,sys ev=json.load(sys.stdin) print(ev[0]['created_at'][:19] if ev else 'none', (ev[0].get('summary') or '')[:60] if ev else '') " 2>/dev/null || echo "no daily_triage events" echo echo "=== ops-bridge primary tunnel ===" bridge status 2>/dev/null | grep -E 'state-hub-primary|issue-core-coulombcore' || echo "bridge status unavailable"