@vruum/skills 0.6.65 → 0.6.66

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vruum",
3
- "version": "0.6.65",
3
+ "version": "0.6.66",
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.65",
3
+ "version": "0.6.66",
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.65",
3
+ "version": "0.6.66",
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": {
@@ -41,5 +41,5 @@
41
41
  "outreach",
42
42
  "gtm"
43
43
  ],
44
- "contentHash": "2745915e4740ad55ecc2031ddce87480ae596a0cf4b64f57303226c09c9cd1a6"
44
+ "contentHash": "de2c5ed6fe1316e89f8c0e088b99d1c45b56714fcb38ede708ea06febd9195e8"
45
45
  }
@@ -25,7 +25,7 @@ Ask what cohort they want to reach if they haven't said. Criteria can combine:
25
25
 
26
26
  If they reference attributes you haven't seen, call `search` with `type="people"` and `limit=1` first and inspect a row's `custom_fields` keys so you offer real attribute names, not guesses.
27
27
 
28
- If personas matter to their criteria and contacts are unclassified (`filters={persona: "unclassified"}` returns many), offer to run `research` with action=classify_personas first (payload `{}` classifies every unclassified contact; large runs return a job id — poll with `fetch` type=job until completed, then continue).
28
+ If personas matter to their criteria and contacts are unclassified (`filters={persona: "unclassified"}` returns many), offer to classify them first. Vruum has no backend persona classifier: read each unclassified contact (`get_person_360`), decide the buying-center role, and write it with `manage_person` action=set_persona id=<person uuid> payload={persona, reasoning} (an `id` array applies one persona to several people). Then continue.
29
29
 
30
30
  ## Step 2: Preview the cohort
31
31
 
@@ -86,7 +86,7 @@ Categorize into three processing groups:
86
86
  2. **Follow-ups** (first_content_touch=false; fallback when null: sequence_number >= 2) — need research and quality check
87
87
  3. **Openers** (first_content_touch=true; fallback when null: sequence_number = 1) — first real message regardless of T-number; full opener research standards, never "follow-up" framing
88
88
 
89
- **Cold drafts to people who already replied (VRU-894).** An opener or follow-up item that carries `prior_reply` is a re-pitch to someone who wrote back. Never bulk-approve it. Show the user the reply excerpt and intent, and hold the draft unless they explicitly want the cold sequence to continue. Never call `manage_outreach` action=resume to release a stuck reply: replies send without the plan, and resume re-arms the cold sequence. A resume of a reply-paused plan returns 409 `plan_paused_by_reply` with the pending cold messages it would release; pass `payload: {continue_sequence: true}` only on the user's explicit decision. To end outreach to that person, use action=stop.
89
+ **Cold drafts to people who already replied (VRU-894).** An opener or follow-up item that carries `prior_reply` is a re-pitch to someone who wrote back. Never bulk-approve it. Show the user the reply excerpt and intent, and hold the draft unless they explicitly want the cold sequence to continue. Never call `manage_outreach` action=resume to release a stuck reply: replies send without the plan, and resume re-arms the cold sequence. A resume of a reply-paused plan returns 409 `plan_paused_by_reply` with the pending cold messages it would release; pass `payload: {continue_sequence: true}` only on the user's explicit decision. To end outreach to that person, reject the held cold draft with `manage_messages` action=reject and leave the plan paused: a reply pause is permanent and person-wide, so no cold touch sends unless someone resumes it.
90
90
 
91
91
  **Template-authored drafts (VRU-813).** A draft with `ai_decision_context.authored_by = "template"` is the OPERATOR'S OWN template rendered per person (deterministic `{{variable}}` substitution, `generated_by_ai=false`) — it arrives in the review lane already written. Review it for FIT (right person, correct variable values, thread coherence), not style: do NOT rewrite the operator's chosen wording per-row. If the prose itself is weak, that's a template-level problem — flag it once to the user so they fix the template in the objective workbench (or via `manage_outreach` action=objective_update), rather than editing N copies divergently. Conversely, a `needs_draft` row carrying `ai_decision_context.template_fallback_reason` is a person the template could NOT render for (missing variable value, or the channel fell back outside the template's step) — author it normally, and if many rows share one reason, surface the pattern (e.g. "31 people have no title on file") instead of silently hand-writing around a fixable data gap.
92
92
 
@@ -18,7 +18,7 @@ Call `get_outreach_review` with your assigned `message_ids`, `content_length="fu
18
18
  - Campaign selling strategy and touch sequence
19
19
  - Match analysis with alignment points and recommended approach
20
20
  - Company research summary
21
- - Recent LinkedIn posts from the prospect
21
+ - Recent LinkedIn posts from the prospect (`recent_linkedin_posts`, newest first; a post with `is_repost: true` is someone else's post they shared and carries only its date) and `linkedin_activity` (`active` = posted in the last 90 days, `quiet` = no posts in the 90 days as of `checked_at`, `unknown` = not read, or read with an undated or unattributed item that may be recent)
22
22
  - Full conversation thread (all prior messages)
23
23
  - Outreach plan status
24
24
 
@@ -80,7 +80,7 @@ If a message needs better personalization or you need to verify something, you h
80
80
 
81
81
  - **Knowledge base** (`search` with type=kb): Search the company's uploaded sales docs — positioning, case studies, battlecards, objection handling, process docs. Browse with no extra filters first to see what's available, then narrow with the `doc_type` or `query` filters. Use the `document_id` or `include_content: true` filters to read full content. This is your FIRST stop for company-specific messaging guidance, proof points, and competitive positioning.
82
82
  - **Web search**: Search for recent news about the prospect's company, their recent activity, industry trends relevant to them
83
- - **LinkedIn data** (`research` with action=linkedin_fetch): Pull the prospect's recent posts if not already in the review data
83
+ - **LinkedIn data** (`research` with action=linkedin_fetch): Pull the prospect's recent posts only when `linkedin_activity.status` is `unknown` (Vruum reads posts before first touches, so `quiet` is already checked). Save what you fetch with `research` action=save_person: `recent_posts` plus `sources_by_field.recent_posts` (the profile URL and when you read it), keeping only posts the prospect wrote or reposted — never another person's post (VRU-723)
84
84
  - **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.
85
85
  - **Company research** (`fetch` with type=company_research; `research` with action=enrich_company): Get deeper company context if the match analysis feels thin
86
86
 
@@ -88,7 +88,7 @@ Use these tools when:
88
88
  - The draft's personalization is surface-level and you can find something better
89
89
  - The match analysis mentions a trigger event you want to verify is current
90
90
  - You're rewriting a message and need a real, specific hook
91
- - The prospect's LinkedIn posts field is null and you want to find recent activity
91
+ - The prospect's `linkedin_activity.status` is `unknown` and you want to find recent activity
92
92
  - You need proof points, case studies, or competitive positioning for the message (check knowledge base)
93
93
 
94
94
  Do NOT use these tools for every message. Only when the draft needs improvement and the existing context isn't enough.
@@ -77,7 +77,7 @@ Important boundaries: outreach/reply/content/comment prose is authored in the ha
77
77
  | Closed-won customers with no follow-on motion | `/expansion-fill` |
78
78
  | Recoverable lost/churned relationships | `/winback-fill` |
79
79
  | Offer/ICP is unclear or sellability is questionable | profile auto-fill first; `/positioning-diagnostic` only for the narrower cold-outreach go/no-go |
80
- | Unclassified personas blocking targeting | `research` action=classify_personas, then `/objective-builder` |
80
+ | Unclassified personas blocking targeting | classify each contact in the harness and write it with `manage_person` action=set_persona, then `/objective-builder` |
81
81
  | Everything humming | `fetch` type=insights subtype=improve — review what the system learned this week |
82
82
 
83
83
  If several fire, pick the one with the highest expected revenue impact per unit of seller attention. Replies and active deals usually outrank new activity; expansion can outrank cold acquisition when the evidence is strong. Say why in one sentence. Mention the runner-up only if the user asks.