Skip to main content

Upholdr

A governor for risky AI/agent tool calls — with a tamper-evident audit trail.

Upholdr governs tool calls; it never connects to SaaS systems. It is the control layer that decides what an agent may do automatically, what needs human approval, and what is only logged. It is not an integration / iPaaS platform — it never ships connectors and never talks to Shopify, Slack, HubSpot, and so on. You (or an aggregator like MCP / Composio / Pipedream) bring the tools; Upholdr decides what's allowed.

Upholdr gives an agent graduated autonomy: an action starts in report_only (logged, never executed), and a category of action earns its way up the ladder to suggest and finally auto only after it accumulates clean, logged evidence — per risk category, never globally. Novel or high-risk actions are escalated even inside an otherwise-automated category, and the engine fails closed when data is missing or a tool is unknown. The audit trail is the product — a SQLite ledger sealed by a tamper-evident hash chain.

How it compares

  • vs OPA / Cedar — those are stateless-per-decision policy engines (allow/deny now). Upholdr adds the temporal layer they don't model: autonomy earned across sessions, promotion/demotion evidence, and a reproducible ledger. It can sit alongside a policy engine, not replace it.
  • vs LangSmith / Langfuse — those observe agent runs; Upholdr gates them.
  • vs human-in-the-loop libraries — those ask forever; Upholdr's point is to ask less over time, with receipts to justify it.

What's in the box

  • Earned autonomy, per category. Actions climb report_only → suggest → auto on clean, logged evidence; novel or high-risk calls escalate even inside an auto category (the "auto ceiling"). Reaching auto requires routine clean evidence — elevated categories can earn suggest but never auto-execute.
  • Deterministic replay. ordered action log + policy → decisions + final ladder state, reproducible run-to-run. The same derivation drives the live path, the CLI, and the report — one source of truth.
  • Operator overrides with cooldown. reject / reverse demote a category and let it re-earn trust over a cooldown instead of locking it forever; overrides are recorded in the ledger and feed the same derived ladder.
  • Tamper-evident ledger. A SHA-256 hash chain over a single append sequence, append-only SQLite triggers, and upholdr verify — receipts you can check.
  • Pluggable gate-packs, selected by policy. access_data (reversibility, exposure, blast-radius, data-confidence, evidence-layer novelty) is the default; pack: refunds scores refund amount — proof the engine isn't domain-specific.
  • Operator surface. upholdr status / upholdr categories, and a static HTML upholdr report showing promotion-readiness, recent decisions, overrides, and ledger-verify status.
  • Live MCP governance. Governor.govern() routes each call at its earned level; an SDK-free MCP proxy core forwards a tool call only when the verdict is executed_auto, returning "approval required" for the rest.

Quickstart

python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"          # add the proxy extra with: pip install -e ".[dev,mcp]"

# Evaluate one action against a policy and append a sealed ledger row:
upholdr evaluate \
  --file examples/access_actions.jsonl \
  --policy examples/policies/access_data.policy.yaml \
  --db ./upholdr.db

# Verify the ledger hash chain (exits non-zero on tampering):
upholdr verify --db ./upholdr.db

# Watch one category climb report_only -> suggest -> auto (deterministic):
upholdr replay examples/ladder_actions.jsonl \
  --policy examples/policies/tiny_ladder.policy.yaml

# Same engine, a different domain — a $9,500 refund escalates even at auto:
upholdr replay examples/refunds/actions.jsonl \
  --policy examples/refunds/policy.yaml

# Render the static operator report:
upholdr report --db ./upholdr.db \
  --policy examples/policies/access_data.policy.yaml \
  --out report.html

pytest -q

A known tool resolves to reported_only (a new category starts at the bottom of the ladder); an unknown tool fails closed to escalated. upholdr evaluate writes a sealed ledger row; upholdr replay derives ladder state from the ordered log.

The tool descriptor registry

Upholdr judges risk from declared metadata about each tool — never by calling it. See examples/policies/access_data.policy.yaml:

tools:
  hubspot.export_contacts:
    direction: read
    surface: internal
    data_class: customer_pii
    default_risk: high

data_class is declared by you, not detected — mislabeling it is a governance gap you own. An unregistered tool is treated as worst-case and fails closed. A policy may select a domain gate-pack with pack: (default access_data; the refunds recipe uses pack: refunds). The MCP proxy SDK is an optional extra: pip install "upholdr[mcp]".

License & security

Apache-2.0 (LICENSE). Security policy: SECURITY.md. The ledger is tamper-evident, not tamper-proof — see the threat model in docs/threat-model.md.

Metadata

Release files for upholdr 0.1.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 upholdr 0.1.0
File Size Uploaded Provenance
upholdr-0.1.0.tar.gz 50.2 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for upholdr 0.1.0
File Interpreter ABI Platform
upholdr-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 85.0 kB

Release files / upholdr-0.1.0.tar.gz

Download URL upholdr-0.1.0.tar.gz
Size 50.2 kB
Tags Source
SHA-256 checksum
How to use checksums
1dccd975ef1dc8bf00e08c5c6835b6d7fa7cf92cb978539f000fd076cfc7c556
BLAKE2b-256 checksum
How to use checksums
29f409d707b7ad9ffcc0cfea4e2df925f24b0f8fc291b5bb27fc406173e2b465
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jun 26, 2026.

Transparency log

Release files / upholdr-0.1.0-py3-none-any.whl

Download URL upholdr-0.1.0-py3-none-any.whl
Size 34.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e93be004097087c5aa8797daccf759b358436cb92ee789b59f89e49e92eb9397
BLAKE2b-256 checksum
How to use checksums
90057344c52a85fdbf24d741a80cfcc89be18ed7c6ff57ba5af75504c6441baf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jun 26, 2026.

Transparency log

Security for upholdr 0.1.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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for upholdr-0.1.0.tar.gz

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 Jun 26, 2026.

Transparency log

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.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

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