@sellable/mcp 0.1.205 → 0.1.206

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.
Files changed (50) hide show
  1. package/README.md +11 -10
  2. package/agents/post-find-leads-filter-scout.md +2 -2
  3. package/agents/post-find-leads-message-scout.md +18 -23
  4. package/agents/registry.json +17 -17
  5. package/agents/source-scout-linkedin-engagement.md +2 -2
  6. package/agents/source-scout-prospeo-contact.md +3 -3
  7. package/agents/source-scout-sales-nav.md +3 -3
  8. package/dist/engage-memory.js +5 -0
  9. package/dist/identity-memory.js +4 -0
  10. package/dist/index-dev.js +0 -0
  11. package/dist/index.js +0 -0
  12. package/dist/tools/engage-memory.js +2 -2
  13. package/dist/tools/leads.js +7 -11
  14. package/dist/tools/prompts.js +6 -7
  15. package/package.json +1 -1
  16. package/skills/create-campaign/SKILL.md +24 -11
  17. package/skills/create-campaign/context/learnings.md +1 -1
  18. package/skills/create-campaign/references/brief-template.md +2 -2
  19. package/skills/create-campaign-brief/references/brief-template.md +2 -2
  20. package/skills/create-campaign-brief/references/draft-lifecycle.md +1 -1
  21. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +2 -2
  22. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +28 -41
  23. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +9 -12
  24. package/skills/create-campaign-v2/SKILL.md +27 -21
  25. package/skills/create-campaign-v2/SOUL.md +12 -9
  26. package/skills/create-campaign-v2/core/flow.v2.json +1 -1
  27. package/skills/create-campaign-v2/references/ai-tells.md +10 -35
  28. package/skills/create-campaign-v2/references/approval-gate-framing.md +3 -3
  29. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +16 -30
  30. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +1 -1
  31. package/skills/create-campaign-v2/references/step-13-import-leads.md +2 -2
  32. package/skills/create-campaign-v2/references/thomas-revision-filters.md +3 -12
  33. package/skills/create-campaign-v2/references/validation-criteria.md +5 -8
  34. package/skills/create-campaign-v2/references/watch-guide-narration.md +2 -2
  35. package/skills/create-campaign-v2-tail/SKILL.md +9 -9
  36. package/skills/create-campaign-v2-validation/SKILL.md +1 -1
  37. package/skills/create-post/SKILL.md +27 -27
  38. package/skills/engage/SKILL.md +12 -12
  39. package/skills/engage/core/README.md +14 -14
  40. package/skills/find-leads/SKILL.md +1 -1
  41. package/skills/generate-messages/SKILL.md +75 -175
  42. package/skills/interview/SKILL.md +24 -24
  43. package/skills/interview/references/legacy-linkedin-interview.md +12 -12
  44. package/skills/interview/references/reference-curation.md +4 -4
  45. package/skills/interview/references/voice-capture-method.md +1 -1
  46. package/skills/load-voice/SKILL.md +25 -21
  47. package/skills/providers/signal-discovery.md +2 -2
  48. package/skills/research/SKILL.md +1 -1
  49. package/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md +0 -252
  50. package/skills/research/config.json +0 -9
package/README.md CHANGED
@@ -287,9 +287,10 @@ Parallel execution contract:
287
287
  `source-scout-prospeo-contact`. Use `multi_tool_use.parallel` for independent
288
288
  tool-call batches when subagents are unavailable or the work is only simple
289
289
  batched lookups.
290
- - For the post-lead stage, Codex/Claude should launch
291
- `post-find-leads-filter-scout` and `post-find-leads-message-scout` in the
292
- same turn/message when those subagents are available in the current session.
290
+ - For prospect setup, Codex/Claude should launch Prospect Filters
291
+ (`post-find-leads-filter-scout`) and Message Drafting
292
+ (`post-find-leads-message-scout`) in the same turn/message when those
293
+ subagents are available in the current session.
293
294
  If not, run them sequentially with MCP tools/assets, do not surface install
294
295
  status to the customer, and do not claim parallel work.
295
296
  - If neither backend is available, run sequentially with the same output schema.
@@ -345,12 +346,12 @@ with outcomes, and tracked people (LinkedIn profiles), all scoped by workspace.
345
346
 
346
347
  - Auth + active workspace: `~/.sellable/config.json` (or `SELLABLE_CONFIG_PATH`; old `$CODEX_HOME/sellable.json`, `~/.codex/sellable.json`, and `~/.claude/sellable.json` files remain compatibility fallbacks)
347
348
  - Engage memory (style guide + searches + tracked people): `sellable.engage.json` (or `SELLABLE_ENGAGE_MEMORY_PATH`)
348
- - Team-editable durable configs (home-level source of truth):
349
- - `~/.sellable/configs/writing/styleguide.md`
350
- - `~/.sellable/configs/audience/icp-filters.md`
351
- - `~/.sellable/configs/proof/claims.md`
352
- - `~/.sellable/configs/discovery/influencers.md`
353
- - `~/.sellable/configs/discovery/post-filters.md`
349
+ - Team-editable, project-local configs (recommended to edit in git):
350
+ - `./.sellable/configs/writing/styleguide.md`
351
+ - `./.sellable/configs/audience/icp-filters.md`
352
+ - `./.sellable/configs/proof/claims.md`
353
+ - `./.sellable/configs/discovery/influencers.md`
354
+ - `./.sellable/configs/discovery/post-filters.md`
354
355
 
355
356
  Files under `mcp/sellable/skills/**/core/*` are **package repo files**, not the intended user config surface.
356
357
 
@@ -363,7 +364,7 @@ Primary public entrypoint for the approval-gated campaign creation flow.
363
364
  ### interview
364
365
 
365
366
  Public identity/company memory interview. Builds durable core files under
366
- `~/.sellable/configs/core/**`, raw archives under `~/.sellable/interviews/**`,
367
+ `./.sellable/configs/core/**`, raw archives under `./.sellable/interviews/**`,
367
368
  and reusable answer/proof/story/transcript/reference memory for downstream
368
369
  Sellable writing workflows.
369
370
 
@@ -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
 
@@ -133,14 +132,10 @@ reacted to`, `saw you engaging with`, or equivalent source-citation copy as a
133
132
  hope this is relevant`, `saw you in a few conversations about [topic], so
134
133
  may be off, but this seemed relevant`, `saw you might be interested in [topic],
135
134
  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.
135
+ or `saw you raise your hand for [topic], so figured this was (hopefully) worth sending`.
140
136
  The cheekier `saw you raise your hand for [topic] (creepy to reach out based
141
137
  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
138
+ allowed when the sender's voice can carry it. Bad: `you commented on...`, `you reacted
144
139
  to...`, `saw you engaging with...`, `your LinkedIn activity...`, `you might
145
140
  not remember the thread...`, or `found you through [source] and your role
146
141
  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.
@@ -8,6 +8,11 @@ function resolveConfigsDir() {
8
8
  if (process.env.SELLABLE_CONFIGS_DIR) {
9
9
  candidates.push(path.resolve(process.env.SELLABLE_CONFIGS_DIR));
10
10
  }
11
+ // Same resolution strategy as skills.ts
12
+ if (process.argv[1]) {
13
+ candidates.push(path.resolve(path.dirname(process.argv[1]), "../../.sellable/configs"));
14
+ }
15
+ candidates.push(path.resolve(process.cwd(), ".sellable/configs"));
11
16
  candidates.push(path.resolve(os.homedir(), ".sellable/configs"));
12
17
  for (const candidate of candidates) {
13
18
  if (fs.existsSync(candidate)) {
@@ -20,6 +20,10 @@ export function resolveIdentityConfigsDir() {
20
20
  if (process.env.SELLABLE_CONFIGS_DIR) {
21
21
  candidates.push(path.resolve(process.env.SELLABLE_CONFIGS_DIR));
22
22
  }
23
+ if (process.argv[1]) {
24
+ candidates.push(path.resolve(path.dirname(process.argv[1]), "../../.sellable/configs"));
25
+ }
26
+ candidates.push(path.resolve(process.cwd(), ".sellable/configs"));
23
27
  candidates.push(path.resolve(os.homedir(), ".sellable/configs"));
24
28
  for (const candidate of candidates) {
25
29
  if (fs.existsSync(candidate)) {
package/dist/index-dev.js CHANGED
File without changes
package/dist/index.js CHANGED
File without changes
@@ -2,7 +2,7 @@ import { copySenderConfig, getEngageMemory, migrateFlatConfigs, recordProvenSear
2
2
  export const engageMemoryToolDefinitions = [
3
3
  {
4
4
  name: "get_engage_memory",
5
- description: "Load backward-compatible engage memory from ~/.sellable/configs/: style guide, proven search keywords, tracked people, plus optional core identity/company memory. All data lives in readable markdown files the user can also edit directly. When senderId is provided, reads compatibility overrides from senders/{senderId}/ with flat-path fallback.",
5
+ description: "Load backward-compatible engage memory from .sellable/configs/: style guide, proven search keywords, tracked people, plus optional core identity/company memory. All data lives in readable markdown files the user can also edit directly. When senderId is provided, reads compatibility overrides from senders/{senderId}/ with flat-path fallback.",
6
6
  inputSchema: {
7
7
  type: "object",
8
8
  properties: {
@@ -17,7 +17,7 @@ export const engageMemoryToolDefinitions = [
17
17
  },
18
18
  {
19
19
  name: "set_engage_style_guide",
20
- description: "Write the user's commenting style guide. When senderId is provided, writes to ~/.sellable/configs/senders/{senderId}/styleguide-core.md. Otherwise writes to ~/.sellable/configs/writing/styleguide-core.md.",
20
+ description: "Write the user's commenting style guide. When senderId is provided, writes to .sellable/configs/senders/{senderId}/styleguide-core.md. Otherwise writes to .sellable/configs/writing/styleguide-core.md.",
21
21
  inputSchema: {
22
22
  type: "object",
23
23
  properties: {
@@ -1364,7 +1364,7 @@ export const leadToolDefinitions = [
1364
1364
  },
1365
1365
  limit: {
1366
1366
  type: "number",
1367
- description: "Max posts (default 25, max 50). Used for profile or company search.",
1367
+ description: "Max posts (default 25, max 50). Used for profile search.",
1368
1368
  },
1369
1369
  headlineICPCriteria: {
1370
1370
  type: "array",
@@ -3087,7 +3087,7 @@ export async function confirmLeadList(input) {
3087
3087
  messageDraftBuilder: {
3088
3088
  firstAllowedStartPoint: "confirm_lead_list",
3089
3089
  startAllowed: true,
3090
- requiredBeforeRunningCopy: "Persist watchNarration.workerDetails.messageDraftBuilder with runId or fallbackId, statusSource, status, startedAt, updatedAt, and current basis before showing Message Draft Builder as In Progress.",
3090
+ requiredBeforeRunningCopy: "Persist watchNarration.workerDetails.messageDraftBuilder with runId or fallbackId, statusSource, status, startedAt, updatedAt, and current basis before showing Message Drafting as In Progress.",
3091
3091
  requiredLiveInputs: {
3092
3092
  campaignOfferId,
3093
3093
  selectedLeadListId: resolvedLeadListId,
@@ -3133,10 +3133,10 @@ export async function confirmLeadList(input) {
3133
3133
  warning: partialSourceListWarning,
3134
3134
  },
3135
3135
  message: copyStillRunning
3136
- ? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}First ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} are copied into the campaign table and the rest of the confirmed source list is still copying. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading post-lead workers.`
3136
+ ? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}First ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} are copied into the campaign table and the rest of the confirmed source list is still copying. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading prospect setup workers.`
3137
3137
  : importedRowCount > keptReviewRowCount
3138
- ? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading post-lead workers.`
3139
- : `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table for the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading post-lead workers.`,
3138
+ ? `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table. Use the first ${keptReviewRowCount.toLocaleString("en-US")} as the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading prospect setup workers.`
3139
+ : `${partialSourceListAccepted ? "Using the user-approved partial source snapshot. " : ""}Copied ${importedRowCount.toLocaleString("en-US")} source candidate${importedRowCount === 1 ? "" : "s"} into the campaign table for the review/process sample. The watched campaign is now on filter-choice; ask add filters vs skip filters before loading prospect setup workers.`,
3140
3140
  };
3141
3141
  }
3142
3142
  export function getProviderPrompt(input) {
@@ -3176,9 +3176,7 @@ export async function selectPromisingPosts(input) {
3176
3176
  const { campaignOfferId, selections, headlineICPCriteria, selectionMode, mode, scrapePlanMode, targetEngagerCount, maxPostsToScrape, } = input;
3177
3177
  const effectiveMode = selectionMode ?? mode ?? "replace";
3178
3178
  const effectiveScrapePlanMode = scrapePlanMode ??
3179
- (targetEngagerCount || maxPostsToScrape
3180
- ? "capacity-target"
3181
- : "all-selected");
3179
+ (targetEngagerCount || maxPostsToScrape ? "capacity-target" : "all-selected");
3182
3180
  if (selections.length > MAX_SIGNAL_DISCOVERY_POSTS) {
3183
3181
  return {
3184
3182
  success: false,
@@ -3250,9 +3248,7 @@ export async function selectPromisingPosts(input) {
3250
3248
  }
3251
3249
  const recommendation = buildSignalDiscoverySourceRecommendation({
3252
3250
  selectedPosts: Array.from(selectedByUrl.values()),
3253
- targetEngagerCount: effectiveScrapePlanMode === "capacity-target"
3254
- ? targetEngagerCount
3255
- : null,
3251
+ targetEngagerCount: effectiveScrapePlanMode === "capacity-target" ? targetEngagerCount : null,
3256
3252
  maxPostsToScrape: effectiveScrapePlanMode === "capacity-target" ? maxPostsToScrape : null,
3257
3253
  });
3258
3254
  sourceRecommendation = recommendation.message;
@@ -157,7 +157,7 @@ export const promptToolDefinitions = [
157
157
  },
158
158
  {
159
159
  name: "get_post_find_leads_scout_registry",
160
- description: "Return the canonical Sellable post-find-leads scout names for the two parallel workstreams unlocked after lead source approval: filter-leads and message generation.",
160
+ description: "Return canonical Sellable prospect-setup worker names for Prospect Filters and Message Drafting after Start Import copies confirmed source rows.",
161
161
  inputSchema: {
162
162
  type: "object",
163
163
  properties: {},
@@ -330,7 +330,7 @@ export function getPostFindLeadsScoutRegistry() {
330
330
  "basis.workflowTableId",
331
331
  "basis.reviewSampleRowHash or basis.reviewSampleRowIds",
332
332
  ],
333
- promptRequired: 'get_subskill_prompt({ subskillName: "generate-messages" }); the full generate-messages prompt is required for normal message drafting, then follow its Reference Asset Loading step and load the required pre-draft reference pack before drafting. ai-tells.md is required and never optional. If the required assets cannot be loaded, return blocked/retry-needed instead of drafting from the prompt alone.',
333
+ promptRequired: 'get_subskill_prompt({ subskillName: "generate-messages" }); the full generate-messages prompt and its Reference Asset Loading pack are required inside the Message Drafting branch for normal message drafting. If required assets cannot be loaded, return blocked/retry-needed instead of drafting from prompt memory.',
334
334
  basisFields: [
335
335
  "campaign revision or updatedAt",
336
336
  "brief hash",
@@ -343,7 +343,6 @@ export function getPostFindLeadsScoutRegistry() {
343
343
  messageDraftOutputFields: [
344
344
  "templateRecommendation",
345
345
  "tokenFillRules",
346
- "referenceAssetLoading",
347
346
  "renderedSample",
348
347
  "concerns",
349
348
  "status",
@@ -353,12 +352,12 @@ export function getPostFindLeadsScoutRegistry() {
353
352
  "outputHash",
354
353
  "error or retry detail",
355
354
  ],
356
- reusePolicy: "The first completed Message Draft Builder recommendation remains the default review candidate. Later Lead Fit Builder, Filter Leads, enrichment, or rubric completion may make an enriched rewrite available, but does not automatically retry or replace the initial draft unless campaign/brief/source/list/table/review-sample identity mismatches or the initial output failed.",
355
+ reusePolicy: "The first completed Message Drafting recommendation remains the default review candidate. Later Prospect Filters, Filter Leads, enrichment, or rubric completion may make an enriched rewrite available, but does not automatically retry or replace the initial draft unless campaign/brief/source/list/table/review-sample identity mismatches or the initial output failed.",
357
356
  },
358
357
  usage: {
359
- codex: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not spawn returned post-lead scout names before that question. Once the user answers, spawn Message Draft Builder from the same campaign/table basis. If the user chooses filters, also spawn Lead Fit Builder, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
360
- claude: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not invoke returned post-lead Task/Agent names before that question. Once the user answers, invoke Message Draft Builder from the same campaign/table basis. If the user chooses filters, also invoke Lead Fit Builder, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
361
- parentThreadRule: 'Named agents are optional acceleration, but message drafting is not optional. If post-find-leads-message-scout is available, run it as the background Message Draft Builder after the filter-choice answer. If it is absent, do not customer-surface install status; the main thread must execute the same message branch from CampaignOffer state, selected source state, workflowTableId, and initial campaign-table execution slice rows. Local markdown/json files are not normal-path inputs. The filter-choice question is the first post-import user gate; do not load post-lead registries or filter references before it. Message drafting starts after the filter-choice answer, must load get_subskill_prompt({ subskillName: "generate-messages" }), must follow Reference Asset Loading and load the required pre-draft reference pack before drafting, must include ai-tells.md because it is never optional, must return blocked/retry-needed if required assets cannot be loaded, must read live campaign table state through scoped MCP/product tools, and must reject mismatched selectedLeadListId/workflowTableId/campaign/workspace input. Do not use any alternate or examples-only message prompt. On the filter path, keep the browser on Filter Rules after save_rubrics so the user can approve the saved criteria; only then move to Filter Leads, show `Filters saved + waiting for message approval`, and wait there for message approval. Enrichment, filtering, Generate Message cells, sender setup, sequence attach, and launch wait for template approval on the Use Template path. On the skip path, move to Messages/message review and wait for message approval before enrichment or Settings. Do not render message review from checklist or shortcut instructions; message review requires a messageDraftRecommendation whose basis proves the generate-messages prompt ran for the current campaign/table execution slice. Do not automatically rerun Message Draft Builder after filters/enrichment finish; show the initial draft by default and offer an enriched rewrite only with explicit user opt-in.',
358
+ codex: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not spawn returned prospect-setup worker names before that question. Once the user answers, spawn Message Drafting from the same campaign/table basis whenever Codex agent-launch policy is satisfied. Treat YOLO/autonomous mode as campaign-scoped permission to use Sellable background agents for pre-launch work. If the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once for permission before loading generate-messages in the parent. If permission is granted and the named custom agent is unavailable, spawn a generic gpt-5.5 xhigh background agent with the same campaign/table basis. If the user chooses filters, also spawn Prospect Filters when allowed, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
359
+ claude: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not invoke returned prospect-setup Task/Agent names before that question. Once the user answers, invoke Message Drafting from the same campaign/table basis. If the user chooses filters, also invoke Prospect Filters, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
360
+ parentThreadRule: 'Message drafting is agent-first, not optional acceleration. If post-find-leads-message-scout is available, run that compatibility agent as background Message Drafting after the filter-choice answer. In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use Sellable background agents for pre-launch work; if the user has not enabled YOLO and has not explicitly asked for background agents/subagents/parallel agents/delegation/message bg agent in this campaign, ask once for that permission before loading generate-messages in the parent. If permission is granted and the named custom agent is unavailable, spawn a generic gpt-5.5 xhigh background agent with the same campaign/table basis. Do not silently fall back to parent-thread message drafting. The parent may run the message branch inline only if the user explicitly says to continue without a background agent; when doing so, state that message generation is running inline. Local markdown/json files are not normal-path inputs. The filter-choice question is the first post-import user gate; do not load prospect-setup registries or filter references before it. Message drafting starts after the filter-choice answer, must load get_subskill_prompt({ subskillName: "generate-messages" }) and its Reference Asset Loading pack inside the branch or explicitly approved inline fallback, must read live campaign table state through scoped MCP/product tools, and must reject mismatched selectedLeadListId/workflowTableId/campaign/workspace input. Do not use any alternate or examples-only message prompt. On the filter path, keep the browser on Filter Rules after save_rubrics so the user can approve the saved criteria; only then move to Filter Leads, show `Filters saved + waiting for message approval`, and wait there for message approval. Enrichment, filtering, Generate Message cells, sender setup, sequence attach, and launch wait for template approval on the Use Template path. On the skip path, move to Messages/message review and wait for message approval before enrichment or Settings. Do not render message review from checklist or shortcut instructions; message review requires a messageDraftRecommendation whose basis proves the generate-messages prompt ran for the current campaign/table execution slice. Do not automatically rerun Message Drafting after filters/enrichment finish; show the initial draft by default and offer an enriched rewrite only with explicit user opt-in.',
362
361
  },
363
362
  };
364
363
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.205",
3
+ "version": "0.1.206",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -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
@@ -281,17 +281,17 @@ actually engaging and the source is viable.
281
281
 
282
282
  After confirmed source rows exist in the campaign table, use the same registry pattern for
283
283
 
284
- post-lead work, but do not load that registry or any deep filter/message prompt
284
+ prospect setup work, but do not load that registry or any deep filter/message prompt
285
285
  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
286
+ vs skip filters immediately. Once the user answers, launch Message Drafting
287
287
  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
288
+ Prospect Filters worker, move to Filter Rules, save rubrics, then ask for filter
289
289
  approval. After approval, move to Filter Leads and show `Filters saved + waiting
290
290
  for message approval` while the message recommendation is reviewed. If the user
291
291
  skips filters, move to Messages/message review. Enrichment/filtering and
292
292
  Generate Message cells wait for message approval. AI Generated is an explicit
293
293
  opt-out from the template path. If the
294
- post-lead agents are absent, the main thread still orchestrates the same
294
+ prospect setup agents are absent, the main thread still orchestrates the same
295
295
  branches from compact MCP context.
296
296
 
297
297
  Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
@@ -427,15 +427,15 @@ Treat host capabilities as concrete functions, not prose conventions:
427
427
  `mcp__sellable__get_source_scout_registry({})` before any scout dispatch.
428
428
  - `load_post_find_leads_scout_registry`: call
429
429
  `mcp__sellable__get_post_find_leads_scout_registry({})` after source
430
- approval and before dispatching the post-lead filter/message scouts.
430
+ import and before dispatching Prospect Filters/Message Drafting.
431
431
  - `launch_source_scout`: Claude Code uses `Task` with `subagent_type` equal to
432
432
  the registry `name` only when the session lists those agents; Codex uses
433
433
  named custom agents such as
434
434
  `source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
435
435
  `source-scout-prospeo-contact` when subagents are available.
436
436
  - `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
437
+ equal to the returned prospect-setup registry `name` only when the session
438
+ lists those agents; Codex uses the returned compatibility agents such as
439
439
  `post-find-leads-filter-scout` and `post-find-leads-message-scout` when
440
440
  subagents are available.
441
441
 
@@ -758,10 +758,23 @@ updates.
758
758
  copies of this file; packaged Claude Code and Codex runs must use the MCP
759
759
  asset loader so they share the same config.
760
760
  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
761
+ 4. For message generation, keep the parent thread as a lean orchestrator and
762
+ use the `post-find-leads-message-scout` compatibility agent for Message
763
+ Drafting whenever the host exposes it
764
+ and the current host policy allows agent launch. The worker must load
763
765
  `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:
766
+ In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
767
+ Sellable background agents for pre-launch work. If the user has not enabled
768
+ YOLO and has not explicitly asked for background agents, subagents, parallel
769
+ agents, delegation, or a message/bg agent in this campaign, ask once for
770
+ permission before loading the long message prompt in the parent. If
771
+ permission is granted but the named custom agent is not
772
+ available, spawn a generic background agent with `model: "gpt-5.5"` and
773
+ `reasoning_effort: "xhigh"` using the same campaign/table basis. Do not
774
+ silently fall back to parent-thread message drafting; parent fallback is
775
+ allowed only when the user explicitly says to continue without a background
776
+ agent.
777
+ Do not use any alternate or examples-only message prompt. Message review requires Message Drafting output:
765
778
  do not draft from a checklist, local markdown artifact, or parent-thread
766
779
  intuition. Use campaign state, campaign brief content, selected source state, and
767
780
  initial campaign-table execution slice rows as the source of truth; do not read stale local
@@ -4,7 +4,7 @@ This log captures what has worked in real campaigns.
4
4
 
5
5
  Entries should be short, specific, and based on observed outcomes.
6
6
 
7
- **Cross-skill learnings** that would help other skills (engage, create-post) should ALSO be written to `~/.sellable/insights/cross-skill.md` so the entire system learns.
7
+ **Cross-skill learnings** that would help other skills (engage, create-post) should ALSO be written to `.sellable/insights/cross-skill.md` so the entire system learns.
8
8
 
9
9
  ## Log
10
10
 
@@ -41,8 +41,8 @@ Example: "In a 15-minute call, we will audit your top 10 accounts and show where
41
41
  - **Bridge to:** [How it connects to their pain]
42
42
  - **Avoid:** [Generic phrases to skip - "best-in-class", "industry-leading", etc.]
43
43
  - **Voice:** [Reference core memory / composed engage memory first. Use legacy writing memory only as fallback.]
44
- - **Outbound rules:** [Reference `~/.sellable/configs/writing/outbound.md` if loaded -- observation -> relevance -> ask]
45
- - **Proof boundaries:** [Reference `~/.sellable/configs/core/proof-ledger.md` and `~/.sellable/configs/core/wins-ledger.md` if loaded. Do not upgrade or invent claims.]
44
+ - **Outbound rules:** [Reference `.sellable/configs/writing/outbound.md` if loaded -- observation -> relevance -> ask]
45
+ - **Proof boundaries:** [Reference `.sellable/configs/core/proof-ledger.md` and `.sellable/configs/core/wins-ledger.md` if loaded. Do not upgrade or invent claims.]
46
46
 
47
47
  ## Do NOT Target
48
48
 
@@ -15,7 +15,7 @@ assistant message directly from the `result.result` stream-json payload —
15
15
  it does not read a file off disk.
16
16
 
17
17
  If you find yourself emitting a TodoWrite step like "Write brief.md v1
18
- to disk" or "Save brief to ~/.sellable/..." — DELETE that step and return
18
+ to disk" or "Save brief to .sellable/..." — DELETE that step and return
19
19
  the brief inline instead. The tools `Write`, `Edit`, and `Bash` are
20
20
  intentionally not in the Phase 83 harness allowlist; attempting them
21
21
  will cause a ToolSearch loop that deadlocks the turn.
@@ -37,7 +37,7 @@ offer is, why it should work, and what must be true before we launch. Do not
37
37
  prescribe message structure, opener order, or final copy here.]
38
38
 
39
39
  Draft path:
40
- `~/.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
40
+ `.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
41
41
 
42
42
  ## Product
43
43
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Phase 83 writes one Markdown file:
4
4
 
5
- `~/.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
5
+ `.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
6
6
 
7
7
  ## Rules
8
8
 
@@ -58,7 +58,7 @@ _Personalization: References their previous exit or current venture by name + th
58
58
 
59
59
  Hi {{first_name}}, let me know if i'm off, but {{seems_like_you}}.
60
60
 
61
- saw you in a few conversations around {{signal_topic}}, so hope this is relevant.
61
+ saw you were active in some {{signal_topic}} conversations recently and figured this might be relevant.
62
62
 
63
63
  we work with about 30 exited founders right now (yc, techstars, sequoia backed) handling their entire linkedin with ai + human review.
64
64
 
@@ -131,7 +131,7 @@ is this worth a look or should i send a short overview?
131
131
 
132
132
  Hi sarah, let me know if i'm off, but seems like you started building something new in the pharma space after the Benchling exit.
133
133
 
134
- saw you in a few conversations around founder-led growth, so hope this is relevant.
134
+ saw you were active in some founder-led growth conversations recently and figured this might be relevant.
135
135
 
136
136
  we work with about 30 exited founders right now (yc, techstars, sequoia backed) handling their entire linkedin with ai + human review.
137
137