Skip to content
Back to skills

Sg Create Policy

ASecurity

Guided flow for creating (and adjusting) a StackGuardian policy with the create_policy / update_policy tools — walks the user through scope (which workflows), the rule source (inline Tirith document, marketplace policy template, or a git repo of Rego/Tirith), the verdict mapping (block / warn / require approval), and approvers, then creates the policy. Use when the user wants a guardrail, a policy, a compliance check on Terraform plans, a cost limit, or an approval gate on infrastructure chan...

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 16, 2026
ai-agentsgoexpressterraformgit

Security analysis

A100/100

Scanned October 16, 2026

npx -y skills add StackGuardian/stackguardian-mcp --skill sg-create-policy --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Sg Create Policy?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Sg Create Policy
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/stackguardian-sg-create-policy/badge)](https://www.skillsdirectory.com/skills/stackguardian-sg-create-policy)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: sg-create-policy
description: Guided flow for creating (and adjusting) a StackGuardian policy with the create_policy / update_policy tools — walks the user through scope (which workflows), the rule source (inline Tirith document, marketplace policy template, or a git repo of Rego/Tirith), the verdict mapping (block / warn / require approval), and approvers, then creates the policy. Use when the user wants a guardrail, a policy, a compliance check on Terraform plans, a cost limit, or an approval gate on infrastructure changes.
---

# Create Policy — Guided Flow

Create a StackGuardian policy with the `create_policy` tool.
Follow the steps IN ORDER. Never ask the user to type ids from memory —
fetch options with the listed tools and present choices. In user-facing
messages use plain language; never surface parameter names like
`enforcedOn`, `onFail`, `policyInputData`.

A policy is a named set of RULES. Each rule checks one thing (a Tirith
document, a Rego repo, or a marketplace template) and says what happens
when it trips. The policy as a whole is attached to a SCOPE.

## Step A — What should the policy check?

Ask what the user wants to enforce. Map it to a rule source:

1. **Marketplace template** (first choice when one fits): call
   `search_marketplace_templates(templateType='IAC_POLICY', searchQuery=<topic>)`
   and `get_subscription(['IAC_POLICY'])`. Present names + descriptions;
   the pick's pinned `ResourceId` ('/owner/name:N') becomes
   `{"type": "template", "templateId": ...}`. Always pin a numeric
   revision.
2. **Inline Tirith document** for a specific Terraform-plan or cost check
   the user describes (e.g. "S3 buckets must be private", "EC2 monthly cost
   under 100"). Build `{"type": "inline", "document": {...}}` with
   `meta.required_provider` = `stackguardian/terraform_plan` (plan checks)
   or `stackguardian/infracost` (cost checks); evaluators with a unique
   `id`, `provider_args`, and a `condition` from Equals / NotEquals /
   ContainedIn / NotContainedIn / Contains / NotContains / GreaterThan /
   GreaterThanEqualTo / LessThan / LessThanEqualTo / IsEmpty / IsNotEmpty /
   RegexMatch; and an `eval_expression` over the ids. Show the user the
   check in words before calling.
3. **Git repository** of Rego (`kind: OPA_REGO`, needs `opaQuery`, e.g.
   `main.allow` — never `data.main.allow`, never `main.deny`) or a
   `tirith.json` (`kind: SG_POLICY_FRAMEWORK`). Ask whether the repo is
   private; if so, the credential is a connector or secret POINTER —
   offer the org's VCS connectors (the tool returns `availableVcsConnectors`
   on a miss). Never put a raw token in `auth`.

Rule `name` is a slug (letters, digits, `_`, `-`).

## Step B — What happens when a rule trips?

Ask per rule and set `onFail`:
- "block the deployment" → `FAIL`
- "just warn" → `WARN`
- "pause for someone to approve" → `APPROVAL_REQUIRED` → go to Step D
Leave `onPass` as `PASS` unless the user explicitly wants otherwise.

## Step C — Where does it apply?

Offer exactly these options and set `enforcedOn`:
- **Whole organization** → `["*"]`. Confirm explicitly: it applies to every
  workflow and stack.
- **Workflow group(s)** → resolve with
  `search_orchestrator_resources(resourceTypes=['WORKFLOW_GROUP'], searchQuery=...)`;
  pass the ResourceName or the last segment of the ResourceId. Nested
  groups are covered by their parent.
- **Specific workflow(s)** → `search_workflows(searchQuery=...)`; pass the
  full `/wfgrps/<group>/wfs/<workflow>` path (a bare workflow name never
  matches).
- **Cloud connector(s)** → `/integrations/<connector>`: every workflow
  deploying through that account/subscription/project.

`enforcedOn` is required; never default it silently.

## Step D — Approvals (only if any rule uses APPROVAL_REQUIRED)

Ask who may approve (user emails) → `approvers`, and how many must
approve → `numberOfApprovalsRequired` (0 means all of them). Both are
required together. Note to the user: an approval that fires on a
workflow's last step is skipped by the platform, so plan-only workflows
never pause.

## Step E — Name, describe, create

Ask for a name (letters, digits, `_`, `-`; it becomes the permanent id),
an optional description and tags. Before calling `create_policy`, check
`search_policies(searchQuery=<name>)` for duplicates. Then call
`create_policy(resourceName, rules, enforcedOn, description, tags,
approvers, numberOfApprovalsRequired)`.

Relay the response's `summary` sentences and `warnings` to the user in
plain language. On an error with an `available*` list, present the options
and re-call — never guess.

## Adjusting a policy later

Use `update_policy(policyId, ...)`:
- change scope: `addEnforcedOn` / `removeEnforcedOn` (or `enforcedOn` to
  replace the whole scope);
- change rules: `addRules` / `replaceRules` (by rule name) / `removeRules`;
- change approvers: `approvers` + `numberOfApprovalsRequired` together;
- rename / describe / tag: `resourceName`, `description`, `tags`.
The response's `changed` map shows exactly what moved. Find the policy
first with `search_policies`.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.