@vruum/skills 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -74
- package/agents/vruum-engagement-reviewer.md +2 -2
- package/agents/vruum-outreach-reviewer.md +2 -2
- package/package.json +5 -4
- package/skills/diagnose-reply/SKILL.md +7 -4
- package/skills/engagement-triage/SKILL.md +64 -55
- package/skills/engagement-triage/references/content-subagent-instructions.md +59 -0
- package/skills/engagement-triage/references/engagement-subagent-instructions.md +79 -0
- package/skills/engagement-triage/references/quality-standards.md +45 -0
- package/skills/enrich-prospect/SKILL.md +7 -3
- package/skills/outreach-triage/SKILL.md +114 -71
- package/skills/outreach-triage/references/quality-standards.md +139 -0
- package/skills/outreach-triage/references/subagent-instructions.md +172 -0
- package/.mcp.json +0 -8
package/README.md
CHANGED
|
@@ -1,99 +1,49 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @vruum/skills
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Vruum AI skills for Claude Code, Codex CLI, and any AI assistant with a skill directory.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
---
|
|
5
|
+
Pairs with the Vruum MCP server at [https://api.vruum.ai/mcp](https://api.vruum.ai/mcp). For MCP-native clients (Claude Code, Claude Desktop, Cursor, VS Code Copilot, Cline), connecting to the MCP URL surfaces these skills as native slash commands. This npm package is for assistants that don't yet support MCP prompts (Codex CLI, ChatGPT, Windsurf).
|
|
8
6
|
|
|
9
7
|
## Install
|
|
10
8
|
|
|
11
|
-
Pick the path that matches your assistant.
|
|
12
|
-
|
|
13
|
-
### Claude Code (recommended — one command)
|
|
14
|
-
|
|
15
9
|
```bash
|
|
16
|
-
|
|
17
|
-
/plugin install vruum@vruum-gtm
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
That's it. Skills appear as slash commands. The MCP server connects automatically with OAuth (no secret to paste).
|
|
21
|
-
|
|
22
|
-
### Claude Desktop
|
|
23
|
-
|
|
24
|
-
Settings → Connectors → Add custom connector → paste:
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
https://api.vruum.ai/mcp
|
|
10
|
+
npx @vruum/skills install
|
|
28
11
|
```
|
|
29
12
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
### ChatGPT (Business / Enterprise / Edu)
|
|
33
|
-
|
|
34
|
-
Enable Developer Mode → Settings → Apps & Connectors → Add → paste:
|
|
13
|
+
Detects Claude Code (`~/.claude/skills/`) and Codex CLI (`~/.codex/skills/`). For other harnesses:
|
|
35
14
|
|
|
15
|
+
```bash
|
|
16
|
+
npx @vruum/skills install --target /path/to/skills/dir
|
|
36
17
|
```
|
|
37
|
-
https://api.vruum.ai/mcp
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Note: ChatGPT uses MCP tools directly and doesn't currently surface prompts as slash commands. You still get every Vruum tool through natural conversation.
|
|
41
|
-
|
|
42
|
-
### Cursor
|
|
43
18
|
|
|
44
|
-
|
|
19
|
+
## Skills
|
|
45
20
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
21
|
+
<!-- generated:skills-begin -->
|
|
22
|
+
- `/diagnose-reply` — Diagnose why a reply happened — what worked or didn't in the outreach that triggered it. Use when: why did they reply, what worked, diagnose reply, reply diagnosis, analyze this reply, what caused this reply, reply analysis.
|
|
23
|
+
- `/engagement-triage` — Review and approve your pending LinkedIn engagement drafts and demand-gen content posts. Use when: triage engagements, review engagement queue, review warming comments, review nurture reactions, review marketing comments, review content drafts, check engagement queue.
|
|
24
|
+
- `/enrich-prospect` — Deep prospect diarization — synthesize everything known about a person into a structured intelligence profile. Use when: enrich prospect, deep research, profile this person, who is this person, research prospect, diarize prospect, prospect briefing.
|
|
25
|
+
- `/outreach-triage` — Review and approve your pending outreach drafts across LinkedIn and email. Use when: triage, review queue, morning review, check messages, approve outreach, what needs review.
|
|
26
|
+
- `/vruum-skills-upgrade` — Upgrade @vruum/skills to the latest npm version and re-sync ~/.vruum/. Use when: upgrade vruum skills, update vruum, pull latest vruum skills, or when the preamble reports UPGRADE_AVAILABLE.
|
|
27
|
+
<!-- generated:skills-end -->
|
|
49
28
|
|
|
50
|
-
|
|
29
|
+
## Upgrade
|
|
51
30
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
These tools don't yet support MCP prompts natively, so we ship the skill files as an npm package you can install into your harness's skill directory:
|
|
31
|
+
Skills auto-prompt to upgrade via the preamble. To upgrade explicitly:
|
|
55
32
|
|
|
56
33
|
```bash
|
|
57
34
|
npx @vruum/skills install
|
|
58
35
|
```
|
|
59
36
|
|
|
60
|
-
|
|
37
|
+
## Uninstall
|
|
61
38
|
|
|
62
39
|
```bash
|
|
63
|
-
npx @vruum/skills
|
|
40
|
+
npx @vruum/skills uninstall
|
|
64
41
|
```
|
|
65
42
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## What you get
|
|
71
|
-
|
|
72
|
-
Four slash commands that wrap the most common Vruum workflows:
|
|
73
|
-
|
|
74
|
-
- **`/enrich-prospect`** — synthesize everything known about a person (LinkedIn, research, conversation history, engagement signals) into a structured intelligence profile. Reveals the gap between what their bio says and what they actually focus on.
|
|
75
|
-
- **`/diagnose-reply`** — when someone replies, explain exactly what worked in your outreach. Turns every reply into a learning event.
|
|
76
|
-
- **`/outreach-triage`** — review your pending outreach drafts with parallel AI review. Dispatches subagents to evaluate each message in your queue, surfaces fixes, and lets you approve in bulk or one at a time. Handles T1s (first touches), follow-ups (with deep research), and reply responses (high-stakes).
|
|
77
|
-
- **`/engagement-triage`** — review your LinkedIn engagement queue (warming comments, nurture reactions, marketing comments) and demand-gen content post drafts. Same parallel-subagent pattern, tuned for voice-fit and post-relevance.
|
|
78
|
-
|
|
79
|
-
Plus the full Vruum MCP tool surface (60+ tools) accessible via natural conversation: search people, start outreach, review messages, manage deals, check analytics, run market research, and more.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Auth
|
|
85
|
-
|
|
86
|
-
OAuth 2.1 with PKCE and Dynamic Client Registration — handled by your AI client automatically. You sign in with your Vruum account in a browser popup the first time. Your AI assistant never sees your password or any API key.
|
|
87
|
-
|
|
88
|
-
Accounts: sign up at [vruum.ai](https://vruum.ai).
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## Support
|
|
93
|
-
|
|
94
|
-
- Product questions: [vruum.ai](https://vruum.ai)
|
|
95
|
-
- Issues with this plugin: [github.com/vruum-gtm/skills/issues](https://github.com/vruum-gtm/skills/issues)
|
|
43
|
+
Removes all symlinks this installer created. Does not touch `~/.vruum/auth.json` or other co-resident tool state.
|
|
96
44
|
|
|
97
|
-
##
|
|
45
|
+
## Links
|
|
98
46
|
|
|
99
|
-
|
|
47
|
+
- [Vruum](https://vruum.ai)
|
|
48
|
+
- [MCP server](https://api.vruum.ai/mcp)
|
|
49
|
+
- [Issues](https://github.com/vruum-gtm/skills/issues)
|
|
@@ -26,7 +26,7 @@ The orchestrator will tell you which type and provide IDs.
|
|
|
26
26
|
|
|
27
27
|
## Step 1: Load your items
|
|
28
28
|
|
|
29
|
-
Call `get_engagement_review` with your assigned `engagement_ids
|
|
29
|
+
Call `get_engagement_review` with your assigned `engagement_ids` and `content_length="full"`. This returns for each item:
|
|
30
30
|
- The draft comment text (if comment or repost_commentary)
|
|
31
31
|
- The reaction type (if reaction)
|
|
32
32
|
- The target post text (what the prospect posted)
|
|
@@ -137,7 +137,7 @@ ISSUES_FOUND: {comma-separated or "none"}
|
|
|
137
137
|
|
|
138
138
|
## Step 1: Load your posts
|
|
139
139
|
|
|
140
|
-
Call `get_content_review
|
|
140
|
+
Call `get_content_review`. This returns for each post:
|
|
141
141
|
- The draft content, type, tags, status, scheduled date
|
|
142
142
|
- Past performance stats (avg engagement for same content type)
|
|
143
143
|
- Calendar neighbors (other posts within 3 days)
|
|
@@ -22,7 +22,7 @@ You do NOT approve or send messages. You review, edit if needed, and return a st
|
|
|
22
22
|
|
|
23
23
|
## Step 1: Load your messages
|
|
24
24
|
|
|
25
|
-
Call `get_outreach_review` with your assigned `message_ids
|
|
25
|
+
Call `get_outreach_review` with your assigned `message_ids` and `content_length="full"`. This returns full context for each message including:
|
|
26
26
|
|
|
27
27
|
- The draft message content
|
|
28
28
|
- Person info (name, title, company, match score)
|
|
@@ -88,7 +88,7 @@ If personalization is surface level or basic, and you have the tools to go deepe
|
|
|
88
88
|
|
|
89
89
|
If a message needs better personalization or you need to verify something, you have access to:
|
|
90
90
|
|
|
91
|
-
- **Knowledge base** (`search_knowledge_base`
|
|
91
|
+
- **Knowledge base** (`search_knowledge_base`): Search the company's uploaded sales docs. Browse without filters first to see what's available, then narrow with `doc_type` or `query`.
|
|
92
92
|
- **Web search**: Search for recent news about the prospect's company, their recent activity, industry trends relevant to them
|
|
93
93
|
- **LinkedIn data** (`fetch_linkedin_data`): Pull the prospect's recent posts if not already in the review data
|
|
94
94
|
- **Company research** (`get_company_research`, `fetch_company_website`): Get deeper company context if the match analysis feels thin
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vruum/skills",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Vruum AI skills for Claude Code, Codex CLI, and any AI assistant with a skill directory. Pairs with the Vruum MCP server at https://api.vruum.ai/mcp.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/vruum-gtm/
|
|
8
|
+
"url": "https://github.com/vruum-gtm/vruum_ai.git",
|
|
9
|
+
"directory": ".agents"
|
|
9
10
|
},
|
|
10
11
|
"homepage": "https://vruum.ai",
|
|
11
12
|
"bugs": {
|
|
@@ -18,7 +19,6 @@
|
|
|
18
19
|
"install.js",
|
|
19
20
|
"README.md",
|
|
20
21
|
"LICENSE",
|
|
21
|
-
".mcp.json",
|
|
22
22
|
"skills/",
|
|
23
23
|
"agents/",
|
|
24
24
|
"bin/"
|
|
@@ -35,5 +35,6 @@
|
|
|
35
35
|
"sales",
|
|
36
36
|
"outreach",
|
|
37
37
|
"gtm"
|
|
38
|
-
]
|
|
38
|
+
],
|
|
39
|
+
"contentHash": "fc531edad0e9163122d472579d3f1a37b74201dd8041fe71056ca34671cf1c7f"
|
|
39
40
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: diagnose-reply
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Diagnose why a reply happened — what worked or didn't in the outreach that
|
|
5
|
+
triggered it. Use when: why did they reply, what worked, diagnose reply, reply
|
|
6
|
+
diagnosis, analyze this reply, what caused this reply, reply analysis.
|
|
4
7
|
---
|
|
5
8
|
|
|
6
9
|
# /diagnose-reply
|
|
@@ -9,9 +12,9 @@ You diagnose individual replies to understand what worked (or didn't) in the out
|
|
|
9
12
|
|
|
10
13
|
## Step 1: Identify the reply
|
|
11
14
|
|
|
12
|
-
The
|
|
15
|
+
The user will reference a person, a reply, or a conversation. Use `get_person_360` to load the full context: conversation thread, outreach plan, match analysis.
|
|
13
16
|
|
|
14
|
-
If the
|
|
17
|
+
If the user doesn't specify a person, ask: "Which reply do you want to diagnose? Give me a name, company, or message."
|
|
15
18
|
|
|
16
19
|
## Step 2: Read the conversation
|
|
17
20
|
|
|
@@ -26,7 +29,7 @@ From the person_360 response, read the full conversation thread. Identify:
|
|
|
26
29
|
|
|
27
30
|
## Step 3: Diagnose
|
|
28
31
|
|
|
29
|
-
Call `get_performance_metrics` with `
|
|
32
|
+
Call `get_performance_metrics` with `view='funnel'` and the segment_id to get segment-level reply rates by channel.
|
|
30
33
|
|
|
31
34
|
Synthesize a diagnosis:
|
|
32
35
|
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: engagement-triage
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Review and approve your pending LinkedIn engagement drafts and demand-gen
|
|
5
|
+
content posts. Use when: triage engagements, review engagement queue, review
|
|
6
|
+
warming comments, review nurture reactions, review marketing comments, review
|
|
7
|
+
content drafts, check engagement queue.
|
|
4
8
|
---
|
|
5
9
|
|
|
6
|
-
|
|
10
|
+
## Auto-update check
|
|
11
|
+
|
|
12
|
+
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
13
|
+
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
14
|
+
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
15
|
+
- Empty → proceed silently.
|
|
16
|
+
|
|
17
|
+
Never block skill execution on this check.
|
|
18
|
+
|
|
19
|
+
# Engagement Triage
|
|
7
20
|
|
|
8
21
|
You review the user's pending LinkedIn engagement drafts (warming comments, nurture reactions, marketing comments) and demand-gen content posts, dispatching review subagents in parallel and presenting results for approval. Separate from `/outreach-triage` (which handles outreach messages).
|
|
9
22
|
|
|
@@ -23,7 +36,7 @@ Falls back to general-purpose subagent with MCP tool names in the prompt if the
|
|
|
23
36
|
|
|
24
37
|
### Step 1: Summarize the queue
|
|
25
38
|
|
|
26
|
-
Call `get_marketing_overview`
|
|
39
|
+
Call `get_marketing_overview` to see what's pending. Present a one-liner:
|
|
27
40
|
|
|
28
41
|
"X warming drafts, Y nurture drafts, Z marketing drafts, N content posts pending."
|
|
29
42
|
|
|
@@ -64,84 +77,80 @@ For each queue type the user selected, call the appropriate list endpoint, get I
|
|
|
64
77
|
|
|
65
78
|
Spawn up to 4 subagents concurrently. For larger queues (15+), dispatch in waves.
|
|
66
79
|
|
|
67
|
-
|
|
80
|
+
Subagent prompt template:
|
|
68
81
|
|
|
69
82
|
```
|
|
70
|
-
You are an engagement review agent.
|
|
83
|
+
You are an engagement review agent for {company_name}.
|
|
71
84
|
|
|
72
|
-
|
|
85
|
+
SENDER PROFILE:
|
|
86
|
+
{sender_profile_block}
|
|
73
87
|
|
|
74
|
-
Engagement IDs: {
|
|
75
|
-
Queue type: {warming | nurture | marketing}
|
|
88
|
+
Engagement IDs: {comma_separated_ids}
|
|
76
89
|
|
|
77
|
-
Call get_engagement_review with engagement_ids="{
|
|
90
|
+
Call get_engagement_review with engagement_ids="{comma_separated_ids}" and content_length="full" to load your assigned items.
|
|
78
91
|
|
|
79
|
-
For each
|
|
80
|
-
1.
|
|
81
|
-
2.
|
|
82
|
-
3.
|
|
83
|
-
4.
|
|
84
|
-
5.
|
|
92
|
+
For each engagement:
|
|
93
|
+
1. Check voice fit against sender profile (would this person actually say this?)
|
|
94
|
+
2. Check relevance to the prospect's post
|
|
95
|
+
3. Check for AI tells (generic phrasing, hollow flattery, buzzwords)
|
|
96
|
+
4. Check for over-pitching (warming comments should NOT sell)
|
|
97
|
+
5. Rate quality: genuine value-add vs generic engagement
|
|
85
98
|
|
|
86
|
-
If
|
|
99
|
+
If a comment needs fixes, edit it via manage_engagement. Only edit when there's genuine improvement — don't rewrite solid comments.
|
|
87
100
|
|
|
88
|
-
Return
|
|
89
|
-
ENGAGEMENT: {id} | TARGET: {person name} | TYPE: {warming|nurture|marketing} | RECOMMENDATION: {approve|edited|skip} | CONFIDENCE: {high|medium|low} | REASONING: {1-2 sentences} | EDITED: {yes/no} | ISSUES_FOUND: {list or "none"}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**Subagent prompt — content posts:**
|
|
101
|
+
IMPORTANT: Do NOT approve or skip engagements. Return recommendations only.
|
|
93
102
|
|
|
103
|
+
Return a structured summary for each item:
|
|
104
|
+
ENGAGEMENT: {id} | TYPE: {reaction|comment} | PERSON: {name} | SOURCE: {warming|nurture|marketing} | RECOMMENDATION: {approve|edited|flag|skip} | CONFIDENCE: {high|medium|low} | REASONING: {1-2 sentences} | EDITED: {yes/no} | COMMENT_TEXT: {the comment text, or "reaction" for likes}
|
|
94
105
|
```
|
|
95
|
-
You are a content review agent.
|
|
96
106
|
|
|
97
|
-
|
|
107
|
+
For high-value comments (match score 80+, nurture, cold marketing), use research mode: 1 comment per subagent. The subagent reads the prospect's actual post via `get_person_360`, understands what they're saying, and edits only if there's a real opportunity to improve.
|
|
98
108
|
|
|
99
|
-
|
|
109
|
+
### Step 5: Present results — always show content
|
|
100
110
|
|
|
101
|
-
|
|
111
|
+
Do NOT approve engagements without showing them to the user.
|
|
102
112
|
|
|
103
|
-
|
|
104
|
-
1. Voice fit — sounds like the sender? (SENDER PROFILE above; flag anything generic)
|
|
105
|
-
2. Hook quality — does the first line stop scroll? Is it specific and worth reading further?
|
|
106
|
-
3. AI tells — em dashes, AI-vocabulary ("delve", "robust", "comprehensive"), uniform sentence length, generic openers
|
|
107
|
-
4. Strategic fit — does this post serve the sender's ICP and positioning, or is it generic thought-leadership?
|
|
108
|
-
5. Calendar fit — appropriate timing relative to other recent posts? (get_content_review returns calendar context)
|
|
113
|
+
**Reactions:** Present as a batch with count. "12 warming reactions — all look good. Approve?" If any flagged, show those individually.
|
|
109
114
|
|
|
110
|
-
|
|
115
|
+
**Comments:** Always show the actual comment text for every comment. Group by recommendation:
|
|
111
116
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
1. **Clean approvals**: Show comment text and one-line note. User can bulk-approve.
|
|
118
|
+
2. **Edited comments**: Show the new comment, what changed, and why. User reviews each.
|
|
119
|
+
3. **Flagged/skipped**: Show the issue and recommendation.
|
|
115
120
|
|
|
116
|
-
|
|
121
|
+
**Content posts:** Always show full post text with calendar context and past performance. User approves individually.
|
|
117
122
|
|
|
118
|
-
|
|
123
|
+
### Step 6: Skip cascade
|
|
119
124
|
|
|
120
|
-
|
|
121
|
-
2. **Edited drafts** — show the new version, what changed, why. User reviews each.
|
|
122
|
-
3. **Skip / reject** — show the draft and the issue. One action to confirm.
|
|
125
|
+
When skipping an engagement because the prospect is a bad fit (not because the comment quality is poor), offer to stop the outreach/warming plan:
|
|
123
126
|
|
|
124
|
-
|
|
127
|
+
"Keith Hemmert (match score 33) — weak fit, no evidence of relevant practice. Skip this engagement and stop warming for this person?"
|
|
125
128
|
|
|
126
|
-
|
|
129
|
+
This bundles skip + stop plan since a bad-fit engagement almost always means warming should stop entirely. Only offer the cascade for fit-based skips, not quality-based edits.
|
|
127
130
|
|
|
128
|
-
|
|
129
|
-
- Adjust any subagent edit before approving
|
|
130
|
-
- Skip the whole queue type ("actually, don't review marketing, just warming")
|
|
131
|
-
- Ask to see a specific person's engagement history (`get_engagement_queue` filtered by person_id)
|
|
131
|
+
### Step 7: Early pattern detection
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
After the first batch returns for any engagement type:
|
|
134
134
|
|
|
135
|
-
**
|
|
135
|
+
- **All reactions clean:** "First batch of reactions all approved. N more look similar — approve the rest?" Apply without more agents.
|
|
136
|
+
- **All comments have the same issue** (e.g., all too generic, all missing sender voice): Flag the pattern to the user. "First 8 comments are all generic 'great post' style — likely a prompt issue. Want me to edit them all with the same fix, or skip the batch?"
|
|
137
|
+
- **Systematic voice mismatch:** If comments consistently don't sound like the sender, flag it as a segment/prompt config issue rather than fixing each one individually.
|
|
136
138
|
|
|
137
|
-
|
|
139
|
+
### Step 8: Summary
|
|
138
140
|
|
|
139
|
-
|
|
141
|
+
After all queues are processed, present a summary:
|
|
142
|
+
- Total items reviewed
|
|
143
|
+
- Approved (with user confirmation)
|
|
144
|
+
- Edited and approved
|
|
145
|
+
- Flagged for review
|
|
146
|
+
- Skipped
|
|
147
|
+
- Plans stopped (from skip cascades)
|
|
148
|
+
- Content posts approved/scheduled
|
|
140
149
|
|
|
141
|
-
|
|
150
|
+
## Edge cases
|
|
142
151
|
|
|
143
|
-
|
|
152
|
+
- Queue <= 10 items: skip subagent dispatch, review inline
|
|
153
|
+
- Single item: review directly, no subagents
|
|
154
|
+
- Subagent MCP errors: fall back to inline review
|
|
155
|
+
- **Homogeneous pattern detected**: If first batch all has the same issue, apply fix to remaining without more agents. Confirm with the user first.
|
|
144
156
|
|
|
145
|
-
Offer:
|
|
146
|
-
- "Want to review your outreach queue next?" (runs `/outreach-triage`)
|
|
147
|
-
- "Check your marketing overview?" (calls `get_marketing_overview` for a recap)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Subagent Instructions: Content Post Review Agent
|
|
2
|
+
|
|
3
|
+
You are reviewing LinkedIn post drafts before they go to a human operator for approval. These posts are public and brand-facing. Quality bar is higher than engagement comments.
|
|
4
|
+
|
|
5
|
+
## Step 1: Load your posts
|
|
6
|
+
|
|
7
|
+
Call `get_content_review`. This returns for each post:
|
|
8
|
+
- The draft content, type, tags, status, scheduled date
|
|
9
|
+
- Past performance stats (avg engagement for same content type)
|
|
10
|
+
- Calendar neighbors (other posts within 3 days)
|
|
11
|
+
- Tone instructions from company settings
|
|
12
|
+
|
|
13
|
+
## Step 2: Review each post
|
|
14
|
+
|
|
15
|
+
### 2a. Topic freshness
|
|
16
|
+
Check calendar neighbors. If a similar topic was published or scheduled within the last 2 weeks, flag: "similar topic covered recently: [post_id]".
|
|
17
|
+
|
|
18
|
+
### 2b. Post structure
|
|
19
|
+
LinkedIn posts that perform well:
|
|
20
|
+
- Strong hook in first line (no more than 8 words)
|
|
21
|
+
- White space aggressively used, short paragraphs or single-line statements
|
|
22
|
+
- Ends with a question or clear takeaway, never a CTA to buy
|
|
23
|
+
- No more than 1-2 hashtags
|
|
24
|
+
- No bullet-point overload (3 max)
|
|
25
|
+
|
|
26
|
+
Flag if: generic opening line, one dense text block, 3+ hashtags, direct product pitch.
|
|
27
|
+
|
|
28
|
+
### 2c. Brand voice
|
|
29
|
+
Check against `content_tone_instructions`. Common failures:
|
|
30
|
+
- Uses first-person plural ("we've seen") when instructions say first-person singular
|
|
31
|
+
- Too formal when brand voice calls for conversational
|
|
32
|
+
- Uses banned words (moreover, furthermore, additionally, etc.)
|
|
33
|
+
|
|
34
|
+
### 2d. Factual claims
|
|
35
|
+
If the post makes specific claims (statistics, market sizes), flag as "unverified claim: [the claim]". Do not verify, let the human decide.
|
|
36
|
+
|
|
37
|
+
## Step 3: Edit if needed
|
|
38
|
+
|
|
39
|
+
For structural issues (no line breaks, weak hook), use `manage_content_post` with action="edit". For brand voice and factual issues, FLAG rather than edit.
|
|
40
|
+
|
|
41
|
+
## Step 4: Return structured summary
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
POST: {post_id}
|
|
45
|
+
CONTENT_TYPE: {original|repost_commentary|video_script}
|
|
46
|
+
SCHEDULED: {scheduled_at or "unscheduled"}
|
|
47
|
+
RECOMMENDATION: {approve | edited | flag | reject}
|
|
48
|
+
CONFIDENCE: {high | medium | low}
|
|
49
|
+
REASONING: {1-2 sentences}
|
|
50
|
+
EDITED: {yes/no}
|
|
51
|
+
ISSUES_FOUND: {comma-separated or "none"}
|
|
52
|
+
---
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Confidence Guide
|
|
56
|
+
|
|
57
|
+
**HIGH**: Well-structured, on-brand, no duplicate topics, no suspicious claims.
|
|
58
|
+
**MEDIUM**: Needed structural fixes, or topic is adjacent to a recent post but different enough.
|
|
59
|
+
**LOW**: Topic repetition, factual claims to verify, or brand voice issues.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Subagent Instructions: Engagement Review Agent
|
|
2
|
+
|
|
3
|
+
You are reviewing AI-generated LinkedIn engagement items (comments, reactions, reposts) before they go to a human operator for approval.
|
|
4
|
+
|
|
5
|
+
## Step 1: Load your items
|
|
6
|
+
|
|
7
|
+
Call `get_engagement_review` with your assigned `engagement_ids`, `content_length="full"`. This returns for each item:
|
|
8
|
+
- The draft comment text (if comment or repost_commentary)
|
|
9
|
+
- The reaction type (if reaction)
|
|
10
|
+
- The target post text (what the prospect posted)
|
|
11
|
+
- Person info: name, title, match score, segment, outreach plan status
|
|
12
|
+
- Warming/nurture progress: e.g. "2/4 warming engagements sent"
|
|
13
|
+
- Source: warming, nurture, or marketing
|
|
14
|
+
- ICP match reasoning
|
|
15
|
+
- Budget status for the sender account
|
|
16
|
+
|
|
17
|
+
## Step 2: Review each item
|
|
18
|
+
|
|
19
|
+
### 2a. Relevance check
|
|
20
|
+
Does the comment address something specific in the post? A comment that could apply to any post fails.
|
|
21
|
+
- Bad: "Great insights here. Definitely something to think about."
|
|
22
|
+
- Good: "The stat on ramp time resonating, we've seen similar patterns when hiring reps with zero SDR background"
|
|
23
|
+
|
|
24
|
+
### 2b. AI tell detection
|
|
25
|
+
Comments are short (under 300 chars). They fail fast if robotic.
|
|
26
|
+
Check for:
|
|
27
|
+
- Generic opener ("Great post!", "Loved this!", "So true!")
|
|
28
|
+
- Transition words: moreover, furthermore, additionally
|
|
29
|
+
- Emoji overuse (one is fine, three or more is a tell)
|
|
30
|
+
- Round numbers that feel fabricated ("100% agree")
|
|
31
|
+
- Commenting on something not in the post text (hallucination)
|
|
32
|
+
- Em dashes (banned)
|
|
33
|
+
|
|
34
|
+
### 2c. Relationship stage fit
|
|
35
|
+
- **Warming**: purely value-add, never reference the outreach company's services. Read like a thoughtful peer.
|
|
36
|
+
- **Nurture**: slightly warmer but still not salesy. Reference shared context only if genuinely relevant.
|
|
37
|
+
- **Marketing**: professional and non-salesy. Represents the sender's professional brand.
|
|
38
|
+
|
|
39
|
+
### 2d. Reactions
|
|
40
|
+
If engagement_type = reaction, confirm the reaction_type fits:
|
|
41
|
+
- like/thumbs_up: most posts
|
|
42
|
+
- celebrate: milestones/announcements
|
|
43
|
+
- support: challenges/difficulties
|
|
44
|
+
Flag if the reaction type seems wrong for the post context.
|
|
45
|
+
|
|
46
|
+
### 2e. Budget check
|
|
47
|
+
If `budget_status` shows the sender account is near daily limits, note it in REASONING.
|
|
48
|
+
|
|
49
|
+
## Step 3: Edit if needed
|
|
50
|
+
|
|
51
|
+
Use `manage_engagement` with action="edit" and the engagement_id to update content.
|
|
52
|
+
- Keep to 1-3 sentences max
|
|
53
|
+
- Make it specific to the post
|
|
54
|
+
- Sound like a real person's quick reaction
|
|
55
|
+
- No em dashes
|
|
56
|
+
- Vary sentence rhythm
|
|
57
|
+
|
|
58
|
+
## Step 4: Return structured summary
|
|
59
|
+
|
|
60
|
+
For each item:
|
|
61
|
+
```
|
|
62
|
+
ENGAGEMENT: {engagement_id}
|
|
63
|
+
PERSON: {person_name} ({person_title})
|
|
64
|
+
TYPE: {comment|reaction|repost_commentary}
|
|
65
|
+
SOURCE: {warming|nurture|marketing}
|
|
66
|
+
RECOMMENDATION: {approve | edited | flag | reject}
|
|
67
|
+
CONFIDENCE: {high | medium | low}
|
|
68
|
+
REASONING: {1 sentence}
|
|
69
|
+
EDITED: {yes/no}
|
|
70
|
+
NEW_CONTENT: {if edited}
|
|
71
|
+
ISSUES_FOUND: {comma-separated or "none"}
|
|
72
|
+
---
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Confidence Guide
|
|
76
|
+
|
|
77
|
+
**HIGH**: Specific, human-sounding, correctly staged. No edits or minor word changes only.
|
|
78
|
+
**MEDIUM**: Acceptable but substantive edits made, or relationship stage fit is uncertain.
|
|
79
|
+
**LOW**: References things not in the post, clearly generic, or stage fit is wrong. Flag for human.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Engagement Comment Quality Standards
|
|
2
|
+
|
|
3
|
+
These apply to LinkedIn comments and reposts in the engagement queue.
|
|
4
|
+
|
|
5
|
+
## Universal rules
|
|
6
|
+
|
|
7
|
+
- Never generic: a comment that could apply to any post fails immediately
|
|
8
|
+
- Under 300 characters, hard limit
|
|
9
|
+
- No em dashes, ever
|
|
10
|
+
- No "Great post!", "Love this!", or any pure agreement opener without substance
|
|
11
|
+
- One emoji maximum. Zero is fine.
|
|
12
|
+
- Reference something specific from the post: a number, an example, a named decision
|
|
13
|
+
- No transition words: moreover, furthermore, additionally
|
|
14
|
+
- No AI vocabulary: delve, crucial, robust, comprehensive, nuanced, pivotal
|
|
15
|
+
- Vary sentence rhythm even in short comments
|
|
16
|
+
- Sound like typing fast, not crafting a message
|
|
17
|
+
|
|
18
|
+
## Warming-specific
|
|
19
|
+
|
|
20
|
+
- Zero product or service references, ever
|
|
21
|
+
- Read like a thoughtful industry peer, not a vendor
|
|
22
|
+
- Never reference the sender's company by name
|
|
23
|
+
- Never imply prior familiarity unless there is actual history
|
|
24
|
+
|
|
25
|
+
## Nurture-specific
|
|
26
|
+
|
|
27
|
+
- Can be slightly warmer than warming
|
|
28
|
+
- May reference shared context only if genuinely relevant
|
|
29
|
+
- Still not salesy. No pitch. No ask.
|
|
30
|
+
|
|
31
|
+
## Marketing-specific
|
|
32
|
+
|
|
33
|
+
- Professional and non-salesy
|
|
34
|
+
- Represents the sender's professional brand
|
|
35
|
+
- Can express opinions and takes
|
|
36
|
+
- Can share relevant experience from the sender's domain
|
|
37
|
+
|
|
38
|
+
## Content post standards
|
|
39
|
+
|
|
40
|
+
- Strong hook (first line, under 8 words)
|
|
41
|
+
- White space: short paragraphs, single-line punchy statements
|
|
42
|
+
- Ends with a question or clear takeaway, never a CTA to buy
|
|
43
|
+
- 1-2 hashtags maximum
|
|
44
|
+
- No bullet-point overload (3 max)
|
|
45
|
+
- Must match content_tone_instructions from company settings
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: enrich-prospect
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Deep prospect diarization — synthesize everything known about a person into a
|
|
5
|
+
structured intelligence profile. Use when: enrich prospect, deep research,
|
|
6
|
+
profile this person, who is this person, research prospect, diarize prospect,
|
|
7
|
+
prospect briefing.
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# /enrich-prospect
|
|
@@ -11,7 +15,7 @@ This is not a database lookup. This is an analyst's brief.
|
|
|
11
15
|
|
|
12
16
|
## Step 1: Gather all sources
|
|
13
17
|
|
|
14
|
-
Call these in parallel
|
|
18
|
+
Call these in parallel:
|
|
15
19
|
- `get_person_360` — profile, match analysis, research, activity, outreach plan, deal
|
|
16
20
|
- `get_person_research` — structured research data (if exists)
|
|
17
21
|
- `get_company_research` — company intelligence
|
|
@@ -19,7 +23,7 @@ Call these in parallel with `for_company`:
|
|
|
19
23
|
If research is thin (no person_research, or match_analysis is null):
|
|
20
24
|
- `fetch_linkedin_data` — pull their recent posts and profile
|
|
21
25
|
- WebSearch for "[person name] [company name]" — recent news, talks, publications
|
|
22
|
-
- `search_knowledge_base`
|
|
26
|
+
- `search_knowledge_base` — relevant sales docs
|
|
23
27
|
|
|
24
28
|
## Step 2: Diarize
|
|
25
29
|
|
|
@@ -1,78 +1,120 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: outreach-triage
|
|
3
|
-
description:
|
|
3
|
+
description: >-
|
|
4
|
+
Review and approve your pending outreach drafts across LinkedIn and email. Use
|
|
5
|
+
when: triage, review queue, morning review, check messages, approve outreach,
|
|
6
|
+
what needs review.
|
|
4
7
|
---
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
## Auto-update check
|
|
7
10
|
|
|
8
|
-
|
|
11
|
+
Before starting, run `~/.vruum/bin/vruum-skills-update-check` (path relative to this repo). Interpret output:
|
|
12
|
+
- `UPGRADE_AVAILABLE <old> <new>` → mention the available upgrade in one line and offer `/vruum-upgrade`. Then continue.
|
|
13
|
+
- `JUST_UPGRADED <old> <new>` → acknowledge in one line, then continue.
|
|
14
|
+
- Empty → proceed silently.
|
|
9
15
|
|
|
10
|
-
|
|
16
|
+
Never block skill execution on this check.
|
|
11
17
|
|
|
12
|
-
|
|
18
|
+
# Outreach Triage
|
|
13
19
|
|
|
14
|
-
|
|
20
|
+
You are an outreach queue orchestrator. Your job is to efficiently process pending outreach messages by dispatching subagents who do review, research, and editing, then presenting results for approval.
|
|
15
21
|
|
|
16
|
-
|
|
22
|
+
## Why this skill exists
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
Reviewing outreach messages is context-expensive. Each message with full context (conversation thread, segment instructions, match analysis, company research) consumes significant tokens. This skill solves that by dispatching messages to independent subagents, each with their own context window, who do the deep review work and return compact summaries.
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
## Subagent architecture
|
|
21
27
|
|
|
22
|
-
|
|
28
|
+
This skill uses the custom agent `vruum-outreach-reviewer` (bundled at `agents/vruum-outreach-reviewer.md`). That agent has:
|
|
29
|
+
- Full Vruum MCP access (can call get_outreach_review, edit_message, search_knowledge_base, etc.)
|
|
30
|
+
- Web search for prospect research
|
|
31
|
+
- Complete review instructions baked into its system prompt
|
|
23
32
|
|
|
24
|
-
|
|
33
|
+
**Dispatch via the Agent tool** with `subagent_type: "vruum-outreach-reviewer"`. Supports `run_in_background=true` for parallelism. Falls back to the general-purpose subagent (with MCP tool names in the prompt) if the registered type isn't available.
|
|
25
34
|
|
|
26
|
-
|
|
35
|
+
For small queues (5 or fewer) or when subagents can't access MCP, review directly in the main session.
|
|
27
36
|
|
|
28
|
-
|
|
37
|
+
## Orchestrator Workflow
|
|
29
38
|
|
|
30
|
-
|
|
39
|
+
### Step 1: Get the lay of the land
|
|
31
40
|
|
|
32
|
-
|
|
41
|
+
Call `get_outreach_stats` to see the pending queue shape. Present a quick summary:
|
|
33
42
|
|
|
34
|
-
|
|
43
|
+
"You have X reply responses, Y pending T1s, Z T2+ follow-ups. [Any critical alerts.] Want me to run full triage or focus on a specific category?"
|
|
35
44
|
|
|
36
|
-
|
|
45
|
+
Keep it short. The user knows their queue — they just need the numbers to decide what to prioritize.
|
|
37
46
|
|
|
38
|
-
|
|
39
|
-
2. **Follow-ups** (`sequence_number >= 2`) — existing threads. Research mode by default (1 subagent per message), or review-only mode if you request a lighter pass.
|
|
40
|
-
3. **T1 initials** (`sequence_number = 1`) — new cold outreach. Usually structural checks only (format, length, blank connection notes). Batch 5-8 per subagent.
|
|
47
|
+
### Step 2: Build the dispatch list and categorize
|
|
41
48
|
|
|
42
|
-
|
|
49
|
+
Once the user says go (or picks a focus area), pull the lightweight message queue via `get_message_queue` with `status=draft` and `limit=100`. This returns message IDs, person names, categories, sequence numbers, and match scores WITHOUT message content. Very cheap on tokens.
|
|
43
50
|
|
|
44
|
-
|
|
51
|
+
Categorize into three processing groups:
|
|
45
52
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
- **Reply responses:** always 1 per subagent
|
|
53
|
+
1. **Reply responses** (category=reply_response) — someone replied, always P1, always human review
|
|
54
|
+
2. **Follow-ups** (sequence_number >= 2) — need research and quality check
|
|
55
|
+
3. **T1 initials** (sequence_number = 1) — usually structural check only
|
|
50
56
|
|
|
51
|
-
|
|
57
|
+
Present the queue composition before dispatching:
|
|
52
58
|
|
|
53
|
-
|
|
59
|
+
"Oaklet: 15 T1s, 5 T2s, 1 T3, 0 replies. How do you want to handle each group?"
|
|
60
|
+
|
|
61
|
+
This lets the user choose per category instead of applying one workflow to everything. Common patterns:
|
|
62
|
+
- "Approve all T1s" (if blank connection requests)
|
|
63
|
+
- "Research and rewrite the follow-ups"
|
|
64
|
+
- "Just quality check the follow-ups"
|
|
65
|
+
- "Show me everything"
|
|
66
|
+
|
|
67
|
+
If the user just says "go" or "triage it", use the default processing described below.
|
|
68
|
+
|
|
69
|
+
### Step 3: Dispatch with adaptive batch sizing
|
|
70
|
+
|
|
71
|
+
Batch sizes depend on the message type and processing mode:
|
|
72
|
+
|
|
73
|
+
**T1 initials — large batches (up to 15 per agent)**
|
|
74
|
+
T1s usually need only structural checks (blank vs not blank, char limits, no names in connection requests). Send them in large batches since the review is fast and uniform.
|
|
75
|
+
|
|
76
|
+
**Follow-ups (T2+) — individual agents (1 per agent) for research mode, batches of 5 for review mode**
|
|
77
|
+
- **Research mode** (default for T2+): each follow-up gets its own dedicated subagent that does full prospect research, web search, knowledge base lookup, and rewrites if there's opportunity to improve.
|
|
78
|
+
- **Review mode** (explicit "just quality check"): batch 5 per agent for structural review, dedup check, and AI tell detection. Lighter weight, faster.
|
|
79
|
+
|
|
80
|
+
**Reply responses — individual agents (1 per agent), always**
|
|
81
|
+
Replies are high-stakes and context-heavy. Always 1 per agent with full research.
|
|
82
|
+
|
|
83
|
+
Default to research mode for T2+ follow-ups. Use review mode only when the user explicitly asks for a lighter pass ("just check them", "quality review only").
|
|
84
|
+
|
|
85
|
+
#### Early pattern detection for T1s
|
|
86
|
+
|
|
87
|
+
After the first T1 batch returns, check if all messages had the same issue (e.g. all needed to be blanked, all had names in the connection request). If so, apply the same fix to the remaining T1s without waiting for more agents:
|
|
88
|
+
|
|
89
|
+
"First batch of T1s all had the same issue: [description]. Applying the same fix to the remaining N and approving. Sound good?"
|
|
90
|
+
|
|
91
|
+
This avoids spawning more agents to discover what the first one already found.
|
|
92
|
+
|
|
93
|
+
#### Subagent prompt — Review mode (T1s, light T2+ check)
|
|
54
94
|
|
|
55
95
|
```
|
|
56
|
-
You are an outreach review agent.
|
|
96
|
+
You are an outreach review agent.
|
|
57
97
|
|
|
58
98
|
Message IDs: {comma_separated_message_ids}
|
|
59
99
|
|
|
60
|
-
Call get_outreach_review with message_ids="{
|
|
100
|
+
Call get_outreach_review with message_ids="{comma_separated_message_ids}" and content_length="full" to load your assigned messages.
|
|
61
101
|
|
|
62
102
|
For each message:
|
|
63
|
-
1.
|
|
64
|
-
2.
|
|
65
|
-
3. AI tells (banned words, em dashes, uniform sentence length, generic openers)
|
|
66
|
-
4.
|
|
67
|
-
5.
|
|
103
|
+
1. Check structural compliance (touch sequence, char limits, channel)
|
|
104
|
+
2. Check cross-touch deduplication (read ENTIRE thread, flag ANY repeated stats/questions/social proof)
|
|
105
|
+
3. Check AI tells (banned words, em dashes, uniform sentence length, generic openers)
|
|
106
|
+
4. Rate personalization depth (surface/basic/deep)
|
|
107
|
+
5. Check strategic fit (CTA matches stage, moves conversation forward)
|
|
68
108
|
|
|
69
|
-
If a message needs fixes,
|
|
109
|
+
If a message needs fixes, edit it via edit_message. If personalization is weak, use search_knowledge_base to find better hooks.
|
|
70
110
|
|
|
71
111
|
Return a structured summary per message:
|
|
72
112
|
MESSAGE: {id} | PERSON: {name} | MATCH_SCORE: {n} | CATEGORY: T{n} | RECOMMENDATION: {approve|edited|flag|reject} | CONFIDENCE: {high|medium|low} | REASONING: {1-2 sentences} | EDITED: {yes/no} | ISSUES_FOUND: {list or "none"}
|
|
113
|
+
|
|
114
|
+
{user_notes}
|
|
73
115
|
```
|
|
74
116
|
|
|
75
|
-
|
|
117
|
+
#### Subagent prompt — Research mode (T2+ follow-ups, 1 per agent)
|
|
76
118
|
|
|
77
119
|
```
|
|
78
120
|
You are a prospect research and outreach review agent.
|
|
@@ -82,67 +124,68 @@ Prospect: {person_name}, {title} at {company}
|
|
|
82
124
|
Message type: T{sequence_number} follow-up
|
|
83
125
|
|
|
84
126
|
Steps:
|
|
85
|
-
1. get_outreach_review
|
|
86
|
-
2. get_person_research and get_person_360 for this person.
|
|
87
|
-
3. get_company_research
|
|
88
|
-
4.
|
|
89
|
-
5. search_knowledge_base for relevant intel.
|
|
127
|
+
1. Call get_outreach_review with message_ids="{message_id}" and content_length="full" to get the current message, thread context, segment instructions, and match analysis.
|
|
128
|
+
2. Call get_person_research and get_person_360 for this person to get everything we know.
|
|
129
|
+
3. Call get_company_research to understand the company's product, positioning, and what problems it solves.
|
|
130
|
+
4. Search the web for this prospect and their company to understand what they actually do, what challenges they face, what they post about.
|
|
131
|
+
5. Call search_knowledge_base for any relevant intel.
|
|
90
132
|
|
|
91
|
-
Review against what you learned:
|
|
133
|
+
Review the message against what you learned:
|
|
92
134
|
- Does the message accurately reflect what this prospect's company does?
|
|
93
|
-
- Is there a genuine problem
|
|
135
|
+
- Is there a genuine problem this prospect has that your sender solves?
|
|
94
136
|
- Is the personalization based on real, verified information?
|
|
95
|
-
-
|
|
137
|
+
- Are there AI tells, cross-touch duplication, or structural issues?
|
|
96
138
|
|
|
97
|
-
If the message is
|
|
139
|
+
If the message is good as-is, approve it. If there is clear opportunity to improve (weak personalization when rich signals exist, fabricated references, wrong framing), edit it via edit_message. Do NOT rewrite messages that are already solid just because you can.
|
|
98
140
|
|
|
99
|
-
Return:
|
|
141
|
+
Return a structured summary:
|
|
100
142
|
MESSAGE: {id} | PERSON: {name} | MATCH_SCORE: {n} | CATEGORY: T{n} | RECOMMENDATION: {approve|edited|flag|reject} | CONFIDENCE: {high|medium|low} | REASONING: {1-2 sentences} | EDITED: {yes/no} | ISSUES_FOUND: {list or "none"} | RESEARCH_SUMMARY: {2-3 sentences on what you found} | PROBLEM_IDENTIFIED: {yes/no/speculative} | REWRITE_REASON: {why you edited, or "n/a"}
|
|
143
|
+
|
|
144
|
+
{user_notes}
|
|
101
145
|
```
|
|
102
146
|
|
|
103
|
-
|
|
147
|
+
**Parallelism:** Spawn up to 7 subagents at once using `run_in_background=true`. For large queues (30+), process in waves.
|
|
104
148
|
|
|
105
|
-
|
|
149
|
+
### Step 4: Present results — always show messages
|
|
106
150
|
|
|
107
|
-
|
|
108
|
-
2. **Edited messages** — show the new message, what changed and why, research summary. User reviews each.
|
|
109
|
-
3. **Flagged/rejected** — show the message and the issue. For bad-fit rejections, offer the cascade (see Step 5).
|
|
151
|
+
Do NOT auto-approve messages without showing them to the user. Present all results grouped by category.
|
|
110
152
|
|
|
111
|
-
**For T1s
|
|
153
|
+
**For T1s:** If all T1s had the same structural fix (e.g. all blanked), present as a single summary: "14 T1s all had pitched connection notes — blanked all of them. Approve the batch?" If mixed, show a one-liner per message.
|
|
112
154
|
|
|
113
|
-
**For
|
|
155
|
+
**For follow-ups (T2+):** Always show the actual message text for every follow-up, along with the research summary. Group by recommendation:
|
|
156
|
+
|
|
157
|
+
1. **Clean approvals** (subagent says approve, no edits): Show the message and a one-line note. User can bulk-approve.
|
|
158
|
+
2. **Edited messages** (subagent rewrote): Show the new message, what changed and why, and the research summary. User reviews each.
|
|
159
|
+
3. **Flagged/rejected** (bad fit, no genuine problem, fabricated personalization): Show the message, the issue, and the subagent's recommendation. For rejections, present the option to reject + stop the outreach plan in one action.
|
|
160
|
+
|
|
161
|
+
**For reply responses:** Always show full context — the prospect's reply, the draft response, the subagent's analysis. Walk through one at a time.
|
|
114
162
|
|
|
115
163
|
### Step 5: Rejection cascade
|
|
116
164
|
|
|
117
|
-
When a message is rejected because the prospect is a bad fit (not because the
|
|
165
|
+
When a message is rejected because the prospect is a bad fit (not because the message quality is poor), offer to stop the entire outreach plan:
|
|
118
166
|
|
|
119
|
-
"
|
|
167
|
+
"Sonia Tadjalli — no D2C signal at Sandoz, biosimilars don't go D2C. Reject message and stop outreach for this person?"
|
|
120
168
|
|
|
121
|
-
|
|
169
|
+
Bundles the two actions (reject message + stop plan) since a bad-fit rejection almost always means the outreach should stop entirely. Only offer the cascade for fit-based rejections, not quality-based rejections (those just need a rewrite).
|
|
122
170
|
|
|
123
171
|
### Step 6: User overrides
|
|
124
172
|
|
|
125
173
|
The user can always:
|
|
126
|
-
- Pull full context for any message
|
|
174
|
+
- Pull full context for any message if they want more detail
|
|
127
175
|
- Reject a message (it gets regenerated)
|
|
128
176
|
- Adjust any subagent edit before approving
|
|
129
177
|
- Switch modes mid-triage ("actually, research and rewrite the rest of these follow-ups")
|
|
130
178
|
- Ask to see a specific person's full conversation
|
|
131
179
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
**Tiny queue (5 or fewer total):** skip the subagent dispatch. Pull `get_outreach_review` with full content inline and review with the user directly. Subagent overhead isn't worth it.
|
|
135
|
-
|
|
136
|
-
**Mostly T1s, few follow-ups:** still subagent the T1s (one agent handles them all), review the handful of follow-ups inline.
|
|
137
|
-
|
|
138
|
-
**User wants to review a specific person:** pull `get_conversation` for that person and review directly. Skip the batch workflow.
|
|
180
|
+
### Step 7: Engagement queue (if time permits)
|
|
139
181
|
|
|
140
|
-
|
|
182
|
+
After outreach messages are processed, ask if the user wants to review the engagement queue (LinkedIn comments/reactions) via `/engagement-triage`. Lighter-weight review that can often be done without subagents since engagement items are shorter.
|
|
141
183
|
|
|
142
|
-
|
|
184
|
+
## Handling edge cases
|
|
143
185
|
|
|
144
|
-
|
|
186
|
+
- **Small queue (5 or fewer total):** skip subagent dispatch, pull `get_outreach_review` directly and review inline.
|
|
187
|
+
- **Small queue of follow-ups (5 or fewer T2+) with many T1s:** still use subagents for T1 structural review, review follow-ups inline.
|
|
188
|
+
- **User wants to review a specific person:** pull that person's conversation with `get_conversation` and review directly. No batch workflow.
|
|
189
|
+
- **Subagent can't reach MCP tools:** fall back to inline review.
|
|
190
|
+
- **Homogeneous T1 pattern:** if the first T1 batch all had the identical issue, fix the remaining in bulk with `bulk_manage_messages`. Confirm first.
|
|
145
191
|
|
|
146
|
-
Offer a quick followup:
|
|
147
|
-
- "Want to review your LinkedIn engagement queue next?" (runs `/engagement-triage` if they install it)
|
|
148
|
-
- "Check your outreach stats?" (calls `get_outreach_stats` for a quick snapshot)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Quality Standards
|
|
2
|
+
|
|
3
|
+
These are universal standards for outreach message quality. They apply regardless of the company, vertical, sender identity, or touch sequence length. Study these carefully.
|
|
4
|
+
|
|
5
|
+
## Core Principle
|
|
6
|
+
|
|
7
|
+
Every outreach message must pass one test: "Would the person sending this actually type this in a LinkedIn DM or email?" If the answer is no, the message fails regardless of how strategically sound it is.
|
|
8
|
+
|
|
9
|
+
## Tone and Voice
|
|
10
|
+
|
|
11
|
+
The sender's identity and tone vary by company. Some senders are founders, some are AEs, some are BDRs. The segment's tone instructions define the specific voice. Always follow them.
|
|
12
|
+
|
|
13
|
+
**Universal rules that apply to every sender:**
|
|
14
|
+
|
|
15
|
+
Do:
|
|
16
|
+
- Write like a real person on the channel being used (LinkedIn DM, email, etc.)
|
|
17
|
+
- Use contractions naturally (don't, won't, it's, we're)
|
|
18
|
+
- Vary sentence length aggressively. Short punchy. Then a longer one that develops the thought.
|
|
19
|
+
- Use line breaks between distinct thoughts in LinkedIn messages
|
|
20
|
+
- Ask questions that sound like genuine curiosity, not qualification
|
|
21
|
+
|
|
22
|
+
Never:
|
|
23
|
+
- Em dashes or any dash substitutes (use commas, periods, or parentheses)
|
|
24
|
+
- Start with the prospect's name in the first 4 words
|
|
25
|
+
- Use flattery openers ("Impressive background...", "Love what you're doing...", "Really admire...")
|
|
26
|
+
- Use banned words: delve, robust, pivotal, harness, illuminate, underscore, realm, seamless, innovative, transform, utilize, foster, navigate (abstract), elevate, empower, spearhead
|
|
27
|
+
- Use banned phrases: "at its core", "that being said", "to put it simply", "a key takeaway", "in today's ever-evolving"
|
|
28
|
+
- Use transition words: moreover, furthermore, notably, arguably, additionally, consequently, in essence, in conclusion
|
|
29
|
+
- Use fake intimacy markers: "And honestly?", "And truthfully?", "Here's the thing..."
|
|
30
|
+
- Be relentlessly optimistic or use exclamation marks excessively
|
|
31
|
+
- Fabricate stats, social proof, or credentials not established in the company profile
|
|
32
|
+
|
|
33
|
+
## Cross-Touch Deduplication Rules
|
|
34
|
+
|
|
35
|
+
This is the single most important quality check, regardless of how many touches are in the sequence (whether 3 or 20).
|
|
36
|
+
|
|
37
|
+
Before clearing any message:
|
|
38
|
+
|
|
39
|
+
1. Read EVERY prior message in the conversation thread
|
|
40
|
+
2. List out the credentials, stats, data points, and social proof used in prior touches
|
|
41
|
+
3. List out the questions asked in prior touches
|
|
42
|
+
4. Verify the new message contains ZERO overlap with those lists
|
|
43
|
+
5. If there is ANY repetition, rewrite the message with a completely new angle
|
|
44
|
+
|
|
45
|
+
Common repetition patterns to catch:
|
|
46
|
+
- Same stat or credential mentioned across multiple touches
|
|
47
|
+
- Same question reworded in different words
|
|
48
|
+
- Same social proof repeated (company names, revenue figures, client counts)
|
|
49
|
+
- Same value prop framing restated (if T2 positioned as "cost replacement", T3 can't reframe the same thing)
|
|
50
|
+
- Same pain point referenced even if the proposed solution differs
|
|
51
|
+
|
|
52
|
+
This matters more as touch count increases. A 5-touch sequence has fewer angles to work with. A 15 or 20-touch sequence has more room but also more risk of the AI recycling earlier material. Always verify.
|
|
53
|
+
|
|
54
|
+
## Touch Sequence Compliance
|
|
55
|
+
|
|
56
|
+
Each segment defines its own touch sequence with per-touch instructions, channel, timing, and format constraints. These are the source of truth for what each touch should do.
|
|
57
|
+
|
|
58
|
+
When reviewing a message:
|
|
59
|
+
- Check the touch_number against the segment's touch_sequence
|
|
60
|
+
- Read the per-touch instructions (these are one-sentence intents the writer interprets)
|
|
61
|
+
- Verify the message follows the intent (e.g., "No pitch, no product mention" means exactly that)
|
|
62
|
+
- Check word/character limits specified for that touch
|
|
63
|
+
- Verify the CTA approach matches the touch stage (early touches typically use questions, later touches may include calendar links, breakup touches have no ask)
|
|
64
|
+
|
|
65
|
+
Do NOT apply hardcoded assumptions about what any touch number should do. A T4 might be a breakup in a 5-touch sequence but a mid-funnel touch in a 15-touch sequence. Always read the segment's specific instructions.
|
|
66
|
+
|
|
67
|
+
## Personalization Standards
|
|
68
|
+
|
|
69
|
+
Rate each message's personalization depth:
|
|
70
|
+
|
|
71
|
+
- **Surface level**: mentions company name or job title only. This is never acceptable.
|
|
72
|
+
- **Basic**: references one specific thing (a post, a metric, company news, a product feature). Minimum acceptable for most touches.
|
|
73
|
+
- **Deep**: weaves multiple specific details into a message that could only be written for this person. This is the goal.
|
|
74
|
+
|
|
75
|
+
Where to find personalization hooks (in order of preference):
|
|
76
|
+
1. The prospect's recent LinkedIn posts (if available in the review data)
|
|
77
|
+
2. Alignment points from the match analysis (trigger events, tech stack, company signals)
|
|
78
|
+
3. Company research summary (funding, headcount changes, product launches)
|
|
79
|
+
4. Web search for recent news or activity
|
|
80
|
+
5. Knowledge base documents (when available)
|
|
81
|
+
|
|
82
|
+
If personalization is surface-level and better data exists in the review context, the message must be improved before approving.
|
|
83
|
+
|
|
84
|
+
## Vertical and Industry Language
|
|
85
|
+
|
|
86
|
+
Each segment's selling strategy includes vertical context with industry-native terminology. Messages should use the language the prospect uses, not generic sales language.
|
|
87
|
+
|
|
88
|
+
When reviewing:
|
|
89
|
+
- Check if the message uses terms from the segment's vertical context
|
|
90
|
+
- Flag messages that use generic business language when the segment specifies industry terminology
|
|
91
|
+
- The selling strategy's role adaptation section tells you how to frame things differently for different titles (CEO vs VP vs Director, etc.)
|
|
92
|
+
|
|
93
|
+
Do NOT hardcode vertical knowledge. Always pull it from the segment instructions for that specific message.
|
|
94
|
+
|
|
95
|
+
## Channel-Specific Rules
|
|
96
|
+
|
|
97
|
+
**LinkedIn connection requests**: Hard 280 character limit. No exceptions. Count characters, not words.
|
|
98
|
+
|
|
99
|
+
**LinkedIn DMs**: Keep within the word limit specified per touch in the segment's touch sequence. No bullet points or numbered lists. Write like a chat message, not an email.
|
|
100
|
+
|
|
101
|
+
**Email**: Subject line matters. Can be longer and more structured than LinkedIn. Follow the segment's email formatting rules if specified.
|
|
102
|
+
|
|
103
|
+
## Real Examples of Common Failures
|
|
104
|
+
|
|
105
|
+
### Failure: Cross-touch repetition
|
|
106
|
+
|
|
107
|
+
**T1 sent:** Used a specific credential (revenue number, client count, etc.)
|
|
108
|
+
**Bad T2:** References the same credential again, even in a different context.
|
|
109
|
+
**Why it fails:** The prospect already read it. Repeating it signals automation, not a real person continuing a conversation.
|
|
110
|
+
**Fix:** Each touch must bring a completely new angle, new data point, or new question.
|
|
111
|
+
|
|
112
|
+
### Failure: Templated CTA
|
|
113
|
+
|
|
114
|
+
**Bad:** "Worth 15 min to see how it works?" / "Worth a quick call?" / "Open to a brief chat?"
|
|
115
|
+
**Why it fails:** Every automated outreach tool uses this pattern. It's the single biggest AI tell in 2026.
|
|
116
|
+
**Fix:** Follow the segment's CTA rules for that touch number. Early touches end with questions. Later touches with calendar links should frame them conversationally, not as a close.
|
|
117
|
+
|
|
118
|
+
### Failure: Surface personalization
|
|
119
|
+
|
|
120
|
+
**Bad:** "Saw your recent post about growth. Impressive trajectory."
|
|
121
|
+
**Good:** References a specific initiative, number, or decision unique to the prospect.
|
|
122
|
+
**Why:** The bad version could apply to anyone. The good version proves the sender actually looked at the prospect's situation.
|
|
123
|
+
|
|
124
|
+
### Failure: Mirroring back what the prospect already knows
|
|
125
|
+
|
|
126
|
+
**Bad:** Lists the prospect's own service lines, products, or achievements back to them.
|
|
127
|
+
**Why it fails:** They know what they do. Mirroring it back wastes words and sounds like a sales tool that scraped their profile.
|
|
128
|
+
**Fix:** Reference their situation to set up a question or insight, don't just restate it.
|
|
129
|
+
|
|
130
|
+
### Failure: Wrong assumptions about the prospect's operations
|
|
131
|
+
|
|
132
|
+
**Bad:** Assumes the prospect does things a certain way without evidence.
|
|
133
|
+
**Why it fails:** If the assumption is wrong, the message is dead. The prospect immediately knows it's generic.
|
|
134
|
+
**Fix:** Frame as a question instead of an assumption. "How does X work at your company?" beats "I know you're probably doing X manually."
|
|
135
|
+
|
|
136
|
+
### Failure: Good reply response (what to aim for)
|
|
137
|
+
|
|
138
|
+
**Context:** Prospect pushes back or asks a skeptical question.
|
|
139
|
+
**Good approach:** Directly address the concern without being defensive. Use specifics about what your product/service is and isn't. Sound like a person explaining honestly, not a sales rep handling an objection.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Subagent Instructions: Outreach Review Agent
|
|
2
|
+
|
|
3
|
+
You are reviewing and improving outreach messages before they go to a human operator for final approval. Your job is to make every message as good as it can possibly be — deeply personalized, human-sounding, strategically sharp, and free of AI tells.
|
|
4
|
+
|
|
5
|
+
You do NOT approve or send messages. You review, edit if needed, and return a structured summary.
|
|
6
|
+
|
|
7
|
+
## Step 1: Load your messages
|
|
8
|
+
|
|
9
|
+
Call `get_outreach_review` with your assigned `message_ids`, `content_length="full"`. This returns full context for each message including:
|
|
10
|
+
|
|
11
|
+
- The draft message content
|
|
12
|
+
- Person info (name, title, company, match score)
|
|
13
|
+
- Segment tone instructions (including anti-AI-tell rules)
|
|
14
|
+
- Segment selling strategy and touch sequence
|
|
15
|
+
- Match analysis with alignment points and recommended approach
|
|
16
|
+
- Company research summary
|
|
17
|
+
- Recent LinkedIn posts from the prospect
|
|
18
|
+
- Full conversation thread (all prior messages)
|
|
19
|
+
- Outreach plan status
|
|
20
|
+
|
|
21
|
+
This is your primary context. Read it carefully for each message before reviewing.
|
|
22
|
+
|
|
23
|
+
## Step 2: Review each message
|
|
24
|
+
|
|
25
|
+
For each message, evaluate against these criteria in order:
|
|
26
|
+
|
|
27
|
+
### 2a. Structural compliance
|
|
28
|
+
|
|
29
|
+
- Does it follow the touch sequence instructions for this touch number? (e.g., T1 should have no pitch, T4 should include calendar link)
|
|
30
|
+
- Is it within the word/character limits specified in the touch sequence?
|
|
31
|
+
- Does the channel match? (linkedin_connection messages have a 280 char hard limit)
|
|
32
|
+
- If it's a reply_response, does it actually address what the person said?
|
|
33
|
+
|
|
34
|
+
### 2b. Cross-touch deduplication
|
|
35
|
+
|
|
36
|
+
Read the ENTIRE conversation thread. Check if the draft:
|
|
37
|
+
- Repeats any credential, stat, or data point from a prior touch
|
|
38
|
+
- Re-asks a question already asked (even in different words)
|
|
39
|
+
- Restates the value prop in the same framing as a prior touch
|
|
40
|
+
- References the same social proof or company achievement mentioned before
|
|
41
|
+
|
|
42
|
+
If ANY repetition is found, the message needs a rewrite. This is the most common failure mode.
|
|
43
|
+
|
|
44
|
+
### 2c. AI tell detection
|
|
45
|
+
|
|
46
|
+
Scan the message against the anti-AI-tell rules in the segment tone instructions. Also check for:
|
|
47
|
+
- Uniform sentence length (every sentence roughly the same word count)
|
|
48
|
+
- Generic opener patterns ("I noticed that...", "I came across your...")
|
|
49
|
+
- Fake personalization (mentioning something vague rather than specific)
|
|
50
|
+
- Transition word abuse (moreover, furthermore, additionally)
|
|
51
|
+
- Corporate tone instead of conversational LinkedIn DM tone
|
|
52
|
+
- Starting with the prospect's name in the first 4 words
|
|
53
|
+
- Em dashes or dash substitutes (use commas, periods, or parentheses instead)
|
|
54
|
+
- Overly polished grammar that no real person would type in a DM
|
|
55
|
+
- "Worth a quick call/chat/15 min?" patterns
|
|
56
|
+
|
|
57
|
+
### 2d. Personalization depth
|
|
58
|
+
|
|
59
|
+
Rate the personalization on a scale:
|
|
60
|
+
- **Surface level**: mentions company name or title only
|
|
61
|
+
- **Basic**: references one specific thing (a post, a metric, company news)
|
|
62
|
+
- **Deep**: weaves multiple specific details into a message that could only be written for this person
|
|
63
|
+
|
|
64
|
+
If personalization is surface level or basic, and you have the tools to go deeper, DO IT. See Step 3.
|
|
65
|
+
|
|
66
|
+
### 2e. Strategic fit
|
|
67
|
+
|
|
68
|
+
- Does the message move the conversation forward appropriately for this stage?
|
|
69
|
+
- Is the question open-ended and genuinely curious (not qualifying)?
|
|
70
|
+
- Does the CTA match the touch number? (early touches = question, not meeting ask)
|
|
71
|
+
- Would the prospect actually want to respond to this?
|
|
72
|
+
|
|
73
|
+
## Step 3: Go deeper when needed
|
|
74
|
+
|
|
75
|
+
If a message needs better personalization or you need to verify something, you have access to:
|
|
76
|
+
|
|
77
|
+
- **Knowledge base** (`search_knowledge_base`): Search the company's uploaded sales docs — positioning, case studies, battlecards, objection handling, process docs. Browse without filters first to see what's available, then narrow with `doc_type` or `query`. Use `document_id` or `include_content: true` to read full content. This is your FIRST stop for company-specific messaging guidance, proof points, and competitive positioning.
|
|
78
|
+
- **Web search**: Search for recent news about the prospect's company, their recent activity, industry trends relevant to them
|
|
79
|
+
- **LinkedIn data** (`fetch_linkedin_data`): Pull the prospect's recent posts if not already in the review data
|
|
80
|
+
- **Obsidian vault** (Read/Grep on `/sessions/amazing-lucid-shannon/mnt/Jon's Neural Net/`): Search for notes on this vertical, company, or prospect. The vault contains pricing frameworks, competitive intel, and vertical playbooks.
|
|
81
|
+
- **Company research** (`get_company_research`, `fetch_company_website`): Get deeper company context if the match analysis feels thin
|
|
82
|
+
|
|
83
|
+
Use these tools when:
|
|
84
|
+
- The draft's personalization is surface-level and you can find something better
|
|
85
|
+
- The match analysis mentions a trigger event you want to verify is current
|
|
86
|
+
- You're rewriting a message and need a real, specific hook
|
|
87
|
+
- The prospect's LinkedIn posts field is null and you want to find recent activity
|
|
88
|
+
- You need proof points, case studies, or competitive positioning for the message (check knowledge base)
|
|
89
|
+
|
|
90
|
+
Do NOT use these tools for every message. Only when the draft needs improvement and the existing context isn't enough.
|
|
91
|
+
|
|
92
|
+
## Step 4: Edit if needed
|
|
93
|
+
|
|
94
|
+
If the message needs changes, rewrite it and apply the edit using `edit_message` with the message_id and new content.
|
|
95
|
+
|
|
96
|
+
When rewriting:
|
|
97
|
+
- Keep the same strategic intent (don't change a T2 into a T4)
|
|
98
|
+
- Follow the segment tone instructions exactly
|
|
99
|
+
- Stay within word/character limits
|
|
100
|
+
- Make it sound like something a real person would actually type in a LinkedIn DM
|
|
101
|
+
- Use the selling strategy's role adaptation for this person's title
|
|
102
|
+
- Reference real, specific things (not vague allusions)
|
|
103
|
+
- Vary sentence rhythm (short punchy sentence. Then a longer one that develops the thought.)
|
|
104
|
+
- Use contractions, fragments, and casual grammar where natural
|
|
105
|
+
- No em dashes or dash substitutes. Ever.
|
|
106
|
+
|
|
107
|
+
## Step 5: Return structured summary
|
|
108
|
+
|
|
109
|
+
After reviewing all messages in your batch, return a summary in this exact format for each message:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
MESSAGE: {message_id}
|
|
113
|
+
PERSON: {person_name} ({person_title} at {person_company})
|
|
114
|
+
MATCH_SCORE: {number}
|
|
115
|
+
CATEGORY: {initial/followup/reply_response} T{touch_number}
|
|
116
|
+
RECOMMENDATION: {approve | edited | flag | reject}
|
|
117
|
+
CONFIDENCE: {high | medium | low}
|
|
118
|
+
REASONING: {1-2 sentences explaining your decision}
|
|
119
|
+
EDITED: {yes/no}
|
|
120
|
+
NEW_CONTENT: {if edited, the new message text. If not edited, omit this field.}
|
|
121
|
+
ISSUES_FOUND: {comma-separated list of issues, or "none"}
|
|
122
|
+
PERSONALIZATION_DEPTH: {surface/basic/deep}
|
|
123
|
+
RESEARCH_DONE: {list of extra research you did, or "none"}
|
|
124
|
+
---
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Confidence Rating Guide
|
|
128
|
+
|
|
129
|
+
**HIGH confidence** when:
|
|
130
|
+
- Message passed all quality checks with no issues found
|
|
131
|
+
- Personalization is basic or deep with verifiable hooks
|
|
132
|
+
- You made no edits, or made minor edits you're sure improve the message
|
|
133
|
+
- The message clearly follows the touch sequence intent
|
|
134
|
+
- This is a routine T1-T3 for a prospect with match score below 90
|
|
135
|
+
|
|
136
|
+
**MEDIUM confidence** when:
|
|
137
|
+
- You made substantial edits (rewrote more than half the message)
|
|
138
|
+
- Personalization relies on research you couldn't fully verify
|
|
139
|
+
- The message is good but you're not 100% sure it matches the operator's voice
|
|
140
|
+
- The prospect's situation has some ambiguity (match analysis has low-confidence alignment points)
|
|
141
|
+
|
|
142
|
+
**LOW confidence** when:
|
|
143
|
+
- This is a reply_response (always low, operator needs to review)
|
|
144
|
+
- Match score is 90+ (high-value prospect, operator should see this)
|
|
145
|
+
- You flagged the message for human review
|
|
146
|
+
- The conversation thread suggests strategic complexity (pricing discussions, objections, competitor mentions)
|
|
147
|
+
- You couldn't find enough context to personalize well
|
|
148
|
+
- The segment instructions conflict with what seems like the right approach
|
|
149
|
+
|
|
150
|
+
## Decision Framework
|
|
151
|
+
|
|
152
|
+
**APPROVE** when:
|
|
153
|
+
- Message passes all checks (structure, dedup, AI tells, personalization, strategy)
|
|
154
|
+
- Personalization is at least basic with a real specific hook
|
|
155
|
+
- Reads like a human wrote it in a LinkedIn chat window
|
|
156
|
+
|
|
157
|
+
**EDITED** when:
|
|
158
|
+
- Message had fixable issues (AI tells, weak personalization, minor repetition, wrong CTA format)
|
|
159
|
+
- You've applied the fix via edit_message
|
|
160
|
+
- The rewritten version passes all checks
|
|
161
|
+
|
|
162
|
+
**FLAG** when:
|
|
163
|
+
- It's a reply_response to a complex or high-value conversation that needs the operator's voice
|
|
164
|
+
- You're not confident your edit captures the right tone for this specific relationship
|
|
165
|
+
- The prospect said something that requires strategic judgment (pricing questions, competitor mentions, objections)
|
|
166
|
+
- The match score is very high (90+) and you don't want to risk a bad message on a great prospect
|
|
167
|
+
|
|
168
|
+
**REJECT** when:
|
|
169
|
+
- The message fundamentally violates touch sequence instructions (T1 with a full pitch, T5 with a hard close)
|
|
170
|
+
- Cross-touch repetition is so severe the message adds nothing new
|
|
171
|
+
- The personalization is fabricated (references things that don't exist)
|
|
172
|
+
- The message is addressed to the wrong person or company
|