Files
the-custodian/tools/phase5-stabilization-check.sh
codex 104c66763e docs(CUST-WP-0054-T05): open Phase 5 stabilization window
Record kickoff baseline checks, 72h monitoring gates, and a reusable
phase5-stabilization-check.sh script for daily health snapshots.
2026-07-06 19:41:42 +02:00

60 lines
2.6 KiB
Bash
Executable File

#!/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"