@sellable/mcp 0.1.17 → 0.1.19

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
@@ -83,14 +83,14 @@ The token is provided when you generate it. Use `list_workspaces` +
83
83
  For customer/package installs, use the public installer:
84
84
 
85
85
  ```bash
86
- npx -y @sellable/install@0.1.17 --host codex --token skt_live_your_token_here --workspace-id your_workspace_id
86
+ npx -y @sellable/install@0.1.19 --host codex --token skt_live_your_token_here --workspace-id your_workspace_id
87
87
  ```
88
88
 
89
89
  If you already have `~/.sellable/config.json`, rerun/verify without rewriting
90
90
  auth:
91
91
 
92
92
  ```bash
93
- npx -y @sellable/install@0.1.17 --host codex
93
+ npx -y @sellable/install@0.1.19 --host codex
94
94
  sellable --verify-only --host codex
95
95
  ```
96
96
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -280,9 +280,46 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
280
280
  Do not mention internal artifact names, local folders, shell commands, or
281
281
  persistence in this preamble.
282
282
 
283
- - After rendering the brief summary, ask for brief approval when there is a real
283
+ - Before asking for brief approval, render the actual readable brief in the chat.
284
+ Do not ask the user to approve a one-paragraph direction, a risk note, or a
285
+ hidden artifact they cannot inspect. The user must be able to read what they
286
+ are approving without opening files. Include these sections:
287
+
288
+ ```text
289
+ Campaign brief
290
+
291
+ Who we are targeting:
292
+ ...
293
+
294
+ Why they should care:
295
+ ...
296
+
297
+ Offer / CTA:
298
+ ...
299
+
300
+ Proof to use:
301
+ ...
302
+
303
+ Lead source hypothesis:
304
+ ...
305
+
306
+ Message angle:
307
+ ...
308
+
309
+ Risks / assumptions:
310
+ ...
311
+
312
+ What happens after approval:
313
+ I’ll find good-fit LinkedIn leads, show you the source decision and sample, then
314
+ draft the first message for review before anything goes live.
315
+ ```
316
+
317
+ After rendering that brief, ask for brief approval when there is a real
284
318
  strategic choice or the user has not already made the direction obvious. The
285
319
  user-facing choice should be approve/revise language, not "looks good".
320
+ Approval options should refer to what the user just read, e.g. `Approve this
321
+ brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
322
+
286
323
  - After the brief is approved or auto-confirmed, show the next progress line:
287
324
  `Cool. Now I'm going to find people who are both a good fit and likely to
288
325
  reply on LinkedIn. I'll compare source paths by expected volume, likely
@@ -307,6 +344,7 @@ should test for this campaign. Those can run in parallel and usually take
307
344
  because the brief becomes the source of truth for the leads and messages. I’ll
308
345
  show you the draft next so you can approve it or change it.
309
346
  ```
347
+
310
348
  - In hosted/rehearsal runs, `Bash` is only for safe local draft-directory
311
349
  housekeeping before approval: `mkdir`, `ls`, `find`, `test`, `pwd`, `echo`,
312
350
  `cat`, or copying `brief-v1.md` to `brief.md` inside the repo. Do not use
@@ -480,6 +518,17 @@ Required behavior:
480
518
  keyword lanes; it does not mean 492 prospects. The source decision must name
481
519
  the actual posts we would use, show why they won, and estimate usable engagers
482
520
  from those posts after headline/sample filtering
521
+ - user-facing source logic must use numbers, not vibes. Never write a percentage
522
+ such as `73% match` without the numerator, denominator, and sample basis, e.g.
523
+ `8 of 11 sampled engagers fit the ICP (73%)`. If the sample is small, say it is
524
+ directional. If an estimate depends on assumptions, show the math: `5 selected
525
+ posts x ~40-80 reachable engagers/post x 25-40% expected fit = ~50-160 likely
526
+ usable leads`.
527
+ - source progress updates should expose the confidence-building numbers as soon
528
+ as they exist: keyword lanes searched, timeframe used, post results by lane,
529
+ finalist posts reviewed, engagers fetched, sampled engagers, sampled fits,
530
+ estimated usable leads, and what is still unknown. Do not wait until the final
531
+ approval packet to show those numbers.
483
532
  - Signals source decisions should prefer fresh posts. Default to posts from the
484
533
  last 30 days, prefer the last 7-14 days when quality is comparable, and call
485
534
  out any older post as a deliberate tradeoff. Do not hide post age inside the
@@ -508,12 +557,14 @@ Required behavior:
508
557
  - validation status: `confirmed`, `rejected`, or `unclear`
509
558
  - confidence
510
559
  - provider path used
560
+ - search lanes tested, with keyword/filter names and the timeframe used
561
+ - post/result counts by lane for discovery sources
511
562
  - supplied source type when applicable (`normal-discovery`,
512
563
  `supplied-linkedin-profiles`, `supplied-domains`, or `existing-lead-list`)
513
564
  - row/domain counts, invalid counts, duplicate counts, and sample method for
514
565
  supplied sources
515
566
  - preview count
516
- - ICP match rate
567
+ - ICP match rate with numerator/denominator and sample basis; never percent-only
517
568
  - volume comparison
518
569
  - expected LinkedIn funnel: likely connection acceptance range, likely reply
519
570
  range, and whether the estimate is sample-backed, historical, founder-supplied,
@@ -523,6 +574,11 @@ Required behavior:
523
574
  sampled engager count per selected post, sampled fit count per selected post,
524
575
  estimated usable engagers per selected post, and why each selected post is
525
576
  better than discarded posts
577
+ - for Signals-first paths: total raw post results by lane, number of finalist
578
+ posts reviewed, number of selected posts, total engagers fetched, deduped
579
+ sampled people count, sampled fit count, and the estimated likely usable people
580
+ range. Explicitly distinguish `posts found`, `engagers sampled`, and `usable
581
+ people estimated`.
526
582
  - source decision: best path, why it won, pros, cons/tradeoffs, and discarded
527
583
  source paths with the reason each lost
528
584
  - repeated false-positive patterns
@@ -534,6 +590,7 @@ For normal LinkedIn discovery, `lead-review.md` must include these
534
590
  customer-visible sections with literal headings:
535
591
 
536
592
  - `## Source Decision`
593
+ - `## Evidence Snapshot`
537
594
  - `## Selected Signal Posts` for Signals-first campaigns
538
595
  - `## Expected LinkedIn Funnel`
539
596
  - `## Sample Leads` for Signals-first campaigns
@@ -554,6 +611,17 @@ table with one row per selected or finalist post:
554
611
  - estimated usable leads
555
612
  - why use / why discard
556
613
 
614
+ `## Evidence Snapshot` must include a compact numbers-first table:
615
+
616
+ - source lane / keyword or filter
617
+ - timeframe searched
618
+ - raw results found
619
+ - finalist posts or preview rows reviewed
620
+ - sampled people
621
+ - sampled fits, shown as `n/N (%)`
622
+ - estimated usable people
623
+ - confidence note (`sample-backed`, `directional`, or `needs more sample`)
624
+
557
625
  For Signals-first campaigns, `## Sample Leads` must group representative sample
558
626
  rows by source post when possible, so the user can see not just that the search
559
627
  found posts, but which posts produce believable prospects.
@@ -565,10 +633,10 @@ directional range and label it `directional`, not definitive.
565
633
 
566
634
  When showing `lead-review.md` to the user, render the customer-visible sections
567
635
  inline. Do not compress it to a short summary or artifact links only. The
568
- visible response must include `## Source Decision`, `## Expected LinkedIn
569
- Funnel`, `## Pros`, `## Tradeoffs`, and `## Discarded Paths`. For
570
- Signals-first campaigns it must also include `## Selected Signal Posts` and
571
- `## Sample Leads`.
636
+ visible response must include `## Source Decision`, `## Evidence Snapshot`,
637
+ `## Expected LinkedIn Funnel`, `## Pros`, `## Tradeoffs`, and `## Discarded
638
+ Paths`. For Signals-first campaigns it must also include `## Selected Signal
639
+ Posts` and `## Sample Leads`.
572
640
 
573
641
  For supplied profile CSVs and existing lead lists, `lead-review.md` must not
574
642
  describe a generic TAM estimate or pretend the rows came from Sales Nav/Prospeo
@@ -55,6 +55,10 @@ turn anchored to that:
55
55
  8. Ask for approval.
56
56
  9. Create the campaign.
57
57
 
58
+ Approvals only feel safe when the user can see what they are approving. Before
59
+ any approve/revise question, show the relevant decision in plain language. For a
60
+ brief approval, render the brief itself, not just a direction summary.
61
+
58
62
  ## Progress Updates
59
63
 
60
64
  Every customer-facing update should answer one of these:
@@ -64,6 +68,34 @@ Every customer-facing update should answer one of these:
64
68
  - What will the user see next?
65
69
  - What is protected until approval?
66
70
 
71
+ Before a brief approval, the user should see:
72
+
73
+ - who we are targeting
74
+ - why they should care
75
+ - the offer / CTA
76
+ - proof to use
77
+ - lead source hypothesis
78
+ - message angle
79
+ - risks / assumptions
80
+ - what happens after approval
81
+
82
+ For lead-source decisions, confidence comes from concrete counts. Do not say
83
+ "strong sample", "73% match", or "meaningful concentration" without showing the
84
+ sample size and what was counted. Prefer:
85
+
86
+ ```text
87
+ I searched 4 signal lanes over the last 30 days. The best 5 posts produced 62
88
+ sampled engagers; 31 looked like real ICP fits, so I’d treat this as directional
89
+ 50% sample fit, not a guaranteed audience. That gives us roughly 150-300 likely
90
+ usable people if the remaining engagers behave similarly.
91
+ ```
92
+
93
+ Avoid:
94
+
95
+ ```text
96
+ The sample passed roughly 73% headline fit.
97
+ ```
98
+
67
99
  Good:
68
100
 
69
101
  ```text
@@ -213,10 +213,20 @@
213
213
  {
214
214
  "action": "render_brief_approval_checkpoint",
215
215
  "requiredVisibleContent": [
216
+ "Campaign brief",
217
+ "Who we are targeting",
218
+ "Why they should care",
219
+ "Offer / CTA",
220
+ "Proof to use",
221
+ "Lead source hypothesis",
222
+ "Message angle",
223
+ "Risks / assumptions",
224
+ "What happens after approval",
216
225
  "approve this brief",
217
226
  "revise the brief",
218
227
  "then I will find good-fit leads"
219
228
  ],
229
+ "minimumVisibleBriefDetail": "full_readable_brief_before_question",
220
230
  "avoidQuestionWhenOnlyUsefulAnswerIs": "looks good"
221
231
  },
222
232
  {
@@ -267,6 +277,10 @@
267
277
  "likely reply rate",
268
278
  "signal quality",
269
279
  "tradeoffs",
280
+ "search lanes",
281
+ "timeframe",
282
+ "sample size",
283
+ "estimated usable leads",
270
284
  "source decision + sample",
271
285
  "before anything goes live"
272
286
  ],
@@ -352,6 +366,7 @@
352
366
  "artifact": "lead-review.md",
353
367
  "renderInlineSections": [
354
368
  "## Source Decision",
369
+ "## Evidence Snapshot",
355
370
  "## Selected Signal Posts",
356
371
  "## Expected LinkedIn Funnel",
357
372
  "## Sample Leads",
@@ -367,9 +382,21 @@
367
382
  "engagement or estimated engagers",
368
383
  "sampled engagers",
369
384
  "sampled fits",
385
+ "sampled fits as n/N",
370
386
  "estimated usable leads",
371
387
  "why use or discard"
372
388
  ],
389
+ "evidenceSnapshotRequiredFields": [
390
+ "source lane or keyword",
391
+ "timeframe searched",
392
+ "raw results found",
393
+ "finalist posts or preview rows reviewed",
394
+ "sampled people",
395
+ "sampled fits as n/N (%)",
396
+ "estimated usable people",
397
+ "confidence note"
398
+ ],
399
+ "forbidPercentOnlyFitRates": true,
373
400
  "doNotCompressToSummaryOnly": true,
374
401
  "doNotRenderArtifactLinksOnly": true
375
402
  },