Pulse — Proactive Intelligence Layer

Date: 2026-03-14
Status: Draft
Author: Uttam (with AI assist)
Companion docs: Data roadmap · Implementation plan


1. Problem

The Forge has meeting intelligence, client dashboards, deal tracking, ticket generation, time data, vault knowledge, and a dozen Mastra agents. Each system is excellent in isolation, but the connections between them are invisible — the place where real business intelligence lives.

Nobody has time to check every page daily. Meeting cadence dropping for a client only matters if you also know their SOW is near burn and their ticket backlog is stalling. A deal stage change only matters in the context of team utilization and upcoming calendar conflicts. Today, synthesizing that picture requires a person to check 5+ pages, hold everything in memory, and connect the dots themselves.

The meeting-created webhook already proves the pattern: one signal triggers classification + scoring + summary + tickets + vault sync. Pulse generalizes that pattern to every signal, running continuously.


2. What Pulse Is

A proactive intelligence layer that monitors all connected systems, maintains a real-time model of business health, and pushes actionable insights before anyone thinks to ask.

Three interfaces:

SurfaceDescription
/pulse pageMorning briefing — the first page anyone opens. Client health signals, your day, stale action items, business signals, team utilization.
Slack #pulse channelCondensed briefing delivered at 8am ET. Thread replies per alert for inline discussion.
”Ask Pulse” chatConversational interface via CopilotKit — “What should I focus on today?”, “How’s Eden doing?”, “Am I on track for March revenue?“

3. Why This and Not Something Else

  1. Multiplier, not addition. Every existing data source and feature becomes more valuable because Pulse connects them. A meeting transcript combined with knowledge that the client’s ticket velocity dropped and their SOW renews in 3 weeks is actionable intelligence.

  2. Subsumes 6+ roadmap items. Client Health Scorecard, SOW Burn Tracker, Meeting Context Card, Timesheet Reminder Bot, Revenue Forecast Dashboard, Pipeline Capacity Overlay — these are all views that Pulse generates as side effects.

  3. All plumbing exists. Supabase (meetings, clients), Linear API, Clockify SDK, HubSpot MCP, Mastra agents, CopilotKit, Google Calendar integration, vault transcripts, Slack bot infrastructure. This is orchestration, not infrastructure.

  4. Push vs. pull. Dashboards require you to go look. Pulse comes to you. Fundamental UX shift.

  5. Compounds over time. “Eden’s meeting cadence is 40% below their 90-day average” requires 90 days of baselines. The sooner it starts, the smarter it gets.

  6. The moat. Any agency can adopt Linear + Clockify + HubSpot. An AI system that knows your specific business context, connects dots across all systems, and proactively tells you what to do — that’s not replicable by stacking tools.


4. Architecture

┌──────────────────────────────────────────────────────────────┐
│  Data Sources (all already wired)                            │
│  Supabase (meetings, clients) · Linear · Clockify · HubSpot │
│  Google Calendar · Slack · Vault · Operating                 │
└──────────────────────┬───────────────────────────────────────┘
                       │ scheduled + event-triggered
                       ▼
┌──────────────────────────────────────────────────────────────┐
│  Pulse Engine                                                │
│  ┌────────────────┐  ┌───────────────┐  ┌────────────────┐  │
│  │ Signal          │  │ Health        │  │ Synthesis      │  │
│  │ Collectors      │→ │ Scoring       │→ │ Agent (Mastra) │  │
│  │ (per source)    │  │ (per entity)  │  │                │  │
│  └────────────────┘  └───────────────┘  └────────────────┘  │
│          ↓                    ↓                  ↓           │
│  ┌─────────────────────────────────────────────────────┐     │
│  │  Alert Prioritization (severity × recency × context)│     │
│  └─────────────────────────────────────────────────────┘     │
└──────────────────────┬───────────────────────────────────────┘
                       │
            ┌──────────┼──────────┐
            ▼          ▼          ▼
       /pulse      Slack bot   CopilotKit
       (page)      (#pulse)    ("Ask Pulse")

4.1 Signal Collectors

One lightweight function per data source. Each returns structured signals, not raw data.

CollectorSourceSignals
Meeting cadenceSupabase zoom_meeting_recording_filesmeetings/week per client, delta vs. 30-day rolling avg
Ticket velocityLinear APItickets completed/week per team, aging tickets, blocked items
Budget burnClockify + vault SOWshours logged vs. SOW budget, projected burn-through date
Deal pipelineHubSpot MCPstage changes, stale deals, weighted revenue
Calendar densityGoogle Calendar APIupcoming meetings per client, prep needed, gaps
Communication recencySlack Supabase + meeting datesdays since last client contact (any channel)
Action item statusMeeting summaries → Linear cross-refaction items from transcripts that never became tickets

Collectors run in parallel. Each returns a Signal[] array:

interface Signal {
  source: 'meetings' | 'linear' | 'clockify' | 'hubspot' | 'calendar' | 'slack' | 'vault';
  entity: string;       // client name, team member, deal name
  entityType: 'client' | 'person' | 'deal';
  metric: string;       // e.g. "meeting_cadence", "ticket_velocity"
  value: number;
  baseline: number;     // rolling average or target
  delta: number;        // value - baseline (or % change)
  severity: 'info' | 'warning' | 'critical';
  summary: string;      // human-readable one-liner
  timestamp: string;
}

4.2 Health Scoring

Weighted composite per entity type.

Client health (0–100):

FactorWeightSource
Meeting cadence vs. baseline20%Supabase
Ticket throughput vs. baseline20%Linear
Budget burn rate25%Clockify + SOW
Communication recency15%Slack + meetings
Deal momentum (if applicable)10%HubSpot
Action item follow-through10%Summaries + Linear

Team member utilization (simple):

FactorWeightSource
Hours logged vs. allocation70%Clockify + Operating
Spread across clients30%Clockify

Thresholds: Green ≥ 70, Yellow 50–69, Critical < 50.

4.3 Synthesis Agent

A Mastra agent (pulseSynthesisAgent) takes the raw signals and health scores and produces the briefing. The agent’s system prompt instructs it to:

  • Lead with the most urgent item (highest severity, most actionable)
  • Group by client, not by data source
  • Include specific numbers (“3 meetings/week → 0 this week”, not “meeting cadence dropped”)
  • End each alert with a concrete suggestion (“Schedule a check-in”, “Review scope with PM”)
  • Keep total briefing under 800 words

4.4 Storage

TableDatabasePurpose
pulse_signalsInternal SupabaseRaw signals from each run (append-only, used for baselines)
pulse_briefingsInternal SupabaseGenerated briefings (one per day, archived for trend)
pulse_health_scoresInternal SupabaseClient + person scores over time (enables “health trend” chart)

5. The /pulse Page

Not a dashboard with 20 widgets. A briefing — more like a morning email from your smartest colleague than a BI tool.

Sections

  1. Top-of-mind — 1–3 critical items with red badges. “LMNT hasn’t had a meeting in 12 days, their ticket velocity dropped 60%, and their SOW hits 80% burn Friday.”

  2. Client health grid — one row per active client: name, health score (colored), sparkline trend (last 30 days), top signal. Click to expand full signal breakdown.

  3. Your day — upcoming meetings from Google Calendar, each with auto-generated prep card (meeting-prep skill output). Shows: last meeting summary, open action items, relevant Linear tickets.

  4. Stale action items — action items extracted from recent meeting summaries that don’t match any Linear ticket. “From Eden sync (Mar 10): ‘Migrate staging pipeline’ — no Linear ticket found.”

  5. Team pulse — per-person utilization bar (hours logged / allocated). Flags overloaded (>110%) and underutilized (<60%).

  6. Business signals — deal stage changes, new meetings with prospects, revenue run-rate vs. target.

UX principles

  • Single column, scrollable, no sidebar navigation within the page
  • Loads fast — parallel data fetching, no waterfalls
  • Briefing text is pre-generated (read from pulse_briefings), health scores and signals are live
  • Mobile-friendly — designed to check from phone before first meeting
  • “Ask Pulse” chat panel on the right (CopilotKit), same as existing chat pattern

6. Slack Integration

Morning briefing

Cron job at 8am ET (or configurable). Posts to #pulse:

☀️ Pulse — Friday Mar 14

🔴 LMNT — No meetings in 12 days. Ticket throughput ↓60%. SOW at 78% burn.
🟡 Eden — 2 stale action items from Mar 10 sync. Consider follow-up.
🟢 ABC — On track. 4 tickets shipped this week.
🟢 CTA — On track. Next meeting Monday.

📊 Team: 3/5 people on track for hours. Uttam at 120% — check rebalancing.
💰 Pipeline: $45K weighted (2 deals in negotiation).

Each colored line is a thread-starter. Thread replies contain the full signal breakdown.

Alert threading

When a critical signal fires mid-day (e.g., a deal stage changes, a ticket is blocked for >3 days), Pulse posts a thread reply on the relevant client’s morning line, or a new message if no morning post exists.


7. “Ask Pulse” (Conversational)

Uses the existing CopilotKit infrastructure with a pulseCopilotAgent that has access to:

  • Latest pulse_signals and pulse_health_scores from Supabase
  • Vault transcripts (via existing repo-context search)
  • Linear API (for ticket details)
  • Clockify API (for hours details)

Example interactions:

  • “What should I focus on today?” → Prioritized list from today’s signals
  • “How’s Eden doing this sprint?” → Health score + breakdown + recent context
  • “Which clients haven’t met with us in 2+ weeks?” → Query against meeting cadence signals
  • “Am I on track for March revenue?” → Pipeline + confirmed revenue from Operating
  • “What did we promise LMNT last week?” → Searches recent transcript summaries + action items

8. Phased Rollout

Phase 1 — Signal Collection + Page (2–3 weeks)

Goal: Ship /pulse with real data from the two most valuable signal sources.

  • Create pulse_signals, pulse_briefings, pulse_health_scores tables in Internal Supabase
  • Build meeting cadence collector (Supabase query, rolling average)
  • Build ticket velocity collector (Linear API)
  • Build health scoring function (client-level, just these two factors)
  • Build pulseSynthesisAgent (Mastra, generates briefing from signals)
  • Build /pulse page — briefing text + client health grid
  • Schedule daily run (Next.js cron or Vercel cron)

Outcome: Team can open /pulse every morning and see client health with meeting + ticket signals.

Phase 2 — Full Signals + Slack (2 weeks)

  • Add budget burn collector (Clockify + vault SOW parsing)
  • Add calendar density collector (Google Calendar API)
  • Add communication recency collector (Slack Supabase)
  • Add stale action items detection (summary parsing + Linear cross-ref)
  • Add team utilization section (Clockify hours vs. Operating allocation)
  • Build Slack morning briefing (cron → #pulse post with threads)
  • Health scoring with all weights active

Outcome: Full signal coverage. Slack delivery. No more manual cross-checking.

Phase 3 — Conversational + Alerts (1–2 weeks)

  • Build “Ask Pulse” CopilotKit agent with signal + vault + Linear context
  • Add real-time alert threading in Slack (mid-day critical signals)
  • Add “Your day” section (Calendar integration + meeting-prep auto-cards)
  • Add business signals section (HubSpot deal changes)
  • Health trend sparklines (30-day chart from pulse_health_scores history)

Outcome: Full Pulse system live — page, Slack, conversational, real-time alerts.

Phase 4 — Compound Intelligence (ongoing)

  • Anomaly detection improvements (seasonal patterns, project-phase awareness)
  • Per-person briefings (role-aware — PM sees different signals than engineer)
  • Weekly digest email (opt-in)
  • “Pulse told me about this” attribution tracking (did the alert lead to action?)
  • Integration with idea-to-tickets (Pulse flags a pattern → suggests a plan)

9. Relationship to Roadmap

Pulse absorbs or accelerates these roadmap items from knowledge/engineering/brainforge-internal-tools-roadmap.md:

Roadmap ItemHow Pulse Handles It
3. Meeting Context CardPhase 1 — “Your day” section with auto-generated prep cards
4. Client Health ScorecardPhase 1 — Client health grid with composite scores
1. SOW Burn TrackerPhase 2 — Budget burn collector + alerts at 80%
2. Timesheet Reminder BotPhase 2 — Team utilization section flags missing hours
5. Pipeline Capacity OverlayPhase 3 — Business signals + “Ask Pulse” for capacity questions
7. Revenue Forecast DashboardPhase 3 — Business signals section with pipeline + confirmed revenue

These items don’t disappear from the roadmap — they may still deserve dedicated pages. But Pulse provides the alerting and synthesis layer that makes each one proactive rather than reactive.


10. Data Source Readiness

SourceAPI ExistsUsed in Platform TodayPulse Needs
Supabase (meetings)YesDashboard, meeting pagesMeeting cadence query — ready
LinearYesTicket generation, internal toolsTicket velocity query — ready
ClockifyYesCalendar Clockify syncHours per client per week — ready
HubSpotYes (MCP)Deals pageDeal stage changes — ready
Google CalendarYesCalendar Clockify syncUpcoming meetings — ready
SlackYes (Supabase)Slack context skillLast message date per client — ready
Vault SOWsFile-basedMeeting-prep skill reads themSOW budget parsing — needs light parser
OperatingPartialPlanned for Allocation vs. ActualsAllocation data — blocked on Operating SDK

Phase 1 can ship with zero new API integrations. Everything needed (Supabase meetings + Linear) is already wired.


11. Open Questions

  • Scheduling: Next.js cron (Vercel), Dagster job, or standalone cron? Dagster is already in the repo and handles scheduling, but adds Python dependency for a TypeScript feature.
  • Baseline period: How many days of data before health scores become meaningful? Proposal: 14 days minimum, with a “warming up” indicator for new clients.
  • Per-user vs. team briefing: Phase 1 is team-wide. Phase 4 introduces role-aware briefings. Is this the right sequencing?
  • Operating SDK dependency: Phase 2 team utilization needs Operating allocation data. If the SDK isn’t ready, fall back to Clockify-only utilization (hours logged vs. 40-hour target).
  • Alert fatigue: How to prevent Pulse from becoming noise? Proposal: max 3 critical + 3 warning signals per briefing; “info” signals are collapsed by default.