@sellable/mcp 0.1.206 → 0.1.208

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.
@@ -21,34 +21,26 @@ validate-sample tool:
21
21
  get_subskill_prompt({ subskillName: "create-campaign-v2-tail" })
22
22
  ```
23
23
 
24
- CampaignOffer state and the watch link are canonical. Resume, gating, and handoff
25
- read campaign state first: `campaignId`, `watchUrl`, `campaignBrief`,
26
- `currentStep`, source/search association, `selectedLeadListId`,
27
- `workflowTableId`, `leadScoringRubrics`, `approvedMessageTemplate`,
28
- `senderIds`, `sequenceTemplate`, and running state. Local draft files are
29
- debug-only; do not create, link, or surface them in normal runs.
24
+ CampaignOffer state and the watch link are canonical. Resume, gating, and
25
+ handoff read campaign state first: `campaignId`, `watchUrl`, `campaignBrief`,
26
+ `currentStep`, source/search IDs, `selectedLeadListId`, `workflowTableId`,
27
+ `leadScoringRubrics`, `approvedMessageTemplate`, `senderIds`,
28
+ `sequenceTemplate`, and running state. Local draft files are debug-only.
30
29
 
31
30
  ## Normal Flow
32
31
 
33
- There is no normal approval-packet.
34
- Legacy commit-gate/atomic-mint is only in create-campaign-v2-validation.
35
-
36
32
  1. Bootstrap and tell the user the active Sellable workspace.
37
33
  2. Resolve the client/company before strategy questions.
38
34
  3. Research the client/company and current offer enough to draft a concrete brief.
39
35
  4. Create the watchable campaign shell with `create_campaign` and the v1 brief.
40
36
  5. Surface the direct watch link once before brief approval.
41
37
  6. Approve the Find Buyers Plan, then approve Start Import.
42
- 7. Materialize the approved source list and confirm 15 campaign-table rows for
43
- filter/message setup; do not present that as source sampling.
38
+ 7. Materialize the source list and confirm 15 campaign-table rows for setup.
44
39
  8. Ask whether to use filters or skip them.
45
- 9. Persist lead rubrics when filters are enabled, then ask approval while the
46
- app remains on Filter Rules.
47
- 10. Move to Filter Leads only after saved filters are approved.
48
- 11. Review and approve/revise the message template.
49
- 12. Sync the approved template into the brief, then queue bounded filtering.
50
- 13. After one row passes with a generated message, review it, then hand off to
51
- Settings, sender, sequence, and launch.
40
+ 9. Persist rubrics, approve saved criteria, then move to Filter Leads.
41
+ 10. Review and approve/revise the message template.
42
+ 11. Sync the approved template into the brief, then queue bounded filtering.
43
+ 12. After one generated pass, review it, then hand off to Settings and launch.
52
44
 
53
45
  ## Identity-First Campaign Setup
54
46
 
@@ -68,12 +60,10 @@ messages, and wait for final launch approval.
68
60
  What's your LinkedIn profile URL or handle?
69
61
  ```
70
62
 
71
- Require a LinkedIn profile URL or handle before setup continues. Normalize
72
- `csreyes92`, `@csreyes92`, or `/in/csreyes92` to
73
- `https://www.linkedin.com/in/{handle}/`; otherwise ask again. Retain it as
74
- `senderLinkedinUrl` or resolve `clientProspectId` for `create_campaign`. Run one
75
- lightweight profile lookup before strategy questions, then invite
76
- corrections.
63
+ Require a LinkedIn profile URL/handle before setup continues. Normalize
64
+ handles like `@csreyes92` to `https://www.linkedin.com/in/{handle}/`; otherwise
65
+ ask again. Retain it as `senderLinkedinUrl` or resolve `clientProspectId` for
66
+ `create_campaign`. Run one lightweight profile lookup before strategy questions.
77
67
 
78
68
  Restore the full setup intake before the brief. Ask bounded choices for:
79
69
 
@@ -84,22 +74,21 @@ Restore the full setup intake before the brief. Ask bounded choices for:
84
74
  - prospect source: "How should we find prospects?" with "Find prospects for me",
85
75
  "Use a CSV of LinkedIn profiles", and "Use a CSV of company domains"
86
76
 
87
- If setup choices were supplied and questions skipped, show before the brief:
88
- "Accepted LinkedIn input: normalized to the required LinkedIn profile URL. Offer
89
- path: supplied current offer or Sellable's researched
90
- recommendation; you can replace it with your current offer."
77
+ If setup choices were supplied and questions skipped, state before the brief
78
+ that the LinkedIn input was normalized and the offer path came from supplied or
79
+ researched direction.
91
80
 
92
- Do not call `list_senders`, infer the campaign from connected senders, or show
93
- a sender picker during setup. Sender availability belongs only
94
- to Settings after message approval and campaign setup validation.
81
+ Do not call `list_senders`, infer from connected senders, or show a sender
82
+ picker during setup. Sender availability belongs only to Settings after message
83
+ approval and campaign setup validation.
95
84
 
96
85
  Use `research-sender`, call `complete_sender_research` before shell creation,
97
86
  and carry proof gaps into the brief.
98
87
 
99
88
  ## Brief Provenance
100
89
 
101
- When rendering the first brief, do not add bracketed inline source tags to
102
- individual claims. Instead, start the brief with one short provenance line:
90
+ When rendering the first brief, do not add bracketed inline source tags. Start
91
+ with one short provenance line:
103
92
 
104
93
  ```text
105
94
  This brief is based on Sellable's research and your answers.
@@ -120,9 +109,9 @@ keep it as non-final bullets and say: "This is not the message yet; I will write
120
109
  real examples after we find and filter leads."
121
110
 
122
111
  Keep brief approval positive: no "does not approve..." list. The first brief
123
- must be visible exactly once before the approval question. If it was rendered
124
- immediately before `create_campaign`, do not render it again after the shell is
125
- created; append the one watch-link handoff, then ask approve/revise.
112
+ must be visible exactly once before approval. If rendered before
113
+ `create_campaign`, do not render it again after shell creation; append the one
114
+ watch-link handoff, then ask approve/revise.
126
115
 
127
116
  ## YOLO Mode
128
117
 
@@ -155,8 +144,8 @@ when a bounded choice needs an escape hatch.
155
144
  ## Watch Link And Narration
156
145
 
157
146
  Create the shell before lead import so the user can watch. When
158
- `create_campaign` returns `watchUrl`, print that exact value once, directly
159
- before brief approval. It must be a direct
147
+ `create_campaign` returns `watchUrl`, print that exact value once before brief
148
+ approval. It must be a direct
160
149
  `/campaign-builder/{campaignId}?mode={claude|codex}` URL with `workspaceId` and
161
150
  `token`; never derive, shorten, reconstruct, or print a bare campaign URL. If
162
151
  missing/broken, recover with `create_campaign({ campaignId })` or `get_campaign`
@@ -189,9 +178,8 @@ when not hiring-led. For hiring-by-role signals, start with Prospeo because
189
178
 
190
179
  Before any provider prompt/search/scout call, move the watched campaign to
191
180
  source selection, show `## Find Buyers Plan`, then open `request_user_input`
192
- without repeating the URL. The plan must appear before the question; never ask
193
- first or reuse that approval. This only authorizes where to look; it does not
194
- add anyone yet. Write:
181
+ without repeating the URL. The plan must appear before the question and only
182
+ authorizes where to look; it does not add anyone yet. Write:
195
183
 
196
184
  - the buyer groups or places we could check
197
185
  - the best place to start
@@ -207,28 +195,24 @@ scouting", or "not importing leads" in customer-facing copy.
207
195
  Terms: buyers=market; people to check=raw reactions/comments; prospects=likely
208
196
  after fit; leads=rows.
209
197
 
210
- Do not surface blanket heuristics. Make the recommendation campaign-specific.
211
- If LinkedIn engagement is recommended, name exact post themes in plain language.
212
- Avoid chat terms "Signal Discovery", "lead-source scouting", "source scouting",
213
- "lane", "provider", "precision/scale tradeoff", "evidence quality", "pilot
214
- volume", "workflow pain", or "ICP". If public conversations look thin, recommend
215
- Sales Nav or Prospeo in plain words once. Only the approval question shown after
216
- that visible plan, or an explicit source choice after seeing it, satisfies this
217
- gate. Do not ask a second source-plan question or call `search_signals`,
218
- `search_sales_nav`, `search_prospeo`, `fetch_post_engagers`, or provider
219
- subagents until approved.
198
+ Make the recommendation campaign-specific. If LinkedIn engagement is
199
+ recommended, name exact post themes in plain language. Avoid chat terms "Signal
200
+ Discovery", "lead-source scouting", "source scouting", "lane", "provider",
201
+ "precision/scale tradeoff", "evidence quality", "pilot volume", "workflow
202
+ pain", or "ICP". Only the approval question after that visible plan, or an
203
+ explicit post-plan source choice, satisfies this gate. Do not ask a second
204
+ source-plan question or call `search_signals`, `search_sales_nav`,
205
+ `search_prospeo`, `fetch_post_engagers`, or provider subagents until approved.
220
206
  Only then persist `leadSourceType`, `leadSourceProvider`, and provider `currentStep`.
221
207
 
222
- Call `get_source_scout_registry` before source scouting. Source scouting is
223
- sequential by default. Run `source-scout-linkedin-engagement`,
224
- `source-scout-sales-nav`, and `source-scout-prospeo-contact` in parallel only
225
- when the user explicitly requested source comparison, a prior lane failed, or
226
- the first viable lane is borderline and a cheap fallback check is needed.
227
- Use a 10% planning floor after conservative cleanup. If LinkedIn engagement
228
- falls below that floor, move to Sales Nav. If Sales Nav also falls below it,
229
- move to Prospeo. Prospeo is the terminal fallback;
230
- if it also falls below 10%, tighten the ICP/source direction instead of
231
- inventing another provider.
208
+ Source work stays inline in the parent thread in normal create-campaign runs.
209
+ Do not launch source-scout background agents. Run the approved provider probes
210
+ with MCP tools, loading only the provider prompt for the active sequential
211
+ source. Use source scouts only if the user explicitly asks for a source
212
+ comparison/debug run.
213
+ Use a 10% planning floor after cleanup. If LinkedIn engagement falls below it,
214
+ move to Sales Nav, then Prospeo. If Prospeo also falls below 10%, tighten the
215
+ ICP/source direction instead of inventing another provider.
232
216
 
233
217
  After scouting, show a second approval gate for Start Import.
234
218
  For LinkedIn engagement (`signal-discovery` internally), use plain language:
@@ -241,13 +225,11 @@ Prospeo, name the specific search/import path and source lead count. Do not call
241
225
  `import_leads` or `confirm_lead_list` until this gate is approved.
242
226
 
243
227
  For Sales Nav and Prospeo, do not ask to import only the internal 15-row
244
- campaign-table execution slice at the Start Import gate. First-page samples are
245
- source math: sampled fit, projected good-fit prospects, and whether the path
246
- clears the target. Once it clears, ask approval for a source list with
247
- `targetLeadCount` around 1,000 contacts by default. After that,
248
- `confirm_lead_list({ reviewBatchLimit: 15 })` copies
249
- confirmed source rows into the campaign table and returns the initial
250
- campaign-table execution slice row ids for filter and message setup.
228
+ campaign-table execution slice at Start Import. First-page samples are source
229
+ math. Once the path clears, ask approval for a source list with
230
+ `targetLeadCount` around 1,000 contacts by default. Then
231
+ `confirm_lead_list({ reviewBatchLimit: 15 })` copies rows into the campaign
232
+ table and returns execution-slice row ids for filter/message setup.
251
233
 
252
234
  After the user approves this Start Import gate, do not show the
253
235
  Source Recommendation again or ask another Start Import question.
@@ -265,15 +247,13 @@ For LinkedIn engagement, the Start Import approval uses `## Source
265
247
  Recommendation`, plain language, selected posts, people to check, likely
266
248
  prospects, cleanup risk, fallback, and the first 15-lead review.
267
249
 
268
- A source recommendation must show concrete evidence: source path, filters or
269
- recipe, raw volume, sample size, sampled fits as n/N plus percentage/range,
270
- estimated usable prospects, cleanup risk, runner-up, and what will happen after
271
- approval. For Sales Nav/Prospeo it must also show source export math:
272
- `rawResultCount`, `sampledFitRate`, conservative projected fit rate,
273
- `targetLeadCount` for the source list, and projected good-fit count from that
274
- export. If projected good-fit count is below target, the recommendation is to
275
- refine or broaden filters, not to run the internal campaign-table execution slice
276
- as if it were source sampling.
250
+ A source recommendation must show source path, filters/recipe, raw volume,
251
+ sample size, sampled fits as n/N plus percentage/range, estimated usable
252
+ prospects, cleanup risk, runner-up, and post-approval action. Sales
253
+ Nav/Prospeo also show `rawResultCount`, `sampledFitRate`, conservative
254
+ projected fit rate, `targetLeadCount` for the source list, and projected
255
+ good-fit count from that export. If below target, refine/broaden filters, not
256
+ run the internal campaign-table execution slice as if it were source sampling.
277
257
 
278
258
  Supplied profile CSVs, company/domain CSVs, pasted domains, and existing
279
259
  Sellable lead lists are supported, but keep provider mechanics out of the first
@@ -281,40 +261,57 @@ customer-facing source-choice labels.
281
261
 
282
262
  ## Prospect Setup Workstreams
283
263
 
284
- After `confirm_lead_list` copies a non-empty confirmed source into the campaign
285
- and records the compact review batch, ask the filter-choice question
286
- immediately. Do not call
264
+ After `confirm_lead_list` copies a non-empty source into the campaign and
265
+ records the compact review batch, ask the filter-choice question immediately.
266
+ Do not call
287
267
  `get_post_find_leads_scout_registry`, load filter/message subskill prompts, or
288
- spawn Prospect Filters / Message Drafting before that question. The only customer-facing work
289
- before the question should be a short campaign setup summary and the choice:
268
+ spawn Message Drafting before that question. The only
269
+ customer-facing work before the question should be a short setup summary and the choice:
290
270
  add filters, skip filters, or revise source. Do not include another watch link
291
271
  in this summary; the existing app view updates through campaign state.
292
272
 
293
- If the user chooses filters, load the prospect-setup registry/reference needed
294
- for filtering and start Prospect Filters. Also start Message Drafting from the
295
- same campaign/table basis once filter-choice is known. If filters are skipped,
296
- move the watched app to Messages and run Message Drafting there.
297
- Debug markdown/json artifacts are optional only.
273
+ Once filter choice is known, start only Message Drafting in the background from
274
+ the same campaign/table basis. If the user chooses filters, the parent thread
275
+ continues inline: move to Filter Rules, load the filter reference, draft/save
276
+ rubrics, and ask for filter approval while Message Drafting runs. If filters are
277
+ skipped, move the watched app to Messages and run Message Drafting there. Debug
278
+ markdown/json artifacts are optional only.
279
+
280
+ Keep the Message Drafting handoff compact: campaign identity/name,
281
+ `selectedLeadListId`, `workflowTableId`, copied-row count, review-batch
282
+ count/hash, filter choice, source summary, and a concise brief summary. Do not
283
+ paste the full row ID list or row data. The branch loads the current brief,
284
+ table state, and review rows through Sellable tools before drafting.
298
285
 
299
286
  When the user chooses filters, immediately call
300
287
  `update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
301
288
  before rubric thinking or branch work. After `save_rubrics`, keep Filter Rules
302
289
  visible so the user can approve saved criteria. Only after approval should
303
290
  `update_campaign` move to `apply-icp-rubric` / Filter Leads and show
304
- `Filters saved + waiting for message approval` until the template is approved. Do not
305
- queue enrichment/filtering/Generate Message cells until message approval. Tell
306
- the user Message Drafting is preparing the template in the background.
291
+ `Filters saved + waiting for message approval` until the template is approved.
292
+ Do not queue enrichment/filtering/Generate Message cells until message
293
+ approval. Tell the user Message Drafting is preparing the template in the
294
+ background.
307
295
 
308
- Prospect Filters persists production rubrics with `save_rubrics` when filters
309
- are enabled. It must not require `brief.md`, `lead-review.md`, or
310
- `lead-sample.json`.
296
+ The parent thread persists production rubrics with `save_rubrics` when filters
297
+ are enabled. Do not spawn Prospect Filters in normal create-campaign runs.
311
298
 
312
299
  Run compatibility agent `post-find-leads-message-scout` as Message Drafting
313
300
  when allowed. Keep the long prompt and refs there.
314
301
 
315
- Codex: YOLO counts as campaign bg-agent permission. If no permission, ask once
316
- after filter choice. Use generic `gpt-5.5` / `xhigh` if needed. Never draft in
317
- parent silently.
302
+ Codex: YOLO counts as permission for the single Message Drafting bg-agent. If no
303
+ permission, ask once after filter choice. Use generic `gpt-5.5` / `xhigh`
304
+ Message Drafting if needed. Never draft in parent silently.
305
+
306
+ If the user critiques or edits the template before `approve-message`, route the
307
+ feedback back to Message Drafting with current `messageDraftRecommendation`,
308
+ basis token, campaign/table basis, and latest user text. Do not rewrite copy in
309
+ the parent or call `update_campaign_brief`. Message Drafting must load/use
310
+ `generate-messages` and return a revised `messageDraftRecommendation`; parent
311
+ renders it and asks approval. Message QA and validation before approval also
312
+ belong to Message Drafting; the parent renders its QA receipt, not a fresh
313
+ parent-thread critique. The branch must load the normal validation/QA rules and
314
+ run a QA pass before returning its concise review-ready recommendation.
318
315
 
319
316
  Load:
320
317
 
@@ -275,40 +275,31 @@ gate; tell the customer what happens next instead.
275
275
 
276
276
  ## Parallelism + Naming
277
277
 
278
- Source selection is sequential by default. Start with the first recommended
279
- place to look from `flow.v2.json`; for the current campaign shape that is
280
- usually LinkedIn engagement. Only try the next fallback after the current place
281
- is not viable, the user asks for a comparison, or the first place is borderline
282
- and needs a second source to avoid a bad recommendation. The fallback order must
283
- stay plain in customer copy: first check people talking on LinkedIn, then people
284
- with the right titles who recently posted on LinkedIn, then people with the
285
- right titles from a broader LinkedIn search, then a broader company and contact
286
- search.
278
+ After the Find Buyers Plan is approved, source selection stays in the parent
279
+ thread for normal create-campaign runs. Do not launch source scouts unless the
280
+ user explicitly asks for a source comparison/debug run. Only try a fallback after
281
+ the current place fails, the user asks for comparison, or the first place is
282
+ borderline. Keep fallback copy plain: people talking on LinkedIn, recent
283
+ LinkedIn titles, broader LinkedIn titles, then company/contact search.
287
284
  Use a 10% planning floor after conservative cleanup. If LinkedIn engagement falls
288
285
  below that floor, move to Sales Nav. If Sales Nav falls below that floor after
289
286
  reasonable refinement, move to Prospeo. Prospeo is the terminal fallback; if it
290
287
  also falls below 10%, tighten the ICP/source direction instead of inventing
291
288
  another provider.
292
289
 
293
- Source-angle comparison should be real, not implied. Call
294
- `get_source_scout_registry` before dispatching source scouts and use the
295
- returned canonical `name` values. In Codex or Claude Code, launch multiple named
296
- source scouts in the same turn only when the user explicitly requested source
297
- comparison, a prior lane failed, or the active flow marks the first lane as
298
- borderline. The parent thread should not fetch every provider prompt first; each
299
- scout loads only its matching provider prompt. If source work is sequential,
300
- keep the output numeric but do not claim the source scout was parallel or
301
- surface install status to the customer.
290
+ Source-angle comparison should be real, not implied. Normal source work uses MCP
291
+ provider tools inline from the parent and loads only the active provider prompt.
292
+ Do not claim a source scout ran and do not surface install status.
302
293
 
303
294
  For prospect setup work, call `get_post_find_leads_scout_registry` after
304
295
  the user chooses filters, not before the filter-choice question. After
305
296
  `confirm_lead_list` copies source rows and records the first review/process
306
297
  sample, ask add-filters vs skip-filters
307
298
  immediately. Once the user answers, start Message Drafting via
308
- `post-find-leads-message-scout` from the same campaign/table basis. If the user
309
- chooses filters, also start Prospect Filters via
310
- `post-find-leads-filter-scout`, move the browser to Filter Rules, save rubrics,
311
- then ask for filter approval. After approval, keep the
299
+ `post-find-leads-message-scout` from the same campaign/table basis. This is the
300
+ only normal background agent. If the user chooses filters, the parent thread
301
+ keeps working inline: move the browser to Filter Rules, load the filter
302
+ reference, save rubrics, then ask for filter approval. After approval, keep the
312
303
  browser on Filter Leads and show `Filters saved + waiting for message approval`
313
304
  while the message recommendation is reviewed. If the user skips filters, move
314
305
  the browser to Messages/message review. The join gate is saved-filter approval or
@@ -316,21 +307,30 @@ a resolved skip-filter choice, plus a message recommendation grounded in the sam
316
307
  campaign/table basis. Enrichment, filtering, and Generate Message cells wait for
317
308
  template approval on the Use Template path.
318
309
 
319
- Only promise parallel prospect setup work when parallel work actually started. If the
320
- host cannot or should not launch background branches, do not silently move the
321
- long message prompt into the parent thread. In Codex, ask once for permission to
322
- use background Message Drafting. If the user declines or asks to continue
323
- without background agents, say the real sequence:
310
+ Keep the Message Drafting handoff compact: campaign identity, campaign name,
311
+ selected lead list ID, workflow table ID, copied source row count, review-batch
312
+ row count, review-batch basis/hash, filter choice, source summary, and a concise
313
+ campaign brief summary. Do not paste the full review-batch row ID list or row
314
+ data into the spawn prompt. Message Drafting loads the current campaign brief,
315
+ campaign/table state, review rows, full generate-messages prompt, and
316
+ validation/QA rules inside its own branch before returning review-ready output.
317
+
318
+ Only promise background work for Message Drafting when it actually started. If
319
+ the host cannot or should not launch that branch, do not silently move the long
320
+ message prompt into the parent thread. In Codex, ask once for permission to use
321
+ background Message Drafting. If the user declines or asks to continue without
322
+ background agents, say the real sequence:
324
323
 
325
324
  ```text
326
325
  I’ll tighten the filter first, then run message generation from the same sample.
327
326
  ```
328
327
 
329
- Do not say `kicking off two workstreams`, `in parallel`, or `background` as
330
- aspirational copy.
328
+ Do not say `kicking off two workstreams`, `in parallel`, or `background` for
329
+ source or filter work. Only Message Drafting may be described as background.
331
330
 
332
331
  Call the post-filter message stage `message generation` in chat.
333
- Message validation is an internal approval proof, not the workstream name.
332
+ Message validation/QA is owned by Message Drafting; the parent renders its
333
+ approval proof, not a fresh critique from memory.
334
334
 
335
335
  Be explicit about what has and has not happened:
336
336
 
@@ -359,8 +359,10 @@ language. The YOLO option approves the brief, continues with best guesses, and
359
359
  still stops before final launch.
360
360
 
361
361
  At message review, if the user asks for edits, write the revised template and
362
- examples before asking approval again. Do not ask whether an unseen revision is
363
- better. Save to the campaign only after `approve-message`.
362
+ examples before asking approval again. Route the feedback back to Message
363
+ Drafting with the current recommendation and basis; do not rewrite in the
364
+ parent and do not call `update_campaign_brief`. Do not ask whether an unseen
365
+ revision is better. Save to the campaign only after `approve-message`.
364
366
  During message generation or revision, do not call `request_user_input` or
365
367
  `AskUserQuestion`; render the revised copy first, then enter message review.
366
368