Skip to content

Proactivity

Proactive agents in Snippbot act on their own initiative — surfacing timely insights, delivering digests, and taking autonomous actions without waiting for an explicit user prompt. Proactivity bridges scheduled automation and reactive chat-based interaction.

Proactivity is implemented through two complementary systems:

  1. Scheduler — Jobs defined with cron, interval, or natural language schedules. When they fire, the agent executes its goal autonomously and delivers results to a channel.

  2. Channel proactivity — The channel adapter system can be configured to allow agents to send messages to platforms (Slack, Telegram, Discord, etc.) without the user first sending a message.

The SmartScheduler learns from your activity patterns to suggest optimal times for proactive jobs:

User typically active: 09:00–12:00, 14:00–17:00 (Mon–Fri)
Suggested time for "daily digest": 08:55 (5 min before typical start)

The scheduler builds a UserActivityPattern from session timing data and uses it to propose schedules when you create a new job without specifying a time:

"Send me a morning briefing every weekday"
→ Suggested: weekdays at 08:55 (your typical start minus 5 min)

Proactive messages respect quiet hours to avoid notifications outside work hours. Quiet hours are optional and configurable:

SettingDefault
Quiet hours start22:00 (configurable)
Quiet hours end08:00 (configurable)

Proactive jobs that fire during quiet hours are deferred — their result is queued and delivered when quiet hours end, not dropped.

Insight generation and delivery are controlled separately, so you can keep insights flowing to one place while silencing another — or stop everything with a single switch. All three controls live on the Insights → Settings tab.

ControlWhat it does
Generate insights (master switch)The single on/off for the whole system. When off, the agent produces no insights and every control below is hidden. There is no longer a “Silent” level — this switch owns off.
Email me a digestBatches insights to your inbox. Off = no emails; insights still appear in-app. AND-ed with the global email toggle, so both must be on for email to send.
Show in in-app trayInsights appear on the Insights tab regardless of email delivery. Off = the tray shows an “In-app insights are turned off” empty state.

When generation is on, a 1–4 aggressiveness slider (“How aggressive?”) controls the cadence:

LevelNameBehaviorCan interrupt
1MinimalOnly critical alerts and reminders.No
2ModerateBalanced suggestions and timely reminders.No
3ActiveRegular insights and optimization suggestions.Yes (high priority)
4ProactiveMaximum engagement with learning and predictions.Yes

Actual delivery volume is bounded further by Quiet Hours and the Advanced → Max Per Day cap. Configure the slider, quiet hours, and Max Per Day on the Insights → Settings tab in the Snippbot UI.

Generation and delivery are decoupled. The heuristic engine produces candidate insights; the Unified Intent Dispatcher decides which of them actually reach your tray, when, and at what priority. The slider above controls dispatcher policy, not generation cadence.

InsightGenerator.generate_candidates()
▼ emits one IntentEnvelope per candidate
IntentEnvelope(
source = PROACTIVE,
kind = INSIGHT,
urgency = candidate.urgency, # 0.0 - 1.0
proactive_value = candidate.value,
can_interrupt = candidate.interrupt,
payload = { insight_id, title, content, ... }
)
Tier 1: kind=INSIGHT → DeliverAsInsight(user_id, room_id?)
Tier 2: ProactivityManager.can_deliver_insight(...)
├─ approved ──► DeliverAsInsight passes through
│ │
│ ▼
│ InsightQueue.enqueue + SSE broadcast
│ │
│ ▼
│ Insight tray + (optional) push notification
├─ quiet hours ──► ScheduleFor(next_window)
└─ daily cap ──► Suppress(reason=daily_cap_exceeded)
Logged only — never reaches the tray

The dispatcher’s Tier 2 policy gate is what makes the proactivity level actually act on every insight. Without it, the slider would only affect generation cadence — every generated insight would always reach the tray.

See also: Unified Intent Dispatcher and the snippbot dispatcher CLI for inspection commands.

Channel proactivity is disabled by default. Enable it per-platform in Settings → Channels in the Snippbot UI:

  1. Open Settings → Channels and select the platform
  2. Toggle Proactive Enabled to on
  3. Set a Public URL (required for platforms that deliver webhooks) under channel settings
Goal: Summarize overnight GitHub activity, new issues, and PRs for my repos
Schedule: weekdays at 08:00
Delivery: Slack #engineering
Goal: Check if BTC price has changed by more than 5% since yesterday
Schedule: every 1h
Condition: only run if change > 5%
Delivery: Telegram @me
Goal: Compile a summary of completed tasks, pending items, and calendar events
Schedule: weekdays at 17:30
Delivery: Email summary
Goal: Check error rate from the last hour in Datadog; alert if > 1%
Schedule: every 15m
Condition: only if error_rate > 0.01
Delivery: PagerDuty webhook
ReactiveProactive
Triggered byUser messageSchedule or event
Approval requiredOnly for elevated actionsPer permission tier
DeliveryChat interfaceChannel or webhook
HistoryIn chatIn scheduler run history

Proactive message delivery is governed by the aggressiveness level (see table above) together with the Advanced → Max Per Day cap. A lower level like Minimal surfaces only critical items, while Proactive allows the highest cadence; the Max Per Day setting puts a hard ceiling on either.

Messages that exceed the daily limit are queued, not dropped.

Each agent can have proactivity disabled independently in its settings. Useful during development or testing:

  • From the agent detail page → Settings → Proactivity: toggle Off