curl -fsSL https://stackguardian.github.io/tirith/skill.sh | sh
# then, in your agent:
"Add a Tirith policy gate to our pipeline"
Any agent with a shell
Reads the real schema
You review the PR
Plug IaC governance into any pipeline you already run. Policies are JSON, not a program in Rego or Python. Tirith evaluates the plan on your own runner, enforces one policy set across repositories when you want one, and returns a single verdict before the change is applied.
Your IaC tool produces the plan, Tirith checks it, and the exit code decides.
1
Your IaC tool plans
tofu show -json tfplan > plan.json
2
Tirith reads the plan
-input-path plan.json
3
Policies test the change
commit rules under .tirith/policies
4
CI continues or stops
--fail-on-error, so a violation exits 3
.claude/skills/tirith-policies/
# 1 · give the agent the vocabulary, once per repository
curl -fsSL https://stackguardian.github.io/tirith/skill.sh | sh
# 2 · then ask for the gate, in your own words
"Add a Tirith policy gate to our pipeline"
Covers every target in the tabs beside this one, so the agent writes for whichever it finds. It carries the install, the plan export and the exit-code contract.
Change the threshold below and watch the verdict update.
SPECIMENstackguardian/terraform_plan
CHANGE THE RULE
condition.value100 GiBLessThanEqualTo
20500
CHANGE THE DOCUMENT
1{2"meta": {3"version": "v1",14"required_provider": "stackguardian/terraform_plan"5 },6"evaluators": [7 {8"id": "volume_within_limit",9"description": "No volume may exceed the standard size",210"provider_args": {11"operation_type": "attribute",12"terraform_resource_type": "aws_ebs_volume",13"terraform_resource_attribute": "size"14 },315"condition": {16"type": "LessThanEqualTo",17"value": 10018 }19 }20 ],21"eval_expression": "volume_within_limit"22}
provider returns one value per matching resource instanceReference →
stdoutexit 3
$ tirith --fail-on-error -policy-path policy.json -input-path plan.jsonCheck: volume_within_limit FAILED 1. PASSED: `40` is less than equal to `100` 2. PASSED: `60` is less than equal to `100` 3. FAILED: `120` is not less than or equal to `100` 4. FAILED: `400` is not less than or equal to `100` 5. PASSED: `90` is less than equal to `100` 6. FAILED: `320` is not less than or equal to `100` 7. PASSED: `30` is less than equal to `100` 8. FAILED: `160` is not less than or equal to `100` 9. FAILED: `440` is not less than or equal to `100` 10. PASSED: `45` is less than equal to `100`Passed: 0 Failed: 1 Skipped: 0Final expression used:-> volume_within_limit$ echo $?3
Which resource failed?
The CLI output lists the tested values, but not their resource addresses. tirith ui maps the values back to the resources below.
1aws_ebs_volume.api_data40 GiB
2aws_ebs_volume.cache60 GiB
3aws_ebs_volume.search_index120 GiB
4aws_ebs_volume.metrics_cold400 GiB
5aws_ebs_volume.ledger_primary90 GiB
6aws_ebs_volume.media_ingest320 GiB
7aws_ebs_volume.session_store30 GiB
8aws_ebs_volume.registry_layers160 GiB
9aws_ebs_volume.warehouse_spill440 GiB
10aws_ebs_volume.vault_data45 GiB
This browser demo uses sample plan.json data and a Tirith-compatible evaluator. The policy syntax, messages, and exit codes mirror Tirith; install Tirith to evaluate real input documents.
Start with one rule.
A catalogue covers the mistakes everyone makes. Pick the rule only you can state: something your team already checks by hand.
Tirith is built in the open by StackGuardian engineers and external contributors. It is licensed under Apache 2.0 and governed publicly. Contributions do not need to be large: a tested policy, a CI example for an underserved system, or a reproducible bug report can be far more valuable than a star.
Influence our roadmap by asking for a feature or watching for releases.