@sellable/mcp 0.1.209 → 0.1.211

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.
@@ -157,7 +157,7 @@ export const promptToolDefinitions = [
157
157
  },
158
158
  {
159
159
  name: "get_post_find_leads_scout_registry",
160
- description: "Return the canonical Sellable Prospect Filters and Message Drafting worker names after Start Import copies confirmed source rows.",
160
+ description: "Return the canonical Sellable Message Drafting worker name after Start Import copies confirmed source rows. Normal create-campaign uses only this one post-import background agent.",
161
161
  inputSchema: {
162
162
  type: "object",
163
163
  properties: {},
@@ -257,9 +257,9 @@ export function getSourceScoutRegistry() {
257
257
  legacy: agent.legacy,
258
258
  })),
259
259
  usage: {
260
- codex: "Source finding is parent-thread and sequential by default in create-campaign. Do not launch source scouts in the normal campaign flow. Returned `name` values are for explicit source-comparison/debug runs only.",
261
- claude: "Source finding is parent-thread and sequential by default in create-campaign. Do not invoke source-scout Task/Agent workers in the normal campaign flow. Returned `name` values are for explicit source-comparison/debug runs only.",
262
- parentThreadRule: "Normal create-campaign source work stays inline in the parent thread with MCP provider tools. Default fallback order: Signal Discovery / LinkedIn engagement, then Sales Nav recent activity, then broader Sales Nav title search, then Prospeo account/contact search. Do not preload every provider prompt; load only the provider prompt for the active sequential source.",
260
+ codex: "Source finding is parent-thread and sequential in create-campaign. The packaged normal path installs only Message Drafting as a background agent, so this registry intentionally returns no source-scout agents.",
261
+ claude: "Source finding is parent-thread and sequential in create-campaign. Do not invoke source-scout Task/Agent workers; use MCP provider tools in the parent thread.",
262
+ parentThreadRule: "Normal create-campaign source work stays inline in the parent thread with MCP provider tools. Do not invoke source-scout Task/Agent workers. Default fallback order: Signal Discovery / LinkedIn engagement, then Sales Nav recent activity, then broader Sales Nav title search, then Prospeo account/contact search. Do not preload every provider prompt; load only the provider prompt for the active sequential source.",
263
263
  },
264
264
  };
265
265
  }
@@ -271,12 +271,11 @@ export function getPostFindLeadsScoutRegistry() {
271
271
  trigger: "prospect_setup_after_confirm_lead_list",
272
272
  requiredInputs: [
273
273
  "campaignId",
274
- "campaign revision or campaignUpdatedAt",
275
- "campaignBrief",
276
- "source decision and selectedLeadList/source state",
277
274
  "workflowTableId",
278
- "compact review-batch row count and basis/hash; branch reads rows through scoped tools",
279
- "filter choice and filter/rubric basis when present",
275
+ "concise brief summary",
276
+ "concise source summary and source-use rule",
277
+ "3-5 sample workflow-table rows with rowId/name/title/company/signal",
278
+ "optional selectedLeadListId, campaignName, and filter choice",
280
279
  ],
281
280
  scouts: scouts.map((agent) => ({
282
281
  id: String(agent.id || ""),
@@ -305,14 +304,10 @@ export function getPostFindLeadsScoutRegistry() {
305
304
  })),
306
305
  joinGate: {
307
306
  afterAllComplete: true,
308
- requiredState: ["leadScoringRubrics", "messageDraftRecommendation"],
307
+ requiredState: ["messageDraftRecommendation"],
309
308
  noFilterRequiredState: ["messageDraftRecommendation"],
310
- skipFilterRule: "leadScoringRubrics may be absent only when the user explicitly skips filters with enableICPFilters=false; messageDraftRecommendation is still required before template review.",
311
- show: [
312
- "readable_filters_with_reasons",
313
- "sample_message_for_approval",
314
- "message_qa_receipt",
315
- ],
309
+ skipFilterRule: "Filters are parent-thread MCP work. The only background worker is Message Drafting; messageDraftRecommendation is required before template review.",
310
+ show: ["sample_message_for_approval"],
316
311
  nextStage: "message-review",
317
312
  },
318
313
  messageDraftBranchContract: {
@@ -330,41 +325,38 @@ export function getPostFindLeadsScoutRegistry() {
330
325
  "startedAt",
331
326
  "updatedAt",
332
327
  "basisToken",
333
- "basis.selectedLeadListId",
334
328
  "basis.workflowTableId",
335
- "basis.reviewSampleRowCount",
336
- "basis.reviewSampleRowHash",
329
+ "basis.sampleRowIds",
337
330
  ],
338
- promptRequired: 'Load current campaign brief/table state through scoped tools, then get_subskill_prompt({ subskillName: "generate-messages" }); the full generate-messages prompt and its Reference Asset Loading pack, including message validation/QA assets requested by that prompt, are required inside the Message Drafting branch for normal drafting, QA, and user-requested rewrites. If required assets cannot be loaded, return blocked/retry-needed instead of drafting from prompt memory.',
331
+ promptRequired: 'Load current campaign brief/table state through scoped tools, then get_subskill_prompt({ subskillName: "generate-messages" }) for all chunks. Load every asset named in the generate-messages Reference Asset Loading pack through get_subskill_asset. Before returning, load get_subskill_prompt({ subskillName: "create-campaign-v2-validation" }) and use it as the final internal message-validation gate. Do not use shell/local filesystem reads, repo paths, plugin-cache paths, or /Users paths for message references. If required prompts/assets cannot be loaded through MCP tools, return blocked/retry-needed instead of drafting from memory.',
339
332
  basisFields: [
340
- "campaign revision or updatedAt",
341
- "brief hash",
342
- "selectedLeadListId",
333
+ "campaignId",
343
334
  "workflowTableId",
344
- "compact initial campaign-table execution slice row count/hash",
345
- "filter choice",
346
- "filter/rubric basis when present",
335
+ "concise brief summary",
336
+ "concise source summary/source-use rule",
337
+ "3-5 sample workflow-table rows",
338
+ "optional selectedLeadListId and filter choice",
347
339
  ],
348
340
  messageDraftOutputFields: [
349
341
  "templateRecommendation",
350
342
  "tokenFillRules",
351
- "renderedSample",
352
- "concerns",
343
+ "renderedGoodSample",
353
344
  "revisionNotes when user feedback triggered a revision",
354
345
  "status",
355
346
  "basisStatus",
356
347
  "basisToken",
357
- "qaReceipt or validationNotes",
348
+ "approveOrReviseRecommendation",
349
+ "validationStatus only; full QA details only when blocked/retry-needed",
358
350
  "outputAt",
359
351
  "outputHash",
360
352
  "error or retry detail",
361
353
  ],
362
- reusePolicy: "The first completed Message Drafting recommendation remains the default review candidate. Later Prospect Filters, Filter Leads, enrichment, or rubric completion may make an enriched rewrite available, but does not automatically retry or replace the initial draft unless campaign/brief/source/list/table/review-sample identity mismatches or the initial output failed. User copy feedback before approve-message is an explicit Message Drafting revision and must be routed back through the message branch with the current recommendation and basis.",
354
+ reusePolicy: "The first completed Message Drafting recommendation remains the default review candidate. Later filters, Filter Leads, enrichment, or rubric completion may make an enriched rewrite available, but does not automatically retry or replace the initial draft unless campaign/table/sample identity mismatches or the initial output failed. User copy feedback before approve-message is an explicit Message Drafting revision and must be routed back through the message branch with the current recommendation and basis.",
363
355
  },
364
356
  usage: {
365
- codex: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not spawn anything before that question. If filters are chosen, spawn Prospect Filters and Message Drafting from the same campaign/table basis whenever Codex agent-launch policy is satisfied, then the parent waits for Prospect Filters first, verifies save_rubrics succeeded, asks filter approval, and only then joins Message Drafting for template review. If filters are skipped, spawn only Message Drafting. Treat YOLO/autonomous mode as campaign-scoped permission for these post-import workers. If the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once before loading long filter/message prompts in the parent. If permission is granted and the named Message Drafting custom agent is unavailable, spawn a generic gpt-5.5 xhigh Message Drafting background agent with the same campaign/table basis.",
366
- claude: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not invoke any Task/Agent before that question. If filters are chosen, invoke Prospect Filters and Message Drafting from the same campaign/table basis; parent waits for Prospect Filters first, verifies save_rubrics succeeded, asks filter approval, then joins Message Drafting. If filters are skipped, invoke only Message Drafting and move to Messages/message review.",
367
- parentThreadRule: 'Post-import background work is limited to Prospect Filters and Message Drafting; source scouts stay out of the normal create-campaign path. If filters are chosen and the workers are available, launch post-find-leads-filter-scout and post-find-leads-message-scout after the filter-choice answer. The parent thread remains the orchestrator: wait for Prospect Filters first, require save_rubrics success or persist the returned production rubrics, keep the browser on Filter Rules, ask filter approval, then move to Filter Leads and join/wait for Message Drafting. Do not move into message review, queue cells, or call update_campaign_brief until saved filters are approved and messageDraftRecommendation is ready. If filters are skipped, launch only Message Drafting. In Codex, YOLO/autonomous mode counts as campaign-scoped permission for these post-import workers; if the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once for permission before loading long filter/message prompts in the parent. If Message Drafting is allowed but the named worker is unavailable, use a generic gpt-5.5 xhigh Message Drafting background agent. Do not silently fall back to parent-thread message drafting. The Message Drafting handoff must be compact: campaign identity/name, brief summary, source summary, selectedLeadListId, workflowTableId, copied source row count, review-batch row count/hash, and filter choice. Do not paste full reviewBatchRowIds, row data, or local debug artifacts into the message spawn prompt; the message branch must load the current campaign brief, campaign/table state, review rows, full generate-messages prompt, and validation/QA assets through scoped tools. Local markdown/json files are not normal-path inputs. The filter-choice question is the first post-import user gate; do not load this registry or filter references before it. Message drafting starts after the filter-choice answer, must load get_subskill_prompt({ subskillName: "generate-messages" }) and its Reference Asset Loading plus message validation/QA assets inside the branch or explicitly approved inline fallback, must read live campaign table state through scoped MCP/product tools, and must reject mismatched selectedLeadListId/workflowTableId/campaign/workspace input. Do not use any alternate or examples-only message prompt. User copy feedback, message QA, or rewrite requests before approve-message must be routed back to Message Drafting with the current recommendation, basis token, campaign/table basis, and latest user text; the parent must not rewrite or QA the template from memory and must not call update_campaign_brief before approve-message. On the filter path, the parent thread keeps the browser on Filter Rules after save_rubrics so the user can approve the saved criteria; only then move to Filter Leads, show `Filters saved + waiting for message approval`, and wait there for message approval. Enrichment, filtering, Generate Message cells, sender setup, sequence attach, and launch wait for template approval on the Use Template path. On the skip path, move to Messages/message review and wait for message approval before enrichment or Settings. Do not render message review from checklist or shortcut instructions; message review requires a messageDraftRecommendation whose basis proves the generate-messages prompt and QA assets ran for the current campaign/table execution slice. Do not automatically rerun Message Drafting after filters/enrichment finish; show the initial draft by default and offer an enriched rewrite only with explicit user opt-in.',
357
+ codex: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not spawn anything before that question. After the answer, launch only Message Drafting whenever Codex agent-launch policy is satisfied. If filters are chosen, the parent stays on Filter Rules and drafts/saves rubrics with MCP tools while Message Drafting runs in the background. If filters are skipped, move to Messages/message review after Message Drafting is ready. Treat YOLO/autonomous mode as campaign-scoped permission for this single post-import worker. If the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once before loading the long message prompt in the parent. If permission is granted and the named Message Drafting custom agent is unavailable, spawn a generic gpt-5.5 xhigh Message Drafting background agent with the same lean campaign/table basis.",
358
+ claude: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not invoke any Task/Agent before that question. After the answer, invoke only Message Drafting. If filters are chosen, parent drafts/saves rubrics with MCP tools while Message Drafting runs, asks filter approval, then joins Message Drafting. If filters are skipped, invoke only Message Drafting and move to Messages/message review.",
359
+ parentThreadRule: 'The only normal background worker is Message Drafting; source work and filter work stay in the parent thread with MCP tools. After the filter-choice answer, launch post-find-leads-message-scout only. If filters are chosen, the parent thread remains the filter writer: keep the browser on Filter Rules, load the filter reference, draft/save rubrics through MCP tools, ask filter approval, then move to Filter Leads while waiting for Message Drafting if needed. Do not move into message review, queue cells, or call update_campaign_brief until saved filters are approved when filters are enabled and messageDraftRecommendation is ready. If filters are skipped, launch only Message Drafting. In Codex, YOLO/autonomous mode counts as campaign-scoped permission for this single post-import worker; if the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once for permission before loading the long message prompt in the parent. If Message Drafting is allowed but the named worker is unavailable, use a generic gpt-5.5 xhigh Message Drafting background agent. Do not silently fall back to parent-thread message drafting. The Message Drafting handoff must be lean: campaignId, workflowTableId, brief summary, source summary/source-use rule, and 3-5 sample workflow-table rows with rowId/name/title/company/signal; optional campaignName, selectedLeadListId, and filter choice are allowed. Do not paste copied row counts, brief hashes, review-batch hashes, full reviewBatchRowIds, broad row data, or local debug artifacts into the message spawn prompt. The message branch must load current campaign brief/context, provided sample rows, the full generate-messages prompt, every referenced asset through get_subskill_asset, and before returning get_subskill_prompt({ subskillName: "create-campaign-v2-validation" }) for the internal validation gate. Local markdown/json files are not normal-path inputs. Message reference assets must be loaded with get_subskill_asset from the installed MCP package; do not use shell/local filesystem reads, repo paths, plugin-cache paths, or /Users paths to satisfy message references. The filter-choice question is the first post-import user gate; do not load this registry or filter references before it. Message drafting starts after the filter-choice answer and must reject mismatched workflowTableId/campaign/workspace input. Do not use any alternate or examples-only message prompt. User copy feedback, message QA, or rewrite requests before approve-message must be routed back to Message Drafting with the current recommendation, lean campaign/table basis, and latest user text; the parent must not rewrite or QA the template from memory and must not call update_campaign_brief before approve-message. The worker validates internally and returns only templateRecommendation, tokenFillRules, renderedGoodSample, status, approveOrReviseRecommendation, validationStatus, outputAt, outputHash, and blocked/retry detail. Do not render renderedFallbackSample, concerns, or a qaReceipt on the normal happy path. On the filter path, the parent thread keeps the browser on Filter Rules after save_rubrics so the user can approve the saved criteria; only then move to Filter Leads, show `Filters saved + waiting for message approval`, and wait there for message approval. Enrichment, filtering, Generate Message cells, sender setup, sequence attach, and launch wait for template approval on the Use Template path. On the skip path, move to Messages/message review and wait for message approval before enrichment or Settings. Do not render message review from checklist or shortcut instructions; message review requires a messageDraftRecommendation whose basis proves the generate-messages prompt, assets, and validation prompt ran for the current campaign/table execution slice. Do not automatically rerun Message Drafting after filters/enrichment finish; show the initial draft by default and offer an enriched rewrite only with explicit user opt-in.',
368
360
  },
369
361
  };
370
362
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.209",
3
+ "version": "0.1.211",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -132,7 +132,7 @@ data, compare sources by source volume, sampled ICP fit, activity/warmth
132
132
  signals, cleanup risk, and confidence basis. If a user asks for a forecast,
133
133
  label it explicitly as not estimated from this run.
134
134
 
135
- Before any provider prompt, search, source scout, or signal-discovery call, show
135
+ Before any provider prompt, search, or signal-discovery call, show
136
136
  one source-plan gate and ask for approval. Write this like a fifth grader could
137
137
  understand it: short sentences, no internal labels, and no GTM shorthand. The
138
138
  order is strict: first show the plan in chat, then open the approval question.
@@ -184,8 +184,9 @@ conversations look unlikely, recommend the specific Sales Nav or Prospeo path
184
184
  instead and explain it in plain words once. Do not call `search_signals`,
185
185
  `search_sales_nav`,
186
186
  `search_prospeo`,
187
- `fetch_post_engagers`, or provider-scoped subagents until the user approves this
188
- source plan or explicitly chooses a different source.
187
+ or `fetch_post_engagers` until the user approves this source plan or explicitly
188
+ chooses a different source. Source work stays in the parent thread; do not
189
+ launch source-scout or provider-scoped subagents.
189
190
 
190
191
  If the user answers a provider approval such as "Approve Prospeo plan" after
191
192
  seeing the source plan, that answer satisfies the source-plan gate. Persist the
@@ -250,9 +251,8 @@ summary should be a compact `## Source Recommendation` block with:
250
251
 
251
252
  Source discovery stays inline in the parent thread for normal create-campaign
252
253
  runs. Use the approved provider prompt and MCP tools sequentially; do not spawn
253
- source-scout background agents unless the user explicitly asks for a source
254
- comparison/debug run. Do not claim a scout ran unless one did, and do not surface
255
- install status to the customer. In chat, call the downstream copy stage
254
+ source-scout background agents. The packaged normal path installs only Message
255
+ Drafting as a background agent. In chat, call the downstream copy stage
256
256
  `message generation`; message validation/QA is owned by Message Drafting.
257
257
 
258
258
  For campaign-attached Signal Discovery sampling, promote/select the exact posts
@@ -279,14 +279,15 @@ Messages/message review. Enrichment/filtering and Generate Message cells wait
279
279
  for message approval. AI Generated is an explicit opt-out from the template
280
280
  path.
281
281
 
282
- The Message Drafting handoff must stay compact. Include campaign identity,
283
- campaign name, `selectedLeadListId`, `workflowTableId`, copied source row count,
284
- review-batch row count, review-batch basis/hash, filter choice, source summary,
285
- and a concise campaign brief summary. Do not paste the full review-batch row ID
286
- list or row data into the spawn prompt. Message Drafting must load the current
287
- campaign brief, campaign/table state, and review-batch rows through Sellable
288
- tools, then load the normal message validation/QA rules and run a QA pass before
289
- returning its concise review-ready recommendation.
282
+ The Message Drafting handoff must stay lean. Include only `campaignId`,
283
+ `workflowTableId`, a concise brief summary, concise source summary/source-use
284
+ rule, and 3-5 sample workflow-table rows with `rowId`, name, title, company, and
285
+ signal. Optional: campaign name, `selectedLeadListId`, and filter choice. Do not
286
+ paste copied row counts, brief hashes, review-batch hashes, full row ID lists,
287
+ broad row data, or local debug artifacts into the spawn prompt. Message Drafting
288
+ must load the current campaign brief/context, full `generate-messages` prompt,
289
+ all referenced assets, and `create-campaign-v2-validation`; validation is an
290
+ internal gate before it returns the concise review-ready recommendation.
290
291
 
291
292
  Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
292
293
  lines short, use indexed section labels and bullets, and translate internal
@@ -421,19 +422,15 @@ Treat host capabilities as concrete functions, not prose conventions:
421
422
  not call it in the normal create-campaign source path.
422
423
  - `load_post_find_leads_scout_registry`: call
423
424
  `mcp__sellable__get_post_find_leads_scout_registry({})` after source
424
- import and before dispatching Prospect Filters / Message Drafting.
425
- - `launch_prospect_filters`: Claude Code uses `Task` with `subagent_type`
426
- `post-find-leads-filter-scout` when filters are chosen; Codex uses the
427
- returned compatibility agent. Prospect Filters must save or return production
428
- rubrics before message review can proceed.
425
+ import and before dispatching Message Drafting only.
429
426
  - `launch_message_drafting`: Claude Code uses `Task` with `subagent_type`
430
427
  `post-find-leads-message-scout` when listed; Codex uses the returned
431
428
  compatibility agent or a generic `gpt-5.5` / `xhigh` Message Drafting agent.
432
429
 
433
430
  If a required interactive question function or MCP loader is missing, stop and
434
431
  explain the Sellable install/reload problem. Source work uses product-native MCP
435
- orchestration in the parent; the only normal post-import background branches are
436
- Prospect Filters and Message Drafting.
432
+ orchestration in the parent; filters also stay in the parent with MCP tools. The
433
+ only normal post-import background branch is Message Drafting.
437
434
 
438
435
  Never narrate local draft housekeeping to the user. If you create directories,
439
436
  save drafts, write artifacts, or persist intermediate state, translate it into
@@ -750,17 +747,21 @@ updates.
750
747
  asset loader so they share the same config.
751
748
  3. Follow that prompt and workflow config exactly.
752
749
  4. For filter and message setup, keep the parent thread as a lean orchestrator.
753
- When filters are chosen, use `post-find-leads-filter-scout` for Prospect
754
- Filters and `post-find-leads-message-scout` for Message Drafting. The parent
755
- waits for Prospect Filters first, verifies `save_rubrics` succeeded or saves
756
- returned production rubrics itself, asks filter approval, and only then joins
750
+ The only normal background agent is `post-find-leads-message-scout` for
751
+ Message Drafting. When filters are chosen, launch Message Drafting, then keep
752
+ filters in the parent thread: load `references/filter-leads.md`, draft
753
+ production rubrics, call `save_rubrics`, ask filter approval, and then join
757
754
  Message Drafting for template review. When filters are skipped, launch only
758
755
  Message Drafting.
759
756
  5. For message generation, keep the parent thread as a lean orchestrator and
760
757
  use the `post-find-leads-message-scout` compatibility agent for Message
761
758
  Drafting whenever the host exposes it
762
- and the current host policy allows agent launch. The worker must load
763
- `mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages" })`.
759
+ and the current host policy allows agent launch. The worker must load the
760
+ full `mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages" })`
761
+ prompt, every referenced message asset through
762
+ `mcp__sellable__get_subskill_asset`, and before returning
763
+ `mcp__sellable__get_subskill_prompt({ subskillName: "create-campaign-v2-validation" })`
764
+ as the internal validation gate.
764
765
  In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
765
766
  this single Message Drafting background agent. If the user has not enabled
766
767
  YOLO and has not explicitly asked for background agents, subagents, parallel
@@ -768,7 +769,7 @@ updates.
768
769
  permission before loading the long message prompt in the parent. If
769
770
  permission is granted but the named custom agent is not
770
771
  available, spawn a generic background agent with `model: "gpt-5.5"` and
771
- `reasoning_effort: "xhigh"` using the same campaign/table basis. Do not
772
+ `reasoning_effort: "xhigh"` using the same lean campaign/table basis. Do not
772
773
  silently fall back to parent-thread message drafting; parent fallback is
773
774
  allowed only when the user explicitly says to continue without a background
774
775
  agent.
@@ -779,21 +780,23 @@ updates.
779
780
  initial campaign-table execution slice rows as the source of truth; do not read stale local
780
781
  markdown such as `message-validation.md`, inspect the database directly, or
781
782
  synthesize local validation artifacts from general knowledge. The handoff to
782
- Message Drafting should pass compact basis only, not a long row-id list; the
783
- branch loads current brief/table rows and validation assets itself.
783
+ Message Drafting should pass lean basis only, not hashes, counts, or a long
784
+ row-id list; the branch loads current brief/context, the full
785
+ `generate-messages` prompt, all referenced assets, and
786
+ `create-campaign-v2-validation` itself. Do not render fallback sample,
787
+ concerns, or a QA receipt on the normal happy path.
784
788
  6. Create the campaign shell early with the v1 brief so the user can open the
785
789
  watch link and see useful setup state immediately. Materialize the approved
786
790
  source list, copy confirmed rows into the campaign, and internally process the
787
791
  first campaign-table execution slice after the source is attached to the
788
792
  campaign; do not load prospect-setup registries/prompts before asking add
789
- filters vs skip filters. Once the user answers, launch Prospect Filters plus
790
- Message Drafting when filters are chosen, or only Message Drafting when
791
- filters are skipped. Do not queue workflow cells, attach a
793
+ filters vs skip filters. Once the user answers, launch only Message Drafting.
794
+ If filters are chosen, draft/save filters in the parent thread. Do not queue workflow cells, attach a
792
795
  sequence, or start until saved filters and the
793
796
  message template/token rules are approved. When filters are chosen, immediately
794
797
  call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
795
- so the watched app moves to Filter Rules while Prospect Filters drafts/saves
796
- rubrics.
798
+ so the watched app moves to Filter Rules while the parent drafts/saves
799
+ rubrics and Message Drafting runs.
797
800
  After rubrics save, keep Filter Rules visible for approval; after approval,
798
801
  move to Filter Leads and show `Filters saved + waiting for message approval`
799
802
  until the template is approved.
@@ -208,8 +208,8 @@ Only then persist `leadSourceType`, `leadSourceProvider`, and provider `currentS
208
208
  Source work stays inline in the parent thread in normal create-campaign runs.
209
209
  Do not launch source-scout background agents. Run the approved provider probes
210
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.
211
+ source. The packaged normal path installs only Message Drafting as a background
212
+ agent.
213
213
  Use a 10% planning floor after cleanup. If LinkedIn engagement falls below it,
214
214
  move to Sales Nav, then Prospeo. If Prospeo also falls below 10%, tighten the
215
215
  ICP/source direction instead of inventing another provider.
@@ -270,67 +270,66 @@ customer-facing work before the question should be a short setup summary and the
270
270
  add filters, skip filters, or revise source. Do not include another watch link
271
271
  in this summary; the existing app view updates through campaign state.
272
272
 
273
- Once filter choice is known, use the post-import workers for the heavy prompt
274
- work. If the user chooses filters, launch both Prospect Filters
275
- (`post-find-leads-filter-scout`) and Message Drafting
276
- (`post-find-leads-message-scout`) from the same campaign/table basis. If filters
277
- are skipped, launch only Message Drafting and move the watched app to Messages.
278
- Debug markdown/json artifacts are optional only.
279
-
280
- The parent thread is the orchestrator, not the writer of long filter/message
281
- logic. On the filters path, after spawning both workers, the parent must wait for
282
- Prospect Filters first. Do not join Message Drafting, render message review, or
283
- move to Filter Leads until Prospect Filters has either successfully called
284
- `save_rubrics` or returned production-shaped rubrics that the parent then saves
285
- with `save_rubrics`. If neither happened, block and report the filter-save
286
- failure. Only after saved filters are verified should the parent ask for filter
287
- approval, then wait for Message Drafting if it is still running.
288
-
289
- Keep the Message Drafting handoff compact: campaign identity/name,
290
- `selectedLeadListId`, `workflowTableId`, copied-row count, review-batch
291
- count/hash, filter choice, source summary, and a concise brief summary. Do not
292
- paste the full row ID list or row data. The branch loads the current brief,
293
- table state, and review rows through Sellable tools before drafting.
273
+ Once filter choice is known, the only normal background worker is Message
274
+ Drafting (`post-find-leads-message-scout`). If filters are chosen, launch
275
+ Message Drafting, then keep filter drafting in the parent thread with MCP tools.
276
+ If filters are skipped, launch only Message Drafting and move the watched app to
277
+ Messages when the recommendation is ready. Debug markdown/json artifacts are
278
+ optional only.
279
+
280
+ The parent thread is the orchestrator and the filter writer. On the filters
281
+ path, immediately start Message Drafting in the background, then load
282
+ `references/filter-leads.md`, draft production rubrics in the parent, call
283
+ `save_rubrics`, and ask for filter approval. Do not render message review, queue
284
+ cells, or move past Filter Rules until saved filters are approved and
285
+ `messageDraftRecommendation` is ready.
286
+
287
+ Keep the Message Drafting handoff lean: `campaignId`, `workflowTableId`, a
288
+ concise brief summary, concise source summary/source-use rule, and 3-5 sample
289
+ workflow-table rows with `rowId`, name, title, company, and signal. Optional:
290
+ campaign name, `selectedLeadListId`, and filter choice. Do not paste copied row
291
+ counts, brief hashes, review-batch hashes, full row ID lists, broad row data, or
292
+ local debug artifacts. The branch loads the current brief/context and sample
293
+ rows through Sellable tools before drafting.
294
294
 
295
295
  When the user chooses filters, immediately call
296
296
  `update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
297
- before branch work so the app is on Filter Rules. After `save_rubrics`, keep
298
- Filter Rules visible so the user can approve saved criteria. Only after approval should
297
+ so the app is on Filter Rules while Message Drafting runs. After
298
+ `save_rubrics`, keep Filter Rules visible so the user can approve saved
299
+ criteria. Only after approval should
299
300
  `update_campaign` move to `apply-icp-rubric` / Filter Leads and show
300
301
  `Filters saved + waiting for message approval` until the template is approved.
301
302
  Do not queue enrichment/filtering/Generate Message cells until message
302
303
  approval. Tell the user Message Drafting is preparing the template in the
303
304
  background.
304
305
 
305
- Prospect Filters owns filter drafting and may persist production rubrics with
306
- `save_rubrics`. The parent must verify that durable save before continuing. Run
307
- compatibility agent `post-find-leads-message-scout` as Message Drafting when
308
- allowed. Keep the long message prompt and refs there.
309
-
310
- Codex: YOLO counts as permission for these post-import workers. If no
306
+ Codex: YOLO counts as permission for this one post-import worker. If no
311
307
  permission, ask once after filter choice. Use generic `gpt-5.5` / `xhigh`
312
308
  Message Drafting if needed. Never draft in parent silently.
313
309
 
314
310
  If the user critiques or edits the template before `approve-message`, route the
315
311
  feedback back to Message Drafting with current `messageDraftRecommendation`,
316
312
  basis token, campaign/table basis, and latest user text. Do not rewrite copy in
317
- the parent or call `update_campaign_brief`. Message Drafting must load/use
318
- `generate-messages` and return a revised `messageDraftRecommendation`; parent
319
- renders it and asks approval. Message QA and validation before approval also
320
- belong to Message Drafting; the parent renders its QA receipt, not a fresh
321
- parent-thread critique. The branch must load the normal validation/QA rules and
322
- run a QA pass before returning its concise review-ready recommendation.
313
+ the parent or call `update_campaign_brief`. Message Drafting must load the full
314
+ `generate-messages` prompt, all referenced assets, and
315
+ `create-campaign-v2-validation`, then return a revised
316
+ `messageDraftRecommendation`; parent renders it and asks approval. Message QA
317
+ and validation before approval also belong to Message Drafting, but validation
318
+ is an internal gate. Do not render `renderedFallbackSample`, `concerns`, or a
319
+ full `qaReceipt` in the normal happy path.
323
320
 
324
321
  Load:
325
322
 
326
323
  ```text
327
324
  get_subskill_prompt({ subskillName: "generate-messages" })
325
+ get_subskill_asset(...) for every asset in generate-messages Reference Asset Loading
326
+ get_subskill_prompt({ subskillName: "create-campaign-v2-validation" })
328
327
  ```
329
328
 
330
329
  Do not use any alternate or examples-only message prompt. Do not render message
331
330
  review until `messageDraftRecommendation` proves current campaign/table basis
332
- and shows whether it came from a background branch or an explicitly approved
333
- inline fallback.
331
+ and shows whether it came from Message Drafting or an explicitly approved inline
332
+ fallback.
334
333
 
335
334
  ## Hard Gates
336
335
 
@@ -276,11 +276,11 @@ gate; tell the customer what happens next instead.
276
276
  ## Parallelism + Naming
277
277
 
278
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.
279
+ thread for normal create-campaign runs. The packaged normal path installs only
280
+ Message Drafting as a background agent. Only try a fallback after the current
281
+ place fails, the user asks for comparison, or the first place is borderline.
282
+ Keep fallback copy plain: people talking on LinkedIn, recent LinkedIn titles,
283
+ broader LinkedIn titles, then company/contact search.
284
284
  Use a 10% planning floor after conservative cleanup. If LinkedIn engagement falls
285
285
  below that floor, move to Sales Nav. If Sales Nav falls below that floor after
286
286
  reasonable refinement, move to Prospeo. Prospeo is the terminal fallback; if it
@@ -294,46 +294,48 @@ Do not claim a source scout ran and do not surface install status.
294
294
  For prospect setup work, call `get_post_find_leads_scout_registry` after
295
295
  the user chooses filters, not before the filter-choice question. After
296
296
  `confirm_lead_list` copies source rows and records the first review/process
297
- sample, ask add-filters vs skip-filters immediately. If the user chooses
298
- filters, launch both Prospect Filters (`post-find-leads-filter-scout`) and
299
- Message Drafting (`post-find-leads-message-scout`) from the same campaign/table
300
- basis. If the user skips filters, launch only Message Drafting and move the
301
- browser to Messages/message review.
302
-
303
- The parent thread is the orchestrator. On the filters path it must wait for
304
- Prospect Filters first, verify `save_rubrics` succeeded or save the returned
305
- production-shaped rubrics itself, keep the browser on Filter Rules, and ask for
297
+ sample, ask add-filters vs skip-filters immediately. After the answer, launch
298
+ only Message Drafting (`post-find-leads-message-scout`). If the user chooses
299
+ filters, the parent thread keeps the browser on Filter Rules, loads the filter
300
+ reference, drafts/saves rubrics with MCP tools, and asks for filter approval
301
+ while Message Drafting runs.
302
+
303
+ The parent thread is the orchestrator and the filter writer. On the filters path
304
+ it must verify `save_rubrics`, keep the browser on Filter Rules, and ask for
306
305
  filter approval. Only after saved filters are approved should it move the
307
306
  browser to Filter Leads and join/wait for Message Drafting. The join gate is
308
307
  saved-filter approval or a resolved skip-filter choice, plus a message
309
308
  recommendation grounded in the same campaign/table basis. Enrichment, filtering,
310
309
  and Generate Message cells wait for template approval on the Use Template path.
311
310
 
312
- Keep the Message Drafting handoff compact: campaign identity, campaign name,
313
- selected lead list ID, workflow table ID, copied source row count, review-batch
314
- row count, review-batch basis/hash, filter choice, source summary, and a concise
315
- campaign brief summary. Do not paste the full review-batch row ID list or row
316
- data into the spawn prompt. Message Drafting loads the current campaign brief,
317
- campaign/table state, review rows, full generate-messages prompt, and
318
- validation/QA rules inside its own branch before returning review-ready output.
319
-
320
- Only promise background work for Prospect Filters or Message Drafting when it
321
- actually started. If the host cannot or should not launch those branches, do not
322
- silently move long filter/message prompts into the parent thread. In Codex, ask
323
- once for permission to use post-import background agents. If the user declines
324
- or asks to continue without background agents, say the real sequence:
311
+ Keep the Message Drafting handoff lean: `campaignId`, `workflowTableId`, concise
312
+ brief summary, concise source summary/source-use rule, and 3-5 sample
313
+ workflow-table rows with rowId/name/title/company/signal. Optional campaign
314
+ name, selected lead list ID, and filter choice are okay. Do not paste copied row
315
+ counts, brief hashes, review-batch hashes, full row ID lists, broad row data, or
316
+ local debug artifacts. Message Drafting loads the current campaign
317
+ brief/context, full `generate-messages` prompt, all referenced assets, and
318
+ `create-campaign-v2-validation` inside its own branch before returning
319
+ review-ready output.
320
+
321
+ Only promise Message Drafting background work when it actually started. If the
322
+ host cannot or should not launch that branch, do not silently move the long
323
+ message prompt into the parent thread. In Codex, ask once for permission to use
324
+ the post-import background agent. If the user declines or asks to continue
325
+ without background agents, say the real sequence:
325
326
 
326
327
  ```text
327
328
  I’ll tighten the filter first, then run message generation from the same sample.
328
329
  ```
329
330
 
330
331
  Do not say `kicking off two workstreams`, `in parallel`, or `background` for
331
- source work. On the filters path, the only normal background workers are
332
- Prospect Filters and Message Drafting.
332
+ source or filter work. On the filters path, the only normal background worker is
333
+ Message Drafting.
333
334
 
334
335
  Call the post-filter message stage `message generation` in chat.
335
- Message validation/QA is owned by Message Drafting; the parent renders its
336
- approval proof, not a fresh critique from memory.
336
+ Message validation/QA is owned by Message Drafting; validation is an internal
337
+ gate. The parent renders the template, token rules, one good sample, status, and
338
+ approve/revise recommendation, not fallback samples, concerns, or a QA receipt.
337
339
 
338
340
  Be explicit about what has and has not happened:
339
341