$ sudoscience
~/projects/ezaf

EZAF

prototype

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.

ezaf.sudoscience.devwatch the demo →

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.

thesis

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

Where do your signups actually live?

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

separate what is asked from what runs

surface proposes

Any app, site, layer, issue, or message can ask for work without holding execution authority.

intent declared

The request carries prompt, inputs, capabilities, callback, and expiry — reviewable as a unit before anything executes.

user gate

Review, route, deny, or delegate before effects run. No execution before approval.

explicit release

Results return only through approved continuations — callback, handoff, or rendezvous. No release before approval.

one instantiation

website protocol handler

The ezaf:// link + local review console is one worked example of the decoupling — not the product definition.

invocation link

A website creates an ezaf:// URL pointing at a fetchable request manifest.

local review console

The user inspects origin, tools, backend, and prompt in a handler app before work runs.

continuation contract

Approved output returns through callback, extension handoff, or local rendezvous handle.

security contract

what websites cannot do

run silently

No execution happens before the user approves the reviewed manifest.

receive early

The website gets nothing until the user releases the previewed result.

use undeclared tools

Capabilities outside the manifest do not execute.

redirect callbacks

Cross-origin callback destinations are warned or blocked by default.

effects, not authority

agents should emit effects, not hold 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.

the core invariant

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.

ambient APIs vs explicit effects

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.

hooks are the migration wedge

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.

the eval dividend

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.

field card: emulate vs relocate

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

platform APIs and permission models, re-derived

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.

web platform APIs, but sovereign

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.

mobile permission models, but evolvable

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.

agent-native from the start

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.

a worked effect: text editing

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

two more worked effects: comment and translate

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.

RequestComment

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."

RequestTranslation

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.

the mount is Layers

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.

why this composes

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

trust moves from prompts to provenance

browser extension bridge

Tracks the initiating tab, brokers callback state, and places approved results back where the request started.

signed intents

Manifests verifiable against a trusted origin or known publisher key.

trust registry

Origins, keys, callbacks, and capability defaults as a user-editable policy layer.

artifacts

status, honestly

site & link builderlive

ezaf.sudoscience.dev

effects doctrinelive

ezaf site /effects — the sandbox is the wrong boundary; move authority into handlers

agentic workflow cookbook (ports)prototype

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

approval gate, liveprototype

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

manifest shapeprototype

versioned request/continuation types

edit-session effectprototype

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)

stack demolive

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

local handlerprototype

Electron protocol handler with review console (ezaf-prototype repo)

hooks adapterroadmap

PreToolUse → typed effect requests routed through EZAF handlers

signed intents & registryroadmap

provenance layer

edges

connected investigations

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.