Log in Create workspace
Skip to content

Gateway

Emergency freeze and workspace status

A freeze is one audited control that stops a workspace, a connector, or a single service agent from executing anything, effective on the very next authorization decision. Workspace status (paused, archived) is enforced on the same machine paths.

API docs
On this page

Start here

Freeze risky gateway execution immediately while operators investigate. Choose the narrowest scope: one service agent, one connector, or the workspace. Paused and archived states are broader controls with their own precedence.

Before you begin

  • Workspace owner or admin access and a clear incident reason
  • The affected target plus an expiry decision and named reviewer

Put it into practice

  1. Contain with the narrowest scope

    Create the freeze with a specific, audit-ready reason and optional future expires_at. Record its ID and verify the response reports it as active.

  2. Confirm enforcement

    Run a safe policy simulation or observe the next relevant authorization. A freeze must short-circuit before grants and policies, and machine traffic sees workspace state where applicable.

  3. Investigate, then thaw

    Keep operators working while execution is stopped. Lift manually when the cause is resolved or allow expiry, then confirm the thaw event and audit record before resuming automation.

What success looks like

Affected authorization decisions are denied with a frozen decision path, queued approvals cannot execute past the new check, and lifting or expiry restores only the intended scope with a complete audit trail.

01 Freeze scopes

details

workspace

Refuses machine API authentication and agent socket connects for the whole workspace.

connector

Denies every authorization decision routed through that connector.

service_agent

Denies every authorization decision for that one agent.

02 Creating and lifting

details

A reason is required

reason is mandatory and must be 3 to 2,000 characters. expires_at is optional and must be in the future. Only one active freeze can exist per scope target; re-freezing an already-frozen scope returns the existing freeze rather than an error.

Create body

POST /api/v1/operator/gateway_freezes requires owner or admin manage. Body fields: scope_type (workspace, connector, or service_agent), reason, optional expires_at, plus connector_id when scope_type is connector and service_agent_id when scope_type is service_agent. The JSON includes a derived active flag: it is false after a lift or after expires_at even before the sweeper stamps lifted_at. The operator screen is /app/gateway.

Auto-thaw

An expired freeze stops blocking immediately, because active-freeze checks exclude an expires_at in the past. A sweeper runs every minute to stamp lifted_at, write the audit record, and broadcast gateway.thawed with lift_kind expired. A manual lift records the user who lifted it.

Which freeze is reported

When several freezes could apply, the narrowest wins for reporting: service_agent, then connector, then workspace.

03 Freeze API

reference
Method and path Purpose Success
GET /api/v1/operator/gateway_freezes List freezes. Filters: status (active or lifted), limit (default 25, max 100). 200
POST /api/v1/operator/gateway_freezes Create a freeze 201
POST /api/v1/operator/gateway_freezes/:id/lift Lift a freeze. Lifting an already-lifted freeze returns 409. 200

04 What a freeze does to authorization

details

Short-circuit before policy evaluation

The authorizer returns denied with decision_path "frozen" before a single grant or policy is read, so the decision carries no matched grants and no policy. The denial is audited like any other decision, with the audit metadata carrying decision_path, freeze_id, and freeze_reason.

Approvals in flight are stopped too

No new approval request can be created while frozen, because authorization is denied before the requires-approval branch is reached. An action approved before the freeze is re-checked at execution time and fails with error code gateway_frozen rather than executing. Operators can still decide queued approvals; the stop is enforced at execution.

05 Machine traffic gates

reference

Precedence: archived, then paused, then frozen

One gate is evaluated on every machine authentication and socket connect. An archived-and-frozen workspace reports workspace_archived. Credential problems still win over workspace state: a revoked credential in a frozen workspace gets 401, not 403.

error Status detail
workspace_frozen 403 This workspace is frozen. Machine traffic is refused until the freeze is lifted.
workspace_paused 403 This workspace is paused. Machine traffic is refused until it is reactivated.
workspace_archived 403 This workspace is archived. Machine traffic and workspace changes are refused.
workspace_unavailable 403 This workspace is not accepting machine traffic. Returned fail-closed when the workspace cannot be resolved.

06 Frozen workspace response

example
json
POST /api/v1/traces
Authorization: Bearer {api_key}

Response 403:
{
  "type": "https://robotscenter.net/problems/forbidden",
  "title": "Forbidden",
  "status": 403,
  "detail": "This workspace is frozen. Machine traffic is refused until the freeze is lifted.",
  "request_id": "req-01HQ5PX7P7F4",
  "error": "workspace_frozen"
}

07 Where each surface stands

reference
Surface Frozen or paused Archived
Machine API (/api/v1) 403, request refused 403, request refused
Agent socket (/socket) Connect refused with reason workspace_frozen Connect refused with reason workspace_archived
Gateway authorization Denied with decision_path frozen Refused at authentication
Operator API (/api/v1/operator) Unaffected -- operators keep working 403 workspace_archived on writes; reads still succeed
Browser console Keeps working, with a status banner Read-only; workspace mutations blocked

08 Realtime and alerting

details

gateway.frozen and gateway.thawed

Both events are published on the workspace topic (and on the agent topic for an agent-scoped freeze) carrying freeze_id, scope_type, connector_id, service_agent_id, reason, expires_at, created_by_id, lifted_at, lifted_by_id, and lift_kind. Both are also routed through alerting, so configured destinations are notified: critical severity on freeze, informational on thaw.

Troubleshooting

The response names another workspace state
Archived takes precedence over paused, which takes precedence over frozen. Invalid or revoked credentials can also fail before workspace-state reporting.
The displayed freeze differs from the workspace freeze
When several active freezes apply, reporting prefers service_agent, then connector, then workspace. Check all active scopes before lifting anything.
An expired freeze still has no lifted_at
Expiry stops blocking immediately. The one-minute sweeper records lifted_at, audit, and gateway.thawed shortly afterward.

Where to go next

see also