#!/usr/bin/env bash set -uo pipefail # CASAN Plan-16 SEC-23 Phase 3 (MT-03) — per-tenant scoped resources. # # Proves: # * 23.7 a tenant-scoped kill-switch halts ONLY its own tenant: engaging tenant A's # switch stops A's harness but NOT tenant B's (noisy-neighbor isolation), # * 23.8 per-tenant cost/quota: tenant A exceeding the cumulative budget is a # violation, while tenant B (its own usage log) stays under budget — one tenant's # spend never counts against another's. # # Deterministic; hermetic (temp tenant-state + kill-switch dirs). SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" S="$PROJECT_ROOT/.specify/scripts/bash" HARNESS="$S/casan-harness.sh" KS="$S/kill-switch.sh" TS="$S/tenant-store.sh" COST="$S/cost-spike-detect.sh" WORK="$(mktemp -d)" trap 'rm -rf "$WORK"' EXIT export CASAN_TENANT_STATE_ROOT="$WORK/tenants" export CASAN_KILLSWITCH_DIR="$WORK/ks" PASS=0; FAIL=0 pass() { echo "PASS: $1"; PASS=$((PASS + 1)); } fail() { echo "FAIL: $1"; FAIL=$((FAIL + 1)); } rc_of() { set +e; "$@" >/dev/null 2>&1; echo $?; set -e 2>/dev/null || true; } echo "===== Plan-16 SEC-23 Phase 3: per-tenant kill-switch + cost/quota =====" # --- 23.7 tenant kill-switch scope --- printf 'hi\n' > "$WORK/in.txt" bash "$KS" engage tenant alpha "incident" >/dev/null 2>&1 OUT_A="$(set +e; CASAN_KILLSWITCH_ENFORCE=1 CASAN_TENANT_ID=alpha \ bash "$HARNESS" "$WORK/in.txt" "$WORK/oa.txt" act -- bash -c 'echo x' 2>&1)" echo "$OUT_A" | grep -q "scope=tenant id=alpha" \ && pass "23.7 tenant A's kill-switch halts tenant A" || fail "23.7 tenant A not halted by its switch" OUT_B="$(set +e; CASAN_KILLSWITCH_ENFORCE=1 CASAN_TENANT_ID=beta \ bash "$HARNESS" "$WORK/in.txt" "$WORK/ob.txt" act -- bash -c 'echo x' 2>&1)" echo "$OUT_B" | grep -q "KILL_SWITCH_ACTIVE" \ && fail "23.7 tenant B wrongly halted by tenant A's switch" \ || pass "23.7 tenant B is NOT affected by tenant A's kill-switch (isolation)" # --- 23.8 per-tenant cost/quota --- aLOG="$(CASAN_TENANT_ID=alpha bash "$TS" resolve telemetry/provider-usage.jsonl 2>/dev/null)" bLOG="$(CASAN_TENANT_ID=beta bash "$TS" resolve telemetry/provider-usage.jsonl 2>/dev/null)" printf '{"step":"s1","total_tokens":9000}\n' > "$aLOG" # A blows the budget printf '{"step":"s1","total_tokens":10}\n' > "$bLOG" # B stays tiny [[ "$(rc_of env CASAN_TENANT_ID=alpha CASAN_COST_CUMULATIVE_BUDGET_TOKENS=1000 bash "$COST")" -eq 2 ]] \ && pass "23.8 tenant A over cumulative budget -> violation" || fail "23.8 tenant A budget not enforced" [[ "$(rc_of env CASAN_TENANT_ID=beta CASAN_COST_CUMULATIVE_BUDGET_TOKENS=1000 bash "$COST")" -eq 0 ]] \ && pass "23.8 tenant B under budget -> OK (isolated from A's spend)" || fail "23.8 tenant B affected by A's spend" echo "" echo "===== SEC-23 Phase 3 SUMMARY: PASS=$PASS FAIL=$FAIL =====" [[ "$FAIL" -eq 0 ]] || exit 1