What ships today · v0.14

What audytx does

Concrete capabilities, with examples. Everything below works on a real PR — or from your coding agent over MCP — right now, and all of it is free.

How it shows up in a PR

The product surface, top to bottom.

One PR comment per push

Shipped

Posted within seconds of PR open or push. Severity-sorted, with findings folded into a collapsible <details> block past the summary. Updates in place on every push — never spammed as a new comment.

One-click fixes + a sound autofix loop

Shipped

Findings carry a fix_snippet; precisely line-anchored ones post as GitHub one-click suggestions. The same soundness gate powers autofix_terraform over MCP — it applies only fixes it can anchor exactly, re-scans, and loops until clean. Never a corrupting edit.

Visible reasoning block

Shipped

Every finding the engine suppresses appears in a 🧠 audytx reasoned about N findings block — with the rule ID, resource address, and the axis that drove the decision. You audit the engine's calls without reading its source. This is the differentiator: dismissals carry their rationale.

SARIF v2.1.0 → GitHub Code Scanning

Shipped

The same findings upload as SARIF to GitHub's Security tab. Context suppressions surface as dismissed alerts with their reason — your security lead sees the same dismissals you do, with the same rationale.

Cost opportunities, same comment

Shipped

gp2→gp3, NAT gateway vs VPC endpoints, non-prod Multi-AZ, S3 Bucket Keys for KMS, and more — quantified when the engine can. The PR header summarizes dollar bands when any opportunity has a signal. Cost and security in one comment, not two tools.

For the agents writing your Terraform

The same engine, callable over MCP — before the PR exists.

Stateless MCP server

Shipped

audytx is a Streamable-HTTP MCP server at POST /mcp — no auth, no session, no install. Point Claude Code, Cursor, or any MCP client at it and the agent that generated the config gets the findings at agent speed.

claude mcp add --transport http audytx https://audytx.com/mcp

scan_terraform & autofix_terraform

Shipped

scan_terraform returns findings with file/line evidence, severity, fix snippets — plus the context-suppressed false positives, each with its rationale. autofix_terraform applies the sound, line-anchored fixes server-side, re-scans, and loops (≤3 passes) until nothing auto-fixable remains. Same reasoning as the PR path.

Plan-enhanced scans

Shipped

Optionally hand audytx your terraform show -json output — over MCP, or from a CI workflow authenticated by its GitHub Actions OIDC token (no secret to manage). Plan data resolves what static parsing can't: values behind undefaulted variables, count/for_each expansion, and module-internal resources. Strictly opt-in; absence never degrades a scan.

IAM: an effective-permission attack-path engine

Not a pattern list — privilege-escalation paths found by reachability.

Wildcard expansion + statement math

Shipped

Actions are expanded against an embedded AWS action table (thousands of actions), so iam:Create* resolves to the concrete privesc-relevant verbs it covers. The engine evaluates effective Allow over Deny precedence, NotAction inversion, and Condition gating — so a grant only counts when it's genuinely exploitable (Resource: "*", no limiting Condition, not neutralized by a Deny).

Attack paths by graph search

Shipped

audytx builds the sts:AssumeRole / iam:PassRole graph and searches it for reachable escalation — an internet entry point (public Lambda / Fargate task / EC2 with IMDSv1 / unauthenticated API Gateway / Cognito) that chains, role to role, to admin. Curated paths (ATTACK_PATH_001–008) still ship; the search generalizes them so multi-hop chains a pattern list would miss surface too. On the iam-vulnerable corpus audytx detects all 31 documented privesc paths — tied with Checkov as the only tools that do (KICS 3%, Trivy 0%) — see the benchmark.

Reasoning engine

17 axes the engine pre-computes per scan to decide whether a rule actually applies.

17 context-reasoning axes

Shipped

Each axis is a pre-computed per-resource verdict the rule layer consults before firing — the seam that turns a rule from "always fires" into "fires only when the graph says it should." A representative slice; the full list and per-rule mapping live at /status.

lambda_invocation_graphSync (API GW / Function URL) vs async-push (SNS / S3 / EventBridge) vs polled-async (SQS / Kinesis ESM). Lambda DLQ only helps async-push.
AWS_LAMBDA_004 · AWS_OPS_001
sqs_dlq_identityWhich queues are themselves a dead-letter queue. DLQs need no DLQ.
AWS_SQS_001 · AWS_SQS_002
data_lifetimeTTL / lifecycle / retention ⇒ the store expires its own data; PITR is a mismatch.
AWS_DDB_001 · AWS_OPS_030
iam_trust_graphWhether a role's trust is scoped to a non-compute managed service — a permissions boundary buys nothing if nothing can assume it.
AWS_OPS_035
imdsv2_enforcementIMDSv2 inherited from a launch template / account default — unless the instance re-opens IMDSv1 itself.
AWS_EC2_006 · AWS_IAM_023
tag_environmentMedium/Low findings suppressed on dev/staging-tagged resources; Critical/High always surface.
catch-all
sg_eks_identityEKS intra-cluster all-ports rules — suppressed only when the open rule is genuinely intra-cluster, never internet-sourced.
AWS_VPC_006
secret_rotationA secret with a sibling aws_secretsmanager_secret_rotation already has rotation configured.
AWS_SM_001
module_synthesized_inputRegistry-module calls — assert only on explicitly-set inputs, since module defaults drift across versions.
catch-all

Suppression integrity, measured

Shipped

Every suppression is a latent false negative — so audytx measures the recall side of the moat too. An adversarial "must-NOT-suppress" corpus (multiple cases per axis) is scanned and each finding checked: did a suppressor eat a real finding? All 17 axes are currently leak-free against that corpus. We publish the FN-rate beside the false-positive benchmark — most scanners measure neither.

247 rules, context-aware

Shipped

~50 service catalogs plus Rust skills the YAML DSL can't express (IAM, fusion, cross-reference, secrets, cost). Rules consult the axes above instead of firing blindly. Live list and per-rule axis mapping at /status.

Suppression and workflow

When the engine can't reason it away, you can.

.audytx-baseline.yaml

Shipped

Commit a baseline at the repo root to dismiss specific {rule_id, resource_address} pairs. Required expires: dates stop suppressions from rotting silently — when an entry expires, the finding fires again.

- rule_id: AWS_S3_010
  resource_address: aws_s3_bucket.legacy_public_assets
  reason: "Public by design; replatform tracked in PLAT-441"
  expires: 2026-09-30

Reconciled suppression counts

Shipped

The PR footer enumerates context-suppressed vs baseline-suppressed vs shown-live, and the numbers reconcile against the total. The engine can't silently lose a finding.

Public testbed repo

Shipped

audytx-testbed holds long-lived PRs of real public AWS-Terraform repos that exercise every axis. See exactly what the engine does on real HCL — without trusting screenshots.

Operational fundamentals

The boring infrastructure that lets the rest work.

Pure-Rust engine on Cloudflare Workers

Shipped

A wasm32-clean engine — no Python, Java, or Docker. A full 23-resource scan does its analysis in tens of milliseconds at the edge. Cheap enough to run on every PR at startup volumes without a funding round.

Versioned, observable, self-validating

Shipped

Every comment carries the engine + rule-catalog version. /status exposes the axis inventory, per-rule mapping, and output formats; /metrics reports aggregate usage. Every deploy is validated live against the API before it's trusted.

Reproducible by design

Shipped

Same input ⇒ byte-identical findings, guarded by a golden-hash oracle so an optimization can never silently change output. Findings are a function of your code and the pinned engine version — not a model's mood.

Not yet (and why)

Deliberate scope limits

  • Multi-cloud (Azure, GCP). Not on the roadmap — AWS-deep is the wedge. Depth beats breadth; multi-cloud comes only if the AWS product is sticky.
  • CloudFormation / Pulumi / CDK input. Terraform-only, by choice. The strategy is to be the best at one stack, not mediocre at five.
  • Auto-remediation PRs on arbitrary infra. audytx shows the fix and applies the sound ones (one-click / autofix); blindly opening fix PRs on arbitrary infra is a trust problem, not a feature gap.
  • Org policies / merge gates / compliance export. The governance layer (block-on-Critical, cross-repo baselines, CIS/SOC2 evidence) is gated behind real org adoption — building it into a vacuum is the trap we're avoiding.
  • SAML SSO / SOC 2. Public-beta priority is the product, not enterprise paperwork — that follows the demand.

Install on a repo

Every feature above is free — all 247 rules, the MCP server, and the autofix loop, on public and private repos.

Install audytx →