/emilia-trust-verification
Verify the authenticity of AI-agent authorization receipts and human-device signoffs. Use this whenever a user shares a "trust receipt", an "authorization receipt", a "signoff", or WebAuthn/passkey approval evidence and asks whether it is valid, genuine, or tampered with. Pairs
$ npx -y skills add emiliaprotocol/emilia-protocol --skill emilia-trust-verification --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/emilia-trust-verification
Context preview
The summary Claude sees to decide when to auto-load this skill.
Verify the authenticity of AI-agent authorization receipts and human-device signoffs. Use this whenever a user shares a "trust receipt", an "authorization receipt", a "signoff", or WebAuthn/passkey approval evidence and asks whether it is valid, genuine, or tampered with. Pairs
SKILL.md
emilia-trust-verification.SKILL.mdname: EMILIA Trust Verification
description: >-
Verify the authenticity of AI-agent authorization receipts and human-device
signoffs. Use this whenever a user shares a "trust receipt", an
"authorization receipt", a "signoff", or WebAuthn/passkey approval evidence
and asks whether it is valid, genuine, or tampered with. Pairs with the
public EMILIA Protocol MCP connector (tools prefixed ep_). Verification is
read-only public-key math; no account is required.
license: Apache-2.0
EMILIA Trust Verification
EMILIA Protocol makes a high-risk AI-agent action carry a device-key signoff plus a **receipt anyone can verify offline**. This skill guides you to verify those artifacts using the public EMILIA MCP connector. It requires the connector to be enabled (server URL `https://www.emiliaprotocol.ai/api/mcp/mcp`, read-only, no auth).
When to use this skill
Engage when the user:
- Pastes a JSON object with `"@version": "EP-RECEIPT-v1"` (a **trust receipt**),
or asks "is this receipt real / altered / valid?"
- Pastes an object with a `context` + `webauthn` block (a **device signoff**),
or asks whether the WebAuthn/passkey ceremony and exact-action binding verify.
If the user mentions a receipt or signoff but hasn't pasted it, ask them for the JSON (they can copy a real example from <https://www.emiliaprotocol.ai/verify>).
The two public tools
| Tool | Use it to | |---|---| | `ep_verify_receipt` | Verify an EP-RECEIPT-v1 receipt — Ed25519 signature over canonical JSON + optional Merkle anchor. | | `ep_verify_signoff` | Verify a Class-A device signoff — a WebAuthn (ECDSA P-256) assertion bound to the exact action. |
Each verify tool accepts the JSON object directly; the public key can be passed explicitly or, for self-contained evidence packets, is read from an embedded `issuer_public_key` / `approver_public_key` field.
How to interpret results
**Receipt** — `{ valid, checks: { version, signature, anchor } }`:
- `valid: true` → the receipt was signed by its issuer and has not been altered.
State this plainly; the user can re-verify it themselves, offline, forever.
- `valid: false` with `signature: false` → **the receipt does not match its
signature** — it was tampered with, or the wrong key was used. Do not treat a failed receipt as trustworthy. Call out which check failed.
- `anchor: false` → the Merkle inclusion proof does not reconstruct the claimed
root (the anchor was altered).
**Signoff** — six checks. All must be true for `valid: true`:
- `challenge_binding` → the signature is bound to **this exact action**; if
false, the action was changed after signing (e.g., the amount).
- `user_present` + `user_verified` → a real human was present and verified with
a biometric / PIN (Face ID, Touch ID, passkey).
- `signature` → signed by the approver's enrolled device key.
- `client_data_type` / `rp_id_hash` → a genuine assertion scoped to the right
relying party.
When a signoff verifies, the precise statement is: *the supplied WebAuthn assertion verifies under the caller-supplied public key, RP ID, and allowed origins; it records user presence and user verification and binds the signed challenge to the supplied exact action.* It does **not** by itself establish legal identity, authority, what the user perceived, or relying-party acceptance. When it fails, name the specific check and what it implies.
Demonstrate tamper-evidence
A compelling, honest demo: after verifying a valid receipt, offer to change one field (e.g. an amount from `82000` to `820000`) and verify again — it will flip to `valid: false`, showing the receipt is cryptographically bound to the exact action. Only do this on example data the user provided.
Boundaries (state these if asked)
- Verification proves **authenticity and integrity**, not real-world currency:
it does not prove a key wasn't revoked after signing, nor what the human literally saw on screen (the protocol treats presentation/WYSIWYS as a stated residual risk).
- These tools are **read-only**. Creating receipts, opening signoffs, or gating
agent actions happens through EMILIA's authenticated APIs / the EMILIA Guard Claude Code plugin — not this connector.
- Rich trust profiles and policy evaluation are authenticated API surfaces and
are deliberately not exposed by this no-auth public connector.
- The same verifier is open source (Apache-2.0): `npm i @emilia-protocol/verify`
(Node + browser), with JavaScript, Python, and Go implementations proven interoperable. Nothing here requires trusting EMILIA's servers.
Read more
name: EMILIA Trust Verification description: >- Verify the authenticity of AI-agent authorization receipts and human-device signoffs. Use this whenever a user shares a "trust receipt", an "authorization receipt", a "signoff", or WebAuthn/passkey approval evidence and asks whether it is valid, genuine, or tampered with. Pairs with the public EMILIA Protocol MCP connector (tools prefixed ep_). Verification is read-only public-key math; no account is required. license: Apache-2.0
EMILIA Trust Verification
EMILIA Protocol makes a high-risk AI-agent action carry a device-key signoff plus a **receipt anyone can verify offline**. This skill guides you to verify those artifacts using the public EMILIA MCP connector. It requires the connector to be enabled (server URL `https://www.emiliaprotocol.ai/api/mcp/mcp`, read-only, no auth).
When to use this skill
Engage when the user:
- Pastes a JSON object with `"@version": "EP-RECEIPT-v1"` (a **trust receipt**),
or asks "is this receipt real / altered / valid?"
- Pastes an object with a `context` + `webauthn` block (a **device signoff**),
or asks whether the WebAuthn/passkey ceremony and exact-action binding verify.
If the user mentions a receipt or signoff but hasn't pasted it, ask them for the JSON (they can copy a real example from <https://www.emiliaprotocol.ai/verify>).
The two public tools
| Tool | Use it to | |---|---| | `ep_verify_receipt` | Verify an EP-RECEIPT-v1 receipt — Ed25519 signature over canonical JSON + optional Merkle anchor. | | `ep_verify_signoff` | Verify a Class-A device signoff — a WebAuthn (ECDSA P-256) assertion bound to the exact action. |
Each verify tool accepts the JSON object directly; the public key can be passed explicitly or, for self-contained evidence packets, is read from an embedded `issuer_public_key` / `approver_public_key` field.
How to interpret results
**Receipt** — `{ valid, checks: { version, signature, anchor } }`:
- `valid: true` → the receipt was signed by its issuer and has not been altered.
State this plainly; the user can re-verify it themselves, offline, forever.
- `valid: false` with `signature: false` → **the receipt does not match its
signature** — it was tampered with, or the wrong key was used. Do not treat a failed receipt as trustworthy. Call out which check failed.
- `anchor: false` → the Merkle inclusion proof does not reconstruct the claimed
root (the anchor was altered).
**Signoff** — six checks. All must be true for `valid: true`:
- `challenge_binding` → the signature is bound to **this exact action**; if
false, the action was changed after signing (e.g., the amount).
- `user_present` + `user_verified` → a real human was present and verified with
a biometric / PIN (Face ID, Touch ID, passkey).
- `signature` → signed by the approver's enrolled device key.
- `client_data_type` / `rp_id_hash` → a genuine assertion scoped to the right
relying party.
When a signoff verifies, the precise statement is: *the supplied WebAuthn assertion verifies under the caller-supplied public key, RP ID, and allowed origins; it records user presence and user verification and binds the signed challenge to the supplied exact action.* It does **not** by itself establish legal identity, authority, what the user perceived, or relying-party acceptance. When it fails, name the specific check and what it implies.
Demonstrate tamper-evidence
A compelling, honest demo: after verifying a valid receipt, offer to change one field (e.g. an amount from `82000` to `820000`) and verify again — it will flip to `valid: false`, showing the receipt is cryptographically bound to the exact action. Only do this on example data the user provided.
Boundaries (state these if asked)
- Verification proves **authenticity and integrity**, not real-world currency:
it does not prove a key wasn't revoked after signing, nor what the human literally saw on screen (the protocol treats presentation/WYSIWYS as a stated residual risk).
- These tools are **read-only**. Creating receipts, opening signoffs, or gating
agent actions happens through EMILIA's authenticated APIs / the EMILIA Guard Claude Code plugin — not this connector.
- Rich trust profiles and policy evaluation are authenticated API surfaces and
are deliberately not exposed by this no-auth public connector.
- The same verifier is open source (Apache-2.0): `npm i @emilia-protocol/verify`
(Node + browser), with JavaScript, Python, and Go implementations proven interoperable. Nothing here requires trusting EMILIA's servers.
<!-- Discord invite must be set to never expire with unlimited uses. A default Discord invite expires in 7 days and leaves a dead link on this page. -->

