HTTPS made web traffic verifiable. AXR does the same for automated decisions.
AXR is an open protocol for producing tamper-evident, cryptographically signed records of what an automated workflow did on each execution.
It is not a chatbot. Not a workflow builder. Not a blockchain. Not an AI governance layer.
It is the accountability infrastructure that sits underneath AI agents, workflow engines, and autonomous systems — so that after the fact, anyone can verify exactly what happened.
AI systems now book appointments, approve requests, reject customers, and trigger irreversible actions. Most leave no verifiable evidence behind.
After an automated decision, there is often no reliable way to answer:
Logs exist, but logs are mutable. Dashboards exist, but dashboards show summaries.
Neither provides cryptographic proof.
Every decision-relevant step in a workflow produces a receipt — a signed JSON object.
Workflow executes
|
v
[ Step 1 ] --> signed receipt --> chained
[ Step 2 ] --> signed receipt --> chained
[ Step 3 ] --> signed receipt --> chained
|
v
[ Workflow receipt ] --> closes the chain
|
v
Append-only log file (.jsonl)
|
v
Independent verification (anyone with the public key)
Two types of receipts:
Step receipt — records a single node’s contribution:
{
"axr_version": "0.2",
"receipt_type": "step",
"receipt_id": "uuid",
"workflow_receipt_id": "uuid",
"sequence": 3,
"timestamp": "2026-05-15T07:13:18.123Z",
"step": {
"node_name": "The Brain (Logic)",
"node_type": "n8n-nodes-base.code",
"logic_version": "5.0 HU",
"model": null,
"deterministic": true
},
"io": {
"input_hash": "sha256:...",
"output_hash": "sha256:...",
"input_summary": {
"date": "2026-05-19",
"duration_minutes": 85,
"requested_slot_start": "14:00"
},
"decision": {
"status": "ZONE_INCOMPATIBLE",
"available": false,
"reason": "DISTANCE_TOO_FAR"
}
},
"previous_receipt_hash": "sha256:...",
"signature": "base64 Ed25519"
}
Workflow receipt — ties the step chain together:
{
"axr_version": "0.2",
"receipt_type": "workflow",
"receipt_id": "uuid",
"workflow": {
"workflow_id": "eco-clean-geo-cluster-booking-hu",
"workflow_version": "5.0"
},
"actor": {
"agent_id": "eco-clean-booking-hu",
"operator": "Conen Digital",
"on_behalf_of": "ECO Clean HU"
},
"outcome": {
"final_status": "ZONE_INCOMPATIBLE",
"available": false
},
"step_chain": ["uuid", "uuid", "uuid", "uuid", "uuid"],
"chain_root_hash": "sha256:...",
"previous_receipt_hash": "sha256:...",
"signature": "base64 Ed25519"
}
Chains operate at two levels:
previous_receipt_hashA deletion or alteration anywhere in either chain breaks verification.
| Guarantee | Mechanism |
|---|---|
| Tamper-evidence | Changing any byte invalidates the Ed25519 signature and breaks the SHA-256 hash chain. Two independent mechanisms catch the same tampering. |
| Deletion-evidence | Removing a receipt from the middle of a chain breaks hash linkage at the gap. The step_chain ID list also stops matching. |
| Reproducibility | Canonical JSON serialization (lexicographic key sort at every level). Same input always produces same hash. |
| Version coexistence | 0.1 and 0.2 receipts verify together in one log. The verifier branches on axr_version. |
What AXR deliberately does not provide in 0.2:
agent_id is self-declared)step.model records the model, but replay is out of scope)See SECURITY.md for the full threat model.
mkdir axr
openssl genpkey -algorithm ED25519 -out axr/signing-key.pem
openssl pkey -in axr/signing-key.pem -pubout -out axr/public-key.pem
chmod 600 axr/signing-key.pem
node lib/axr-verify.js ./axr/receipts.jsonl ./axr/public-key.pem
Output:
------------------------------------------------------------------------
File: ./axr/receipts.jsonl
Receipts: 20 total (3 workflow, 17 step)
Versions: 0.1: 13, 0.2: 7
------------------------------------------------------------------------
2026-05-14T07:13:18Z v0.1 SLOT_TAKEN_ON_RECHECK 5 steps
2026-05-14T09:45:22Z v0.1 ANCHOR_BOOKING 6 steps
2026-05-14T19:02:11Z v0.2 SLOT_AVAILABLE 6 steps
------------------------------------------------------------------------
RESULT: THE ENTIRE CHAIN IS VALID.
All signatures verify, all hash chains are continuous, nothing has been modified.
Exit codes: 0 valid, 1 problem found, 2 usage error.
Modify a single character in any receipt:
[ERROR] step a3f8...: INVALID SIGNATURE — receipt was modified after signing
[ERROR] workflow 7b2c...: step 4 previous_receipt_hash does not match — chain broken
RESULT: 2 PROBLEM(S) FOUND. The chain is corrupted or tampered.
Two independent mechanisms catch the same edit. Signature failure proves the content changed. Chain breakage proves where.
axr/
├── README.md This file
├── AXR-SPEC-0.2.md Protocol specification
├── ROADMAP.md Protocol evolution plan (0.3 → 1.0)
├── WHY-AXR.md Motivation and positioning
├── SECURITY.md Threat model and disclosure policy
│
├── lib/
│ ├── axr-core.js Canonical serialization, hashing, signing
│ ├── axr-generator.js Reference receipt generator (library)
│ └── axr-verify.js Standalone chain verifier (CLI)
│
├── integrations/
│ └── n8n/
│ └── axr-n8n-node.js Code-node template for n8n workflows
│
├── examples/
│ ├── simple-agent/ Minimal receipt generation
│ ├── tamper-demo/ Tamper detection demonstration
│ └── eco-clean-hu/ Production pilot reference
│
├── demo/
│ ├── receipts/ Sample receipt logs
│ ├── screenshots/ Verification output
│ └── gifs/ Animated demos
│
├── docs/ Extended documentation
├── scripts/ Utility scripts
└── site/
└── landing-page.tsx Protocol landing page
Zero external dependencies. All code uses Node.js built-in crypto and fs modules.
AXR ships with a reference Code-node template for n8n workflows. See integrations/n8n/axr-n8n-node.js.
The template is not a packaged n8n node — you paste it into a Code node at the end of your workflow, customize the configuration section, and the workflow starts producing signed receipts on every execution.
Requirements:
NODE_FUNCTION_ALLOW_BUILTIN=crypto,fs environment variableSteps:
__axr_input markers to each receipt-bearing node__axr.final_statusFull guide in the template file header.
AXR 0.2 has been running in production since 2026-05-14 on a home-services booking workflow processing real customer requests.
During deployment, the protocol uncovered three pre-existing workflow bugs — none caused by AXR, all silently misinforming customers:
{"error": "unknown_error"} instead of the actual rejection reasonAll three were invisible without receipts. All three became visible because the receipts produced an honest record that contradicted what the workflow was telling customers.
Full details in AXR-SPEC-0.2.md section 8 and WHY-AXR.md.
AXR 0.2 is suitable for:
AXR 0.2 is not yet suitable for:
See ROADMAP.md for the path from 0.3 to 1.0.
AXR is early-stage and evolving. The protocol is open under MIT — adopt, adapt, fork, or build on it.
If you deploy AXR on your own workflow:
PRs welcome on: documentation clarity, additional integrations (non-n8n orchestrators), verifier improvements, and example workflows. Protocol-level changes (receipt schema, signing algorithm) are version-numbered and discussed in issues first.
Conen, C. and Claude (Anthropic). 2026.
"AXR — Agent Execution Receipt: Protocol Specification, Version 0.2."
https://github.com/Centaur-Lang/centaur-lang
AXR was designed and built collaboratively under the CENTAUR model — human and AI working as one engineering pair, where each side contributes what it does best.
The reference deployment runs on ECO Clean HU’s booking infrastructure, operated by Conen Digital.