| Actor | Responsibility | Authority |
| Owner | Supplies instruction, terms, budget and exact/bounded approval | Creates immutable grants |
| Consumer / executor | Proposes one action and explains it | Cannot grant itself permission |
| Halfspan guardian | Returns ALLOW, PAUSE or TERMINATE | Cannot override hard checks |
| Gateway | Checks state, grants, counters and bindings; issues single-use permits | Enforces authorization |
| Browser adapter | Executes the approved control in an isolated browser | Fixed-origin, scoped session |
| Hosted store | Verifies signed dispatch permits and commits effects in D1 | Enforces exact request binding |
{ "goalRestatement": "The original owner instruction", "candidates": [{ "id": "candidate-1", "action": { "kind": "observe", "operationId": "merchant.catalog", "targetRef": "<current catalog target reference>", "args": {} }, "purpose": "Inspect the product before preparing the purchase.", "disposition": "proposed", "rejectionReason": null }], "selectedCandidateId": "candidate-1", "justification": { "summary": "This read supplies the product terms needed for the requested purchase.", "evidenceRefs": ["<current observation ID>"] }, "expectedEffect": { "operationId": "merchant.catalog", "transactionProposalId": null, "disclosedFields": ["<copy exact catalog fields>"], "postconditions": ["<copy exact catalog postconditions>"] }, "uncertainties": [] }
123456{ "decision": "PAUSE", "reasonCode": "MISSING_EVIDENCE", "explanation": "The justification must reference the current observation.", "clarificationRequest": null }
| Method and path | Contract |
| GET /api/v1/owner/status | Provider availability and browser capability |
| GET /api/v1/owner/runs | Up to 100 complete RunView objects, newest first |
| POST /api/v1/owner/runs | Create and initialize a scoped run |
| GET /api/v1/owner/runs/:id | Complete current run view and timeline |
| POST /api/v1/owner/runs/:id/step | Advance one supervised action |
| POST /api/v1/owner/runs/:id/play | Advance until pause/completion, max 16 steps |
| POST /api/v1/owner/runs/:id/revoke | Revoke session and unused permits |
| POST /api/v1/owner/runs/:id/retry | Resume only eligible retry/configuration stops; no dispatch |
| POST /api/v1/owner/runs/:id/clarify | Body: {"clarification":"..."}; cannot expand grant |
| POST /api/v1/owner/runs/:id/approve | Body: {"proposalId":"<uuid>"}; exact approval |
| POST /api/v1/owner/runs/:id/simulate | Synthetic local lifecycle event; unavailable for hosted runs |
| GET /api/v1/owner/runs/:id/evidence | Signed evidence export |
| GET /api/v1/owner/runs/:id/events | SSE signed events; Last-Event-ID resumes by sequence |
| GET /api/v1/owner/runs/:id/screenshot | Latest scoped browser PNG, or 404 |
| GET /api/v1/owner/public-key | Public verification key |
| GET /api/v1/owner/specification | This Markdown contract |
| GET /api/v1/owner/attacks | Authored adversarial fixture catalog |
| POST /api/v1/owner/attacks/run | Body: {"attackId":"...","service":"merchant"} |
| GET /api/v1/owner/evaluations/cases | Frozen case catalog, expected verdicts, and default comparison arms |
| GET /api/v1/owner/evaluations | Saved frozen semantic comparisons |
| POST /api/v1/owner/evaluations | Body: {"executionMode":"replay"} or live; no domain actions. Use the CLI for a bounded live matrix; the default live matrix exceeds the call ceiling |
12345678910111213{ "service": "merchant", "target": "hosted", "channel": "browser", "trafficActor": "agent", "mode": "bounded", "executionMode": "live", "executor": "openai", "interrogator": "openai", "reasoningEvidence": false, "budgetCents": "13700", "instruction": "Buy one Fieldwork keyboard for $137 total using the approved terms." }
Authorization: Bearer <restricted-session-token> against the exact service origin.| Method and path | Contract |
| GET /api/v1/capabilities | Available scoped action catalog |
| GET /api/v1/observation | Current trusted observation |
| POST /api/v1/turns | Consumer report; returns turnId, decision and optional permit |
| GET /api/v1/decision | Last decision and pending permit |
| POST /api/v1/operation | Body {"action":{...}}; x-step-permit and x-idempotency-key bind dispatch |
{version: 1, outcome: ...} with a proposal, clarification, authorization_required, or refusal discriminator. External HTTP/MCP proposal submission continues to accept the original TurnProposal shape. Native provider refusals are normalized separately and cannot authorize execution.stopContext (version 1): category, source, reasonCode, message, recovery, attemptId, observationId, and dispatch. This is a runtime classification, not a provider-controlled permission. Unknown versions fail closed at recovery.POST /api/v1/owner/runs/:id/retry accepts {} and resumes only retry/configuration stops; it does not dispatch. The existing clarification route accepts only eligible clarification/refusal stops, and exact approval requires a fresh approval stop. All paths reject unresolved claimed or hosted effects. Refusal clarification never changes original authority. See decision supervision for classification, evidence, and compatibility details.trafficActor: "agent" | "human" analytics metadata. Run responses expose this value, defaulting existing operator sessions to agent. This is caller-reported attribution, not proof of identity, and does not change authorization or execution behavior.GET /api/v1/owner/workspace returns registered services and guardians. Authenticated owner routes create service inventory and guardian drafts; PUT /api/v1/owner/workspace/guardians/:id requires the current revision. Concurrent edits reject rather than overwrite. Service URLs are inventory metadata, never agent-selected dispatch destinations.POST /api/v1/owner/workspace/guardians/:id/verify runs synthetic reads through the installed local HTTP gateway. It tests caller authentication, mandatory permits, origin rejection, authorized receipts and duplicate-request idempotency without placing an order, transfer or trade or calling a model. It separately checks configured service, environment, operations, channels and native WebMCP capability. Verification events are excluded from operational dashboards.POST /api/v1/owner/workspace/guardians/:id/activate requires {revision} and successful verification of that same revision within one hour. Activation supports the built-in local service adapters. Published policy versions are immutable. Published enforcement becomes degraded after 24 hours without fresh verification and publication. Custom or remote services remain drafts until their backend integration is implemented.guardianId. The backend resolves and snapshots the published policy as guardianBinding, including guardian, service, environment and policy version. It pins the authorization mode, budget and guardian provider, limits observation catalogs and grants to the selected operations, and rejects a mismatched service or channel. Publishing another version does not change active grants. Runs without a binding remain legacy sessions.document.modelContext.registerTool, getTools, and executeTool(tool, inputObject); API detection, registration, invocation and backend enforcement have independent readiness labels. See the WebMCP draft for the API shape.GET /api/v1/owner/hosting reports database connectivity, local runtime location, in-process worker status, signing-key fingerprint and check time. Company tenancy, deployment controls, employee enrollment and retention are not implemented; the dashboard displays those limits explicitly.