@sellable/mcp 0.1.18 → 0.1.20

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.18 --host codex --token skt_live_your_token_here --workspace-id your_workspace_id
86
+ npx -y @sellable/install@0.1.20 --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.18 --host codex
93
+ npx -y @sellable/install@0.1.20 --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.18",
3
+ "version": "0.1.20",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -120,6 +120,12 @@ Validated draft directory:
120
120
  or safe launch. Do not say "persist", "local draft folder", "artifact",
121
121
  "mkdir", "campaign thesis", or "same approved campaign thesis" in
122
122
  customer-facing progress copy.
123
+ - Every approval gate must include artifact access after the readable inline
124
+ content. Show a short `Open artifacts:` line with clickable markdown links
125
+ using absolute paths when the host supports them, plus the plain path for CLI
126
+ users. Do this for brief approval, lead-source approval/review, message review,
127
+ and final approval packet. Do not use the links as a substitute for rendering
128
+ the content inline; links are for deeper inspection.
123
129
  - Do not treat the active Sellable workspace as the campaign subject. The
124
130
  workspace only tells you where the campaign will be saved. Before buyer, CTA,
125
131
  proof, or source questions, identify two things:
@@ -319,6 +325,9 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
319
325
  user-facing choice should be approve/revise language, not "looks good".
320
326
  Approval options should refer to what the user just read, e.g. `Approve this
321
327
  brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
328
+ Include `Open artifacts:` links to `brief-v1.md` and `brief.md` before the
329
+ approval question.
330
+
322
331
  - After the brief is approved or auto-confirmed, show the next progress line:
323
332
  `Cool. Now I'm going to find people who are both a good fit and likely to
324
333
  reply on LinkedIn. I'll compare source paths by expected volume, likely
@@ -517,6 +526,17 @@ Required behavior:
517
526
  keyword lanes; it does not mean 492 prospects. The source decision must name
518
527
  the actual posts we would use, show why they won, and estimate usable engagers
519
528
  from those posts after headline/sample filtering
529
+ - user-facing source logic must use numbers, not vibes. Never write a percentage
530
+ such as `73% match` without the numerator, denominator, and sample basis, e.g.
531
+ `8 of 11 sampled engagers fit the ICP (73%)`. If the sample is small, say it is
532
+ directional. If an estimate depends on assumptions, show the math: `5 selected
533
+ posts x ~40-80 reachable engagers/post x 25-40% expected fit = ~50-160 likely
534
+ usable leads`.
535
+ - source progress updates should expose the confidence-building numbers as soon
536
+ as they exist: keyword lanes searched, timeframe used, post results by lane,
537
+ finalist posts reviewed, engagers fetched, sampled engagers, sampled fits,
538
+ estimated usable leads, and what is still unknown. Do not wait until the final
539
+ approval packet to show those numbers.
520
540
  - Signals source decisions should prefer fresh posts. Default to posts from the
521
541
  last 30 days, prefer the last 7-14 days when quality is comparable, and call
522
542
  out any older post as a deliberate tradeoff. Do not hide post age inside the
@@ -545,12 +565,14 @@ Required behavior:
545
565
  - validation status: `confirmed`, `rejected`, or `unclear`
546
566
  - confidence
547
567
  - provider path used
568
+ - search lanes tested, with keyword/filter names and the timeframe used
569
+ - post/result counts by lane for discovery sources
548
570
  - supplied source type when applicable (`normal-discovery`,
549
571
  `supplied-linkedin-profiles`, `supplied-domains`, or `existing-lead-list`)
550
572
  - row/domain counts, invalid counts, duplicate counts, and sample method for
551
573
  supplied sources
552
574
  - preview count
553
- - ICP match rate
575
+ - ICP match rate with numerator/denominator and sample basis; never percent-only
554
576
  - volume comparison
555
577
  - expected LinkedIn funnel: likely connection acceptance range, likely reply
556
578
  range, and whether the estimate is sample-backed, historical, founder-supplied,
@@ -560,6 +582,11 @@ Required behavior:
560
582
  sampled engager count per selected post, sampled fit count per selected post,
561
583
  estimated usable engagers per selected post, and why each selected post is
562
584
  better than discarded posts
585
+ - for Signals-first paths: total raw post results by lane, number of finalist
586
+ posts reviewed, number of selected posts, total engagers fetched, deduped
587
+ sampled people count, sampled fit count, and the estimated likely usable people
588
+ range. Explicitly distinguish `posts found`, `engagers sampled`, and `usable
589
+ people estimated`.
563
590
  - source decision: best path, why it won, pros, cons/tradeoffs, and discarded
564
591
  source paths with the reason each lost
565
592
  - repeated false-positive patterns
@@ -571,6 +598,7 @@ For normal LinkedIn discovery, `lead-review.md` must include these
571
598
  customer-visible sections with literal headings:
572
599
 
573
600
  - `## Source Decision`
601
+ - `## Evidence Snapshot`
574
602
  - `## Selected Signal Posts` for Signals-first campaigns
575
603
  - `## Expected LinkedIn Funnel`
576
604
  - `## Sample Leads` for Signals-first campaigns
@@ -591,6 +619,17 @@ table with one row per selected or finalist post:
591
619
  - estimated usable leads
592
620
  - why use / why discard
593
621
 
622
+ `## Evidence Snapshot` must include a compact numbers-first table:
623
+
624
+ - source lane / keyword or filter
625
+ - timeframe searched
626
+ - raw results found
627
+ - finalist posts or preview rows reviewed
628
+ - sampled people
629
+ - sampled fits, shown as `n/N (%)`
630
+ - estimated usable people
631
+ - confidence note (`sample-backed`, `directional`, or `needs more sample`)
632
+
594
633
  For Signals-first campaigns, `## Sample Leads` must group representative sample
595
634
  rows by source post when possible, so the user can see not just that the search
596
635
  found posts, but which posts produce believable prospects.
@@ -602,10 +641,12 @@ directional range and label it `directional`, not definitive.
602
641
 
603
642
  When showing `lead-review.md` to the user, render the customer-visible sections
604
643
  inline. Do not compress it to a short summary or artifact links only. The
605
- visible response must include `## Source Decision`, `## Expected LinkedIn
606
- Funnel`, `## Pros`, `## Tradeoffs`, and `## Discarded Paths`. For
607
- Signals-first campaigns it must also include `## Selected Signal Posts` and
608
- `## Sample Leads`.
644
+ visible response must include `## Source Decision`, `## Evidence Snapshot`,
645
+ `## Expected LinkedIn Funnel`, `## Pros`, `## Tradeoffs`, and `## Discarded
646
+ Paths`. For Signals-first campaigns it must also include `## Selected Signal
647
+ Posts` and `## Sample Leads`.
648
+ Include `Open artifacts:` links to `lead-review.md` and `lead-sample.json`
649
+ before moving to filter/message drafting or asking for any source revision.
609
650
 
610
651
  For supplied profile CSVs and existing lead lists, `lead-review.md` must not
611
652
  describe a generic TAM estimate or pretend the rows came from Sales Nav/Prospeo
@@ -829,6 +870,16 @@ Orchestration requirements:
829
870
  `My take: ...`, `Suggested adjustment: ...`,
830
871
  `Question: approve-message or revise-messaging?`, `Recommendation:
831
872
  approve-message|revise-messaging`.
873
+ - Never ask the message approval question until the full message review is
874
+ visible in the chat. A summary like `Message review is ready` or `the draft
875
+ avoids a generic pitch` is not enough. The user must see the actual subject,
876
+ the actual tokenized message template, at least one good filled example, one
877
+ good omit example, token notes, your take, and the suggested adjustment before
878
+ any `approve-message` / `revise-messaging` question appears. If you catch
879
+ yourself wanting to offer `show me message` as a choice, stop: render the
880
+ message review first, then ask only `approve-message` or `revise-messaging`.
881
+ Include `Open artifacts:` links to `message-review.md` and
882
+ `message-validation.md` before the approval question.
832
883
  - `My take:` and `Suggested adjustment:` are mandatory customer-facing decision
833
884
  fields, not optional summary text. They must appear after `Token notes:` and
834
885
  before the question in every rendered message review. They must each be
@@ -950,6 +1001,9 @@ proof:`, `p.s. useful proof:`, `p.s. proof:`, or `p.s. social proof:`.
950
1001
  summarize the customer checkpoint from `message-review.md` and preserve the
951
1002
  same literal `My take:`, `Suggested adjustment:`, and `Recommendation:`
952
1003
  labels.
1004
+ Include `Open artifacts:` links to `approval-packet.md`,
1005
+ `message-review.md`, `lead-review.md`, and `brief.md` before the commit-gate
1006
+ question.
953
1007
  - if `message-validation.md` contains an extractable `Selected Winner`, use
954
1008
  that exact winner as the `## Approved Message Template` in
955
1009
  `approval-packet.md` and in the campaign brief passed to `create_campaign`.
@@ -59,6 +59,15 @@ Approvals only feel safe when the user can see what they are approving. Before
59
59
  any approve/revise question, show the relevant decision in plain language. For a
60
60
  brief approval, render the brief itself, not just a direction summary.
61
61
 
62
+ Every approval should also give the user a way to inspect the source artifact.
63
+ After the readable inline content, include an `Open artifacts:` line with links
64
+ or plain paths to the files behind the decision. The artifact links are a backup
65
+ for inspection, not a replacement for showing the content in chat.
66
+
67
+ This applies especially to message approvals. Never ask someone to approve a
68
+ message they cannot see. Show the subject, message body/template, filled example,
69
+ omit example, token notes, your take, and suggested adjustment first.
70
+
62
71
  ## Progress Updates
63
72
 
64
73
  Every customer-facing update should answer one of these:
@@ -79,6 +88,23 @@ Before a brief approval, the user should see:
79
88
  - risks / assumptions
80
89
  - what happens after approval
81
90
 
91
+ For lead-source decisions, confidence comes from concrete counts. Do not say
92
+ "strong sample", "73% match", or "meaningful concentration" without showing the
93
+ sample size and what was counted. Prefer:
94
+
95
+ ```text
96
+ I searched 4 signal lanes over the last 30 days. The best 5 posts produced 62
97
+ sampled engagers; 31 looked like real ICP fits, so I’d treat this as directional
98
+ 50% sample fit, not a guaranteed audience. That gives us roughly 150-300 likely
99
+ usable people if the remaining engagers behave similarly.
100
+ ```
101
+
102
+ Avoid:
103
+
104
+ ```text
105
+ The sample passed roughly 73% headline fit.
106
+ ```
107
+
82
108
  Good:
83
109
 
84
110
  ```text
@@ -227,6 +227,8 @@
227
227
  "then I will find good-fit leads"
228
228
  ],
229
229
  "minimumVisibleBriefDetail": "full_readable_brief_before_question",
230
+ "requiredArtifactLinks": ["brief-v1.md", "brief.md"],
231
+ "artifactLinkTiming": "before_approval_question",
230
232
  "avoidQuestionWhenOnlyUsefulAnswerIs": "looks good"
231
233
  },
232
234
  {
@@ -277,6 +279,10 @@
277
279
  "likely reply rate",
278
280
  "signal quality",
279
281
  "tradeoffs",
282
+ "search lanes",
283
+ "timeframe",
284
+ "sample size",
285
+ "estimated usable leads",
280
286
  "source decision + sample",
281
287
  "before anything goes live"
282
288
  ],
@@ -362,6 +368,7 @@
362
368
  "artifact": "lead-review.md",
363
369
  "renderInlineSections": [
364
370
  "## Source Decision",
371
+ "## Evidence Snapshot",
365
372
  "## Selected Signal Posts",
366
373
  "## Expected LinkedIn Funnel",
367
374
  "## Sample Leads",
@@ -377,9 +384,23 @@
377
384
  "engagement or estimated engagers",
378
385
  "sampled engagers",
379
386
  "sampled fits",
387
+ "sampled fits as n/N",
380
388
  "estimated usable leads",
381
389
  "why use or discard"
382
390
  ],
391
+ "evidenceSnapshotRequiredFields": [
392
+ "source lane or keyword",
393
+ "timeframe searched",
394
+ "raw results found",
395
+ "finalist posts or preview rows reviewed",
396
+ "sampled people",
397
+ "sampled fits as n/N (%)",
398
+ "estimated usable people",
399
+ "confidence note"
400
+ ],
401
+ "forbidPercentOnlyFitRates": true,
402
+ "requiredArtifactLinks": ["lead-review.md", "lead-sample.json"],
403
+ "artifactLinkTiming": "before_next_step_or_revision_question",
383
404
  "doNotCompressToSummaryOnly": true,
384
405
  "doNotRenderArtifactLinksOnly": true
385
406
  },
@@ -590,6 +611,13 @@
590
611
  "question",
591
612
  "recommendation"
592
613
  ],
614
+ "mustRenderInlineBeforeQuestion": true,
615
+ "minimumVisibleMessageDetail": "full_message_review_before_question",
616
+ "requiredArtifactLinks": [
617
+ "message-review.md",
618
+ "message-validation.md"
619
+ ],
620
+ "artifactLinkTiming": "before_approval_question",
593
621
  "requiredLabels": [
594
622
  "Subject:",
595
623
  "Message:",
@@ -627,6 +655,20 @@
627
655
  {
628
656
  "action": "ask_message_review_choice",
629
657
  "choices": ["approve-message", "revise-messaging"],
658
+ "questionPrerequisiteVisibleLabels": [
659
+ "Status: message-review",
660
+ "Subject:",
661
+ "Message:",
662
+ "Rendered examples:",
663
+ "Good token fill:",
664
+ "Good omit:",
665
+ "Token notes:",
666
+ "My take:",
667
+ "Suggested adjustment:",
668
+ "Recommendation:"
669
+ ],
670
+ "forbiddenWhenMissingVisibleMessage": true,
671
+ "doNotOfferShowMessageChoice": true,
630
672
  "stopAfterQuestion": true
631
673
  },
632
674
  {
@@ -709,6 +751,13 @@
709
751
  "messages",
710
752
  "risks and next action"
711
753
  ],
754
+ "requiredArtifactLinks": [
755
+ "approval-packet.md",
756
+ "message-review.md",
757
+ "lead-review.md",
758
+ "brief.md"
759
+ ],
760
+ "artifactLinkTiming": "before_commit_gate_question",
712
761
  "userFacing": true,
713
762
  "doNotUseWords": ["anchor", "validation anchor", "lane"]
714
763
  },
@@ -804,7 +853,14 @@
804
853
  "lead sample",
805
854
  "lead filter",
806
855
  "message validation"
807
- ]
856
+ ],
857
+ "requiredArtifactLinks": [
858
+ "approval-packet.md",
859
+ "message-review.md",
860
+ "lead-review.md",
861
+ "brief.md"
862
+ ],
863
+ "artifactLinkTiming": "same_turn_before_commit_question"
808
864
  },
809
865
  {
810
866
  "action": "ask_commit_choice",