@sellable/mcp 0.1.336 → 0.1.338

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,72 +1,33 @@
1
1
  ---
2
2
  name: fill-send-horizon
3
- description: Keep campaigns' send queues full for the next N days — enrich, score, and prepare messages for eligible rows so approved sends are always staged ahead. Schedule-automation friendly ("fill send horizon for these users/campaigns"). Never launches campaigns, never spends paid InMail.
3
+ description: Compatibility alias for refill-sends. Fill horizon requests load the skill-led refill workflow; fill_campaign_horizon remains evergreen-only lower-level execution.
4
4
  visibility: internal
5
+ allowed-tools:
6
+ - mcp__sellable__get_subskill_prompt
7
+ - mcp__sellable__resolve_campaign_fill_route
8
+ - mcp__sellable__get_campaign_refill_state
9
+ - mcp__sellable__fill_campaign_horizon
5
10
  ---
6
11
 
7
12
  # Fill Send Horizon
8
13
 
9
- <role>
10
- You are a campaign operations agent keeping send queues full. Your job: for each target campaign, make sure the next two working days (or the requested horizon) have prepared, ready-to-send messages staged — without ever launching a campaign or sending anything yourself.
11
- </role>
12
-
13
- <inputs>
14
- The invoking prompt (often a scheduled automation) names the targets. Accept any of:
15
-
16
- - Campaign names or IDs ("fill send horizon for Christian Reyes - Post Engagers")
17
- - Sender names ("…for csreyes92 and thomas") — resolve via `list_senders`, then `get_campaigns` and match campaigns attached to those senders
18
- - Nothing specific ("fill send horizon") — operate on all non-archived campaign tables in the active workspace that have a sequence attached (`list_tables({ hasSequence: true })`), skipping ARCHIVED ones
19
-
20
- Optional inputs: `targetPreparedMessages` (default: leave unset for the adaptive default), an explicit "approve" instruction (see safety rules), and a **waterfall priority order** (see below).
21
- </inputs>
22
-
23
- <objective>
24
- For each target campaign:
25
-
26
- 1. `get_campaign` → confirm workspace, workflowTableId, and current stats. Skip and report any campaign whose table is ARCHIVED.
27
- 2. `start_campaign_message_preparation({ campaignId })` — this queues pending Enrich Prospect cells, lets ICP/rubric and Generate Message cascade, and marks prepared rows ready. Omit `maxRowsToCheck` and `batchSize` for the adaptive default unless the invoking prompt sets them.
28
- 3. Poll `get_campaign_message_preparation_status` until the job completes or stops. Read `progress.enrichedRows`, `preparedMessages`, and `stopReason` — never treat `checkedRows` as enriched rows.
29
- 4. If the stop reason is source exhaustion (no more eligible rows), report it as "source thin — needs new leads" and name `refresh-sender-engagement` (for post-engager lanes) or `find-leads` as the refill path. Do not invent leads.
30
- 5. Report per campaign: prepared count, approved count, what is staged for the horizon, and the single next operator action (usually "approve messages in the UI").
31
- </objective>
32
-
33
- <waterfall>
34
- ## Campaign hierarchy (waterfall order)
35
-
36
- The fill order is **stored workspace state**, not something each automation restates. Resolve it in this precedence:
37
-
38
- 1. **Stored hierarchy (default)**: call `get_campaign_waterfall` first. It returns each waterfall (per sender or shared) with slots in stored priority order — campaign offer IDs included. Fill in that order.
39
- 2. **Per-invocation override**: if the invoking prompt states an explicit order ("fill in this order: Signal Discovery, Post Engagers"), use it for this run only and say in the report that the stored order was overridden. To change the order durably, use `set_campaign_waterfall_order` — but only when the user/automation explicitly asks to change the hierarchy, never as a side effect of a fill run.
40
- 3. **No stored hierarchy** (tool returns empty — evergreen reconcile hasn't run): fall back to the conventional order `<Sender> - Post Engagers` (warmest) → `Shared Signal Discovery` → `Shared Cold Fallback` (coldest), and note that running `create-evergreen-campaigns` will materialize a stored hierarchy.
41
-
42
- Fill mechanics, whatever the source of the order:
43
-
44
- - **Fill the top lane first.** Move to the next lane ONLY when the current one stops with source exhaustion / no more eligible rows — never because it is merely slow.
45
- - **Stop descending once the horizon target is met.** If the warm lane alone fills the horizon, the cold lanes get nothing this run — that is correct, not a gap.
46
- - **Report per lane** so the operator can see the waterfall working:
14
+ This is a compatibility alias. For plain operator language such as "fill",
15
+ "refill sends", "max out sends", "load everyone up", or "fill horizon sends",
16
+ load the canonical workflow first:
47
17
 
18
+ ```text
19
+ get_subskill_prompt({ subskillName: "refill-sends-workflow" })
48
20
  ```
49
- csreyes92 waterfall (stored order): Post Engagers filled 4/4 (horizon met — lower lanes skipped)
50
- thomas waterfall (stored order): Post Engagers 1/4 (source thin) → Shared Signal Discovery 3/3 remaining
51
- ```
52
- </waterfall>
53
21
 
54
- <safety>
55
- - **Never call `start_campaign`, `start_on_demand_campaign`, or `start_direct_campaign`.** Activating a campaign is always an explicit human action outside this skill.
56
- - Use `approvalMode: "approve"` ONLY when the invoking prompt explicitly says to auto-approve (e.g. "fill and approve"). Default is `mark_ready` — a human approves in the UI.
57
- - Never use a sender from one workspace for another workspace's campaign. If `get_campaign` shows a workspace mismatch with the active workspace, stop and report.
58
- - Paid InMail: never opt a campaign into paid-InMail templates or spend credits. If a campaign's sequence already includes a paid-InMail step, note it in the report but do not alter it.
59
- - This skill prepares; the product's sweeper sends — only from ACTIVE campaigns, only approved rows, only inside sending hours. Say so in the report so the operator knows nothing went out.
60
- </safety>
22
+ Then follow the workflow:
61
23
 
62
- <output>
63
- One compact report:
24
+ 1. Call `resolve_campaign_fill_route`.
25
+ 2. Call `get_campaign_refill_state` for the exact selected target.
26
+ 3. Treat public targets as regular campaigns or evergreen campaigns only.
27
+ 4. Stop on `unsupported_campaign_type` for internal direct campaign tables.
28
+ 5. Use `fill_campaign_horizon` only after route and refill-state evidence prove
29
+ the target is an evergreen campaign.
64
30
 
65
- ```
66
- Fill Send Horizon {date}
67
- • {Campaign A}: {n} messages prepared ({m} awaiting approval) — horizon staged through {date}
68
- • {Campaign B}: source thin after {k} prepared — refill via refresh-sender-engagement
69
- Next operator action: approve {m} messages in {Campaign A}
70
- Nothing was sent or launched; campaigns remain in their current status.
71
- ```
72
- </output>
31
+ Do not start or launch campaigns. Do not raw-write scheduler fields. Do not
32
+ claim scheduled success without rereading scheduler-owned cells with non-null
33
+ `scheduledFor`.
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: refill-sends
3
+ description: Plan regular campaign and evergreen campaign send refill work through the skill-led refill workflow.
4
+ visibility: public
5
+ allowed-tools:
6
+ - mcp__sellable__get_subskill_prompt
7
+ - mcp__sellable__search_subskill_prompts
8
+ - mcp__sellable__resolve_campaign_fill_route
9
+ - mcp__sellable__get_campaign_refill_state
10
+ - mcp__sellable__fill_campaign_horizon
11
+ - mcp__sellable__get_campaign
12
+ - mcp__sellable__get_campaign_message_preparation_status
13
+ - mcp__sellable__start_campaign_message_preparation
14
+ - mcp__sellable__cancel_campaign_message_preparation
15
+ - mcp__sellable__import_leads
16
+ - mcp__sellable__wait_for_lead_list_ready
17
+ - mcp__sellable__confirm_lead_list
18
+ - mcp__sellable__search_signals
19
+ - mcp__sellable__fetch_post_engagers
20
+ - mcp__sellable__search_sales_nav
21
+ - mcp__sellable__lookup_sales_nav_filter
22
+ - mcp__sellable__search_prospeo
23
+ - mcp__sellable__search_prospeo_companies
24
+ - mcp__sellable__confirm_prospeo_company_accounts
25
+ - mcp__sellable__load_csv_linkedin_leads
26
+ - mcp__sellable__load_csv_domains
27
+ - mcp__sellable__list_dnc_entries
28
+ - mcp__sellable__load_csv_dnc_entries
29
+ - mcp__sellable__get_rows
30
+ - mcp__sellable__get_rows_minimal
31
+ - mcp__sellable__get_table_rows
32
+ ---
33
+
34
+ # Refill Sends
35
+
36
+ Use this public wrapper for plain operator requests such as "fill", "refill sends",
37
+ "max out sends", "load everyone up", or "fill horizon sends".
38
+
39
+ Load the internal workflow prompt before taking any operational step:
40
+
41
+ ```text
42
+ get_subskill_prompt({ subskillName: "refill-sends-workflow" })
43
+ ```
44
+
45
+ Then follow that workflow exactly. The default path is read-only research:
46
+ resolve the route, read target refill state, report the next safe step, and stop
47
+ before mutation unless the user has explicitly approved the exact workspace,
48
+ campaign/table/source ids, caps/dates, approval mode, expected side effects,
49
+ and stop/rollback condition.
50
+
51
+ Public concepts are regular campaign and evergreen campaign. Internal direct
52
+ campaign types are unsupported refill targets. `fill_campaign_horizon` is only a
53
+ legacy evergreen-only lower-level primitive after route and refill-state
54
+ evidence proves an evergreen target.
@@ -0,0 +1,172 @@
1
+ ---
2
+ name: refill-sends-workflow
3
+ description: Internal skill-led refill sends workflow for regular campaigns and evergreen campaigns.
4
+ visibility: internal
5
+ allowed-tools:
6
+ - mcp__sellable__resolve_campaign_fill_route
7
+ - mcp__sellable__get_campaign_refill_state
8
+ - mcp__sellable__fill_campaign_horizon
9
+ - mcp__sellable__get_campaign
10
+ - mcp__sellable__get_campaign_message_preparation_status
11
+ - mcp__sellable__start_campaign_message_preparation
12
+ - mcp__sellable__cancel_campaign_message_preparation
13
+ - mcp__sellable__import_leads
14
+ - mcp__sellable__wait_for_lead_list_ready
15
+ - mcp__sellable__confirm_lead_list
16
+ - mcp__sellable__search_signals
17
+ - mcp__sellable__fetch_post_engagers
18
+ - mcp__sellable__search_sales_nav
19
+ - mcp__sellable__lookup_sales_nav_filter
20
+ - mcp__sellable__search_prospeo
21
+ - mcp__sellable__search_prospeo_companies
22
+ - mcp__sellable__confirm_prospeo_company_accounts
23
+ - mcp__sellable__load_csv_linkedin_leads
24
+ - mcp__sellable__load_csv_domains
25
+ - mcp__sellable__list_dnc_entries
26
+ - mcp__sellable__load_csv_dnc_entries
27
+ - mcp__sellable__get_rows
28
+ - mcp__sellable__get_rows_minimal
29
+ - mcp__sellable__get_table_rows
30
+ ---
31
+
32
+ # Refill Sends Workflow
33
+
34
+ Default mode is read-only research. This workflow decides the next safe refill
35
+ step in the parent thread; backend tools remain narrow route, state, source,
36
+ prep, readiness, and evergreen primitives.
37
+
38
+ ## Entry
39
+
40
+ Plain phrases that enter here include "fill", "refill sends", "max out sends",
41
+ "load everyone up", and "fill horizon sends".
42
+
43
+ 1. Call `resolve_campaign_fill_route` first. Use `intent:"plain"` for generic
44
+ fill/load language, `intent:"active"` only when the user explicitly narrowed
45
+ to active regular campaigns, and `intent:"evergreen"` only when the user
46
+ explicitly asked for evergreen or horizon work.
47
+ 2. Pick exact ids from the resolver result. Do not use campaign names or table
48
+ names as target identifiers.
49
+ 3. Call `get_campaign_refill_state` for the selected `campaignId` or `tableId`.
50
+ This must be the next target-specific research primitive.
51
+ 4. Classify the target from refill state:
52
+ - regular campaign: campaign-backed workflow table with normal source,
53
+ sequence, senders, and send/refill stages.
54
+ - evergreen campaign: managed always-on lane with current source evidence.
55
+ - `unsupported_campaign_type`: internal direct campaign table; report the
56
+ blocker and stop without mutation.
57
+
58
+ ## Research Checklist
59
+
60
+ Use the refill-state response as the current facts receipt:
61
+
62
+ - campaign status/current step, workflow table id, table config type, and public
63
+ type;
64
+ - selected source list/provider identity, source id, target prospect gap,
65
+ cursor/inventory state, dedupe/DNC/provider exclusions, good-prospect yield,
66
+ scan/import caps, and proof;
67
+ - sender ids, healthy senders, disconnected senders, and daily capacity;
68
+ - row/stage counts: source available, rows, enriched, passed, generated,
69
+ approved, ready to schedule, scheduled;
70
+ - active message prep job;
71
+ - scheduler-owned scheduled counts by date/action from cells with non-null
72
+ `scheduledFor`;
73
+ - `freshness.stateHash` and exact campaign/table/workspace ids.
74
+
75
+ Empty or unsafe states stop with the blocker: no fillable target, missing or deleted campaign,
76
+ missing table, paused/archive campaign, zero sender capacity, zero source candidates,
77
+ zero viable rows, no approved/preparable rows, active prep job, awaiting
78
+ scheduler, or unsupported direct campaign type.
79
+
80
+ ## Regular Campaign Decision
81
+
82
+ For regular campaign workspaces, rank regular campaigns from route and
83
+ `get_campaign_refill_state` evidence. Choose the best existing refill target.
84
+ Do not create side campaigns, warm-post-engager side campaigns, on-demand campaigns,
85
+ or unrelated campaigns as the default answer to a fill request.
86
+
87
+ When the best regular campaign is source-exhausted, recommend same-campaign source-ladder replenishment.
88
+ Keep `selectedLeadListId` source identity distinct
89
+ from the campaign `workflowTableId`.
90
+
91
+ Source replenishment choices:
92
+
93
+ - existing source list reuse: append/confirm the existing source list when it
94
+ has enough eligible rows;
95
+ - CSV path: load CSV profiles/domains, then import into the same campaign/source
96
+ path;
97
+ - Sales Nav path: use Sales Nav lookup/search, then import selected prospects;
98
+ - Prospeo path: use account/person search as appropriate, then import selected
99
+ prospects;
100
+ - Signal Discovery path: search/select posts or engagers, import selected
101
+ source prospects into the same campaign/source-list path, then confirm
102
+ readiness.
103
+
104
+ Before any source mutation, show exact approval evidence: workspace id,
105
+ campaign id, workflow table id, source/provider id, source-list id when known,
106
+ import caps, target dates/caps, dedupe/DNC/provider exclusion expectations, and
107
+ expected row side effects. Then reread `get_campaign_refill_state`; if
108
+ `freshness.stateHash` or exact ids changed, stop and ask for a fresh approval.
109
+
110
+ After source import, call `wait_for_lead_list_ready` and `confirm_lead_list`
111
+ with the source-list id and campaign id. Imports append to the existing
112
+ campaign/source path; they must not reset campaign state, sequence, sender
113
+ assignment, current step, or watch state. If provider auth, rate limit, timeout,
114
+ partial import, duplicate-only import, DNC-only result, CSV parse failure,
115
+ readiness timeout, or `confirm_lead_list` failure occurs, stop before prep and
116
+ report the blocker/retry path.
117
+
118
+ ## Prep, Approval, And Scheduler Proof
119
+
120
+ Existing rows normally move through enrichment/prep/approval using
121
+ `start_campaign_message_preparation` and
122
+ `get_campaign_message_preparation_status`. Standalone Generate Message is not the normal refill action;
123
+ it is only for a manual/user-authored message path
124
+ that requires it.
125
+
126
+ Approval mode:
127
+
128
+ - default is `approvalMode:"mark_ready"`, not approve;
129
+ - use `approvalMode:"approve"` only when the user explicitly asks to approve
130
+ messages or schedule sends and has approved the exact bounded cohort;
131
+ - never launch/start a campaign from refill.
132
+
133
+ Before prep or approval mutation, reread `get_campaign_refill_state` and compare
134
+ `freshness.stateHash`, campaign id, table id, workspace id, source id, and caps.
135
+ If they changed, stop. A second concurrent refill run must see the first run's
136
+ import/prep state on reread and avoid duplicate work.
137
+
138
+ Scheduled success requires a post-action reread proving scheduler-owned cells
139
+ with non-null `scheduledFor`. Prepared, approved, and ready-to-schedule rows are
140
+ intermediate states; report them as awaiting scheduler unless scheduled cells
141
+ are present.
142
+
143
+ ## Evergreen Campaign Discipline
144
+
145
+ `fill_campaign_horizon` is a legacy evergreen-only lower-level primitive. Call it
146
+ only after `resolve_campaign_fill_route` and `get_campaign_refill_state` prove an
147
+ evergreen campaign target.
148
+
149
+ For evergreen campaigns, do not advance down the source ladder while the current source can produce enough good prospects.
150
+ The current source is exhausted, or
151
+ unable to produce enough good prospects, only when evidence includes source id,
152
+ target prospect gap, cursor/inventory state, dedupe/DNC/provider exclusions,
153
+ good-prospect yield, and scan/import caps. If that proof is missing, continue
154
+ the current source or ask for more research instead of walking the ladder.
155
+
156
+ ## Hard Safety Rules
157
+
158
+ - Never call start or launch tools.
159
+ - Never raw-write `scheduledFor`, `scheduledAt`, scheduled status, or sender
160
+ assignment fields.
161
+ - Never expose internal direct campaign types as an operator refill path.
162
+ - Never claim scheduled success without rereading scheduler-owned cells with
163
+ non-null `scheduledFor`.
164
+ - No mutation in production unless Christian explicitly approves exact
165
+ workspace, campaign/table ids, source/action ids, caps/dates, approval mode,
166
+ expected side effects, and rollback/stop condition.
167
+
168
+ ## Report
169
+
170
+ Report the selected target, target type, source state, blockers, exact next
171
+ primitive, approval required, and the freshness hash used. Say explicitly that
172
+ nothing was launched and nothing was sent.
@@ -0,0 +1,9 @@
1
+ {
2
+ "parallelMode": "wide",
3
+ "agentCount": 6,
4
+ "maxToolCallsPerAgent": 2,
5
+ "senderMaxAgents": 2,
6
+ "senderMaxToolCallsPerAgent": 3,
7
+ "progressMode": true,
8
+ "debugMode": true
9
+ }