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.
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.
Timestamp, tool name, redacted arguments, policy decision, cost, agent ID, session ID — the field list Article 12 asks for.
Allow, soft-gate (warn and log), or hard-gate — block until a human approves it. Article 14 human oversight, built in.
Halt a specific agent before its next tool call, from a CLI or another terminal — no redeploy required.
Every entry links to the last. An edited or deleted row breaks the chain and actward verify catches it.
actward tail --follow | stream the audit trail as it happens |
actward verify | prove the log hasn't been edited or deleted from |
actward approvals | list pending hard-gate requests waiting on a human |
actward kill <agent_id> | trip the kill switch for one agent |
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.