DRAFT 0.1A standard, not a moat — it belongs to everyone.the core laws →
ECHO AUTHORITY PROTOCOL · DRAFT 0.1

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

I

No Authority Object → no privileged action

Being intelligent, authenticated, or trusted grants nothing. Power begins only at a signed, human-rooted grant.

II

No valid Invocation → no execution

Standing permission is not action. Each attempt is a signed, bound, single-use request that must fit the grant.

III

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.

The enforcement core, running

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.

Generating human root + agent keys…
Delegation, proven

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.

Minting the parent grant…
Conformance

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 limitsOK
  • v02amount over per-action limitVALUE_LIMIT_EXCEEDED
  • v03would exceed total spendTOTAL_LIMIT_EXCEEDED
  • v04wrong currencyCURRENCY_MISMATCH
  • v05resource outside grantRESOURCE_MISMATCH
  • v06capability not the one grantedCAPABILITY_MISMATCH
  • v07subject is not the granteeSUBJECT_MISMATCH
  • v08expired authorityEXPIRED
  • v09not valid yet (not_before)NOT_YET_VALID
  • v10max uses already consumedMAX_USES_EXCEEDED
  • v11replayed nonceNONCE_REPLAY
  • v12bound to a different gatewayAUDIENCE_MISMATCH
  • v13tampered amount (signature breaks)BAD_INVOCATION_SIGNATURE
  • v14revoked by the humanREVOKED
  • v15offline + revocation too staleREVOCATION_STALE
  • v16offline + over the offline value limitOFFLINE_VALUE_EXCEEDED
  • v17never-grantable capabilityFORBIDDEN_CAPABILITY
  • v18step-up: human confirmation requiredHUMAN_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.

Interoperability

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.

Minting the human root grant…
Globally durable evidence

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.

The authority logtip ·
  1. genesis · 000000000000…
Notarize the tip on Bitcoin

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

The specification

Draft 0.1 — normative

§2

Identity MUST NOT imply authority.

A key, passkey, DID, or certificate proves the subject. It MUST NEVER be read as permission. authenticated ≠ authorized.

§3

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.

§5

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.

§6

An Invocation MUST bind the exact action.

subject · capability · resource · parameters · audience · nonce · time. This binding is what prevents replay and repurposing.

§7

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.

§8

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.

§9

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.

§11

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.

§14

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?'.

§24

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

Echo IDWho is the human or Echo?
Owner KeyWho controls this identity?
Authority ObjectWhat have they permitted?
InvocationWhat is being attempted now?
Border ControlMay it happen?
ReceiptWhat actually happened?
Authority GraphHow did that power move?

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.configure

Never-grantable

Structurally ungrantable (§14) — no consent can form these.

root.exportrecovery.exportaudit.disableauthority.exceed-ownerhistory.rewrite
Prior authority vs. confirmation

Every 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 sufficient
message.preparestanding grant sufficient
message.sendpolicy-dependent
payment.execute ≤ €20standing bounded grant may suffice
payment.execute > €20human presence required
property.transferhuman presence + strong authentication

The 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 time
A second implementation

Two 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.

49 / 49 tests green — the 18 Border Control conformance vectors, 18 attenuation and resource-language tests covering every escalation in §4.2, and 13 receipt tests pinning the §10 split. Run cargo test and watch it.
The divergence this panel used to report is now closed — and here is how to check

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 · verified
the canonical verifier — deterministic border_check + attenuation
echo-border-controlbuilt · verified
the reference enforcement proxy — a tiny stdin/stdout CLI
echo-authority-testsbuilt · verified
18 conformance vectors + 18 attenuation tests + 13 receipt tests — 49 green
echo-authority-wasmbuilt · verified
the same core, compiled to WebAssembly — runs right here
echo-authority-clibuilt · verified
keygen · mint · invoke · verify · attenuate — for developers + auditors

The 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.

loading the Rust verifier…
Adopt it

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.

Markdown
# 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.