actward
EU AI Act · Article 12 & 14

An audit trail and kill switch for your AI agents — one decorator away.

Wrap any tool call your agent makes and get a tamper-evident log, a policy gate (allow / warn / block-for-human-approval), and a kill switch you can trip before its next action — self-serve, no platform lock-in.

View on GitHub Quickstart →

Wrap a function. That's it.

from actward import Ledger, Policy

ledger = Ledger(
    agent_id="support-bot",
    policy=Policy.from_yaml("policy.yaml"),
)

@ledger.guard(name="issue_refund")
def issue_refund(order_id: str, amount: float) -> str:
    ...  # your real logic

Every call now goes through the kill switch, the policy gate, and gets logged — framework-agnostic, with an optional LangChain helper on top.

What you get, for free

Tamper-evident log

Timestamp, tool name, redacted arguments, policy decision, cost, agent ID, session ID — the field list Article 12 asks for.

Policy gate

Allow, soft-gate (warn and log), or hard-gate — block until a human approves it. Article 14 human oversight, built in.

Kill switch

Halt a specific agent before its next tool call, from a CLI or another terminal — no redeploy required.

Hash chain

Every entry links to the last. An edited or deleted row breaks the chain and actward verify catches it.

The CLI is the v1 dashboard

actward tail --followstream the audit trail as it happens
actward verifyprove the log hasn't been edited or deleted from
actward approvalslist pending hard-gate requests waiting on a human
actward kill <agent_id>trip the kill switch for one agent

What it isn't

Actward produces the records Article 12 asks for and the human-oversight hook Article 14 asks for — it doesn't certify compliance on its own. Get an actual compliance/legal read before relying on it as a customer-facing claim. v1 is a Python SDK, a local SQLite log, and a CLI — no hosted dashboard yet, and policy rules match on tool name, not argument values, for now.