Skip to main content

Consequa-X

Evidence-aware explanation of consequential agent actions.

When an agent calls a tool that changes something (a refund, a delivery, a database write), the tool's response is only part of the story. A timeout can hide a refund that went through. A "success" can hide one that never landed. Another actor can produce the very outcome the agent was asked for.

Consequa-X keeps four things apart: the tool response, what the agent reported, the outcome established by an independent read-only readback, and who produced the effect. Missing, stale or incomplete evidence stays unknown instead of being guessed.

Python 3.11+ · MIT licensed · no required runtime dependencies · no model, API key or network access needed for the core or the offline examples.

Install

python -m pip install consequa-x
consequa-x --version

Use python -m consequa_x wherever a command below uses consequa-x.

See it in a minute

consequa-x demo --output my-demo
consequa-x report my-demo/traces/episode_01.json --output my-report.html

demo writes twelve synthetic refund scenarios with simulated money: timeouts before and after commit, false success, partial and duplicate effects, delayed readback, retries, another actor and missing provenance. Episode 1 is a timeout after commit: the tool timed out and the agent reported failure, but readback shows the refund committed and linked to the agent's action. Open my-report.html in any browser. It is one self-contained file with no scripts or network requests.

Each run needs a new output directory, and a report never overwrites an existing file. The demo's evaluator_truth/ folder is simulator ground truth for evaluation only; never pass it to an explainer.

Use it in Python

Register the intended outcome before the action, capture what happened, read the outcome back from a trusted read-only source, then verify and explain:

from consequa_x import (
    Action, AgentAssessment, AssessmentStatus, Observation, OutcomeContract,
    Trace, explain, render_report, verify,
)

expected = {"payment_id": "p1", "amount_minor": 1000, "currency": "INR"}
contract = OutcomeContract("contract-1", "refund_processed", expected,
                           deadline_ms=50, stability_ms=20)
action = Action("refund-1", "trace-1", "agent", "refund", expected, 0, contract)

# In an application, capture this independently from a trusted read-only source.
observation = Observation(
    "readback-1", "independent-ledger", 100, 100, {"payment_id": "p1"},
    ({**expected, "effect_id": "effect-1", "committed_at_ms": 25,
      "status": "processed", "action_id": "refund-1", "actor": "agent"},),
)
receipt = verify(action, observation)
trace = Trace("trace-1", action, (), (),
              AgentAssessment(AssessmentStatus.FAILURE, 10),
              (observation,), (receipt,))

assert receipt.status.value == "satisfied"      # the refund really happened
assert receipt.origin.value == "confirmed"      # and this action produced it
assert explain(trace).assessment_alignment == "contradicted"  # the agent said failure
html = render_report(trace)                      # offline, minimal disclosure

The built-in refund_processed verifier checks payment, integer amount, currency, exact count, commit deadline and a persistence window. Unavailable, incomplete, wrongly scoped or stale readback produces unknown. Effect origin is a separate conclusion: confirmed, other_actor or unknown.

Traces round-trip through a portable, versioned JSON schema (0.1): Trace.from_json(trace.to_json()) rejects unknown fields, broken identity links and dependency cycles. consequa_x.schema.get_trace_schema() returns the bundled JSON Schema.

Capture a real agent's tool call

TraceRecorder records an action while your agent runs, and RecordVerifier checks any outcome that leaves records behind (rows, orders, tickets, files):

from consequa_x import OutcomeContract, RecordVerifier, TraceRecorder, explain

contract = OutcomeContract("refund-o-17", "record_present",
                           {"order_id": "o-17", "amount_minor": 5000, "currency": "INR"},
                           deadline_ms=200, stability_ms=50)
verifier = RecordVerifier(scope_fields=("order_id",))

rec = TraceRecorder("run-17", actor="support-agent")
rec.register("refund-o-17", "issue_refund", {"order_id": "o-17"}, contract=contract)
try:
    with rec.attempt(data={"tool": "issue_refund"}) as attempt:
        issue_refund("o-17", attempt_id=attempt.attempt_id)   # your tool
    rec.assessment("success")                                  # what the agent reported
except TimeoutError:
    rec.assessment("failure")
rec.verify(read_refunds_for("o-17"), verifier=verifier)       # your read-only readback
print(explain(rec.trace(), target_matcher=verifier.target_matcher()).diagnoses)

capture_tool decorates a synchronous tool so every call is recorded the same way. The agent-loop example runs this end to end against a real SQLite database, offline, in three modes: a timeout after the refund committed, a refund made by someone else, and a readback too stale to decide.

Bring your own domain

Supply a read-only Verifier for your predicate, and a TargetMatcher when the agent's reported success or failure should be judged against that contract:

receipt = verify(action, observation, verifier=MyVerifier())
explanation = explain(trace, target_matcher=MyTargetMatcher())

Your application owns source trust, scope, completeness, timing and provenance; Consequa-X checks that receipts bind to the supplied contract and observation, and keeps the evidence structured. The artifact-delivery example implements both adapters with public APIs only, and the integration guide describes the boundary in detail. The stable API page lists what version 1 guarantees.

Command line

Command What it does
consequa-x demo --output DIR Write the twelve synthetic refund scenarios: traces, explanations, schema and manifest
consequa-x explain TRACE [--output FILE] Explain an existing trace without replay; prints JSON or writes a new file
consequa-x report TRACE --output FILE Render a self-contained HTML report; add --include-details to embed the full capture
consequa-x experiment … and research commands Paired replay, decision attribution and calibration studies (see Research)

What it does not do

  • It does not watch or control a live agent; your application captures the records.
  • It does not authenticate a readback source or prove that provider metadata is true.
  • An evidence-graph link records provenance, not causal necessity.
  • Default reports omit captured strings and identifiers, but keep times, counts and relationships. That is field omission, not anonymization.
  • No accuracy advantage over other methods is claimed.

Research

The repository also contains declared research interfaces, separate from the stable core: isolated replay, contrastive and Shapley-style decision attribution, calibration studies, an optional local Ollama adapter, and the retained evidence for each study. Results so far are synthetic or exploratory local-model studies and are reported with their denominators and limits. Start with the research roadmap and the paper notes.

Platforms

The package is pure Python. Released wheels have been install-tested on Windows with Python 3.11 and 3.12 and on one Alpine Linux virtual machine with Python 3.14. macOS has not been tested yet. See the release notes for exact environments.

Contributing and support

  • Questions and bugs: GitHub issues. Use synthetic data only; never post real traces, customer data or credentials.
  • Security: report vulnerabilities privately as described in SECURITY.md.
  • Development: see CONTRIBUTING.md.
python -m pip install -e ".[dev]"
python -m pytest
python -m ruff check src tests scripts

License

MIT, copyright Devrajsinh Jhala. The website's self-hosted fonts keep their SIL Open Font License.

Metadata

Release files for consequa-x 1.2.0

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

Source distribution (sdist)

Source distribution for consequa-x 1.2.0
File Size Uploaded Provenance
consequa_x-1.2.0.tar.gz 557.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for consequa-x 1.2.0
File Interpreter ABI Platform
consequa_x-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 726.5 kB

Release files / consequa_x-1.2.0.tar.gz

Download URL consequa_x-1.2.0.tar.gz
Size 557.6 kB
Tags Source
SHA-256 checksum
How to use checksums
d47c9b433f746ef5c263487ec668f908538f6485cff7d444649d62e2fde2af43
BLAKE2b-256 checksum
How to use checksums
b10249c46c349f8dcfdbd3e756fc391a093260c5447d76c7877cc8c35d7be4a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / consequa_x-1.2.0-py3-none-any.whl

Download URL consequa_x-1.2.0-py3-none-any.whl
Size 168.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4cdfb44c6a56e1671e50ee9efddc97816d8742fa388130ffa7d351eee3686438
BLAKE2b-256 checksum
How to use checksums
b830f67d04dfd44920d688910679346f84e1519615e224f54ed6c65cff513261
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Security for consequa-x 1.2.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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