Browser authority policy (v1)
This is the recorded decision for epic 4ddbe1: treat prompt/data
separation as a mitigation, and enforce authority at
system-controlled sinks. The executable cases live in Gherkin. This page
names the grant, the two browser contexts, the binding controls, and the
v1 exclusions. Sink enforcement is wired on the in-process control plane
through capability_sinks and CapabilityPolicy. Adversarial model
evals are task 1e09b4.
Related kernels already on the board:
- Page-content containment:
features/page_content_authority.feature - Immutable structured approval:
features/exact_consequential_approval.feature - Unbound authenticated browser stop:
features/unsupported_browser_action.feature - Overnight exact-argument rules:
features/overnight_gated_action.feature
Task grant
A human task grants a closed set of fields. Page content, model prose, and tool arguments cannot add a field.
| Field | Meaning |
|---|---|
| tools | Invocable tools for this task (browse, read_workspace, send, ...) |
| origins | URL origins the worker may fetch or open |
| recipients | Named destinations for structured send |
| file_scopes | /workspace prefixes the worker may read |
| egress_classes | Outbound classes listed below |
Egress classes:
| Class | Meaning |
|---|---|
none |
No outbound transfer |
approved_origin_fetch |
Read from a granted origin |
structured_send |
Connector send to a granted recipient after binding |
file_transfer |
Upload a granted file to a granted destination |
A request that names an ungranted tool, origin, recipient, file, or
egress class is denied. Denial is recorded for the user and must not
include session secrets. Executable cases:
features/task_authority_grant.feature.
Browser contexts
The household computer still holds one workplace identity. Bots are not a security boundary. Browser contexts are.
| Context | Credentials | Storage |
|---|---|---|
| Untrusted | No privileged cookies, CLI secrets, or ambient workspace secrets | Partition untrusted |
| Privileged | Only the named browser session for that service | Partition privileged:<service> |
Rules:
- Opening an untrusted page never copies privileged cookies into that context.
- A privileged context for
bankingcannot usemailcookies or CLI tokens. - The model-visible tool result never includes session secret values.
- Page content cannot promote an untrusted context to privileged.
Executable cases: features/browser_context_policy.feature.
Binding controls
Consequential classes remain send, publish, purchase, delete,
and production_change (Approval spec).
| Situation | Required control |
|---|---|
| Structured connector with exact destination and payload | Immutable approval of that operation, or a human always-allow rule that already binds those arguments |
| Generic authenticated browser consequential action | Stop (unbound_stop) unless a connector or takeover can bind the exact operation |
| Password, passkey, one-time code, CAPTCHA, identity check | Human takeover of the computer. Never channel text. |
| Human takeover of an authenticated browser step | The human finishes the blocked step. The worker does not complete it. |
A screenshot or click coordinate is not approval. v1 has no way to bind a generic browser click to an immutable operation, so that path is an exclusion rather than a silent allow.
Executable cases: features/consequential_binding_control.feature.
flowchart TD
request[Model requests an action]
grant{Inside the task grant?}
deny[Deny and record]
kind{How is the action bound?}
connector[Structured connector]
takeover[Human takeover]
unbound[Stop: user-controlled completion]
approval{Immutable approval or exact human rule?}
execute[Execute with target-system evidence]
request --> grant
grant -->|no| deny
grant -->|yes| kind
kind -->|connector| connector
kind -->|password / identity / CAPTCHA| takeover
kind -->|generic authenticated browser| unbound
connector --> approval
approval -->|yes| execute
approval -->|no| deny
Injection
Direct, indirect (quoted), encoded, and cross-page instructions may convince the model to request a forbidden operation. The worker still evaluates the request, not the page text. Encoding does not matter because the sink never parses instructions out of HTML.
Executable cases: features/prompt_injection_containment.feature.
v1 exclusions
These have no enforceable control in v1. The kernel records the name. No worker may claim they are enforced.
| Exclusion | Why it is excluded |
|---|---|
snapshot_cookie_integrity |
A poisoned cookie in the snapshot survives relocate. |
bot_to_bot_channel_injection |
Channel text from another bot is not a trust boundary. |
approval_fatigue |
A human who approves everything unread defeats the card. |
prompt_data_separation_as_boundary |
Prompt wording is a mitigation. Sink denial is the control. |
generic_browser_click_binding |
Clicks and screenshots cannot name an immutable operation. |
local_device_execution_isolation |
Local-device execution is gated separately. |
bot_as_security_boundary |
Every bot on a user shares the computer. |
Executable cases: features/v1_security_policy_exclusions.feature.
See also Threat model.