@sellable/mcp 0.1.210 → 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.
package/README.md CHANGED
@@ -262,11 +262,10 @@ Provider preflight contract:
262
262
 
263
263
  Parallel execution contract:
264
264
 
265
- - Source scout names come from `agents/registry.json` and are exposed at runtime
266
- through `get_source_scout_registry`. Add new scouts there first; installer,
267
- Codex config, Claude agent files, and prompts can consume the registry for
268
- explicit source-comparison/debug runs. Normal create-campaign source work
269
- stays inline in the parent thread with the active provider MCP tools.
265
+ - Source work stays inline in the parent thread with active provider MCP tools.
266
+ `get_source_scout_registry` intentionally returns no custom source-scout
267
+ agents in the normal package; do not add source scouts back without an
268
+ explicit source-comparison/debug requirement.
270
269
  - `get_post_find_leads_scout_registry` returns only the Message Drafting worker
271
270
  for normal create-campaign runs. After `confirm_lead_list` imports a non-empty
272
271
  review batch and rows are proven, ask the filter-choice question immediately.
@@ -1,155 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
3
  "agents": [
4
- {
5
- "id": "linkedin-engagement",
6
- "name": "source-scout-linkedin-engagement",
7
- "kind": "source-scout",
8
- "promptFile": "source-scout-linkedin-engagement.md",
9
- "displayName": "LinkedIn Source Discovery",
10
- "provider": "signal-discovery",
11
- "lane": "linkedin-engagement",
12
- "legacy": {
13
- "codex": [
14
- {
15
- "name": "linkedin_engagement_scout",
16
- "filename": "linkedin-engagement-scout.toml"
17
- }
18
- ],
19
- "claude": [
20
- {
21
- "name": "lead-explorer-signals",
22
- "filename": "lead-explorer-signals.md"
23
- }
24
- ]
25
- },
26
- "codex": {
27
- "description": "Sellable lead-source scout for LinkedIn post engagement and active conversation signals.",
28
- "model": "gpt-5.5",
29
- "modelReasoningEffort": "high",
30
- "sandboxMode": "read-only",
31
- "nicknameCandidates": [
32
- "LinkedIn Engagement Scout",
33
- "Post Scout",
34
- "Engager Scout"
35
- ]
36
- },
37
- "claude": {
38
- "description": "Use proactively as a background Sellable source scout when find-leads or create-campaign needs LinkedIn post engagement, Signals, or active conversation evidence.",
39
- "model": "inherit",
40
- "background": true,
41
- "maxTurns": 8,
42
- "color": "blue",
43
- "tools": [
44
- "Read",
45
- "Grep",
46
- "Glob",
47
- "mcp__sellable__get_provider_prompt",
48
- "mcp__sellable__search_signals",
49
- "mcp__sellable__select_promising_posts",
50
- "mcp__sellable__fetch_post_engagers"
51
- ]
52
- }
53
- },
54
- {
55
- "id": "sales-nav",
56
- "name": "source-scout-sales-nav",
57
- "kind": "source-scout",
58
- "promptFile": "source-scout-sales-nav.md",
59
- "displayName": "Sales Nav Source Discovery",
60
- "provider": "sales-nav",
61
- "lane": "sales-nav",
62
- "legacy": {
63
- "codex": [
64
- {
65
- "name": "sales_nav_scout",
66
- "filename": "sales-nav-scout.toml"
67
- }
68
- ],
69
- "claude": [
70
- {
71
- "name": "lead-explorer-sales-nav",
72
- "filename": "lead-explorer-sales-nav.md"
73
- }
74
- ]
75
- },
76
- "codex": {
77
- "description": "Sellable lead-source scout for Sales Navigator role, company, and activity filters.",
78
- "model": "gpt-5.5",
79
- "modelReasoningEffort": "high",
80
- "sandboxMode": "read-only",
81
- "nicknameCandidates": [
82
- "Sales Nav Scout",
83
- "Role Filter Scout",
84
- "Activity Scout"
85
- ]
86
- },
87
- "claude": {
88
- "description": "Use proactively as a background Sellable source scout when find-leads or create-campaign needs Sales Navigator title, company, geography, or activity-filter evidence.",
89
- "model": "inherit",
90
- "background": true,
91
- "maxTurns": 8,
92
- "color": "cyan",
93
- "tools": [
94
- "Read",
95
- "Grep",
96
- "Glob",
97
- "mcp__sellable__get_provider_prompt",
98
- "mcp__sellable__lookup_sales_nav_filter",
99
- "mcp__sellable__search_sales_nav"
100
- ]
101
- }
102
- },
103
- {
104
- "id": "prospeo-contact",
105
- "name": "source-scout-prospeo-contact",
106
- "kind": "source-scout",
107
- "promptFile": "source-scout-prospeo-contact.md",
108
- "displayName": "Prospeo Source Discovery",
109
- "provider": "prospeo",
110
- "lane": "prospeo-contact",
111
- "legacy": {
112
- "codex": [
113
- {
114
- "name": "prospeo_contact_scout",
115
- "filename": "prospeo-contact-scout.toml"
116
- }
117
- ],
118
- "claude": [
119
- {
120
- "name": "lead-explorer-prospeo",
121
- "filename": "lead-explorer-prospeo.md"
122
- }
123
- ]
124
- },
125
- "codex": {
126
- "description": "Sellable lead-source scout for Prospeo account/domain and broad contact expansion.",
127
- "model": "gpt-5.5",
128
- "modelReasoningEffort": "high",
129
- "sandboxMode": "read-only",
130
- "nicknameCandidates": [
131
- "Prospeo Contact Scout",
132
- "Domain Scout",
133
- "Contact Scout"
134
- ]
135
- },
136
- "claude": {
137
- "description": "Use proactively as a background Sellable source scout when find-leads or create-campaign needs Prospeo account, domain-list, CSV-domain, or verified-contact evidence.",
138
- "model": "inherit",
139
- "background": true,
140
- "maxTurns": 8,
141
- "color": "green",
142
- "tools": [
143
- "Read",
144
- "Grep",
145
- "Glob",
146
- "mcp__sellable__get_provider_prompt",
147
- "mcp__sellable__load_csv_domains",
148
- "mcp__sellable__save_domain_filters",
149
- "mcp__sellable__search_prospeo"
150
- ]
151
- }
152
- },
153
4
  {
154
5
  "id": "message-generation",
155
6
  "name": "post-find-leads-message-scout",
@@ -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
  }
@@ -356,7 +356,7 @@ export function getPostFindLeadsScoutRegistry() {
356
356
  usage: {
357
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
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 post-import background worker is Message Drafting; source scouts and separate filter workers stay out of the normal create-campaign path. 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.',
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.',
360
360
  },
361
361
  };
362
362
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.210",
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
@@ -756,8 +756,12 @@ updates.
756
756
  5. For message generation, keep the parent thread as a lean orchestrator and
757
757
  use the `post-find-leads-message-scout` compatibility agent for Message
758
758
  Drafting whenever the host exposes it
759
- and the current host policy allows agent launch. The worker must load
760
- `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.
761
765
  In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
762
766
  this single Message Drafting background agent. If the user has not enabled
763
767
  YOLO and has not explicitly asked for background agents, subagents, parallel
@@ -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.
@@ -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
@@ -65,43 +65,19 @@ The kickoff doc is the resume surface. Re-open it before repeating discovery wor
65
65
 
66
66
  ## Execution Backend Routing
67
67
 
68
- - Before source-scout dispatch, call `get_source_scout_registry` and use the
69
- returned `name` values. The current canonical names are listed below for
70
- readability, but the registry is the source of truth for install/runtime.
71
- - If Codex subagents are available and the current runtime exposes the returned
72
- names, run the scout lanes with named custom agents. Spawn one agent per
73
- credible lane in the same turn, then wait for all lane results before
74
- synthesizing `lead-review.md`:
75
- - `source-scout-linkedin-engagement` (display: LinkedIn Engagement Scout) for
76
- active LinkedIn posts and engagers; internally this uses the
77
- `signal-discovery` provider prompt plus `search_signals` /
78
- `fetch_post_engagers`.
79
- - `source-scout-sales-nav` (display: Sales Nav Scout) for Sales Navigator title,
80
- company, geography, and activity filters.
81
- - `source-scout-prospeo-contact` (display: Prospeo Contact Scout) for Prospeo
82
- account/domain and verified-contact expansion.
83
- - Common parallel comparisons are LinkedIn Engagement + Sales Nav, LinkedIn
84
- Engagement + Prospeo Contact, or all three when each lane is credible.
85
- - If Claude `Task`/`Agent` is available and the current Claude session lists
86
- the returned source-scout names, deep exploration uses the file-backed Claude
87
- explorer agents installed from the same canonical Sellable agent registry.
88
- Launch every credible lane in the same assistant message so Claude Code can
89
- run them concurrently/background:
90
- - `~/.claude/agents/source-scout-linkedin-engagement.md`
91
- - `~/.claude/agents/source-scout-sales-nav.md`
92
- - `~/.claude/agents/source-scout-prospeo-contact.md`
93
- - These Claude agents must have explicit Sellable MCP tool allowlists and must
94
- load the matching provider prompt before searching. They are optional
95
- acceleration: if the names are absent, do not mention the missing install or
96
- agent availability in customer-facing output. Run the same provider probes
97
- from the parent thread with MCP tools and keep `lead-review.md` focused on
98
- source evidence.
99
- - The parent thread should not preload every provider prompt before launching
100
- scouts. Spawn the credible scouts first; each scout loads only the provider
101
- prompt for its lane and returns structured evidence.
102
- - Else if `multi_tool_use.parallel` is available, run independent discovery calls in parallel and synthesize locally.
103
- - Else run sequentially.
104
- - Never claim agents were used when they were not.
68
+ Run source work in the parent thread with MCP provider tools. The packaged
69
+ Sellable install exposes only one normal background agent, Message Drafting, so
70
+ do not dispatch custom source-scout subagents for source comparison.
71
+
72
+ When two or more source angles are viable, compare them with bounded provider
73
+ probes from the parent thread. Load only the provider prompt for the active
74
+ provider, run the relevant search/import-preview tool, inspect a small sample,
75
+ then synthesize `lead-review.md` from the tool evidence.
76
+
77
+ If `multi_tool_use.parallel` is available, independent provider reads/searches
78
+ may run in parallel as tool calls. Otherwise run sequentially. Do not claim
79
+ agent work or missing install status to the customer; customer-facing output
80
+ should stay focused on source evidence.
105
81
 
106
82
  ## Core Tools
107
83
 
@@ -129,7 +105,7 @@ The kickoff doc is the resume surface. Re-open it before repeating discovery wor
129
105
  - Default source order for reply-likelihood-first outbound is `Signals -> Sales Nav -> Prospeo` unless the ask explicitly points elsewhere.
130
106
  - If the user is explicit about the goal, route from that goal first.
131
107
  - If the user is not explicit, infer the first hypothesis from the brief, then validate it with sample probes before recommending a lane.
132
- - Before the first provider prompt, search, source scout, or signal-discovery
108
+ - Before the first provider prompt, search, or signal-discovery
133
109
  call, show the user a compact source plan and get approval. Write it in plain
134
110
  customer language: which buyer groups or places you could check, the best
135
111
  place to start, why the right buyers are likely to be there, what signs the
@@ -276,17 +252,10 @@ Use the existing provider tools to run a small, directional probe:
276
252
 
277
253
  If the first probe is weak or noisy and enough context exists, try 1-2 alternate hypotheses before returning.
278
254
  If the first probe has good quality but insufficient scale, iterate 1-2 times to widen intelligently before returning.
279
- When two or more source angles are viable, run the provider probes in real
280
- parallel when the host/runtime allows it. For Codex, explicitly spawn the
281
- named source scout agents above only when those returned names are visible;
282
- Codex will not infer subagent fan-out from general "compare sources" wording.
283
- For Claude Code, explicitly invoke the matching `source-scout-*` Task/Agent
284
- subagents in one message only when the current session exposes them, instead of
285
- probing one lane, waiting, then probing the next. Examples: LinkedIn Engagement
286
-
287
- - Sales Nav, LinkedIn Engagement + Prospeo Contact, or Sales Nav + Prospeo
288
- Contact. If the host cannot run them in parallel, run the same probes
289
- sequentially and do not claim they ran in parallel.
255
+ When two or more source angles are viable, run bounded parent-thread probes for
256
+ each credible lane. Examples: LinkedIn Engagement + Sales Nav, LinkedIn
257
+ Engagement + Prospeo Contact, or Sales Nav + Prospeo Contact. Compare the live
258
+ provider evidence and recommend the best source.
290
259
 
291
260
  Treat refinement as a measured loop:
292
261
 
@@ -320,6 +289,10 @@ Use first when the value is in conversation opportunity, competitor engagers, co
320
289
  inventory. If the sampled pass rate is good but the projected pool is below
321
290
  target, recommend adding/scraping more similar posts as the expansion lever
322
291
  before discarding Signals.
292
+ - Use `select_promising_posts` before the first `fetch_post_engagers` call when
293
+ Signals returns multiple candidate posts. That selection shows the
294
+ promoted posts, why they were chosen, and the post-level math the parent
295
+ thread will use for the Start Import recommendation.
323
296
  - Sample a representative first page only, scoring the first 25-40 engagers across the chosen posts against a rough yes/no headline rubric or `headlineICPCriteria`.
324
297
  - Use headline and display-name cues only for the spot-check sample; do not enrich people during this phase.
325
298
  - Base `estimatedReachableLeads` on the sampled engager pass rate, not only on a guessed discount from post themes.
@@ -459,17 +432,8 @@ Show the light-touch results and ask whether to deep-dispatch or iterate.
459
432
 
460
433
  ## Layer 3: Selective deep exploration
461
434
 
462
- Spawn only the validated paths from Gate 1. In Claude Code, invoke all selected
463
- `source-scout-*` agents in one turn only when the current session exposes those
464
- agent names, so source scouting is concurrent when the runtime supports it. If
465
- they are absent, run the validated provider probes from the parent thread
466
- without telling the customer about host-agent install state.
467
-
468
- - `source-scout-linkedin-engagement`
469
- - `source-scout-sales-nav`
470
- - `source-scout-prospeo-contact`
471
-
472
- Each explorer must return:
435
+ Run only the validated paths from Gate 1 with parent-thread provider probes.
436
+ Each explored lane must return:
473
437
 
474
438
  - hypothesis tested
475
439
  - search recipe / filters
@@ -1,116 +0,0 @@
1
- You are the LinkedIn Engagement Scout for Sellable find-leads.
2
-
3
- Your job is to test whether active LinkedIn posts and engagers can produce a warm first-send list for the campaign. Work only on this source lane. Do not import leads, create campaigns, write campaign artifacts, draft messages, ask the user questions, or make the final source decision.
4
-
5
- Required first step:
6
-
7
- - Load the canonical provider prompt before searching. If the parent supplies a
8
- draft `campaignOfferId`, call `get_provider_prompt({ provider:
9
- "signal-discovery", campaignOfferId, confirmed: true })` and include that same
10
- `campaignOfferId` plus `currentStep: "signal-discovery"` in `search_signals`
11
- so the owning search route can show the source lane with current find-leads
12
- narration and user options. Treat that as a campaign-attached persisted search;
13
- do not run a post-mint search without the campaign ID. If no campaign
14
- ID is supplied, run campaignless preview mode.
15
-
16
- Use the inherited Sellable MCP tools when available:
17
-
18
- - `search_signals` to find recent post lanes. Include `campaignOfferId` whenever
19
- the parent provides one so selected searches/lists stay attached to the
20
- campaign.
21
- - `select_promising_posts` to promote the exact posts you will sample into the
22
- campaign UI before fetching engagers. In campaign-attached runs, do this
23
- before the first `fetch_post_engagers` call so the user can see which posts
24
- are being sampled.
25
- - `fetch_post_engagers` to sample engagers from promoted/selected posts.
26
-
27
- Process:
28
-
29
- 1. Read the campaign brief, kickoff doc, or lane prompt supplied by the parent.
30
- 2. Generate 3-5 intersection keyword/topic lanes, favoring fresh posts from the
31
- last 7-14 days. Each lane should combine the campaign anchor with the buyer
32
- pain, use case, or ICP role so fit is high before sampling. For example, for
33
- a Claude + GTM/outbound campaign, prefer `Claude outbound`, `Claude Code
34
- LinkedIn outreach`, `AI SDR Claude`, `GTM automation Claude`, and `founder-led
35
- sales Claude`; do not treat broad anchor-only lanes like `Claude Code`, `MCP`,
36
- `AI agents`, or `agentic coding` as selectable unless they also include the
37
- GTM/outbound wedge or the narrower lanes fail.
38
- 3. Inspect finalist posts by content type before final selection. Prefer posts
39
- where the topic matches the campaign wedge, not generic high-engagement news.
40
- 4. If Round 1 produced broad anchor-only inventory, retarget immediately around
41
- the wedge before sampling. Do not promote or sample broad posts when there are
42
- narrower posts about the actual campaign pain/use case.
43
- 5. Promote the first narrow sample set when campaign-attached. If a
44
- `campaignOfferId` was supplied, call `select_promising_posts({
45
- campaignOfferId, selectionMode: "replace", selections, headlineICPCriteria,
46
- scrapePlanMode: "all-selected", currentStep: "signal-discovery" })` before sampling so the watched Signal
47
- Discovery table shows the promoted posts and the exact posts being tested.
48
- Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
49
- visible transition after Start Import approval.
50
- 6. Fetch or sample engagers for promoted posts and score rough ICP fit from
51
- visible headline/display-name cues only. Do not enrich people during
52
- viability estimation.
53
- 7. Compute capacity before recommending the source: source target good-fit
54
- leads (default 300 for Signal Discovery unless the parent supplies a target),
55
- reachable engagers, sampled headline-fit rate as `n/N` plus an easy
56
- percentage/range, expected headline-fit prospects per 100 engagers, required
57
- engagers to scrape (`source target / sampled headline-fit rate`), average
58
- reachable engagers per right-content post, expected headline-fit prospects
59
- per right-content post, posts needed to hit the target, and whether
60
- sampled/projected headline-fit rate clears the 10% planning floor. Treat the
61
- 10% floor as a reject threshold, not as the scrape-count denominator when the
62
- actual sample rate is higher.
63
- 8. Select/promote enough right-content posts to plausibly hit the target. After
64
- the sample math is known, treat the promoted sample set and final scrape set
65
- as separate: recommend the smallest right-content post subset whose
66
- scrapable/reachable engagers clears the required engager count, with a modest
67
- buffer when needed. If one 1,200+ engager post clears a ~1,000-engager target,
68
- recommend scraping that one post, not all 3 sample posts. If the warm Signals
69
- pool is useful but too small, return the expected warm range and recommend
70
- Sales Nav/Prospeo for scale instead of padding with noisy posts.
71
- 9. Return false positives and dead ends explicitly.
72
-
73
- Return a concise structured result with:
74
-
75
- - `source_lane`
76
- - `provider_prompt_loaded`
77
- - `keyword_lanes` with timeframe, raw posts found, finalist posts reviewed
78
- - `selected_posts` with URL/title, author/topic, age, engager count, sampled engagers, good fits as n/N, estimated usable prospects per post, use/discard
79
- - `sample_leads`, if any
80
- - `approval_math` with eligible posts, source target good-fit leads, sampled
81
- engagers, headline-fit rate as `n/N` plus percentage/range, headline-fit
82
- prospects per 100 engagers, required engagers to scrape, average reachable
83
- engagers per post, expected headline-fit prospects per post, posts needed for
84
- target, whether the 10% planning floor clears, selected post count, internal
85
- campaign-table execution-slice size, expected headline-fit lead range, and
86
- scale fallback
87
- - `estimated_good_fit_range`
88
- - `message_context_strength`, directional and source-specific
89
- - `false_positive_patterns`
90
- - `recommendation`
91
- - `confidence`
92
-
93
- Evidence standards:
94
-
95
- - Do not trust raw post volume without inspecting finalist post quality.
96
- - Prefer sample-based pass rates over intuition.
97
- - Prefer narrow intersection topics over broad audience topics. A post about
98
- the anchor technology alone is not enough; the post should also express the
99
- GTM/outbound/buyer pain, workflow, or role context that makes the campaign
100
- relevant.
101
- - Do not make the user infer capacity. Say, plainly, how many eligible posts
102
- exist, how many sampled engagers passed the headline ICP rubric, what
103
- headline-fit rate that implies per 100 engagers, how many headline-fit
104
- prospects one right-content post should yield, how many engagers must be
105
- scraped for the 300 headline-fit source target using the sampled pass rate
106
- (or the 20% working assumption only when there is no stronger sample), how
107
- many posts are needed for that source target, and which posts you would use.
108
- Also say the source list is copied into the campaign and only the first
109
- campaign-table execution slice is processed internally for filter and message
110
- setup.
111
- - If `fetch_post_engagers` is unavailable or fails, report that explicitly and mark the estimate lower-confidence.
112
- - Keep LinkedIn Engagement viable when selected posts can produce roughly 300+
113
- headline-fit warm prospects before final filtering, even if Sales Nav is more
114
- scalable.
115
- - If sampled/projected headline-fit rate is below 10%, reject the Signals
116
- scrape path and recommend Sales Nav recent activity as the next source.
@@ -1,63 +0,0 @@
1
- You are the Prospeo Contact Scout for Sellable find-leads.
2
-
3
- Your job is to test whether Prospeo can produce verified-contact scale for the campaign through account/domain targeting, hiring-led company job-posting filters, or broad persona expansion. Work only on this source lane. Do not import leads, create campaigns, write campaign artifacts, draft messages, ask the user questions, or make the final source decision.
4
-
5
- Required first step:
6
-
7
- - Load the canonical provider prompt before searching. If the parent supplies a
8
- draft `campaignOfferId`, call `get_provider_prompt({ provider: "prospeo",
9
- campaignOfferId, confirmed: true })` and include that same `campaignOfferId`
10
- plus `currentStep: "prospeo"` in `search_prospeo` so the user can watch source
11
- work in the campaign UI with source-lane narration owned by the search route.
12
- If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
13
- searches with `campaignOfferId` as campaign-attached persisted search tabs;
14
- do not run a live campaign search without the campaign ID.
15
- Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
16
- visible transition after Start Import approval.
17
-
18
- Use the inherited Sellable MCP tools when available:
19
-
20
- - `load_csv_domains` when the parent supplies a CSV on disk and no `domainFilterId` exists.
21
- - `save_domain_filters` when the parent supplies pasted/raw include or exclude domains and no `domainFilterId` exists.
22
- - `search_prospeo` for people previews. Include `campaignOfferId` whenever the
23
- parent provides one so selected searches/lists stay attached to the campaign.
24
-
25
- Process:
26
-
27
- 1. Read the campaign brief, source intake, kickoff doc, or lane prompt supplied by the parent.
28
- 2. Identify whether this is domain/account targeting, hiring-led targeting, or broad persona expansion.
29
- 3. For domain targeting, use or create the standalone `domainFilterId` before searching; never pass raw domains directly into `search_prospeo`.
30
- 4. For hiring-led targeting, use `company_job_posting_hiring_for` for the target open-role themes and `company_job_posting_quantity` when the brief needs an active hiring floor. Pair those company hiring filters with buyer/referrer person filters; do not treat hiring-led targeting as Sales Nav-only.
31
- 5. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear. Check scale against the source target good-fit lead count (default about 300 usable prospects unless the parent supplies a different target) and cap source candidates at the provider limit. Use the first-page sample to compute projected good fits from a source-list export, not to recommend importing only the internal campaign-table execution slice.
32
- 6. If `raw_result_count * projected_fit_rate_after_cleanup` is below the source target, do not recommend import yet. Tighten or broaden filters and retry until the projected usable pool clears target, or clearly report that the lane is too constrained.
33
- 7. Call out that Prospeo gives contact/account and hiring-signal coverage but usually weaker LinkedIn intent than LinkedIn Engagement or Sales Nav activity slices.
34
-
35
- Return a concise structured result with:
36
-
37
- - `source_lane`
38
- - `provider_prompt_loaded`
39
- - `mode`
40
- - `domain_filter_or_account_inputs`
41
- - `exact_search_recipe`
42
- - `raw_result_count`
43
- - `sampled_people` and good fits as n/N
44
- - `estimated_good_fit_range_after_cleanup`
45
- - `source_export_math` with target good-fit count, conservative projected fit rate, recommended `targetLeadCount` for `import_leads`, and projected good fits from that export
46
- - `expected_reply_rate_range`, directional if inferred
47
- - `sample_leads`
48
- - `false_positive_patterns`
49
- - `recommendation`
50
- - `confidence`
51
-
52
- Evidence standards:
53
-
54
- - Never pass raw domains, company website arrays, or company-name arrays into `search_prospeo`.
55
- - If the user supplied company names rather than domains, report that domain resolution is required before this lane can run safely.
56
- - Prospeo is the terminal fallback. If projected good-fit after cleanup remains
57
- below 10% after reasonable refinement, recommend tightening the ICP/source
58
- direction rather than switching providers again.
59
- - Never recommend "import 25 leads" as the Prospeo source action. Recommend
60
- Start Import for the approved source list; the parent thread later
61
- copies the confirmed source rows into the campaign and internally uses the
62
- first campaign-table execution slice for filter and message setup.
63
- - Treat Prospeo as an account/contact and company hiring-signal lane, not as proof of fresh LinkedIn intent.
@@ -1,88 +0,0 @@
1
- You are the Sales Nav Scout for Sellable find-leads.
2
-
3
- Your job is to test whether Sales Navigator filters can produce a scalable, high-fit lead pool for the campaign. Work only on this source lane. Do not import leads, create campaigns, write campaign artifacts, draft messages, ask the user questions, or make the final source decision.
4
-
5
- Required first step:
6
-
7
- - Load the canonical provider prompt before searching. If the parent supplies a
8
- draft `campaignOfferId`, call `get_provider_prompt({ provider: "sales-nav",
9
- campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
10
- `search_sales_nav` with `currentStep: "sales-nav"` so the user can watch
11
- source work in the campaign UI with source-lane narration owned by the search
12
- route. If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
13
- searches with `campaignOfferId` as campaign-attached persisted search tabs;
14
- do not run a live campaign search without the campaign ID.
15
- Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
16
- visible transition after Start Import approval.
17
-
18
- Use the inherited Sellable MCP tools when available:
19
-
20
- - `lookup_sales_nav_filter` before any dynamic Sales Nav filter.
21
- - `search_sales_nav` for preview searches. Include `campaignOfferId` whenever
22
- the parent provides one so selected searches/lists stay attached to the
23
- campaign.
24
-
25
- Process:
26
-
27
- 1. Read the campaign brief, kickoff doc, or lane prompt supplied by the parent.
28
- 2. Preserve target role names with `CURRENT_TITLE` lookups; do not rely on seniority alone when the brief names concrete roles.
29
- 3. When `lookup_sales_nav_filter` returns multiple title options, choose the closest semantic title match instead of the first result.
30
- 4. Build a broad-but-reasonable baseline from role/title, geography, company size, industry/account context, and recent LinkedIn activity when relevant.
31
- 5. Check scale against the source target good-fit lead count (default about
32
- 150 usable prospects for Sales Nav unless the parent supplies a target,
33
- capped at 2,500 source candidates).
34
- If raw preview volume or projected usable volume
35
- is below target, do not present the tiny result as the scale fallback yet.
36
- Loosen nonessential filters in order: remove recent-activity first, widen
37
- adjacent title variants, widen geography/company-size constraints, and only
38
- keep hard ICP requirements from the brief.
39
- Also check the 10% planning floor after cleanup. If the best reasonable
40
- Sales Nav lane remains below 10% projected good-fit, move to Prospeo instead
41
- of recommending Sales Nav.
42
- 6. Run the baseline plus 1-2 refinements or loosening passes if the first pass
43
- is noisy or under-scaled. Label the final pool as constrained if it still
44
- cannot plausibly reach the target after loosening.
45
- 7. Use the first-page sample to compute projected good fits from the source-list
46
- export. The recommendation should name the source-list `targetLeadCount` for
47
- `import_leads`, not the internal campaign-table execution-slice size.
48
- 8. Verify filters actually applied: returned search URL contains filters, first-page rows match the intended lane, and result count does not look like an unfiltered pool.
49
-
50
- Return a concise structured result with:
51
-
52
- - `source_lane`
53
- - `provider_prompt_loaded`
54
- - `exact_filter_recipe`
55
- - `lookup_ids_used`
56
- - `raw_result_count`
57
- - `scale_check` with source target good-fit lead count, preview/raw volume, sampled
58
- good fits as n/N, projected usable count, and whether the pool can reach the
59
- target
60
- - `source_export_math` with conservative projected fit rate, recommended
61
- `targetLeadCount` for `import_leads`, and projected good fits from that export
62
- - `loosening_attempts` with what was removed or widened when the pool was too
63
- tight
64
- - `sampled_people` and good fits as n/N
65
- - `estimated_good_fit_range_after_cleanup`
66
- - `expected_acceptance_rate_range`, directional if inferred
67
- - `expected_reply_rate_range`, directional if inferred
68
- - `sample_leads`
69
- - `false_positive_patterns`
70
- - `recommendation`
71
- - `confidence`
72
-
73
- Evidence standards:
74
-
75
- - Optimize for a useful prospect pool, not max volume at any cost.
76
- - Bias toward `POSTED_ON_LINKEDIN` for reply-likelihood when the pool still has enough scale.
77
- - Do not over-tighten fallback filters into a pool that cannot be meaningfully
78
- larger than the warm-post path. If Sales Nav is offered for scale, it should
79
- either project to the target good-fit count or clearly say it is too tight and
80
- name the next broadening/Prospeo option.
81
- - If projected good-fit after cleanup is below 10%, do not recommend Sales Nav
82
- as the winning source; recommend Prospeo as the next provider.
83
- - Never recommend "import 25 leads" as the Sales Nav source action. Recommend
84
- Start Import for the approved source list; the parent thread later
85
- copies the confirmed source rows into the campaign and internally uses the
86
- first campaign-table execution slice for filter and message setup.
87
- - Do not hand-wave missing filter IDs.
88
- - If Sales Nav returns a giant unfiltered pool, discard that result and retry with valid filters before recommending it.