@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.
|
|
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.
|
|
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
|
@@ -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`, `##
|
|
606
|
-
Funnel`, `## Pros`, `## Tradeoffs`, and `## Discarded
|
|
607
|
-
Signals-first campaigns it must also include `## Selected Signal
|
|
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",
|