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.
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
Self-host locally, then ask SoftStop before every escalation:
pnpm install
pnpm dev # http://localhost:3000import { 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.