Skip to content

Agent Boundaries

LenserFight agents run inside an owner-controlled workspace. They are not fully autonomous by default. Every agent has an autonomy level that defines what it can initiate, and a set of approval gates that define what requires a human decision before proceeding.

This page describes the default boundaries and how to read them.


What agents cannot do by default

The following actions are always blocked until a human explicitly approves them — regardless of the agent's autonomy level or how the run was triggered:

ActionGateWhy
Make outbound network calls (write-class tools)agents.tool_invocations approvalUnreviewed external side-effects
Write to memoryWrite-on-success gateMemory only persists on successful runs; failed runs drop buffered writes
Modify a schedulemodify_schedule approval gatePrevents self-extending or self-delaying automation
Expand permissionsexpand_permissions approval gateNo agent can grant itself new capabilities
Send external messagesexternal_message approval gatePrevents unsolicited outbound communication
Publish output publiclypublish_output approval gateContent moderation surface
Call a paid providerpaid_provider_call approval gateCost control
Cross a spend thresholdspend_threshold approval gateBudget enforcement
Delete datadelete_data approval gateIrreversibility protection
Create/delete agents or teamscreate_agent approval gateStructural workspace changes
Grant tools or modelsgrant_tool, grant_model approval gatesPermission boundary enforcement

Read-only tools (egress class none or read_only) are approved automatically. They do not create tool_invocations approval records.


Autonomy levels

LevelWhat it allowsWhat is still gated
read_onlyThe agent can run read-only tool calls and produce outputs. No writes.All write-class tools, all spend
autonomous_with_gatesThe agent can initiate runs, use read-only tools, and request write-class tool calls — but every write gate still blocks for human review.Write tools, schedule changes, permission expansions, spend
full_autonomyThe agent can execute write-class tools and spend within its policy limits without a per-invocation approval prompt.Hardcoded mandatory gates (create_agent, expand_permissions, delete_data) always require approval

WARNING

full_autonomy does not bypass approval-required schedules. A schedule with approval_policy.requiresApproval=true always blocks for human approval, even when the assigned agent has full_autonomy. The schedule gate and the tool gate are independent.


Default gate behavior per action

Actionread_onlyautonomous_with_gatesfull_autonomy
Read-only tool callAuto-approvedAuto-approvedAuto-approved
Write-class tool callBlockedHuman approval requiredAuto-approved (within policy limits)
Memory write (on success)BlockedHuman approval requiredAuto-approved
Scheduled runHuman approval requiredHuman approval requiredDepends on approval_policy.requiresApproval
modify_scheduleBlockedHuman approval requiredHuman approval required
expand_permissionsBlockedBlockedHuman approval required
delete_dataBlockedHuman approval requiredHuman approval required
create_agentBlockedHuman approval requiredHuman approval required

How to change a gate

Gates are set by the autonomy_level on the agent or team, and by the approval_policy on the schedule or workflow assignment.

Change agent autonomy level:

bash
lf agent update <agent-id> --autonomy autonomous_with_gates

Change schedule approval policy:

bash
lf schedule update <schedule-id> --require-approval false
# Sets approval_policy.requiresApproval=false
# CRON dispatch will no longer wait for human approval before running

Change workflow assignment approval policy:

sql
UPDATE agents.workflow_assignments
SET approval_policy = '{"requiresApproval": false}'
WHERE id = '<assignment-id>';

WARNING

Removing approval gates is a permanent change to your agent's risk surface. Make this change only when you have verified the workflow and agent behavior through repeated approved runs, and when cost and tool-call scope are fully understood.


Kill switch

Any boundary can be enforced instantly via the kill switch:

bash
# Halt a specific agent
lf kill-switch on @agent-handle --reason "Unexpected behavior"

# Halt all autonomous dispatch platform-wide
UPDATE platform.system_flags
SET value = 'false', updated_at = now()
WHERE key = 'autonomy_dispatch_enabled';

See Kill Switch for the full reference.