Checkov and Tirith: Where Each Fits in Your IaC Policy Pipeline
Keep the Checkov scans you trust, add Tirith for your own rules, and see how StackGuardian enforces both centrally and flags pipelines that skip them.
Keep the Checkov scans you trust, add Tirith for your own rules, and see how StackGuardian enforces both centrally and flags pipelines that skip them.
Most platform teams do not choose between a security scanner and a policy engine. They already run one, usually Checkov, and discover a second category of rule the scanner was never meant to own: the operating conventions of their own organisation. Who owns this resource? Does this change fit the budget? Is every repository enforcing the same version of the rule?
This post is not a head-to-head. It explains where Checkov fits, where Tirith fits, how the two sit in one pipeline, and at what point shared governance through StackGuardian becomes the more important question. Product status was checked on 28 September 2026 against Tirith 1.2.1 and the public documentation linked at the end.

An encrypted, private bucket can still lack the ownership tag your incident process depends on. A technically valid plan can exceed the monthly cost limit your finance partner agreed. A team can run the right checks in one repository while another repository runs a copy of the policy that was last updated a year ago.
None of these are failures of security scanning. They are governance problems that sit alongside it, and they are specific to how your organisation operates. That is the gap worth being precise about.
To be fair to Checkov: it can express custom rules too, in Python or declarative YAML, including graph checks across resource relationships. The case for Tirith does not rest on Checkov being unable to inspect plans, block CI or enforce custom policies. It rests on Tirith’s authoring workflow, its providers for different infrastructure documents, and its optional connection to StackGuardian.
The useful question is not which tool wins but which job you are trying to do.
Use Checkov when you want an established catalogue of built-in checks, broad coverage of IaC source formats, and resource-relationship analysis. Add Tirith when its JSON policy model and workflow fit the rules your team needs to write, review and maintain. Connect StackGuardian when the bigger problem is making sure those checks run everywhere: it can take over enforcement of both Checkov and Tirith centrally and show you where they are missing.

The table below compares the right layers: Checkov OSS, Tirith OSS, and StackGuardian running either or both. Commercial capabilities are identified separately. Checkov also integrates with Prisma Cloud, which has its own runtime and governance capabilities.
|
Need |
Checkov OSS |
Tirith OSS |
With StackGuardian |
|
Broad baseline scanning |
Established built-in checks across many IaC formats |
Explicit policies you write; a bundled baseline pack is still an open PR |
Enforces Checkov centrally, either every check or selected rules |
|
Terraform plan checks |
Yes, including change actions and changed fields |
Yes, with typed plan operations and per-resource results |
Evaluates uploaded plans against scoped organisation policies |
|
Custom rules |
Python and declarative YAML; attribute and graph checks |
Declarative JSON with built-in conditions and logical expressions |
Central policy scope and management |
|
Inputs beyond a plan |
Broad native parsers, including Kubernetes and CI configuration |
Providers for Infracost, Kubernetes, workflow definitions and generic JSON/YAML |
Plan, optional state and cost documents attached to a run |
|
Author and debug |
Policy development and graph-based rule tooling |
Beta interface with form builder, result explorer and playground; lint and format commands |
MCP server can supply platform context to an agent drafting rules |
|
Share across teams |
External checks can be loaded from a shared Git repository |
Distribute policy files through your own Git and CI conventions |
Central enforcement of Checkov and Tirith, without each team adding them to its pipeline |
|
Find pipelines without checks |
Not in scope for the CLI |
Not in scope for the CLI |
Reports pipelines where Checkov or Tirith is not applied |
|
Run without a service |
Yes, local CLI |
Yes, local CLI; no StackGuardian account needed |
Explicit authenticated connection; evaluation runs in StackGuardian |
|
Govern execution and day 2 |
Additional tooling or the commercial platform |
Your existing CI and operational tooling |
Approvals, credentials, private runners and day-2 features, depending on the connected workflow |
A note on enforcement: neither CLI makes a gate unavoidable by itself. Configure CI to stop on failure, protect the required checks, and make sure apply uses the exact plan that was evaluated.
Tirith gives policy authors one consistent JSON structure: choose a provider, select the value or operation, then state the condition. The beta interface in Tirith 1.2.1 helps build policies and inspect the resource behind a failure, and lint catches an invalid policy structure before you need a plan. Checkov’s YAML policies are declarative too, so the honest test is practical: write the same operating requirement in each and compare the authoring and review experience for your team.
Infrastructure decisions involve more than a Terraform plan. They involve an Infracost estimate, a Kubernetes manifest or a CI workflow definition. Tirith supplies providers for each. A plan policy can require an ownership tag while a separate cost policy checks an Infracost total. That is a consistent authoring approach across inputs; a single rule that joins several documents is still roadmap work.
Tirith at scale connects scheduled cloud checks with preventive Tirith policies, so a misconfiguration found in a running account can become a rule that stops the same mistake in the next plan. The StackGuardian MCP server exposes workflows, templates, policy attachments and run information to an authorised agent, and Tirith’s policy-authoring skill guides that agent to draft policy JSON against the real schema.
The value is specific to you: your ownership identifiers, the conventions your templates establish, the mistakes you do not want to repeat. Generated rules still need human review and both passing and failing test cases. An LLM drafts; the deterministic evaluator decides whether a change passes.
Illustrative scenario. A team already runs Checkov on its Terraform plan. The selected security checks pass. The organisation also requires an ownership tag on every resource and a monthly cost limit. This is an example of complementary configuration, not a benchmark, and not evidence that Checkov cannot express these rules.

|
Stage |
What happens |
Why it matters |
|
1. Existing checks |
Checkov runs the selected security checks |
Your existing security investment keeps its role |
|
2. Your own rule |
The organisation requires an owner tag that this plan omits |
The reason to stop the change comes from your operating requirements |
|
3. Enforced decision |
Tirith reports the failure; CI blocks apply because enforcement is enabled |
The policy has a visible consequence in the pipeline you already run |
|
4. Fix and recheck |
Add the tag, regenerate the plan and repeat the same checks |
A human or an agent can propose the fix; the gate still decides |
|
5. Shared evidence |
Platform mode records the run and its policy results |
Teams gain a shared record beyond an individual pull request |
Install Tirith 1.2.1 from the pinned Git tag documented in the repository. The bare PyPI package named tirith is a different project.
pip install "git+https://github.com/StackGuardian/tirith.git@1.2.1" tirith --version
A minimal plan policy for the ownership rule in the scenario, adapted from the example in Tirith’s policy-authoring skill. Test it against a plan that should pass and one that should fail before you rely on it.
{
"meta": {
"version": "v1",
"required_provider": "stackguardian/terraform_plan",
"name": "Every resource carries an owner tag"
},
"evaluators": [{
"id": "owner_tag_present",
"description": "Every taggable resource declares an owner tag",
"provider_args": {
"operation_type": "attribute",
"terraform_resource_type": "*",
"terraform_resource_attribute": "tags.owner"
},
"condition": {"type": "IsNotEmpty"}
}],
"eval_expression": "owner_tag_present"
}With Terraform initialised and the reviewed policy saved as policy.json, place the check between plan and apply. This sequence stops on any error and applies the saved binary plan rather than re-planning:
set -e terraform plan -out=tfplan -input=false terraform show -json tfplan > plan.json tirith -policy-path policy.json -input-path plan.json --fail-on-error terraform apply -input=false tfplan
Treat plan artifacts as sensitive and protect the CI workflow that consumes them. Tirith does not yet provide built-in plan identity verification, so reusing the saved plan and protecting the required checks remain your responsibility.
One rule in one repository is a good start. The question changes when that rule belongs in fifty repositories: who owns it, how is a new version rolled out, and where can you see every result, including the repositories that are not running it at all?

Running checks inside each team’s pipeline has a weak point: enforcement depends on every team adding the step, keeping it current and not switching it off. StackGuardian supports Checkov as well as Tirith, so you can move Checkov out of individual pipelines and into the platform. From there you can enforce Checkov as a whole or only the rules you select, alongside your Tirith policies, and control both centrally instead of relying on each team to wire them in.
StackGuardian also reports on the gaps: pipelines where Checkov or Tirith is not being applied. That turns “we think every repository runs the checks” into a list of the ones that do not.
If you are not ready to move enforcement, platform mode is a lighter first step. Your pipeline keeps running Tirith, sends the evaluation to StackGuardian and gets the result back, and StackGuardian retains the run evidence and policy results. Broader controls, such as credential brokering, private execution, drift detection and recovery, require the appropriate platform workflow, permissions and state or execution connection; they are not side effects of installing the CLI.
Start with one repository and one rule that matters, then map how Tirith at scale and StackGuardian can take over enforcement for the wider organisation. You choose when to move execution into the platform.
Checkov and Tirith are not competing for the same slot in a pipeline. Checkov covers broad security scanning well. Tirith gives you a declarative, reviewable way to enforce the rules that only your organisation cares about, across plans, cost estimates, Kubernetes and workflow files. StackGuardian becomes relevant when both need to run everywhere: it can enforce Checkov and Tirith centrally, show where they are missing, and keep the evidence.
A useful first step is to ask one question: which infrastructure rule do your engineers still check by hand, and how do you know every repository enforces it? Try Tirith on that rule in your existing CI, or bring your pipeline to a StackGuardian engineer to map what shared governance would look like.
Add it if Tirith’s policy-authoring experience, or the path to shared StackGuardian governance, solves a real gap for you. Keep Checkov’s scanning either way; StackGuardian can run both. If Checkov plus your existing CI already handles your rules, distribution and evidence well, there may be no immediate reason to add another tool.
Yes. StackGuardian supports Checkov as well as Tirith. You can enforce Checkov as a whole or only selected rules from the platform, control it centrally rather than relying on each team to add it to their pipelines, and see reports of pipelines where Checkov or Tirith is not applied.
Often, yes. Checkov supports Python and YAML custom policies, graph relationships and shared checks loaded from Git. Compare the effort to author, explain, validate, distribute and operate your actual rules. Tirith’s value is in how those policies are authored, understood and operated alongside StackGuardian.
No. Tirith’s local evaluator is Apache-2.0 and works without an account. Platform mode is optional and evaluates against your StackGuardian organisation. Existing apply jobs can stay in place.
Not today through this integration; it is reported as a warning. Use your CI’s own approval gate where needed, or an appropriately configured StackGuardian execution workflow. A recorded approval request is not the same as enforced human approval.
Human-authored and agent-authored changes can pass through the same configured gate. Agents can help draft policies or propose fixes, but review, tests and deterministic evaluation remain essential. Neither tool can guarantee a change is safe beyond the checks and inputs it actually evaluates.
Checked on 28 September 2026. Tirith 1.2.1 is the latest stable release; it includes the beta interactive interface, lint and format commands and richer result context. Still in development: predefined policy packs (PR #364), PyPI publishing (PR #284), native YAML policy authoring, mixed-provider and multi-document rules, plan identity verification, richer before/after predicates, and external CI approval coordination. An open PR or issue is not a shipped capability. Directly initiating infrastructure execution from Tirith is labelled planned on the Tirith at scale page; check availability, configuration and entitlement for your deployment.
Related reading: IaC security best practices: policy enforcement in Terraform workflows and Terraform MCP Server: what it is and how it works.