@sellable/mcp 0.1.19 → 0.1.21

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.19 --host codex --token skt_live_your_token_here --workspace-id your_workspace_id
86
+ npx -y @sellable/install@0.1.21 --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.19 --host codex
93
+ npx -y @sellable/install@0.1.21 --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.19",
3
+ "version": "0.1.21",
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,8 @@ 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.
322
330
 
323
331
  - After the brief is approved or auto-confirmed, show the next progress line:
324
332
  `Cool. Now I'm going to find people who are both a good fit and likely to
@@ -522,8 +530,8 @@ Required behavior:
522
530
  such as `73% match` without the numerator, denominator, and sample basis, e.g.
523
531
  `8 of 11 sampled engagers fit the ICP (73%)`. If the sample is small, say it is
524
532
  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`.
533
+ posts x ~40-80 reachable engagers/post x 25-40% expected fit = ~50-160 likely
534
+ usable leads`.
527
535
  - source progress updates should expose the confidence-building numbers as soon
528
536
  as they exist: keyword lanes searched, timeframe used, post results by lane,
529
537
  finalist posts reviewed, engagers fetched, sampled engagers, sampled fits,
@@ -578,7 +586,7 @@ Required behavior:
578
586
  posts reviewed, number of selected posts, total engagers fetched, deduped
579
587
  sampled people count, sampled fit count, and the estimated likely usable people
580
588
  range. Explicitly distinguish `posts found`, `engagers sampled`, and `usable
581
- people estimated`.
589
+ people estimated`.
582
590
  - source decision: best path, why it won, pros, cons/tradeoffs, and discarded
583
591
  source paths with the reason each lost
584
592
  - repeated false-positive patterns
@@ -637,6 +645,8 @@ visible response must include `## Source Decision`, `## Evidence Snapshot`,
637
645
  `## Expected LinkedIn Funnel`, `## Pros`, `## Tradeoffs`, and `## Discarded
638
646
  Paths`. For Signals-first campaigns it must also include `## Selected Signal
639
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.
640
650
 
641
651
  For supplied profile CSVs and existing lead lists, `lead-review.md` must not
642
652
  describe a generic TAM estimate or pretend the rows came from Sales Nav/Prospeo
@@ -851,22 +861,35 @@ Orchestration requirements:
851
861
  with `Status: message-review` as the first visible line. Do not put a
852
862
  markdown heading, preface, or summary before that status line. This is a
853
863
  customer checkpoint, not an audit report: show the approved campaign message
854
- template first, then show rendered examples that prove the tokens fill well
855
- and can be omitted cleanly when row data is weak. Keep the detailed
864
+ template first, then show one filled sample prospect version immediately after
865
+ it so the user can judge whether the tokens are being used correctly. Then
866
+ show rendered examples that prove the tokens fill well and can be omitted
867
+ cleanly when row data is weak. Keep the detailed
856
868
  gold-standard/rule audit inside `message-validation.md`, not in the
857
869
  user-facing review. The review must use this exact label shape so the gate can
858
- be parsed: `Subject: ...`, `Message: ...`, `Rendered examples: ...`,
859
- `Good token fill: ...`, `Good omit: ...`, `Token notes: ...`,
860
- `My take: ...`, `Suggested adjustment: ...`,
870
+ be parsed: `Subject: ...`, `Tokenized template: ...`, `Sample prospect fill:
871
+ ...`, `Rendered examples: ...`, `Good token fill: ...`, `Good omit: ...`,
872
+ `Token notes: ...`, `My take: ...`, `Suggested adjustment: ...`,
861
873
  `Question: approve-message or revise-messaging?`, `Recommendation:
862
874
  approve-message|revise-messaging`.
875
+ - Never ask the message approval question until the full message review is
876
+ visible in the chat. A summary like `Message review is ready` or `the draft
877
+ avoids a generic pitch` is not enough. The user must see the actual subject,
878
+ the actual tokenized message template, one filled sample prospect version, at
879
+ least one good filled example, one good omit example, token notes, your take,
880
+ and the suggested adjustment before any `approve-message` /
881
+ `revise-messaging` question appears. If you catch yourself wanting to offer
882
+ `show me message` as a choice, stop: render the message review first, then ask
883
+ only `approve-message` or `revise-messaging`.
884
+ Include `Open artifacts:` links to `message-review.md` and
885
+ `message-validation.md` before the approval question.
863
886
  - `My take:` and `Suggested adjustment:` are mandatory customer-facing decision
864
887
  fields, not optional summary text. They must appear after `Token notes:` and
865
888
  before the question in every rendered message review. They must each be
866
889
  non-empty, specific to the current message, and useful for one last manual
867
890
  feedback pass. Never render a message review that jumps straight from token
868
891
  notes to `Question:` or `Recommendation:`.
869
- - `Message:` in `message-review.md` must be a tokenized template with supported
892
+ - `Tokenized template:` in `message-review.md` must be a tokenized template with supported
870
893
  enriched-row tokens such as `{{first_name}}`, `{{company}}`,
871
894
  `{{workflow_context}}`, `{{headline}}`, `{{source_post_topic}}`, or
872
895
  `{{row_proof_note}}`. It must not be a one-row-only raw sample. It must
@@ -874,12 +897,20 @@ approve-message|revise-messaging`.
874
897
  enriched rows can actually fill or safely omit. If you cannot produce a
875
898
  tokenized template from supported enriched-row fields, stop with
876
899
  `Recommendation: revise-messaging`.
900
+ - `Sample prospect fill:` must render the same template for one named sample
901
+ prospect from `lead-sample.json` or the selected row used in
902
+ `message-validation.md`. It must show the complete subject and body the
903
+ prospect would receive, plus a one-line `Token fill basis:` naming which row
904
+ fields filled each token. This is the user-facing proof that the template
905
+ works. Do not ask for approval if the user cannot compare the template to a
906
+ concrete filled message.
877
907
  - `{{profile_signal}}` is never a supported customer-facing token. It is an
878
- internal enrichment label and must not appear in `Subject:`, `Message:`,
879
- rendered examples, `Token notes:`, `message-validation.md` selected copy, or
880
- `approval-packet.md`. If a profile-derived signal matters, translate it into
881
- a buyer-readable derived token with a clear fill rule, such as
882
- `{{workflow_context}}` or `{{row_proof_note}}`; otherwise omit the line.
908
+ internal enrichment label and must not appear in `Subject:`, `Tokenized
909
+ template:`, `Sample prospect fill:`, rendered examples, `Token notes:`,
910
+ `message-validation.md` selected copy, or `approval-packet.md`. If a
911
+ profile-derived signal matters, translate it into a buyer-readable derived
912
+ token with a clear fill rule, such as `{{workflow_context}}` or
913
+ `{{row_proof_note}}`; otherwise omit the line.
883
914
  - `Rendered examples:` must include at least one `Good token fill:` rendered
884
915
  message where the row has a clean signal and one `Good omit:` rendered message
885
916
  where an optional token line is omitted instead of forced. Each example must
@@ -916,12 +947,12 @@ approve-message|revise-messaging`.
916
947
  `thought this was relevant enough`, `seemed close
917
948
  enough`, `{{profile_signal}}`, `profile signal`, `is why I thought this might
918
949
  be relevant`, `Austin's`, a sender/founder name in the subject, a one-row raw
919
- sample under `Message:`, rendered examples without full copy, a
950
+ sample under `Tokenized template:`, rendered examples without full copy, a
920
951
  mail-merge-sounding tokenized opener, missing or empty `My take:`, missing or
921
952
  empty `Suggested adjustment:`, `My take:` that only says `looks good`,
922
953
  `strong`, or `approved`, `Suggested adjustment:` that only says `none`, or no
923
- literal `{{...}}` token in `Message:`, revise the message before showing it.
924
- Do not output
954
+ literal `{{...}}` token in `Tokenized template:`, revise the message before
955
+ showing it. Do not output
925
956
  `Recommendation: approve-message` when any hard-fail preflight item is
926
957
  present.
927
958
  - `My take` must be 1-3 short bullets or sentences, focused on what a founder
@@ -981,6 +1012,9 @@ proof:`, `p.s. useful proof:`, `p.s. proof:`, or `p.s. social proof:`.
981
1012
  summarize the customer checkpoint from `message-review.md` and preserve the
982
1013
  same literal `My take:`, `Suggested adjustment:`, and `Recommendation:`
983
1014
  labels.
1015
+ Include `Open artifacts:` links to `approval-packet.md`,
1016
+ `message-review.md`, `lead-review.md`, and `brief.md` before the commit-gate
1017
+ question.
984
1018
  - if `message-validation.md` contains an extractable `Selected Winner`, use
985
1019
  that exact winner as the `## Approved Message Template` in
986
1020
  `approval-packet.md` and in the campaign brief passed to `create_campaign`.
@@ -1063,7 +1097,9 @@ Do not:
1063
1097
 
1064
1098
  - `Status: message-review`
1065
1099
  - `Subject:` using the approved tokenized A + B + C subject shape
1066
- - `Message:` followed by the tokenized approved message template
1100
+ - `Tokenized template:` followed by the tokenized approved message template
1101
+ - `Sample prospect fill:` with one concrete sample prospect's complete rendered
1102
+ subject + body and a `Token fill basis:` line
1067
1103
  - `Rendered examples:`
1068
1104
  - `Good token fill:` with a complete concrete rendered subject + body
1069
1105
  - `Good omit:` with a complete concrete rendered subject + body where optional
@@ -1197,11 +1233,13 @@ Anchor validation (block `approve` when empty):
1197
1233
  `Pass Rate`, `Recommendation`, and `Implementation Details`
1198
1234
  - `message-validation.md` has `Status: confirmed`, `Mode: DRY MODE (no DB
1199
1235
  mutation)`, a `Selected Winner`, and a non-empty `Token Adherence Table`
1200
- - `message-review.md` has `Status: message-review`, `Subject:`, `Message:`
1201
- with at least one literal `{{...}}` token, `Rendered examples:`,
1202
- `Good token fill:` with a complete rendered subject + body, `Good omit:` with
1203
- a complete rendered subject + body, `Token notes:`, `My take:`, `Suggested
1204
- adjustment:`, `Question: approve-message or revise-messaging?`, and
1236
+ - `message-review.md` has `Status: message-review`, `Subject:`,
1237
+ `Tokenized template:` with at least one literal `{{...}}` token,
1238
+ `Sample prospect fill:` with a complete rendered subject + body and
1239
+ `Token fill basis:`, `Rendered examples:`, `Good token fill:` with a complete
1240
+ rendered subject + body, `Good omit:` with a complete rendered subject + body,
1241
+ `Token notes:`, `My take:`, `Suggested adjustment:`, `Question:
1242
+ approve-message or revise-messaging?`, and
1205
1243
  `Recommendation: approve-message`
1206
1244
  - `message-review-decision.md` is exactly `approve-message`
1207
1245
 
@@ -59,6 +59,17 @@ 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, tokenized template, a filled sample
69
+ prospect version, omit example, token notes, your take, and suggested adjustment
70
+ first. The user should be able to compare "here is the template" against "here
71
+ is what one real prospect would receive" before approving.
72
+
62
73
  ## Progress Updates
63
74
 
64
75
  Every customer-facing update should answer one of these:
@@ -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
  {
@@ -397,6 +399,8 @@
397
399
  "confidence note"
398
400
  ],
399
401
  "forbidPercentOnlyFitRates": true,
402
+ "requiredArtifactLinks": ["lead-review.md", "lead-sample.json"],
403
+ "artifactLinkTiming": "before_next_step_or_revision_question",
400
404
  "doNotCompressToSummaryOnly": true,
401
405
  "doNotRenderArtifactLinksOnly": true
402
406
  },
@@ -599,7 +603,8 @@
599
603
  "requiredInlineMarker": "Status: message-review",
600
604
  "panels": [
601
605
  "subject",
602
- "message",
606
+ "tokenized template",
607
+ "sample prospect fill",
603
608
  "rendered examples",
604
609
  "token notes",
605
610
  "my take",
@@ -607,9 +612,17 @@
607
612
  "question",
608
613
  "recommendation"
609
614
  ],
615
+ "mustRenderInlineBeforeQuestion": true,
616
+ "minimumVisibleMessageDetail": "full_message_review_before_question",
617
+ "requiredArtifactLinks": [
618
+ "message-review.md",
619
+ "message-validation.md"
620
+ ],
621
+ "artifactLinkTiming": "before_approval_question",
610
622
  "requiredLabels": [
611
623
  "Subject:",
612
- "Message:",
624
+ "Tokenized template:",
625
+ "Sample prospect fill:",
613
626
  "Rendered examples:",
614
627
  "Good token fill:",
615
628
  "Good omit:",
@@ -629,6 +642,7 @@
629
642
  "no generic signal tokens",
630
643
  "no bracketed or deferred row instructions",
631
644
  "tokenized template with rendered examples",
645
+ "tokenized template plus filled sample prospect",
632
646
  "complete rendered subject plus body examples",
633
647
  "message-review hard-fail preflight",
634
648
  "A + B + C subject quality",
@@ -644,6 +658,21 @@
644
658
  {
645
659
  "action": "ask_message_review_choice",
646
660
  "choices": ["approve-message", "revise-messaging"],
661
+ "questionPrerequisiteVisibleLabels": [
662
+ "Status: message-review",
663
+ "Subject:",
664
+ "Tokenized template:",
665
+ "Sample prospect fill:",
666
+ "Rendered examples:",
667
+ "Good token fill:",
668
+ "Good omit:",
669
+ "Token notes:",
670
+ "My take:",
671
+ "Suggested adjustment:",
672
+ "Recommendation:"
673
+ ],
674
+ "forbiddenWhenMissingVisibleMessage": true,
675
+ "doNotOfferShowMessageChoice": true,
647
676
  "stopAfterQuestion": true
648
677
  },
649
678
  {
@@ -726,6 +755,13 @@
726
755
  "messages",
727
756
  "risks and next action"
728
757
  ],
758
+ "requiredArtifactLinks": [
759
+ "approval-packet.md",
760
+ "message-review.md",
761
+ "lead-review.md",
762
+ "brief.md"
763
+ ],
764
+ "artifactLinkTiming": "before_commit_gate_question",
729
765
  "userFacing": true,
730
766
  "doNotUseWords": ["anchor", "validation anchor", "lane"]
731
767
  },
@@ -821,7 +857,14 @@
821
857
  "lead sample",
822
858
  "lead filter",
823
859
  "message validation"
824
- ]
860
+ ],
861
+ "requiredArtifactLinks": [
862
+ "approval-packet.md",
863
+ "message-review.md",
864
+ "lead-review.md",
865
+ "brief.md"
866
+ ],
867
+ "artifactLinkTiming": "same_turn_before_commit_question"
825
868
  },
826
869
  {
827
870
  "action": "ask_commit_choice",