faultgate 0.3.1 · fixes from the first outside test, 180 real tau2-bench runsRead the changelog →

01 / WHAT STAYS, WHAT CAN LEAVE

Data boundaries and payload containment by design.
WHAT STAYS LOCAL

Stays in your CI runner

  • Traces read in memory: faultgate reads your traces in memory and writes no trace payloads anywhere.
  • Rules, policy & bands: Deterministic checks, policy rules, and baseline noise calculations run entirely locally.
  • Local Laya judge: Runs offline on your runner; no trace content leaves the machine.
  • Zero trace payloads written anywhere: The audit pack copies no prompts, answers or tool payloads.
WHAT CAN TRAVEL

Can leave your CI runner

  • API judge prompts: When you explicitly pass --judge litellm:..., the rendered trace goes to your configured model provider. Masked by default.
  • Failure reasons: Human-readable reasons printed in your terminal, written to --json, emitted into CI logs, and posted to PR comments. Masked by default.
  • Masked by default: Both outbound streams are masked for the patterns listed below (builtin), or Presidio's recognisers if you enable them.

02 / REDACTION

Automatic PII and credential masking in reasons and model prompts.

faultgate reads your traces in memory and writes no trace payloads anywhere. Rules, policy, bands and the local Laya judge never send anything off the machine. Two things can travel: the trace an API judge (litellm:) reads, and the reasons that end up in your terminal, --json report, CI logs and PR comments. By default both are masked:

--redactMasksNeeds
builtin (default)emails, credit cards (Luhn-checked), US SSNs, phone numbers, IPv4/IPv6, API keys, bearer tokens, JWTsnothing (stdlib regex)
presidiothe above plus Presidio's recognisers: person names, locations, morepip install 'faultgate[pii]' and a spaCy model
offnothing—

MASKED REASON EXAMPLE

step 2: update_profile.email '<EMAIL>' != session enduser.id '<EMAIL>'

Rules always see the raw values; only what leaves is masked. An identity policy compares the real customer id in memory, while terminal outputs, JSON reports, and PR comments redact secrets and identifiers. On the 30 real benchmark traces from make demo-real the built-in masker finds 81 emails, 39 phone numbers and 69 JWT access tokens, all real-looking customer data or credentials; it changes none of the text in the shipped FAULTLINE traces.

03 / FIXED IN 0.3.1

Honest disclosure from outside evaluation on real retail traces.
SECURITY DISCLOSURE2026-10-13

Redaction digit-run boundary fix

A card number written next to another number (4111 1111 1111 1111 123-45-6789) joined its digit run, failed the Luhn check as a whole and was written unmasked to the JSON report, the Markdown summary and failing_traces.json. Cards are now found as Luhn-valid windows of whole digit groups, SSNs are masked first, and a card at the end of a sentence (...1111.) is masked too.

Found in the first outside test (tau2-bench retail, 180 real runs).

Upgrade:pip install -U faultgate

04 / AUDIT TRAIL

Release verification without sensitive trace retention.

--audit writes verdict.json, which records the SHA-256 of every input file, plus failing_traces.json and repro.sh. No prompts, answers or tool payloads are copied.

01verdict.json

Verdict, exit code, faultgate version, UTC timestamp, every input file with its SHA-256, and gate numbers.

02failing_traces.json

Each failing trace and every reason that fired, with PII and credentials masked by redact.

03repro.sh

Exact shell command to reproduce the evaluation and verdict locally against the same inputs.

--audit writes verdict.json (inputs with SHA-256), failing_traces.json, repro.sh; no prompts, answers or tool payloads copied.

05 / SUPPLY CHAIN

Minimal dependency footprint and pinned provenance.
LICENCE
MIT

Permissive open-source license. Read, modify, and audit every line of code.

DEPENDENCIES
One (pydantic)

Core rules run on Python standard library with no external model weights or network downloads.

EXTRAS
Optional judges

Heavyweight judges and recognizers are opt-in extras (faultgate[laya], faultgate[api], faultgate[pii]).

LOCAL MODEL
Pinned revision

Laya judge downloads once at a pinned revision (~800 MB, Apache-2.0), running completely offline after.

DISTRIBUTION
PyPI

Published on PyPI.

06 / COMPLIANCE

Environment-native execution and customer boundary ownership.

No SOC 2 report yet. faultgate runs in your environment, so your own controls and audits apply.

There is no FAULTLINE cloud backend, hosted data sink, or multitenant database ingesting your agent runs. Because the evaluation gate runs entirely within your existing CI runners or private infrastructure, your organization’s current access controls, network boundaries, and compliance programs remain the governing authority.

07 / REPORT A VULNERABILITY

Responsible disclosure and security response contact.

We welcome responsible security research. If you find a security vulnerability or suspect a boundary violation in faultgate or FAULTLINE tools, please review our security policy and notify us directly: