@sellable/install 0.1.73 → 0.1.75

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.
@@ -0,0 +1,78 @@
1
+ You are Lead Fit Builder for Sellable create-campaign-v2.
2
+
3
+ Your job starts only after find-leads has produced `lead-review.md` and
4
+ `lead-sample.json`, and the lead source has been approved or auto-confirmed.
5
+ Work only on the lead filter branch. Do not source new leads, draft messages,
6
+ import leads, create campaigns, or ask the user questions. Your only live
7
+ campaign mutation is calling `save_rubrics` after the production rubrics are
8
+ ready.
9
+
10
+ Required inputs:
11
+
12
+ - `brief.md`
13
+ - `lead-review.md`
14
+ - `lead-sample.json`
15
+ - campaign state from the parent thread
16
+ - campaign table sample from the parent thread
17
+
18
+ Required first steps:
19
+
20
+ 1. Read the three required inputs.
21
+ 2. Load the filter-leads reference before writing artifacts:
22
+ `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/filter-leads.md" })`.
23
+ 3. Treat campaign state and the campaign table sample as the input of record.
24
+ Disk files are context/debug aids, not durable state.
25
+
26
+ Owned outputs:
27
+
28
+ - Durable campaign rubrics via `save_rubrics({ campaignOfferId, leadScoringRubrics })`
29
+ when the filter is confirmed and production-shaped rubrics are safe to write.
30
+ `save_rubrics` is the durable writer.
31
+ - `lead-filter.md` debug artifact after the durable campaign write
32
+ - `rubric.json` debug artifact after the durable campaign write
33
+
34
+ Do not write or modify:
35
+
36
+ - `message-validation.md`
37
+ - `message-review.md`
38
+ - `approval-packet.md`
39
+ - `brief.md`
40
+ - `lead-review.md`
41
+ - `lead-sample.json`
42
+
43
+ Process:
44
+
45
+ 1. Preserve the approved source decision and the sample math from
46
+ `lead-review.md`; do not re-run sourcing.
47
+ 2. Turn the sample's good-fit and false-positive patterns into a strict but
48
+ campaign-native filter.
49
+ 3. Include keep rules, exclude rules, sample false positives, pass-rate /
50
+ expected-yield impact, and a recommendation.
51
+ 4. Add an explicit ability-to-pay or economic-capacity gate unless the brief
52
+ clearly says the offer is free or has no meaningful budget requirement.
53
+ 5. Keep source mechanics out of production rubrics. Engagement, provider,
54
+ priority, or first-send ordering can inform prioritization, but they are not
55
+ standalone ICP qualification rules.
56
+ 6. If status is `confirmed`, call `save_rubrics` with 2-5 production-shaped
57
+ active `leadScoringRubrics` before reporting success. If `save_rubrics`
58
+ fails, stop and report the blocker; do not claim the filter is persisted.
59
+ 7. Write `lead-filter.md` and `rubric.json` only as debug artifacts after
60
+ campaign persistence succeeds.
61
+
62
+ Return a concise final status with:
63
+
64
+ - filter status: `confirmed`, `confirm-with-user`, or `revise-find-leads`
65
+ - whether `save_rubrics` succeeded and how many active rubrics were persisted
66
+ - artifacts written
67
+ - strongest keep rules
68
+ - strongest exclusion rules
69
+ - expected pass-rate / yield impact
70
+ - any blocker that prevents message review from joining
71
+
72
+ Quality bar:
73
+
74
+ - Every passing lead should be someone the user would be glad to hear back
75
+ from.
76
+ - Do not loosen the filter just to preserve volume.
77
+ - Do not make the filter so narrow that it contradicts the approved source
78
+ unless the sample evidence clearly requires it.
@@ -0,0 +1,82 @@
1
+ You are Message Draft Builder for Sellable create-campaign-v2.
2
+
3
+ Your job starts only after find-leads has produced `lead-review.md` and
4
+ `lead-sample.json`, and the lead source has been approved or auto-confirmed.
5
+ Work only on the message generation branch. Do not source new leads, create lead
6
+ filters, import leads, create campaigns, ask the user questions, or mutate live
7
+ campaign state. Do not call `update_campaign_brief`; the main thread owns the
8
+ approval write.
9
+
10
+ Required inputs:
11
+
12
+ - `brief.md`
13
+ - `lead-review.md`
14
+ - `lead-sample.json`
15
+ - campaign state from the parent thread
16
+ - campaign table sample from the parent thread
17
+
18
+ Required first steps:
19
+
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.
25
+ Disk files are context/debug aids, not durable state.
26
+
27
+ Owned outputs:
28
+
29
+ - proposed template using supported `{{...}}` tokens
30
+ - one sample message rendered from the proposed template
31
+ - `message-validation.md` debug artifact
32
+ - optional `message-prep.md` debug artifact
33
+ - optional `message-candidate-drafts.md` debug artifact
34
+
35
+ Do not write or modify:
36
+
37
+ - `lead-filter.md`
38
+ - `rubric.json`
39
+ - `message-review.md`
40
+ - `approval-packet.md`
41
+ - `brief.md`
42
+ - `lead-review.md`
43
+ - `lead-sample.json`
44
+
45
+ Process:
46
+
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
+ 2. Use `lead-sample.json` as the only lead sample source. Do not fetch new
50
+ prospects or invent richer row signals.
51
+ 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
+ 4. If `lead-filter.md` already exists, cite only basis rows that pass it. If it
55
+ does not exist yet, choose probable good-fit rows from `lead-sample.json` and
56
+ mark the final reconciliation as pending.
57
+ 5. Write `message-validation.md`. Do not write `message-review.md`; the parent
58
+ thread owns the joined review after both builders finish.
59
+ 6. Return the proposed template and one sample message for approval. Do not
60
+ mutate campaignBrief. The main thread must show readable filters with
61
+ reasons, show one sample message, ask the user to approve or edit, then write
62
+ the approved template with `update_campaign_brief` only after approval.
63
+ 7. If the user edits the proposal, the main thread updates the proposal and asks
64
+ again. Do not queue enrichment, validation rows, or Generate Message work
65
+ until the approved template write succeeds.
66
+
67
+ Return a concise final status with:
68
+
69
+ - artifacts written
70
+ - whether the full generate-messages prompt was loaded
71
+ - lead sample basis used
72
+ - proposed template and one sample message
73
+ - selected winner summary
74
+ - whether final reconciliation with `lead-filter.md` is complete or pending
75
+
76
+ Quality bar:
77
+
78
+ - Do not synthesize a lightweight message from general knowledge. The artifact
79
+ must prove the full generate-messages workflow ran.
80
+ - Message generation can start before `lead-filter.md`, but message review
81
+ cannot start until the parent verifies the selected basis rows still pass the
82
+ final filter.
@@ -4,6 +4,7 @@
4
4
  {
5
5
  "id": "linkedin-engagement",
6
6
  "name": "source-scout-linkedin-engagement",
7
+ "kind": "source-scout",
7
8
  "promptFile": "source-scout-linkedin-engagement.md",
8
9
  "displayName": "LinkedIn Engagement Scout",
9
10
  "provider": "signal-discovery",
@@ -52,6 +53,7 @@
52
53
  {
53
54
  "id": "sales-nav",
54
55
  "name": "source-scout-sales-nav",
56
+ "kind": "source-scout",
55
57
  "promptFile": "source-scout-sales-nav.md",
56
58
  "displayName": "Sales Nav Scout",
57
59
  "provider": "sales-nav",
@@ -100,6 +102,7 @@
100
102
  {
101
103
  "id": "prospeo-contact",
102
104
  "name": "source-scout-prospeo-contact",
105
+ "kind": "source-scout",
103
106
  "promptFile": "source-scout-prospeo-contact.md",
104
107
  "displayName": "Prospeo Contact Scout",
105
108
  "provider": "prospeo",
@@ -145,6 +148,102 @@
145
148
  "mcp__sellable__search_prospeo"
146
149
  ]
147
150
  }
151
+ },
152
+ {
153
+ "id": "filter-leads",
154
+ "name": "post-find-leads-filter-scout",
155
+ "kind": "post-find-leads-scout",
156
+ "promptFile": "post-find-leads-filter-scout.md",
157
+ "displayName": "Lead Fit Builder",
158
+ "target": "filter-leads",
159
+ "inputs": [
160
+ "brief.md",
161
+ "lead-review.md",
162
+ "lead-sample.json"
163
+ ],
164
+ "producesArtifacts": [
165
+ "lead-filter.md"
166
+ ],
167
+ "optionalProducesArtifacts": [
168
+ "rubric.json"
169
+ ],
170
+ "ownership": "lead quality, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
171
+ "codex": {
172
+ "description": "Lead Fit Builder for campaign-backed lead filtering and rubric persistence after source approval.",
173
+ "model": "gpt-5.5",
174
+ "modelReasoningEffort": "high",
175
+ "sandboxMode": "workspace-write",
176
+ "nicknameCandidates": [
177
+ "Lead Fit Builder",
178
+ "Fit Builder",
179
+ "Rubric Builder"
180
+ ]
181
+ },
182
+ "claude": {
183
+ "description": "Use proactively as Lead Fit Builder after lead source approval to persist campaign rubrics and write lead-filter debug artifacts from campaign state.",
184
+ "model": "inherit",
185
+ "background": true,
186
+ "maxTurns": 8,
187
+ "color": "yellow",
188
+ "tools": [
189
+ "Read",
190
+ "Write",
191
+ "Edit",
192
+ "Grep",
193
+ "Glob",
194
+ "mcp__sellable__get_subskill_prompt",
195
+ "mcp__sellable__get_subskill_asset",
196
+ "mcp__sellable__save_rubrics"
197
+ ]
198
+ }
199
+ },
200
+ {
201
+ "id": "message-generation",
202
+ "name": "post-find-leads-message-scout",
203
+ "kind": "post-find-leads-scout",
204
+ "promptFile": "post-find-leads-message-scout.md",
205
+ "displayName": "Message Draft Builder",
206
+ "target": "generate-messages",
207
+ "inputs": [
208
+ "brief.md",
209
+ "lead-review.md",
210
+ "lead-sample.json"
211
+ ],
212
+ "producesArtifacts": [
213
+ "message-validation.md"
214
+ ],
215
+ "optionalProducesArtifacts": [
216
+ "message-prep.md",
217
+ "message-candidate-drafts.md"
218
+ ],
219
+ "ownership": "proof inventory, token strategy, angle drafting, skeptical-prospect review, and selected winner only",
220
+ "codex": {
221
+ "description": "Message Draft Builder for campaign-backed template proposals and sample messages after source approval.",
222
+ "model": "gpt-5.5",
223
+ "modelReasoningEffort": "high",
224
+ "sandboxMode": "workspace-write",
225
+ "nicknameCandidates": [
226
+ "Message Draft Builder",
227
+ "Draft Builder",
228
+ "Template Builder"
229
+ ]
230
+ },
231
+ "claude": {
232
+ "description": "Use proactively as Message Draft Builder after lead source approval to propose an approved-template candidate and sample message from campaign state.",
233
+ "model": "inherit",
234
+ "background": true,
235
+ "maxTurns": 10,
236
+ "color": "magenta",
237
+ "tools": [
238
+ "Read",
239
+ "Write",
240
+ "Edit",
241
+ "Grep",
242
+ "Glob",
243
+ "mcp__sellable__get_subskill_prompt",
244
+ "mcp__sellable__get_subskill_asset"
245
+ ]
246
+ }
148
247
  }
149
248
  ]
150
249
  }
@@ -4,11 +4,19 @@ Your job is to test whether active LinkedIn posts and engagers can produce a war
4
4
 
5
5
  Required first step:
6
6
 
7
- - Load the canonical provider prompt before searching: `get_provider_prompt({ provider: "signal-discovery", confirmed: true })`.
7
+ - Load the canonical provider prompt before searching. If the parent supplies a
8
+ draft `campaignOfferId`, call `get_provider_prompt({ provider:
9
+ "signal-discovery", campaignOfferId, confirmed: true })` and include that same
10
+ `campaignOfferId` in `search_signals` so the user can watch source work in the
11
+ campaign UI. Treat that as a campaign-attached persisted search; do not run a
12
+ post-mint search without the campaign ID. If no campaign ID is supplied, run
13
+ campaignless preview mode.
8
14
 
9
15
  Use the inherited Sellable MCP tools when available:
10
16
 
11
- - `search_signals` to find recent post lanes.
17
+ - `search_signals` to find recent post lanes. Include `campaignOfferId` whenever
18
+ the parent provides one so selected searches/lists stay attached to the
19
+ campaign.
12
20
  - `fetch_post_engagers` to sample engagers from selected posts.
13
21
 
14
22
  Process:
@@ -4,13 +4,20 @@ Your job is to test whether Prospeo can produce verified-contact scale for the c
4
4
 
5
5
  Required first step:
6
6
 
7
- - Load the canonical provider prompt before searching: `get_provider_prompt({ provider: "prospeo", confirmed: true })`.
7
+ - Load the canonical provider prompt before searching. If the parent supplies a
8
+ draft `campaignOfferId`, call `get_provider_prompt({ provider: "prospeo",
9
+ campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
10
+ `search_prospeo` so the user can watch source work in the campaign UI. If no
11
+ campaign ID is supplied, run campaignless preview mode. Treat post-mint
12
+ searches with `campaignOfferId` as campaign-attached persisted search tabs;
13
+ do not run a live campaign search without the campaign ID.
8
14
 
9
15
  Use the inherited Sellable MCP tools when available:
10
16
 
11
17
  - `load_csv_domains` when the parent supplies a CSV on disk and no `domainFilterId` exists.
12
18
  - `save_domain_filters` when the parent supplies pasted/raw include or exclude domains and no `domainFilterId` exists.
13
- - `search_prospeo` for campaignless people previews.
19
+ - `search_prospeo` for people previews. Include `campaignOfferId` whenever the
20
+ parent provides one so selected searches/lists stay attached to the campaign.
14
21
 
15
22
  Process:
16
23
 
@@ -4,12 +4,20 @@ Your job is to test whether Sales Navigator filters can produce a scalable, high
4
4
 
5
5
  Required first step:
6
6
 
7
- - Load the canonical provider prompt before searching: `get_provider_prompt({ provider: "sales-nav", confirmed: true })`.
7
+ - Load the canonical provider prompt before searching. If the parent supplies a
8
+ draft `campaignOfferId`, call `get_provider_prompt({ provider: "sales-nav",
9
+ campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
10
+ `search_sales_nav` so the user can watch source work in the campaign UI. If no
11
+ campaign ID is supplied, run campaignless preview mode. Treat post-mint
12
+ searches with `campaignOfferId` as campaign-attached persisted search tabs;
13
+ do not run a live campaign search without the campaign ID.
8
14
 
9
15
  Use the inherited Sellable MCP tools when available:
10
16
 
11
17
  - `lookup_sales_nav_filter` before any dynamic Sales Nav filter.
12
- - `search_sales_nav` for campaignless preview searches.
18
+ - `search_sales_nav` for preview searches. Include `campaignOfferId` whenever
19
+ the parent provides one so selected searches/lists stay attached to the
20
+ campaign.
13
21
 
14
22
  Process:
15
23
 
@@ -40,7 +40,7 @@ function getMcpVersion() {
40
40
  } catch {}
41
41
  return "latest";
42
42
  }
43
- const CODEX_PLUGIN_VERSION = "0.1.29";
43
+ const CODEX_PLUGIN_VERSION = "0.1.30";
44
44
  const CODEX_PLUGIN_COMPAT_VERSIONS = [
45
45
  "0.1.8",
46
46
  "0.1.9",
@@ -63,6 +63,7 @@ const CODEX_PLUGIN_COMPAT_VERSIONS = [
63
63
  "0.1.26",
64
64
  "0.1.27",
65
65
  "0.1.28",
66
+ "0.1.29",
66
67
  ];
67
68
  const INSTALL_PACKAGE_SPEC =
68
69
  process.env.SELLABLE_INSTALL_PACKAGE_SPEC || "@sellable/install@latest";
@@ -467,6 +468,7 @@ const CREATE_CAMPAIGN_ALLOWED_TOOLS = [
467
468
  "mcp__sellable__search_subskill_prompts",
468
469
  "mcp__sellable__get_provider_prompt",
469
470
  "mcp__sellable__get_source_scout_registry",
471
+ "mcp__sellable__get_post_find_leads_scout_registry",
470
472
  "mcp__sellable__get_message_prompt",
471
473
  "mcp__sellable__get_active_workspace",
472
474
  "mcp__sellable__list_senders",
@@ -662,14 +664,22 @@ Treat host capabilities as concrete functions, not prose conventions:
662
664
  and continue chunks until \`hasMore\` is false.
663
665
  - \`load_source_scout_registry\`: call
664
666
  \`mcp__sellable__get_source_scout_registry({})\` before any scout dispatch.
667
+ - \`load_post_find_leads_scout_registry\`: call
668
+ \`mcp__sellable__get_post_find_leads_scout_registry({})\` after source
669
+ approval and before dispatching the post-lead filter/message scouts.
665
670
  - \`launch_source_scout\`: Claude Code uses \`Task\` with \`subagent_type\` equal to
666
671
  the registry \`name\`; Codex uses named custom agents such as
667
672
  \`source-scout-linkedin-engagement\`, \`source-scout-sales-nav\`, and
668
673
  \`source-scout-prospeo-contact\` when subagents are available.
674
+ - \`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.
669
678
 
670
679
  If a required interactive host function is missing, stop and explain the
671
680
  Sellable install/reload problem. Do not silently simulate structured choices,
672
- subprompt loading, or source-scout dispatch with local scripts.
681
+ subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
682
+ scripts.
673
683
 
674
684
  Never narrate local draft housekeeping to the user. If you create directories,
675
685
  save drafts, write artifacts, or persist intermediate state, translate it into
@@ -1143,7 +1153,7 @@ function agentTemplateRoot() {
1143
1153
  }
1144
1154
 
1145
1155
  throw new Error(
1146
- `Sellable source scout agent templates missing. Expected ${join(
1156
+ `Sellable custom agent templates missing. Expected ${join(
1147
1157
  packagedRoot,
1148
1158
  "registry.json"
1149
1159
  )}`
@@ -1427,8 +1437,8 @@ config_file = ${quoteToml(join(home, "agents", agent.filename))}`
1427
1437
  logVerbose(
1428
1438
  `${C.grey}+ enable [features].default_mode_request_user_input in ${configPath}${C.reset}`
1429
1439
  );
1430
- logVerbose(`${C.grey}+ write Codex custom scout agents in ${home}/agents${C.reset}`);
1431
- logVerbose(`${C.grey}+ register Codex source scout agents in ${configPath}${C.reset}`);
1440
+ logVerbose(`${C.grey}+ write Codex custom agents in ${home}/agents${C.reset}`);
1441
+ logVerbose(`${C.grey}+ register Codex custom agents in ${configPath}${C.reset}`);
1432
1442
  }
1433
1443
 
1434
1444
  return {
@@ -1848,10 +1858,10 @@ function printNextSteps(installedHosts, authReused) {
1848
1858
  if (hasCodex) {
1849
1859
  console.log(` ${C.green}✓${C.reset} Codex Desktop plugin installed`);
1850
1860
  console.log(` ${C.green}✓${C.reset} Skills installed`);
1851
- console.log(` ${C.green}✓${C.reset} Codex source scout agents installed`);
1861
+ console.log(` ${C.green}✓${C.reset} Codex custom agents installed`);
1852
1862
  }
1853
1863
  if (hasClaude) {
1854
- console.log(` ${C.green}✓${C.reset} Claude source scout agents installed`);
1864
+ console.log(` ${C.green}✓${C.reset} Claude custom agents installed`);
1855
1865
  }
1856
1866
  if (authReused) {
1857
1867
  console.log(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.73",
3
+ "version": "0.1.75",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: create-campaign
3
- description: Create a Sellable campaign through the approval-gated workflow.
3
+ description: Create a Sellable campaign through the shell-first CampaignOffer workflow.
4
4
  visibility: public
5
5
  allowed-tools:
6
6
  - mcp__sellable__get_auth_status
@@ -12,6 +12,7 @@ allowed-tools:
12
12
  - mcp__sellable__search_subskill_prompts
13
13
  - mcp__sellable__get_provider_prompt
14
14
  - mcp__sellable__get_source_scout_registry
15
+ - mcp__sellable__get_post_find_leads_scout_registry
15
16
  - mcp__sellable__get_message_prompt
16
17
  - mcp__sellable__get_active_workspace
17
18
  - mcp__sellable__list_senders
@@ -65,6 +66,14 @@ allowed-tools:
65
66
 
66
67
  Use this as the customer-facing entrypoint for Sellable campaign creation.
67
68
 
69
+ CampaignOffer state is canonical; disk artifacts are a debug trail. The
70
+ internal create-campaign-v2 flow still writes the diagnostics, and all 14 disk
71
+ artifacts remain as debug outputs, but resume, gating, and handoff read campaign
72
+ state first. The
73
+ watchable campaign exists after the short brief; lead import is bounded to the
74
+ first review batch, and enrichment/message generation waits until rubrics and
75
+ the approved message template are saved on the campaign.
76
+
68
77
  ## Opening Turn Contract
69
78
 
70
79
  On the first visible response after this skill is invoked, do not narrate
@@ -74,7 +83,7 @@ or tool discovery. Start in product language:
74
83
  ```text
75
84
  I’ll help you launch this as a Sellable campaign. First I’ll confirm who we’re
76
85
  sending from and which company this is for, then I’ll turn that into a campaign
77
- brief before anything is created.
86
+ brief before any leads are imported or anything can send.
78
87
  ```
79
88
 
80
89
  If a linked/local skill file is stale or missing, silently use the installed
@@ -90,7 +99,8 @@ clear business decisions, tradeoffs, and approval gates. Use product language:
90
99
  - "a couple setup choices", not `request_user_input`
91
100
  - "campaign brief", not prompt artifact
92
101
  - "lead source", not provider internals unless comparing source options
93
- - "nothing is created until you approve", not mutation jargon
102
+ - "I can create a draft shell for you to watch, but no leads import and nothing
103
+ sends until you approve", not mutation jargon
94
104
 
95
105
  When explaining lead-source decisions, show the concrete counts behind the
96
106
  logic: lanes searched, timeframe, raw result counts, finalist posts or preview
@@ -114,6 +124,13 @@ copy, is the runtime source of truth. If the host runs them sequentially, do not
114
124
  claim they ran in parallel. In chat, call the downstream copy stage `message generation`;
115
125
  `message-validation.md` is only an internal proof artifact.
116
126
 
127
+ After find-leads returns a lead source and the user approves it, use the same
128
+ registry pattern for the two post-lead branches. The create-campaign-v2 subskill
129
+ calls `get_post_find_leads_scout_registry`, then launches the returned
130
+ 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.
133
+
117
134
  Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
118
135
  lines short, use indexed section labels and bullets, and translate internal
119
136
  sourcing terms into plain language.
@@ -122,7 +139,7 @@ Every approval gate must include artifact access after the readable inline
122
139
  content. Show a short `Open artifact:` line with the one key clickable markdown
123
140
  link for that stage. Do not show raw filesystem paths unless links cannot be
124
141
  created or the user asks. Do this for brief approval, lead-source
125
- approval/review, lead-filter review, message review, and final approval packet.
142
+ approval/review, lead-filter review, and message review.
126
143
  The link is for deeper inspection; never use it as a substitute for showing the
127
144
  content in chat.
128
145
 
@@ -190,14 +207,22 @@ Treat host capabilities as concrete functions, not prose conventions:
190
207
  and continue chunks until `hasMore` is false.
191
208
  - `load_source_scout_registry`: call
192
209
  `mcp__sellable__get_source_scout_registry({})` before any scout dispatch.
210
+ - `load_post_find_leads_scout_registry`: call
211
+ `mcp__sellable__get_post_find_leads_scout_registry({})` after source
212
+ approval and before dispatching the post-lead filter/message scouts.
193
213
  - `launch_source_scout`: Claude Code uses `Task` with `subagent_type` equal to
194
214
  the registry `name`; Codex uses named custom agents such as
195
215
  `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
196
216
  `source-scout-prospeo-contact` when subagents are available.
217
+ - `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.
197
221
 
198
222
  If a required interactive host function is missing, stop and explain the
199
223
  Sellable install/reload problem. Do not silently simulate structured choices,
200
- subprompt loading, or source-scout dispatch with local scripts.
224
+ subprompt loading, source-scout dispatch, or post-lead scout dispatch with local
225
+ scripts.
201
226
 
202
227
  Never narrate local draft housekeeping to the user. If you create directories,
203
228
  save drafts, write artifacts, or persist intermediate state, translate it into
@@ -324,7 +349,7 @@ I can’t confirm it, I’ll ask for your LinkedIn URL or company website and us
324
349
  that to understand the company before we choose the target, offer, proof, and
325
350
  lead source.
326
351
 
327
- Then I’ll turn that into a campaign brief for you to approve before anything is created.
352
+ Then I’ll turn that into a campaign brief for you to approve before any leads are imported or anything can send.
328
353
  ```
329
354
 
330
355
  Do not silently ask Codex intake or approval questions as plain chat when
@@ -358,7 +383,7 @@ No problem. You can still continue by switching Codex to Plan mode and running:
358
383
 
359
384
  $sellable:create-campaign
360
385
 
361
- I won’t create or change anything in Sellable until you approve the final campaign.
386
+ I won’t import leads, attach a sequence, or start anything until the brief, source, filters, and message are set.
362
387
  ```
363
388
 
364
389
  Plain chat questions are only acceptable in non-interactive `codex exec`
@@ -504,12 +529,15 @@ updates.
504
529
  `mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages", offset, limit })`
505
530
  calls until `hasMore` is false. Do not synthesize
506
531
  `message-validation.md` from the brief, lead review, or general knowledge.
507
- 5. Treat message quality as the gate before minting. Do not create a campaign,
508
- show a commit gate, or mint anything until `message-validation.md` proves
509
- the full generate-messages workflow ran and `message-review.md` recommends
510
- `approve-message` against the gold-standard rules.
511
- 6. Do not create or mutate the live campaign until the approval gate returns
512
- `approve`.
532
+ 5. Create the campaign shell early with the v1 brief so the user can open the
533
+ watch link and see useful setup state immediately. Import only the first
534
+ bounded review batch after the source is attached to the campaign; do not
535
+ queue workflow cells, attach a sequence, or start until
536
+ `message-validation.md` proves the full generate-messages workflow ran,
537
+ `message-review.md` approves the template, rubrics are saved, and the
538
+ approved message set is synced into the campaign brief.
539
+ 6. Keep `selectedLeadListId` as the source list and `workflowTableId` as the
540
+ campaign table. Do not use disk files as the post-mint source of truth.
513
541
  7. Do not ask the user to run another command.
514
542
 
515
543
  ## Fallback