Skip to content
↑↓ to move · Enter to openEsc to close
Release notes · badges · verification card · security

Trust presentation now fails closed

Shipped · commits 1951d95, c2b4d94

Both AgenID badges and the Verification Card mapped levels with the same shape of logic: if the level is L1_REGISTERED, render amber; otherwise render emerald VERIFIED. An unrecognized, absent, empty or malformed level therefore rendered as the strongest claim the product can make.

Nothing forged a signature. The presentation layer upgraded on ignorance: the verified state was produced by the absence of information rather than by any evidence. This release moves every trust-state decision into one module that fails closed.

What was wrong

A trust surface has one job that matters more than the others: never show more than the evidence supports. An else branch that defaults to verified inverts that. Any bug upstream, such as a renamed field, a new level string, a network error that left the level empty, or a typo in an embed, would have surfaced to a reader as a green verified badge.

The defect lived in three places, the two badges and the card, each with its own copy of the mapping, which is how it survived review. Fixing one would have left two.

One canonical module

packages/web/lib/trust-presentation.ts now enumerates the level names the product knows how to present and resolves everything else to a neutral, non-verified state. Every surface that shows a real agent's state reads its level from the authoritative response and routes it through this module.

/badge.js used to be a static file with its own table. It is now a route generated from the canonical module, so no consumer carries its own mapping and a future change lands everywhere at once.

  • DECLARED renders amber. It sits below L1, and the panel states that no third party has checked the claims.
  • L1_REGISTERED renders amber. L1 is a self-declaration.
  • Anything unrecognized renders neutral grey. Not verified is never red, because absence of verification is not a negative finding.
  • /badge/<agenid>/shield.svg always returns 200 and reads NOT REGISTERED in grey for an unknown identifier, since a non-200 would render as a broken image.

Why emerald is reserved

The brand guide reserves Verified Emerald strictly for verified state: a specific claim that a third party checked against evidence. Nothing the reference deployment issues today meets that bar. The reference deployment at agenid.com issues nothing above L1_REGISTERED today: L2 and higher require a VerificationAssertion signed by a root authority key, and that key has not been created yet. L5 is reserved and is not issuable at all.

So in practice no real agent's badge renders emerald today, and that is the correct result.

What a badge does not say

A badge reports an identity state. Which agent is acting is not the same question as what it is allowed to do. AgenID answers the first. Protocol v1.1.1 defines no signed authorization object, so permission stays with the operator and with the party on the other side.

A badge is also a convenience, not the check. A relying party that needs certainty should resolve the envelope and re-verify signatures itself, which the registry cannot forge.

How to try it

Embed the badge with /badge.js or reference /badge/<agenid>/shield.svg from a README, as described on the badge page. Point it at an identifier that does not exist and you will get a neutral grey badge, not an error and not a verified state. The Verification Card entry explains what the card shows.

Frequently asked questions

Why does my registered agent's badge show amber and not green?

Because L1_REGISTERED is a self-declaration. Emerald is reserved for claims a third party checked, and no such level is issued today.

Can a badge ever show verified by mistake now?

The failure mode that did that is gone: unknown or missing levels resolve to neutral. A reader who needs certainty should still re-verify the envelope rather than rely on a badge.

Why is not-verified grey rather than red?

An agent without verification has not failed anything. Rendering it red would present missing evidence as negative evidence.

What agenid.com issues today

The reference deployment at agenid.com issues DECLARED and L1_REGISTERED only. L2_DOMAIN_VERIFIED and higher require a VerificationAssertion signed by a root authority key, and that key has not been created yet. L5 is reserved by the specification and is not issuable at all.

Identity is not permission

Which agent is acting and who declared it is one question. What that agent is allowed to do is another, and it stays with the party on the other side and with the operator. Protocol v1.1.1 defines no signed authorization object.

Give your agent an identity

Register an agent in the browser — the signing key is generated on your device and never sent to AgenID — or resolve an existing AgenID and re-check its signature yourself.