Skip to content

v0.2.0

Latest

Choose a tag to compare

@github-actions github-actions released this 02 Sep 01:12

0.2.0 (September 1, 2026)

Notes

  • Python Versions: v3.11, v3.12, v3.13
  • Breaking: all Python integrations now require zscaler-sdk-python>=1.9.44. Earlier releases never attached the Bearer token to AI Guard policy-detection calls, so every scan failed with 401 Unauthorized.
  • Behavioral: enforcement is now uniformly fail-closed, and DETECT is uniformly monitor-only. Integrations that previously allowed traffic on a failed scan now block it; integrations that blocked on DETECT now allow it. This includes the Claude Code hooks, which previously allowed on API errors by design — if AI Guard is unreachable, Claude Code now stops until it is reachable. See Bug Fixes.

Features

  • PR #11 - OpenAI Codex CLI — new integration with six Python hooks covering UserPromptSubmit, PreToolUse (Bash and MCP), PostToolUse (Bash and MCP), and Stop
  • PR #11 - AWS — new integration with four stdlib-only components: a Bedrock AgentCore wrapper, a Lambda decorator, boto3 before-call/after-call hooks, and a Strands Agents HookProvider
  • PR #11 - Google Apigee X — new ZSCALER-AIGUARD SharedFlow (13 policies, 7 ES5 JS resources) covering the Gemini, OpenAI, Anthropic, MCP and SSE dialects, plus a thin vertex-aiguard-sync proxy
  • PR #11 - Google Cloud Run — two Cloud Build → Cloud Run Job pipelines that provision either Apigee pattern, and provision_org.py, which creates an Apigee org from scratch
  • PR #11 - Added aiguard_utils.py for Codex with a configuration self-check reporting .env discovery, resolved settings, and a live test scan
  • PR #11 - Added --dry-run to the Jenkins model deploy and undeploy scripts, so both are verifiable without provisioning GPUs

Enhancements

  • PR #11 - Pinned zscaler-sdk-python>=1.9.44 across all requirements.txt files
  • PR #11 - Added ARCHITECTURE.md for both Apigee patterns, covering the request lifecycle, the Private Service Connect topology a disableVpcPeering instance requires, and when to pick the inline proxy over the SharedFlow
  • PR #11 - Converted the last shell scripts in the repository to Python — AWS deploy/teardown to boto3, and Jenkins deploy_model.sh/undeploy_model.sh — removing the AWS CLI, jq and zip as dependencies
  • PR #11 - Aligned the Apigee inline proxy on the aiguard-config KVM, so one provisioned environment serves the inline proxy, the SharedFlow and both Cloud Run pipelines
  • PR #11 - Added make compile-openai, compile-aws and compile-google, and wired them into make test-compile and the weekly CI, which did not cover the new integrations
  • PR #11 - Documented AIGUARD_POLICY_ID as a footgun: a stale ID returns "Policy not found" inside an HTTP 200, which now fails closed
  • PR #11 - Documented that the Jenkins pipeline never undeploys the model endpoint, so GPU cost continues until undeploy_model.py is run
  • PR #11 - Replaced the destructive cp settings.json ~/.claude/settings.json install step with a non-destructive merge
  • PR #11 - Documented the two Claude Code hook blocking contracts: UserPromptSubmit exits 2 while PreToolUse/PostToolUse emit JSON on stdout
  • PR #11 - Added troubleshooting for policies that block unconditionally and for direction IN vs OUT verdict mismatches

Bug Fixes

Enforcement

  • PR #11 - Fixed fail-open enforcement across every integration. A response with no action — from a missing key, an unreachable API, or "Policy not found" returned inside an HTTP 200 — was read as permission. Every path that cannot produce a verdict now blocks
  • PR #11 - Fixed the Kong Lua plugin comparing the API's upper-case verdict against lower-case "allow", which blocked all traffic including allowed content
  • PR #11 - Fixed the Kong Konnect request-callout matching a lower-case "block" against an API that answers in upper case, so it never blocked
  • PR #11 - Fixed the Azure APIM fragment, LiteLLM callback, TrueFoundry server, n8n workflow and Anthropic skill blocking only on an explicit BLOCK, so a verdict-less response passed
  • PR #11 - Fixed the Claude Code hooks (scan_user_input, scan_url, scan_mcp_request, scan_response) allowing on a missing API key, an API error, or an exception — a 401 from a revoked key passed traffic unscanned
  • PR #11 - Fixed Cursor's scan_response.py — the hook that sees indirect injection in MCP tool output — allowing output through whenever a scan failed or returned no verdict
  • PR #11 - Fixed the Apigee inline proxy blocking only on an explicit BLOCK, letting a soft 404 "Policy not found" pass unscanned traffic to Vertex AI
  • PR #11 - Changed the shipped Cursor hooks.json.example from failClosed: false to true, so a crashed or timed-out hook no longer silently allows the action it was meant to scan
  • PR #11 - Removed the action = r.get("action") or "ALLOW" default from all Cursor, Cline and Windsurf hooks, which defeated the no-verdict guard immediately below it
  • PR #11 - Made DETECT uniformly monitor-only across Kong, NeMo Guardrails and the Portkey examples, which blocked on it and so turned a monitoring policy into an enforcing one

API contract

  • PR #11 - Fixed ImportError: cannot import name 'LegacyZGuardClient' across all Python integrations — the class is LegacyAIGuardClient, reached via client.aiguard.policy_detection
  • PR #11 - Fixed ModuleNotFoundError: zscaler.zaiguard in LiteLLM, NeMo Guardrails, Portkey and TrueFoundry — the module is zscaler.aiguard.legacy
  • PR #11 - Fixed Kong sending transaction_id; the field is transactionId and was being silently dropped, losing console correlation
  • PR #11 - Fixed non-UUID transactionId values causing HTTP 500 — they are now hashed with uuid5 or omitted
  • PR #11 - Fixed the Apigee inline proxy sending policyId to resolve-and-execute-policy, which ignores it outright; a pinned ID now routes to execute-policy
  • PR #11 - Fixed tool-call payloads being double-encoded before scanning, which showed detectors JSON braces and escapes and produced false pii blocks
  • PR #11 - Removed auto_retry_on_rate_limit and max_rate_limit_retries from client configs — LegacyAIGuardClient silently discards them

Configuration and deployment

  • PR #11 - Fixed the Apigee RaiseFault policies returning Apigee's default HTTP 500 envelope instead of the documented 403 — FaultResponse/Set children must be ordered Headers, Payload, StatusCode, ReasonPhrase
  • PR #11 - Removed the X-AIGuard-Policy request header from the Apigee proxy, which let any caller pin a policy ID that does not resolve
  • PR #11 - Fixed the Cloud Run proxy pipeline writing KVM keys the inline bundle never read, so the deployed proxy could not find its API key, cloud region, or Vertex project and model
  • PR #11 - Fixed the Cloud Run proxy pipeline's smoke-test URL and README example, which used the SharedFlow's Vertex-style path and returned HTTP 404 against the inline proxy's /vertex basepath
  • PR #11 - Fixed the Apigee RF-ConfigError message naming the pre-rename KVM map and key
  • PR #11 - Fixed Jenkins endpoint cleanup matching display names with gcloud's ~ regex operator instead of equality, which could delete unrelated endpoints
  • PR #11 - Fixed scan_response.py returning a 5-tuple on the missing-key path while its caller unpacked 6, crashing the hook with ValueError instead of reporting the misconfiguration
  • PR #11 - Fixed SECURITY_LOG_PATH not expanding ~, which created a directory literally named ~ and hid every log entry
  • PR #11 - Fixed an unhandled ValueError on a quoted AIGUARD_POLICY_ID, which crashed every Claude Code hook
  • PR #11 - Wired scan_file_read.py into the shipped Claude Code settings.json; the hook, its README and its tests all existed but it was never registered, so it never ran
  • PR #11 - Fixed scan_file_read.py reading tool_input.path instead of tool_input.file_path, so file-read scanning never ran
  • PR #11 - Corrected the Codex hooks feature flag from codex_hooks to hooks

Documentation

  • PR #11 - Corrected the Cursor README, which documented the hooks as failing open when three of the four already blocked
  • PR #11 - Corrected the Kong request-callout README, which documented the API as returning lower-case allow/block and the transaction_id field name
  • PR #11 - Fixed five dead links in the root README.md: moved ARCHITECTURE.md and AGENTIC_AI_INTEGRATION.md out of the gitignored local_dev/ into a new docs/ folder, added a Kong/README.md index, and dropped a link to a development-only setup summary
  • PR #11 - Moved the NeMo Guardrails library-plugin/ out of local_dev/, where the README linked to it but it never shipped
  • PR #11 - Corrected the Claude Code READMEs, which documented the hooks as failing open by design
  • PR #11 - Added an Enforcement Posture section to the root README.md, covering the fail-closed table, the verdict-less HTTP 200, and the audit-only exceptions
  • PR #11 - Corrected docs/ARCHITECTURE.md, which showed the non-existent LegacyZGuardClient class, pinned a policy id that does not resolve, and listed as planned seven integrations that already ship