@vruum/skills 0.6.9 → 0.6.11
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/package.json +2 -2
- package/skills/engagement-triage/SKILL.md +20 -6
- package/skills/engagement-triage/references/engagement-subagent-instructions.md +20 -5
- package/skills/outreach-triage/SKILL.md +2 -0
- package/skills/outreach-triage/references/subagent-instructions.md +2 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vruum",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.11",
|
|
4
4
|
"description": "Vruum AI skills + remote MCP server for B2B GTM teams. Slash commands for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis, paired with the full Vruum MCP tool surface over OAuth 2.1.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Vruum AI",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vruum",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.11",
|
|
4
4
|
"description": "Vruum AI skills + remote MCP server for B2B GTM teams. Skills for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis, paired with the full Vruum MCP tool surface over OAuth 2.1.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Vruum AI",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vruum/skills",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.11",
|
|
4
4
|
"description": "Vruum AI skills for Claude Code, Claude Desktop, Codex CLI, and any AI assistant with a skill directory. Slash commands for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis. Pairs with the Vruum MCP server at https://api.vruum.ai/mcp.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"outreach",
|
|
43
43
|
"gtm"
|
|
44
44
|
],
|
|
45
|
-
"contentHash": "
|
|
45
|
+
"contentHash": "7a697ed805b730dd66f49fb54b7834b7d35189acd48ac7f0e9adcf4bbfe41149"
|
|
46
46
|
}
|
|
@@ -16,11 +16,15 @@ Do not silently fall back to generic Claude responses.
|
|
|
16
16
|
|
|
17
17
|
# Engagement Triage
|
|
18
18
|
|
|
19
|
-
You review the user's pending LinkedIn engagement
|
|
19
|
+
You review the user's pending LinkedIn engagement queue (warming comments, nurture reactions, marketing comments) and demand-gen content posts. Subagents dispatch in parallel to AUTHOR comments awaiting prose and UPLIFT any legacy backend drafts, then present results for approval. Separate from `/outreach-triage` (which handles outreach messages).
|
|
20
20
|
|
|
21
21
|
## Why this is a skill and not just "call the tool"
|
|
22
22
|
|
|
23
|
-
The backend
|
|
23
|
+
The backend no longer writes engagement prose (VRU-570: the harness authors everything). Items arrive as `needs_draft` — the deterministic research dossier, the target post, and the person context attached, but NO comment text. These are blank pages, not rewrites: the skill AUTHORS the comment in the seller's voice and submits it via `manage_engagements` action=edit (which flips the item to a normal reviewable `draft`), then the operator approves.
|
|
24
|
+
|
|
25
|
+
**Authoring is the second qualification gate.** The backend's relevance scoring picked the post; whether it's actually comment-worthy is now YOUR call — the judgment the retired agent used to make. If the post isn't worth a comment, recommend skip. NOTE the bundle semantics: skipping a needs_draft comment cascade-skips its bundled like (same `engagement_group_id`), so skip means "don't engage this post at all", not "like without commenting."
|
|
26
|
+
|
|
27
|
+
Legacy `draft` items (created before the cutover, or under the fallback env) still carry `polished_floor` — for those the job is UPLIFT: rewrite the floor into a great comment, with `polish_provenance.source="skill"` so the edit diff is captured.
|
|
24
28
|
|
|
25
29
|
Reviewing inline burns tokens fast. Subagents with their own context windows do the uplift in parallel and return compact verdicts.
|
|
26
30
|
|
|
@@ -123,14 +127,24 @@ Hard constraints:
|
|
|
123
127
|
- No company/product names, URLs, or CTAs.
|
|
124
128
|
|
|
125
129
|
For each engagement:
|
|
126
|
-
1. Read
|
|
127
|
-
|
|
130
|
+
1. Read status + content + dossier + target_post_text + pitch_phrases (+
|
|
131
|
+
polished_floor/validator_failures on legacy drafts).
|
|
132
|
+
2. Branch on status:
|
|
133
|
+
**needs_draft → AUTHOR or FLAG** (this is the default post-VRU-570):
|
|
134
|
+
- AUTHOR: write the comment from scratch — grounded in the dossier and
|
|
135
|
+
the actual post text, in the seller's voice, against the same quality
|
|
136
|
+
bars below. This is a blank page, not a rewrite. Submit via
|
|
137
|
+
manage_engagements action="edit" (the edit flips the item to draft).
|
|
138
|
+
- FLAG: the post isn't comment-worthy (generic, off-topic, bad fit) —
|
|
139
|
+
recommend skip. Skipping cascades to the bundled like, so this means
|
|
140
|
+
"don't engage this post at all."
|
|
141
|
+
**draft (legacy/fallback) → UPLIFT, KEEP, or FLAG:**
|
|
128
142
|
- UPLIFT: rewrite to fix listed validator_failures AND/OR pull a sharper
|
|
129
143
|
specific fact from the dossier. Materially better, not lateral.
|
|
130
144
|
- KEEP: polished_floor is already strong. Don't edit.
|
|
131
145
|
- FLAG: structurally broken (off-topic, wrong stage, prospect bad fit).
|
|
132
146
|
Recommend skip + plan-stop cascade.
|
|
133
|
-
3. If UPLIFT, call manage_engagements with:
|
|
147
|
+
3. If AUTHOR or UPLIFT, call manage_engagements with:
|
|
134
148
|
action="edit"
|
|
135
149
|
id="<id>"
|
|
136
150
|
payload={
|
|
@@ -147,7 +161,7 @@ IMPORTANT: Do NOT approve or skip engagements. Return recommendations only.
|
|
|
147
161
|
The operator approves in Step 5.
|
|
148
162
|
|
|
149
163
|
Return a structured summary for each item:
|
|
150
|
-
ENGAGEMENT: {id} | TYPE: {reaction|comment} | PERSON: {name} | SOURCE: {warming|nurture|marketing} | RECOMMENDATION: {uplifted|kept|flag} | CONFIDENCE: {high|medium|low} | REASONING: {1-2 sentences} |
|
|
164
|
+
ENGAGEMENT: {id} | TYPE: {reaction|comment} | PERSON: {name} | SOURCE: {warming|nurture|marketing} | RECOMMENDATION: {authored|uplifted|kept|flag} | CONFIDENCE: {high|medium|low} | REASONING: {1-2 sentences} | AUTHORED_OR_UPLIFTED: {yes/no} | COMMENT_TEXT: {the comment text, or "reaction" for likes} | VALIDATOR_FAILURES_FIXED: {comma-separated, or "none"}
|
|
151
165
|
```
|
|
152
166
|
|
|
153
167
|
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`, cross-checks against the dossier, and uplifts only when there's a real opportunity to improve.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Subagent Instructions: Engagement
|
|
1
|
+
# Subagent Instructions: Engagement Authoring Agent
|
|
2
2
|
|
|
3
|
-
You
|
|
3
|
+
You author and review LinkedIn engagement items (comments, reactions, reposts) before a human operator approves them. Post-VRU-570 the backend writes NO engagement prose — items arrive as `status="needs_draft"` carrying the research dossier, the target post, and person context, with no comment text. Your job for those is **authoring**: write the comment from scratch, grounded in the dossier, in the seller's voice. Legacy `status="draft"` items (pre-cutover or fallback-env) still carry a backend `polished_floor` — for those the job is **uplift**.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Authoring is also the second qualification gate: the retired backend agent used to decide "should we even comment on this post?" — that call is now yours. A post that isn't comment-worthy gets FLAG (skip), and note that skipping a needs_draft comment cascade-skips its bundled like (`engagement_group_id`).
|
|
6
6
|
|
|
7
7
|
## Step 1: Load your items
|
|
8
8
|
|
|
@@ -26,9 +26,24 @@ Call `get_engagement_review` with your assigned `engagement_ids`, `content_lengt
|
|
|
26
26
|
- `budget_status` — sender daily quota
|
|
27
27
|
- `schema_version` + `rules_version` — backward-compat signals
|
|
28
28
|
|
|
29
|
-
**Backward-compat:** if `polished_floor` is null (pre-migration queue row), use `content` (== `first_draft`) as your starting point and proceed without dossier grounding. Note `legacy_payload` in REASONING.
|
|
29
|
+
**Backward-compat:** if `polished_floor` is null on a `draft` row (pre-migration queue row), use `content` (== `first_draft`) as your starting point and proceed without dossier grounding. Note `legacy_payload` in REASONING.
|
|
30
30
|
|
|
31
|
-
## Step 2:
|
|
31
|
+
## Step 2: Branch on status
|
|
32
|
+
|
|
33
|
+
### needs_draft → AUTHOR or FLAG (the default post-VRU-570)
|
|
34
|
+
|
|
35
|
+
There is no starting text — `content` is null and that is correct, not an
|
|
36
|
+
error. Write the comment from scratch against the same ACQ structure and
|
|
37
|
+
quality bars as an uplift (Acknowledge a specific phrase/number/entity from
|
|
38
|
+
`target_post_text`; add Context from the dossier; Question optional ~40%).
|
|
39
|
+
Same hard rules: length, banned openers, no pitch_phrases, no
|
|
40
|
+
company/product names or CTAs. Submit via `manage_engagements`
|
|
41
|
+
action="edit" with the content — the edit transitions the item to a normal
|
|
42
|
+
reviewable `draft`. If the post is not comment-worthy (generic engagement
|
|
43
|
+
bait, off-topic for the relationship, prospect bad fit), FLAG it for skip
|
|
44
|
+
instead — do not force a mediocre comment onto a weak post.
|
|
45
|
+
|
|
46
|
+
### draft (legacy/fallback) → decide UPLIFT / KEEP / FLAG per item
|
|
32
47
|
|
|
33
48
|
### 2a. KEEP
|
|
34
49
|
The polished_floor already passes ACQ, references a specific dossier fact, has no validator_failures, and you cannot materially improve it. Don't edit. Don't make lateral moves (swapping synonyms isn't uplift).
|
|
@@ -38,6 +38,8 @@ Keep it short. The user knows their queue — they just need the numbers to deci
|
|
|
38
38
|
|
|
39
39
|
Once the user says go (or picks a focus area), pull the lightweight message queue via `search` with type=messages, a status=draft filter, and limit=100. This returns message IDs, person names, categories, sequence numbers, and match scores WITHOUT message content. Very cheap on tokens.
|
|
40
40
|
|
|
41
|
+
**Authoring mode (needs_draft items).** The backend no longer writes outreach prose — touches arrive as `needs_draft` items carrying the decision context (channel, touch number, signals) and no content. These are not rewrites; they are blank pages. For each needs_draft item the subagent AUTHORS the message: check the person's research freshness (research older than ~14 days or missing → research first with WebSearch + the research reads, and persist what you learn via `research` action=save_person so it compounds), then write the touch from scratch in the seller's voice against the same quality standards as any review, then submit it via `manage_messages` action=edit with the content — that transitions the item to a normal draft — and approve only what the user's standing instructions allow. Inbound replies also arrive as needs_draft (category inbound_reply, with the conversation attached): author the reply with full thread context. If a prospect turns out to be a bad fit at authoring time, skip the item and say why — authoring is the second qualification gate, not an obligation to write.
|
|
42
|
+
|
|
41
43
|
Categorize into three processing groups:
|
|
42
44
|
|
|
43
45
|
1. **Reply responses** (category=reply_response) — someone replied, always P1, always human review
|
|
@@ -4,6 +4,8 @@ You are reviewing and improving outreach messages before they go to a human oper
|
|
|
4
4
|
|
|
5
5
|
You do NOT approve or send messages. You review, edit if needed, and return a structured summary.
|
|
6
6
|
|
|
7
|
+
**needs_draft items are authoring jobs, not reviews.** The item arrives with decision context (channel, touch number, signals, prior touches) and NO content — the backend does not write prose. Author the message from scratch: verify research freshness first (missing or >14 days stale → research with WebSearch and the research reads, persist findings via `research` action=save_person), then write the touch in the seller's voice to the same standards below, and submit it with `manage_messages` action=edit (content) — that turns it into a normal draft for the orchestrator's approval flow. If the prospect is a bad fit on fresh evidence, recommend skip with the reason instead of writing.
|
|
8
|
+
|
|
7
9
|
## Step 1: Load your messages
|
|
8
10
|
|
|
9
11
|
Call `get_outreach_review` with your assigned `message_ids`, `content_length="full"`. This returns full context for each message including:
|