Follow-up Radar
Skill8 starsChanged 5 months agoMITView on GitHub
Surfaces active opportunities that have gone quiet (no activity in N+ days, no scheduled next-action) and drafts a personalised re-engagement message for each. Queues drafts for operator approval — never sends without confirmation.
In this repository101 other files it gives its agents.
- templates/CLAUDE.mdCLAUDE.md
- Add a FieldSkill
- Assemble Content PackSkill
- Assemble PackSkill
- Audit My AutomationsSkill
- Audit My DataSkill
- automate-thisSkill
- Brand My WorkspaceSkill
- Break Down A ChannelSkill
- Build Brand StrategySkill
- Build Customer VoiceSkill
- Build DocumentSkill
- Build FormSkill
- Build Knowledge Base From DocsSkill
- Build My ProofSkill
- Build My VoiceSkill
- Build Social StrategySkill
- Build SpreadsheetSkill
- Build Work Order ProcessSkill
- Cash Flow ForecastSkill
- Coach My CallsSkill
- Compare DocumentsSkill
- Connect A ToolSkill
- Delegate This WorkSkill
- Describe A ProductSkill
- Design My ScenesSkill
- Design Nurture SequenceSkill
- draft-replySkill
- Email Me A ReportSkill
- Estimate My BASSkill
- Extract DocumentSkill
- Find My Next MoveSkill
- Five Day ChallengeSkill
- Form RadarSkill
- Get Found OnlineSkill
- Grill Me On This DecisionSkill
- import-from-anywhereSkill
- lead-triageSkill
- Learn My BusinessSkill
- Lint DocumentSkill
- Lint FormSkill
- Lint Nurture SequenceSkill
- log-this-callSkill
- make-it-happenSkill
- Make My VideoSkill
- Make Product DemoSkill
- Make Social PostSkill
- Make ThumbnailSkill
- missed-call-recoverySkill
- Nurture HealthSkill
- Onboard Team MemberSkill
- Outstanding DocumentsSkill
- Outstanding InvoicesSkill
- Package My VideoSkill
- Plan My AdsSkill
- Plan My ContentSkill
- Plan My RoadmapSkill
- Plan My YouTubeSkill
- Prep For CallSkill
- Price My WorkSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 6 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 56
Start with one paragraph the operator can read in 10 seconds:
- Very specific: line 63
Use summary_by_source and summary_by_stage to populate the headline.
- Very specific: line 73
If days_silent is past ~90, treat it as list reactivation, not a routine chase (business-method.md §10.3): a shorter, fresher-angle …
- Distinctive: line 114
When the operator says yes:
- Distinctive: line 119
When the operator says no or skip:
- Distinctive: line 120
Don't log anything — the opportunity stays silent for next time
- Distinctive: line 123
When the operator says edit:
- Distinctive: line 128
After all N items:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Follow-up Radar
You are surfacing the active opportunities that have gone quiet and drafting personalised re-engagement messages for each one. Your goal: turn a backlog of forgotten deals into a queue of approved-and-ready outbound messages in under 5 minutes.
Step 1 — Fetch silent opportunities
python ~/.claude/bos-run.py follow-up-radarFallback if the script can't run (auth/network): say so briefly, then pull by hand — mcp__trustpager__list_opportunities (active stages), filter to ones with a stale updated_at and no future next action, get_contact per top item — and proceed with what you have.
If TrustPager isn't connected at all: say so plainly, then offer the keyless path — the owner tells you which jobs have gone quiet and you draft the re-engagement messages right in chat.
The script returns a JSON document with:
total_silent— full count across the workspacereturned_top_n— number of items enriched and returned (default 10)summary_by_source— count grouped by lead source (Facebook, Referral, etc.)summary_by_stage— count grouped by pipeline stageitems[]— the top N silent opportunities, each with full contact details
A "silent" opportunity is one where:
- The opportunity is in an active stage (not won, not lost, not on hold)
updated_atis more than 7 days ago (configurable via--silence-days N)- There's no future
next_action_datescheduled
The ranking blends value and days-silent so unpriced-but-long-silent leads don't disappear. See _score in the fetch script.
Step 2 — Open with a summary, not a wall of detail
Start with one paragraph the operator can read in 10 seconds:
You've got X silent opportunities in your active pipeline. Most are coming from [lead source],
mostly sitting in [stage]. Here are the top N to chase, with drafts ready.Use summary_by_source and summary_by_stage to populate the headline. This sets context BEFORE the operator dives into individual messages.
Step 3 — Draft a personalised message for each
For each item in items[], draft ONE re-engagement message. Pick the channel based on what the contact has:
- ✅ Has phone, not sms_unsubscribed → SMS (short, casual)
- ✅ Has email, not email_unsubscribed → Email (slightly longer, can reference the deal)
- ❌ Both unsubscribed → flag the opportunity for manual review, don't draft
If days_silent is past ~90, treat it as list reactivation, not a routine chase (business-method.md §10.3): a shorter, fresher-angle message, and flag to the operator that this segment is a worked-list candidate rather than a live deal.
Each draft must include:
- The contact's first name (from
contact.first_name) — never "Hi there" or "Hello" - A specific reference — what they were looking at, when, where the conversation left off. Use
stage,lead_source, anddays_silentto construct the reference. Examples:- Stage "Demo Booked", silent 14 days → "wanted to circle back on the demo we never got to"
- Stage "Not Ready Yet", silent 30 days → "checking in — last we spoke you weren't ready to move forward yet, but timing changes"
- Stage "Quote Sent", silent 7 days → "just making sure the proposal landed and you've had a chance to look"
- One specific next-step ask — "want me to send through some times" / "happy to redo numbers if anything's shifted" / "can I send a 2-min loom walking through it"
- Tone matched to the operator's CLAUDE.md preferences — see the operator's template for voice rules
Each draft must NOT include:
- ❌ Anything formal ("Dear Mr Smith") — use first name
- ❌ Templates that read like they were sent to 50 people
- ❌ Apologies ("sorry for the long silence") — they don't care, they probably forgot too
- ❌ "Just following up" — banned. Always anchor to something specific.
- ❌ Marketing language ("excited to share", "leverage", "synergy")
- ❌ A scheduler link unless the operator's CLAUDE.md explicitly approves it (per their banned-phrase rules)
Step 4 — Present each draft for approval, one at a time
Format each as:
─────────────────────────────
🎯 Item N of M — <name>
Silent: N days | Stage: <stage> | Source: <lead_source> | Value: $N
Channel: <SMS | Email>
─────────────────────────────
[Subject line if email]
[Draft body]
[Y/N/edit/skip?]The operator answers per-item. Don't batch. Don't bulk-send. Confirmation is per-message.
When the operator says yes:
- SMS → call the
send_smstool on the TrustPager MCP - Email → call
send_email(mode: "personal" — see the operator's email-sending preferences) - Then log the activity on the opportunity via
add_noteso the next sweep doesn't surface it again
When the operator says no or skip:
- Don't log anything — the opportunity stays silent for next time
- Move to the next item
When the operator says edit:
- Take their edits inline, present the revised draft, ask again
Step 5 — End with the operator's choice
After all N items:
✓ Sent: X | Skipped: Y | Edited and sent: Z
Want to drill into the remaining N silent opportunities? Run with --top 20.What to never do
- ❌ Never send any message without explicit per-item operator approval
- ❌ Never use the same template across multiple drafts — each one personalised
- ❌ Never include a deal's value in the message ("you were looking at the $12k package")
- ❌ Never reference internal stage names ("you're in our 'Not Ready Yet' stage") — translate to the customer's experience
- ❌ Never assume the contact remembers what was discussed — anchor to specifics they would recognise
Common follow-ups the operator will ask
Be ready to chain naturally into:
- "Show me the next 10" → re-run with
--top 20and pick up where you stopped - "Skip Facebook leads, just show me referrals" → filter the items by
lead_source - "Move this one to Lost" → call
update_opportunitywithstatus: "lost" - "Schedule a call with this one instead" → use the scheduling MCP tools
When this skill should NOT fire
- The operator is mid-call and asking a focused question about one contact — answer that, don't pivot
- It's the first time today the operator has run this — but they ran it yesterday — show only changes since yesterday's run (use
~/.claude/bos-cache/follow-up-radar-state.jsonif you maintain state) - The operator already has 50+ scheduled outbound today — flag that instead of adding more
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

