@sellable/install 0.1.151 → 0.1.153

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
@@ -59,11 +59,13 @@ Claude Code and Codex are configured to launch the same packaged MCP server. The
59
59
  installer also writes Sellable source-scout agents for both hosts from the
60
60
  packaged `agents/` registry: Claude Code gets `source-scout-*` subagents, and
61
61
  Codex gets `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
62
- `source-scout-prospeo-contact`. Runtime prompts use those named agents only
63
- when the current session exposes them; otherwise they fall back to the same MCP
64
- provider probes without customer-facing install-status copy. The MCP exposes
65
- the same list through `get_source_scout_registry`, so adding a future scout
66
- starts in one registry entry instead of scattered prompt edits.
62
+ `source-scout-prospeo-contact`. After Find Buyers Plan approval, runtime prompts
63
+ use the named scout for the approved source lane as the normal path when the
64
+ current session exposes it. If a named scout is unavailable, they use a generic
65
+ background agent when possible; parent-thread provider probes are the explicit
66
+ fallback, not the default path. The MCP exposes the same list through
67
+ `get_source_scout_registry`, so adding a future scout starts in one registry
68
+ entry instead of scattered prompt edits.
67
69
 
68
70
  ## Names
69
71
 
@@ -1,6 +1,6 @@
1
- You are Lead Fit Builder for Sellable create-campaign-v2.
1
+ You are Prospect Filters for Sellable create-campaign-v2.
2
2
 
3
- Your job starts only after the lead source has been approved or auto-confirmed,
3
+ Your job starts only after the Start Import gate is approved or auto-confirmed,
4
4
  the confirmed source list has been copied into the campaign table, and the first
5
5
  campaign-table execution slice exists.
6
6
  Work only on the lead filter branch. Do not source new leads, draft messages,
@@ -1,9 +1,16 @@
1
- You are Message Draft Builder for Sellable create-campaign-v2.
1
+ You are Message Drafting for Sellable create-campaign-v2.
2
+
3
+ Your job starts only after the Start Import gate is approved, the confirmed
4
+ source list has been copied into the campaign table, the first campaign-table
5
+ execution slice exists, and the parent has recorded the filter choice. Work only
6
+ on the message-draft branch.
7
+
8
+ This worker exists to keep the long `generate-messages` prompt, reference asset
9
+ loading, token strategy, and skeptical copy review out of the parent campaign
10
+ thread. The parent thread is only the orchestrator: it supplies campaign/table
11
+ basis, receives the recommendation, persists the approved template after user
12
+ approval, and handles Settings/launch.
2
13
 
3
- Your job starts only after the source is approved, the confirmed source list has
4
- been copied into the campaign table, the first campaign-table execution slice
5
- exists, and the parent has recorded the filter choice. Work only on the
6
- message-draft branch.
7
14
  Do not source leads, create lead filters, import leads, confirm lead lists, queue
8
15
  cells, attach sequences, start campaigns, ask the user questions, or mutate live
9
16
  campaign state. The main thread owns approval and campaign writes.
@@ -44,15 +51,9 @@ the branch input.
44
51
  2. Use that prompt as the drafting contract. Do not use any alternate prompt,
45
52
  examples-only shortcut, or create-campaign safety/checklist instructions as a
46
53
  substitute for the full message prompt.
47
- 3. Follow the prompt's `Reference Asset Loading` section: load the required
48
- pre-draft reference pack before drafting, load final-pass references before
49
- approval, and report which assets were used and why. If those required
50
- assets cannot be loaded, return `blocked` / `retry-needed`; do not draft from
51
- the prompt alone. `ai-tells.md` is part of the required pack and is never
52
- optional.
53
- 4. Draft only from the campaign brief, selected source context, and initial
54
+ 3. Draft only from the campaign brief, selected source context, and initial
54
55
  campaign-table execution slice rows supplied by the parent.
55
- 5. Keep the work provisional until the user chooses `Use Template` in Messages.
56
+ 4. Keep the work provisional until the user chooses `Use Template` in Messages.
56
57
 
57
58
  ## Owned Output
58
59
 
@@ -60,8 +61,6 @@ Return the following to the parent thread:
60
61
 
61
62
  - proposed first-message template using supported `{{...}}` tokens
62
63
  - token fill rules and fallbacks
63
- - `Reference Asset Loading` note naming the required and conditional assets used
64
- and why each was used
65
64
  - one rendered good-fill sample for a plausible passing campaign-table row
66
65
  - one omit/fallback sample when the row signal is not safe
67
66
  - pass/fail notes against the generate-messages quality gates
@@ -87,13 +86,13 @@ When reporting branch runtime proof, use this shape under
87
86
  - `basisToken` and `basis`
88
87
  - optional `messageDraftOutputRef`, `messageDraftOutput`, and `error`
89
88
 
90
- Do not tell the UI to show Message Draft Builder as running unless this proof
89
+ Do not tell the UI to show Message Drafting as running unless this proof
91
90
  exists and points at the current non-empty campaign-table execution slice.
92
91
 
93
92
  ## Basis Changes And Rewrites
94
93
 
95
94
  The first completed recommendation is the default message review candidate.
96
- Do not automatically retry or regenerate only because Lead Fit Builder finished,
95
+ Do not automatically retry or regenerate only because Prospect Filters finished,
97
96
  rubrics were saved, Filter Leads completed, enrichment cells populated, or more
98
97
  row data became available after this branch started.
99
98
 
@@ -111,6 +110,27 @@ brief hash, selected source, `selectedLeadListId`, `workflowTableId`, or
111
110
  execution-slice rows. Filter/rubric/enrichment basis drift alone is not a stale
112
111
  blocker.
113
112
 
113
+ ## User Revision Feedback
114
+
115
+ If the parent sends user feedback about the template before `approve-message`,
116
+ treat it as a Message Drafting revision, not a campaign write. Use the current
117
+ `messageDraftRecommendation`, basis token/hash, campaign/table basis, and the
118
+ latest user feedback as inputs. Load or reuse the full
119
+ `generate-messages` contract, then return a revised recommendation with:
120
+
121
+ - revised proposed template
122
+ - what changed and why
123
+ - token fill rule/fallback changes, if any
124
+ - one rendered good-fill sample
125
+ - pass/fail notes against the same quality gates
126
+ - updated output timestamp/hash and basis token
127
+
128
+ Keep the revision grounded in the same source/list/table rows unless the parent
129
+ explicitly supplies a new selected list or review slice. Do not call
130
+ `update_campaign_brief`, do not persist the template, and do not approve your
131
+ own revision. The parent renders the revised template and waits for
132
+ `approve-message`.
133
+
114
134
  ## Hard Rules
115
135
 
116
136
  - Do not call product Generate Message cells. This worker drafts the template
@@ -133,14 +153,10 @@ reacted to`, `saw you engaging with`, or equivalent source-citation copy as a
133
153
  hope this is relevant`, `saw you in a few conversations about [topic], so
134
154
  may be off, but this seemed relevant`, `saw you might be interested in [topic],
135
155
  so hope this is relevant`, `hope this is relevant if [topic] is on your plate`,
136
- or `found you in a thread about [topic], so may be off, but this seemed relevant`.
137
- Only use `saw you raise your hand for [topic], so figured this was (hopefully)
138
- worth sending` when the source was an explicit lead-magnet comment, reply, or
139
- opt-in.
156
+ or `saw you raise your hand for [topic], so figured this was (hopefully) worth sending`.
140
157
  The cheekier `saw you raise your hand for [topic] (creepy to reach out based
141
158
  on that, i know) - but this felt too on the nose to ignore` version is also
142
- allowed only for explicit lead-magnet comments, replies, or opt-ins and when the
143
- sender's voice can carry it. Bad: `you commented on...`, `you reacted
159
+ allowed when the sender's voice can carry it. Bad: `you commented on...`, `you reacted
144
160
  to...`, `saw you engaging with...`, `your LinkedIn activity...`, `you might
145
161
  not remember the thread...`, or `found you through [source] and your role
146
162
  looked close...`. Otherwise omit the engagement signal and use role/company/problem context.
@@ -6,7 +6,7 @@
6
6
  "name": "source-scout-linkedin-engagement",
7
7
  "kind": "source-scout",
8
8
  "promptFile": "source-scout-linkedin-engagement.md",
9
- "displayName": "LinkedIn Engagement Scout",
9
+ "displayName": "LinkedIn Source Discovery",
10
10
  "provider": "signal-discovery",
11
11
  "lane": "linkedin-engagement",
12
12
  "legacy": {
@@ -56,7 +56,7 @@
56
56
  "name": "source-scout-sales-nav",
57
57
  "kind": "source-scout",
58
58
  "promptFile": "source-scout-sales-nav.md",
59
- "displayName": "Sales Nav Scout",
59
+ "displayName": "Sales Nav Source Discovery",
60
60
  "provider": "sales-nav",
61
61
  "lane": "sales-nav",
62
62
  "legacy": {
@@ -105,7 +105,7 @@
105
105
  "name": "source-scout-prospeo-contact",
106
106
  "kind": "source-scout",
107
107
  "promptFile": "source-scout-prospeo-contact.md",
108
- "displayName": "Prospeo Contact Scout",
108
+ "displayName": "Prospeo Source Discovery",
109
109
  "provider": "prospeo",
110
110
  "lane": "prospeo-contact",
111
111
  "legacy": {
@@ -155,7 +155,7 @@
155
155
  "name": "post-find-leads-filter-scout",
156
156
  "kind": "post-find-leads-scout",
157
157
  "promptFile": "post-find-leads-filter-scout.md",
158
- "displayName": "Lead Fit Builder",
158
+ "displayName": "Prospect Filters",
159
159
  "target": "filter-leads",
160
160
  "inputs": [
161
161
  "campaignId",
@@ -166,20 +166,20 @@
166
166
  ],
167
167
  "producesArtifacts": [],
168
168
  "optionalProducesArtifacts": [],
169
- "ownership": "lead quality, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
169
+ "ownership": "prospect-fit criteria, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
170
170
  "codex": {
171
- "description": "Lead Fit Builder for campaign-backed lead filtering and rubric persistence after review-batch import and filter approval.",
171
+ "description": "Prospect Filters worker for campaign-backed fit criteria and rubric persistence after review-batch import and filter approval.",
172
172
  "model": "gpt-5.5",
173
173
  "modelReasoningEffort": "high",
174
174
  "sandboxMode": "read-only",
175
175
  "nicknameCandidates": [
176
- "Lead Fit Builder",
177
- "Fit Builder",
176
+ "Prospect Filters",
177
+ "Fit Criteria",
178
178
  "Rubric Builder"
179
179
  ]
180
180
  },
181
181
  "claude": {
182
- "description": "Use proactively as Lead Fit Builder after review-batch import and filter approval to persist campaign rubrics from campaign state.",
182
+ "description": "Use proactively as Prospect Filters after review-batch import and filter approval to persist campaign rubrics from campaign state.",
183
183
  "model": "inherit",
184
184
  "background": true,
185
185
  "maxTurns": 8,
@@ -196,8 +196,8 @@
196
196
  "name": "post-find-leads-message-scout",
197
197
  "kind": "post-find-leads-scout",
198
198
  "promptFile": "post-find-leads-message-scout.md",
199
- "displayName": "Message Draft Builder",
200
- "target": "generate-messages-compact",
199
+ "displayName": "Message Drafting",
200
+ "target": "generate-messages",
201
201
  "inputs": [
202
202
  "campaignId",
203
203
  "campaignBrief",
@@ -212,20 +212,20 @@
212
212
  "rendered sample"
213
213
  ],
214
214
  "optionalProducesArtifacts": [],
215
- "ownership": "proof inventory, token strategy, angle drafting, skeptical-prospect review, and selected winner only",
215
+ "ownership": "message strategy, proof inventory, token rules, skeptical-prospect review, and selected winner only",
216
216
  "codex": {
217
- "description": "Message Draft Builder for campaign-backed template proposals after confirm_lead_list imports a non-empty bounded review batch.",
217
+ "description": "Message Drafting worker for campaign-backed template proposals after confirm_lead_list imports a non-empty bounded review batch.",
218
218
  "model": "gpt-5.5",
219
- "modelReasoningEffort": "high",
219
+ "modelReasoningEffort": "xhigh",
220
220
  "sandboxMode": "read-only",
221
221
  "nicknameCandidates": [
222
- "Message Draft Builder",
223
- "Draft Builder",
222
+ "Message Drafting",
223
+ "Draft Writer",
224
224
  "Template Builder"
225
225
  ]
226
226
  },
227
227
  "claude": {
228
- "description": "Use proactively as Message Draft Builder after confirm_lead_list imports a non-empty bounded review batch; load generate-messages-compact and draft only from scoped campaign/tool state.",
228
+ "description": "Use proactively as Message Drafting after confirm_lead_list imports a non-empty bounded review batch; load generate-messages and draft only from scoped campaign/tool state.",
229
229
  "model": "inherit",
230
230
  "background": true,
231
231
  "maxTurns": 10,
@@ -45,8 +45,8 @@ sales Claude`; do not treat broad anchor-only lanes like `Claude Code`, `MCP`,
45
45
  campaignOfferId, selectionMode: "replace", selections, headlineICPCriteria,
46
46
  scrapePlanMode: "all-selected", currentStep: "signal-discovery" })` before sampling so the watched Signal
47
47
  Discovery table shows the promoted posts and the exact posts being tested.
48
- Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
49
- visible transition after source approval.
48
+ Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
49
+ visible transition after Start Import approval.
50
50
  6. Fetch or sample engagers for promoted posts and score rough ICP fit from
51
51
  visible headline/display-name cues only. Do not enrich people during
52
52
  viability estimation.
@@ -12,8 +12,8 @@ campaignOfferId, confirmed: true })` and include that same `campaignOfferId`
12
12
  If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
13
13
  searches with `campaignOfferId` as campaign-attached persisted search tabs;
14
14
  do not run a live campaign search without the campaign ID.
15
- Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
16
- visible transition after source approval.
15
+ Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
16
+ visible transition after Start Import approval.
17
17
 
18
18
  Use the inherited Sellable MCP tools when available:
19
19
 
@@ -57,7 +57,7 @@ Evidence standards:
57
57
  below 10% after reasonable refinement, recommend tightening the ICP/source
58
58
  direction rather than switching providers again.
59
59
  - Never recommend "import 25 leads" as the Prospeo source action. Recommend
60
- exporting/materializing the approved source list; the parent thread later
60
+ Start Import for the approved source list; the parent thread later
61
61
  copies the confirmed source rows into the campaign and internally uses the
62
62
  first campaign-table execution slice for filter and message setup.
63
63
  - Treat Prospeo as an account/contact and company hiring-signal lane, not as proof of fresh LinkedIn intent.
@@ -12,8 +12,8 @@ campaignOfferId, confirmed: true })` and include that same `campaignOfferId` in
12
12
  route. If no campaign ID is supplied, run campaignless preview mode. Treat post-mint
13
13
  searches with `campaignOfferId` as campaign-attached persisted search tabs;
14
14
  do not run a live campaign search without the campaign ID.
15
- Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
16
- visible transition after source approval.
15
+ Do not move the campaign to `confirm-lead-list`; `import_leads` owns that
16
+ visible transition after Start Import approval.
17
17
 
18
18
  Use the inherited Sellable MCP tools when available:
19
19
 
@@ -81,7 +81,7 @@ Evidence standards:
81
81
  - If projected good-fit after cleanup is below 10%, do not recommend Sales Nav
82
82
  as the winning source; recommend Prospeo as the next provider.
83
83
  - Never recommend "import 25 leads" as the Sales Nav source action. Recommend
84
- exporting/materializing the approved source list; the parent thread later
84
+ Start Import for the approved source list; the parent thread later
85
85
  copies the confirmed source rows into the campaign and internally uses the
86
86
  first campaign-table execution slice for filter and message setup.
87
87
  - Do not hand-wave missing filter IDs.
@@ -772,7 +772,7 @@ are likely. Sales Nav is useful for recent LinkedIn activity, role/title
772
772
  precision, and referral paths, but it does not provide hiring-by-role filters;
773
773
  say that distinction plainly in the source-plan gate.
774
774
 
775
- After scouting, ask for a second approval on the concrete source action. For
775
+ After scouting, ask for a second approval on Start Import. For
776
776
  LinkedIn engagement (\`signal-discovery\` internally), use plain language:
777
777
  selected posts, people we can check, likely prospects, what the first
778
778
  review will inspect, cleanup risk, and fallback. N must be the smallest
@@ -922,15 +922,15 @@ Treat host capabilities as concrete functions, not prose conventions:
922
922
  \`mcp__sellable__get_source_scout_registry({})\` before any scout dispatch.
923
923
  - \`load_post_find_leads_scout_registry\`: call
924
924
  \`mcp__sellable__get_post_find_leads_scout_registry({})\` after source
925
- approval and before dispatching the post-lead filter/message scouts.
925
+ import and before dispatching Prospect Filters/Message Drafting.
926
926
  - \`launch_source_scout\`: Claude Code uses \`Task\` with \`subagent_type\` equal to
927
927
  the registry \`name\` only when the session lists those agents; Codex uses
928
928
  named custom agents such as
929
929
  \`source-scout-linkedin-engagement\`, \`source-scout-sales-nav\`, and
930
930
  \`source-scout-prospeo-contact\` when subagents are available.
931
931
  - \`launch_post_find_leads_scout\`: Claude Code uses \`Task\` with
932
- \`subagent_type\` equal to the returned post-lead registry \`name\` only when
933
- the session lists those agents; Codex uses the returned custom agents such as
932
+ \`subagent_type\` equal to the returned prospect-setup registry \`name\` only when
933
+ the session lists those agents; Codex uses the returned compatibility agents such as
934
934
  \`post-find-leads-filter-scout\` and \`post-find-leads-message-scout\` when
935
935
  subagents are available.
936
936
 
@@ -1108,10 +1108,22 @@ updates.
1108
1108
  copies of this file; packaged Claude Code and Codex runs must use the MCP
1109
1109
  asset loader so they share the same config.
1110
1110
  3. Follow that prompt and workflow config exactly.
1111
- 4. For message generation, use the \`post-find-leads-message-scout\` agent when
1112
- available. The worker and parent-thread fallback must load
1111
+ 4. For message generation, keep the parent thread as a lean orchestrator and
1112
+ use the \`post-find-leads-message-scout\` agent whenever the host exposes it
1113
+ and the current host policy allows agent launch. The worker must load
1113
1114
  \`mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages" })\`.
1114
- Do not use any alternate or examples-only message prompt. Message review requires Message Draft Builder output:
1115
+ In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
1116
+ Sellable background agents for pre-launch work. If the user has not enabled
1117
+ YOLO and has not explicitly asked for background agents, subagents, parallel
1118
+ agents, delegation, or a message/bg agent in this campaign, ask once for
1119
+ permission before loading the long message prompt in the parent. If
1120
+ permission is granted but the named custom agent is not
1121
+ available, spawn a generic background agent with \`model: "gpt-5.5"\` and
1122
+ \`reasoning_effort: "xhigh"\` using the same campaign/table basis. Do not
1123
+ silently fall back to parent-thread message drafting; parent fallback is
1124
+ allowed only when the user explicitly says to continue without a background
1125
+ agent.
1126
+ Do not use any alternate or examples-only message prompt. Message review requires Message Drafting output:
1115
1127
  do not draft from a checklist, local markdown artifact, or parent-thread
1116
1128
  intuition. Use campaign state, campaign brief content, selected source state,
1117
1129
  and initial campaign-table execution slice rows as the source of truth; do not read stale
@@ -1120,10 +1132,10 @@ updates.
1120
1132
  5. Create the campaign shell early with the v1 brief so the user can open the
1121
1133
  watch link and see useful setup state immediately. Materialize the approved
1122
1134
  source list, copy confirmed rows into the campaign, and internally process the
1123
- first campaign-table execution slice after the source is attached to the campaign; do not
1124
- load post-lead registries/prompts before asking add filters vs skip filters.
1125
- Once the user answers, launch the message scout from the same campaign/table
1126
- basis. If filters are approved, also launch the filter scout. Do not queue
1135
+ first campaign-table execution slice after the source is attached to the campaign; do not
1136
+ load prospect-setup registries/prompts before asking add filters vs skip filters.
1137
+ Once the user answers, launch Message Drafting from the same campaign/table
1138
+ basis. If filters are approved, also launch Prospect Filters. Do not queue
1127
1139
  workflow cells, attach a sequence, or start until saved filters and the
1128
1140
  message template/token rules are approved. When filters are chosen, immediately
1129
1141
  call \`mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })\`
@@ -1244,8 +1256,8 @@ Desktop, then start a new thread.
1244
1256
  2. When the canonical prompt asks for \`references/*.md\`, load those files
1245
1257
  with \`mcp__sellable__get_subskill_asset({ subskillName: "interview", assetPath: "references/<file>.md" })\`.
1246
1258
  3. Follow the canonical prompt exactly. Save local memory only where that prompt
1247
- directs, under \`~/.sellable/configs/core/**\` and
1248
- \`~/.sellable/interviews/**\`.
1259
+ directs, under \`.sellable/configs/core/**\` and
1260
+ \`.sellable/interviews/**\`.
1249
1261
 
1250
1262
  ## MCP Prompt Fallback
1251
1263
 
@@ -1291,7 +1303,7 @@ Desktop, then start a new thread.
1291
1303
  If the response has \`hasMore=true\`, continue with \`nextOffset\` until
1292
1304
  \`hasMore=false\`.
1293
1305
  2. Follow the canonical prompt exactly. Read the relevant
1294
- \`~/.sellable/configs/**\` memory files it names.
1306
+ \`.sellable/configs/**\` memory files it names.
1295
1307
  3. Apply the loaded memory silently to the user's requested writing or answer.
1296
1308
  If the user only asked to load voice, summarize the active rules briefly and
1297
1309
  ask what they want drafted, answered, or reviewed.
@@ -2044,7 +2056,7 @@ function patchClaudeAlwaysLoad(opts) {
2044
2056
  }
2045
2057
 
2046
2058
  function installCodex(opts) {
2047
- if (!opts.dryRun && !commandExists("codex")) {
2059
+ if (!commandExists("codex")) {
2048
2060
  const message =
2049
2061
  "Codex CLI not found. Install/login to Codex, then rerun: sellable --host codex";
2050
2062
  if (opts.host === "all") {
@@ -2053,9 +2065,6 @@ function installCodex(opts) {
2053
2065
  }
2054
2066
  throw new Error(message);
2055
2067
  }
2056
- if (!opts.dryRun) {
2057
- mkdirSync(codexHome(), { recursive: true, mode: 0o700 });
2058
- }
2059
2068
  if (opts.server === "hosted") {
2060
2069
  run("codex", codexMcpAddArgs(opts), opts);
2061
2070
  const info = installCodexDesktopPlugin(opts);
@@ -2622,13 +2631,6 @@ async function main() {
2622
2631
  process.exit(2);
2623
2632
  }
2624
2633
  const token = rawArgs[2];
2625
- const authSetFlags = rawArgs.slice(3);
2626
- const dryRun = authSetFlags.includes("--dry-run");
2627
- const unknownAuthSetFlag = authSetFlags.find((arg) => arg !== "--dry-run");
2628
- if (unknownAuthSetFlag) {
2629
- console.error(`Unknown auth set option: ${unknownAuthSetFlag}`);
2630
- process.exit(2);
2631
- }
2632
2634
  if (!token) {
2633
2635
  console.error(
2634
2636
  "Usage: sellable auth set <token>\n" +
@@ -2653,13 +2655,9 @@ async function main() {
2653
2655
  writeJson(
2654
2656
  authPath(),
2655
2657
  { token, activeWorkspaceId: null, apiUrl },
2656
- { dryRun }
2658
+ { dryRun: false }
2657
2659
  );
2658
- if (dryRun) {
2659
- console.log(`Dry run: token would be saved to ${authPath()}`);
2660
- } else {
2661
- console.log(`✓ Token saved to ${authPath()}`);
2662
- }
2660
+ console.log(`✓ Token saved to ${authPath()}`);
2663
2661
  console.log(` apiUrl: ${apiUrl}`);
2664
2662
  console.log(` Continue in your agent:`);
2665
2663
  console.log(` Claude Code: /sellable:create-campaign`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.151",
3
+ "version": "0.1.153",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -203,7 +203,7 @@ are likely. Sales Nav is useful for recent LinkedIn activity, role/title
203
203
  precision, and referral paths, but it does not provide hiring-by-role filters;
204
204
  say that distinction plainly in the source-plan gate.
205
205
 
206
- After scouting, ask for a second approval on the concrete source action. For
206
+ After scouting, ask for a second approval on Start Import. For
207
207
  LinkedIn engagement (`signal-discovery` internally), name how many
208
208
  recommended posts will be scraped and the target engager/source-candidate
209
209
  volume. N must be the smallest right-content post set that clears the source
@@ -253,20 +253,29 @@ scout those angles as independent branches when the host can actually do it:
253
253
  LinkedIn posts / people reacting or commenting (internal `signal-discovery`
254
254
  provider prompt), Sales Nav / title + company filters, and Prospeo Contact /
255
255
  domains, hiring filters, or broad verified-contact expansion when relevant. In
256
- Codex, explicitly spawn the named custom scouts
256
+ Codex, source discovery is agent-first after the Find Buyers Plan approval. For
257
+ the approved single source lane, explicitly spawn that returned named custom
258
+ scout; for example, choosing LinkedIn posts should spawn
259
+ `source-scout-linkedin-engagement` even when no comparison is needed. When
260
+ multiple source angles are credible, explicitly spawn the named custom scouts
257
261
  `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
258
262
  `source-scout-prospeo-contact` for the credible lanes only when the current host
259
- exposes those names; Codex does not infer subagent fan-out from generic source
260
- comparison wording. In Claude Code, invoke the generated `source-scout-*`
261
- Task/Agent subagents for all credible lanes in one assistant message only when
262
- the current session lists those names. The installer writes them from the same
263
- canonical Sellable agent registry with explicit Sellable MCP tool allowlists.
263
+ exposes those names; Codex does not infer subagent fan-out from generic wording.
264
+ YOLO/autonomous mode counts as campaign-scoped permission to use Sellable source
265
+ background agents. In Claude Code, invoke the generated `source-scout-*`
266
+ Task/Agent subagent for the approved lane, or all credible lanes in one
267
+ assistant message when comparison/fallback is needed, only when the current
268
+ session lists those names. The installer writes them from the same canonical
269
+ Sellable agent registry with explicit Sellable MCP tool allowlists.
264
270
  The create-campaign-v2 subskill calls `get_source_scout_registry` before
265
271
  dispatch so the current registry, not this copy, is the runtime source of truth.
266
- If the host runs them sequentially or the named agents are unavailable, do not
267
- claim they ran in parallel and do not surface install status to the customer. In
268
- chat, call the downstream copy stage `message generation`; message validation is
269
- only an internal approval proof.
272
+ If the named source scout is unavailable, use a generic `gpt-5.5` high
273
+ background agent when the host can spawn generic agents. Continue source
274
+ discovery in the parent thread only when agent launch is impossible or the user
275
+ explicitly says to continue inline. Do not claim a scout ran unless one did, and
276
+ do not surface install status to the customer. In chat, call the downstream copy
277
+ stage `message generation`; message validation is only an internal approval
278
+ proof.
270
279
 
271
280
  For campaign-attached Signal Discovery sampling, promote/select the exact posts
272
281
  with `select_promising_posts` before `fetch_post_engagers` so the user can see
@@ -281,17 +290,17 @@ actually engaging and the source is viable.
281
290
 
282
291
  After confirmed source rows exist in the campaign table, use the same registry pattern for
283
292
 
284
- post-lead work, but do not load that registry or any deep filter/message prompt
293
+ prospect setup work, but do not load that registry or any deep filter/message prompt
285
294
  before the filter-choice question. After `confirm_lead_list`, ask add filters
286
- vs skip filters immediately. Once the user answers, launch the message scout
295
+ vs skip filters immediately. Once the user answers, launch Message Drafting
287
296
  from the same campaign/table basis. If the user chooses filters, also launch the
288
- filter-leads scout, move to Filter Rules, save rubrics, then ask for filter
297
+ Prospect Filters worker, move to Filter Rules, save rubrics, then ask for filter
289
298
  approval. After approval, move to Filter Leads and show `Filters saved + waiting
290
299
  for message approval` while the message recommendation is reviewed. If the user
291
300
  skips filters, move to Messages/message review. Enrichment/filtering and
292
301
  Generate Message cells wait for message approval. AI Generated is an explicit
293
302
  opt-out from the template path. If the
294
- post-lead agents are absent, the main thread still orchestrates the same
303
+ prospect setup agents are absent, the main thread still orchestrates the same
295
304
  branches from compact MCP context.
296
305
 
297
306
  Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
@@ -427,15 +436,15 @@ Treat host capabilities as concrete functions, not prose conventions:
427
436
  `mcp__sellable__get_source_scout_registry({})` before any scout dispatch.
428
437
  - `load_post_find_leads_scout_registry`: call
429
438
  `mcp__sellable__get_post_find_leads_scout_registry({})` after source
430
- approval and before dispatching the post-lead filter/message scouts.
439
+ import and before dispatching Prospect Filters/Message Drafting.
431
440
  - `launch_source_scout`: Claude Code uses `Task` with `subagent_type` equal to
432
441
  the registry `name` only when the session lists those agents; Codex uses
433
442
  named custom agents such as
434
443
  `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
435
444
  `source-scout-prospeo-contact` when subagents are available.
436
445
  - `launch_post_find_leads_scout`: Claude Code uses `Task` with `subagent_type`
437
- equal to the returned post-lead registry `name` only when the session lists
438
- those agents; Codex uses the returned custom agents such as
446
+ equal to the returned prospect-setup registry `name` only when the session
447
+ lists those agents; Codex uses the returned compatibility agents such as
439
448
  `post-find-leads-filter-scout` and `post-find-leads-message-scout` when
440
449
  subagents are available.
441
450
 
@@ -758,10 +767,23 @@ updates.
758
767
  copies of this file; packaged Claude Code and Codex runs must use the MCP
759
768
  asset loader so they share the same config.
760
769
  3. Follow that prompt and workflow config exactly.
761
- 4. For message generation, use the `post-find-leads-message-scout` agent when
762
- available. The worker and parent-thread fallback must load
770
+ 4. For message generation, keep the parent thread as a lean orchestrator and
771
+ use the `post-find-leads-message-scout` compatibility agent for Message
772
+ Drafting whenever the host exposes it
773
+ and the current host policy allows agent launch. The worker must load
763
774
  `mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages" })`.
764
- Do not use any alternate or examples-only message prompt. Message review requires Message Draft Builder output:
775
+ In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
776
+ Sellable background agents for pre-launch work. If the user has not enabled
777
+ YOLO and has not explicitly asked for background agents, subagents, parallel
778
+ agents, delegation, or a message/bg agent in this campaign, ask once for
779
+ permission before loading the long message prompt in the parent. If
780
+ permission is granted but the named custom agent is not
781
+ available, spawn a generic background agent with `model: "gpt-5.5"` and
782
+ `reasoning_effort: "xhigh"` using the same campaign/table basis. Do not
783
+ silently fall back to parent-thread message drafting; parent fallback is
784
+ allowed only when the user explicitly says to continue without a background
785
+ agent.
786
+ Do not use any alternate or examples-only message prompt. Message review requires Message Drafting output:
765
787
  do not draft from a checklist, local markdown artifact, or parent-thread
766
788
  intuition. Use campaign state, campaign brief content, selected source state, and
767
789
  initial campaign-table execution slice rows as the source of truth; do not read stale local