Identifies sent emails awaiting replies and detects promises in email threads. Activates when the user wants to check follow-ups, find unanswered emails, track pending responses, or asks 'who hasn't gotten back to me?' Scans sent mail, detects bidirectional promises, scores urgency by age and relationship importance, and filters noise via smart exclusion rules.
From founder-osnpx claudepluginhub thecloudtips/founder-os --plugin founder-osThis skill uses the workspace's default tool permissions.
references/promise-patterns.mdDesigns and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Scan the user's Gmail sent folder to identify emails that require follow-up attention. Detect three categories of follow-up candidates: sent emails awaiting a reply, outbound promises the user made, and inbound promises others made to the user. For each candidate, determine thread reply status, calculate age in days, apply exclusion rules to filter noise, and assign a priority score from 1 to 5. Produce a structured follow-up list ordered by priority descending, then by age descending. This skill operates as the detection and scoring layer only -- it does not draft nudge emails or create calendar reminders (those responsibilities belong to the nudge-writing skill and the respective commands).
Identify emails where the user sent the last message in a thread and no reply has arrived. This is the primary detection method and produces the highest volume of follow-up candidates.
--days or --since flag when provided by the command layer.For each flagged thread, extract:
Threads where has_question is true receive a +1 priority boost because the user explicitly requested information.
Determine whether a reply has been received for a tracked thread. This check runs both during initial scanning and during re-runs to resolve previously flagged follow-ups.
status: "Done" in Notion if a tracker record exists.On subsequent runs, query existing Notion records in the "[FOS] Tasks" database filtered by Type = "Follow-Up" and matching Thread ID. For threads already tracked:
Scan email thread content for explicit commitments -- both promises the user made to others (outbound) and promises others made to the user (inbound). Promise detection supplements the sent-email scanning by catching obligations that standard "awaiting reply" logic misses.
Scan sent messages for commitment language across four categories: delivery commitments, response commitments, action commitments, and temporal commitments. Scan received messages for the same categories plus deferral language (high follow-up signal). For the complete pattern library with specific phrases for each category, see ${CLAUDE_PLUGIN_ROOT}/skills/followup/follow-up-detection/references/promise-patterns.md.
When a temporal commitment accompanies a promise, extract the implied deadline and factor it into the priority score. A missed deadline elevates priority by +1 (cap at 5).
Label each detected promise with a Promise Type:
A single thread may contain both outbound and inbound promises. Create separate follow-up entries for each distinct promise when they represent different obligations.
Assign a base priority tier based on the number of days the email has been awaiting a reply or the promise has been outstanding:
| Days Waiting | Tier | Label | Base Priority |
|---|---|---|---|
| 1-2 days | Fresh | No action needed yet | 1 |
| 3-6 days | Gentle | Polite follow-up appropriate | 2 |
| 7-13 days | Firm | Direct follow-up recommended | 3 |
| 14-20 days | Urgent | Escalation may be needed | 4 |
| 21+ days | Critical | At risk of being lost entirely | 5 |
The base priority from the age tier serves as the starting point. Apply the modifiers from the Priority Scoring section below to arrive at the final score.
Filter out threads that should never appear in the follow-up list. Apply exclusion rules before promise detection and priority scoring to avoid wasted processing.
Exclude threads where the recipient matches any of these patterns:
notifications@, alerts@, system@, mailer-daemon@, postmaster@, support@ (when part of a ticketing system auto-reply).billing@, receipts@, orders@, shipping@, tracking@ from commercial domains.Exclude threads matching these content patterns:
X-Auto-Reply header or body containing "out of office", "automatic reply", "auto-response").List-Unsubscribe, List-Id, or Precedence: bulk headers.text/calendar or content containing "calendar notification".When the user explicitly includes a thread via --include [thread_id], bypass all exclusion rules for that thread. The user's explicit intent overrides automatic filtering.
Calculate a final priority score from 1 (low) to 5 (critical) for each follow-up candidate. Start with the age-based base priority and apply modifiers.
Four factors influence the final score. Each factor adds or subtracts from the base priority:
1. Age Factor (Base Priority) Determined by the age-based priority tiers table above. This is the starting value.
2. Relationship Importance (+0 to +2) Assess the importance of the recipient or sender based on available signals:
#01 Inbox Zero → #06 Follow-Up Tracker chain).3. Promise Urgency (+0 to +1)
4. Thread Activity (-1 to +0)
final_priority = clamp(base_priority + relationship_modifier + promise_modifier + activity_modifier, 1, 5)
Always clamp the result to the 1-5 range. Never produce a score below 1 or above 5.
Attach a human-readable label to each score:
| Score | Label |
|---|---|
| 5 | Critical -- follow up immediately |
| 4 | Urgent -- follow up today |
| 3 | Firm -- follow up this week |
| 2 | Gentle -- follow up when convenient |
| 1 | Low -- monitor only |
Produce one structured object per detected follow-up candidate:
When the #01 Inbox Zero Commander plugin is available, leverage its triage data to enrich follow-up detection:
Type = "Email Task" for items with category waiting_on. These represent threads Inbox Zero already identified as awaiting a response. Cross-reference by thread subject or email address to avoid duplicating entries.waiting_on list and the Follow-Up Tracker's scan results, prefer the Follow-Up Tracker's richer metadata (promise detection, age scoring) but note the cross-reference.When Inbox Zero is not available, operate independently using Gmail data only. Never fail because the upstream plugin is missing.
"Follow-Up""Follow-Up Tracker"When querying the database for existing follow-ups (re-run deduplication, nudge history, etc.), always apply a compound filter:
Type = "Follow-Up" AND the relevant query conditions (e.g., Thread ID match, Status = "Waiting")This ensures the plugin only reads its own records and never collides with tasks from other plugins sharing the HQ database.
If Notion MCP is unavailable, or none of "[FOS] Tasks", "Founder OS HQ - Tasks", or the legacy "Follow-Up Tracker - Follow-Ups" database is found, output the follow-up list as structured text in chat. Include all fields. Warn: "Notion unavailable -- displaying results in chat. Follow-ups were not saved to the tracker database."
If Google gws CLI is unavailable for Calendar, skip reminder creation silently. Calendar reminders are an optional enhancement, not a core requirement.
If Gmail returns an error or rate limit, report the error clearly and suggest retrying with a narrower date range: "Gmail API error -- try narrowing the search window with --days=7."
When no sent messages exist in the lookback window, report: "No sent emails found in the last [N] days. Nothing to track." Do not fabricate results.
When the user has more than 200 sent threads in the lookback window, process in batches of 50. Display a progress indicator ("Scanning batch 1 of 4..."). Apply exclusion rules early to reduce the working set before promise detection.
Exclude threads where the only recipient is the user's own email address (notes-to-self). These never require follow-up.
When the user sends from multiple addresses or aliases, treat all configured addresses as "the user." Match sender against all known aliases when determining whether the user sent the last message. If aliases are not configured, match against the primary Gmail address only.
When a sent email has multiple To/CC recipients, track the thread once with the primary To recipient. Do not create separate follow-up entries per recipient unless the user explicitly requests per-recipient tracking via --per-recipient.
When a thread receives a reply between scan runs, detect the reply during the next run and update the status to "Done." Do not generate a nudge recommendation for resolved threads even if they previously had high priority.
When promise language is detected but the surrounding context is ambiguous (e.g., "I'll look into it" in a thread about multiple topics), extract the promise text verbatim and set promise_type accordingly, but append to the snippet: "[Promise context unclear -- verify before nudging]".