No authority. No privileged action.
A human-rooted authority layer for autonomous systems — beneath any model, agent, app, chain, or OS. It answers one question: who may do what, to which resource, under which constraints, for how long, through which delegation, and who can revoke it?
“AI can propose anything. It can only execute what a human has cryptographically authorized.”
The Echo Authority Protocol (EAP) is the machine representation of the Human Authority Model — the wire form of its ten dimensions. The Model defines the semantics; EAP defines how they serialize, sign, and travel; HAP-1 defines how a human reads them.
The spine
No Authority Object → no privileged action
Being intelligent, authenticated, or trusted grants nothing. Power begins only at a signed, human-rooted grant.
No valid Invocation → no execution
Standing permission is not action. Each attempt is a signed, bound, single-use request that must fit the grant.
No receipt → no verifiable claim of completion
Every privileged action returns signed evidence. The consequence may still occur — a bank could transfer and crash before signing — but without a receipt there is no verifiable claim that it did. We govern evidence, not reality.
Border Control — deterministic, boring, real
Not a diagram. A real verifier: each scenario below mints a signed Authority Object, signs an Invocation, and runs the full check list. Every verdict is genuine — real Ed25519 signatures, real limit math, an exact reason code.
Attenuation only — a child can never widen its parent
A human grants an agent read-only access to the public vault. Watch the agent try to hand a slice of that authority to a sub-worker. It may narrow the grant — one file, ten minutes, single use. The moment it tries to widen anything, the child cannot even form.
Test vectors — verify the same truth yourself
A standard is only real if two implementations agree. Each vector fixes an object shape and a verifier state, then asserts the exact reason Border Control must return. They run live through the reference engine — a conformant verifier in any language must produce identical verdicts.
- v01well-formed payment within limits
OK - v02amount over per-action limit
VALUE_LIMIT_EXCEEDED - v03would exceed total spend
TOTAL_LIMIT_EXCEEDED - v04wrong currency
CURRENCY_MISMATCH - v05resource outside grant
RESOURCE_MISMATCH - v06capability not the one granted
CAPABILITY_MISMATCH - v07subject is not the grantee
SUBJECT_MISMATCH - v08expired authority
EXPIRED - v09not valid yet (not_before)
NOT_YET_VALID - v10max uses already consumed
MAX_USES_EXCEEDED - v11replayed nonce
NONCE_REPLAY - v12bound to a different gateway
AUDIENCE_MISMATCH - v13tampered amount (signature breaks)
BAD_INVOCATION_SIGNATURE - v14revoked by the human
REVOKED - v15offline + revocation too stale
REVOCATION_STALE - v16offline + over the offline value limit
OFFLINE_VALUE_EXCEEDED - v17never-grantable capability
FORBIDDEN_CAPABILITY - v18step-up: human confirmation required
HUMAN_CONFIRMATION_REQUIRED
Each vector fixes an object shape and a verifier state, then asserts the exact reason Border Control MUST return. They run live through the same engine — a conformant implementation, in any language, must produce the identical verdicts.
Adapters may re-represent authority — never expand it
Most systems will not speak this protocol natively. An adapter translates a foreign grant — an OAuth scope, an MCP tool call, an OpenAI function, a GNAP token — into an Authority Object using the shared capability vocabulary. Translation may change the representation. The moment it tries to grant more than the human actually authorized, the same attenuation math rejects it.
Anchor the authority log on Bitcoin
Every authorized action produces a receipt with an opaque head. Those heads hash-chain into an append-only authority log. Only the log's tip — one sha256 committing the entire history — is submitted to the Bitcoin blockchain through OpenTimestamps. Secrets stay private; routine authority stays fast; the public evidence becomes verifiable by anyone, forever. Once a block confirms, the committed prefix cannot be altered or backdated without breaking the anchor — the change becomes detectable to anyone holding the proof. Be precise about what that buys: Bitcoin attests to when this commitment existed. It cannot attest that every logged event was true, or that nothing was omitted before the tip was committed.
- genesis · 000000000000…
Only the tip — one opaque sha256 committing the whole ordered log — is submitted to the public OpenTimestamps calendars, which aggregate it into a Bitcoin transaction. No receipt, no party, no amount ever crosses. Once a block confirms, not even the operator can backdate or rewrite this history.
The load-bearing wall
Draft 0.1 — normative
Identity MUST NOT imply authority.
A key, passkey, DID, or certificate proves the subject. It MUST NEVER be read as permission. authenticated ≠ authorized.
Every chain MUST begin at a human root.
Human Root → Device → Session → Agent. The root rarely signs; it authorizes bounded, short-lived keys, shrinking the blast radius of any leak.
Delegation MUST only attenuate.
A child grant MUST be a provable subset of its parent — narrower resource, lower limits, shorter life, shallower depth. It MAY NEVER expand power.
An Invocation MUST bind the exact action.
subject · capability · resource · parameters · audience · nonce · time. This binding is what prevents replay and repurposing.
Border Control MUST be deterministic.
No language model inside it. No 'the agent probably meant well.' Only signature, scope, limit, expiry, rate, delegation, revocation, audience, and nonce checks — ALLOW or DENY + an exact reason.
Permission to act MUST NOT imply permission to know.
Border Control minimizes context: the calendar agent receives free/busy, never the history. Authority and disclosure are separate jobs.
Revocation MUST be cheaper than issuance.
And offline verifiers MUST NOT pretend revocation is instant. Each grant declares how stale revocation info MAY be — freshness becomes an explicit risk policy.
Consequential actions MAY require step-up.
Human confirmation is part of the Authority Object, not an afterthought. Every action requires prior human-rooted authority; whether it also requires a human present in the moment is consequence-dependent. payment.prepare runs autonomously; a small capped payment.execute may run on a standing bounded grant; a large or irreversible one demands a fresh human signature.
Some capabilities MUST be ungrantable.
Export the root key, export recovery, disable audit, exceed the owner, rewrite history — structurally refused. Stronger than 'Are you sure?'.
The protocol MUST NOT depend on Money Musk.
Money Musk implements it. Echo demonstrates it. The protocol belongs to everyone — anyone may fork it, audit it, and verify the same test vectors.
A complete authority lifecycle
Capability vocabulary
A deliberately small core (§16). Extensions add their own.
data.readdata.writememory.readmemory.appendmessage.preparemessage.sendpayment.preparepayment.executemodel.infertool.invokecalendar.readcalendar.scheduleidentity.presentcredential.issuecredential.verifyagent.delegatesystem.configureNever-grantable
Structurally ungrantable (§14) — no consent can form these.
root.exportrecovery.exportaudit.disableauthority.exceed-ownerhistory.rewriteEvery action needs prior authority. Not every action needs a human in the moment.
A standing bounded grant — “my agent may buy groceries up to €30 until 18:00” — is real delegated authority, not a suggestion box. Requiring a fresh tap for every €4 purchase would destroy it. So the rule is precise: every machine action requires prior human-rooted authority; contemporaneous confirmation is risk-dependent. Step-up rises with consequence.
calendar.readstanding grant sufficientmessage.preparestanding grant sufficientmessage.sendpolicy-dependentpayment.execute ≤ €20standing bounded grant may sufficepayment.execute > €20human presence requiredproperty.transferhuman presence + strong authenticationThe whole system, in one path
HUMAN
│ signs / delegates
▼
AUTHORITY OBJECT ◀── attenuation only (never expands)
│
AGENT ─ proposes ─▶ INVOCATION (subject · action · nonce · time)
│
▼
BORDER CONTROL ── deterministic. no model inside.
┌────┴────┐
DENY ALLOW
+ reason minimized access
│
▼
TOOL / DATA / MONEY / SYSTEM
│
▼
RECEIPT ─▶ AUTHORITY GRAPH
REVOCATION ── can terminate future authority at any timeTwo implementations, one verdict
The verifier on this page is TypeScript. There is a second, fully independent implementation in Rust — no shared code — and both now implement the same ten-dimension attenuation algebra. A standard is only real when two implementations agree, so the interesting question is not whether they agree on the easy cases but whether they refuse the same escalations for the same reason. The source is public at github.com/yestoshiaikamoto-wq/echo-authority — clone it and run cargo test yourself.
When §4 was first written, only the TypeScript engine implemented it. This panel said so, naming two places where the runtimes genuinely disagreed and both favoured Rust being too permissive. Both are fixed: resource_within is now segment-based language containment rather than the forbidden starts_with test, and the crate carries all ten dimensions — including the notBefore floor, the obligations a child may add but never drop, the WHO and depth bindings, and the three fields that previously did not exist in its structs at all.
A claim like that is worth nothing unless it is falsifiable, so the check is a harness, not a sentence. It runs the sixteen escalation cases through both engines and compares the verdict and the dimension that refused:
cd echo-authority-rust && cargo run --example cross-check npx tsx scripts/cross-runtime-check.ts "$RUST_JSON" drop_human_confirmation REFUSE CONDITIONS REFUSE CONDITIONS agree glob_segment_trap REFUSE RESOURCE REFUSE RESOURCE agree forged_sibling REFUSE WHO REFUSE WHO agree ... 16/16 cases agree between the TypeScript and Rust engines
Agreeing on a refusal is weaker than agreeing on why, which is why the comparison includes the dimension. The §10 receipt split raises that bar once more. Both engines now issue all three receipt kinds, and a second harness compares the proof hashes rather than the verdicts — which catches a field one runtime forgets to commit even when both still return the same decision:
cargo run --quiet --example receipt-proofs | npx tsx scripts/receipt-proof-check.ts decision-allow da5dcbe2f7a2ca91 da5dcbe2f7a2ca91 yes decision-deny 1adc950b24365483 1adc950b24365483 yes execution e0a873d476f06df6 e0a873d476f06df6 yes consequence-unknown e436ec7c65143756 e436ec7c65143756 yes ... 6/6 receipt proofs identical across runtimes
What remains honestly open: the published 0.1.0 on crates.io is immutable, so the registry still serves the old rule until a semver bump — and both engines were written by us, which is implementation diversity, not third-party adoption.
echo-authority-corebuilt · verifiedecho-border-controlbuilt · verifiedecho-authority-testsbuilt · verifiedecho-authority-wasmbuilt · verifiedecho-authority-clibuilt · verifiedThe full toolkit ships: echo-authority-cli lets any developer or auditor keygen, mint, invoke, verify, and attenuate from the terminal — produce your own signed vectors and check them against either runtime. Fork it, audit it, break it. The only bug that matters is a vector where two implementations disagree.
Watch the Rust verifier run — in your browser
This is not the TypeScript engine. It is echo-authority-core, compiled to WebAssembly, loaded as a static .wasm asset, running on signed vectors that were minted and signed inside Rust. Two independent implementations, one page — press the button and watch them agree.
Take Draft 0.1 home
The spec, the Authority Object JSON Schema, and the conformance vectors — copy or download them. Build your own verifier and check it against the same vectors. A protocol becomes infrastructure the moment it no longer needs its author.
# Echo Authority Protocol — Draft 0.1
Status: Draft. Not final. Not "the universal standard." Draft 0.1.
License: Public. Implement it, fork it, audit it, write another verifier.
"AI can propose anything. It can only execute what a human has
cryptographically authorized."
## 0. The spine (three invariants)
- INV-1 NO AUTHORITY OBJECT -> NO PRIVILEGED ACTION
- INV-2 NO VALID INVOCATION -> NO EXECUTION
- INV-3 NO RECEIPT -> NO VERIFIABLE CLAIM OF COMPLETION
(the consequence may still occur; without a receipt there is no
verifiable claim that it did — we govern evidence, not reality)
## 1. Five separations
A conformant system MUST NOT blur these:
Identity (who are you) · Authority (what may you do) · Invocation (what exact
action now) · Enforcement (does it fit the grant) · Proof (what returns after).
Identity MUST NOT imply authority. authenticated != authorized.
## 2. The human root
Every chain of authority MUST begin at a human-rooted key.
Human Root -> Device -> Session -> Agent. The root SHOULD sign rarely and
authorize bounded, short-lived delegates. Compromise of a leaf MUST be
containable by revoking that leaf without losing the identity.
## 3. The Authority Object
An Authority Object MUST be canonical, deterministic, and signed by its issuer.
It MUST carry: issuer, subject, capability, resource, scope, constraints
(not_before, expires, max_uses, rate, human_confirmation, offline policy,
revocation freshness), delegation policy, revocation reference, receipt
requirement, depth, and the issuer signature.
## 4. Attenuation only — the algebra
A delegated (child) Authority Object MUST be a provable subset of its parent.
"Provable" is defined here as a deterministic partial order, not as prose. Two
conformant verifiers MUST reach the same verdict on every input, so the rule is
stated per dimension with an explicit ordering direction.
Four rules govern the order:
R1 DIMENSION-WISE. child <= parent iff child <= parent on EVERY
dimension below, evaluated independently.
R2 NO TRADES. Narrowing one dimension MUST NOT permit widening in
another. There is no aggregate score.
R3 DENY IF UNPROVABLE. A dimension that cannot be proven narrower-or-equal
MUST be refused. Unrecognized fields, dropped
ceilings, and unparseable resources all refuse. The
burden of proof is on the child.
R4 UNBOUNDED IS WIDEST. An absent ceiling means "no limit" and is the top of
its dimension. A child MUST NOT drop a ceiling that
its parent declared.
Ordering directions:
ceiling child <= parent caps, uses, rates, depth, staleness windows
floor child >= parent not_before — may start later, never earlier
exact child == parent capability, revocation method
refine parent unset means any; if the parent pinned it, the child MUST match
restrict child >= parent obligations — true is MORE restrictive
permit child <= parent permissions — false is MORE restrictive
subset language containment for resource globs
binding structural identity, defined per field
### 4.1 The ten dimensions
WHO issuer MUST equal the parent subject (binding)
WHAT capability (exact)
RESOURCE resource (subset)
AMOUNT scope.max_per_action, scope.max_total (ceiling)
scope.currency (refine)
any other scope key (R3)
TIME constraints.not_before (floor)
constraints.expires (ceiling)
FREQUENCY constraints.max_uses, constraints.rate_limit_per_hour (ceiling)
CONDITIONS constraints.require_human_confirmation (restrict)
constraints.offline_allowed (permit)
constraints.offline_value_limit (ceiling)
DELEGATION delegation.allowed (permit)
delegation.max_depth, strictly shallower (ceiling)
depth MUST equal parent depth plus one (binding)
REVOCATION constraints.revocation_max_age_sec (ceiling)
revocation.freshness_required_sec (ceiling)
revocation.method (exact)
PROOF receipt.required (restrict)
A child that widens ANY dimension MUST be refused (DELEGATION_NOT_SUBSET).
### 4.2 Consequences a verifier MUST NOT miss
These follow from 4.1, and are called out because a prose reading of "narrow the
limits" misses every one of them:
- A child MUST NOT drop require_human_confirmation. Removing an obligation is an
escalation even while every numeric cap shrinks.
- A child MUST NOT enable offline use, or raise an offline value limit, that its
parent withheld.
- A child MUST NOT begin before its parent begins.
- A child MUST NOT change currency. A different unit is a different scope, not a
smaller one.
- A child MUST NOT accept staler revocation data than its parent. Widening the
window in which a revoked grant still works widens authority.
- A child MUST NOT drop the receipt requirement, which would leave it less
accountable than its parent.
- A child MUST NOT introduce a scope key its parent never granted (R3).
- A child MUST NOT skip a depth level, and MUST be issued by the subject of the
grant it descends from. A "child" issued by anyone else is a forged sibling.
### 4.3 Resource language
Resources are compared as segment sequences separated by "/". Within a resource:
literal matches itself
* matches exactly one segment
** matches one or more remaining segments, and MUST be final
prefix* matches within a single segment, e.g. merchant:*
Containment is language containment, NOT string prefixing. A verifier MUST NOT
implement this with a startsWith comparison: under prefix comparison the
resource vault/public-secrets/x falsely appears to sit inside vault/pub*,
crossing a segment boundary while reading as a narrowing. A child segment MUST
NOT be a wildcard where the parent named a literal, and MUST NOT be ** where the
parent admitted only a single segment.
### 4.4 Order properties
The relation is irreflexive: no grant is its own child, because WHO cannot link
to itself and depth cannot advance. It is antisymmetric on distinct grants — if
child <= parent, then parent <= child MUST NOT also hold. Conformant
implementations SHOULD test both properties directly.
## 5. The Invocation Object
The Invocation Object describes the exact action attempted now. It MUST bind:
authority id, subject, capability, resource, parameters, audience (the gateway),
nonce, and time — and MUST be signed by the subject.
## 6. Border Control (enforcement)
Enforcement MUST be deterministic. No language model MAY sit inside it.
The verifier MUST check, in order, and stop at the first failure with an
EXACT reason code:
FORBIDDEN RULES · ISSUER · SUBJECT · AUTHORITY SIGNATURE ·
INVOCATION SIGNATURE · CAPABILITY · RESOURCE · PARAMETERS (value, currency,
total) · EXPIRY · MAX USES · RATE · DELEGATION CHAIN · REVOCATION ·
REVOCATION FRESHNESS + OFFLINE POLICY · AUDIENCE · NONCE · HUMAN CONFIRMATION.
## 7. Forbidden authority
Some capabilities MUST be structurally ungrantable — no consent can form them:
root.export, recovery.export, audit.disable, authority.exceed-owner,
history.rewrite. Border Control MUST reject these regardless of the request.
## 8. Revocation freshness
Offline verifiers MUST NOT pretend revocation is instant. Each Authority Object
MUST declare how stale revocation information MAY be. When offline and staler
than that bound, the verifier MUST deny (REVOCATION_STALE). The less fresh the
network state, the smaller the authority.
## 9. Replay protection
A verifier MUST reject a previously consumed invocation where the capability is
single-use (NONCE_REPLAY). Invocations MUST bind nonce, audience, id, time,
resource, parameters, and a usage counter.
## 10. Receipts
A gateway can prove exactly one thing: that it evaluated authority and returned
a decision. It cannot prove that a bank settled, that a door opened, or that a
message left the building. A single receipt claiming "it happened" therefore
asserts evidence the protocol never held.
Receipts are consequently SPLIT into three types. Each names its own ceiling,
and an implementation MUST NOT present one as another.
### 10.1 Authority Decision Receipt
Issued by the gateway for EVERY evaluation — ALLOW and DENY alike. A refusal is
evidence and MUST be receipted.
Fields: authority id, invocation id, subject, capability, decision, reason code,
evaluating gateway, evaluation time, opaque proof.
Proves: authority was evaluated against this invocation and this decision was
returned. Proves NOTHING about whether the action was then carried out.
### 10.2 Execution Receipt
Issued by the executor that acted on an ALLOW. It MUST cite the §10.1 receipt
that authorized it; an execution receipt that cites no decision, or cites a
DENY, MUST be rejected as malformed.
Fields: cited decision receipt, executor identity, dispatch time, result, data
disclosed, reversibility, opaque proof.
Proves: the attempt was dispatched. Proves NOTHING about whether it took effect.
### 10.3 Consequence Receipt
Issued only when an external attestor reports back. It MUST cite the §10.2
receipt it settles, and MUST name the attestor in settledBy. The attestor is
never the gateway.
The outcome field is exactly one of:
CONFIRMED_SUCCESS an attestor confirms the consequence occurred
CONFIRMED_FAILURE an attestor confirms it did not
UNKNOWN no attestor has reported
A verifier MUST NOT read UNKNOWN as either success or failure. UNKNOWN is the
correct and honest state for an action whose consequence has not settled, and it
is the default. The settledAt field MUST be null while outcome is UNKNOWN.
Proves: what the named attestor asserted. The protocol records the attestation;
it does NOT vouch for the attestor.
### 10.4 What the chain proves
The three types compose, and the ceiling of the whole chain is the weakest link
present — never the strongest:
decision only authority was evaluated and permitted
+ execution the action was dispatched
+ CONFIRMED_SUCCESS an attestor confirms it took effect
INV-3 holds across all three: no receipt means no VERIFIABLE claim of
completion. The consequence may still have occurred. We govern evidence, not
reality — and none of the three proves the action was WISE. Judgment stays human.
## 11. Reason codes (normative)
OK · FORBIDDEN_CAPABILITY · BAD_ISSUER · SUBJECT_MISMATCH ·
BAD_AUTHORITY_SIGNATURE · BAD_INVOCATION_SIGNATURE · CAPABILITY_MISMATCH ·
RESOURCE_MISMATCH · VALUE_LIMIT_EXCEEDED · TOTAL_LIMIT_EXCEEDED ·
CURRENCY_MISMATCH · NOT_YET_VALID · EXPIRED · MAX_USES_EXCEEDED ·
RATE_LIMIT_EXCEEDED · DELEGATION_INVALID · REVOKED · REVOCATION_STALE ·
OFFLINE_NOT_ALLOWED · OFFLINE_VALUE_EXCEEDED · AUDIENCE_MISMATCH ·
NONCE_REPLAY · HUMAN_CONFIRMATION_REQUIRED
## 12. The trust model
Every agent is untrusted by default. Every model is untrusted by default.
The model is not the security boundary. Border Control is.
## 13. Independence
The protocol MUST NOT depend on any single vendor. Money Musk implements it,
Echo demonstrates it, but the protocol belongs to everyone. Anyone MUST be able
to implement it, fork it, audit it, and verify the same test vectors.
No sign-up, no key, no attribution. Take the spec, the schema, and the vectors — build your own verifier and check it against the same vectors. That is how a protocol becomes infrastructure.
Technology may increase human power without increasing its power over the human.
The human is the source of authority. Identity is not authority. Memory is not permission. Agents receive capabilities, never ownership. Delegation may narrow power, never silently enlarge it. The model never governs its own permissions.