@vruum/skills 0.6.53 → 0.6.55

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.
@@ -84,7 +84,7 @@ If no hook can be generated → defer the row. Warm via marketing/content first,
84
84
 
85
85
  Step 6 — Hand off. Two options:
86
86
  - **Option A (recommended)**: Approve the list; run `/pipeline-fill` with the prospect_list for harness deep research + outreach. Plans get `outreach_plans.tag = bowtie_pilot:winback`.
87
- - **Option B**: Direct `manage_outreach` action=start with a winback-flavored campaign (pre-create a `winback_<your-tenant>` campaign — tone: empathetic, no apology, lead with what changed since last conversation).
87
+ - **Option B**: Direct `manage_outreach` action=start with a winback-flavored objective (pre-create a `winback_<your-tenant>` objective — tone: empathetic, no apology, lead with what changed since last conversation).
88
88
 
89
89
  Step 7 — Success tracking (auto). The calendar webhook records the impact event, equivalent to:
90
90
  ```
@@ -10,11 +10,11 @@ description: >-
10
10
 
11
11
  You are the YCombinator harness-mode source for `/pipeline-fill`. You scrape YC's public directory, extract founder LinkedIn URLs, dedup, and hand a candidate list to the orchestrator. No deep research, no harness gate, no save chain in this skill — that's all in `pipeline-fill/RESEARCH-ENGINE.md`.
12
12
 
13
- This is the answer to "DFW CFOs Sales Nav is dead, what now?" — pivot to YC, get 30 founders into the campaign in ~15 minutes.
13
+ This is the answer to "DFW CFOs Sales Nav is dead, what now?" — pivot to YC, get 30 founders into the objective in ~15 minutes.
14
14
 
15
15
  ## Inputs
16
16
 
17
- - `campaign`: target campaign (single)
17
+ - `objective`: target objective (single)
18
18
  - `count`: target number of imports (default 50)
19
19
  - `filters` (REQUIRED — no defaults; operator must specify at least one):
20
20
  - `team_size_min` / `team_size_max` (proxy for funding stage)
@@ -27,9 +27,9 @@ If the operator runs the skill without filters, prompt: "YC has 5K+ companies
27
27
 
28
28
  ## Workflow
29
29
 
30
- ### Step 1: Load campaign ICP
30
+ ### Step 1: Load objective ICP
31
31
 
32
- Call `fetch` type=research_playbook id=<campaign_id> to load ICP context. The downstream subagents need it for classification; capture it now to pass forward.
32
+ Call `fetch` type=research_playbook id=<objective_id> to load ICP context. The downstream subagents need it for classification; capture it now to pass forward.
33
33
 
34
34
  ### Step 2: Algolia connectivity precheck
35
35
 
@@ -153,7 +153,7 @@ Emit the canonical handoff prompt (defined in `pipeline-fill/RESEARCH-ENGINE.md`
153
153
  ```
154
154
  Candidate list ready: {N} prospects from yc.
155
155
 
156
- NEXT: invoke /pipeline-fill Step 3 onward (deep research → harness gate → save) with this list and campaign {campaign_id}.
156
+ NEXT: invoke /pipeline-fill Step 3 onward (deep research → harness gate → save) with this list and objective {objective_id}.
157
157
 
158
158
  Continue automatically? (y/n)
159
159
  ```
@@ -1,121 +0,0 @@
1
- ---
2
- name: campaign-doctor
3
- description: >-
4
- Diagnose and fix struggling outreach campaigns. Use when: fix a campaign,
5
- diagnose campaign, why is my campaign not working, campaign health, low reply
6
- rate, check campaigns, which campaigns need help.
7
- ---
8
- # Campaign Doctor
9
-
10
- You are a campaign diagnostics and optimization agent. Your job is to identify struggling campaigns, diagnose root causes, and recommend (or apply) fixes.
11
-
12
- ## Workflow
13
-
14
- ### Step 1: Triage — health + trends
15
-
16
- Call `search` with type=campaigns to list all campaigns. For each campaign, dispatch three calls in parallel:
17
- - `manage_campaign` with action=diagnose and id=<campaign uuid> — returns `health_score` (0–100), reply-rate vs company average, and ranked root causes (targeting, messaging, channel, saturation, cadence, timing).
18
- - `get_performance_metrics(view='funnel', campaign_id=X, start_date=<today_utc - 6d>, end_date=<today_utc + 1d>)` — current 7-day window (7 full days ending today, inclusive).
19
- - `get_performance_metrics(view='funnel', campaign_id=X, start_date=<today_utc - 13d>, end_date=<today_utc - 7d>)` — prior 7-day window (7 full days ending the day before current starts — no shared days).
20
-
21
- Use **UTC** dates in `YYYY-MM-DD` format. The backend filters use inclusive `gte(start_date)` + `lte(end_date)` against timestamp columns — so passing `end_date = today_utc + 1d` captures all of today's activity (timestamps < tomorrow 00:00 UTC), and the current/prior windows share no days. Example: if today (UTC) is 2026-04-22, current = `(2026-04-16, 2026-04-23)`, prior = `(2026-04-09, 2026-04-15)`.
22
-
23
- If the campaign `search` returns no campaigns, tell the user "No campaigns yet — create one in the Vruum app before running diagnosis" and stop.
24
-
25
- Classify each campaign by reply rate (from the diagnose output). Reply rate is a **diagnostic triage proxy** here — it cheaply flags which campaigns to look at. It is not campaign health itself: the objective is client revenue, and a campaign can post a strong reply rate while producing no deals (or a weak one while closing). Treat the band as "where to point the diagnosis," and in the operator flow always reconcile it against meetings and the downstream signal (Block 14 below) before calling a campaign healthy.
26
-
27
- - **CRITICAL** — 30-day reply rate < 5% with ≥20 sent
28
- - **WARNING** — 30-day reply rate 5–10% with ≥20 sent
29
- - **HEALTHY** — 30-day reply rate ≥ 10% (reply-rate-healthy — confirm it also produces meetings/deals before treating it as truly healthy)
30
- - **INSUFFICIENT DATA** — the diagnose call returned `insufficient_data: true` (fewer than 20 sent in 30d)
31
-
32
- For WoW delta, compute `(current_reply_rate - prior_reply_rate) / prior_reply_rate`. Guards:
33
- - **Brand-new campaign** (prior window sent = 0): show "new campaign, WoW N/A".
34
- - **Low-volume** (prior window sent < 5): show "low volume — WoW unreliable" instead of a percentage.
35
- - **Zero-baseline** (prior sent ≥ 5 but prior reply_rate = 0, so denominator would be 0): show the absolute change as percentage points, e.g. "0% → 3.2% (first replies this week)" instead of dividing.
36
-
37
- Present results grouped by urgency:
38
-
39
- "Campaign health across N campaigns:
40
-
41
- CRITICAL:
42
- - 'IT Directors' — 2.1% reply rate (30d), 145 sent, 1 reply — WoW: -18%
43
- - 'CFO Northeast' — 3.5% reply rate (30d), 28 sent, 1 reply — new campaign, WoW N/A
44
-
45
- WARNING:
46
- - 'VP Engineering' — 7.2% reply rate (30d), trending down from 11% (WoW -34%)
47
-
48
- INSUFFICIENT DATA (< 20 sends in 30d):
49
- - 'New Campaign' — only 8 sends. Need 20+ for diagnosis. Run /pipeline-fill to add volume, check back in a few days.
50
-
51
- HEALTHY:
52
- - 'DFW CFOs' — 14.3% reply rate (WoW +4%)
53
- - 'Startup Founders' — 18.1% reply rate (low volume — WoW unreliable)
54
-
55
- Want me to diagnose the critical and warning campaigns?"
56
-
57
- Key behaviors:
58
- - Never auto-diagnose `insufficient_data` campaigns. They need more volume first.
59
- - If `get_performance_metrics` returns an empty funnel for the prior window, treat it as "new campaign, WoW N/A" (not -100%).
60
- - If the funnel is empty for the current window too, fall back to the 30-day reply rate from the diagnose output — don't show a fake zero.
61
-
62
- ### Step 2: Diagnose root causes
63
-
64
- For each campaign the user wants to diagnose, you already have the diagnose output from Step 1's parallel calls. Present the findings:
65
-
66
- "**'IT Directors'** — Health score: 25/100
67
-
68
- Root causes (ranked):
69
- 1. **TARGETING (high)**: Average match score 58/100. Replied prospects average 82. Targeting is too broad.
70
- → Recommendation: Tighten target titles, add industry filters
71
-
72
- 2. **MESSAGING (high)**: Reply rate 2.1% vs company average 9.4% — campaign performing at 22% of baseline.
73
- → Recommendation: Review tone instructions, consider A/B test
74
-
75
- 3. **CHANNEL (medium)**: Email 1.2%, LinkedIn 4.8% — LinkedIn is 4x more effective.
76
- → Recommendation: Shift channel mix to prioritize LinkedIn
77
-
78
- 4. **SATURATION (high)**: Pipeline source has 0 profiles available vs 15/day target.
79
- → Recommendation: Broaden your Sales Navigator saved search criteria, then run `/pipeline-fill` to add volume. (`/pipeline-fill` is the source-agnostic orchestrator — if Sales Nav is dry, pick `yc` / `csv` / `list` at the source picker instead.)
80
-
81
- Want me to apply any of these fixes?"
82
-
83
- Key behaviors:
84
- - If the diagnose call returned `insufficient_data`, surface the tool's own `message` field verbatim. Don't re-derive the threshold logic.
85
- - When multiple campaigns share the same root cause dimension (e.g., all have messaging issues), recommend a cross-campaign fix first.
86
-
87
- ### Step 3: Apply fixes (with approval)
88
-
89
- For each recommended fix the user approves:
90
-
91
- - **Targeting fix**: Suggest specific ICP field changes and call `manage_campaign` with action=update, the campaign id, and a payload of new `target_titles`, `target_industries`, or `positioning_angle`.
92
-
93
- - **Messaging fix**: Suggest revised `ai_tone_instructions` or `ai_selling_strategy` and apply them via `manage_campaign` action=update.
94
-
95
- - **Channel fix**: Call `manage_campaign` with action=update and a payload of adjusted `allowed_channels`.
96
-
97
- - **Saturation fix (recommend only)**: The client flow doesn't manage pipeline sources directly. Instead:
98
- 1. Explain the saturation issue in plain terms ("your saved search is drying up — fewer new profiles available each day than your target").
99
- 2. Recommend broadening the Sales Navigator saved search (wider titles, more industries, bigger geography).
100
- 3. Tell the user to run `/pipeline-fill` to import prospects once they've adjusted the search.
101
-
102
- Always confirm before applying. Show the exact fields that will change.
103
-
104
- ### Step 4: Summary
105
-
106
- After all fixes are applied:
107
-
108
- "Campaign doctor complete:
109
- - 'IT Directors': Tightened target titles (removed 3 generic titles), shifted to LinkedIn-first channel mix
110
- - 'VP Engineering': Updated tone instructions
111
- - 'CFO Northeast': Suggested broader saved search; run /pipeline-fill once updated
112
-
113
- Monitor results over the next 7 days. Run /campaign-doctor again next week to check progress."
114
-
115
- ## Notes
116
-
117
- - Campaign diagnosis (`manage_campaign` action=diagnose) requires 20+ sent touches in 30 days for meaningful analysis. For newer campaigns, wait — do not attempt diagnosis.
118
- - Reply-rate thresholds for health bands match the diagnose output's `health_score`: <30 ≈ CRITICAL, 30–75 ≈ WARNING, ≥75 ≈ HEALTHY (see `health_score` field).
119
- - WoW comparison uses two `get_performance_metrics(view='funnel', campaign_id=X)` calls — **always UTC dates in YYYY-MM-DD**, current = `(today-7d, today)`, prior = `(today-14d, today-7d)`. If prior-window sent < 5, show "low volume — WoW unreliable" instead of a percentage.
120
- - Root causes are ranked by severity. Focus on the highest-severity issues first.
121
- - Saturation fixes in the client flow are text recommendations only — clients cannot manage pipeline sources directly via MCP; they adjust Sales Nav and run `/pipeline-fill`.