# AI Context Refinement Source: https://docs.zenable.io/ai-context-refinement Automated maintenance of coding agent context files ## Overview Zenable automatically analyzes your repositories to maintain high-quality AI context files aligned with your organization's requirements. ## How It Works Scans your repository for AI context files, compares content against your configured requirements, and opens a PR with suggested improvements if issues are found. **Files analyzed include:** * **Claude Code**: `**/CLAUDE.md`, `**/.claude/rules/**/*.md` * **Cursor**: `.cursorrules`, `.cursor/rules/**/*.mdc` (repository root only) * **OpenAI Codex**: `**/AGENTS.md` * **GitHub Copilot**: `.github/copilot-instructions.md`, `.github/instructions/**/*.md` * **Devin Desktop**: `**/AGENTS.md`, `**/.devin/rules/**/*.md` * **Antigravity CLI**: `**/GEMINI.md` * **Kiro**: `**/.kiro/steering/**/*.md` ### Imported files (`@`-imports) Context files often pull in another file with an `@path` reference—for example, a `CLAUDE.md` containing `@AGENTS.md`. Zenable resolves these imports and suggests a shared improvement in the file that actually owns the content (the imported file), instead of duplicating it in every file that references it. When the referenced file is itself a recognized context file, it's refined in its own right. A **root context file** is a recognized context file that is not imported by another recognized context file. It starts an independent analysis with its standalone imports included. Each run analyzes at most 12 root context files. ## Enabling Analysis Go to **Integrations > GitHub > Repos** in [zenable.app](https://www.zenable.app?utm_source=docs\&utm_medium=ai-context-refinement\&utm_content=console) Click on one or more repositories you want to analyze Click the **Analysis** button to open the configuration modal Toggle on **Refine Context** to enable AI context file improvements Click **Add to Priority Queue** to run in the next nightly window ## When Analysis Runs Once enabled, analysis runs automatically on a regular schedule. ### Priority Queue Click **Add to Priority Queue** to request to prioritize your repository for a review. ## Viewing Results When improvements are found, a PR is created in your repository. Review, modify, or merge as needed. ## Troubleshooting Verify analysis is enabled and the repository is connected via GitHub integration. Use **Add to Priority Queue** if you need it sooner. Your context files are already well-aligned with your requirements—no improvements needed. ## Next Steps * Set up [GitHub PR reviews](/integrations/vcs-reviewers/github) for automated code review * Define [custom policies](/use-cases/policy-as-code) for your organization # Policy-Based Auto-Approvals Source: https://docs.zenable.io/approval-policies Turn analyzer quality scores into automated approvals with policies you define ## Overview **Policies you define** decide which analyzer proposals move forward without waiting for a person. Zenable's analyzers already score every proposal against a rubric; a policy turns that score into an automated decision — accept proposals at or above a threshold, optionally decline proposals below a floor, and leave everything in between for human triage on [Proposals](/proposals). Nothing is auto-approved unless a policy you created says so. Policies never bypass [approval workflows](/approval-workflows). If an approval flow gates the change, an automated approval files the same request a human would — governance stays the intentional last stop. A policy only replaces the *triage click*, not the approval. Configure policies under **Approvals → Approval Policies**. ## What can be policy-accepted Each policy selects one or more proposal kinds: | Proposal kind | Produced by | What accepting does | | - | - | - | | New requirement proposals | Repository analysis of merged PRs | Promotes the proposed requirement to an active (beta) requirement and queues guardrail generation | | Requirement refinements | Requirement refinement | Promotes the proposed new version to the family's live version | | Requirement merges | Requirement evolution analysis | Promotes the merged requirement, records lineage, and deprecates the source requirements | | Requirement splits | Requirement evolution analysis | Promotes every split result, records lineage, and deprecates the source requirement | Merges and splits apply atomically: nothing changes until the whole operation (and any approval gating it) completes. ## Policies A policy is the unit of configuration — create as many as you need: * **Accept threshold (0–10)** — proposals scoring at or above this are accepted automatically. * **Decline floor (0–10, optional)** — proposals scoring below this are declined automatically and move out of the triage queue. Zenable defaults to 6 and allows customization on the Agent Policies page. * **Target selector (optional)** — narrow the policy to matching proposals using a reusable [target selector](/approval-workflows#target-types), e.g. only proposals for certain scopes or from a specific analysis source. * **Daily cap (optional)** — a per-policy limit on automated accepts per day, on top of the tenant-wide daily budget. Proposals over budget simply wait for the next day (or a person). * **Enabled** — disabled policies keep their configuration but never act. Zenable provisions each tenant with a **Zenable default** policy as a starting point. It's yours to tune or delete — but editing turns it into your own policy, so you'll be asked to give it a new name (the "Zenable default" name is reserved for the policy as Zenable shipped it). ### When policies overlap If several enabled policies match the same proposal, the **strictest threshold wins** — the proposal must satisfy every matching policy's bar to be accepted. A decline only happens when every floor-bearing policy would decline it **and** no matching policy would individually accept it; conflicting policies land the proposal on a human instead. ### Policies are governed changes Approval policies decide what moves forward without a person, so changing one is itself gateable: approval flows can target `approval_policy_create`, `approval_policy_update`, and `approval_policy_delete`. A tenant can require a human sign-off on any change to what a policy accepts. ## Scoring rubrics Every proposal kind is scored against a rubric of up to six weighted dimensions. Zenable ships built-in rubrics per kind; each dimension's description is the verbatim instruction the scoring model follows. * **Customize** a rubric under **Approvals → Policy evaluation → Scoring Rubrics** — the editor seeds from the built-in defaults so you tune rather than start blank. * **Tenant default** — mark one rubric per kind as the default; analyzers use it whenever no configuration profile picks a different one. * **Configuration profiles** can link specific rubrics, so different repos can be scored against different bars. Scores are computed when the proposal is created and stored with it — editing a rubric affects future proposals, not the existing queue. ## How runs work The policy evaluation engine runs on Zenable's analysis scheduler (roughly daily) and compares each open proposal's stored score against your policies. You can also trigger a run on demand with **Run now**. Automated accepts show a **Policy-accepted** badge on Proposals, and every accept records which policies set the binding bar. A tenant-wide daily budget bounds total automated accepts per day, independent of per-policy caps, so a runaway analyzer can never flood your requirement set. ## Reviewing evaluation runs **Agent Evaluations** (under **Approvals → Agent Evaluations**) lets you browse the last 30 days of policy evaluation runs and inspect every proposal each run considered. See how your agent policys are working with a sankey chart, and adjust your thresholds while seeing how it would affect your current proposals. ## Required Permissions | Permission | Grants | | - | - | | `approvals:read` | View approval policies and Agent Evaluations | | `approvals:manage` | Create, edit, and delete approval policies; trigger a run; apply threshold changes | | `settings:read` | View scoring rubrics | | `settings:manage` | Create, edit, and delete scoring rubrics | See [Roles and Permissions](/permissions) for which roles include these permissions. ## API Reference ### Approval Policies | Method | Endpoint | Description | Permission | | - | - | - | - | | GET | `/api/data/approval-policies` | List policies (pass `?include_disabled=true` to include disabled) | `approvals:read` | | POST | `/api/data/approval-policies` | Create a policy | `approvals:manage` | | PUT | `/api/data/approval-policies/{id}` | Update a policy | `approvals:manage` | | DELETE | `/api/data/approval-policies/{id}` | Delete a policy | `approvals:manage` | | POST | `/api/data/approval-policies/run` | Schedule a run now | `approvals:manage` | ### Scoring Rubrics | Method | Endpoint | Description | Permission | | - | - | - | - | | GET | `/api/data/approval-policy-rubrics` | List rubrics (filter with `?assessment_kind=`) | `settings:read` | | GET | `/api/data/approval-policy-rubrics/defaults` | Built-in default rubric per proposal kind | `settings:read` | | POST | `/api/data/approval-policy-rubrics` | Create a rubric | `settings:manage` | | PUT | `/api/data/approval-policy-rubrics/{id}` | Update a rubric (new version) | `settings:manage` | | DELETE | `/api/data/approval-policy-rubrics/{id}` | Delete a rubric | `settings:manage` | # Approval Workflows Source: https://docs.zenable.io/approval-workflows Configure multi-phase approval flows for requirements and guardrails Approval workflows are available on **Professional** and **Enterprise** plans. ## Overview Approval workflows let you gate requirements or guardrail changes. Configure multi-phase flows with flexible approval criteria based on specific users, roles, or permissions. Without an active approval flow, requirements and guardrail regenerations are auto-approved immediately. With a flow configured, submissions enter a **pending** state and require explicit approval before proceeding. ## Key Concepts | Concept | Description | | - | - | | **Approval Flow** | A reusable workflow definition with one or more sequential phases | | **Phase** | A step in the flow with its own approval expression (who must approve) | | **Approval Expression** | A logical tree (AND/OR/NOT) of criteria that must be satisfied | | **Approval Request** | A specific instance of a submission awaiting review | | **Feedback** | Votes (upvote/downvote) and comments on pending requests | ## Target Types Approval flows can be configured for these submission types. Create / update / delete are split per entity so different policies can apply to each (e.g. a flow could require approval on delete but not on create): | Target Type | Description | | - | - | | `new_requirement` | New requirement proposals | | `requirement_version` | Updates to existing requirements | | `requirement_delete` | Deletion of a requirement family (cascades to the requirement's guardrails) | | `requirement_override_create` | Creating a tenant override for a marketplace requirement | | `requirement_override_update` | Modifying an existing tenant override | | `requirement_override_delete` | Removing a tenant override | | `guardrail_regeneration` | Guardrail code regeneration requests | | `guardrail_custom_create` | Authoring a new tenant-owned custom guardrail | | `guardrail_custom_update` | Modifying an existing custom guardrail | | `guardrail_delete` | Deleting a custom guardrail | | `guardrail_family_settings_change` | Changing a guardrail's runtime failure settings | | `scope_create` | Authoring a new scope definition, or approving a proposed scope | | `scope_update` | Modifying an existing scope definition | | `scope_delete` | Deleting a scope definition | | `target_selector_create` | Authoring a new approval-flow target selector | | `target_selector_update` | Modifying an existing target selector | | `target_selector_delete` | Deleting a target selector | | `requirement_merge` | Merging multiple requirements into one | | `requirement_split` | Splitting one requirement into several | | `approval_policy_create` | Authoring a new [approval policy](/approval-policies) | | `approval_policy_update` | Modifying an existing approval policy | | `approval_policy_delete` | Deleting an approval policy | ### Pending state and final disposition Approval-gated actions never reach their final state until the request is approved. * **Creates and updates** stage the proposed data in the affected table itself, marked `PROPOSED` (overrides) or `PROPOSED` lifecycle (requirements). Read paths filter these out so users only see live state. * **Deletes** carry no pending state on the row — the open approval request itself is the pending marker. On approve the row is soft-deleted via `deleted_at`; on reject the row is untouched. Soft delete keeps the audit trail intact and makes restoration trivial. * An override **update** writes a new `PROPOSED` row whose `supersedes_id` points at the existing `ACTIVE` row. On approve, the superseded row is soft-deleted and the proposed row flips to `ACTIVE`. On reject, the proposed row is soft-deleted and the active row stays live. ### Specific-user criteria `SPECIFIC_USER` criterion values are stored as `user_uid` (the stable 5-word identifier). The UI surfaces and accepts `login_identifier` (email / UPN / SSO sub) so authors and approvers see human-readable handles; the form picker stores the corresponding `user_uid` under the covers. Even when an approver holds `requirements:approve` or `guardrails:approve`, they can only decide on a request if they satisfy the active phase's expression — being named in a `SPECIFIC_USER` rule, for example. ## Creating an Approval Flow Navigate to [Approval Management](https://www.zenable.app/approval-management?utm_source=docs\&utm_medium=web) and select the **Workflows** tab. ### Flow Configuration 1. **Name and description** - Give the flow a meaningful name 2. **Target types** - Select which submission types trigger this flow 3. **Phases** - Define one or more sequential approval phases 4. **Default flow** - Optionally mark as the default for its target types 5. **Auto-regenerate invalid guardrails without approval** - An optional configuration, shown only when `guardrail_regeneration` is a target type. When enabled, automatic regeneration due to a failure at runtime skips this flow and proceeds without approval. User-initiated regenerations still require approval. ### Target selectors (entity filters) Target types decide *which kinds* of change a flow gates; an optional **target selector** narrows it to *which entities* — for example only enforced requirements, only marketplace ones, or only changes with a given lifecycle status. Lifecycle matching is on the **resulting** status — the status the requirement will hold *after* the change (the outcome you're putting behind approval), not the status it's in now. The builder labels this rule **Resulting Status**. Match the state each change produces: * Accepting a proposal brings it live at `beta` (the entry maturity — `stable` is a separate, later promotion), so gate go-lives with a `beta` selector. * Declining a proposal lands it at `declined`, so gate declines with `declined`. * Restoring a declined requirement returns it to `proposed` for re-triage, so gate restores with `proposed`. ### Approval Expressions Each phase defines an approval expression using a logical tree: * **Specific User** - A named user must approve (matched by user UID) * **Role** - Any user with the specified role can approve * **Permission** - Any user with the specified permission can approve Combine criteria with **AND** (all must be satisfied), **OR** (any one suffices), or **NOT** (exclusion) operators. Expressions can be nested for complex approval requirements. **Example:** "Requires approval from any Admin OR both the Security Auditor AND a Contributor" ``` OR ├── Role: Admin └── AND ├── Role: Security Auditor └── Role: Contributor ``` ### Multi-Phase Flows Phases execute sequentially. Each phase must be fully approved before the next begins. If any phase is rejected, the entire request is rejected. **Example:** A two-phase flow for new requirements: 1. **Technical Review** - Any contributor approves 2. **Compliance Sign-off** - Security auditor approves ## Reviewing Approval Requests Navigate to the **Pending Reviews** tab in [Approval Management](https://www.zenable.app/approval-management?utm_source=docs\&utm_medium=web). Each request shows: * The submitted entity (requirement name, guardrail code snippet) * Current phase and progress * **Approve** / **Reject** buttons (visible only if you have the required permission) ### Decisions * **Approve** - Records your approval for the current phase. If the phase's approval expression is now satisfied, the flow advances to the next phase (or completes). * **Reject** - Immediately rejects the entire request regardless of phase. The submitter is notified. ### Feedback You can provide feedback on any pending request without making an approval decision: * **Vote** - Upvote or downvote (one vote per user per request, toggleable) * **Comment** - Up to 280 characters. Edits are tracked; the last 12 versions are stored. ## What Happens After Approval | Target Type | On Approval | On Rejection | | - | - | - | | New requirement | Transitions from PROPOSED to BETA; guardrail generation triggers | Transitions to DECLINED | | Requirement version | Transitions from PROPOSED to BETA; guardrail update triggers | Transitions to DECLINED | | Requirement delete | Requirement soft-deleted; cascades to its guardrails | Submitter notified; no delete | | Requirement override create / update | New row activates (PROPOSED → ACTIVE); for updates, the superseded ACTIVE row is soft-deleted | PROPOSED row soft-deleted | | Requirement override delete | Override row soft-deleted | Submitter notified; no delete | | Guardrail regeneration | Regeneration proceeds with stored parameters | Submitter notified; no regeneration | | Custom guardrail create | New row becomes is\_latest=true | PROPOSED row soft-deleted | | Custom guardrail update | New row becomes is\_latest=true; prior version flips to is\_latest=false | PROPOSED row soft-deleted | | Custom guardrail delete | Guardrail soft-deleted | Submitter notified; no delete | | Scope create / update | New row activates (PROPOSED → ACTIVE); for updates, the superseded ACTIVE row is soft-deleted | PROPOSED row soft-deleted | | Scope delete | Scope soft-deleted | Submitter notified; no delete | | Target selector create / update | New row activates (PROPOSED → ACTIVE); for updates, the superseded ACTIVE row is soft-deleted | PROPOSED row soft-deleted | | Target selector delete | Selector soft-deleted | Submitter notified; no delete | ## Notifications Zenable groups notifications into two categories, both configurable under **Settings → Notifications** in your [profile](https://www.zenable.app/settings?utm_source=docs\&utm_medium=web). ### Governance Activity Immediate notifications for approval events: | Event | Delivery | Recipients | | - | - | - | | Approval requested | Immediate | Eligible approvers for phase 1 | | Decision made | Immediate | Submitter | | Phase completed | Immediate | Next phase's eligible approvers | | Fully approved/rejected | Immediate | Submitter | | Feedback received | Daily digest | Submitter | ### Report Mail An opt-in periodic digest that combines persisted notifications with calculated activity (findings, feedback, and PR/MR reviews) for the reporting period. Choose **daily**, **weekly**, or **monthly** cadence in your profile. ## Required Permissions Approvals are fully transparent: anyone with `approvals:read` can see every request, every decision, every comment, and who voted which way. There is no per-record permission gating beyond `approvals:read`. | Permission | Description | | - | - | | `approvals:read` | View approval flows, pending requests, decisions, and the feedback thread | | `approvals:feedback` | Submit non-binding feedback (vote + comment) on an approval request | | `approvals:manage` | Create, edit, and archive approval flow definitions, [approval policies](/approval-policies), and target selectors | | `requirements:approve` | Cast a binding approve/reject decision on requirement proposals | | `guardrails:approve` | Cast a binding approve/reject decision on guardrail requests | See [Roles and Permissions](/permissions) for which roles include these permissions. ### Who can decide what Approving a change requires both the permission to make the change and being named by the flow's current phase. | To approve changes to | You need | | - | - | | Requirements — new ones, edits, lifecycle moves, deletions, merges, splits, and marketplace overrides | `requirements:approve` | | Guardrails — regeneration, and custom guardrails your team authors | `guardrails:approve` | | Scopes — creating, editing, deleting, or handing over ownership | `scopes:write` | | Groups — creating, editing, deleting, or changing who belongs to one | `groups:write` | | Tenant configuration — guardrail runtime settings, and applying a configuration proposal | `settings:manage` | | The approval system itself — approval policies and target selectors | `approvals:manage` | ## API Reference ### Approval Flows | Method | Endpoint | Description | Permission | | - | - | - | - | | GET | `/api/data/approval-flows` | List flows (pass `?include_archived=true` to include archived) | `approvals:read` | | POST | `/api/data/approval-flows` | Create a new flow | `approvals:manage` | | PUT | `/api/data/approval-flows/{id}` | Update a flow | `approvals:manage` | ### Approval Requests | Method | Endpoint | Description | Permission | | - | - | - | - | | GET | `/api/data/approval-requests` | List approval requests (filterable by status, target\_type, submitted\_by) | `approvals:read` | | GET | `/api/data/approval-requests/{id}` | Get request detail with phase instances | `approvals:read` | | POST | `/api/data/approval-requests/{id}/decide` | Submit approve/reject decision on a request | Depends on what is being changed — see [Who can decide what](#who-can-decide-what) | Decision request body: ```json theme={null} { "decision": "approve", "comment": "Looks good to me" } ``` The `decision` field accepts `approve` or `reject`. The optional `comment` field (max 280 characters) is recorded with the decision. ### Approval Feedback | Method | Endpoint | Description | Permission | | - | - | - | - | | GET | `/api/data/approval-requests/{id}/feedback` | List all feedback for a request | `approvals:read` | | POST | `/api/data/approval-requests/{id}/feedback` | Submit or update your feedback | `approvals:feedback` | Feedback request body: ```json theme={null} { "vote": "upvote", "comment": "I agree with this change" } ``` The `vote` field accepts `upvote` or `downvote` (mutually exclusive, toggleable). Both fields are optional; you can vote without commenting or comment without voting. Feedback is upserted per user per request — submitting again updates your existing feedback. Comment edits are versioned (last 12 versions retained). ## Audit Logging All approval actions are recorded in the audit log: * Flow created, updated, or archived * Decision made (approve/reject) * Request created or resolved * Feedback submitted or edited Access audit logs via the **Audit** section in the [management console](https://www.zenable.app/audit?utm_source=docs\&utm_medium=web). **Need help?** Contact us at [hello@zenable.io](mailto:hello@zenable.io) # Audit Portal Source: https://docs.zenable.io/audit-portal Be sure that every change was checked against your requirements — and see where coverage gaps remain ## Overview A finding tells you where a requirement was *violated*. The **Audit Portal** tells you the other half: which requirements were actually **evaluated** against which change — including the runs that came back clean and produced nothing. That distinction is the whole point. A repository with zero findings looks identical to a repository Zenable silently stopped running on. The Audit Portal is what separates the two, so "requirement R was checked against change C" becomes a fact you can show an auditor rather than something inferred from the absence of a finding. Find it under **Reporting → Audit Portal**. ## Who it's for Three audiences read this page: * **Engineering** — where are we covered, and where are the holes? * **Cybersecurity** — are our controls being enforced? * **Auditors** — show me proof the controls ran. Auditors reach it through the **Security Auditor** role, which grants read-only access to the audit surface. See [Permissions](/permissions). ## What's on the page ### The assurance matrix The centerpiece. It answers one question: > Can we provide assurance that **these requirements** were enforced in **these scenarios**? Your requirements run down the side; the **enforcement surfaces** run across the top — GitHub PR, GitLab MR, IDE / Agent, and CLI / Pre-commit. Each cell reports one of: | State | Meaning | | - | - | | **Enforced** | The requirement ran on every change where the portal can prove it applied. Clean runs count. | | **Partial** | A globally scoped requirement ran on some changes on that surface. | | **Not covered** | A globally scoped requirement ran on **none** of the VCS changes on that surface. | | **No activity** | No applicable evaluation was attested in the period. | **"No activity" is not a gap.** It is deliberately distinct from *Not covered*: absence does not prove that a scoped requirement should have applied, and IDE / Agent and CLI / Pre-commit telemetry is optional. The portal uses webhook and local-check attestations, not findings, as its evidence. An evaluation that produces zero findings still counts. Click any state for the evaluation and finding totals behind it; click the requirement name to open its full details. The matrix is rebuilt nightly. The whole page reports **complete days only** — figures always end yesterday or earlier, so a partially-elapsed today can never make the numbers disagree with themselves. ### Landed without a check Default-branch changes that landed with **no** Zenable evidence. This is the actionable list: each row is a change that reached your main branch unchecked. Every way a change can land is counted — merge commits, squash merges, rebase merges, fork PRs, and **commits pushed directly to the default branch** (shown with a *Direct push* badge). Landings are observed from your VCS provider directly, so the count does not depend on webhook delivery. A direct push counts as checked only when a Zenable check ran on that **exact commit** (for example a CLI or pre-commit check before pushing) — a direct push is not rewritten on landing, so commit identity is the honest test. ### PR discipline The share of default-branch landings that arrived through a pull/merge request. Direct pushes bypass review entirely, so this number is the process-integrity signal auditors ask about alongside coverage. ### Filtering The **repository** and **date range** filters at the top apply to the whole page at once — the matrix, the gap list, the evidence log, and the export all narrow together, and the filters ride the URL so a filtered view can be shared. ### Evidence log Every check that ran, including the clean ones. Each entry records the change (repository, commit, change ref), the surface it ran on, how many checks executed, and how many findings came out. ## Exporting evidence **Export evidence pack** downloads the bundle an auditor asks for over your selected period: the assurance matrix, the gap list, and the raw attestations behind both. In order to export, you must have the `audit:export` permission. For more details, see the [Role Permission Matrix](/permissions#role-permission-matrix). If a future release ever introduces a kind of change the coverage figures do not count, the portal will say so **in-product, next to the number it qualifies** — the limitation always travels with the data. Nothing is omitted today. # Deployment & Adoption Source: https://docs.zenable.io/deployment-adoption Roll out quality guardrails across your team: from single developer to entire organization Zenable scales from single repo to entire organization. Requirements are composable: layer them by team, product, environment, or any combination. **Data Privacy**: We never retain or train on your code. [Learn more](https://www.zenable.io/security?utm_source=docs\&utm_medium=deployment-adoption\&utm_content=security) ## Deployment Levels ### Individual Developer Install for all projects on your system (default). ```bash theme={null} zenable install ``` [Setup guide →](/integrations/mcp/getting-started) ### Per-Repository Project-specific installation. ```bash theme={null} zenable install --project ``` ### Team-Wide Add [PR reviews](/integrations/vcs-reviewers/github), [pre-commit hooks](/integrations/pre-commit/getting-started), and shared standards. ### Organization-Wide Set up your requirements once in our [management console](https://www.zenable.app?utm_source=docs\&utm_medium=web\&utm_content=deployment-adoption), and enforce them everywhere: * Architecture decisions * Security standards * Compliance requirements (HIPAA, PCI-DSS, SOC2) * Coding standards * Product or customer requirements [Learn about custom policies →](/use-cases/policy-as-code) ## Requirement Scopes Target requirements precisely where they matter. Common scopes include: * **Global**: Organization-wide (can be inherited, blocked, or force-inherited) * **Repository**: Apply to specific repos (`acme/frontend-app`, `acme/payment-service`) * **Team**: Target by team ownership (platform, mobile, backend) * **File types**: Language-specific standards (`.py` → Python style, `.tsx` → React patterns) * **Path patterns**: Target directories (`src/api/*` → API standards, `tests/*` → testing rules) And more! See all scoping options in the [management console](https://www.zenable.app?utm_source=docs\&utm_medium=web\&utm_content=deployment-adoption). Mix and match scopes for precise control. For example: stricter security for payment repositories, or TypeScript standards only for frontend teams. ## Rollout Strategies **Week 1:** Install in 1-3 IDEs, measure bugs caught **Week 2-4:** Add PR reviews + pre-commit hooks **Month 2+:** Add company-wide requirements **Day 1:** Install [GitHub](/integrations/vcs-reviewers/github)/[GitLab](/integrations/vcs-reviewers/gitlab) PR reviews **Week 1:** Developers run `zenable install` **Ongoing:** Add custom requirements as needed **Week 1:** PR reviews on all repos **Month 1:** Upload company requirements **Ongoing:** Track metrics, refine ## Pricing Built-in checks, IDE + PR reviews Custom guardrails, 10x limits Unlimited, dedicated environment ## Get Started 30 second setup See team deployment Configure requirements # How It Works Source: https://docs.zenable.io/how-it-works Real-time AI code review with automated security checks and bug prevention Zenable catches bugs and security issues before they reach your codebase through three core pillars: ## Our Approach Enforce conformance and custom requirements directly in the SDLC. Provide context only when it matters to keep AI workflows efficient and precise. Automatically measure, learn, and refine prompts, context, and guardrails to reduce token waste and keep integrations healthy. Instrument the SDLC with metrics, telemetry, and audit-ready evidence. Turn usage data into actionable reports that double as compliance artifacts and performance KPIs. ## Technical Architecture ### Dual-Layer Validation **Fast Deterministic Checks** * Runs on every file save in milliseconds * Catches known patterns: security vulnerabilities, code smells, style violations **AI Code Review** * Context-aware analysis of your codebase and requirements * Provides working fixes, not just warnings * Catches subtle bugs and logic errors * Enforces architecture decisions and custom requirements Both layers run in parallel. [See examples](/use-cases/preventing-ai-mistakes) ### Where Zenable Runs **IDE Protection** Works with [Cursor](/integrations/mcp/ide/cursor), [Claude Code](/integrations/mcp/ide/claude-code), [VS Code](/integrations/mcp/ide/vscode), [Codex](/integrations/mcp/ide/codex), [Devin Desktop](/integrations/mcp/ide/devin-desktop), [GitHub Copilot CLI](/integrations/mcp/ide/copilot), [Antigravity](/integrations/mcp/ide/antigravity), [Antigravity CLI](/integrations/mcp/ide/antigravity-cli), [Goose](/integrations/mcp/ide/goose), [Pi](/integrations/mcp/ide/pi), and more. [See our setup guide](/integrations/mcp/getting-started) **Pre-Commit Hooks** Block bad code at commit time. [Get started](/integrations/pre-commit/getting-started) **PR Reviews** Automated line-by-line feedback with fix suggestions. We support both [GitHub](/integrations/vcs-reviewers/github) and [GitLab](/integrations/vcs-reviewers/gitlab). ### Custom Requirements Upload your requirements once, enforce everywhere: * Architecture decisions * Coding standards * Compliance requirements (HIPAA, PCI-DSS, SOC2) * Internal library usage rules [Configure policies](/use-cases/policy-as-code) | [Deployment strategies](/deployment-adoption) ## Key Benefits * Catch bugs as code is written, not in review * Speed up code review with automated first-pass * Automatically meet company requirements * Zero learning curve—works with existing AI assistants * No CI/CD changes needed ## Get Started 30 seconds GitHub/GitLab See what we catch # Welcome to Zenable Source: https://docs.zenable.io/index AI code review that catches and fixes bugs before commit # AI Guardrails That Learn From You AI coding assistants move fast. Too fast to catch every SQL injection, hardcoded secret, or architecture violation they introduce. **Zenable learns your team's standards and enforces them in real-time**, catching bugs and security issues as AI generates code. Upload your requirements once, protect your codebase forever. **We never retain or train on your code.** Your IP remains yours. [Learn more](https://www.zenable.io/security?utm_source=docs\&utm_medium=index\&utm_content=security) ## Get Started ```bash theme={null} zenable install ``` Don't have the Zenable CLI? [Get it here](/integrations/mcp/getting-started). Works with Cursor, Claude Code, VS Code, Antigravity, and 50+ other IDEs. [Learn more](/integrations/mcp/getting-started) Setup [GitHub](/integrations/vcs-reviewers/github) or [GitLab](/integrations/vcs-reviewers/gitlab) code reviews Go to [zenable.app](https://www.zenable.app?utm_source=docs\&utm_medium=index\&utm_content=configure-requirements) to add requirements or pick guardrails. Any configuration is automatically enforced across all IDE and code review integrations company-wide. ## How We Keep AI Code Safe Enforce conformance and custom requirements directly in the SDLC. Provide context only when it matters to keep AI workflows efficient and precise. Automatically measure, learn, and refine prompts, context, and guardrails to reduce token waste and keep integrations healthy. Instrument the SDLC with metrics, telemetry, and audit-ready evidence. Turn usage data into actionable reports that double as compliance artifacts and performance KPIs. ## How It Works Zenable combines fast deterministic security checks with AI-powered code review to catch issues instantly: * **Real-Time Analysis**: Checks code as your AI generates it * **Auto-Fix**: Get working fixes for security vulnerabilities and quality issues * **Custom Standards**: Enforce your team's architecture decisions and coding standards * **Multi-Layer Protection**: IDE checks, pre-commit hooks, and PR reviews work together [Learn more about how Zenable works →](/how-it-works) ## See It In Action ```python theme={null} # ❌ AI generates: def get_user(user_id): query = f"SELECT * FROM users WHERE id = {user_id}" # SQL injection risk return db.execute(query) # ✅ Zenable fixes: def get_user(user_id): query = "SELECT * FROM users WHERE id = ?" # Parameterized query return db.execute(query, (user_id,)) # Zenable caught SQL injection and auto-fixed ``` [See more examples →](/use-cases/preventing-ai-mistakes) ## Enterprise-Grade Features Upload your requirements, architecture decisions, and coding standards. Zenable automatically enforces them across your entire team. [Learn about policy as code →](/use-cases/policy-as-code) Automatically analyze and document existing codebases to identify security gaps, technical debt, and compliance issues. [Explore code assessment →](/use-cases/code-assessment) Instrument your SDLC with metrics, telemetry, and audit-ready evidence. Turn usage data into actionable reports that feed continuous improvement while doubling as compliance artifacts and performance KPIs. [View compliance features →](/use-cases/security-assessment) Analyze codebases for vulnerabilities, technical debt, and compliance gaps. Data-driven security insights across your entire application. [Explore security assessment →](/use-cases/security-assessment) ## Ready to Stop Shipping Bugs? Get started in 30 seconds See Zenable in action Discuss enterprise features # AWS SCP Source: https://docs.zenable.io/integrations/guardrails/aws-scp AWS Organization-level service control policies ## Overview AWS Service Control Policies enforce guardrails at the AWS account or organizational unit level. They act as permission boundaries in the cloud control plane, preventing actions regardless of IAM permissions. ## Capabilities * Organization-wide enforcement across all accounts * Allow-list and deny-list strategies that define permission boundaries * Condition-based controls (regions, services, encryption requirements) * Applies to all principals in target accounts (except the management account and service-linked roles) ## Limitations * Requires an AWS Organization with all features enabled * Only applicable to AWS cloud environments -- check out [Azure Policy](/integrations/guardrails/azure-policy) for Azure or [Google Cloud Organization Policy](/integrations/guardrails/gcp-org-policy) for Google Cloud environments * Cannot grant permissions, only restrict them ## Generated Format * **Language:** JSON * **Structure:** IAM policy documents with `Effect`, `Action`, `Resource`, and `Condition` fields * **Execution:** Applied via AWS Organizations console or API ## Example Guardrail ```json theme={null} { "Version": "2012-10-17", "Statement": [ { "Sid": "DenyUnencryptedS3PutObject", "Effect": "Deny", "Action": "s3:PutObject", "Resource": "*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } } ] } ``` Learn more at [AWS SCP documentation](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html). # Azure Policy Source: https://docs.zenable.io/integrations/guardrails/azure-policy Azure resource compliance enforcement ## Overview Azure Policy enforces compliance on Azure resources at the resource provider level. Policies evaluate resource properties during creation, updates, and on a regular compliance cycle, ensuring resources meet organizational standards. ## Capabilities * Enforce compliance at the Azure subscription or management group level * Multiple effects: `Deny`, `Audit`, `Modify`, `Append`, `DeployIfNotExists`, `AuditIfNotExists`, `DenyAction`, and `Disabled` * Built-in and custom policy definitions * Initiative (policy set) grouping for compliance standards ## Limitations * Requires an Azure subscription * Only applicable to Azure cloud environments -- check out [AWS SCP](/integrations/guardrails/aws-scp) for AWS or [Google Cloud Organization Policy](/integrations/guardrails/gcp-org-policy) for Google Cloud environments ## Generated Format * **Language:** JSON * **Structure:** Azure Policy definition with `policyRule` containing `if`/`then` conditions * **Execution:** Applied via Azure Portal, CLI, ARM templates, Bicep, Terraform, or REST API ## Example Guardrail ```json theme={null} { "properties": { "displayName": "Require minimum TLS 1.2 on storage accounts", "policyType": "Custom", "mode": "All", "parameters": {}, "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Storage/storageAccounts" }, { "field": "Microsoft.Storage/storageAccounts/minimumTlsVersion", "notEquals": "TLS1_2" } ] }, "then": { "effect": "deny" } } } } ``` Learn more at [Azure Policy documentation](https://learn.microsoft.com/en-us/azure/governance/policy/overview) and [policy definition structure](https://learn.microsoft.com/en-us/azure/governance/policy/concepts/definition-structure-basics). # Checkov Source: https://docs.zenable.io/integrations/guardrails/checkov Infrastructure-as-code static analysis ## Overview Checkov scans IaC source files for misconfigurations before deployment. It supports Terraform, CloudFormation, Kubernetes YAML, Dockerfiles, and other IaC formats. ## Capabilities * Static analysis of IaC files without requiring a build or deployment * Supports Terraform, CloudFormation, ARM templates, K8s manifests, Dockerfiles, Helm charts * Custom Python checks for organization-specific rules * Graph-based analysis for cross-resource relationships within IaC ## Limitations * Only applicable to IaC and config files -- check out [Semgrep](/integrations/guardrails/semgrep) or [CodeQL](/integrations/guardrails/codeql) for application source code * Does not test runtime infrastructure state -- check out [Goss](/integrations/guardrails/goss) for runtime validation ## Generated Format * **Language:** Python * **Structure:** Custom Checkov check classes extending `BaseCheck` * **Execution:** `checkov --external-checks-dir -d ` ## Example Guardrail ```python theme={null} from checkov.terraform.checks.resource.base_resource_check import BaseResourceCheck from checkov.common.models.enums import CheckResult, CheckCategories class S3EncryptionCheck(BaseResourceCheck): def __init__(self): name = "Ensure S3 bucket has server-side encryption" id = "CKV_CUSTOM_1" supported_resources = ["aws_s3_bucket"] categories = [CheckCategories.ENCRYPTION] super().__init__(name=name, id=id, categories=categories, supported_resources=supported_resources) def scan_resource_conf(self, conf): if "server_side_encryption_configuration" in conf: return CheckResult.PASSED return CheckResult.FAILED check = S3EncryptionCheck() ``` Learn more at [Checkov documentation](https://www.checkov.io/) and [custom Python policies](https://www.checkov.io/3.Custom%20Policies/Python%20Custom%20Policies.html). # CodeQL Source: https://docs.zenable.io/integrations/guardrails/codeql Semantic code analysis with cross-file data flow tracking ## Overview CodeQL builds a relational database from the entire codebase, then runs QL queries against it. This enables deep semantic analysis including cross-file data flow tracking, import analysis, and type hierarchy queries. ## Capabilities * Cross-file data flow and taint tracking * Control flow analysis across function boundaries * Import and type hierarchy queries * Security, correctness, and maintainability checks * Supports C/C++, C#, Go, Java/Kotlin, JavaScript/TypeScript, Python, Ruby, Rust, Swift ## Limitations * Requires a build process for compiled languages * Not applicable to infrastructure or runtime concerns -- check out [Checkov](/integrations/guardrails/checkov) or [Goss](/integrations/guardrails/goss) for infrastructure validation * Not suited for file organization/existence checks ## Generated Format * **Language:** CodeQL (QL) * **Structure:** Query files with metadata block (`@id`, `@name`, `@kind`, `@problem.severity` or `@security-severity`) and `from`-`where`-`select` clauses * **Execution:** Requires CodeQL CLI and a database built from the codebase ## Example Guardrail ```codeql theme={null} /** * @name SQL injection from user input * @description Untrusted data flows to SQL query * @kind path-problem * @id custom/sql-injection * @security-severity 9.0 * @precision high * @tags security */ import python import semmle.python.dataflow.new.TaintTracking module SqlInjectionConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr().(Call).getTarget().getName() = "input" } predicate isSink(DataFlow::Node sink) { sink.asExpr().(Call).getTarget().getName() = "execute" } } module SqlInjectionFlow = TaintTracking::Global; import SqlInjectionFlow::PathGraph from SqlInjectionFlow::PathNode source, SqlInjectionFlow::PathNode sink where SqlInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Untrusted input flows to SQL query" ``` Learn more at [CodeQL documentation](https://codeql.github.com/docs/), [writing queries](https://codeql.github.com/docs/writing-codeql-queries/about-codeql-queries/), and [query metadata](https://codeql.github.com/docs/writing-codeql-queries/metadata-for-codeql-queries/). # Conftest Source: https://docs.zenable.io/integrations/guardrails/conftest OPA-based configuration file testing with cross-file support ## Overview Conftest tests structured configuration data against Rego policies. It supports many config formats and can validate consistency across multiple files using the `--combine` flag. ## Capabilities * Tests YAML, JSON, HCL, Dockerfile, TOML, XML, INI, and many more formats * Cross-file analysis via `--combine` flag * `deny`, `warn`, and `violation` rule types * Structured error metadata via `violation` rules ## Limitations * Tests structured config data, not application source code -- check out [Semgrep](/integrations/guardrails/semgrep) or [CodeQL](/integrations/guardrails/codeql) for source code analysis * Does not test runtime infrastructure state -- check out [Goss](/integrations/guardrails/goss) for runtime validation ## Cross-File Analysis By default, conftest processes each file independently. The `--combine` flag merges all input files into a single array where each element has: * `path`: the file path * `contents`: the parsed file data This enables policies that correlate data across files -- e.g., verifying Deployment selectors match available Services, or ensuring config values are consistent across environments. ```bash theme={null} # Each file tested independently conftest test deployment.yaml service.yaml # Files combined into single input array for cross-file checks conftest test deployment.yaml service.yaml --combine ``` ## Generated Format * **Language:** Rego * **Structure:** Policy files in `package main` with `deny`/`warn` rules * **Execution:** `conftest test [--combine]` ## Example Guardrail ```rego theme={null} package main # Single-file check deny contains msg if { input.kind == "Deployment" not input.spec.template.spec.securityContext.runAsNonRoot msg := sprintf("Deployment %s must run as non-root", [input.metadata.name]) } # Cross-file check (requires --combine) deny contains msg if { some i input[i].contents.kind == "Deployment" deploy := input[i].contents not has_matching_service(deploy) msg := sprintf("Deployment %s has no matching Service", [deploy.metadata.name]) } has_matching_service(deploy) if { some j input[j].contents.kind == "Service" input[j].contents.spec.selector.app == deploy.spec.selector.matchLabels.app } ``` Learn more at [Conftest documentation](https://www.conftest.dev/) and [OPA Rego language](https://www.openpolicyagent.org/docs/latest/policy-language/). # ESLint Source: https://docs.zenable.io/integrations/guardrails/eslint Pluggable linting for JavaScript and TypeScript ## Overview ESLint is a pluggable static analyzer for JavaScript and TypeScript. Zenable generates an ESLint configuration that enables and configures the rules needed to enforce a requirement, drawing on core rules, plugin rules, and the `no-restricted-syntax` / `no-restricted-imports` selectors for bespoke patterns. ## Capabilities * Static analysis of JavaScript and TypeScript without running the code * Enforces code-quality, style, and security rules via core and plugin rules * Bans specific syntax, APIs, or imports with actionable messages * Configurable severity per rule (`off` / `warn` / `error`) ## Limitations * JavaScript and TypeScript only -- check out [Semgrep](/integrations/guardrails/semgrep) or [CodeQL](/integrations/guardrails/codeql) for other languages * Single-file analysis -- check out [CodeQL](/integrations/guardrails/codeql) for cross-file data-flow analysis * Not applicable to infrastructure or config files -- check out [Checkov](/integrations/guardrails/checkov) or [Conftest](/integrations/guardrails/conftest) * Does not test runtime state -- check out [Goss](/integrations/guardrails/goss) ## Generated Format * **Language:** JSON * **Structure:** An ESLint configuration object with a `rules` map (and `plugins` when plugin rules are used) * **Execution:** `eslint --config .json --format json ` ## Example Guardrail ```json theme={null} { "rules": { "no-restricted-syntax": [ "error", { "selector": "CallExpression[callee.name='eval']", "message": "eval() is forbidden; it enables code injection." } ], "eqeqeq": "error" } } ``` Learn more at the [ESLint documentation](https://eslint.org/docs/latest/) and the [rules reference](https://eslint.org/docs/latest/rules/). # OPA Gatekeeper Source: https://docs.zenable.io/integrations/guardrails/gatekeeper Kubernetes admission control via Rego policies ## Overview OPA Gatekeeper validates Kubernetes resources at admission using Rego policies. It extends Open Policy Agent for Kubernetes-native policy enforcement. ## Capabilities * Validate and mutate K8s resources at admission time via Rego * Constraint templates for reusable policy logic * Audit mode for detecting existing violations * Enforcement actions: `deny`, `dryrun`, and `warn` ## Limitations * Requires a Kubernetes cluster with Gatekeeper installed * Only applicable to Kubernetes workloads -- check out [Semgrep](/integrations/guardrails/semgrep) or [CodeQL](/integrations/guardrails/codeql) for application source code, or [Checkov](/integrations/guardrails/checkov) for IaC static analysis ## Generated Format * **Language:** YAML with embedded Rego * **Structure:** `ConstraintTemplate` with Rego in `spec.targets[].rego` and accompanying `Constraint` resource * **Execution:** Applied to a K8s cluster via `kubectl apply` ## Example Guardrail ```yaml theme={null} apiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate metadata: name: k8srequiredlabels spec: crd: spec: names: kind: K8sRequiredLabels validation: openAPIV3Schema: type: object properties: labels: type: array items: type: string targets: - target: admission.k8s.gatekeeper.sh rego: | package k8srequiredlabels violation[{"msg": msg}] { provided := {label | input.review.object.metadata.labels[label]} required := {label | label := input.parameters.labels[_]} missing := required - provided count(missing) > 0 msg := sprintf("Missing required labels: %v", [missing]) } --- apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: require-team-label spec: match: kinds: - apiGroups: [""] kinds: ["Namespace"] parameters: labels: ["team"] ``` Learn more at [OPA Gatekeeper documentation](https://open-policy-agent.github.io/gatekeeper/website/docs/) and [constraint templates](https://open-policy-agent.github.io/gatekeeper/website/docs/howto). # Google Cloud Organization Policy Source: https://docs.zenable.io/integrations/guardrails/gcp-org-policy Google Cloud resource-configuration compliance enforcement ## Overview Google Cloud's [Organization Policy Service](https://docs.cloud.google.com/organization-policy/overview) centralizes control over how resources can be configured across the Resource Manager hierarchy (organization → folder → project). It sets guardrails on **what** a resource may look like — restricting regions, services, and resource settings so teams can only create compliant resources. Zenable generates a **custom organization policy constraint**: a [CEL](https://docs.cloud.google.com/organization-policy/create-custom-constraints) condition evaluated against a strongly-typed representation of a resource when it is created or updated, with an `ALLOW` or `DENY` action. ## When this is a good choice | Requirement | Why Organization Policy fits | | - | - | | Prevent teams from creating or configuring noncompliant resources | Constraints evaluate create/update requests before the resource exists; a `DENY` blocks the noncompliant configuration outright. | | Restrict regions, public IPs, allowed services, or resource settings | The condition reads the resource's own fields and allow/deny-lists values. | | Write custom resource rules like Azure Policy definitions | Custom constraints are the Google Cloud equivalent — CEL over resource fields, checked on create/update. | | Audit-only / test before enforcement | The enforcing policy supports dry-run: violations are audit-logged without denying. | For AWS environments see [AWS SCP](/integrations/guardrails/aws-scp); for Azure see [Azure Policy](/integrations/guardrails/azure-policy). ## Capabilities * Enforce at the organization, folder, or project level; descendants inherit by default * CEL conditions over strongly-typed, service-specific `resource.*` fields * `ALLOW` (permit only when the condition is true) or `DENY` (block when the condition is true) * Enforced on `CREATE`, or `CREATE` and `UPDATE` * Dry-run / audit mode to preview impact before enforcement ## Limitations * Requires a Google Cloud organization (Resource Manager hierarchy) * Only applicable to Google Cloud environments * `UPDATE`-only constraints are not supported; most resource types allow up to 20 custom constraints ## Generated Format * **Language:** YAML * **Structure:** a single `CustomConstraint` document — `name` (`custom.`), `resourceTypes`, `methodTypes`, `condition` (CEL), `actionType`, and optional `displayName` / `description` * **Execution:** created with `gcloud org-policies set-custom-constraint`, then enforced by an organization policy (`enforce: true`, or `dryRunSpec` for audit mode) ## Example Guardrail ```yaml theme={null} name: custom.restrictComputeRegions resourceTypes: - compute.googleapis.com/Instance methodTypes: - CREATE - UPDATE condition: "resource.zone.startsWith('us-')" actionType: ALLOW displayName: Restrict Compute to US regions description: Only allow Compute instances created or updated in US zones. ``` Once created, an organization policy enforces the constraint across the chosen scope: ```yaml theme={null} name: projects/PROJECT_ID/policies/custom.restrictComputeRegions spec: rules: - enforce: true ``` Learn more at the [Organization Policy overview](https://docs.cloud.google.com/organization-policy/overview) and [Create custom constraints](https://docs.cloud.google.com/organization-policy/create-custom-constraints). # Goss Source: https://docs.zenable.io/integrations/guardrails/goss Server and container validation tests ## Overview Goss validates server and container state by testing system properties like installed packages, running processes, open ports, and file contents. Tests run against built artifacts or live systems. ## Capabilities * Test packages, files, ports, processes, services, users, groups, commands * Fast execution (written in Go) * YAML-based test definitions * Container image testing via `dgoss` ## Limitations * Requires a built container image or running server * Not applicable to source code analysis -- check out [Semgrep](/integrations/guardrails/semgrep) or [CodeQL](/integrations/guardrails/codeql) for source code checks * Tests runtime state, not code patterns ## Generated Format * **Language:** YAML * **Structure:** Goss test files with resource type sections (`package`, `file`, `port`, etc.) * **Execution:** `goss validate` or `dgoss run ` ## Example Guardrail ```yaml theme={null} package: openssl: installed: true versions: semver-constraint: ">=3.0.0" port: tcp:443: listening: true file: /etc/ssl/certs: exists: true filetype: directory process: nginx: running: true ``` Learn more at [Goss documentation](https://goss.readthedocs.io/) and [gossfile reference](https://goss.readthedocs.io/en/stable/gossfile/). # Kubernetes VAP Source: https://docs.zenable.io/integrations/guardrails/kubernetes-vap Native Kubernetes ValidatingAdmissionPolicies with CEL ## Overview Kubernetes ValidatingAdmissionPolicies (VAP) provide native admission control using CEL (Common Expression Language) expressions. Alpha in Kubernetes 1.26, beta in 1.28, and GA since 1.30, they validate resources without external webhook dependencies. ## Capabilities * Native K8s admission control (no external controllers needed) * CEL expressions for policy logic * Parameter resources for reusable, configurable policies * Audit and enforce modes ## Limitations * Requires Kubernetes 1.30+ for stable/GA support (alpha in 1.26, beta in 1.28) * Only applicable to Kubernetes workloads -- check out [Semgrep](/integrations/guardrails/semgrep) or [CodeQL](/integrations/guardrails/codeql) for application source code, or [Checkov](/integrations/guardrails/checkov) for IaC static analysis * CEL is less expressive than Rego for complex logic -- check out [OPA Gatekeeper](/integrations/guardrails/gatekeeper) if you need full Rego expressiveness ## Generated Format * **Language:** YAML (with CEL expressions) * **Structure:** `ValidatingAdmissionPolicy` and `ValidatingAdmissionPolicyBinding` resources * **Execution:** Applied to a K8s cluster via `kubectl apply` ## Example Guardrail ```yaml theme={null} apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: require-non-root spec: failurePolicy: Fail matchConstraints: resourceRules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["pods"] validations: - expression: "object.spec.containers.all(c, has(c.securityContext) && has(c.securityContext.runAsNonRoot) && c.securityContext.runAsNonRoot == true)" message: "All containers must set securityContext.runAsNonRoot to true" --- apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicyBinding metadata: name: require-non-root-binding spec: policyName: require-non-root validationActions: - Deny ``` Learn more at [Kubernetes ValidatingAdmissionPolicy documentation](https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/) and [CEL language spec](https://github.com/google/cel-spec). # Kyverno Source: https://docs.zenable.io/integrations/guardrails/kyverno Kubernetes admission controller policies ## Overview Kyverno validates and mutates Kubernetes resource manifests at admission time. Policies are written in YAML, making them accessible without learning a separate policy language. ## Capabilities * Validate, mutate, generate, and clean up K8s resources * YAML-native policies * Pattern-based matching with wildcards and anchors * Image verification and signature checking ## Limitations * Requires a Kubernetes cluster with Kyverno installed * Only applicable to Kubernetes workloads -- check out [Semgrep](/integrations/guardrails/semgrep) or [CodeQL](/integrations/guardrails/codeql) for application source code, or [Checkov](/integrations/guardrails/checkov) for IaC static analysis ## Generated Format * **Language:** YAML * **Structure:** Kyverno `ClusterPolicy` or `Policy` resources with `validate`/`mutate` rules * **Execution:** Applied to a K8s cluster via `kubectl apply` ## Example Guardrail ```yaml theme={null} apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: require-run-as-nonroot spec: rules: - name: run-as-non-root match: any: - resources: kinds: - Pod validate: failureAction: Enforce message: "Containers must run as non-root" pattern: spec: containers: - securityContext: runAsNonRoot: true ``` Learn more at [Kyverno documentation](https://kyverno.io/docs/) and [writing policies](https://kyverno.io/docs/policy-types/overview/). # Semgrep Source: https://docs.zenable.io/integrations/guardrails/semgrep Static analysis rules for pattern matching across many languages ## Overview Semgrep (and OpenGrep) uses YAML rules to find code patterns via Abstract Syntax Tree matching. Rules detect vulnerabilities, anti-patterns, and policy violations in application code, IaC, and config files. ## Capabilities * Pattern matching with metavariables (`$VAR`, `...`) * Taint mode for tracking data flow from sources to sinks within a function (cross-function and cross-file tracking available with [Semgrep Pro](https://semgrep.dev/docs/semgrep-code/semgrep-pro-engine-intro)) * Supports 35+ languages * Lightweight, fast execution with no build step required ## Limitations * Analyzes **one file at a time** by default -- cross-file analysis available with [Semgrep Pro](https://semgrep.dev/docs/semgrep-code/semgrep-pro-engine-intro) * Not applicable to runtime or infrastructure state checks -- check out [Goss](/integrations/guardrails/goss) for runtime validation, or [Checkov](/integrations/guardrails/checkov) for IaC static analysis If you've got a paid Semgrep subscription and are looking for multi-file support, please let us know at [zenable.io/feedback](https://www.zenable.io/feedback?utm_source=docs\&utm_medium=guardrails-semgrep). ## Generated Format * **Language:** YAML * **Structure:** Semgrep rule files with `id`, `message`, `severity`, `languages`, and pattern specification fields * **Execution:** `semgrep --config rule.yaml` ## Example Guardrail ```yaml theme={null} rules: - id: sql-injection-prevention mode: taint languages: [python] severity: HIGH message: User input flows to SQL query without sanitization pattern-sources: - pattern: request.args.get(...) pattern-sinks: - patterns: - pattern: cursor.execute($QUERY, ...) - focus-metavariable: $QUERY pattern-sanitizers: - pattern: sanitize(...) ``` Learn more at [Semgrep rule syntax](https://semgrep.dev/docs/writing-rules/rule-syntax), [pattern syntax](https://semgrep.dev/docs/writing-rules/pattern-syntax), and [supported languages](https://semgrep.dev/docs/supported-languages). ## Custom guardrails You can author your own semgrep / opengrep rules and have Zenable apply them alongside marketplace guardrails. Configure each custom guardrail directory under the engine it belongs to: ```yaml theme={null} guardrails: engines: semgrep: extras: custom_guardrail_dirs: - path: ~/.zenable/custom_guardrails/semgrep recurse: true opengrep: extras: custom_guardrail_dirs: - path: ~/.zenable/custom_guardrails/opengrep recurse: true ``` ### `metadata.category` Every custom rule must declare a `metadata.category` from the upstream semgrep set: `best-practice`, `correctness`, `maintainability`, `performance`, `portability`, or `security`. Zenable translates these to its own `FindingCategory` taxonomy at the boundary. Rules with `metadata.category: security` must also declare `confidence`, `likelihood`, `impact`, `subcategory`, `cwe`, `owasp`, `references`, `technology`, and `vulnerability_class` per the upstream [contributor requirements](https://semgrep.dev/docs/contributing/contributing-to-semgrep-rules-repository#fields-required-by-the-security-category). You can use the `zenable guardrail validate` command in order to confirm your custom rule is valid for Zenable guardrail use, for instance: ```bash theme={null} zenable guardrail validate opengrep ~/.zenable/custom_guardrails/semgrep/custom-no-eval.yaml ``` # MCP Server Installation Source: https://docs.zenable.io/integrations/mcp/getting-started Set up the Zenable MCP Server in your IDE using our automated installer ## Overview The Zenable MCP (Model Context Protocol) Server enables your AI coding assistant to automatically check and improve your code against your organization's requirements. **Your code is safe**: We never retain or train on your code, regardless of tier. [Read our FAQ](https://zenable.io/faq?utm_source=docs\&utm_medium=mcp-getting-started\&utm_content=faq) ## Quick Installation The easiest way to install the Zenable MCP server is using our automated installer: ```bash theme={null} # Install MCP server for all detected IDEs zenable install ``` Don't have the Zenable CLI? Install it first: ```bash theme={null} curl -fsSL https://cli.zenable.app/install.sh | bash ``` ```powershell theme={null} powershell -ExecutionPolicy Bypass -Command "irm https://cli.zenable.app/install.ps1 | iex" ``` Sometimes virus scanners [flag Go binaries as suspicious](https://go.dev/doc/faq#virus). All Zenable binaries are signed with a platform-appropriate approach, and every release ships with SHA-256 checksums that are always verified at install time. On Windows, the binary is Authenticode signed (Azure Trusted Signing) and that signature is always verified during installation. On Linux and macOS, the binary is [cosign](https://www.sigstore.dev/) signed and verified when cosign or Docker is available. If your scanner flags the binary, please report it to your antivirus vendor. **Want more features?** Check out [Professional](https://zenable.io/pricing?tier=pro\&utm_source=docs\&utm_medium=mcp-getting-started\&utm_content=pricing-pro) or [Enterprise](https://zenable.io/pricing?tier=enterprise\&utm_source=docs\&utm_medium=mcp-getting-started\&utm_content=pricing-enterprise) plans to unlock [advanced capabilities](https://zenable.io/pricing?tier=pro\&utm_source=docs\&utm_medium=mcp-getting-started\&utm_content=pro-features) and increase your weekly limits. This will automatically: * Detect your installed IDEs * Configure the MCP server for each IDE * Install hooks where supported * Provide IDE-specific post-installation instructions, as needed ## Supported IDEs ### Full Support ✅ The following IDEs are fully supported (via the MCP server, hooks, or both). Click each for detailed installation instructions: * **[Amp](/integrations/mcp/ide/amp)** * **[Cursor](/integrations/mcp/ide/cursor)** * **[Claude Code](/integrations/mcp/ide/claude-code)** * **[Codex](/integrations/mcp/ide/codex)** * **[Devin Desktop](/integrations/mcp/ide/devin-desktop)** * **[GitHub Copilot CLI](/integrations/mcp/ide/copilot)** * **[Goose](/integrations/mcp/ide/goose)** * **[Pi](/integrations/mcp/ide/pi)** (hooks only) * **[Kiro](/integrations/mcp/ide/kiro)** * **[VS Code](/integrations/mcp/ide/vscode)** * **[Antigravity](/integrations/mcp/ide/antigravity)** * **[Antigravity CLI](/integrations/mcp/ide/antigravity-cli)** * **[Auggie](/integrations/mcp/ide/auggie)** * **[OpenCode](/integrations/mcp/ide/opencode)** ### Enhanced Hook Support **[Claude Code](/integrations/mcp/ide/claude-code)**, **[Cursor](/integrations/mcp/ide/cursor)**, **[Devin Desktop](/integrations/mcp/ide/devin-desktop)**, **[Kiro](/integrations/mcp/ide/kiro)**, **[Auggie](/integrations/mcp/ide/auggie)**, **[OpenCode](/integrations/mcp/ide/opencode)** (via its plugin system), **[Antigravity CLI](/integrations/mcp/ide/antigravity-cli)**, **[Goose](/integrations/mcp/ide/goose)** (via its Open-Plugin-Spec hooks), and **[Pi](/integrations/mcp/ide/pi)** (via its extension system, hooks only) have additional support for hooks, enabling advanced automation workflows like automatic code checking after file edits and intelligent context management. **[Codex](/integrations/mcp/ide/codex)** has limited hook support (session start and stop only as of 2026-03-11). ## Installation Methods For IDE-specific installation instructions, see the [individual IDE guides](/integrations/mcp/getting-started#supported-ides). ### Method 1: Automated Installation (Recommended) ```bash theme={null} # Install globally for all projects (default) zenable install ``` This makes Zenable available across all your projects. **Want project-level installation?** Run `zenable install --project` from inside a git repository to install only for that project. ## Post-Installation After installation: 1. **Restart your IDE** to load the new configuration 2. **Verify the connection** - The Zenable MCP server should appear in your IDE's MCP tools. You may need to manually run an authentication command to initiate the login workflow. 3. **Test the integration** - Open the chat prompt and add a feature to a file, and see if recommendations appear **Need perfect consistency?** While most IDEs are good at following the installed instructions, Claude Code, Cursor, Devin Desktop, Kiro, Auggie, OpenCode, and Antigravity CLI provide deterministic hooks that ensure reliable code checking after every file edit. These hooks are automatically configured with the same `install` command from above. ## Advanced Options ### Install for Specific IDEs ```bash theme={null} # Single IDE zenable install cursor # Install Zenable for all supported IDEs on your system zenable install ``` ## Troubleshooting Common issues and solutions: The installer looks for IDE configuration files and installed applications. If your IDE isn't detected: 1. Make sure the IDE is installed 2. Try specifying it explicitly: `zenable install ` 3. Open an issue at [zenable.io/feedback](https://zenable.io/feedback?utm_source=docs\&utm_medium=mcp-getting-started\&utm_content=feedback) or email [support@zenable.io](mailto:support@zenable.io) 1. Restart your IDE completely 2. Check the configuration file location is correct 3. Validate JSON syntax in the configuration file 4. Check IDE logs for errors The MCP server reviews files that are **modified during the agent session** (between prompt submit and agent stop). Some scenarios result in files not being reviewed: * **File created then deleted**: If the agent creates a temporary file and removes it before stopping, there's nothing to review * **File reverted to original state**: If a file was modified before your prompt but the agent reverts it back to its original content, the file is no longer changed so there's nothing new to review * **File unchanged during session**: If a file was already dirty when you submitted your prompt but the agent didn't touch it, it won't be reviewed * **File created outside the workspace**: Files created or modified outside the IDE's configured workspace are not reviewed unless the IDE passes us those file paths * **File stashed without pop**: If the agent stashes changes and doesn't pop them back, the files aren't in the working tree and won't be reviewed These are expected behaviors — the MCP server focuses on what the agent actually changed during the current session. **For complete coverage**: Use [GitHub](/integrations/vcs-reviewers/github) or [GitLab](/integrations/vcs-reviewers/gitlab) PR/MR review bots alongside MCP hooks. The server-side bots review all changes in your pull/merge request, catching anything the MCP hooks might miss. If the agent performs a **rebase**, **merge**, or **git pull** during a session, the review may include files from upstream commits that the agent didn't write. This happens because the hook compares your code against a checkpoint taken at prompt submit time, and these operations bring in external commits that widen the diff. This is by design — reviewing extra files is safer than missing the agent's actual changes. The extra files automatically drop off on the next review cycle as the checkpoint advances past the merge/rebase point. Common triggers: * `git rebase main` — base branch files appear in diff * `git merge main` or `git pull` — upstream files appear in diff * `git cherry-pick` — cherry-picked commit's files appear in diff This is a one-time effect per operation. After the first review, subsequent reviews only include files the agent changed since the last review. For more detailed troubleshooting, see our [troubleshooting guide](/integrations/mcp/troubleshooting). ## Next Steps * Learn about the [MCP Server](/integrations/mcp/server) and the tools it exposes to your assistant * [Assess existing codebases](/use-cases/code-assessment) * [Configure policies](https://www.zenable.app?utm_source=docs\&utm_medium=mcp-getting-started\&utm_content=configure-policies) for your team # Amp Source: https://docs.zenable.io/integrations/mcp/ide/amp Set up the Zenable integration in Amp to run AI coding guardrails and conformance checks directly inside Sourcegraph's Amp agent. ## Quick Install ```bash theme={null} zenable install amp ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in Amp. *** The below is a minimal example. Consider using the quick install command to handle this automatically. ### Option 1: Using Amp CLI (Recommended) ```bash theme={null} # Add the MCP server amp mcp add zenable https://mcp.zenable.app/ # Approve the server (required for workspace-scoped servers) amp mcp approve zenable # Authenticate with Zenable amp mcp oauth login zenable \ --server-url https://mcp.zenable.app/ \ --client-id BwZkedovVV2bIPmxmK3crzdHmTdRqjv4 \ --auth-url https://zenable.us.auth0.com/authorize \ --token-url https://zenable.us.auth0.com/oauth/token \ --scopes "openid,profile,email" ``` ### Option 2: Manual Configuration File Add the following to your settings file: ```json theme={null} { "amp.mcpServers": { "zenable": { "url": "https://mcp.zenable.app/" } }, "amp.mcpPermissions": [ { "matches": { "url": "https://mcp.zenable.app/*" }, "action": "allow" } ], "amp.permissions": [ { "tool": "mcp__zenable_*", "action": "allow" } ] } ``` ```bash Global (all projects) theme={null} ~/.config/amp/settings.json ``` ```bash Project-specific theme={null} .amp/settings.json ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. For more details on MCP configuration in Amp, see the [Amp MCP documentation](https://ampcode.com/manual#mcp). # Antigravity Source: https://docs.zenable.io/integrations/mcp/ide/antigravity Set up the Zenable integration in Google Antigravity to enforce AI coding guardrails and conformance checks as you build. ## Quick Install ```bash theme={null} zenable install antigravity ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in Antigravity. *** * **Global installs**: Use the Antigravity CLI (`antigravity --add-mcp`) - works on all platforms * **Project installs**: Use file-based configuration at `/.vscode/mcp.json` ### Global Installation (CLI) For global installations, if you have the `antigravity` command available: ```bash theme={null} antigravity --add-mcp '{"name":"zenable","url":"https://mcp.zenable.app/","type":"http"}' ``` This works on all platforms (macOS, Windows, Linux). ### Project Installation (File) For project-level installations, place the following configuration: ```json theme={null} { "servers": { "zenable": { "type": "http", "url": "https://mcp.zenable.app/" } }, "inputs": [] } ``` In this file location within your repository: ```bash theme={null} /.vscode/mcp.json ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. # Antigravity CLI Source: https://docs.zenable.io/integrations/mcp/ide/antigravity-cli Set up the Zenable integration in Antigravity CLI, Google's successor to Gemini CLI, for AI coding guardrails and conformance checks in the terminal. Antigravity CLI is Google's successor to Gemini CLI. If you're migrating, see [Google's migration guide](https://antigravity.google/docs/gcli-migration). ## Quick Install ```bash theme={null} zenable install antigravity-cli ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in Antigravity CLI. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following configuration: ```json theme={null} { "mcpServers": { "zenable": { "serverUrl": "https://mcp.zenable.app/" } } } ``` In this file location: ```bash theme={null} ~/.gemini/antigravity-cli/mcp_config.json ``` For a project-scoped install, use `.agents/mcp_config.json` in your workspace instead. Only `serverUrl` is needed — Antigravity authenticates automatically via OAuth dynamic client registration. Trigger the login from Antigravity's MCP/Customizations settings (the "Authenticate" action) if prompted. We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. # Auggie Source: https://docs.zenable.io/integrations/mcp/ide/auggie Set up the Zenable integration in Auggie, Augment Code's CLI agent, to add AI coding guardrails and conformance checks. ## Quick Install ```bash theme={null} zenable install auggie ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in Auggie. This installs both the MCP server and Auggie hooks for real-time code checking. *** The below is a minimal example. Consider using the quick install command to handle this automatically. Use the Auggie CLI to add the Zenable MCP server: ```bash theme={null} auggie mcp add zenable --transport http --url https://mcp.zenable.app/ ``` To verify the installation: ```bash theme={null} auggie mcp list ``` To remove: ```bash theme={null} auggie mcp remove zenable ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. Hooks run automatically to check for conformance issues. The quick install command sets this up for you. Place the following configuration in `~/.augment/settings.json` (global) or `.augment/settings.json` (project): ```json theme={null} { "hooks": { "SessionStart": [ { "hooks": [ { "type": "command", "command": "zenable hook" } ] } ], "Stop": [ { "hooks": [ { "type": "command", "command": "zenable hook" } ] } ] } } ``` This uses [Auggie's hook system](https://docs.augmentcode.com/cli/hooks?utm_source=zenable_docs\&utm_medium=web) to run conformance checks at session boundaries. # Claude Code Source: https://docs.zenable.io/integrations/mcp/ide/claude-code Set up the Zenable integration in Claude Code to enforce AI coding guardrails and conformance checks in your terminal-based agent. ## Quick Install ```bash theme={null} zenable install claude ``` Requires Claude Code 1.0.58+. See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Restart Claude Code and start using Zenable's conformance checking in your AI coding assistant. This installs both the MCP server and Claude Code hooks for real-time code checking. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following configuration: ```json theme={null} { "mcpServers": { "zenable": { "type": "http", "url": "https://mcp.zenable.app/" } } } ``` In one of these file locations: ```bash Project theme={null} .mcp.json ``` ```bash Global theme={null} ~/.claude.json ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. Hooks run automatically after file edits to check for conformance issues. The quick install command sets this up for you. Place the following configuration in `.claude/settings.json` (project) or `~/.claude/settings.json` (global): ```json theme={null} { "hooks": { "PostToolUse": [ { "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "zenable hook" } ] } ] } } ``` This uses [Claude Code's PostToolUse hook](https://docs.anthropic.com/en/docs/claude-code/hooks) to run conformance checks after each file edit. # Codex Source: https://docs.zenable.io/integrations/mcp/ide/codex Set up the Zenable integration in OpenAI Codex to enforce AI coding guardrails and conformance checks. ## Quick Install ```bash theme={null} zenable install codex ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Restart Codex and start using Zenable's conformance checking in your AI coding assistant. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following configuration in `~/.codex/config.toml`: ```toml theme={null} experimental_use_rmcp_client = true [mcp_servers.zenable] type = "http" url = "https://mcp.zenable.app/" ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. Codex requires `experimental_use_rmcp_client = true` to be set in your config file to enable MCP server support with OAuth and HTTP streaming transport. # GitHub Copilot CLI Source: https://docs.zenable.io/integrations/mcp/ide/copilot Set up the Zenable integration in GitHub Copilot CLI to add AI coding guardrails and conformance checks. ## Quick Install ```bash theme={null} zenable install copilot ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in GitHub Copilot CLI. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following configuration: ```json theme={null} { "mcpServers": { "zenable": { "type": "http", "url": "https://mcp.zenable.app/", "tools": ["*"] } } } ``` In this file location: ```bash theme={null} ~/.copilot/mcp-config.json ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. # Cursor Source: https://docs.zenable.io/integrations/mcp/ide/cursor Set up the Zenable integration in Cursor to enforce AI coding guardrails and conformance checks as the agent writes code. ## Quick Install ```bash theme={null} zenable install cursor ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Restart Cursor and start using Zenable's conformance checking in your AI coding assistant. This installs both the MCP server and Cursor hooks for real-time code checking. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following configuration: ```json theme={null} { "mcpServers": { "zenable": { "type": "http", "url": "https://mcp.zenable.app/" } } } ``` In one of these file locations: ```bash Project theme={null} .cursor/mcp.json ``` ```bash Global theme={null} ~/.cursor/mcp.json ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. Hooks run automatically after file edits to check for conformance issues. The quick install command sets this up for you. Place the following configuration in `.cursor/hooks.json` (project) or `~/.cursor/hooks.json` (global): ```json theme={null} { "version": 1, "hooks": { "afterFileEdit": [ { "command": "zenable hook" } ] } } ``` This uses [Cursor's afterFileEdit hook](https://cursor.com/docs/agent/hooks) to run conformance checks after each file edit made by the AI agent. **Current Limitation:** Cursor's `afterFileEdit` hook cannot send output back to the agent or use exit codes to block edits. Conformance issues are printed to stdout for visibility in Cursor's hook output panel, but the agent won't automatically act on them. We're talking with the Cursor team about enhanced support. Cursor provides a CLI (`cursor-agent`) for managing MCP servers. After installation, you can use these commands: ```bash theme={null} # List configured MCP servers and their status cursor-agent mcp list # View tools provided by a specific server cursor-agent mcp list-tools zenable # Authenticate with an MCP server cursor-agent mcp login zenable # Disable a server cursor-agent mcp disable zenable ``` As of 2025.12.17-996666f, the Cursor CLI is read-only for MCP management (no `add`/`remove` commands). Configuration changes require editing `.cursor/mcp.json` directly or running `zenable install cursor`. See [Cursor's CLI MCP documentation](https://cursor.com/docs/cli/mcp) for more details. # Deprecated IDEs Source: https://docs.zenable.io/integrations/mcp/ide/deprecated IDE and agent integrations Zenable no longer supports, including Amazon Q Developer, with recommended replacements. This page lists IDE integrations that have been deprecated and are no longer supported. *** ## Amazon Q **Amazon Q Developer has been deprecated.** As of February 2026, Amazon has replaced Amazon Q Developer with [Kiro](https://kiro.dev/). The `q` CLI no longer exists. ### Migration to Kiro Zenable recommends all Amazon Q users migrate to Kiro, which has full Zenable support including MCP, hooks, and steering. #### Migration Resources * **AWS migration guide**: [Upgrade from Amazon Q to Kiro](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/upgrade-to-kiro.html) * **Kiro migration guide**: [Migrating from Q](https://kiro.dev/docs/cli/migrating-from-q/) * **Zenable Kiro support**: [Kiro IDE setup](/integrations/mcp/ide/kiro?utm_source=docs\&utm_medium=web) #### Quick Start with Kiro Once migrated, install Zenable for Kiro: ```bash theme={null} zenable install kiro ``` See the [Kiro installation guide](/integrations/mcp/ide/kiro?utm_source=docs\&utm_medium=web) for detailed setup instructions. *** ## Roo Code **Roo Code has been deprecated.** The upstream [RooCodeInc/Roo-Code](https://github.com/RooCodeInc/Roo-Code) repository was archived on May 15, 2026 and is no longer maintained. Roo Code has pivoted to focus on their cloud-hosted offering at [roomote.dev](https://roomote.dev/), and Zenable has removed support for it. Roo Code began as a fork of Cline. ### Resources * **Upstream repository (archived)**: [github.com/RooCodeInc/Roo-Code](https://github.com/RooCodeInc/Roo-Code) * **Cloud-hosted successor**: [roomote.dev](https://roomote.dev/) *** ## Continue **Continue has been deprecated.** [Cursor acquired Continue](https://www.continue.dev/) on June 15, 2026. Continue as a separately-supported IDE is no longer maintained, and Zenable has removed support for it. Cursor — which acquired Continue — has first-class Zenable support, including MCP and hooks. ### Resources * **Continue**: [continue.dev](https://www.continue.dev/) * **Cursor (still supported by Zenable)**: [Cursor IDE setup](/integrations/mcp/ide/cursor?utm_source=docs\&utm_medium=web) *** ## Windsurf **Windsurf has been deprecated.** [Cognition acquired Windsurf](https://devin.ai/blog/windsurf-is-now-devin-desktop) and rebranded it as Devin Desktop. Windsurf as a separately-supported IDE is no longer maintained; users are being migrated to Devin Desktop, and Zenable has removed support for it. ### Migration to Devin Desktop Devin Desktop is the direct successor to Windsurf, with the same Cascade agent surface now integrated into Cognition's Devin platform. Zenable supports Devin Desktop as a first-class IDE. #### Migration Resources * **Cognition announcement**: [Windsurf is now Devin Desktop](https://devin.ai/blog/windsurf-is-now-devin-desktop) * **Zenable Devin Desktop support**: [Devin Desktop setup](/integrations/mcp/ide/devin-desktop?utm_source=docs\&utm_medium=web) #### Quick Start with Devin Desktop Once migrated, install Zenable for Devin Desktop: ```bash theme={null} zenable install devin-desktop ``` See the [Devin Desktop installation guide](/integrations/mcp/ide/devin-desktop?utm_source=docs\&utm_medium=web) for detailed setup instructions. *** ## Gemini CLI **Gemini CLI has been replaced by [Antigravity CLI](/integrations/mcp/ide/antigravity-cli?utm_source=docs\&utm_medium=web).** Google is transitioning Gemini CLI into Antigravity CLI, the terminal experience for its [Antigravity](https://antigravity.google/) platform. As of June 18, 2026, Gemini CLI stops serving the Google AI Pro, Ultra, and free Gemini Code Assist tiers. Organizations on a Gemini Code Assist Standard or Enterprise license keep access. ### Migration to Antigravity CLI Antigravity CLI keeps the workflow-defining features of Gemini CLI and continues to read your `GEMINI.md` and `AGENTS.md` context files. For MCP, servers move to a dedicated `mcp_config.json` and remote servers use the `serverUrl` field (not the deprecated `httpUrl`). Zenable fully supports Antigravity CLI. #### Migration Resources * **Google migration guide**: [Migrating from Gemini CLI](https://antigravity.google/docs/gcli-migration) * **Zenable Antigravity CLI support**: [Antigravity CLI setup](/integrations/mcp/ide/antigravity-cli?utm_source=docs\&utm_medium=web) #### Quick Start with Antigravity CLI Once migrated, install Zenable for Antigravity CLI: ```bash theme={null} zenable install antigravity-cli ``` See the [Antigravity CLI installation guide](/integrations/mcp/ide/antigravity-cli?utm_source=docs\&utm_medium=web) for detailed setup instructions. # Devin Desktop Source: https://docs.zenable.io/integrations/mcp/ide/devin-desktop Set up the Zenable integration in Devin Desktop, Cognition's rebrand of Windsurf, for AI coding guardrails and conformance checks. [Devin Desktop](https://devin.ai/blog/windsurf-is-now-devin-desktop?utm_source=zenable_docs\&utm_medium=web) is Cognition's rebrand of Windsurf — the IDE built around the [Devin local-agent harness](https://docs.devin.ai/desktop/devin-local.md?utm_source=zenable_docs\&utm_medium=web). ## Quick Install ```bash theme={null} zenable install devin-desktop ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Restart Devin Desktop and start using Zenable's conformance checking. This installs both the MCP server and Devin Desktop hooks for real-time code checking. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following in `~/.config/devin/config.json` (global) or `.devin/config.json` (project) — paths documented at [docs.devin.ai/cli/extensibility/mcp/configuration](https://docs.devin.ai/cli/extensibility/mcp/configuration.md?utm_source=zenable_docs\&utm_medium=web): ```json theme={null} { "mcpServers": { "zenable": { "type": "http", "url": "https://mcp.zenable.app/" } } } ``` On Windows the global path is `%APPDATA%\devin\config.json`. We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. Hooks run automatically to check for conformance issues. The quick install command sets this up for you. Devin Desktop hooks are Claude-Code-compatible (same event names + payload shape) per [docs.devin.ai/cli/extensibility/hooks/overview](https://docs.devin.ai/cli/extensibility/hooks/overview.md?utm_source=zenable_docs\&utm_medium=web). Place the following in `.devin/hooks.v1.json` (project scope) — the recommended standalone hook file: ```json theme={null} { "PreToolUse": [ { "matcher": "*", "hooks": [ { "type": "command", "command": "zenable hook || true" } ] } ], "PostToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "zenable hook" } ] } ], "UserPromptSubmit": [ { "hooks": [ { "type": "command", "command": "zenable hook" } ] } ], "Stop": [ { "hooks": [ { "type": "command", "command": "zenable hook" } ] } ] } ``` For global scope, place the same `hooks` object under a `"hooks"` key in `~/.config/devin/config.json` (or `%APPDATA%\devin\config.json` on Windows) — see [docs.devin.ai/cli/extensibility/hooks/lifecycle-hooks](https://docs.devin.ai/cli/extensibility/hooks/lifecycle-hooks.md?utm_source=zenable_docs\&utm_medium=web) for the full event catalog. # Goose Source: https://docs.zenable.io/integrations/mcp/ide/goose Set up the Zenable integration in Goose — MCP server plus hooks — to enforce AI coding guardrails and conformance checks as the agent writes code. ## Quick Install ```bash theme={null} zenable install goose ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in Goose. Goose is an open-source AI agent (CLI + desktop), an [Agentic AI Foundation (AAIF) project](https://aaif.io/projects/goose/). `zenable install goose` installs both the MCP server (in your Goose `config.yaml`) and a managed Open-Plugin-Spec plugin that runs Zenable's conformance checks throughout your coding session. *** The below is a minimal example. Consider using the quick install command to handle this automatically. Goose stores MCP servers under the top-level `extensions` key, using `type: streamable_http` for streamable-HTTP servers. Goose's MCP config is global. See [Goose's extensions docs](https://goose-docs.ai/docs/getting-started/using-extensions/?utm_source=zenable_docs\&utm_medium=web) for the full schema. Place the following in `~/.config/goose/config.yaml`: ```yaml theme={null} extensions: zenable: type: streamable_http name: zenable uri: https://mcp.zenable.app/ description: Zenable governance, guardrails, and conformance checks enabled: true ``` Goose requires `name` and `description` on a `streamable_http` extension — without them Goose silently skips the entry. We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. Goose's documented hooks surface is the [Open-Plugin-Spec](https://goose-docs.ai/blog/2026/05/14/goose-hooks/?utm_source=zenable_docs\&utm_medium=web) plugin format. `zenable install goose` writes a managed plugin (at `~/.agents/plugins/zenable/hooks/hooks.json`, with a `.plugin/plugin.json` manifest) that integrates Zenable's governance, guardrails, and observability across your coding sessions. The plugin can live globally (`~/.agents/plugins/`) or project-scoped (`/.agents/plugins/`). The plugin subscribes to the `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, and `Stop` events — checkpointing your work as you go and running a Zenable conformance review when the agent finishes a turn. On the `Stop` event, Zenable returns a blocking decision so Goose feeds the message back to the agent — findings to fix, or a prompt to sign in when the review could not run — instead of ending the turn. Hooks require **Goose v1.37.0 or newer** — that's the release that honors blocking `Stop` hook decisions. On older Goose the review still runs but its message to the agent is silently dropped, so `zenable install goose` enforces this minimum. The plugin file is fully managed — every `zenable install` / `zenable sync` rewrites it. If you want to add your own Goose plugins, drop a separate plugin alongside it under `~/.agents/plugins/`. # Kiro Source: https://docs.zenable.io/integrations/mcp/ide/kiro Set up the Zenable integration in Kiro, AWS's agentic IDE, to enforce AI coding guardrails and conformance checks. ## Quick Install ```bash theme={null} zenable install kiro ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Restart Kiro and complete OAuth authentication when prompted. Then start using Zenable's conformance checking in your AI coding assistant. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following configuration: ```json theme={null} { "mcpServers": { "zenable": { "type": "http", "url": "https://mcp.zenable.app/" } } } ``` In one of these file locations: ```bash Project theme={null} .kiro/settings/mcp.json ``` ```bash Global theme={null} ~/.kiro/settings/mcp.json ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. ## About Kiro MCP Support Kiro now supports remote MCP servers with OAuth authentication using modern streaming HTTP. This means Zenable works seamlessly with Kiro without any special configuration or exceptions. For more details on MCP in Kiro, visit the [Kiro MCP documentation](https://kiro.dev/docs/mcp/). # OpenCode Source: https://docs.zenable.io/integrations/mcp/ide/opencode Set up the Zenable integration in OpenCode to add AI coding guardrails and conformance checks via its remote MCP and plugin system. ## Quick Install ```bash theme={null} zenable install opencode ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in OpenCode. This installs both the MCP server (in `opencode.json`) and a managed plugin (in your OpenCode `plugins/` directory) that runs Zenable's conformance checks throughout your coding session. *** The below is a minimal example. Consider using the quick install command to handle this automatically. OpenCode stores MCP servers under the top-level `mcp` key with `"type": "remote"` for streamable-HTTP servers. See [OpenCode's MCP docs](https://opencode.ai/docs/mcp-servers/?utm_source=zenable_docs\&utm_medium=web) for the full schema. ### Global Place the following in `~/.config/opencode/opencode.json`: ```json theme={null} { "$schema": "https://opencode.ai/config.json", "mcp": { "zenable": { "type": "remote", "url": "https://mcp.zenable.app/" } } } ``` ### Project Place the same configuration in `opencode.json` at your repository root. We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. OpenCode's documented extensibility surface is the [plugin system](https://opencode.ai/docs/plugins/?utm_source=zenable_docs\&utm_medium=web). `zenable install opencode` writes a managed plugin file (at `~/.config/opencode/plugins/zenable.ts` for global installs or `.opencode/plugins/zenable.ts` for project installs) that integrates Zenable's governance, guardrails, and observability across your coding sessions. The plugin file is fully managed — every `zenable install` / `zenable sync` rewrites it. If you want to add your own OpenCode plugins, drop a separate file alongside it; OpenCode loads every `*.ts` / `*.js` under the plugins directory. # Pi Source: https://docs.zenable.io/integrations/mcp/ide/pi Set up the Zenable integration in Pi to enforce AI coding guardrails and conformance checks via its hooks-equivalent extension API. ## Quick Install ```bash theme={null} zenable install pi ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Start using Zenable's conformance checking in Pi. Pi has no native MCP server configuration — its only extensibility surface is its extension API. `zenable install pi` writes a managed Pi extension that runs Zenable's conformance checks throughout your coding session. *** Pi's documented extensibility surface is its [extension API](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/extensions.md?utm_source=zenable_docs\&utm_medium=web) (`pi.on(...)` event handlers). `zenable install pi` writes a managed extension file (at `~/.pi/agent/extensions/zenable.ts` for global installs, or `.pi/extensions/zenable.ts` for project installs) that checkpoints your work as you go and runs a Zenable conformance review when the agent finishes a turn. The extension file is fully managed — every `zenable install` / `zenable sync` rewrites it. If you want to add your own Pi extensions, drop a separate file alongside it; Pi loads every `*.ts` under the extensions directory. # VS Code Source: https://docs.zenable.io/integrations/mcp/ide/vscode Set up the Zenable integration in VS Code to enforce AI coding guardrails and conformance checks across your editor's AI features. ## Quick Install ```bash theme={null} zenable install vscode ``` See the [CLI command reference](/integrations/zenable/commands#install) for more options. **That's it! You're all set.** Restart VS Code and start using Zenable's conformance checking in your AI coding assistant. This installs both the MCP server and VS Code Copilot agent hooks for real-time code checking. Hooks rely on VS Code's [Preview hooks API](https://code.visualstudio.com/docs/copilot/customization/hooks?utm_source=zenable_docs\&utm_medium=web), so the format may change in future releases. *** The below is a minimal example which may need to be merged with your existing configuration. Consider using the quick install command to handle this automatically. Place the following configuration: ```json theme={null} { "servers": { "zenable": { "type": "http", "url": "https://mcp.zenable.app/" } }, "inputs": [] } ``` In one of these file locations: ```bash Project theme={null} .vscode/mcp.json ``` ```bash Windows theme={null} %APPDATA%\Code\User\mcp.json ``` ```bash Linux theme={null} ~/.config/Code/User/mcp.json ``` ```bash macOS theme={null} ~/Library/Application Support/Code/User/mcp.json ``` We only recommend this manual approach if you can't use `zenable install`. Otherwise, `zenable install` is much safer and can handle configuration upgrades over time, handles merges with existing configs, performs backups and logging in case of issues, and more. Hooks run automatically at session boundaries to check for conformance issues. The quick install command sets this up for you. VS Code's Copilot agent hooks are project-level only. Place the following in `.github/hooks/zenable.json`: ```json theme={null} { "hooks": { "UserPromptSubmit": [ { "type": "command", "command": "zenable hook" } ], "Stop": [ { "type": "command", "command": "zenable hook" } ], "PostToolUse": [ { "type": "command", "command": "zenable hook" } ], "PreToolUse": [ { "type": "command", "command": "zenable hook || true" } ] } } ``` This uses [VS Code's Copilot agent hooks](https://code.visualstudio.com/docs/copilot/customization/hooks?utm_source=zenable_docs\&utm_medium=web) to run conformance checks. The `|| true` on `PreToolUse` keeps it non-blocking — Zenable hooks never deny tool calls. # MCP Server Source: https://docs.zenable.io/integrations/mcp/server The Zenable MCP Server lets you manage requirements and guardrails, without ever leaving your IDE ## Overview The Zenable MCP (Model Context Protocol) Server lets your AI coding assistant check and improve code against your organization's requirements, and manage those requirements, guardrails, and scopes without leaving the IDE. The same tools are available in the in-app chat assistant, so a conversation that starts in chat can continue from your IDE and vice versa. **Your code is safe**: We never retain or train on your code, regardless of tier. [Read our FAQ](https://zenable.io/faq?utm_source=docs\&utm_medium=mcp-server\&utm_content=faq) To install the MCP server, see [MCP Server Installation](/integrations/mcp/getting-started). ## MCP Tools ### `get_requirements` Retrieve tenant and marketplace requirements. Supports filtering by lifecycle status, enforcement mode, scope, and search query. ### `get_guardrails` Locate the policy-as-code guardrails enforcing requirements. Useful for inspecting current rules or finding an id to regenerate or roll back. ### `get_scopes` List built-in and tenant-defined scopes that decide where a requirement applies. Call this before creating a new requirement or scope. ### `get_findings` Retrieve detailed findings for the caller's tenant. Supports repository, category, enforcement mode, lifecycle status, quality, requirement, file path, recipient, and date filters. ### `get_agent_feedback` Read agent triage feedback for a requirement, guardrail, or finding. ### `get_human_feedback` Read human ratings and rubric feedback for a requirement. ### `create_requirement` Author a new requirement at a caller-chosen initial `lifecycle_status` (one of `proposed`, `beta`, or `stable`). Picking `proposed` submits it for separate user acceptance before it becomes effective; `beta` and `stable` publish directly at that maturity. ### `create_scope` Define a new reusable scope when nothing in `get_scopes` matches the surface you want to govern. ### `update_requirement` Edit or version a tenant-owned requirement. ### `update_marketplace_requirement` Create a tenant override for a marketplace requirement, or publish a new marketplace version when the caller has marketplace publish access. ### `regenerate_guardrail` Ask Zenable to produce an improved version of a guardrail using specific feedback such as false positives, missing coverage, or style. Costs **550 credits** per regeneration; running the resulting guardrail is free. See [credit cost per tool call](/plans-and-usage#credit-cost-per-tool-call). ### `reinstate_prior_guardrail_version` Roll a guardrail back to a prior version. ### `restore_requirement` Restore a soft-deleted tenant-owned requirement. # Troubleshooting Source: https://docs.zenable.io/integrations/mcp/troubleshooting Common issues and solutions for the Zenable MCP Server integration. ## Overview This guide helps you resolve common issues with the Zenable MCP Server integration in your IDE. ## Video Tutorial