Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

IaC-Guard-V

IaC-Guard-V is a fail-closed verifier for infrastructure-as-code changes. It asks a more specific question than a scanner: did this candidate change resolve the bound finding without hiding evidence, deleting the target, introducing a regression, or turning operational uncertainty into success?

0.1.0a1 is a Checkov-focused technical alpha.

Source-independent Checkov alpha path

This is the supported native alpha path for trusted local input. It uses copied-file environments created without bundled pip, installs with --no-compile, and relies on the wheel's RECORD-bound startup policy to prevent runtime bytecode. No cache cleanup or hidden environment variable is required; specifically, users do not need to export PYTHONDONTWRITEBYTECODE=1. The hardened hostile-input container is not released.

On macOS, the Apple or another framework Python may report that it cannot create a virtual environment without symlinks. Do not remove --copies: install a standalone, uv-managed Python and use it for the two protected environments:

brew install uv
uv python install 3.12
ALPHA_PYTHON="$(uv python find --managed-python 3.12)"

On a Python installation that already supports copied-file environments, use:

ALPHA_PYTHON="$(command -v python3)"
rm -rf dist build
find . -maxdepth 2 -type d -name '*.egg-info' -prune -exec rm -rf {} +
python3 -m pip install --upgrade pip
python3 -m pip install 'build>=1.2,<2'
python3 -m build --outdir dist

"$ALPHA_PYTHON" -m venv --copies --without-pip .venv-iac-guard
"$ALPHA_PYTHON" -m venv --copies --without-pip .venv-checkov330
python3 -m pip --python .venv-iac-guard/bin/python install --no-compile \
  dist/iac_guard_v-0.1.0a1-py3-none-any.whl
python3 -m pip --python .venv-checkov330/bin/python install --no-compile \
  'checkov==3.3.0'

.venv-iac-guard/bin/iac-guard doctor \
  --mode local-trusted \
  --checkov-executable "$PWD/.venv-checkov330/bin/checkov"
.venv-iac-guard/bin/iac-guard demo \
  --real \
  --local-trusted \
  --checkov-executable "$PWD/.venv-checkov330/bin/checkov" \
  --format console \
  --output ./iac-guard-report.json
# IaC-Guard-V: VERIFIED
# exit_code: 0
# targets:
#   CKV_AWS_53 aws_s3_bucket_public_access_block.example: FIXED
# scanner integrity: PASS
# regressions: none
# policy: VERIFIED

Real verification may remain quiet for several minutes while Checkov runs and IaC-Guard-V captures and validates its output. 0.1.0a1 prints the conclusion only after that evidence is complete; do not interpret the quiet period as a hung process. The external macOS smoke completed with VERIFIED in approximately three minutes.

Exit codes are 0 VERIFIED, 1 FAILED, 2 invalid request, 3 INCONCLUSIVE, and 4 unexpected internal error. The saved file is canonical validated report-v1 even when console output is selected. Native local-trusted mode is reduced isolation: use it only for operator-controlled input. Advanced config workflow remains available for reproducible automation.

demo --real reads the example from the installed wheel, so the command above works from an otherwise empty directory and does not require a Git source checkout. To verify your own before/after directories, use the same installed environments:

.venv-iac-guard/bin/iac-guard verify \
  --before ./my-before \
  --after ./my-after \
  --all-baseline-findings \
  --framework terraform \
  --local-trusted \
  --checkov-executable "$PWD/.venv-checkov330/bin/checkov" \
  --output ./iac-guard-report.json

Use an exact selector when a repository contains multiple occurrences or when only one baseline finding should be verified:

.venv-iac-guard/bin/iac-guard verify \
  --before ./my-before \
  --after ./my-after \
  --target CKV_AWS_53=aws_s3_bucket_public_access_block.example \
  --framework terraform \
  --local-trusted \
  --checkov-executable "$PWD/.venv-checkov330/bin/checkov" \
  --output ./iac-guard-report.json

After publication, replace the local wheel path with iac-guard-v==0.1.0a1 in the same pip --python ... install --no-compile command. The packaged demo --real command then remains source-independent; ordinary verify consumes directories supplied by the user. Run doctor and the real demo again without cache cleanup—the release gate tests that installed sequence twice.

Project status

Area Status
Frozen QRS 2026 research snapshot Bound to commit 7646d5930832cc7a6b4dcd7c59de57a6c50fc4b5 and MANIFEST_ROOT a42cf0184aa345e50603caeed2c9035f3da45bc636c950633d766566f5e9b7b3; public CI reconstructs and verifies the local-only annotated freeze tag, which is not published.
Hardened product core Typed differential evidence, fail-closed report validation, Checkov 3.3.0 integration, and deterministic reporters.
Checkov-focused alpha The supported initial product focus; package version 0.1.0a1.
KICS, Trivy, OpenTofu, kubeconform, and TFLint Experimental and advisory; their agreement cannot change the final verdict.
Hardened production container and Action Not released.

There are no external-adoption, production-readiness, or multi-scanner-consensus claims. The control catalog has zero EXACT mappings and is not ready for validated- discrepancy screening.

Exact raw stdout/result hashes and durations remain run-specific provenance. The release test requires stable semantic evidence and deterministic reporter projections while preserving those exact raw identities.

doctor --mode local-trusted succeeds when the Checkov alpha is usable; doctor --mode hardened-container remains inconclusive until that image exists. Multi-scanner evidence remains experimental and advisory.

The two environments are intentional: Checkov 3.3.0 installs bc-python-hcl2, while the product's protected Terraform parser is python-hcl2. Installing both distributions over the same hcl2 package files breaks wheel-RECORD provenance and is rejected.

The wheel contains product code, schemas, and protected bundled oracle policy. It does not contain the paper, benchmark, stored runs, research datasets, experiment scripts, or test-only evidence capabilities.

Other alpha commands

Direct Git pull-request verification

The Git-aware path reads exact objects into private temporary trees and does not change the current checkout, index, branch, or worktree. --changed-only restricts target selection; regression coverage still uses the complete candidate snapshot.

.venv-iac-guard/bin/iac-guard pr \
  --repository . \
  --base-ref origin/main \
  --head-ref HEAD \
  --all-baseline-findings \
  --changed-only \
  --framework terraform \
  --local-trusted \
  --checkov-executable "$PWD/.venv-checkov330/bin/checkov" \
  --format sarif \
  --output ./iac-guard.sarif

Offline demo

demo is deterministic, requires neither Checkov nor Docker, and creates no trusted verification evidence:

iac-guard demo
iac-guard demo --format json

Console demo shows illustrative VERIFIED, FAILED, SUPPRESSED, and INCONCLUSIVE states. Its JSON OFFLINE_DEMO_ONLY report remains non-evidentiary. demo --real --local-trusted runs the packaged Checkov example through the public verification path.

Explain an existing report

explain validates the complete report-v1 evidence graph before rendering it. It does not create or change verification evidence:

iac-guard explain report.json

Contradictory or forged reports are rejected as invalid requests.

Advanced pinned configuration

For operator-controlled local input, initialize an explicit reduced-isolation request:

iac-guard init \
  --baseline ./before \
  --candidate ./after \
  --target CKV_AWS_53=aws_s3_bucket_public_access_block.example \
  --framework terraform \
  --execution-mode reduced-isolation \
  --checkov-executable "$(command -v checkov)" \
  --output ./iac-guard.config.json

The workflow commands all enter the same sealed-snapshot and protected-policy verifier:

iac-guard scan --config ./iac-guard.config.json --format json
iac-guard differential --config ./iac-guard.config.json --format markdown
iac-guard pr --changed-only --config ./iac-guard.config.json --format sarif

scan remains a differential report-v1 workflow in this alpha: its config names both the trusted baseline and candidate. pr --changed-only additionally requires every selected target file to have changed, then the normal verifier independently reseals both complete snapshots.

Create a deterministic local environment record with:

iac-guard lock \
  --config ./iac-guard.config.json \
  --output ./iac-guard.lock.json

The alpha lock is labelled LOCK_RECORD_NOT_VERIFICATION_EVIDENCE; it cannot be submitted as scanner evidence or make a verdict trusted. Hardened-container lock creation remains unavailable until that image is reviewed and released.

Validated report-v1 input can be projected as json, console, sarif, markdown, or junit where the command accepts --format. Reporters never reinterpret a target outcome, and JUnit represents uncertainty as skipped/error rather than success.

Verdicts and exit codes

Result Exit Meaning
VERIFIED 0 Every required protected predicate passed.
FAILED 1 The candidate is definitely invalid or failed policy.
Invalid request/configuration 2 The invocation or protected configuration is malformed.
INCONCLUSIVE / operational uncertainty 3 Required evidence is missing, partial, unsupported, or unverifiable.

Uncertainty is never reported as a successful test.

Security boundaries and current limitations

  • Public CLI/config/API inputs cannot submit raw scanner results, precomputed policy decisions, oracle results, validator-universe results, callbacks, or trust claims.
  • Native reduced-isolation is for trusted local input only.
  • The production fully offline hardened container and composite GitHub Action are not released; their native-Linux UID/bind-mount gate remains pending.
  • Multi-scanner and deterministic-oracle evidence remains advisory. V7 consensus is disconnected from final verdicts.
  • .tf.json remains explicitly unsupported/inconclusive end to end.
  • The kubeconform schema bundle has licence status NOASSERTION and is not publicly redistributed.
  • IaC-Guard-V does not defend against hostile Python already executing inside its trusted interpreter.

See SECURITY.md for reporting guidance and docs/spec/THREAT_MODEL.md for the detailed model.

Research snapshot

The QRS 2026 artifact is historical evidence, not the current hardened product. Its scanner of record is Checkov 3.2.517, while the alpha product contract uses Checkov 3.3.0. The stored experiment outputs are never re-labelled as hardened-engine runs.

See RESEARCH_SNAPSHOT.md for the manifest root, replay contract, limitations, and exact offline verification commands. The pre-peer-review manuscript has been submitted to arXiv, but its public identifier is still pending. No placeholder identifier or broken link is published. The Springer Version of Record and DOI will be linked when they become available.

Contributing and roadmap

Citation

Citation metadata for the accepted QRS 2026 paper and this software is in CITATION.cff. The arXiv submission is pending public availability. Once Springer publishes the Version of Record, its DOI and publisher page will become the primary paper citation; an available arXiv preprint may remain as a separate accessible manuscript link.

License

IaC-Guard-V is licensed under the Apache License 2.0. Third-party tools are not bundled and retain their own licences and trademarks.

Release files for iac-guard-v 0.1.0a1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for iac-guard-v 0.1.0a1
File Size Uploaded
iac_guard_v-0.1.0a1.tar.gz 240.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for iac-guard-v 0.1.0a1
File Interpreter ABI Platform
iac_guard_v-0.1.0a1-py3-none-any.whl Python 3 none any Details

Total release size: 489.6 kB

Release files / iac_guard_v-0.1.0a1.tar.gz

Download URL iac_guard_v-0.1.0a1.tar.gz
Size 240.7 kB
Tags Source
SHA-256 checksum
How to use checksums
2237087355d580c3d14a2a73d8bea21a958e6a4f31e9dbbb5e9684570d3db904
BLAKE2b-256 checksum
How to use checksums
e612a0a56630a06479be82003c563b5eed914ed84841d8de0aafc16792bf9201
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 21, 2026.

Transparency log

Release files / iac_guard_v-0.1.0a1-py3-none-any.whl

Download URL iac_guard_v-0.1.0a1-py3-none-any.whl
Size 248.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cef195ecd950f12b8ef40c5f30c6d72761aa346902df3fc91c7e17b65ff5ce49
BLAKE2b-256 checksum
How to use checksums
dea623e13ed5634d62c60f7df59380c35e3b74d344860b19e63f06c06ab57edb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 21, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page