@sellable/install 0.1.75 → 0.1.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -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`. The MCP exposes the same list through
41
- `get_source_scout_registry`, so adding a future scout starts in one registry
42
- entry instead of scattered prompt edits.
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. Load 100% of the real generate-messages prompt with chunked
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 Safety Gate below. Do not load the full
24
+ long-form `generate-messages` subskill in this `create-campaign-v2` path. If
25
+ a needed rule is missing or the draft fails quality gates, return
26
+ `revise-messaging` with the exact failure instead of pulling the long prompt
27
+ into this worker.
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 loaded generate-messages workflow in dry mode from the approved
48
- brief, lead-review source decision, and `lead-sample.json`.
49
+ 1. Run the embedded message-review safety-gate workflow in dry mode from the
50
+ approved brief, 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, finalists, skeptical-prospect review, winner gate, and
53
- a raw sendable selected winner.
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,8 @@ Process:
67
69
  Return a concise final status with:
68
70
 
69
71
  - artifacts written
70
- - whether the full generate-messages prompt was loaded
72
+ - whether the embedded message-review safety-gate rules passed or returned
73
+ `revise-messaging`
71
74
  - lead sample basis used
72
75
  - proposed template and one sample message
73
76
  - selected winner summary
@@ -76,7 +79,56 @@ Return a concise final status with:
76
79
  Quality bar:
77
80
 
78
81
  - Do not synthesize a lightweight message from general knowledge. The artifact
79
- must prove the full generate-messages workflow ran.
82
+ must prove the embedded message-review safety-gate workflow ran.
80
83
  - Message generation can start before `lead-filter.md`, but message review
81
84
  cannot start until the parent verifies the selected basis rows still pass the
82
85
  final filter.
86
+
87
+ ## Embedded Message Review Safety Gate
88
+
89
+ Use this campaign-launch subset to produce a truthful first-send message,
90
+ rendered token examples, and a decision without loading the full long-form
91
+ message prompt.
92
+
93
+ Required `message-validation.md` sections:
94
+
95
+ - `Status`
96
+ - `Mode`
97
+ - `Lead Sample Basis`
98
+ - `Strongest Reply Reason`
99
+ - `Campaign Element Pool`
100
+ - `Gold Standard Strategy Map`
101
+ - `Current Campaign Translation`
102
+ - `Token Fill Rules`
103
+ - `Token Adherence Table`
104
+ - `Angle Drafts`
105
+ - `Kill / Combine Review`
106
+ - `Finalizer Pass`
107
+ - `Gold-Standard Quality Gate`
108
+ - `Skeptical Prospect Review`
109
+ - `Winner Gate`
110
+ - `Selected Winner`
111
+ - `Findings`
112
+ - `Recommendation`
113
+
114
+ Quality gates:
115
+
116
+ - The selected winner is one first outbound send only. No post-accept DM,
117
+ follow-up, cadence branch, or sequence copy.
118
+ - Explain what the product is and what it does in plain language before asking
119
+ for a call.
120
+ - Use only proof from the brief, source review, sample, campaign state, or
121
+ explicit user answers. Unsupported reply-rate, meeting-rate, ROI, revenue,
122
+ and customer-logo claims are blocked.
123
+ - Include at least one supported `{{token}}` when templating, plus a complete
124
+ rendered good-fill example and a complete rendered omit/fallback example.
125
+ - Do not use internal tokens such as `{{profile_signal}}` in customer-facing
126
+ copy.
127
+ - Do not put bracketed instructions in the message body, such as `[ROW_BRIDGE]`,
128
+ `[insert]`, or `[generated]`.
129
+ - Optional row-specific personalization must be grounded in a row field or
130
+ omitted entirely.
131
+ - Subjects should be short, buyer-relevant, and specific. Avoid `quick
132
+ question`, `demo`, `founder call`, sender names, and generic `outbound`.
133
+ - If the message is plausible but not ready to send, set `Recommendation:
134
+ revise-messaging`.
@@ -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 confirm who we’re
571
- sending from and which company this is for, then I’ll turn that into a campaign
572
- brief before anything is created.
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
- - "nothing is created until you approve", not mutation jargon
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\`; Codex uses named custom agents such as
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\`; Codex
676
- uses the returned custom agents such as \`post-find-leads-filter-scout\` and
677
- \`post-find-leads-message-scout\` when subagents are available.
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 host function is missing, stop and explain the
680
- Sellable install/reload problem. Do not silently simulate structured choices,
681
- subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
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 two things:
696
-
697
- 1. who/what company this campaign is for, and
698
- 2. who the LinkedIn messages should send from.
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
- sender name in the invocation, do one lightweight lookup first:
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
- - Workspace sender id or known sender: call \`mcp__sellable__get_sender\` or
707
- \`mcp__sellable__enrich_sender\`.
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 subject and sender before continuing.
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, quietly call
713
- \`mcp__sellable__list_senders\` once if available. This is a shortcut to deduce
714
- who the user might be from their Sellable API token and connected LinkedIn
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 your LinkedIn URL or the company website you want to send on
755
- behalf of. I’ll use that to understand the company before we pick the target,
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
- Sender options should include connected sender names if available, \`same as
792
- me\`, \`I’ll paste a different sender profile\`, and \`Other / custom\`.
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 subject and sender, run one lightweight company
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 check whether you already have a connected LinkedIn account here. If
805
- I can’t confirm it, I’ll ask for your LinkedIn URL or company website and use
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,17 +840,24 @@ 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, load the full \`generate-messages\` prompt in the
886
- same run with chunked
887
- \`mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages", offset, limit })\`
888
- calls until \`hasMore\` is false. Do not synthesize
889
- \`message-validation.md\` from the brief, lead review, or general knowledge.
890
- 5. Treat message quality as the gate before minting. Do not create a campaign,
891
- show a commit gate, or mint anything until \`message-validation.md\` proves
892
- the full generate-messages workflow ran and \`message-review.md\` recommends
893
- \`approve-message\` against the gold-standard rules.
894
- 6. Do not create or mutate the live campaign until the approval gate returns
895
- \`approve\`.
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-safety-gate.md" })\`.
847
+ Do not load the full long-form \`generate-messages\` subskill in this
848
+ create-campaign path; if the safety gate cannot safely approve the draft, route
849
+ to revise messaging with the concrete failure.
850
+ Do not synthesize \`message-validation.md\` from the brief, lead review, or
851
+ general knowledge.
852
+ 5. Create the campaign shell early with the v1 brief so the user can open the
853
+ watch link and see useful setup state immediately. Import only the first
854
+ bounded review batch after the source is attached to the campaign; do not
855
+ queue workflow cells, attach a sequence, or start until
856
+ \`message-validation.md\` proves the message-review safety-gate workflow ran,
857
+ \`message-review.md\` approves the template, rubrics are saved, and the
858
+ approved message set is synced into the campaign brief.
859
+ 6. Keep \`selectedLeadListId\` as the source list and \`workflowTableId\` as the
860
+ campaign table. Do not use disk files as the post-mint source of truth.
896
861
  7. Do not ask the user to run another command.
897
862
 
898
863
  ## Fallback
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.75",
3
+ "version": "0.1.77",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -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 confirm who we’re
85
- sending from and which company this is for, then I’ll turn that into a campaign
86
- brief before any leads are imported or anything can send.
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 `source-scout-prospeo-contact` for
117
- the credible lanes; Codex does not infer subagent fan-out from generic source
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; the
120
- installer writes them from the same canonical Sellable agent registry with
121
- explicit Sellable MCP tool allowlists. The create-campaign-v2 subskill calls
122
- `get_source_scout_registry` before dispatch so the current registry, not this
123
- copy, is the runtime source of truth. If the host runs them sequentially, do not
124
- claim they ran in parallel. In chat, call the downstream copy stage `message generation`;
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. Message generation must not wait for the filter unless the host
132
- cannot run the two branches concurrently.
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`; Codex uses named custom agents such as
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`; Codex uses the returned
219
- custom agents such as `post-find-leads-filter-scout` and
220
- `post-find-leads-message-scout` when subagents are available.
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 host function is missing, stop and explain the
223
- Sellable install/reload problem. Do not silently simulate structured choices,
224
- subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
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 two things:
239
-
240
- 1. who/what company this campaign is for, and
241
- 2. who the LinkedIn messages should send from.
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
- sender name in the invocation, do one lightweight lookup first:
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
- - Workspace sender id or known sender: call `mcp__sellable__get_sender` or
250
- `mcp__sellable__enrich_sender`.
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 subject and sender before continuing.
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 there is no strong sender match, do not show a structured choice that says
303
- "LinkedIn profile" vs "Company website". The point of this gate is not "pick a
304
- sender" or "pick an input type"; it is to learn who the user is, infer the
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, what’s your LinkedIn URL? If you’d rather start from the company, paste
312
- the company website instead.
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
- Sender options should include connected sender names if available, `same as
335
- me`, `I’ll paste a different sender profile`, and `Other / custom`.
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 subject and sender, run one lightweight company
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 check whether you already have a connected LinkedIn account here. If
348
- I can’t confirm it, I’ll ask for your LinkedIn URL or company website and use
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 are imported or anything can send.
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,20 @@ 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, load the full `generate-messages` prompt in the
528
- same run with chunked
529
- `mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages", offset, limit })`
530
- calls until `hasMore` is false. Do not synthesize
531
- `message-validation.md` from the brief, lead review, or general knowledge.
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-safety-gate.md" })`.
494
+ Do not load the full long-form `generate-messages` subskill in this
495
+ create-campaign path; if the safety gate cannot safely approve the draft,
496
+ route to revise messaging with the concrete failure.
497
+ Do not synthesize `message-validation.md` from the brief, lead review, or
498
+ general knowledge.
532
499
  5. Create the campaign shell early with the v1 brief so the user can open the
533
500
  watch link and see useful setup state immediately. Import only the first
534
501
  bounded review batch after the source is attached to the campaign; do not
535
502
  queue workflow cells, attach a sequence, or start until
536
- `message-validation.md` proves the full generate-messages workflow ran,
503
+ `message-validation.md` proves the message-review safety-gate workflow ran,
537
504
  `message-review.md` approves the template, rubrics are saved, and the
538
505
  approved message set is synced into the campaign brief.
539
506
  6. Keep `selectedLeadListId` as the source list and `workflowTableId` as the