Skip to content

SoftStopStop when it should

Circuit breaker for autonomous agents and customer outreach. Prevent rogue agents, growth loops, and background jobs from spamming users—across every surface. Authorize only.

Browse docs

Quickstart

Self-host locally, then ask SoftStop before every escalation:

bash
pnpm install
pnpm dev   # http://localhost:3000
js
import { SoftStop } from 'softstop'

const ss = new SoftStop({ url: process.env.SOFTSTOP_API_URL || 'http://localhost:3000' })
const decision = await ss.check({
  userId: 'user_123',
  actionType: 'urgency',
  surface: 'email'
})

if (!decision.allowed) {
  await ss.record({
    decisionId: decision.decisionId,
    userId: 'user_123',
    actionType: 'urgency',
    outcome: 'blocked',
    blockReason: decision.reason
  })
  return // do not escalate
}

// escalate, then:
await ss.record({
  decisionId: decision.decisionId,
  userId: 'user_123',
  actionType: 'urgency',
  outcome: 'executed'
})

When blocked, still call record with outcome: "blocked". Skipping record creates orphans and false confidence.

Start here

Authorize-only pressure permit. MIT licensed.