Extracts sentiment signals from Gmail and Calendar data to compute a client sentiment score (0-100). Activates when the user wants to analyze client sentiment, check communication tone, detect sentiment shifts, or asks 'how's my relationship with this client?' Classifies signals as positive/neutral/negative and feeds into the broader health scoring pipeline.
From founder-osnpx claudepluginhub thecloudtips/founder-os --plugin founder-osThis skill uses the workspace's default tool permissions.
references/signal-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.
Extract sentiment signals from Gmail email threads and Google Calendar meeting patterns for a given client. Classify signals as positive, neutral, or negative. Compute a per-source numeric score, then combine into a single composite sentiment score on a 0-100 scale. Expose the composite score, per-source breakdowns, and a human-readable sentiment label (Positive, Neutral, Negative) for use by the Client Health Dashboard scoring pipeline.
This skill operates on raw Gmail and Calendar data -- it does not depend on pre-assembled dossiers. It produces a structured sentiment result that feeds into the broader client health scoring formula.
Analyze the client's recent email communication to detect sentiment-bearing language and behavioral patterns.
Scan each thread for positive and negative signal indicators. Count each signal once per thread -- do not double-count the same signal type within a single thread.
Positive signals (+1 each per thread):
Negative signals (-1 each per thread):
For signal definitions, keyword lists, and detection criteria per signal type, see ${CLAUDE_PLUGIN_ROOT}/skills/health/sentiment-analysis/references/signal-patterns.md.
positive_count.negative_count.net_email = positive_count - negative_count.| Net Email Score | Classification | Numeric Value |
|---|---|---|
| >= +3 | Positive | 85 |
| -2 to +2 | Neutral | 50 |
| <= -3 | Negative | 15 |
Record the classification, numeric value, positive_count, negative_count, and thread count in the sentiment result.
When fewer than 3 email threads are available, append a confidence note: "Low email volume -- sentiment confidence reduced." The numeric value remains as calculated, but downstream consumers should weight this score lower or flag it for human review.
Analyze Google Calendar data to detect relationship health signals from meeting behavior over the last 90 days.
Compare meeting counts across 30-day periods:
| Trend | Criteria | Classification |
|---|---|---|
| Increasing | Current period count > previous period count by 20%+ | Positive |
| Stable | Current period count within 20% of previous period | Neutral |
| Declining | Current period count < previous period count by 20%+ | Negative |
When only one period has data (new client or sparse meetings), classify frequency as Neutral and note "Insufficient history for trend analysis."
Scan meeting events for positive and negative behavioral signals.
Positive meeting signals:
Negative meeting signals:
For the full signal dictionary with detection criteria and thresholds, see ${CLAUDE_PLUGIN_ROOT}/skills/health/sentiment-analysis/references/signal-patterns.md.
meeting_positive_count.meeting_negative_count.net_meeting = meeting_positive_count - meeting_negative_count.| Net Meeting Score | Classification | Numeric Value |
|---|---|---|
| >= +2 | Positive | 85 |
| -1 to +1 | Neutral | 50 |
| <= -2 | Negative | 15 |
Note: Meeting signals use a tighter threshold than email (+-2 vs +-3) because meetings produce fewer total signals.
Combine email and meeting sentiment into a single composite score.
| Source | Weight | Rationale |
|---|---|---|
| Email sentiment | 55% | Higher signal frequency, more granular language analysis |
| Meeting patterns | 45% | Reveals behavioral commitment and relationship trajectory |
composite_score = (email_numeric * 0.55) + (meeting_numeric * 0.45)
Clamp the result to the range 0-100. Round to the nearest integer.
| Score Range | Label |
|---|---|
| >= 70 | Positive |
| 40-69 | Neutral |
| < 40 | Negative |
Return a structured sentiment result:
Sentiment Score: [composite_score]/100 ([label])
Email Sentiment: [email_classification] ([email_numeric]) -- [positive_count] positive, [negative_count] negative across [thread_count] threads
Meeting Sentiment: [meeting_classification] ([meeting_numeric]) -- [meeting_positive_count] positive, [meeting_negative_count] negative across [event_count] events
Weights Applied: Email 55%, Meeting 45%
Confidence Notes: [any applicable notes]
Handle missing data sources without failing the entire sentiment analysis.
| Scenario | Behavior |
|---|---|
| Gmail unavailable (MCP not connected) | Cannot compute sentiment. Return null for all sentiment fields. Report: "Gmail unavailable -- sentiment analysis requires email access." |
| Calendar unavailable (MCP not connected) | Use email-only scoring at 100% weight. Note: "Calendar unavailable -- using email-only sentiment." |
| No emails found for client | Return composite score of 50 (Neutral). Note: "No email history found -- defaulting to neutral sentiment." |
| No calendar events found for client | Use email-only scoring at 100% weight. Note: "No calendar events found -- using email-only sentiment." |
| Both sources return no data | Return composite score of 50 (Neutral). Note: "No communication data found -- defaulting to neutral sentiment." |