@sellable/mcp 0.1.148 → 0.1.150

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.
@@ -143,11 +143,34 @@ why. Do not call `search_signals`, `search_sales_nav`, `search_prospeo`,
143
143
  `fetch_post_engagers`, or provider-scoped subagents until the user approves this
144
144
  source plan or explicitly chooses a different source.
145
145
 
146
+ For hiring-led campaigns, do not default to Sales Nav just because the target is
147
+ a role search. Prospeo is the primary lane when the brief asks for companies
148
+ actively hiring specific roles, open-role signals, account/contact coverage, or
149
+ verified contacts at hiring companies because `search_prospeo` supports
150
+ `company_job_posting_hiring_for` and `company_job_posting_quantity`. Signal
151
+ Discovery can be a parallel or fallback lane when relevant hiring conversations
152
+ are likely. Sales Nav is useful for recent LinkedIn activity, role/title
153
+ precision, and referral paths, but it does not provide hiring-by-role filters;
154
+ say that distinction plainly in the source-plan gate.
155
+
146
156
  After scouting, ask for a second approval on the concrete source action. For
147
157
  Signal Discovery, name how many selected posts will be scraped, the target
148
158
  engager/source-candidate volume, and the bounded review-batch size. For Sales
149
- Nav or Prospeo, name the specific approved import lane. Do not call
150
- `import_leads` or `confirm_lead_list` until this second approval is granted.
159
+ Nav or Prospeo, name the specific approved import lane and source lead count.
160
+ Do not call `import_leads` or `confirm_lead_list` until this second approval is
161
+ granted.
162
+
163
+ For Sales Nav and Prospeo, the second gate approves materializing the source
164
+ lead list, not importing only the review batch. Use the first-page/sample review
165
+ to calculate projected good fits: sampled fit rate after conservative cleanup,
166
+ raw pool size, source target, and expected good-fit count. If the projected
167
+ good-fit pool is below the campaign target (normally about 150+ usable
168
+ prospects unless source defaults say otherwise), keep refining/broadening
169
+ filters before asking for import approval. Once it clears target, approve
170
+ `import_leads` with the source-list `targetLeadCount` (up to the raw count or
171
+ provider max). Only after the source list is ready should `confirm_lead_list`
172
+ clone the bounded review batch into the campaign table.
173
+
151
174
  For Signal Discovery, the customer-facing approval card must use the exact
152
175
  action shape "Approve scraping N Signal Discovery posts?" and the chat summary
153
176
  should be a compact `## Source Recommendation` block with:
@@ -158,12 +181,13 @@ should be a compact `## Source Recommendation` block with:
158
181
  - planning floor: continue with Signal Discovery only when sampled/projected
159
182
  fit is at least 10% after cleanup; below that, move to Sales Nav recent
160
183
  activity instead of scraping noisy engagers
161
- - review checkpoint: import the first 25 leads for fit and message review
184
+ - review checkpoint: after the source list exists, clone only the bounded
185
+ review batch into the campaign for fit and message review
162
186
  - a selected-post table with post author/topic, why it fits, and visible
163
187
  engagement
164
188
  - total visible pool and estimated good-fit pool
165
- - first pass: build the source list, then import only the review
166
- batch
189
+ - first pass: build the source list at the approved source-candidate target,
190
+ then clone only the bounded review batch into the campaign
167
191
  - fallback: switch to Sales Nav recent activity if sampled/projected fit falls
168
192
  below 10%, or if the review batch is vendor-heavy, agency-heavy, or off-ICP
169
193
 
@@ -171,7 +195,8 @@ When the user has not supplied a source and multiple source angles are viable,
171
195
  scout those angles as independent branches when the host can actually do it:
172
196
  LinkedIn Engagement / active post engagers (internal `signal-discovery`
173
197
  provider prompt), Sales Nav / title + company filters, and Prospeo Contact /
174
- domains only when relevant. In Codex, explicitly spawn the named custom scouts
198
+ domains, hiring filters, or broad verified-contact expansion when relevant. In
199
+ Codex, explicitly spawn the named custom scouts
175
200
  `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
176
201
  `source-scout-prospeo-contact` for the credible lanes only when the current host
177
202
  exposes those names; Codex does not infer subagent fan-out from generic source
@@ -193,16 +218,16 @@ that we are pulling sample engagers from these posts to confirm the ICP is
193
218
  actually engaging and the source is viable.
194
219
 
195
220
  After the bounded review batch exists, use the same registry pattern for
196
- post-lead work. The create-campaign-v2 subskill calls
197
- `get_post_find_leads_scout_registry`, then launches the returned
198
- message-generation scout immediately when real subagents are available and the
199
- current session exposes the returned name. If the user chooses filters, launch
200
- the filter-leads scout then and join it with the already-running or completed
201
- message draft before message review. Workflow cell execution still waits for
202
- filter and template approval. AI Generated is an explicit opt-out that cancels
203
- or ignores the background template draft. If the post-lead agents are absent,
204
- the main thread still orchestrates the same branches from the compact context
205
- with MCP tools/assets.
221
+ post-lead work, but do not load that registry or any deep filter/message prompt
222
+ before the filter-choice question. After `confirm_lead_list`, ask add filters
223
+ vs skip filters immediately. Once the user answers, launch the message scout
224
+ from the same campaign/table basis. If the user chooses filters, also launch the
225
+ filter-leads scout, move to Filter Rules, save rubrics, then keep the browser on
226
+ Filter Leads while the message recommendation is reviewed. If the user skips
227
+ filters, move to Messages/message review. Workflow cell execution still waits
228
+ for filter and template approval. AI Generated is an explicit opt-out from the
229
+ template path. If the post-lead agents are absent, the main thread still
230
+ orchestrates the same branches from the compact context with MCP tools/assets.
206
231
 
207
232
  Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
208
233
  lines short, use indexed section labels and bullets, and translate internal
@@ -631,13 +656,16 @@ updates.
631
656
  call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
632
657
  so the watched app moves to Filter Rules while rubrics are drafted/saved.
633
658
  After rubrics save, move the watched app to `apply-icp-rubric` / Filter
634
- Leads and say the fit rules are saved; approve the message template next
635
- while the browser stays on Filter Leads. After approval, save the template
636
- to the campaign brief, then queue the bounded review-batch `enrichCellId`
637
- cells to kick off enrichment/filtering. Move to Messages only after at
638
- least one review row passes and Generate Message cells are running or ready.
639
- Product Generate Message cells must not run from the background template
640
- path before that template/token approval.
659
+ Leads and say the fit rules are saved; the background message scout is
660
+ preparing the message recommendation and approval comes next while the
661
+ browser stays on Filter Leads. If filters are skipped, move the watched app to
662
+ Messages/message review and wait for message approval there. After approval,
663
+ save the template to the campaign brief, then queue the bounded review-batch
664
+ `enrichCellId` cells to kick off enrichment/filtering. Move to Messages only
665
+ after at least one review row passes and Generate Message cells are running or
666
+ ready.
667
+ Product Generate Message cells must not run before that template/token
668
+ approval.
641
669
  Do not ask the user to approve the brief before shell creation unless they
642
670
  explicitly requested a no-write draft; the shell itself is the review surface.
643
671
  6. The main thread owns watch navigation. Call
@@ -21,10 +21,12 @@
21
21
  "priority": 3,
22
22
  "useWhen": [
23
23
  "You need technology stack targeting",
24
- "You need bulk domain list targeting",
25
24
  "You need high volume and can accept lower reply rates"
26
25
  ],
27
- "avoidWhen": ["High reply rate and LinkedIn activity are the top priority"],
26
+ "avoidWhen": [
27
+ "The user supplied a company-domain list; use Prospeo domainFilterId first",
28
+ "High reply rate and LinkedIn activity are the top priority"
29
+ ],
28
30
  "reason": "Best for scale and firmographic/technographic filters, but lower LinkedIn activity by default.",
29
31
  "prose": "Since you need to find **{icp}**, I'd recommend **Apollo**.\n\nHere's why:\n- Apollo has technology filters that other sources don't\n- We can find people at companies using {techStack}\n- Heads up: reply rates will be lower since not all leads are active on LinkedIn\n\nShould I search Apollo for {techStack} users?"
30
32
  },
@@ -21,11 +21,12 @@
21
21
  "priority": 2,
22
22
  "useWhen": [
23
23
  "You want Prospeo filters or domain-based search",
24
+ "You need companies hiring for specific roles using job-posting filters",
24
25
  "You need high deliverability from Prospeo"
25
26
  ],
26
27
  "avoidWhen": ["You need LinkedIn activity filters"],
27
- "reason": "Strong for Prospeo-specific filters and domain lists.",
28
- "prose": "Since you're targeting **{icp}**, I'd recommend **Prospeo**.\n\nHere's why:\n- Prospeo has strong domain-based search and deliverability\n- We can find verified contacts at your target companies\n- Good for high-deliverability outreach\n\nShould I search Prospeo for {icp}?"
28
+ "reason": "Strong for hiring-led search, Prospeo-specific filters, verified contacts, and domain lists.",
29
+ "prose": "Since you're targeting **{icp}**, I'd recommend **Prospeo**.\n\nHere's why:\n- Prospeo can filter for companies hiring specific roles with job-posting filters\n- We can pair those company hiring signals with buyer/referrer titles\n- Good for verified-contact coverage when Sales Nav cannot filter by hiring role\n\nShould I search Prospeo for {icp}?"
29
30
  },
30
31
  "askOption": {
31
32
  "label": "Prospeo",
@@ -53,7 +53,29 @@ Activity Filters (use one or both):
53
53
 
54
54
  Sales Nav works without these filters too -- just expect lower reply rates.
55
55
 
56
- ### 3. Apollo (LAST RESORT FOR VOLUME)
56
+ ### 3. Prospeo (HIRING / ACCOUNT / VERIFIED-CONTACT EXPANSION)
57
+
58
+ Prospeo is the main lane when the user's direction points to database filters
59
+ that LinkedIn sources do not expose.
60
+
61
+ USE WHEN:
62
+
63
+ - Hiring-led targeting: companies actively hiring specific roles
64
+ - Named-account or domain-list targeting
65
+ - Broad persona expansion where verified contact coverage matters
66
+ - You need `company_job_posting_hiring_for`,
67
+ `company_job_posting_quantity`, funding, headcount, or domain filters
68
+
69
+ SKIP WHEN:
70
+
71
+ - The campaign is mainly about fresh LinkedIn activity or engagement warmth
72
+ - Signal Discovery can clearly produce enough ICP-fit engagers
73
+
74
+ WHY: Prospeo is the only current provider with company job-posting filters by
75
+ role. Sales Nav is stronger for recent LinkedIn activity, but not for
76
+ hiring-by-role filtering.
77
+
78
+ ### 4. Apollo (LAST RESORT FOR VOLUME)
57
79
 
58
80
  Large database but leads may not be active on LinkedIn.
59
81
 
@@ -74,25 +96,30 @@ Is your ICP LinkedIn-active (founders, sales, marketing, GTM, engineers)?
74
96
  NO -> Sales Navigator + POSTED_ON_LINKEDIN (4x reply rates)
75
97
  NO -> Sales Navigator (with or without POSTED_ON_LINKEDIN)
76
98
 
99
+ Need hiring-by-role filters? -> Prospeo (has company job-posting filters)
77
100
  Need tech stack targeting? -> Apollo (has technology filters)
78
- Have specific company names? -> Sales Navigator or Apollo with domains
101
+ Have specific company names/domains? -> Sales Navigator for small lists or Prospeo with domainFilterId
79
102
  ```
80
103
 
81
104
  ## ICP-to-Provider Quick Reference
82
105
 
83
- | ICP Type | Recommended | Why |
84
- | ------------------------- | ---------------- | ---------------------------------------------------- |
85
- | Founders, CEOs | Signal Discovery | Highly active on LinkedIn, lots of founder content |
86
- | Sales/GTM leaders | Signal Discovery | Very active, tons of sales content |
87
- | Marketing leaders | Signal Discovery | Active, lots of marketing content |
88
- | Engineers/DevOps | Signal Discovery | Active on tech discussions, open source |
89
- | Enterprise CTOs | Sales Navigator | Less public engagement, use POSTED_ON_LINKEDIN |
90
- | Procurement/Ops | Sales Navigator | Rarely engage publicly |
91
- | Few specific companies | Sales Navigator | Use CURRENT_COMPANY filter (lookup each company) |
92
- | Company domain list (ABM) | Apollo | Has `q_organization_domains_list` for bulk targeting |
93
- | Tech stack users | Apollo | Has technology filters |
94
-
95
- **Default:** Try Signal Discovery first. Fall back to Sales Navigator if ICP is too niche.
106
+ | ICP Type | Recommended | Why |
107
+ | ------------------------- | ---------------- | -------------------------------------------------- |
108
+ | Founders, CEOs | Signal Discovery | Highly active on LinkedIn, lots of founder content |
109
+ | Sales/GTM leaders | Signal Discovery | Very active, tons of sales content |
110
+ | Marketing leaders | Signal Discovery | Active, lots of marketing content |
111
+ | Engineers/DevOps | Signal Discovery | Active on tech discussions, open source |
112
+ | Enterprise CTOs | Sales Navigator | Less public engagement, use POSTED_ON_LINKEDIN |
113
+ | Procurement/Ops | Sales Navigator | Rarely engage publicly |
114
+ | Few specific companies | Sales Navigator | Use CURRENT_COMPANY filter (lookup each company) |
115
+ | Hiring-led targeting | Prospeo | Has company job-posting filters by role |
116
+ | Company domain list (ABM) | Prospeo | Uses `domainFilterId` for domain targeting |
117
+ | Tech stack users | Apollo | Has technology filters |
118
+
119
+ **Default:** Try Signal Discovery first only when there is no stronger source
120
+ direction and the ICP is plausibly active in public LinkedIn conversations. Fall
121
+ back to Sales Navigator if ICP is too niche. Use Prospeo first when the ask is
122
+ hiring-led, account/domain-led, or broad verified-contact expansion.
96
123
 
97
124
  ## ABM / Account-Based Targeting
98
125
 
@@ -103,10 +130,10 @@ When user has a list of target companies:
103
130
  - Requires looking up each company individually
104
131
  - Can combine with POSTED_ON_LINKEDIN for active users
105
132
 
106
- - **Many companies (domain list):** Use Apollo with `q_organization_domains_list`
107
- - Supports bulk domain upload (up to 190 per search)
108
- - Example: `filters: { q_organization_domains_list: ["stripe.com", "notion.so", "figma.com"] }`
109
- - Trade-off: No POSTED_ON_LINKEDIN equivalent, so reply rates may be lower
133
+ - **Many companies (domain list):** Use Prospeo with `domainFilterId`
134
+ - Supports large domain filters through `load_csv_domains` or `save_domain_filters`
135
+ - Example: create a domain filter for `stripe.com`, `notion.so`, and `figma.com`, then pass `domainFilterId` into `search_prospeo`
136
+ - Trade-off: No POSTED_ON_LINKEDIN equivalent, so LinkedIn activity warmth may be lower
110
137
 
111
138
  ## Recommendation Templates
112
139
 
@@ -141,6 +168,19 @@ Here's why:
141
168
  Should I search for active {icp} on Sales Navigator?
142
169
  ```
143
170
 
171
+ **Prospeo (hiring-led ICP):**
172
+
173
+ ```
174
+ Since this campaign depends on companies actively hiring for **{roleThemes}**, I'd recommend **Prospeo** first.
175
+
176
+ Here's why:
177
+ - Prospeo can filter companies by open-role themes using job-posting filters
178
+ - We can pair those hiring signals with founder, GTM, recruiting, or revenue-owner contacts
179
+ - Sales Nav is useful for LinkedIn activity and referrals, but it cannot filter companies by hiring role
180
+
181
+ Should I search Prospeo for companies hiring {roleThemes} and the right hiring-owner contacts?
182
+ ```
183
+
144
184
  **Apollo (tech stack targeting):**
145
185
 
146
186
  ```
@@ -154,17 +194,17 @@ Here's why:
154
194
  Should I search Apollo for {techStack} users?
155
195
  ```
156
196
 
157
- **Apollo ABM (company domains):**
197
+ **Prospeo ABM (company domains):**
158
198
 
159
199
  ```
160
- Since you have a **list of target companies**, I'd recommend **Apollo** with domain targeting.
200
+ Since you have a **list of target company domains**, I'd recommend **Prospeo** with a domain filter.
161
201
 
162
202
  Here's why:
163
- - Apollo supports bulk domain lists (up to 190 companies per search)
203
+ - Prospeo is the campaign-default path for supplied company-domain lists
204
+ - We'll create a `domainFilterId` from the CSV or pasted domains before searching
164
205
  - We can find decision-makers at your exact target accounts
165
- - Just share the domains (e.g., stripe.com, notion.so) and I'll find your ICP at those companies
166
206
 
167
- Note: Reply rates may be lower than Signal Discovery or Sales Nav with POSTED_ON_LINKEDIN, since we can't filter for LinkedIn activity. Consider combining with a strong personalized message.
207
+ Note: LinkedIn activity warmth may be lower than Signal Discovery or Sales Nav with POSTED_ON_LINKEDIN, so we should inspect the first review batch before scaling.
168
208
 
169
209
  Can you share your target company domains?
170
210
  ```
@@ -179,7 +219,8 @@ Do not hardcode provider options. Build them from the framework:
179
219
  - If user already has some other list shape that does not fit those CSV paths -> proceed with provider selection
180
220
  - If the user specifies a provider or research plan -> treat that as a hard override
181
221
  - Else if `providerPreference` override exists -> recommend that provider
182
- - Else use the decision hierarchy above (Signal Discovery -> Sales Nav -> Apollo)
222
+ - Else use the decision hierarchy above only when there is no stronger source
223
+ direction (Signal Discovery -> Sales Nav -> Prospeo -> Apollo)
183
224
  2. Build options from `providerOrder` and `framework.providers[providerId].askOption`
184
225
  3. Mark the recommended option by appending " (Recommended)" if needed
185
226
 
@@ -126,6 +126,16 @@ Default source order when the user has not supplied a source:
126
126
  3. broader Sales Nav role/title filters
127
127
  4. Prospeo account/contact expansion
128
128
 
129
+ Use that order only when the brief has no stronger sourcing constraint. If the
130
+ campaign is hiring-led, asks for companies actively hiring specific roles, asks
131
+ for open-role/job-posting signals, or needs verified contacts at companies with
132
+ those hiring signals, start with Prospeo. Prospeo supports
133
+ `company_job_posting_hiring_for` and `company_job_posting_quantity`; Sales Nav
134
+ does not provide hiring-by-role filters. For those campaigns, Signal Discovery
135
+ can be a conversation-signal check if relevant hiring posts are likely, and
136
+ Sales Nav is a LinkedIn activity/referral fallback rather than the main hiring
137
+ filter.
138
+
129
139
  Before any provider prompt, search, source scout, or signal-discovery call,
130
140
  show a short source-plan gate and ask for approval. This first approval
131
141
  authorizes source scouting/search only. The gate must say, in plain language:
@@ -162,14 +172,30 @@ the target engager/source-candidate volume, the bounded campaign review-batch
162
172
  size, the cleanup risk, and the fallback if the selected posts look wrong. The
163
173
  approval label must describe the action with the count, such as "Approve
164
174
  scraping 3 Signal Discovery posts?" For Sales Nav or Prospeo, the label should
165
- name the specific search/import lane. Do not call `import_leads` or
166
- `confirm_lead_list` until this second source-action approval is granted.
175
+ name the specific search/import lane and source lead count. Do not call
176
+ `import_leads` or `confirm_lead_list` until this second source-action approval
177
+ is granted.
178
+
179
+ For Sales Nav and Prospeo, do not ask to import only the 25-row review batch at
180
+ the source-action gate. First-page samples are for source math: compute sampled
181
+ fit after conservative cleanup, project how many good-fit prospects the raw
182
+ pool can yield, and keep refining filters while the projected good-fit pool is
183
+ below the campaign target (normally about 150+ usable prospects unless the
184
+ campaign/source defaults say otherwise). Once the lane clears the target, ask
185
+ approval to materialize the source list with
186
+ `targetLeadCount = min(rawResultCount, providerMax, ceil(targetGoodFitLeads /
187
+ projectedFitRateAfterCleanup))`. After that source list is ready,
188
+ `confirm_lead_list` imports only the bounded review batch into the campaign
189
+ table for fit and message review.
190
+
167
191
  After the user approves this concrete source-action gate, do not show the
168
192
  Source Recommendation again and do not ask another source approval question.
169
193
  Acknowledge once, then call `import_leads` immediately with the approved source
170
- math. For Signal Discovery, pass `provider: "signal-discovery"`,
171
- `targetEngagerCount`, `maxPostsToScrape`, and `confirmed: true`; the tool owns
172
- moving the watch UI to source-list progress after a lead-list/job id exists.
194
+ math. For Sales Nav/Prospeo, pass `targetLeadCount` as the approved source-list
195
+ export count, not the review-batch size. For Signal Discovery, pass
196
+ `provider: "signal-discovery"`, `targetEngagerCount`, `maxPostsToScrape`, and
197
+ `confirmed: true`; the tool owns moving the watch UI to source-list progress
198
+ after a lead-list/job id exists.
173
199
 
174
200
  For Signal Discovery, use this compact source-action approval shape after
175
201
  selected posts exist:
@@ -182,7 +208,7 @@ Use Signal Discovery first.
182
208
  **Good-fit target:** ~150 prospects after cleanup, enrichment, and filters<br>
183
209
  **Source-candidate plan:** scrape ~1,000 raw engagers using a conservative 15% fit-rate assumption<br>
184
210
  **Planning floor:** continue only when sampled/projected fit is at least 10% after cleanup; below that, switch to Sales Nav recent activity<br>
185
- **Review checkpoint:** import the first 25 leads into the campaign for fit and message review before scaling<br>
211
+ **Review checkpoint:** after the source list exists, clone only the bounded review batch into the campaign for fit and message review<br>
186
212
 
187
213
  ### Selected posts
188
214
 
@@ -203,8 +229,9 @@ This gives enough volume to work toward ~150 good-fit prospects, while
203
229
  keeping the source tied to people already engaging with Claude Code outbound /
204
230
  AI-native sales workflows.
205
231
 
206
- **First pass:** build the source list, then import only the 25-lead review
207
- batch so we can inspect fit and messages before scaling.
232
+ **First pass:** build the source list at the approved source-candidate target,
233
+ then clone only the bounded review batch into the campaign so we can inspect
234
+ fit and messages before sending.
208
235
 
209
236
  **Fallback:** if sampled/projected fit falls below 10%, or if the review batch
210
237
  is too vendor-heavy, agency-heavy, or off-ICP, switch to Sales Nav recent
@@ -214,7 +241,11 @@ activity.
214
241
  A source recommendation must show concrete evidence: source lane, filters or
215
242
  recipe, raw volume, sample size, sampled fits as n/N plus percentage/range,
216
243
  estimated usable prospects, cleanup risk, runner-up, and what approval
217
- authorizes.
244
+ authorizes. For Sales Nav/Prospeo it must also show source export math:
245
+ `rawResultCount`, `sampledFitRate`, conservative projected fit rate,
246
+ `targetLeadCount` for the source list, and projected good-fit count from that
247
+ export. If projected good-fit count is below target, the recommendation is to
248
+ refine or broaden filters, not to import a 25-row batch.
218
249
 
219
250
  Supplied profile CSVs, company/domain CSVs, pasted domains, and existing
220
251
  Sellable lead lists are supported, but keep provider mechanics out of the first
@@ -223,24 +254,28 @@ customer-facing source-choice labels.
223
254
  ## Post-Lead Workstreams
224
255
 
225
256
  After `confirm_lead_list` imports a non-empty bounded review batch and
226
- `get_rows_minimal({ tableId: workflowTableId })` proves rows exist, call
227
- `get_post_find_leads_scout_registry` and start the Message Draft Builder branch
228
- immediately when the current host exposes that returned agent. Do this before
229
- asking the filter-choice question. If no real background branch can start, say
230
- the real sequence and do not claim background drafting is running.
231
-
232
- The message branch uses live CampaignOffer/source/table state as the source of
233
- truth and may draft while the user is choosing filters. It does not write
234
- message cells, enrich rows, attach sequences, or unlock Settings. The Lead Fit
235
- Builder branch starts only after the user chooses filters. Debug markdown/json
236
- artifacts are optional only.
257
+ `get_rows_minimal({ tableId: workflowTableId })` proves rows exist, ask the
258
+ filter-choice question immediately. Do not call
259
+ `get_post_find_leads_scout_registry`, load filter/message subskill prompts, or
260
+ spawn post-lead workers before that question. The only customer-facing work
261
+ before the question should be a short review-batch summary and the choice:
262
+ add filters, skip filters, or revise source.
263
+
264
+ If the user chooses filters, then load the post-lead registry/reference needed
265
+ for filtering and start the Lead Fit Builder. Also start the Message Draft
266
+ Builder in the background from the same campaign/table basis as soon as the
267
+ filter-choice answer is known. If the user skips filters, move the watched app to
268
+ Messages and run the Message Draft Builder there. Debug markdown/json artifacts
269
+ are optional only.
237
270
 
238
271
  When the user chooses filters, immediately call
239
272
  `update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
240
273
  before rubric thinking or branch work. The watched app should move to Filter
241
274
  Rules quickly. After `save_rubrics`, the watched app should move to
242
275
  `apply-icp-rubric` / Filter Leads so the user can see the saved filters are
243
- ready before message approval unlocks any enrichment or filtering.
276
+ ready and wait there for the background message agent. Tell the user explicitly
277
+ that a message agent is drafting the first-message template while enrichment,
278
+ filtering, and Generate Message cells remain blocked.
244
279
 
245
280
  Lead Fit Builder persists production rubrics with `save_rubrics` when filters
246
281
  are enabled. It must not require `brief.md`, `lead-review.md`, or
@@ -274,14 +274,18 @@ keep the output numeric but do not claim the source scout was parallel or
274
274
  surface install status to the customer.
275
275
 
276
276
  For post-lead work, call `get_post_find_leads_scout_registry` after
277
+ the user chooses filters, not before the filter-choice question. After
277
278
  `confirm_lead_list` imports a non-empty bounded review batch and
278
- `get_rows_minimal` proves rows exist. Start `post-find-leads-message-scout`
279
- immediately when real subagents are available, before asking the filter-choice
280
- question. Start `post-find-leads-filter-scout` only after the user chooses
281
- filters. This is the same registry pattern as source scouting, but the trigger
282
- for message drafting is review-batch import, not filter approval. The join gate
283
- is live branch readiness: saved rubrics or a resolved skip-filter choice, plus a
284
- message recommendation grounded in the same campaign/table basis.
279
+ `get_rows_minimal` proves rows exist, ask add-filters vs skip-filters
280
+ immediately. Once the user answers, start `post-find-leads-message-scout` /
281
+ message generation from the same campaign/table basis. If the user chooses
282
+ filters, also start `post-find-leads-filter-scout`, move the browser to Filter
283
+ Rules, save rubrics, then keep the browser on Filter Leads while the message
284
+ recommendation is reviewed. If the user skips filters, move the browser to
285
+ Messages/message review. The join gate is live branch readiness: saved rubrics
286
+ or a resolved skip-filter choice, plus a message recommendation grounded in the
287
+ same campaign/table basis. Enrichment, filtering, and product Generate Message
288
+ cells still wait for template approval.
285
289
 
286
290
  Only promise parallel post-lead work when parallel work actually started. If the
287
291
  host cannot or should not launch background branches, say the real sequence: