algovoi-keystone
One command to prove an agentic-action keystone chain composes end to end.
Everyone has receipts. The keystone is the composition: the proof that identity binds to authority binds to policy binds to the decision binds to the execution binds to one trust verdict, every link a content address, recomputable offline, with no issuer contact. A plain receipt checker recomputes individual digests. This recomputes the whole chain and proves it binds.
keystone verify chain.json
keystone chain: passport_ref -> mandate_ref -> policy_ref -> policy_bound_ref -> decision_ref -> execution_ref -> trust_query_ref
------------------------------------------------------------
OK passport_ref
sha256:b3594e33...
...
OK trust_query_ref
sha256:18fb601a... binds passport_ref, mandate_ref, policy_bound_ref, decision_ref, execution_ref
------------------------------------------------------------
KEYSTONE VALID: 7/7 links compose, recompute byte-for-byte, no issuer contact.
capped: trust_query_ref is one verdict over [...] in order.
Tamper any link and that link, and every link that binds it, diverge:
BAD execution_ref
^ recomputed sha256:8a71a2a3... != declared sha256:f6e2bfc1...
KEYSTONE BROKEN at execution_ref: ... every link that binds it is therefore not provable from these bytes.
(keystone verify exits 0 if the chain composes, 1 if any link is broken, 2 on a malformed chain.)
Why this exists
As agent governance matures from "here is a signed receipt" to "prove the whole chain composed, that the decision that authorized is the one that executed is the one the verdict covers", a receipt is no longer enough. The keystone is that proof, and it is the one piece of the agentic-governance stack that cannot be reproduced by cloning a single digest construction, because it requires the whole composition. This is the turnkey verifier for it.
The chain format
A keystone chain is an ordered list of links. Each link's reference is
"sha256:" + SHA-256(RFC 8785 (JCS)(preimage)). Composition is structural: a
preimage refers to an earlier link by @name, so a downstream reference cannot be
computed without the exact upstream reference.
{
"schema": "algovoi-keystone-chain/v1",
"canon": "jcs-rfc8785-v1",
"chain": [
{ "name": "passport_ref", "preimage": { "agent_id": "agent-001", "...": "..." } },
{ "name": "decision_ref", "preimage": { "agent_ref": "@passport_ref", "mandate_ref": "@mandate_ref", "policy_bound_ref": "@policy_bound_ref", "verdict": "ALLOW" } },
{ "name": "execution_ref", "preimage": { "decision_ref": "@decision_ref", "outcome": "COMMITTED", "...": "..." } },
{ "name": "trust_query_ref", "preimage": { "subject_refs": ["@passport_ref", "@mandate_ref", "@policy_bound_ref", "@decision_ref", "@execution_ref"], "trust_outcome": "TRUSTED" } }
]
}
An optional "ref" on a link is the declared output; the verifier recomputes and
checks it. See examples/keystone-golden.json
for the canonical chain (its values match the published keystone_v1 composition
in algovoi-jcs-conformance-vectors).
Agent passports (client half)
An Agent Passport is a Falcon-1024 (FIPS 206) signed credential that binds an agent DID to scopes, a spend bound, and an expiry. The issuer runs inside the AlgoVoi payment rails; this package is the client an agent developer needs, both sides of the wire:
Present your passport on an outbound call (needs nothing beyond the base install):
from algovoi_keystone import load_credential, x402_headers, a2a_message_metadata
cred = load_credential() # from $ALGOVOI_AGENT_PASSPORT, or pass a path
headers = x402_headers(cred) # {"X-Agent-Passport": "<cred>"} on an x402 request
metadata = a2a_message_metadata(cred) # A2A message metadata carrying the passport
Verify a received passport fully offline, against the issuer's published key, with a
stock trust base (rfc8785 + pqcrypto, no AlgoVoi service in the trust path):
from algovoi_keystone import verify_passport, resolve_keys_from_wellknown, fetch_crl
# resolve the issuer key + revocation list once (or pin them from a local trust store)
keys = resolve_keys_from_wellknown("https://pay.issuer.com") # {kid: pk_bytes}
crl = fetch_crl("https://pay.issuer.com", next(iter(keys)))
v = verify_passport(cred, issuer_keys=keys, crl=crl, required_scope="pay:invoice")
if v: # True only when status == "active"
print("ok:", v.agent_did, v.scopes, v.spend_limit_microusd)
else:
print("refused:", v.status, v.error_code) # revoked | expired | invalid | unverifiable
Verification is fail-closed: with no key resolved or no revocation confirmation, the verdict
is unverifiable, never a default-trust active. The credential's kid is checked against
sha256(pk)[:16] of the resolved key, so a swapped key cannot validate. Install the verifier
extra with pip install 'algovoi-keystone[passport]'.
From the CLI:
keystone passport inspect <credential> # decode (does NOT trust)
keystone passport verify <credential> --issuer-url https://pay.issuer.com --scope pay:invoice
keystone passport verify <credential> --keys keys.json --crl crl.json # strictly offline
keystone passport present <credential> --x402 # emit the header to attach
Install
pip install algovoi-keystone # Python: keystone verify chain.json
pip install 'algovoi-keystone[passport]' # + Falcon-1024 passport verify
npm install -g @algovoi/keystone # Node: keystone verify chain.json
Python and Node produce byte-identical references on every link. RFC 8785 JCS + SHA-256 is the whole dependency; the verifier makes no network call.
License
Apache-2.0. (c) AlgoVoi. Keep the NOTICE attribution when you redistribute.
Metadata
Release files for algovoi-keystone-compose 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 8.4 MB
Release files / algovoi_keystone_compose-0.3.1-cp313-cp313-win_amd64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 132.5 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f7a6aa2576e851761e921cd90742ae1ebb48fec2a44475fde9569bcdfe493804
|
|
BLAKE2b-256 checksum How to use checksums |
2d1bd94ac9ffe5b7d1d877c1168f4bb666f12c3ff992c8b903c5fdd9d57174d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 974.5 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
cb0f60e67a0e70ae725707e3e28e4e72cc9ba2507f637f8bd193a76b5a8528a1
|
|
BLAKE2b-256 checksum How to use checksums |
99640f93a13e9e1b739b548386b2a086795b393b0a8a2cf36ff5bbc33af7c239
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 968.9 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
9232ac42ebb8de3a69132eb08bfe5b196fdc691fd21bf3799659869e6bbb4d0b
|
|
BLAKE2b-256 checksum How to use checksums |
0acb1a96cb2862f83b8a4b4e717c6ff88715c68229c7c4d3f722dcc72cbe9bc7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp312-cp312-win_amd64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 133.3 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
ac938068ec896b800188b7d7206f3566120768569f1447891f469f78ee33e148
|
|
BLAKE2b-256 checksum How to use checksums |
4ea3fb492cb692e26a267750ece229405fa03329d7d0f3bc8ca6d07decfc7292
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 980.9 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
a492b55d1e17666712aa619affbb1c275b7f9b2d6f0c91f210e78ae1d1eba227
|
|
BLAKE2b-256 checksum How to use checksums |
baddd661f31d11f3121c88fcdbd202f0bf686e7307c263fc6d6ff94926b68dd7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 986.7 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
402260646992f38ad19bce28366c4f8636bf139c506ac7d530943b2251dcc537
|
|
BLAKE2b-256 checksum How to use checksums |
2b8ac74e6a5c61b7c376b7d07493cc5355e70f1a5cfd7d133e6b4964270d4713
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp311-cp311-win_amd64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 137.3 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3babf4b2ff03bbb86b6007f1bc0e1035a2bc8450b28984a168da949ae6d4b82a
|
|
BLAKE2b-256 checksum How to use checksums |
22baee58cfafe879fc445b5eedbd62b13b0f1b8ab53d3ccc4db1d56cc0cd97b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
d800c76162ee3810c1c01912abde34e8099309126d00baa35ce336558dd1c738
|
|
BLAKE2b-256 checksum How to use checksums |
7a8dc3f04cf9809ab50d774c27ee94b7eb0004231cc8528ffb7e734081cbf35b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 988.6 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
6c4cd586fa864363206e6147da0204110d381124ab3be8986907d1d799455759
|
|
BLAKE2b-256 checksum How to use checksums |
681455cb30bba26c2c30fcfe72c87820a77d3ff4c2434600cfe933276c684534
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp310-cp310-win_amd64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 137.5 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
852ef3eef80fd8b1abc8ddc5441bdeb819ed921f20daea7ba72a60c92f05c26b
|
|
BLAKE2b-256 checksum How to use checksums |
8034a79ce36dddc26ec5fe37bc24a920df5f78b7e35a7876590b19e134282ce0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 963.0 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
e97b1b008017adfd645670de5bc5cc4af5bb76f163bc21aacaf114e5fb206926
|
|
BLAKE2b-256 checksum How to use checksums |
d46f0cb6e4ef2a69214623ebdf03738cbc3ff2084cdaa57ffe9691000dbbb9e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / algovoi_keystone_compose-0.3.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
| Download URL | algovoi_keystone_compose-0.3.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl |
|---|---|
| Size | 933.4 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64 |
|
SHA-256 checksum How to use checksums |
637795009d8745437b3772fd0c7c7aca86a177e953e9caaacf4d8b3fa89c681c
|
|
BLAKE2b-256 checksum How to use checksums |
cc288314f48cdfe2334429314358866ca0fd711bd4e4c9853b31684484c84084
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Security for algovoi-keystone-compose 0.3.1
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
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.