Skip to main content

Architecture

How the Sentinel endpoint agent enforces the kill switch — persisting state, stopping all DLP services, and restoring them on demand, without a process restart.

Control Plane
// Backend API (polled every ~30 min)
endpointAgentEnabled = false      // device-level
tenantEndpointAgentEnabled = false // tenant-level (wins)

// Browser Extension (Native Messaging)
{ "disable_agent": true  }  // kill
{ "disable_agent": false }  // revive

// IT / launchctl (immediate, macOS)
sudo launchctl bootout "system/com.sentinel.agent"
QuilrAI Sentinel Agent
Receive & Persist
Kill Switch Handler
Backend poll (~30 min cycle)
Extension via Native Messaging
IT via launchctl (immediate)
Flag Hierarchy
Tenant flag overrides device flag
Writes boolean to local SQLite DB
WAL mode — no application mutex
Startup Enforcement
Reads flag on every boot
Disabled: skips all registration
Only re-enable channel created
Kill
Event Broker
Removes all DLP process chains
Preserved chain kept active
No new events processed
Service Manager
Stops clipboard monitor
Stops file indexing service
All services reach Stopped state
Revive
Event Broker
Re-registers all DLP chains from config
Full event routing restored
No restart required
Service Manager
Restarts all configured services
Clipboard monitoring resumes
File indexing resumes
Persisted State · Startup Enforcement · No Restart Required · Preserved Re-enable
Endpoint Services
Clipboard Monitor (stopped / started)File Indexing (stopped / started)All DLP chains (removed / restored)Persisted across reboots
QuilrAI

Pipeline Stages

StageDescription
Kill Switch HandlerAccepts disable signals from three sources: backend API (polled every ~30 min), browser extension (Native Messaging), and IT via launchctl. Persists the flag to the local database, then applies kill or revive synchronously.
Flag HierarchyTenant-level flag (tenantEndpointAgentEnabled) takes priority over device-level flag (endpointAgentEnabled). If the tenant flag is false, device flags are ignored.
Local DatabaseStores disable_agent as a boolean in a single-row configuration table. WAL mode ensures concurrent reads are never blocked. The flag persists across process restarts and reboots.
Startup EnforcementOn every agent start, the flag is read before any service or chain is registered. If disabled, all registration is skipped — nothing is created and torn down, services and chains simply never come into existence.
Event Broker — KillRemoves all DLP process chains at runtime. Only the re-enable chain (AgentUpdate:Configuration:Disable) remains registered.
Service Manager — KillCalls stop on every running service. Clipboard monitor and file indexer reach Stopped state immediately.
Event Broker — ReviveRe-registers all DLP chains from the compiled chain configuration. Full event routing is restored.
Service Manager — ReviveRestarts all configured services from Stopped state. Full DLP coverage resumes.

Preserved Chain

One chain is never removed during a kill:

ChainPurpose
AgentUpdate:Configuration:DisableAccepts re-enable signals from the extension at all times

This guarantees the extension can always reach the agent to restore it — even after a managed disable deployed via MDM or GPO.

Sub-feature Flags

Individual capabilities can be disabled independently of the top-level kill switch, but require a code change (not remotely toggleable today).

Sub-featureWhat it doesConfig flag
EnforcementKills non-compliant processesenforcement.enabled
Enforcement dry-runLogs violations but does NOT kill processesenforcement.dry_run
File scanningScans for sensitive files (.claude, .cursor, etc.)scan.enabled
Hook integrityVerifies Claude/Cursor hook files aren't tamperedhook_manager.enabled
Package scanning (npm/cargo/go)Scans installed packagespkg_scanner.enabled

If a sub-feature must be stopped before engineering can deploy, use the tenant or device-level kill switch to disable the entire agent.

State Machine

EventFromToWhat Happens
Backend poll: endpointAgentEnabled = falseEnabledDisabledFlag persisted; chains removed; services stopped
Backend poll: tenantEndpointAgentEnabled = falseEnabledDisabledTenant flag overrides; all devices in tenant disabled
disable_agent: true received (extension)EnabledDisabledFlag persisted; chains removed; services stopped
disable_agent: false received (extension)DisabledEnabledFlag cleared; chains restored; services started
launchctl bootout (IT)EnabledStoppedProcess terminated immediately; restarts on bootstrap
Agent starts, flag = disabledDisabledRegistration skipped; only re-enable chain active
Agent starts, flag = enabledEnabledAll chains and services registered normally

Observability

Kill and revive transitions are logged at warning level with the full list of affected chains and services. Check Agent Status in the dashboard to verify the current state of each endpoint.