diff --git a/BUILD_WEEK.md b/BUILD_WEEK.md index bb236dc..c76b0cd 100644 --- a/BUILD_WEEK.md +++ b/BUILD_WEEK.md @@ -49,6 +49,8 @@ Work started during the submission period includes: | Phase 10 | Guarded live k3s detection, chaos, recovery, correlation, and measured evidence | Issue #116 | | Phase 11 | Judge onboarding doctor, single-path setup, and rehearsal diagnostics | Issue #118 | | Phase 12 | Canonical resilience lifecycle and unambiguous evidence provenance | Argus #120 / Sentinel #63 | +| Phase 13 | Persistent Phoenix scenarios, approvals, agent runs, and restart history | Phoenix #73 | +| Phase 14 | Judge-facing read-only platform readiness panel | Argus #122 / Sentinel #65 | | Final video | Two-minute judge story with frame-by-frame screen, action, narration, timing, and fallback plan | Pending | ### Phase 12 — truthful resilience proof timeline diff --git a/README.md b/README.md index 129193f..1dfd893 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,10 @@ claim. | Phoenix | **http://127.0.0.1:5174** | Resilience outcome and recovery | | Sentinel | **http://127.0.0.1:5175** | Unified correlated incident and fleet decision | +Sentinel opens with a read-only **Presentation Preflight** panel. It verifies Argus, +Phoenix, Sentinel, SOG, and OpenAI; Kubernetes-only checks are visibly N/A in portable +mode. The demo refuses to report PASS until every required presentation check is ready. + Every synthetic entity has `demo-data=synthetic`; evidence is explicitly labeled `replayed` or `simulator`. The local demo never claims live Falco detection, live chaos, or measured production availability. On `Ctrl-C`, it stops its local processes and @@ -217,6 +221,8 @@ new replacement pod is Ready, both replicas are Ready, continuous HTTP availabil measured, and Sentinel exposes the correlated Argus + Phoenix incident. `Ctrl-C` stops the consoles and deletes only the isolated demo namespace. Evidence is written to `artifacts/demo-platform/latest-live-demo.{json,md}`. +The same readiness result is visible inside Sentinel with live Kubernetes, Cilium, +Falco, Kyverno, and Chaos Mesh evidence and remediation for any failed component. ## Part of the Sentinel multi-agent platform diff --git a/scripts/demo-platform-local.sh b/scripts/demo-platform-local.sh index 2ee7d63..788c608 100755 --- a/scripts/demo-platform-local.sh +++ b/scripts/demo-platform-local.sh @@ -187,11 +187,14 @@ start_service phoenix-ui 5174 http://127.0.0.1:5174/api/graph/health "${phoenix_ env VITE_ARGUS_URL=http://127.0.0.1:5173 VITE_SENTINEL_URL=http://127.0.0.1:5175 \ npm --prefix dashboard run dev -- --host 127.0.0.1 --port 5174 start_service sentinel-api 8090 http://127.0.0.1:8090/health "${sentinel_root}" \ - env WORLD_MODEL_URL=http://127.0.0.1:8010 OPENAI_API_KEY="${OPENAI_API_KEY:-}" \ + env WORLD_MODEL_URL=http://127.0.0.1:8010 OPENAI_API_KEY="${OPENAI_API_KEY:-}" SENTINEL_DEMO_MODE=portable \ "${sentinel_root}/.venv/bin/python" -m uvicorn main:app --app-dir backend/src --host 127.0.0.1 --port 8090 start_service sentinel-ui 5175 http://127.0.0.1:5175/api/health "${sentinel_root}" \ env VITE_ARGUS_URL=http://127.0.0.1:5173 VITE_PHOENIX_URL=http://127.0.0.1:5174 \ npm --prefix dashboard run dev -- --host 127.0.0.1 --port 5175 +curl --fail --silent --max-time 20 http://127.0.0.1:5175/api/readiness | + jq -e '.ready_to_present == true and .mode == "portable"' >/dev/null || + fail "Sentinel presentation preflight is not ready. Open http://127.0.0.1:5175 for component remediation." echo "==> Seeding the synthetic cluster and cross-agent lifecycles" demo_started_ms="$(now_ms)" diff --git a/scripts/demo-platform.sh b/scripts/demo-platform.sh index ae92ebe..b6b13fd 100755 --- a/scripts/demo-platform.sh +++ b/scripts/demo-platform.sh @@ -154,12 +154,16 @@ start_service "phoenix-ui" 5174 http://127.0.0.1:5174 "${phoenix_root}" \ npm --prefix dashboard run dev -- --host 127.0.0.1 --port 5174 start_service "sentinel-api" 8090 http://127.0.0.1:8090/health "${sentinel_root}" \ env WORLD_MODEL_URL=http://127.0.0.1:8010 OPENAI_API_KEY="${OPENAI_API_KEY:-}" \ + SENTINEL_DEMO_MODE=live KUBECTL_CONTEXT="${demo_context}" \ "${sentinel_root}/.venv/bin/python" -m uvicorn main:app --app-dir backend/src --host 127.0.0.1 --port 8090 reclaim_stale_sentinel_ui start_service "sentinel-ui" 5175 http://127.0.0.1:5175/api/health "${sentinel_root}" \ env VITE_ARGUS_URL=http://127.0.0.1:5173 VITE_PHOENIX_URL=http://127.0.0.1:5174 \ npm --prefix dashboard run dev -- --host 127.0.0.1 --port 5175 sentinel_ui_ok || fail "Sentinel UI proxy did not return orchestrator JSON from /api/health." +curl --fail --silent --max-time 20 http://127.0.0.1:5175/api/readiness | + jq -e '.ready_to_present == true and .mode == "live"' >/dev/null || + fail "Sentinel live presentation preflight is not ready. Open http://127.0.0.1:5175 for component remediation." if [[ "${skip_seed}" == "true" ]]; then echo "Live platform services are ready; waiting for the guarded experiment driver." diff --git a/scripts/tests/test-demo-platform.sh b/scripts/tests/test-demo-platform.sh index 624d153..b87a93c 100755 --- a/scripts/tests/test-demo-platform.sh +++ b/scripts/tests/test-demo-platform.sh @@ -24,6 +24,12 @@ grep -q 'availability_percent == "not measured"' "${local_script}" grep -q 'Press Ctrl-C to stop only processes started by this command' "${script}" grep -q 'PLATFORM RESILIENCE PROOF: PASS' "${script}" grep -q 'availability percentage not measured' "${script}" +grep -q 'api/readiness' "${script}" +grep -q 'api/readiness' "${local_script}" +grep -q 'ready_to_present == true' "${local_script}" +grep -q 'SENTINEL_DEMO_MODE=portable' "${local_script}" +grep -q 'SENTINEL_DEMO_MODE=live' "${script}" +grep -q 'KUBECTL_CONTEXT="${demo_context}"' "${script}" grep -q 'sentinel_ui_ok' "${script}" grep -q 'listener_cwd.*expected_cwd' "${script}" grep -q '5175/api/health' "${script}"