@sellable/mcp 0.1.351 → 0.1.353

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.
@@ -6,7 +6,7 @@ async function postSetupEvergreenCampaigns(body) {
6
6
  export const setupEvergreenCampaignsToolDefinitions = [
7
7
  {
8
8
  name: "setup_evergreen_campaigns",
9
- description: "Evergreen campaign setup plan/verify command. Use plan mode first to inspect exact workspace/sender/campaign/table/source state and receive immutable lane packets. `selectedSenderIds` is a legacy shorthand for both scopes; prefer `postEngagerSenderIds` for the Post Engagers sender scope and `sharedSenderIds` for the shared lane sender scope when they differ. The command plans one Post Engagers lane per post-engager sender plus shared Signal Discovery and Shared Cold Fallback lanes for the shared sender set. yolo is only a parent-skill auto-execution hint for safe lane packets; this backend command remains read-only in plan mode and verifies receipts in verify mode. When safe-yolo needs normal setup work, the parent skill may ask for bounded delegated approval: one approval over the current planRevision, selected action ids, caps, allowed side-effect classes, and stop conditions lets lane workers execute without per-substep approval while staying inside that packet. Lane workers must execute creation, source import, create-campaign workflow steps, generate-messages, sequence attachment, and review readiness through existing create-campaign workflow/subskills, then return receipts here for verification. Customer-visible verify receipts must include createCampaignStepReceipt with setupPlanCall, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall. This command does not launch campaigns, does not schedule sends, does not assign scheduler-owned send fields, does not archive/delete cleanup targets, and does not spend paid credits.",
9
+ description: "Evergreen campaign setup plan/verify command. Use plan mode first to inspect exact workspace/sender/campaign/table/source state and receive immutable lane packets. `selectedSenderIds` is a legacy shorthand for both scopes; prefer `postEngagerSenderIds` for the Post Engagers sender scope and `sharedSenderIds` for the shared lane sender scope when they differ. The command plans one Post Engagers lane per post-engager sender plus shared Signal Discovery and Shared Cold Fallback lanes for the shared sender set. yolo is only a parent-skill auto-execution hint for safe lane packets; this backend command remains read-only in plan mode and verifies receipts in verify mode. When safe-yolo needs normal setup work, the parent skill may ask for bounded delegated approval: one approval over the current planRevision, selected action ids, caps, allowed side-effect classes, and stop conditions lets lane workers execute without per-substep approval while staying inside that packet. Lane workers must execute creation, source import, create-campaign workflow steps, generate-messages, sequence attachment, and review readiness through existing create-campaign workflow/subskills, then return receipts here for verification. Customer-visible verify receipts must include createCampaignStepReceipt with setupPlanCall, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall. messageDraftingReceipt must include validationResult:'passed', a passed qualityReview, and at least 3 concrete sampleMessages with row ids, generated message text, pass verdicts, and no issues; Shared Cold Fallback samples with a standalone name followed by 'Hey there' are rejected. This command does not launch campaigns, does not schedule sends, does not assign scheduler-owned send fields, does not archive/delete cleanup targets, and does not spend paid credits.",
10
10
  inputSchema: {
11
11
  type: "object",
12
12
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.351",
3
+ "version": "0.1.353",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -129,6 +129,13 @@ filter choice, Message Drafting, packaged `generate-messages`, sequence
129
129
  attachment, and send-review readiness. Do not rebuild those steps ad hoc in the
130
130
  parent thread.
131
131
 
132
+ For any lane with `intent:"create"`, the worker must satisfy the normal
133
+ net-new create-campaign preflight before shell creation: load
134
+ `get_subskill_prompt({ subskillName:"research-sender" })`, run the sender/team
135
+ identity research needed for the brief, call `complete_sender_research(...)`,
136
+ then call `create_campaign`. Do not bypass this with a parent-thread brief or
137
+ by directly setting campaign state.
138
+
132
139
  Workers return worker receipts. Each customer-visible lane receipt must include
133
140
  one durable `createCampaignStepReceipt` built from actual tool calls or worker receipts,
134
141
  not a parent-thread summary. The receipt must include:
@@ -138,6 +145,9 @@ not a parent-thread summary. The receipt must include:
138
145
  campaign/table binding or create intent used before work started. For a
139
146
  create lane, this receipt must explicitly include `createIntent:true`; for a
140
147
  reuse lane, do not report `createIntent:true`.
148
+ - `researchSenderReceipt`: `research-sender` prompt load proof,
149
+ `complete_sender_research` result, sender LinkedIn identity basis, and the
150
+ notes/proof counts used before the net-new `create_campaign` call.
141
151
  - `campaignBriefReceipt`: the CampaignOffer/campaign id, current
142
152
  workflowTableId, brief hash or updated-at marker, delivery format, token
143
153
  rules, hard avoids, source-use rules, and first-message template state.
@@ -172,6 +182,12 @@ review-batch row ids/hash, and either `statusSource:"branch"` or
172
182
  full packaged prompt with `get_subskill_prompt({ subskillName:"generate-messages"`
173
183
  until `hasMore:false`, loaded the required message assets, and loaded
174
184
  `create-campaign-v2-validation` before returning a `messageDraftRecommendation`.
185
+ The receipt must also include `validationResult:"passed"`, a passed
186
+ quality-review object, and at least 3 concrete reviewed sample messages with
187
+ row ids, generated message text, pass verdicts, and no issues. Shared Cold
188
+ Fallback samples must not open with a standalone name line followed by
189
+ "Hey there" or another generic greeting; that pattern means the lane did not
190
+ finish the create-campaign message workflow to customer quality.
175
191
  The generated-message cells are not prompt proof: `currentRevisionGeneratedMessages`,
176
192
  Generate Message column counts, `messagesCount`, or rendered row previews prove
177
193
  only that table cells exist from the current brief/template, not that the
@@ -191,9 +207,14 @@ Parent-thread handwritten copy or setting `currentStep` is not proof.
191
207
 
192
208
  <objective>
193
209
  1. **Inventory first**: `get_campaigns` + `list_tables` + `get_campaign_waterfall` in the active workspace. Treat `list_tables` and the managed waterfall as authoritative for older managed slots; `get_campaigns` is a recent campaign page and may miss canonical evergreen lanes. Match existing campaigns/tables/waterfall slots to the plan by name (case-insensitive, ignore suffixes like "(Copy)") and stored slot identity. `list_tables.campaignStatus` and `list_tables.dashboardBucket` are part of the identity check: a matching `ARCHIVED` table/campaign is not a plain `REUSE`. If it is the canonical prod slot and the invocation explicitly allows dashboard visibility repair, repair it to `PAUSED`; otherwise mark it `flagged`/`blocked` and do not create a duplicate. A matching non-archived campaign/table/waterfall slot = REUSE; record it and move on. Never create a second campaign for a slot that already has one in any of those inventories.
194
- 2. **Create only the missing slots** with `create_on_demand_campaign({ name, senderIds, campaignBrief })`:
210
+ 2. **Create only the missing slots** through the full `$sellable:create-campaign`
211
+ workflow path for each lane, using the lane packet as the setup basis:
195
212
  - Post Engagers lanes: that sender's ID only. Shared lanes: all the senders' IDs.
196
- - The brief must include the warm post-engager first-message template style — short, casual, references the post they engaged with, closed question, **no internal vocabulary, no pitch, no meeting ask** in message one:
213
+ - The brief and message direction are lane-specific. Never reuse the Post
214
+ Engagers opening for Shared Cold Fallback.
215
+ - **Post Engagers** first-message style: short, casual, references the
216
+ sender-authored post they engaged with, closed question, **no internal
217
+ vocabulary, no pitch, no meeting ask** in message one:
197
218
 
198
219
  ```
199
220
  {{first_name}}
@@ -203,6 +224,25 @@ Parent-thread handwritten copy or setting `currentStep` is not proof.
203
224
  Saw you pop up on my post about {{post_topic_line}}
204
225
  ```
205
226
 
227
+ - **Shared Signal Discovery** first-message style: short, casual, references
228
+ the real observed signal/theme or public conversation. It may mention the
229
+ engagement source only when the source evidence supports it. Do not say
230
+ "my post" unless the selected source post was actually authored by the
231
+ sending sender.
232
+ - **Shared Cold Fallback** first-message style: cold, direct, and cohesive.
233
+ It must not pretend there was engagement, must not say "saw you pop up",
234
+ and must not use a standalone name line followed by "Hey there" or other
235
+ generic greeting. It should open with a light role/company/problem
236
+ observation and ask one clear problem question. This is a single-message
237
+ cold path unless the approved create-campaign message workflow proves a
238
+ better delivery format.
239
+ - Every customer-visible lane must run Message Drafting from the current
240
+ campaign/table basis after source rows exist. The worker must load the full
241
+ packaged `generate-messages` prompt, every required asset, and
242
+ `create-campaign-v2-validation`; the returned receipt must include at
243
+ least 3 concrete reviewed sample messages, a passed validation result, and
244
+ a passed quality review. Row/message counts alone are not enough.
245
+
206
246
  - **The brief must declare the delivery format** so Generate Message writes copy suited to how it actually sends:
207
247
  - DM lanes: add a `Delivery format:` line — either `multiline (each paragraph sends as its own DM message)` or `single message`. When multiline, the template's blank-line paragraphs ARE the message boundaries — write each one as a standalone typed message.
208
248
  - **InMail lanes can never be multiline**: an InMail is one message and the recipient must reply before anything else can be sent. InMail-bound templates must read as one cohesive message — declare `Delivery format: single message (InMail — no follow-up until reply)` and never structure the copy to depend on multi-message pacing.
@@ -235,7 +275,11 @@ Parent-thread handwritten copy or setting `currentStep` is not proof.
235
275
  `workerDetails.messageDraftBuilder` with `statusSource:"branch"` or an
236
276
  inline `statusSource:"parent-thread-fallback"` receipt. The generated-message
237
277
  cells are not prompt proof; `currentRevisionGeneratedMessages` and row
238
- previews are only downstream cell evidence.
278
+ previews are only downstream cell evidence. The proof must include
279
+ `validationResult:"passed"`, a passed quality review, and at least 3
280
+ reviewed sample messages. For Shared Cold Fallback, reject samples that
281
+ open with a standalone name followed by "Hey there" or a similarly generic
282
+ greeting.
239
283
  - The first review batch exists and at least 3 review rows have generated
240
284
  messages from the approved brief. If fewer than 3 usable rows exist, report
241
285
  the actual count and why.