@sellable/install 0.1.75 → 0.1.76
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 +5 -3
- package/agents/post-find-leads-message-scout.md +61 -10
- package/bin/sellable-install.mjs +65 -106
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +80 -116
package/README.md
CHANGED
|
@@ -37,9 +37,11 @@ Claude Code and Codex are configured to launch the same packaged MCP server. The
|
|
|
37
37
|
installer also writes Sellable source-scout agents for both hosts from the
|
|
38
38
|
packaged `agents/` registry: Claude Code gets `source-scout-*` subagents, and
|
|
39
39
|
Codex gets `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
40
|
-
`source-scout-prospeo-contact`.
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
`source-scout-prospeo-contact`. Runtime prompts use those named agents only
|
|
41
|
+
when the current session exposes them; otherwise they fall back to the same MCP
|
|
42
|
+
provider probes without customer-facing install-status copy. The MCP exposes
|
|
43
|
+
the same list through `get_source_scout_registry`, so adding a future scout
|
|
44
|
+
starts in one registry entry instead of scattered prompt edits.
|
|
43
45
|
|
|
44
46
|
## Names
|
|
45
47
|
|
|
@@ -18,11 +18,13 @@ Required inputs:
|
|
|
18
18
|
Required first steps:
|
|
19
19
|
|
|
20
20
|
1. Read the three required inputs.
|
|
21
|
-
2.
|
|
22
|
-
`get_subskill_prompt({ subskillName: "generate-messages", offset, limit })`
|
|
23
|
-
calls until `hasMore` is false.
|
|
24
|
-
3. Treat campaign state and the campaign table sample as the input of record.
|
|
21
|
+
2. Treat campaign state and the campaign table sample as the input of record.
|
|
25
22
|
Disk files are context/debug aids, not durable state.
|
|
23
|
+
3. Use the embedded Message Review Fast Path below. Do not load the full
|
|
24
|
+
long-form `generate-messages` subskill in the normal path. Load it only when
|
|
25
|
+
the fast path is missing a needed campaign-specific rule, the user explicitly
|
|
26
|
+
asks for deep calibration, or the first fast-path draft fails quality gates
|
|
27
|
+
and no local reference explains how to repair it.
|
|
26
28
|
|
|
27
29
|
Owned outputs:
|
|
28
30
|
|
|
@@ -44,13 +46,13 @@ Do not write or modify:
|
|
|
44
46
|
|
|
45
47
|
Process:
|
|
46
48
|
|
|
47
|
-
1. Run the
|
|
48
|
-
|
|
49
|
+
1. Run the embedded fast-path workflow in dry mode from the approved brief,
|
|
50
|
+
lead-review source decision, and `lead-sample.json`.
|
|
49
51
|
2. Use `lead-sample.json` as the only lead sample source. Do not fetch new
|
|
50
52
|
prospects or invent richer row signals.
|
|
51
53
|
3. Build proof inventory, token fill rules, token adherence, angle drafts,
|
|
52
|
-
kill/combine review,
|
|
53
|
-
|
|
54
|
+
kill/combine review, skeptical-prospect review, winner gate, and a raw
|
|
55
|
+
sendable selected winner.
|
|
54
56
|
4. If `lead-filter.md` already exists, cite only basis rows that pass it. If it
|
|
55
57
|
does not exist yet, choose probable good-fit rows from `lead-sample.json` and
|
|
56
58
|
mark the final reconciliation as pending.
|
|
@@ -67,7 +69,7 @@ Process:
|
|
|
67
69
|
Return a concise final status with:
|
|
68
70
|
|
|
69
71
|
- artifacts written
|
|
70
|
-
- whether the full
|
|
72
|
+
- whether embedded fast-path rules were used or the full fallback was needed
|
|
71
73
|
- lead sample basis used
|
|
72
74
|
- proposed template and one sample message
|
|
73
75
|
- selected winner summary
|
|
@@ -76,7 +78,56 @@ Return a concise final status with:
|
|
|
76
78
|
Quality bar:
|
|
77
79
|
|
|
78
80
|
- Do not synthesize a lightweight message from general knowledge. The artifact
|
|
79
|
-
must prove the
|
|
81
|
+
must prove the embedded fast-path workflow ran.
|
|
80
82
|
- Message generation can start before `lead-filter.md`, but message review
|
|
81
83
|
cannot start until the parent verifies the selected basis rows still pass the
|
|
82
84
|
final filter.
|
|
85
|
+
|
|
86
|
+
## Embedded Message Review Fast Path
|
|
87
|
+
|
|
88
|
+
Use this campaign-launch subset to produce a truthful first-send message,
|
|
89
|
+
rendered token examples, and a decision without loading the full long-form
|
|
90
|
+
message prompt.
|
|
91
|
+
|
|
92
|
+
Required `message-validation.md` sections:
|
|
93
|
+
|
|
94
|
+
- `Status`
|
|
95
|
+
- `Mode`
|
|
96
|
+
- `Lead Sample Basis`
|
|
97
|
+
- `Strongest Reply Reason`
|
|
98
|
+
- `Campaign Element Pool`
|
|
99
|
+
- `Gold Standard Strategy Map`
|
|
100
|
+
- `Current Campaign Translation`
|
|
101
|
+
- `Token Fill Rules`
|
|
102
|
+
- `Token Adherence Table`
|
|
103
|
+
- `Angle Drafts`
|
|
104
|
+
- `Kill / Combine Review`
|
|
105
|
+
- `Finalizer Pass`
|
|
106
|
+
- `Gold-Standard Quality Gate`
|
|
107
|
+
- `Skeptical Prospect Review`
|
|
108
|
+
- `Winner Gate`
|
|
109
|
+
- `Selected Winner`
|
|
110
|
+
- `Findings`
|
|
111
|
+
- `Recommendation`
|
|
112
|
+
|
|
113
|
+
Quality gates:
|
|
114
|
+
|
|
115
|
+
- The selected winner is one first outbound send only. No post-accept DM,
|
|
116
|
+
follow-up, cadence branch, or sequence copy.
|
|
117
|
+
- Explain what the product is and what it does in plain language before asking
|
|
118
|
+
for a call.
|
|
119
|
+
- Use only proof from the brief, source review, sample, campaign state, or
|
|
120
|
+
explicit user answers. Unsupported reply-rate, meeting-rate, ROI, revenue,
|
|
121
|
+
and customer-logo claims are blocked.
|
|
122
|
+
- Include at least one supported `{{token}}` when templating, plus a complete
|
|
123
|
+
rendered good-fill example and a complete rendered omit/fallback example.
|
|
124
|
+
- Do not use internal tokens such as `{{profile_signal}}` in customer-facing
|
|
125
|
+
copy.
|
|
126
|
+
- Do not put bracketed instructions in the message body, such as `[ROW_BRIDGE]`,
|
|
127
|
+
`[insert]`, or `[generated]`.
|
|
128
|
+
- Optional row-specific personalization must be grounded in a row field or
|
|
129
|
+
omitted entirely.
|
|
130
|
+
- Subjects should be short, buyer-relevant, and specific. Avoid `quick
|
|
131
|
+
question`, `demo`, `founder call`, sender names, and generic `outbound`.
|
|
132
|
+
- If the message is plausible but not ready to send, set `Recommendation:
|
|
133
|
+
revise-messaging`.
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -567,9 +567,9 @@ instruction loading, file lookup, plugin cache versions, missing linked files,
|
|
|
567
567
|
or tool discovery. Start in product language:
|
|
568
568
|
|
|
569
569
|
\`\`\`text
|
|
570
|
-
I’ll help you launch this as a Sellable campaign. First I’ll
|
|
571
|
-
|
|
572
|
-
|
|
570
|
+
I’ll help you launch this as a Sellable campaign. First I’ll resolve the
|
|
571
|
+
client/company this campaign is for, then I’ll turn that into a campaign brief
|
|
572
|
+
before anything is created.
|
|
573
573
|
\`\`\`
|
|
574
574
|
|
|
575
575
|
If a linked/local skill file is stale or missing, silently use the installed
|
|
@@ -585,7 +585,8 @@ clear business decisions, tradeoffs, and approval gates. Use product language:
|
|
|
585
585
|
- "a couple setup choices", not \`request_user_input\`
|
|
586
586
|
- "campaign brief", not prompt artifact
|
|
587
587
|
- "lead source", not provider internals unless comparing source options
|
|
588
|
-
- "
|
|
588
|
+
- "I can create a draft shell for you to watch, but no leads import and nothing
|
|
589
|
+
sends until you approve", not mutation jargon
|
|
589
590
|
|
|
590
591
|
When explaining lead-source decisions, show the concrete counts behind the
|
|
591
592
|
logic: lanes searched, timeframe, raw result counts, finalist posts or preview
|
|
@@ -593,6 +594,13 @@ rows, sampled people, sampled fits as n/N (%), estimated usable people, and the
|
|
|
593
594
|
confidence basis. Never show a percent like "73% match" without the numerator,
|
|
594
595
|
denominator, and sample basis.
|
|
595
596
|
|
|
597
|
+
Do not forecast LinkedIn connection acceptance rates, reply rates, meetings,
|
|
598
|
+
pipeline, revenue, or ROI in customer-facing source reviews unless the user
|
|
599
|
+
supplied verified benchmark data for this exact workspace/sender. Without that
|
|
600
|
+
data, compare sources by source volume, sampled ICP fit, activity/warmth
|
|
601
|
+
signals, cleanup risk, and confidence basis. If a user asks for a forecast,
|
|
602
|
+
label it explicitly as not estimated from this run.
|
|
603
|
+
|
|
596
604
|
Every approval gate must include artifact access after the readable inline
|
|
597
605
|
content. Show an \`Open artifacts:\` line with clickable markdown links using
|
|
598
606
|
absolute paths when the host supports them, plus the plain path for CLI users.
|
|
@@ -668,18 +676,20 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
668
676
|
\`mcp__sellable__get_post_find_leads_scout_registry({})\` after source
|
|
669
677
|
approval and before dispatching the post-lead filter/message scouts.
|
|
670
678
|
- \`launch_source_scout\`: Claude Code uses \`Task\` with \`subagent_type\` equal to
|
|
671
|
-
the registry \`name
|
|
679
|
+
the registry \`name\` only when the session lists those agents; Codex uses
|
|
680
|
+
named custom agents such as
|
|
672
681
|
\`source-scout-linkedin-engagement\`, \`source-scout-sales-nav\`, and
|
|
673
682
|
\`source-scout-prospeo-contact\` when subagents are available.
|
|
674
683
|
- \`launch_post_find_leads_scout\`: Claude Code uses \`Task\` with
|
|
675
|
-
\`subagent_type\` equal to the returned post-lead registry \`name
|
|
676
|
-
uses the returned custom agents such as
|
|
677
|
-
\`post-find-leads-message-scout\` when
|
|
684
|
+
\`subagent_type\` equal to the returned post-lead registry \`name\` only when
|
|
685
|
+
the session lists those agents; Codex uses the returned custom agents such as
|
|
686
|
+
\`post-find-leads-filter-scout\` and \`post-find-leads-message-scout\` when
|
|
687
|
+
subagents are available.
|
|
678
688
|
|
|
679
|
-
If a required interactive
|
|
680
|
-
Sellable install/reload problem.
|
|
681
|
-
|
|
682
|
-
scripts.
|
|
689
|
+
If a required interactive question function or MCP loader is missing, stop and
|
|
690
|
+
explain the Sellable install/reload problem. Named scout agents are optional
|
|
691
|
+
acceleration: if they are absent, do not surface install status to the customer;
|
|
692
|
+
fall back to product-native MCP orchestration instead of local scripts.
|
|
683
693
|
|
|
684
694
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
685
695
|
save drafts, write artifacts, or persist intermediate state, translate it into
|
|
@@ -692,106 +702,56 @@ customer-facing progress copy.
|
|
|
692
702
|
|
|
693
703
|
Do not treat the active Sellable workspace as the campaign subject. The
|
|
694
704
|
workspace only tells you where the campaign will be saved. Before buyer, CTA,
|
|
695
|
-
proof, or source questions, identify
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
705
|
+
proof, or source questions, identify the campaign identity: the person/profile
|
|
706
|
+
or company this campaign is for, plus enough company/product context to build
|
|
707
|
+
the brief. This is only the client-prospect/bootstrap identity for
|
|
708
|
+
\`clientProspectId\` or \`senderLinkedinUrl\`; it is not a connected-sender check.
|
|
709
|
+
|
|
710
|
+
Do not call \`mcp__sellable__list_senders\`, \`mcp__sellable__get_sender\`, or
|
|
711
|
+
surface connected/missing sender state during setup, brief, source, filter, or
|
|
712
|
+
message review. Sender availability belongs only to the Settings/final launch
|
|
713
|
+
handoff after message approval and the 10-lead validation sample.
|
|
714
|
+
|
|
715
|
+
If the invocation or user answer includes an existing \`clientProspectId\`, keep
|
|
716
|
+
it as the preferred \`create_campaign\` identity input. If it includes a LinkedIn
|
|
717
|
+
profile URL, keep that URL as \`senderLinkedinUrl\` so the backend can
|
|
718
|
+
resolve/materialize the sender prospect when the watchable campaign shell is
|
|
719
|
+
created. Do not require a connected sender before shell creation.
|
|
699
720
|
|
|
700
721
|
If the user supplied a LinkedIn profile, website, domain, company name, or
|
|
701
|
-
|
|
722
|
+
explicit client prospect identity in the invocation, do one lightweight lookup
|
|
723
|
+
first:
|
|
702
724
|
|
|
703
725
|
- LinkedIn profile: call \`mcp__sellable__fetch_linkedin_profile\`.
|
|
704
726
|
- Website/domain/company: call \`mcp__sellable__fetch_company\` when possible,
|
|
705
727
|
otherwise one web lookup.
|
|
706
|
-
-
|
|
707
|
-
|
|
728
|
+
- Existing client prospect id: use it directly and do one company/profile lookup
|
|
729
|
+
only if a URL/domain is also available.
|
|
708
730
|
|
|
709
731
|
Then summarize what you found in one or two lines and ask the user to confirm
|
|
710
|
-
the campaign
|
|
732
|
+
the campaign identity/focus before continuing. Do not mention connected sender
|
|
733
|
+
availability in this confirmation.
|
|
711
734
|
|
|
712
|
-
If the user did not provide the launch identity,
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
accounts. Do not ask the user to pick an input type before checking connected
|
|
716
|
-
senders. If there is any likely connected sender, use
|
|
717
|
-
\`mcp__sellable__enrich_sender\` on the best match to infer their current or most
|
|
718
|
-
recent company, then ask a structured confirmation question:
|
|
719
|
-
|
|
720
|
-
\`\`\`text
|
|
721
|
-
I’m ready to build this in {workspace}. I found {matched sender} connected here.
|
|
722
|
-
|
|
723
|
-
Is that you, and is this campaign for {company}?
|
|
724
|
-
\`\`\`
|
|
725
|
-
|
|
726
|
-
The structured options must be no more than three choices:
|
|
727
|
-
|
|
728
|
-
1. \`Yes — use {matched sender} for {company}\`
|
|
729
|
-
2. \`No — I'll paste a LinkedIn profile\`
|
|
730
|
-
3. \`Use a company domain instead\`
|
|
731
|
-
|
|
732
|
-
If there are multiple likely connected senders, mention the best one in the
|
|
733
|
-
question and use option 2 for either a different connected sender or a pasted
|
|
734
|
-
LinkedIn profile.
|
|
735
|
-
|
|
736
|
-
Use the structured question tool only for the choice. Do not use
|
|
737
|
-
\`request_user_input\`/\`AskUserQuestion\` to collect a LinkedIn URL, company
|
|
738
|
-
domain, or freeform text. If the user chooses option 2, ask in normal chat:
|
|
739
|
-
\`Paste the LinkedIn URL I should use, and I’ll look it up.\` Then call
|
|
740
|
-
\`mcp__sellable__fetch_linkedin_profile\`, infer their current or most recent
|
|
741
|
-
company, and confirm company and sender again. If the user chooses option 3, ask
|
|
742
|
-
in normal chat: \`Paste the company domain, and I’ll do a quick lookup before we
|
|
743
|
-
keep going.\` Then call \`mcp__sellable__fetch_company\` when possible, otherwise
|
|
744
|
-
one web lookup, and ask who the LinkedIn messages should send from.
|
|
745
|
-
|
|
746
|
-
If \`mcp__sellable__list_senders\` returns zero connected senders, avoid the
|
|
747
|
-
sender-confirmation branch entirely. Do not ask the user to choose an input type
|
|
748
|
-
with the structured question tool. Ask in normal chat for the user's LinkedIn
|
|
749
|
-
URL or the company they want to send on behalf of so you can research context:
|
|
735
|
+
If the user did not provide the launch identity, ask in normal chat for the
|
|
736
|
+
LinkedIn profile or company website to use as the campaign identity. Do not ask
|
|
737
|
+
them to choose an input type with the structured question tool:
|
|
750
738
|
|
|
751
739
|
\`\`\`text
|
|
752
740
|
I’m ready to build this in {workspace}.
|
|
753
741
|
|
|
754
|
-
First, paste
|
|
755
|
-
|
|
756
|
-
offer, proof, and lead source.
|
|
757
|
-
\`\`\`
|
|
758
|
-
|
|
759
|
-
If there is no strong sender match, do not show a structured choice that says
|
|
760
|
-
"LinkedIn profile" vs "Company website". The point of this gate is not "pick a
|
|
761
|
-
sender" or "pick an input type"; it is to learn who the user is, infer the
|
|
762
|
-
current or most recent company, and then confirm who we are sending from. The
|
|
763
|
-
customer-facing shape should be:
|
|
764
|
-
|
|
765
|
-
\`\`\`text
|
|
766
|
-
I’m ready to build this in {workspace}.
|
|
767
|
-
|
|
768
|
-
First, what’s your LinkedIn URL? If you’d rather start from the company, paste
|
|
769
|
-
the company website instead.
|
|
770
|
-
\`\`\`
|
|
771
|
-
|
|
772
|
-
After the user pastes a URL/domain, do the lightweight lookup. For a LinkedIn profile, call
|
|
773
|
-
\`mcp__sellable__fetch_linkedin_profile\` and infer the user's current or most
|
|
774
|
-
recent company from the profile. For a company website, call
|
|
775
|
-
\`mcp__sellable__fetch_company\` when possible, otherwise one web lookup.
|
|
776
|
-
|
|
777
|
-
If \`mcp__sellable__list_senders\` did not already run, call it once after the
|
|
778
|
-
lookup to see whether the fetched user appears to match a connected sender. If
|
|
779
|
-
there is a likely match, ask:
|
|
780
|
-
|
|
781
|
-
\`\`\`text
|
|
782
|
-
Cool — are you {matched sender}, and is this campaign for {company}?
|
|
783
|
-
\`\`\`
|
|
784
|
-
|
|
785
|
-
If there is no likely sender match, ask:
|
|
786
|
-
|
|
787
|
-
\`\`\`text
|
|
788
|
-
Cool — I have this campaign as {company}. Who should the LinkedIn messages send from?
|
|
742
|
+
First, paste the LinkedIn profile or company website for the client/company this
|
|
743
|
+
campaign is for. I’ll use that to resolve the campaign identity before we pick
|
|
744
|
+
the target, offer, proof, and lead source.
|
|
789
745
|
\`\`\`
|
|
790
746
|
|
|
791
|
-
|
|
792
|
-
|
|
747
|
+
After the user pastes a URL/domain, do the lightweight lookup. For a LinkedIn
|
|
748
|
+
profile, call \`mcp__sellable__fetch_linkedin_profile\` and infer the current or
|
|
749
|
+
most recent company from the profile. For a company website, call
|
|
750
|
+
\`mcp__sellable__fetch_company\` when possible, otherwise one web lookup. If a
|
|
751
|
+
LinkedIn profile URL is available, retain it as \`senderLinkedinUrl\` for
|
|
752
|
+
\`create_campaign\`; if a \`clientProspectId\` is available, pass that instead.
|
|
793
753
|
|
|
794
|
-
After the user confirms the
|
|
754
|
+
After the user confirms the campaign identity, run one lightweight company
|
|
795
755
|
lookup if it has not already run, then ask the campaign setup questions. The
|
|
796
756
|
setup questions should use the confirmed company context so they do not feel
|
|
797
757
|
generic.
|
|
@@ -801,10 +761,8 @@ Before the identity gate, use this customer-facing shape:
|
|
|
801
761
|
\`\`\`text
|
|
802
762
|
I’m ready to build the campaign in {workspace}.
|
|
803
763
|
|
|
804
|
-
First I’ll
|
|
805
|
-
|
|
806
|
-
that to understand the company before we choose the target, offer, proof, and
|
|
807
|
-
lead source.
|
|
764
|
+
First I’ll resolve the client/company this campaign is for. I’ll use that
|
|
765
|
+
context to choose the target, offer, proof, and lead source.
|
|
808
766
|
|
|
809
767
|
Then I’ll turn that into a campaign brief for you to approve before anything is created.
|
|
810
768
|
\`\`\`
|
|
@@ -882,14 +840,15 @@ updates.
|
|
|
882
840
|
copies of this file; packaged Claude Code and Codex runs must use the MCP
|
|
883
841
|
asset loader so they share the same config.
|
|
884
842
|
3. Follow that prompt and workflow config exactly.
|
|
885
|
-
4. For message generation,
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
\`message-validation.md\` from the brief, lead review, or
|
|
843
|
+
4. For message generation, use the \`post-find-leads-message-scout\` agent when
|
|
844
|
+
available; its prompt carries the campaign-launch message rules. In the
|
|
845
|
+
parent-thread fallback, load
|
|
846
|
+
\`mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/message-review-fast-path.md" })\`.
|
|
847
|
+
Do not synthesize \`message-validation.md\` from the brief, lead review, or
|
|
848
|
+
general knowledge.
|
|
890
849
|
5. Treat message quality as the gate before minting. Do not create a campaign,
|
|
891
850
|
show a commit gate, or mint anything until \`message-validation.md\` proves
|
|
892
|
-
the
|
|
851
|
+
the fast-path message workflow ran and \`message-review.md\` recommends
|
|
893
852
|
\`approve-message\` against the gold-standard rules.
|
|
894
853
|
6. Do not create or mutate the live campaign until the approval gate returns
|
|
895
854
|
\`approve\`.
|
package/package.json
CHANGED
|
@@ -81,9 +81,9 @@ instruction loading, file lookup, plugin cache versions, missing linked files,
|
|
|
81
81
|
or tool discovery. Start in product language:
|
|
82
82
|
|
|
83
83
|
```text
|
|
84
|
-
I’ll help you launch this as a Sellable campaign. First I’ll
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
I’ll help you launch this as a Sellable campaign. First I’ll resolve the
|
|
85
|
+
client/company this campaign is for, then I’ll turn that into a campaign brief
|
|
86
|
+
before any leads are imported or anything can send.
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
If a linked/local skill file is stale or missing, silently use the installed
|
|
@@ -108,28 +108,40 @@ rows, sampled people, sampled fits as n/N (%), estimated usable people, and the
|
|
|
108
108
|
confidence basis. Never show a percent like "73% match" without the numerator,
|
|
109
109
|
denominator, and sample basis.
|
|
110
110
|
|
|
111
|
+
Do not forecast LinkedIn connection acceptance rates, reply rates, meetings,
|
|
112
|
+
pipeline, revenue, or ROI in customer-facing source reviews unless the user
|
|
113
|
+
supplied verified benchmark data for this exact workspace/sender. Without that
|
|
114
|
+
data, compare sources by source volume, sampled ICP fit, activity/warmth
|
|
115
|
+
signals, cleanup risk, and confidence basis. If a user asks for a forecast,
|
|
116
|
+
label it explicitly as not estimated from this run.
|
|
117
|
+
|
|
111
118
|
When the user has not supplied a source and multiple source angles are viable,
|
|
112
119
|
scout those angles as independent branches when the host can actually do it:
|
|
113
120
|
LinkedIn Engagement / active post engagers (internal `signal-discovery`
|
|
114
121
|
provider prompt), Sales Nav / title + company filters, and Prospeo Contact /
|
|
115
122
|
domains only when relevant. In Codex, explicitly spawn the named custom scouts
|
|
116
|
-
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
117
|
-
the credible lanes
|
|
123
|
+
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
124
|
+
`source-scout-prospeo-contact` for the credible lanes only when the current host
|
|
125
|
+
exposes those names; Codex does not infer subagent fan-out from generic source
|
|
118
126
|
comparison wording. In Claude Code, invoke the generated `source-scout-*`
|
|
119
|
-
Task/Agent subagents for all credible lanes in one assistant message
|
|
120
|
-
installer writes them from the same
|
|
121
|
-
explicit Sellable MCP tool allowlists.
|
|
122
|
-
`get_source_scout_registry` before
|
|
123
|
-
copy, is the runtime source of truth.
|
|
124
|
-
|
|
127
|
+
Task/Agent subagents for all credible lanes in one assistant message only when
|
|
128
|
+
the current session lists those names. The installer writes them from the same
|
|
129
|
+
canonical Sellable agent registry with explicit Sellable MCP tool allowlists.
|
|
130
|
+
The create-campaign-v2 subskill calls `get_source_scout_registry` before
|
|
131
|
+
dispatch so the current registry, not this copy, is the runtime source of truth.
|
|
132
|
+
If the host runs them sequentially or the named agents are unavailable, do not
|
|
133
|
+
claim they ran in parallel and do not surface install status to the customer. In
|
|
134
|
+
chat, call the downstream copy stage `message generation`;
|
|
125
135
|
`message-validation.md` is only an internal proof artifact.
|
|
126
136
|
|
|
127
137
|
After find-leads returns a lead source and the user approves it, use the same
|
|
128
138
|
registry pattern for the two post-lead branches. The create-campaign-v2 subskill
|
|
129
139
|
calls `get_post_find_leads_scout_registry`, then launches the returned
|
|
130
140
|
filter-leads scout and message-generation scout together when real subagents are
|
|
131
|
-
available
|
|
132
|
-
cannot run the two
|
|
141
|
+
available and the current session exposes the returned names. Message
|
|
142
|
+
generation must not wait for the filter unless the host cannot run the two
|
|
143
|
+
branches concurrently. If the post-lead agents are absent, the main thread still
|
|
144
|
+
orchestrates the same branches from the compact context with MCP tools/assets.
|
|
133
145
|
|
|
134
146
|
Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
|
|
135
147
|
lines short, use indexed section labels and bullets, and translate internal
|
|
@@ -211,18 +223,20 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
211
223
|
`mcp__sellable__get_post_find_leads_scout_registry({})` after source
|
|
212
224
|
approval and before dispatching the post-lead filter/message scouts.
|
|
213
225
|
- `launch_source_scout`: Claude Code uses `Task` with `subagent_type` equal to
|
|
214
|
-
the registry `name
|
|
226
|
+
the registry `name` only when the session lists those agents; Codex uses
|
|
227
|
+
named custom agents such as
|
|
215
228
|
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
216
229
|
`source-scout-prospeo-contact` when subagents are available.
|
|
217
230
|
- `launch_post_find_leads_scout`: Claude Code uses `Task` with `subagent_type`
|
|
218
|
-
equal to the returned post-lead registry `name
|
|
219
|
-
custom agents such as
|
|
220
|
-
`post-find-leads-message-scout` when
|
|
231
|
+
equal to the returned post-lead registry `name` only when the session lists
|
|
232
|
+
those agents; Codex uses the returned custom agents such as
|
|
233
|
+
`post-find-leads-filter-scout` and `post-find-leads-message-scout` when
|
|
234
|
+
subagents are available.
|
|
221
235
|
|
|
222
|
-
If a required interactive
|
|
223
|
-
Sellable install/reload problem.
|
|
224
|
-
|
|
225
|
-
scripts.
|
|
236
|
+
If a required interactive question function or MCP loader is missing, stop and
|
|
237
|
+
explain the Sellable install/reload problem. Named scout agents are optional
|
|
238
|
+
acceleration: if they are absent, do not surface install status to the customer;
|
|
239
|
+
fall back to product-native MCP orchestration instead of local scripts.
|
|
226
240
|
|
|
227
241
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
228
242
|
save drafts, write artifacts, or persist intermediate state, translate it into
|
|
@@ -235,106 +249,56 @@ customer-facing progress copy.
|
|
|
235
249
|
|
|
236
250
|
Do not treat the active Sellable workspace as the campaign subject. The
|
|
237
251
|
workspace only tells you where the campaign will be saved. Before buyer, CTA,
|
|
238
|
-
proof, or source questions, identify
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
252
|
+
proof, or source questions, identify the campaign identity: the person/profile
|
|
253
|
+
or company this campaign is for, plus enough company/product context to build
|
|
254
|
+
the brief. This is only the client-prospect/bootstrap identity for
|
|
255
|
+
`clientProspectId` or `senderLinkedinUrl`; it is not a connected-sender check.
|
|
256
|
+
|
|
257
|
+
Do not call `mcp__sellable__list_senders`, `mcp__sellable__get_sender`, or
|
|
258
|
+
surface connected/missing sender state during setup, brief, source, filter, or
|
|
259
|
+
message review. Sender availability belongs only to the Settings/final launch
|
|
260
|
+
handoff after message approval and the 10-lead validation sample.
|
|
261
|
+
|
|
262
|
+
If the invocation or user answer includes an existing `clientProspectId`, keep
|
|
263
|
+
it as the preferred `create_campaign` identity input. If it includes a LinkedIn
|
|
264
|
+
profile URL, keep that URL as `senderLinkedinUrl` so the backend can
|
|
265
|
+
resolve/materialize the sender prospect when the watchable campaign shell is
|
|
266
|
+
created. Do not require a connected sender before shell creation.
|
|
242
267
|
|
|
243
268
|
If the user supplied a LinkedIn profile, website, domain, company name, or
|
|
244
|
-
|
|
269
|
+
explicit client prospect identity in the invocation, do one lightweight lookup
|
|
270
|
+
first:
|
|
245
271
|
|
|
246
272
|
- LinkedIn profile: call `mcp__sellable__fetch_linkedin_profile`.
|
|
247
273
|
- Website/domain/company: call `mcp__sellable__fetch_company` when possible,
|
|
248
274
|
otherwise one web lookup.
|
|
249
|
-
-
|
|
250
|
-
|
|
275
|
+
- Existing client prospect id: use it directly and do one company/profile lookup
|
|
276
|
+
only if a URL/domain is also available.
|
|
251
277
|
|
|
252
278
|
Then summarize what you found in one or two lines and ask the user to confirm
|
|
253
|
-
the campaign
|
|
254
|
-
|
|
255
|
-
If the user did not provide the launch identity, quietly call
|
|
256
|
-
`mcp__sellable__list_senders` once if available. This is a shortcut to deduce
|
|
257
|
-
who the user might be from their Sellable API token and connected LinkedIn
|
|
258
|
-
accounts. Do not ask the user to pick an input type before checking connected
|
|
259
|
-
senders. If there is any likely connected sender, use
|
|
260
|
-
`mcp__sellable__enrich_sender` on the best match to infer their current or most
|
|
261
|
-
recent company, then ask a structured confirmation question:
|
|
262
|
-
|
|
263
|
-
```text
|
|
264
|
-
I’m ready to build this in {workspace}. I found {matched sender} connected here.
|
|
265
|
-
|
|
266
|
-
Is that you, and is this campaign for {company}?
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
The structured options must be no more than three choices:
|
|
270
|
-
|
|
271
|
-
1. `Yes — use {matched sender} for {company}`
|
|
272
|
-
2. `No — I'll paste a LinkedIn profile`
|
|
273
|
-
3. `Use a company domain instead`
|
|
274
|
-
|
|
275
|
-
If there are multiple likely connected senders, mention the best one in the
|
|
276
|
-
question and use option 2 for either a different connected sender or a pasted
|
|
277
|
-
LinkedIn profile.
|
|
278
|
-
|
|
279
|
-
Use the structured question tool only for the choice. Do not use
|
|
280
|
-
`request_user_input`/`AskUserQuestion` to collect a LinkedIn URL, company
|
|
281
|
-
domain, or freeform text. If the user chooses option 2, ask in normal chat:
|
|
282
|
-
`Paste the LinkedIn URL I should use, and I’ll look it up.` Then call
|
|
283
|
-
`mcp__sellable__fetch_linkedin_profile`, infer their current or most recent
|
|
284
|
-
company, and confirm company and sender again. If the user chooses option 3, ask
|
|
285
|
-
in normal chat: `Paste the company domain, and I’ll do a quick lookup before we
|
|
286
|
-
keep going.` Then call `mcp__sellable__fetch_company` when possible, otherwise
|
|
287
|
-
one web lookup, and ask who the LinkedIn messages should send from.
|
|
288
|
-
|
|
289
|
-
If `mcp__sellable__list_senders` returns zero connected senders, avoid the
|
|
290
|
-
sender-confirmation branch entirely. Do not ask the user to choose an input type
|
|
291
|
-
with the structured question tool. Ask in normal chat for the user's LinkedIn
|
|
292
|
-
URL or the company they want to send on behalf of so you can research context:
|
|
293
|
-
|
|
294
|
-
```text
|
|
295
|
-
I’m ready to build this in {workspace}.
|
|
296
|
-
|
|
297
|
-
First, paste your LinkedIn URL or the company website you want to send on
|
|
298
|
-
behalf of. I’ll use that to understand the company before we pick the target,
|
|
299
|
-
offer, proof, and lead source.
|
|
300
|
-
```
|
|
279
|
+
the campaign identity/focus before continuing. Do not mention connected sender
|
|
280
|
+
availability in this confirmation.
|
|
301
281
|
|
|
302
|
-
If
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
current or most recent company, and then confirm who we are sending from. The
|
|
306
|
-
customer-facing shape should be:
|
|
282
|
+
If the user did not provide the launch identity, ask in normal chat for the
|
|
283
|
+
LinkedIn profile or company website to use as the campaign identity. Do not ask
|
|
284
|
+
them to choose an input type with the structured question tool:
|
|
307
285
|
|
|
308
286
|
```text
|
|
309
287
|
I’m ready to build this in {workspace}.
|
|
310
288
|
|
|
311
|
-
First,
|
|
312
|
-
the
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
After the user pastes a URL/domain, do the lightweight lookup. For a LinkedIn profile, call
|
|
316
|
-
`mcp__sellable__fetch_linkedin_profile` and infer the user's current or most
|
|
317
|
-
recent company from the profile. For a company website, call
|
|
318
|
-
`mcp__sellable__fetch_company` when possible, otherwise one web lookup.
|
|
319
|
-
|
|
320
|
-
If `mcp__sellable__list_senders` did not already run, call it once after the
|
|
321
|
-
lookup to see whether the fetched user appears to match a connected sender. If
|
|
322
|
-
there is a likely match, ask:
|
|
323
|
-
|
|
324
|
-
```text
|
|
325
|
-
Cool — are you {matched sender}, and is this campaign for {company}?
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
If there is no likely sender match, ask:
|
|
329
|
-
|
|
330
|
-
```text
|
|
331
|
-
Cool — I have this campaign as {company}. Who should the LinkedIn messages send from?
|
|
289
|
+
First, paste the LinkedIn profile or company website for the client/company this
|
|
290
|
+
campaign is for. I’ll use that to resolve the campaign identity before we pick
|
|
291
|
+
the target, offer, proof, and lead source.
|
|
332
292
|
```
|
|
333
293
|
|
|
334
|
-
|
|
335
|
-
|
|
294
|
+
After the user pastes a URL/domain, do the lightweight lookup. For a LinkedIn
|
|
295
|
+
profile, call `mcp__sellable__fetch_linkedin_profile` and infer the current or
|
|
296
|
+
most recent company from the profile. For a company website, call
|
|
297
|
+
`mcp__sellable__fetch_company` when possible, otherwise one web lookup. If a
|
|
298
|
+
LinkedIn profile URL is available, retain it as `senderLinkedinUrl` for
|
|
299
|
+
`create_campaign`; if a `clientProspectId` is available, pass that instead.
|
|
336
300
|
|
|
337
|
-
After the user confirms the
|
|
301
|
+
After the user confirms the campaign identity, run one lightweight company
|
|
338
302
|
lookup if it has not already run, then ask the campaign setup questions. The
|
|
339
303
|
setup questions should use the confirmed company context so they do not feel
|
|
340
304
|
generic.
|
|
@@ -344,12 +308,11 @@ Before the identity gate, use this customer-facing shape:
|
|
|
344
308
|
```text
|
|
345
309
|
I’m ready to build the campaign in {workspace}.
|
|
346
310
|
|
|
347
|
-
First I’ll
|
|
348
|
-
|
|
349
|
-
that to understand the company before we choose the target, offer, proof, and
|
|
350
|
-
lead source.
|
|
311
|
+
First I’ll resolve the client/company this campaign is for. I’ll use that
|
|
312
|
+
context to choose the target, offer, proof, and lead source.
|
|
351
313
|
|
|
352
|
-
Then I’ll turn that into a campaign brief for you to approve before any leads
|
|
314
|
+
Then I’ll turn that into a campaign brief for you to approve before any leads
|
|
315
|
+
are imported or anything can send.
|
|
353
316
|
```
|
|
354
317
|
|
|
355
318
|
Do not silently ask Codex intake or approval questions as plain chat when
|
|
@@ -524,16 +487,17 @@ updates.
|
|
|
524
487
|
copies of this file; packaged Claude Code and Codex runs must use the MCP
|
|
525
488
|
asset loader so they share the same config.
|
|
526
489
|
3. Follow that prompt and workflow config exactly.
|
|
527
|
-
4. For message generation,
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
`message-validation.md` from the brief, lead review, or
|
|
490
|
+
4. For message generation, use the `post-find-leads-message-scout` agent when
|
|
491
|
+
available; its prompt carries the campaign-launch message rules. In the
|
|
492
|
+
parent-thread fallback, load
|
|
493
|
+
`mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/message-review-fast-path.md" })`.
|
|
494
|
+
Do not synthesize `message-validation.md` from the brief, lead review, or
|
|
495
|
+
general knowledge.
|
|
532
496
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
533
497
|
watch link and see useful setup state immediately. Import only the first
|
|
534
498
|
bounded review batch after the source is attached to the campaign; do not
|
|
535
499
|
queue workflow cells, attach a sequence, or start until
|
|
536
|
-
`message-validation.md` proves the
|
|
500
|
+
`message-validation.md` proves the fast-path message workflow ran,
|
|
537
501
|
`message-review.md` approves the template, rubrics are saved, and the
|
|
538
502
|
approved message set is synced into the campaign brief.
|
|
539
503
|
6. Keep `selectedLeadListId` as the source list and `workflowTableId` as the
|