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