Skip to main content

Audit: a tamper-evident, hash-chained, auto-populated record of every AI decision — verifiable offline. Evidence, not a compliance guarantee.

Project description

cendor-acttrace

A tamper-evident, append-only record of every AI decision — what model, what context, what it cost, which tools, and who signed off — mapped to control templates and exportable as an evidence pack. No database, no infra: integrity comes from a hash chain, not a server.

Audit-ready evidence in 5 lines — and verifiable offline.

PyPI license · pip install cendor-acttrace

from cendor.core import instrument
from cendor.acttrace import AuditLog

client = instrument(OpenAI())
audit = AuditLog(system="loan_triage", risk_tier="high", signing_key="…")  # auto-subscribes

with audit.decision(input=application, actor="agent") as d:
    resp = client.chat.completions.create(model="gpt-4o", messages=msgs)  # auto-logged
    d.record(model="gpt-4o", prompt_id="triage@v3")          # cost/context captured for free
    d.human_oversight(reviewer="ops@bank", action="approved")

audit.export("evidence_q3.jsonl", framework="eu_ai_act")     # evidence pack (also nist_rmf)
acttrace verify evidence_q3.jsonl --key "…"   # re-walks the chain + checks signatures; non-zero if broken

Highlights

  • Auto-populating — construct an AuditLog and it subscribes to the bus: every LLM/tool call, plus cost (tokenguard) and context decisions (contextkit) on the same stream, becomes an entry — no per-call wiring.
  • Tamper-evident hash chainverify() catches edits, reordering, and tail-truncation. The pack's _meta head+count catch truncation, but that header is only authenticated when the log is HMAC-signed and you verify(key=…) — the header itself is signed, so a rewritten _meta fails. Without a key it's an unauthenticated in-file check, so pass an out-of-band expected_head= (captured from log.head at write time) for an authoritative completeness guarantee. Each entry is optionally HMAC-signed too.
  • Decisions & oversightdecision() groups a unit of work; d.record(...) and d.human_oversight(reviewer, action) capture Art. 14-style sign-off.
  • Compliance evidence packsexport(framework=…) annotates control IDs for EU AI Act, ISO/IEC 42001, GDPR, and NIST AI RMF (starting templates, not certified mappings), and a _meta.summary (counts of decisions, oversight, flags by action/severity) gives a reviewer the at-a-glance read first. PII redaction on by default (swap in redactor=).
  • Auto-flag on redaction — when the built-in redactor scrubs PII/secrets (email, api_key incl. sk-ant-/sk-proj-, aws_key, google_api_key, jwt, bearer_token) from an auto-captured entry, acttrace appends a policy_flag recording which category was removed — so "we removed PII" is in the hash chain, not silent (flag_on_redact=True by default; a custom redactor= owns its own flagging).
  • Policy flags (validation)audit.flag(reason, action="blocked", …) records a tamper-evident policy_flag (and returns the chained entry) when your pre-flight guard refuses input that shouldn't be processed — so the refusal is auditable, not just the calls that ran:
from cendor.core.instrument import add_interceptor, MISS

def guard(call):                                    # your pre-flight policy guard
    if my_policy_disallows(call):                   # YOUR rule
        audit.flag("special-category data", action="blocked")   # acttrace records the refusal
        raise PolicyViolation("blocked")            # your guard enforces it
    return MISS

add_interceptor(guard)   # the blocked call never reaches the bus — flag() is its only record

Produces evidence to support compliance — not legal advice, not a guarantee. Control mappings are starting templates for your compliance team.

See docs/acttrace.md · CHANGELOG. Part of the Cendor stack — github.com/cendorhq/Cendor. Powered by PowerAI Labs. Apache-2.0; provided "as is", without warranty — use at your own risk (LICENSE §7–8).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cendor_acttrace-1.0.0.tar.gz (23.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cendor_acttrace-1.0.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file cendor_acttrace-1.0.0.tar.gz.

File metadata

  • Download URL: cendor_acttrace-1.0.0.tar.gz
  • Upload date:
  • Size: 23.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cendor_acttrace-1.0.0.tar.gz
Algorithm Hash digest
SHA256 9d0ca3b10b46dd0e6285ab31ed5d7b1bc313cdd236d88dc884a873d27dc7dd7a
MD5 fdfb9bb6a45a5ab0e80093972d655d54
BLAKE2b-256 bf2b99f518be36a6369b4a17d76aa4ad543689207b1dadea1e763cbbc140bafb

See more details on using hashes here.

Provenance

The following attestation bundles were made for cendor_acttrace-1.0.0.tar.gz:

Publisher: release.yml on cendorhq/Cendor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cendor_acttrace-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cendor_acttrace-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1f66664d77e8d24361576d29fb2e8bde9464d9e957c04c867e490fef0e2af709
MD5 5c493decccb4e2a9abd747f356f26040
BLAKE2b-256 bcd3413c2400cdca76547e2c242270b84be9c4bf01b70c6d41d8f07ff8e5e9eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for cendor_acttrace-1.0.0-py3-none-any.whl:

Publisher: release.yml on cendorhq/Cendor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page