AI Pilot Troubleshooting

This guide covers common issues when configuring AI Pilot for per-bouncer LLM controls.


Quick triage

# Control Plane API
curl -sf http://localhost:8082/api/v1/health

# Bouncer health
curl -sf http://localhost:8080/health

# Plugin admin (live config source on bouncer)
curl -sf http://localhost:9998/pilot/config

Common issues

SymptomLikely causeResolution
AI Pilot page loads but bouncer data is emptyBouncer not discovered/linkedVerify bouncer registration and /peps entries
Save override succeeds but runtime behavior unchangedConfig not pushed/applied on target bouncerValidate /pep-config/pilot/bouncer/{id}/ai-management and bouncer /pilot/config
Prompt controls over-block legitimate trafficRules too broad or missing allowlistAdd allowlist terms; move some controls from block to annotate
Exfiltration control blocks approved trafficTrusted domains not configuredAdd exact trusted domains in content safety
Token limits appear inconsistent across replicasMissing shared RedisConfigure REDIS_URL for shared counters
PII redaction not visible in testsAction set to annotate/block onlySwitch relevant control to redact and retest
Smart Control Core says draft generation failedLLM provider key/model rejected at runtimeCheck Smart CC settings provider, bouncer/provider credentials, and provider error details in API logs
Smart Control Core action buttons become unresponsive after route changesStale chat state in long-lived sessionRe-open agent from current page; if stale session persists, refresh once and retry
Code assist in Policy Builder is not auto-availableNot in Code Editor mode, or builder context not active yetOpen Controls → Policy Builder → Code Editor tab, then reopen Smart CC
Code assist ignores PIP signalsPIP mapping exists but lacks relevant attributesMap principal/resource/context attributes in Data Sources and retry with explicit attribute hints

Smart Control Core Agent quick checks

Operational reference for SCCA credential hygiene, masking, Test connection, diagnostics, and trilingual prose lives in Smart Control Core Settings.

# 1) API health
curl -sf http://localhost:8000/health

# 2) Login and get token (replace creds)
TOKEN=$(curl -s http://localhost:8000/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"<user>","password":"<password>"}' | jq -r '.access_token')

# 3) Verify Smart CC settings
curl -s http://localhost:8000/v1/smart-cc/settings \
  -H "Authorization: Bearer $TOKEN" | jq .

# 4) Run one Smart CC turn
curl -s http://localhost:8000/v1/smart-cc/turn \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"create draft for payroll MFA","context":{},"confirm_action":false}' | jq .

# 5) Run one code-assist turn with builder context
curl -s http://localhost:8000/v1/smart-cc/turn \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"add principal and action checks using PIP risk score","context":{"active_page":"policy_lifecycle","editor_mode":"code","resource_id":"1","bouncer_id":"1","current_policy":{"name":"Draft","rego_excerpt":"package controlcore\n\ndefault allow = false"}},"confirm_action":false}' | jq .

Check for:

  • intent and response_cards present.
  • requires_confirmation=true for mutating draft flows.
  • No provider/auth errors in evidence[] for normal draft generation.
  • Code assist turns return intent=assist_policy_code with snippet/rationale evidence.

API-level validation

# Effective AI management for a bouncer
curl -H "Authorization: Bearer <token>" \
  http://localhost:8082/pep-config/pilot/bouncer/<pep_id>/ai-management

# Observability payload for charts
curl -H "Authorization: Bearer <token>" \
  "http://localhost:8082/pep-config/pilot/bouncer/<pep_id>/observability?window=24h"

# Recent payload stream
curl -H "Authorization: Bearer <token>" \
  "http://localhost:8082/pep-config/pilot/bouncer/<pep_id>/recent-payloads?limit=8"

Check that:

  • use_global matches your UI state
  • local_override exists when expected
  • effective_config includes all prompt security fields

Runtime compile checks

AI Pilot compiles per-bouncer controls into bouncer runtime config.

Expected keys in effective pilot payload:

  • ai_management
  • compiled_targets.Bouncer intercept.content_safety
  • compiled_targets.xds.cost_optimization
curl -sf http://localhost:9998/pilot/config | jq .

Prompt control tuning strategy

  1. Start with strict controls in sandbox.
  2. Use annotate mode for uncertain detections.
  3. Promote high-confidence patterns to block.
  4. Add explicit allowlist/trusted-domain exceptions.
  5. Re-check audit events and false-positive rates weekly.

Routing

SymptomWhere to lookResolution
Wrong provider or model reachedModels & routing tab; client model field / headersFix route bindings and enabled models; confirm client base URL is the bouncer
Fallback never firesResilience / fallback order; upstream healthEnable ordered fallbacks; verify secondary credentials and reachability
Some paths ungovernedIntercept scope; DNSEnsure all LLM base URLs point at the bouncer (Gateway Mode) or local listen port (App-Embedded)

Troubleshooting: 404 from the bouncer on /v1/chat/completions usually means LLM routes are disabled for that PEP. Re-enable under Settings → AI Pilot → LLM Connections / Routing.


Guardrails & data protection

SymptomWhere to lookResolution
Legitimate prompts blocked (400)Protection / prompt security; forbidden phrasesNarrow phrases; use annotate before block; add allowlist terms
PII still visible at the providerRedaction action; LLM path coverageSet relevant controls to redact; confirm request path is an LLM body the AI Inspection Engine processes
Exfiltration blocks approved domainsTrusted domains listAdd exact trusted domains in content safety

Token limits

SymptomWhere to lookResolution
Unexpected 429Cost & usage; daily/monthly capsRaise caps in sandbox, or wait for window reset; confirm caller identity for per-user counters
Limits differ across replicasRedis connectivitySet shared REDIS_URL so counters are global
Limits never enforceCost toggles; RedisEnable token limits and Redis; retest after config push

Failover & resilience

SymptomWhere to lookResolution
Sticky failures on primaryResilience panel; breaker events in AuditConfirm breaker thresholds; check AI_BREAKER_TRIPPED / AI_FALLBACK_USED in audit or SIEM
Fallback returns auth errorsUpstream auth for secondary providerRotate/validate secondary credentials (see Upstream auth guide)
Hedging/retry stormsRetry budget settingsLower retry budget; verify only one client retry layer

MCP tools

SymptomWhere to lookResolution
Tool call denied unexpectedlyMCP proxy settings; controls for tool nameAllowlist the tool or relax the control; check AI_MCP_TOOL_CALL audit
Broker mode not routingMCPRoute / MCP proxy mode configConfirm registry vs broker mode and server bindings
Tool responses look staleTool-response cache settingsShorten TTL or disable cache for mutating tools

Event streaming

SymptomWhere to lookResolution
SIEM empty while Activity has rowsSettings → Audit → SIEM deliveryFix endpoint auth/TLS/index; send a test event
Missing event typesAdvanced Audit toggles / samplingEnable traffic, lineage, and redaction categories you need
Cannot find a request in SIEMCorrelation ID in AI Pilot AuditSearch SIEM by that ID (see Export & observability)

By deployment mode

Gateway Mode

  • Confirm clients and apps use the shared bouncer DNS/VIP as the LLM base URL — any direct provider DNS bypasses governance.
  • Upstream errors (502) usually mean the shared TARGET_HOST or provider endpoint is unreachable from the bouncer network.
  • Token limits across gateway replicas need shared Redis.

App-Embedded

  • Confirm the application egress targets the local bouncer listen address, not the provider.
  • Only the co-located app is in scope; other apps need their own embedded bouncer or a move to Gateway Mode.
  • Loopback/TARGET_HOST mismatches are the most common cause of empty Activity with a healthy heartbeat.

Related: Deployment modes (AI Pilot) · Quick start