@sellable/mcp 0.1.67 → 0.1.69
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 +9 -2
- package/agents/linkedin-engagement-scout.md +41 -0
- package/agents/prospeo-contact-scout.md +43 -0
- package/agents/registry.json +108 -0
- package/agents/sales-nav-scout.md +44 -0
- package/package.json +2 -1
- package/skills/create-campaign/SKILL.md +11 -4
- package/skills/create-campaign-v2/SKILL.md +32 -23
- package/skills/create-campaign-v2/SOUL.md +11 -2
- package/skills/create-campaign-v2/core/flow.v2.json +2 -2
- package/skills/find-leads/SKILL.md +31 -6
package/README.md
CHANGED
|
@@ -240,8 +240,15 @@ Provider preflight contract:
|
|
|
240
240
|
|
|
241
241
|
Parallel execution contract:
|
|
242
242
|
|
|
243
|
-
- Claude host: use
|
|
244
|
-
-
|
|
243
|
+
- Claude host: use the installed `lead-explorer-signals`,
|
|
244
|
+
`lead-explorer-sales-nav`, and `lead-explorer-prospeo` Task/Agent subagents
|
|
245
|
+
for parallel lead-source scouting. Launch all credible lanes in one assistant
|
|
246
|
+
message so Claude Code can run them concurrently/background.
|
|
247
|
+
- Codex host: use named custom scouts for source-angle work when subagents are
|
|
248
|
+
available: `linkedin_engagement_scout`, `sales_nav_scout`, and
|
|
249
|
+
`prospeo_contact_scout`. Use `multi_tool_use.parallel` for independent
|
|
250
|
+
tool-call batches when subagents are unavailable or the work is only simple
|
|
251
|
+
batched lookups.
|
|
245
252
|
- If neither backend is available, run sequentially with the same output schema.
|
|
246
253
|
|
|
247
254
|
Config path resolution (in order):
|
|
@@ -0,0 +1,41 @@
|
|
|
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: `get_provider_prompt({ provider: "signal-discovery", confirmed: true })`.
|
|
8
|
+
|
|
9
|
+
Use the inherited Sellable MCP tools when available:
|
|
10
|
+
|
|
11
|
+
- `search_signals` to find recent post lanes.
|
|
12
|
+
- `fetch_post_engagers` to sample engagers from selected posts.
|
|
13
|
+
|
|
14
|
+
Process:
|
|
15
|
+
|
|
16
|
+
1. Read the campaign brief, kickoff doc, or lane prompt supplied by the parent.
|
|
17
|
+
2. Search 3-5 keyword/topic lanes, favoring fresh posts from the last 7-14 days.
|
|
18
|
+
3. Select 3-5 promising posts when available.
|
|
19
|
+
4. Fetch or sample engagers for selected posts and score rough ICP fit from visible headline/display-name cues only. Do not enrich people during viability estimation.
|
|
20
|
+
5. Estimate usable prospects per selected post from sampled pass rate. If the sample is good but volume is low, say how many more similar posts should be added or scraped.
|
|
21
|
+
6. Return false positives and dead ends explicitly.
|
|
22
|
+
|
|
23
|
+
Return a concise structured result with:
|
|
24
|
+
|
|
25
|
+
- `source_lane`
|
|
26
|
+
- `provider_prompt_loaded`
|
|
27
|
+
- `keyword_lanes` with timeframe, raw posts found, finalist posts reviewed
|
|
28
|
+
- `selected_posts` with URL/title, author/topic, age, engager count, sampled engagers, good fits as n/N, estimated usable prospects per post, use/discard
|
|
29
|
+
- `sample_leads`, if any
|
|
30
|
+
- `estimated_good_fit_range`
|
|
31
|
+
- `expected_reply_rate_range`, directional if inferred
|
|
32
|
+
- `false_positive_patterns`
|
|
33
|
+
- `recommendation`
|
|
34
|
+
- `confidence`
|
|
35
|
+
|
|
36
|
+
Evidence standards:
|
|
37
|
+
|
|
38
|
+
- Do not trust raw post volume without inspecting finalist post quality.
|
|
39
|
+
- Prefer sample-based pass rates over intuition.
|
|
40
|
+
- If `fetch_post_engagers` is unavailable or fails, report that explicitly and mark the estimate lower-confidence.
|
|
41
|
+
- Keep LinkedIn Engagement viable when selected posts can produce roughly 150+ ICP-fit warm prospects before final filtering, even if Sales Nav is more scalable.
|
|
@@ -0,0 +1,43 @@
|
|
|
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 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: `get_provider_prompt({ provider: "prospeo", confirmed: true })`.
|
|
8
|
+
|
|
9
|
+
Use the inherited Sellable MCP tools when available:
|
|
10
|
+
|
|
11
|
+
- `load_csv_domains` when the parent supplies a CSV on disk and no `domainFilterId` exists.
|
|
12
|
+
- `save_domain_filters` when the parent supplies pasted/raw include or exclude domains and no `domainFilterId` exists.
|
|
13
|
+
- `search_prospeo` for campaignless people previews.
|
|
14
|
+
|
|
15
|
+
Process:
|
|
16
|
+
|
|
17
|
+
1. Read the campaign brief, source intake, kickoff doc, or lane prompt supplied by the parent.
|
|
18
|
+
2. Identify whether this is domain/account targeting or broad persona expansion.
|
|
19
|
+
3. For domain targeting, use or create the standalone `domainFilterId` before searching; never pass raw domains directly into `search_prospeo`.
|
|
20
|
+
4. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear.
|
|
21
|
+
5. Call out that Prospeo gives contact/account coverage but usually weaker LinkedIn intent than LinkedIn Engagement or Sales Nav activity slices.
|
|
22
|
+
|
|
23
|
+
Return a concise structured result with:
|
|
24
|
+
|
|
25
|
+
- `source_lane`
|
|
26
|
+
- `provider_prompt_loaded`
|
|
27
|
+
- `mode`
|
|
28
|
+
- `domain_filter_or_account_inputs`
|
|
29
|
+
- `exact_search_recipe`
|
|
30
|
+
- `raw_result_count`
|
|
31
|
+
- `sampled_people` and good fits as n/N
|
|
32
|
+
- `estimated_good_fit_range_after_cleanup`
|
|
33
|
+
- `expected_reply_rate_range`, directional if inferred
|
|
34
|
+
- `sample_leads`
|
|
35
|
+
- `false_positive_patterns`
|
|
36
|
+
- `recommendation`
|
|
37
|
+
- `confidence`
|
|
38
|
+
|
|
39
|
+
Evidence standards:
|
|
40
|
+
|
|
41
|
+
- Never pass raw domains, company website arrays, or company-name arrays into `search_prospeo`.
|
|
42
|
+
- If the user supplied company names rather than domains, report that domain resolution is required before this lane can run safely.
|
|
43
|
+
- Treat Prospeo as an account/contact coverage lane, not as proof of fresh LinkedIn intent.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"agents": [
|
|
4
|
+
{
|
|
5
|
+
"id": "linkedin-engagement-scout",
|
|
6
|
+
"promptFile": "linkedin-engagement-scout.md",
|
|
7
|
+
"displayName": "LinkedIn Engagement Scout",
|
|
8
|
+
"codex": {
|
|
9
|
+
"name": "linkedin_engagement_scout",
|
|
10
|
+
"filename": "linkedin-engagement-scout.toml",
|
|
11
|
+
"description": "Sellable lead-source scout for LinkedIn post engagement and active conversation signals.",
|
|
12
|
+
"modelReasoningEffort": "medium",
|
|
13
|
+
"sandboxMode": "read-only",
|
|
14
|
+
"nicknameCandidates": [
|
|
15
|
+
"LinkedIn Engagement Scout",
|
|
16
|
+
"Post Scout",
|
|
17
|
+
"Engager Scout"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"claude": {
|
|
21
|
+
"name": "lead-explorer-signals",
|
|
22
|
+
"filename": "lead-explorer-signals.md",
|
|
23
|
+
"description": "Use proactively as a background Sellable source scout when find-leads or create-campaign needs LinkedIn post engagement, Signals, or active conversation evidence.",
|
|
24
|
+
"model": "inherit",
|
|
25
|
+
"background": true,
|
|
26
|
+
"maxTurns": 8,
|
|
27
|
+
"color": "blue",
|
|
28
|
+
"tools": [
|
|
29
|
+
"Read",
|
|
30
|
+
"Grep",
|
|
31
|
+
"Glob",
|
|
32
|
+
"mcp__sellable__get_provider_prompt",
|
|
33
|
+
"mcp__sellable__search_signals",
|
|
34
|
+
"mcp__sellable__fetch_post_engagers"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "sales-nav-scout",
|
|
40
|
+
"promptFile": "sales-nav-scout.md",
|
|
41
|
+
"displayName": "Sales Nav Scout",
|
|
42
|
+
"codex": {
|
|
43
|
+
"name": "sales_nav_scout",
|
|
44
|
+
"filename": "sales-nav-scout.toml",
|
|
45
|
+
"description": "Sellable lead-source scout for Sales Navigator role, company, and activity filters.",
|
|
46
|
+
"modelReasoningEffort": "medium",
|
|
47
|
+
"sandboxMode": "read-only",
|
|
48
|
+
"nicknameCandidates": [
|
|
49
|
+
"Sales Nav Scout",
|
|
50
|
+
"Role Filter Scout",
|
|
51
|
+
"Activity Scout"
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"claude": {
|
|
55
|
+
"name": "lead-explorer-sales-nav",
|
|
56
|
+
"filename": "lead-explorer-sales-nav.md",
|
|
57
|
+
"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.",
|
|
58
|
+
"model": "inherit",
|
|
59
|
+
"background": true,
|
|
60
|
+
"maxTurns": 8,
|
|
61
|
+
"color": "cyan",
|
|
62
|
+
"tools": [
|
|
63
|
+
"Read",
|
|
64
|
+
"Grep",
|
|
65
|
+
"Glob",
|
|
66
|
+
"mcp__sellable__get_provider_prompt",
|
|
67
|
+
"mcp__sellable__lookup_sales_nav_filter",
|
|
68
|
+
"mcp__sellable__search_sales_nav"
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "prospeo-contact-scout",
|
|
74
|
+
"promptFile": "prospeo-contact-scout.md",
|
|
75
|
+
"displayName": "Prospeo Contact Scout",
|
|
76
|
+
"codex": {
|
|
77
|
+
"name": "prospeo_contact_scout",
|
|
78
|
+
"filename": "prospeo-contact-scout.toml",
|
|
79
|
+
"description": "Sellable lead-source scout for Prospeo account/domain and broad contact expansion.",
|
|
80
|
+
"modelReasoningEffort": "medium",
|
|
81
|
+
"sandboxMode": "read-only",
|
|
82
|
+
"nicknameCandidates": [
|
|
83
|
+
"Prospeo Contact Scout",
|
|
84
|
+
"Domain Scout",
|
|
85
|
+
"Contact Scout"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
"claude": {
|
|
89
|
+
"name": "lead-explorer-prospeo",
|
|
90
|
+
"filename": "lead-explorer-prospeo.md",
|
|
91
|
+
"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.",
|
|
92
|
+
"model": "inherit",
|
|
93
|
+
"background": true,
|
|
94
|
+
"maxTurns": 8,
|
|
95
|
+
"color": "green",
|
|
96
|
+
"tools": [
|
|
97
|
+
"Read",
|
|
98
|
+
"Grep",
|
|
99
|
+
"Glob",
|
|
100
|
+
"mcp__sellable__get_provider_prompt",
|
|
101
|
+
"mcp__sellable__load_csv_domains",
|
|
102
|
+
"mcp__sellable__save_domain_filters",
|
|
103
|
+
"mcp__sellable__search_prospeo"
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
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: `get_provider_prompt({ provider: "sales-nav", confirmed: true })`.
|
|
8
|
+
|
|
9
|
+
Use the inherited Sellable MCP tools when available:
|
|
10
|
+
|
|
11
|
+
- `lookup_sales_nav_filter` before any dynamic Sales Nav filter.
|
|
12
|
+
- `search_sales_nav` for campaignless preview searches.
|
|
13
|
+
|
|
14
|
+
Process:
|
|
15
|
+
|
|
16
|
+
1. Read the campaign brief, kickoff doc, or lane prompt supplied by the parent.
|
|
17
|
+
2. Preserve target role names with `CURRENT_TITLE` lookups; do not rely on seniority alone when the brief names concrete roles.
|
|
18
|
+
3. When `lookup_sales_nav_filter` returns multiple title options, choose the closest semantic title match instead of the first result.
|
|
19
|
+
4. Build a broad-but-reasonable baseline from role/title, geography, company size, industry/account context, and recent LinkedIn activity when relevant.
|
|
20
|
+
5. Run the baseline plus 1-2 refinements if the first pass is noisy or under-scaled.
|
|
21
|
+
6. 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.
|
|
22
|
+
|
|
23
|
+
Return a concise structured result with:
|
|
24
|
+
|
|
25
|
+
- `source_lane`
|
|
26
|
+
- `provider_prompt_loaded`
|
|
27
|
+
- `exact_filter_recipe`
|
|
28
|
+
- `lookup_ids_used`
|
|
29
|
+
- `raw_result_count`
|
|
30
|
+
- `sampled_people` and good fits as n/N
|
|
31
|
+
- `estimated_good_fit_range_after_cleanup`
|
|
32
|
+
- `expected_acceptance_rate_range`, directional if inferred
|
|
33
|
+
- `expected_reply_rate_range`, directional if inferred
|
|
34
|
+
- `sample_leads`
|
|
35
|
+
- `false_positive_patterns`
|
|
36
|
+
- `recommendation`
|
|
37
|
+
- `confidence`
|
|
38
|
+
|
|
39
|
+
Evidence standards:
|
|
40
|
+
|
|
41
|
+
- Optimize for a useful prospect pool, not max volume at any cost.
|
|
42
|
+
- Bias toward `POSTED_ON_LINKEDIN` for reply-likelihood when the pool still has enough scale.
|
|
43
|
+
- Do not hand-wave missing filter IDs.
|
|
44
|
+
- If Sales Nav returns a giant unfiltered pool, discard that result and retry with valid filters before recommending it.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sellable/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.69",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Sellable MCP server for Claude Code and Codex campaign workflows",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
},
|
|
37
37
|
"files": [
|
|
38
38
|
"dist",
|
|
39
|
+
"agents",
|
|
39
40
|
"skills",
|
|
40
41
|
".claude-plugin",
|
|
41
42
|
".mcp.json",
|
|
@@ -99,10 +99,17 @@ denominator, and sample basis.
|
|
|
99
99
|
|
|
100
100
|
When the user has not supplied a source and multiple source angles are viable,
|
|
101
101
|
scout those angles as independent branches when the host can actually do it:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
LinkedIn Engagement / active post engagers (internal `signal-discovery`
|
|
103
|
+
provider prompt), Sales Nav / title + company filters, and Prospeo Contact /
|
|
104
|
+
domains only when relevant. In Codex, explicitly spawn the named custom scouts
|
|
105
|
+
`linkedin_engagement_scout`, `sales_nav_scout`, and `prospeo_contact_scout` for
|
|
106
|
+
the credible lanes; Codex does not infer subagent fan-out from generic source
|
|
107
|
+
comparison wording. In Claude Code, invoke the generated `lead-explorer-*`
|
|
108
|
+
Task/Agent subagents for all credible lanes in one assistant message; the
|
|
109
|
+
installer writes them from the same canonical Sellable agent registry with
|
|
110
|
+
explicit Sellable MCP tool allowlists. If the host runs them sequentially, do not
|
|
111
|
+
claim they ran in parallel. In chat, call the downstream copy stage `message generation`;
|
|
112
|
+
`message-validation.md` is only an internal proof artifact.
|
|
106
113
|
|
|
107
114
|
Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
|
|
108
115
|
lines short, use indexed section labels and bullets, and translate internal
|
|
@@ -432,19 +432,22 @@ should test for this campaign. Those can run in parallel and usually take
|
|
|
432
432
|
`lead-sample.json`). Approval waits for both `lead-filter.md` and
|
|
433
433
|
`message-validation.md`, then reconciles that the selected message basis rows
|
|
434
434
|
still pass the final filter.
|
|
435
|
-
- Parallel means real parallel execution, not optimistic progress copy.
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
435
|
+
- Parallel means real parallel execution, not optimistic progress copy. For the
|
|
436
|
+
lead-source scout in Codex, explicitly spawn one named custom scout per
|
|
437
|
+
credible source lane when subagents are available: `linkedin_engagement_scout`
|
|
438
|
+
(display: LinkedIn Engagement Scout, powered by the `signal-discovery`
|
|
439
|
+
provider prompt), `sales_nav_scout` (Sales Nav Scout), and
|
|
440
|
+
`prospeo_contact_scout` (Prospeo Contact Scout). For Claude Code, explicitly
|
|
441
|
+
invoke the generated `.claude/agents/lead-explorer-*.md` Task/Agent subagents
|
|
442
|
+
for all credible lanes in one assistant message; they are installed from the
|
|
443
|
+
same canonical Sellable agent registry and carry explicit Sellable MCP tool
|
|
444
|
+
allowlists. If host subagents are unavailable, use independent MCP/tool calls
|
|
445
|
+
in the same model turn or dedicated Sellable MCP tools that perform
|
|
446
|
+
server-side `Promise.all` fan-out. If real parallel execution is not available
|
|
447
|
+
or not allowed, run the same DAG sequentially and use honest copy: `I’ll tighten the filter first,
|
|
448
|
+
then draft the message from the same sample.` Never say `kicking off two
|
|
449
|
+
workstreams`, `in parallel`, or `background` unless parallel branches were
|
|
450
|
+
actually launched.
|
|
448
451
|
- Never run a downstream stage until the active `flow.v2.json` step's
|
|
449
452
|
`requiredArtifacts` exist.
|
|
450
453
|
- Never call a tool outside the active step's `allowedTools`, and never call a
|
|
@@ -600,18 +603,24 @@ Required behavior:
|
|
|
600
603
|
- do not mutate DB-backed campaign state
|
|
601
604
|
- run a real parallel source-angle scout when the source is not supplied and at
|
|
602
605
|
least two viable source angles exist. Treat source scouting as independent
|
|
603
|
-
branches, then compare the outputs in `lead-review.md`.
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
606
|
+
branches, then compare the outputs in `lead-review.md`. In Codex, explicitly
|
|
607
|
+
spawn named custom subagents in the same turn: `linkedin_engagement_scout`,
|
|
608
|
+
`sales_nav_scout`, and `prospeo_contact_scout` for the credible lanes. Codex
|
|
609
|
+
does not infer this from generic "compare paths" wording. If the realistic
|
|
610
|
+
source set is LinkedIn Engagement + Sales Nav (Signals + Sales Nav), run both.
|
|
611
|
+
If it is LinkedIn Engagement + Prospeo Contact (Signals + Prospeo), run both.
|
|
612
|
+
If all three are credible, run all three when the host/runtime supports it.
|
|
613
|
+
In Claude Code, launch the matching `lead-explorer-signals`,
|
|
614
|
+
`lead-explorer-sales-nav`, and/or `lead-explorer-prospeo` Task/Agent subagents
|
|
615
|
+
in the same assistant message, not as sequential scout turns.
|
|
616
|
+
- Branch A: LinkedIn Engagement / active LinkedIn posts (internal provider:
|
|
617
|
+
Signals / `signal-discovery`). Search relevant keyword lanes, review
|
|
618
|
+
finalist posts, fetch top-post engagers, and estimate warm-fit volume.
|
|
610
619
|
- Branch B: Sales Nav / title + company filters. Run preview filters, inspect
|
|
611
620
|
preview rows, and estimate scalable-fit volume.
|
|
612
|
-
- Branch C: Prospeo / domains only when the campaign has a
|
|
613
|
-
path or the user supplied domains. Estimate email/contact
|
|
614
|
-
weaker LinkedIn activity.
|
|
621
|
+
- Branch C: Prospeo Contact / domains only when the campaign has a
|
|
622
|
+
domain/account path or the user supplied domains. Estimate email/contact
|
|
623
|
+
scale and call out weaker LinkedIn activity.
|
|
615
624
|
If the host cannot run these branches in parallel, run them sequentially and
|
|
616
625
|
do not claim they ran in parallel. If only one source angle is credible, say
|
|
617
626
|
that and run the best primary source plus one cheap fallback/quality check
|
|
@@ -224,8 +224,17 @@ setting: `~/.codex/config.toml` with
|
|
|
224
224
|
Source-angle comparison should be real, not implied. When the source is not
|
|
225
225
|
supplied and multiple source angles are viable, scout Signals, Sales Nav, and
|
|
226
226
|
relevant domain/contact paths as independent branches when the host can do so.
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
In Codex, explicitly spawn named custom scouts in the same turn:
|
|
228
|
+
`linkedin_engagement_scout` (LinkedIn Engagement Scout, backed by the
|
|
229
|
+
`signal-discovery` provider prompt), `sales_nav_scout` (Sales Nav Scout), and
|
|
230
|
+
`prospeo_contact_scout` (Prospeo Contact Scout) for the credible lanes. Codex
|
|
231
|
+
does not infer subagent fan-out from generic "compare paths" wording. In Claude
|
|
232
|
+
Code, invoke the generated `lead-explorer-signals`, `lead-explorer-sales-nav`,
|
|
233
|
+
and/or `lead-explorer-prospeo` Task/Agent subagents in one assistant message so
|
|
234
|
+
Claude can run the source lanes concurrently/background. These agents come from
|
|
235
|
+
the same canonical Sellable registry and must load their matching provider
|
|
236
|
+
prompt before searching. If the host runs them sequentially, keep the output
|
|
237
|
+
numeric but do not claim the source scout was parallel.
|
|
229
238
|
|
|
230
239
|
Only promise parallel post-lead work when parallel work actually started. If the
|
|
231
240
|
host cannot or should not launch background branches, say the real sequence:
|
|
@@ -341,7 +341,7 @@
|
|
|
341
341
|
"action": "run_subskill",
|
|
342
342
|
"target": "find-leads",
|
|
343
343
|
"mode": "campaignless-preview",
|
|
344
|
-
"sourceScoutRule": "When source is not user-supplied and at least two viable source angles exist, scout independent source angles with
|
|
344
|
+
"sourceScoutRule": "When source is not user-supplied and at least two viable source angles exist, scout independent source angles with real parallelism when host/tooling permits. In Codex, explicitly spawn one named custom scout per credible lane in the same turn: linkedin_engagement_scout for LinkedIn Engagement / active post engagers (internal signal-discovery provider prompt), sales_nav_scout for Sales Nav title/company/activity filters, and prospeo_contact_scout for Prospeo account/domain/contact expansion. In Claude Code, explicitly invoke the generated lead-explorer-signals, lead-explorer-sales-nav, and/or lead-explorer-prospeo Task agents / Agent subagents in one assistant message so the lanes can run concurrently/background; those agents are installed from the canonical Sellable agent registry and carry explicit Sellable MCP tool allowlists. Fallback to independent MCP/tool calls in the same model turn or dedicated Sellable MCP tools that perform server-side fan-out. Run LinkedIn Engagement + Sales Nav, LinkedIn Engagement + Prospeo Contact, or all three when credible. If real parallel execution is unavailable, run the same scouts sequentially and do not claim parallel execution. Compare outputs by raw volume, n/N sampled fit, estimated good-fit range, expected reply range, and tradeoff. Keep Signals/LinkedIn Engagement as viable when selected posts can produce ~150+ ICP-fit warm prospects before final filtering, even if Sales Nav is more scalable; when both are viable, present the choice and recommend the stronger default."
|
|
345
345
|
},
|
|
346
346
|
{
|
|
347
347
|
"action": "write_artifacts",
|
|
@@ -479,7 +479,7 @@
|
|
|
479
479
|
"parallel only if real parallel branches were launched"
|
|
480
480
|
],
|
|
481
481
|
"timeEstimate": "~2-3 min",
|
|
482
|
-
"chatRenderRule": "If real parallel MCP/tool branches or
|
|
482
|
+
"chatRenderRule": "If real parallel MCP/tool branches or host subagents were actually launched, say: 'I’m kicking off two workstreams now' and list 'Tighten the fit filter' and 'Message generation'. If not, do not mention parallel/background work; say: 'I’ll tighten the filter first, then run message generation from the same approved brief and sample leads.' Never claim parallelism unless parallel execution actually started. User-facing stage name is message generation; message-validation.md is only the internal artifact."
|
|
483
483
|
},
|
|
484
484
|
{
|
|
485
485
|
"action": "ask_continue_revise_or_confirm_only_if_needed",
|
|
@@ -65,10 +65,28 @@ The kickoff doc is the resume surface. Re-open it before repeating discovery wor
|
|
|
65
65
|
|
|
66
66
|
## Execution Backend Routing
|
|
67
67
|
|
|
68
|
-
- If
|
|
68
|
+
- If Codex subagents are available, run the scout lanes with named custom
|
|
69
|
+
agents. Spawn one agent per credible lane in the same turn, then wait for all
|
|
70
|
+
lane results before synthesizing `lead-review.md`:
|
|
71
|
+
- `linkedin_engagement_scout` (display: LinkedIn Engagement Scout) for
|
|
72
|
+
active LinkedIn posts and engagers; internally this uses the
|
|
73
|
+
`signal-discovery` provider prompt plus `search_signals` /
|
|
74
|
+
`fetch_post_engagers`.
|
|
75
|
+
- `sales_nav_scout` (display: Sales Nav Scout) for Sales Navigator title,
|
|
76
|
+
company, geography, and activity filters.
|
|
77
|
+
- `prospeo_contact_scout` (display: Prospeo Contact Scout) for Prospeo
|
|
78
|
+
account/domain and verified-contact expansion.
|
|
79
|
+
- Common parallel comparisons are LinkedIn Engagement + Sales Nav, LinkedIn
|
|
80
|
+
Engagement + Prospeo Contact, or all three when each lane is credible.
|
|
81
|
+
- If Claude `Task`/`Agent` is available, deep exploration uses the file-backed
|
|
82
|
+
Claude explorer agents installed from the same canonical Sellable agent
|
|
83
|
+
registry. Launch every credible lane in the same assistant message so Claude
|
|
84
|
+
Code can run them concurrently/background:
|
|
69
85
|
- `./.claude/agents/lead-explorer-signals.md`
|
|
70
86
|
- `./.claude/agents/lead-explorer-sales-nav.md`
|
|
71
87
|
- `./.claude/agents/lead-explorer-prospeo.md`
|
|
88
|
+
- These Claude agents must have explicit Sellable MCP tool allowlists and must
|
|
89
|
+
load the matching provider prompt before searching.
|
|
72
90
|
- Else if `multi_tool_use.parallel` is available, run independent discovery calls in parallel and synthesize locally.
|
|
73
91
|
- Else run sequentially.
|
|
74
92
|
- Never claim agents were used when they were not.
|
|
@@ -236,10 +254,15 @@ Use the existing provider tools to run a small, directional probe:
|
|
|
236
254
|
If the first probe is weak or noisy and enough context exists, try 1-2 alternate hypotheses before returning.
|
|
237
255
|
If the first probe has good quality but insufficient scale, iterate 1-2 times to widen intelligently before returning.
|
|
238
256
|
When two or more source angles are viable, run the provider probes in real
|
|
239
|
-
parallel when the host/runtime allows it.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
257
|
+
parallel when the host/runtime allows it. For Codex, explicitly spawn the
|
|
258
|
+
named source scout agents above; Codex will not infer subagent fan-out from
|
|
259
|
+
general "compare sources" wording. For Claude Code, explicitly invoke the
|
|
260
|
+
matching `lead-explorer-*` Task/Agent subagents in one message instead of
|
|
261
|
+
probing one lane, waiting, then probing the next. Examples: LinkedIn Engagement
|
|
262
|
+
|
|
263
|
+
- Sales Nav, LinkedIn Engagement + Prospeo Contact, or Sales Nav + Prospeo
|
|
264
|
+
Contact. If the host cannot run them in parallel, run the same probes
|
|
265
|
+
sequentially and do not claim they ran in parallel.
|
|
243
266
|
|
|
244
267
|
Treat refinement as a measured loop:
|
|
245
268
|
|
|
@@ -400,7 +423,9 @@ Show the light-touch results and ask whether to deep-dispatch or iterate.
|
|
|
400
423
|
|
|
401
424
|
## Layer 3: Selective deep exploration
|
|
402
425
|
|
|
403
|
-
Spawn only the validated paths from Gate 1.
|
|
426
|
+
Spawn only the validated paths from Gate 1. In Claude Code, invoke all selected
|
|
427
|
+
`lead-explorer-*` agents in one turn so source scouting is concurrent when the
|
|
428
|
+
runtime supports it.
|
|
404
429
|
|
|
405
430
|
- `lead-explorer-signals`
|
|
406
431
|
- `lead-explorer-sales-nav`
|