problem
Every current path for "website asks an agent to do something" hands the website control of the agent — its prompts, its tools, its outputs. The user is reduced to a credential.
aka “Easy Agentic Federation”
# user-owned effect routing for agentic work
Websites may request agentic work, but users control review, execution, routing, and result release.
The protocol handler is one instantiation. The primitive underneath: EZAF is an effect-routing layer for user-controlled authority — any surface can propose work, any runtime can request effects, any handler can satisfy them, and the user controls authority, policy, continuity, and release.
Every current path for "website asks an agent to do something" hands the website control of the agent — its prompts, its tools, its outputs. The user is reduced to a credential.
Let websites ask your agent to do work without letting websites control your agent. The website initiates; the user's local environment decides what runs, where it runs, with what tools, on what data, and what leaves.
federation loop
A website creates an ezaf:// protocol-handler URL pointing at a fetchable request manifest.
Origin, prompt, inputs, requested capabilities, callback, state nonce, expiry — declared up front, reviewable as a unit.
The user inspects origin, tools, backend, and prompt before the agent does any work. No execution before approval.
Approved output returns through a callback, extension handoff, or local rendezvous handle. No release before approval.
security contract
No execution happens before the user approves the reviewed manifest.
The website gets nothing until the user releases the previewed result.
Capabilities outside the manifest do not execute.
Cross-origin callback destinations are warned or blocked by default.
effects, not authority
The agent-sandboxing question — no firewall/proxy/temp credentials, bash can't reach the secret, streaming I/O — was asked publicly by an eval-platform founder, and it has no clean answer while the agent is a monolithic CLI holding credentials and running tools. The sandbox is a symptom of the wrong abstraction.
Agents may request effects; handlers possess authority; untrusted code receives only effect results. The model API key becomes an implementation detail of the model.complete handler — there is nothing for bash to leak.
Today the agent has power and the sandbox subtracts it after the fact. Better: the agent has no power and handlers grant specific effects — model.complete, shell.run, fs.read/write, net.fetch, artifact.release, user.ask. State + Event → State + Effects; the handlers own the dirty world.
v0 wrap existing CLIs → v1 structured effect log → v2 hooks as guards → v3 hooks as routers (delegate to EZAF handlers: sandbox, CI, WASI, human approval) → v4 split model client from tool runner → v5 native effect-mode agents. Nothing is replaced; authority is relocated.
Typed effect traces beat transcripts as eval artifacts: did the agent request the right effects, ask for excess authority, route correctly, recover from denials, leak into stdout? The architecture that makes sandboxing tractable makes behavior testable.
Filed by hand, the way Rhett's logos agent will file it: vercel-labs/just-bash ("Bash for Agents") sandboxes by emulation — a pure-TypeScript bash over a virtual filesystem, so there is no real process to leak from. Relation: adjacent prior art; impact: complicates — and concedes the premise: the interpreter is a handler that owns the whole world. Emulate or relocate, the authority leaves the agent either way.
roadmap
Tracks the initiating tab, brokers callback state, and places approved results back where the request started.
Manifests verifiable against a trusted origin or known publisher key.
Origins, keys, callbacks, and capability defaults as a user-editable policy layer.
artifacts
ezaf.sudoscience.dev
ezaf site /effects — the sandbox is the wrong boundary; move authority into handlers
the effects invariant in workflow form: recipes request work through typed ports — task executor, completeness judge, clock — and the harness owns the authority; the same recipe runs under Temporal and AWS durable Lambdas because no engine leaked in
the EZAF loop you can click: in desh's browser shell (desh.sudoscience.dev/demo), a canned agent requests typed effects — reads pass by policy, writes and releases gate on you — and approvals, denials, and the agent's adaptation to a denial all land on the session ledger
versioned request/continuation types
Electron protocol handler with review console (ezaf-prototype repo)
PreToolUse → typed effect requests routed through EZAF handlers
provenance layer
edges
A website proposes agentic work; the user's environment reviews, routes, executes, previews, and releases it. That distinction is the product — and it generalized the day a stranger asked for a rock-solid agent sandbox and the honest answer was: wrong abstraction.