Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
5818d6a
fix(core): three correctness fixes, plus policy metadata passthrough
refeed Aug 1, 2026
ba5b58a
feat(platform): add `tirith platform check`
refeed Aug 3, 2026
d24ac62
fix(platform): scrub HCL literals from configuration
refeed Aug 3, 2026
3b8fcd9
fix(platform): mask sensitive_attributes paths, and name the state do…
refeed Aug 3, 2026
43490ff
fix(platform): rank approval-required above warned
refeed Aug 3, 2026
18cb6c3
feat(platform): region key, document discovery, and the shared upload…
refeed Aug 4, 2026
c9bc8c5
feat(platform): record the source repo, and clean up the archive afte…
refeed Aug 5, 2026
cbc397c
fix(platform): do not send an unset folder on the upload URL
refeed Aug 5, 2026
d627143
refactor: rename the terraform action policy-only -> tirith-check
refeed Aug 5, 2026
041d5f9
fix(platform): rebuild planned_values so costing and Checkov work, an…
refeed Aug 5, 2026
9d0cc81
fix(report): render Checkov findings, which came out as an empty block
refeed Aug 5, 2026
7a9ba2a
docs(roadmap): reflect what shipped, and correct three claims that ar…
refeed Aug 5, 2026
1a7f6c7
feat(platform): retain the project archive for the autofix system
refeed Aug 5, 2026
bc55f12
feat(platform): publish the masked state as the workflow's tfstate.json
refeed Aug 5, 2026
b514635
feat(platform): never lose the policy gate to an oversized archive
refeed Aug 5, 2026
5de1fe6
feat(report): say which commit the findings describe
refeed Aug 6, 2026
b758b52
chore: drop files this branch never meant to carry, and format
refeed Aug 6, 2026
1c0ea9f
refactor(platform): name the action, and carry the archive in a conte…
refeed Aug 6, 2026
7ea3132
docs: name the mode consistently after the rename
refeed Aug 6, 2026
3254658
refactor(platform): send the archive as a run field; approvals warn, …
refeed Aug 6, 2026
d0ed11c
style: satisfy pydocstyle in the platform client
refeed Aug 7, 2026
a47f63a
fix(platform): close three masking leaks and three ways a verdict wen…
refeed Aug 7, 2026
df57513
fix(platform): only fail on unreadable facts when nothing answered
refeed Aug 7, 2026
31c6277
fix(platform): close the --plan-file half of the archive leak, and na…
refeed Aug 7, 2026
3561460
refactor(platform): stop sending policyInputKind
refeed Aug 7, 2026
2dbd2b0
fix(platform): mask a show -json state, which shipped in plaintext
refeed Aug 7, 2026
afcaf44
refactor(platform): run the policy step as a pre-plan step, not a ter…
refeed Aug 10, 2026
288a5b6
refactor(platform): fix the policy step template, dropping --step-tem…
refeed Aug 10, 2026
ad27edb
docs(platform): --step-template-id overrides the policy step, not ter…
refeed Aug 10, 2026
4e2f807
docs(platform): name the archive field terraformProjectZip
refeed Aug 10, 2026
86df010
feat(platform): deliver the bundle through the artifacts volume, not …
refeed Aug 10, 2026
9c8605a
feat(platform): name the bundle per commit, sent per run
refeed Aug 10, 2026
a48f61a
docs(platform): the upload key is informational, not load-bearing
refeed Aug 11, 2026
eeaf998
refactor(platform): name the run stage tirith-iac-governance
refeed Aug 11, 2026
1b8eba0
fix(platform): mask secrets in provider-computed mirrors too
refeed Aug 11, 2026
38d163b
chore: drop unrelated scratch files this branch swept in
refeed Aug 11, 2026
a53d53f
feat(platform): tell the step whether the workflow manages its state
refeed Aug 11, 2026
87e4258
fix(platform): suppress the VCS checkout per run, keep it on the work…
refeed Aug 11, 2026
33b6828
fix(platform): hide the bundles behind __sg., and render a finding wi…
refeed Aug 11, 2026
d6aaa5d
Revert the __sg. bundle prefix
refeed Aug 11, 2026
eb72613
docs: document platform check and exit codes, and stop the generated …
refeed Aug 11, 2026
a0c878e
Update platform-check.md
refeed Aug 11, 2026
065cb73
docs: put the flag wording in the CLI, where the reference page copie…
refeed Aug 12, 2026
326a387
feat(platform): give the bundle a shape -- code/ under a prefix, and …
refeed Aug 12, 2026
04fb161
feat(cli): let the local surface gate, and refine the README
refeed Aug 12, 2026
29193a4
refactor(cli): rename `platform check` to `remote check`
refeed Aug 12, 2026
1860c6b
refactor(cli): drop the `platform` alias -- rename it outright
refeed Aug 12, 2026
1aa515c
fix(platform): stop the URL sanitizer leaking, and correct the exit-c…
refeed Aug 12, 2026
d37a387
Drop the unrelated ansible/jq/jmespath files from this PR
refeed Aug 12, 2026
7749056
fix: address the remaining review findings
refeed Aug 12, 2026
f7f7999
Drop the unrelated ansible/jq/jmespath files from this PR, properly
refeed Aug 12, 2026
e051c39
docs: lead with the gate, not with the reason it used to be missing
refeed Aug 12, 2026
0f7a707
fix: make CI green -- a version-fragile test of mine, and Black on th…
refeed Aug 12, 2026
aba013f
ci: pin Black, and format to the version the tree actually uses
refeed Aug 12, 2026
78deb1f
fix(platform): a nonexistent --source-dir must fail, not degrade
refeed Aug 12, 2026
cd01f64
fix(redact): sweep computed mirrors out of state documents too (pente…
refeed Aug 12, 2026
77200b3
fix(report): make plan-derived strings inert in the rendered report (…
refeed Aug 12, 2026
00911fe
Revert the subcommand back to `tirith platform check`
refeed Aug 12, 2026
4aa0a37
docs: reposition Tirith as an IaC Governance plugin
refeed Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,11 @@ jobs:
with:
options: "--check"
src: "."
# Pinned. `psf/black@stable` resolves to whatever Black is newest at the time the job runs,
# so a Black release reformats the world and this check goes red on every open branch with
# nothing in the repository having changed. That is what happened here: main last passed
# this job in November 2025 and fails it today, on 14 files nobody touched.
#
# 25.1.0 is the release the tree is actually formatted for -- verified by running it against
# origin/main, which comes back clean. Bump it deliberately, in a commit that reformats.
version: "25.1.0"
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,52 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).




## [1.2.0] - 2026-08-03

### Added
- `tirith platform check`: run an organization's policies against a plan, state or arbitrary JSON
document from CI or a laptop. Masks the document locally, packs it with the terraform source into
an archive, uploads it, creates a StackGuardian run, polls it and reports the verdict as JSON
and/or markdown. The uploaded bundle carries the source under `code/` and a `metadata.json`
describing the repository, the commit and where in the repository `code/` belongs.
- `--fail-on-error` on the local surface too, so evaluating policy files without an account can gate
a merge. Off by default: the local form has always exited 0 either way, and changing that silently
would turn existing green pipelines red.
- `ExitStatus.ERROR_POLICY_FAILED` (3), so a caller can tell "a policy said no" from "tirith could
not tell you". Both surfaces use the same code for the same meaning. Note this applies **only**
with `--fail-on-error`; without it the local form still exits 0 for everything, including a policy
it could not evaluate.

### Changed
- `cli.main(args=...)` is now honoured. It previously called `parse_args()` with no argument, so
the parameter was ignored and the CLI could only ever read `sys.argv`.

### Notes
- The local evaluation surface is unchanged, including its single-dash long options. Subcommands
are dispatched before the flat parser sees anything, so `--json` output stays byte-identical.
- No new runtime dependencies: the platform integration is stdlib-only.

## [1.1.0] - 2026-08-01

### Added
- `core`: Policy metadata passthrough — `meta.id`, `meta.name`, `meta.description`,
`meta.severity`, `meta.enforcement`, `meta.tags` and `meta.remediation` now reach the result
document when a policy declares them. Keys that are absent are omitted, so the output of a
policy declaring none of them is unchanged. `{{ var.x }}` substitution works in all of them.

### Fixed
- `core`: Variable substitution no longer mutates the caller's policy dictionary. Evaluating the
same parsed policy more than once (a policy set, or a retry) previously leaked substituted
values from one evaluation into the next.
- `core`: An unsupported `condition.type` now populates `result` instead of returning without it,
which raised `KeyError` in the pretty printer far from the real cause.
- `core`: Provider errors reported without a `ProviderError` severity are now surfaced instead of
being discarded and `None` evaluated against the condition — a typo'd `operation_type` read as
a genuine policy violation. These are treated as malformed provider calls and are deliberately
not subject to `error_tolerance`.

## [1.0.5] - 2025-11-19

### Fixed
Expand Down
Loading
Loading