Poppy Lab PAP 0.3Open the playgroundPlayground

Send an agent to the shops. Nothing changes until you sign.

Poppy Lab is an independent test bench for the Personal Agent Protocol, draft 0.3. Run a Personal Agent with your own model key, point it at two fictional Companies, and watch every step it takes: discovery, sign-in, signed Sessions, and changes that wait for your approval.

Bring an OpenAI or Anthropic key, or try the keyless protocol demo. The shops are fictional: nothing is charged or shipped.

Registered requestPL-JM-0001
From
Poppy, your agent
To
Juniper Market

“Move my delivery to Saturday.”

  1. Discovered/.well-known/poppy.json · issuer verified
  2. Session startedPoppy-Session · ES256, signed out
  3. Signed inJuniper's own page · Alex · poppy:read poppy:write
  4. Proposal held403 approval_required · revision 1793646108
  5. Awaiting your signatureNothing has changed yet. The agent can't approve it.
  6. Delivered onceThursday → Saturday · a retry replays it
Sample trace. In the playground, you sign on a real proposal.

The route of one request

  1. Your agent finds the Company

    Poppy reads /.well-known/poppy.json, checks the Company's own sign-in server, and starts a Session signed with its own key.

  2. You sign in on the Company's page

    The Company shows which agent is asking. Pick a fictional customer; access is read-only unless you also allow change proposals.

  3. Changes wait for your signature

    The agent proposes exact terms. The Company holds them until you approve in Poppy, then performs them at most once.

Three sites, one lab

The playground

poppylab.dev/playground

A chat-first Personal Agent. Choose GPT-6 Luna or Sonnet 5 with your own key, connect a Company, and open the Inspector for the discovery document, the Session and every API call. Approval cards show exact terms; the model can't press them.

Models
OpenAI-compatible · Anthropic
Your key
Sent per request, never stored on the server
Open the playground
JM · PAP 0.3 · Ops v2

Juniper Market

juniper.poppylab.dev

A neighbourhood grocery with a full customer account: basket, recurring delivery, orders, simulated invoices, profile and support cases. The website and your agent share the same data.

Customers
Alex, Maya, Leo
Scopes
poppy:read poppy:write

“Move my recurring delivery to Saturday.”

LN · PAP 0.3 · Ops v2

Lantern Noodle Bar

noodles.poppylab.dev

A noodle bar with a menu, delivery slots and scheduled orders. Change dishes or the slot; the approval shows the price difference first.

Customers
Sam, Robin
Scopes
orders:read orders:write

“Add a matcha ice cream and move it to Sunday lunchtime.”

Every visitor gets a separate copy of the fictional customers. An idle copy starts again after 24 hours.

What stays below the model

  • Keys and tokens. Code signs and sends them. The model never sees an access token, a private key or your model key.
  • Approvals. The model can read and propose. Only your click approves; words in the chat never do.
  • Company content. Whatever a Company returns, the model still can't approve a change or see a secret.
  • Your session. Each browser has its own agent, User IDs and conversation, unlinkable across Companies.

Bring your own agent

Juniper and Lantern accept any Personal Agent with an HTTPS client_id that serves its metadata and keys, with redirect URIs from that metadata. Both speak Operations v2. Replace {company} with juniper.poppylab.dev or noodles.poppylab.dev.

CodeWhatWhere, on https://{company}Spec
DIDiscovery/.well-known/poppy.json§3
RSProtected resource/.well-known/oauth-protected-resource§3.2
ASAuthorization server/.well-known/oauth-authorization-server§3.2
IDYour agent's identityHTTPS client_id, metadata and JWKS§4.1
SIDirect Sign-InGET /oauth/authorize · PKCE S256§4.2
TKTokens and refreshPOST /oauth/token · private_key_jwt, DPoP§4.4–4.5
RVRevocationPOST /oauth/revoke§4.6
SHSession headerPoppy-Session on every API request§5.2–5.3
APAPIs/openapi.json · OpenAPI 3.1§7
EXExcluded tasks/poppy/excluded-tasks.json§9.1
OPApprovals403 approval_required → resend with Poppy-ApprovalOperations v2

Poppy's own identity: /agent/client.json and /agent/jwks.json.