#!/usr/bin/env bash set -uo pipefail # CASAN harness preflight (Plan-15/13 enforcement wiring). # Runs governance cores BEFORE a model call. Currently enforces RAI data # governance: a prompt classified PII/confidential must not go to a CLOUD model # without approval. Opt-in via CASAN_PREFLIGHT=1 so existing flows are unchanged. # # Args mirror model-router: [--role R] [--model M] # Env: CASAN_MODEL_APPROVAL (approval token for sending sensitive data to cloud) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROMPT="${1:-}" # SEC-20 (ARCH-04/09): fail closed if the required toolchain is missing or a # required binary is PATH-shadowed by a planted copy (default checks only refuse on # missing / in-workspace binaries; prod can set CASAN_TOOLCHAIN_TRUSTED_DIRS). if [[ -f "$SCRIPT_DIR/toolchain-verify.sh" ]]; then if ! bash "$SCRIPT_DIR/toolchain-verify.sh" >/dev/null 2>&1; then echo "PREFLIGHT_BLOCK toolchain-verify (missing/shadowed binary)" >&2 exit 1 fi fi MODEL="" while [[ $# -gt 0 ]]; do case "$1" in --model) MODEL="${2:-}"; shift 2 ;; *) shift ;; esac done case "$MODEL" in openai:*|anthropic:*) if [[ -n "$PROMPT" && -f "$PROMPT" ]]; then if ! python3 "$SCRIPT_DIR/rai-guard.py" check-cloud --input "$PROMPT" --target cloud \ --approval "${CASAN_MODEL_APPROVAL:-}" >/dev/null 2>&1; then echo "PREFLIGHT_BLOCK rai-check-cloud model=$MODEL" >&2 exit 1 fi fi ;; esac echo "PREFLIGHT_OK model=${MODEL:-local}" exit 0