problem
Every current path for delegated agentic work hands the requesting surface control of the agent — its prompts, its tools, its outputs. The user is reduced to a credential.
aka “Easy Agentic Federation”
# gain control over your agentic work by separating the intent from the execution
Apps may request agentic work, but users control review, execution, routing, and result release.
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.
The larger bet: re-derive the web's platform APIs and mobile's app-permission model from first principles — agent-native, privacy- and sovereignty-respecting, and evolvable — on a substrate of effects and capabilities instead of ambient authority.
Every current path for delegated agentic work hands the requesting surface control of the agent — its prompts, its tools, its outputs. The user is reduced to a credential.
Separate intent from execution. Surfaces may propose work; the user's environment decides what runs, where, with what tools, on what data, and what leaves.
stack walkthrough
A filmed walkthrough of the deployed stack: one script tag grows a waitlist form on a static page; signups append to an AYNIL log you own; the page token gets a live 403 on read; desh connects through a gated approval and materializes the log as files; EZAF's enrich-cli appends sibling enrichments (scripted model, disclosed on screen); the timeline rewinds, forks, and replays from a share link without tokens; the end card is an honest comparison ledger — concessions included.
Open on YouTube · Filmed against aynil.sudoscience.dev, layers.sudoscience.dev, and desh.sudoscience.dev · cut run-20260617T041650Z
decoupling loop
Any app, site, layer, issue, or message can ask for work without holding execution authority.
The request carries prompt, inputs, capabilities, callback, and expiry — reviewable as a unit before anything executes.
Review, route, deny, or delegate before effects run. No execution before approval.
Results return only through approved continuations — callback, handoff, or rendezvous. No release before approval.
one instantiation
The ezaf:// link + local review console is one worked example of the decoupling — not the product definition.
A website creates an ezaf:// URL pointing at a fetchable request manifest.
The user inspects origin, tools, backend, and prompt in a handler app before work runs.
Approved output returns through callback, extension handoff, or local rendezvous handle.
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 (the WebAssembly System Interface), 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.
sourcesvercel-labs/just-bash
the bigger bet
EZAF's effects-and-capabilities core isn't only for agents. The program is to rebuild the web's platform APIs and mobile's app/permission model from first principles — agent-native, privacy- and sovereignty-respecting, and evolvable — where every capability is an effect a surface requests and the user's environment grants, scopes, logs, and revokes.
Geolocation, clipboard, notifications, camera, file access — the web already gates capabilities behind per-feature prompts. EZAF generalizes the move: any capability, from any surface, under user-owned policy and provenance, instead of a fixed browser-blessed list.
App stores proved scoped, revocable, per-app grants at scale — then froze them behind a vendor and a review queue. Effects + capabilities make the same model open and composable: grants are data the user holds, not a platform's gift.
Humans and agents request the same typed effects through the same gate. Nothing has to be retrofitted for autonomy, because authority never lived in the caller — it lives in the handler.
Every text box is an editing request, not a widget (the investigation once carried its own name). A surface emits RequestTextEdit; the user's editor — the one with undo, history, lint, and review — handles the act; ApplyDraft returns through an authorized effect, never auto-submit. Existing bridges (Firenvim, GhostText, $EDITOR, Fig's accessibility overlay) move the text; the effect moves the session: draft history, provenance, per-site allowlists, and a request an agent can call instead of typing into a field. It even makes password managers saner — credentials stay sovereign to the password manager; the broker handles every other high-stakes box with the same field-classification and origin-binding discipline.
effects in the wild
The text-editing effect above isn't alone. Rhett's page-local field agents — logos, ethos, pathos, falsifier, translator — are a catalog of EZAF effects, and Layers is how they reach a page that never built an agent slot. Layers is where, Rhett is what, EZAF is who-decides-and-with-what.
A surface, mounted as a layer, proposes a comment; it never runs your commenter or reads the draft. Your handler reviews, runs the agent locally, previews, and you release into the thread. Humans and agents post into the same layer — agent comments carry provenance, exactly Rhett's "filed by the ethos agent" framing, now with a real consent gate instead of "by hand, for now."
The sharp case for context asymmetry. The surface emits RequestTranslation{text} and never receives your language, glossary, tone, or memory — those stay handler-side capabilities EZAF injects into the local run. The site gets back only the released rendering: your translator renders it the way you read, and the page learns nothing about you beyond the artifact you chose to emit.
Neither effect needs the host to cooperate. A layer binds the comment thread or the translatable block by meaning (meta-DOM addressing), declares in its manifest what it reads and what leaves, and carries the field agents onto a surface that never asked.
Rhett stops being a handoff-spec-with-manual-runs the moment EZAF is the thing invoking its agents, and Layers is how those invocations reach surfaces with no agent slot. Same effects-and-capabilities core as the text-editing effect — comment and translate are just the next two effect types.
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
every text box as a RequestTextEdit → user-owned editor → ApplyDraft; browser + native-host prototype, PM-sovereign for credentials (the former Medium Endian investigation, folded in)
https://youtu.be/674ZAy8FoeU — filmed walkthrough: enrich-cli appends through the same one-way door as the web page; full stack in the Layers → AYNIL → DESH → EZAF cut
sourcesyoutu.be/674ZAy8FoeU
Electron protocol handler with review console (ezaf-prototype repo)
PreToolUse → typed effect requests routed through EZAF handlers
provenance layer
edges
Surfaces propose agentic work; the user's environment reviews, routes, executes, previews, and releases it. That decoupling is the product — the protocol handler is one way to wire it on the web.