@sellable/mcp 0.1.47 → 0.1.49

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.47",
3
+ "version": "0.1.49",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -96,11 +96,12 @@ confidence basis. Never show a percent like "73% match" without the numerator,
96
96
  denominator, and sample basis.
97
97
 
98
98
  Every approval gate must include artifact access after the readable inline
99
- content. Show an `Open artifacts:` line with clickable markdown links using
100
- absolute paths when the host supports them, plus the plain path for CLI users.
101
- Do this for brief approval, lead-source approval/review, message review, and the
102
- final approval packet. The links are for deeper inspection; never use them as a
103
- substitute for showing the content in chat.
99
+ content. Show an `Open artifact:` line with the one key clickable markdown link
100
+ for that stage. Do not show raw filesystem paths unless links cannot be created
101
+ or the user asks. Do this for brief approval, lead-source approval/review,
102
+ lead-filter review, message review, and final approval
103
+ packet. The link is for deeper inspection; never use it as a substitute for
104
+ showing the decision in chat.
104
105
 
105
106
  Never mention MCP namespaces, prompt chunking, plugin cache paths, missing
106
107
  linked skill versions, runbooks, or local skill files in normal customer-facing
@@ -135,11 +135,12 @@ Validated draft directory:
135
135
  "mkdir", "campaign thesis", or "same approved campaign thesis" in
136
136
  customer-facing progress copy.
137
137
  - Every approval gate must include artifact access after the readable inline
138
- content. Show a short `Open artifacts:` line with clickable markdown links
139
- using absolute paths when the host supports them, plus the plain path for CLI
140
- users. Do this for brief approval, lead-source approval/review, message review,
141
- and final approval packet. Do not use the links as a substitute for rendering
142
- the content inline; links are for deeper inspection.
138
+ content. Show a short `Open artifact:` line with the one key clickable
139
+ markdown link for that stage. Do not show raw filesystem paths unless links
140
+ cannot be created or the user asks. Do this for brief approval, lead-source
141
+ approval/review, lead-filter review, message review, and final approval
142
+ packet. Do not use the link as a substitute for rendering the decision in
143
+ chat; links are for deeper inspection.
143
144
  - Do not treat the active Sellable workspace as the campaign subject. The
144
145
  workspace only tells you where the campaign will be saved. Before buyer, CTA,
145
146
  proof, or source questions, identify two things:
@@ -327,7 +328,7 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
327
328
  Campaign brief
328
329
 
329
330
  Target:
330
- ...
331
+ ... (include concrete role/title names, not just a broad persona)
331
332
 
332
333
  Core pain:
333
334
  ...
@@ -707,14 +708,34 @@ usable leads after filtering, likely connection acceptance range, likely reply
707
708
  range, and estimate basis. If exact performance data is unavailable, use a
708
709
  directional range and label it `directional`, not definitive.
709
710
 
710
- When showing `lead-review.md` to the user, render the customer-visible sections
711
- inline. Do not compress it to a short summary or artifact links only. The
712
- visible response must include `## Source Decision`, `## Evidence Snapshot`,
713
- `## Expected LinkedIn Funnel`, `## Pros`, `## Tradeoffs`, and `## Discarded
714
- Paths`. For Signals-first campaigns it must also include `## Selected Signal
715
- Posts` and `## Sample Leads`.
716
- Include `Open artifacts:` links to `lead-review.md` and `lead-sample.json`
717
- before moving to filter/message drafting or asking for any source revision.
711
+ When showing `lead-review.md` to the user, render a slim decision summary in
712
+ chat, not the full evidence table. The visible response must include:
713
+
714
+ - `Lead source decision`
715
+ - `Chosen source`
716
+ - `Why it won`
717
+ - `Key numbers` with raw volume, sampled fit rate as `n/N`, estimated usable
718
+ leads, expected connection acceptance range, and expected reply rate range
719
+ - `Sample leads` with 3-5 representative `Name — Title, Company` rows
720
+ - `Tradeoff`
721
+ - `Open artifact: lead-review.md`
722
+
723
+ Keep `## Evidence Snapshot`, selected posts, discarded paths, full sample rows,
724
+ and `lead-sample.json` details in artifacts. Do not show raw filesystem paths
725
+ unless links cannot be created or the user asks.
726
+
727
+ After the lead source is set, use this progress copy before the parallel
728
+ filter/message work:
729
+
730
+ ```text
731
+ Lead source is set.
732
+
733
+ I’m kicking off two workstreams now:
734
+ 1. Tighten the fit filter so we only reach out to the right people.
735
+ 2. Draft the first message from the approved brief and real sample leads.
736
+
737
+ These can run in parallel and usually take ~2-3 min.
738
+ ```
718
739
 
719
740
  For supplied profile CSVs and existing lead lists, `lead-review.md` must not
720
741
  describe a generic TAM estimate or pretend the rows came from Sales Nav/Prospeo
@@ -786,6 +807,29 @@ Required behavior:
786
807
  - `Recommendation`
787
808
  - `Implementation Details`
788
809
 
810
+ When showing the filter result in chat, render a slim summary before moving to
811
+ message review:
812
+
813
+ ```text
814
+ Lead filter
815
+
816
+ Keep:
817
+ {1-3 lines}
818
+
819
+ Exclude:
820
+ {1-3 lines}
821
+
822
+ Why:
823
+ {sample-backed reason}
824
+
825
+ Expected impact:
826
+ {1 line}
827
+
828
+ Open artifact: lead-filter.md
829
+ ```
830
+
831
+ Keep production rubric details and `rubric.json` internals in the artifact.
832
+
789
833
  When `rubric.json` is emitted, it must use the production rubric shape, not a
790
834
  custom sidecar schema:
791
835
 
@@ -826,6 +870,41 @@ Continue chunked-read until `hasMore=false`. Treat all chunks as one prompt load
826
870
 
827
871
  Do NOT proceed to Step 4 (message review gate) without loading and following the full generate-messages workflow. `message-validation.md` must prove the full workflow ran (all required sections present + raw sendable Selected Winner) before `message-review.md` can recommend `approve-message`. If the message review or approval packet is ready but the generate-messages prompt was not retrieved in this run, route back to message-generation instead of asking the commit gate.
828
872
 
873
+ When showing message review in chat, lead with one fully filled sample message,
874
+ not the tokenized template. The visible response must include:
875
+
876
+ - `Message review`
877
+ - `Subject`
878
+ - `Sample message` with no `{{tokens}}`
879
+ - `Why it should work`
880
+ - `Concern`
881
+ - `Recommendation`
882
+ - `Open artifact: message-review.md`
883
+
884
+ Keep tokenized templates, token fill basis, rendered examples, good/bad token
885
+ fill examples, validation notes, and `message-validation.md` details in
886
+ artifacts.
887
+
888
+ ## Step 4: Final Approval Packet
889
+
890
+ When showing the final approval packet, render a slim "ready to create" summary
891
+ in chat. The visible response must include:
892
+
893
+ - `Ready to create campaign`
894
+ - `Campaign`
895
+ - `Target` with concrete role/title names
896
+ - `Lead source` with one key metric
897
+ - `Filter`
898
+ - `Sample message` with one fully filled sample and no `{{tokens}}`
899
+ - `What approval creates`
900
+ - `Safety`
901
+ - `Open artifact: approval-packet.md`
902
+
903
+ Keep tokenized templates, evidence tables, rubrics, validation notes, and long
904
+ implementation details in `approval-packet.md`. Do not include
905
+ sequence/settings in the final approval packet; sequence attachment and launch
906
+ settings happen after campaign creation and before the later greenlight.
907
+
829
908
  ## Tail (MANDATORY TOOL ORDER + Steps 13-16 + Threshold Trips + Hard Rules)
830
909
 
831
910
  The full tail detail (~17k chars: MANDATORY TOOL ORDER, auto-execute-leads, validate-sample loop, auto-execute-messaging, awaiting-user-greenlight, threshold-trip logging, tail hard rules) lives in a dedicated on-demand subskill to keep this entry prompt fast to load.
@@ -60,18 +60,16 @@ any approve/revise question, show the relevant decision in plain language. For a
60
60
  brief approval, render the slim approval brief, not just a direction summary.
61
61
 
62
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
- to the files behind the decision. Do not show long plain paths in normal chat;
65
- offer them only as a fallback if links cannot be created. The artifact links are
66
- a backup for inspection, not a replacement for showing the decision in chat.
63
+ After the readable inline content, include an `Open artifact:` line with the one
64
+ key link behind the decision. Do not show long plain paths in normal chat; offer
65
+ them only as a fallback if links cannot be created. The artifact link is a backup
66
+ for inspection, not a replacement for showing the decision in chat.
67
67
 
68
68
  This applies especially to message approvals. Never ask someone to approve a
69
- message they cannot see. Show the subject, tokenized template, a filled sample
70
- prospect version, good fill example, good omit example, bad fill example, why
71
- the bad fill is wrong, token notes, your take, and suggested adjustment first.
72
- The user should be able to compare "here is the template" against "here is what
73
- one real prospect would receive" before approving, and understand exactly how
74
- the tokens should and should not be filled.
69
+ message they cannot see. In chat, show the subject and one fully filled sample
70
+ message with no tokens first. Keep the tokenized template, good fill example,
71
+ good omit example, bad fill example, why the bad fill is wrong, token notes, and
72
+ fallback rules in `message-review.md` / `message-validation.md`.
75
73
 
76
74
  Every token needs a fallback. If the row does not have clean data for a token,
77
75
  the approval view should say whether to use a safe segment-level phrase, omit
@@ -124,6 +122,20 @@ sampled engagers; 31 looked like real ICP fits, so I’d treat this as direction
124
122
  usable people if the remaining engagers behave similarly.
125
123
  ```
126
124
 
125
+ Lead review chat should be short and numeric: chosen source, why it won, raw
126
+ volume, sampled fit rate as `n/N`, estimated good fits, expected connection
127
+ acceptance, expected reply rate, 3-5 sample leads, and one tradeoff. Full tables
128
+ belong in `lead-review.md`.
129
+
130
+ Lead filter chat should always show what changed: keep, exclude, why, expected
131
+ impact, and `Open artifact: lead-filter.md`.
132
+
133
+ Final approval chat should be a ready-to-create summary: campaign, target with
134
+ concrete role/title names, lead source, filter, one filled sample message, what
135
+ approval creates, and the safety note that nothing sends live until greenlight.
136
+ Do not include sequence/settings in final approval; that belongs after campaign
137
+ creation.
138
+
127
139
  Avoid:
128
140
 
129
141
  ```text
@@ -365,14 +365,12 @@
365
365
  "action": "show_lead_review",
366
366
  "artifact": "lead-review.md",
367
367
  "renderInlineSections": [
368
- "## Source Decision",
369
- "## Evidence Snapshot",
370
- "## Selected Signal Posts",
371
- "## Expected LinkedIn Funnel",
372
- "## Sample Leads",
373
- "## Pros",
374
- "## Tradeoffs",
375
- "## Discarded Paths"
368
+ "Lead source decision",
369
+ "Chosen source",
370
+ "Why it won",
371
+ "Key numbers",
372
+ "Sample leads",
373
+ "Tradeoff"
376
374
  ],
377
375
  "signalsFirstRequiredFields": [
378
376
  "post URL",
@@ -397,19 +395,19 @@
397
395
  "confidence note"
398
396
  ],
399
397
  "forbidPercentOnlyFitRates": true,
400
- "requiredArtifactLinks": ["lead-review.md", "lead-sample.json"],
398
+ "requiredArtifactLinks": ["lead-review.md"],
401
399
  "artifactLinkTiming": "before_next_step_or_revision_question",
402
- "doNotCompressToSummaryOnly": true,
403
- "doNotRenderArtifactLinksOnly": true
400
+ "chatRenderRule": "Show a slim decision summary only: chosen source, why it won, raw volume, sampled fit rate as n/N, estimated usable leads, expected connection acceptance range, expected reply rate range, 3-5 representative sample leads, and one tradeoff. Keep evidence tables, selected posts, discarded paths, full sample rows, and lead-sample.json details in lead-review.md. Do not show plain filesystem paths unless links cannot be created."
404
401
  },
405
402
  {
406
403
  "action": "render_post_lead_parallel_progress",
407
404
  "requiredVisibleContent": [
408
405
  "Lead source is set",
409
- "apply the fit filter",
410
- "clean the list down to great fits",
411
- "draft the first message we should test",
412
- "run in parallel"
406
+ "kicking off two workstreams",
407
+ "Tighten the fit filter",
408
+ "Draft the first message",
409
+ "approved brief and real sample leads",
410
+ "parallel"
413
411
  ],
414
412
  "timeEstimate": "~2-3 min"
415
413
  },
@@ -470,6 +468,19 @@
470
468
  "artifacts": ["lead-filter.md"],
471
469
  "optionalArtifacts": ["rubric.json"]
472
470
  },
471
+ {
472
+ "action": "show_lead_filter_summary",
473
+ "artifact": "lead-filter.md",
474
+ "renderInlineSections": [
475
+ "Lead filter",
476
+ "Keep",
477
+ "Exclude",
478
+ "Why",
479
+ "Expected impact"
480
+ ],
481
+ "requiredArtifactLinks": ["lead-filter.md"],
482
+ "chatRenderRule": "Show a slim filter summary before message review: who we keep, who we exclude, sample-backed reason, and expected impact. Keep production rubric fields and rubric.json details in lead-filter.md/rubric.json. Do not show plain filesystem paths unless links cannot be created."
483
+ },
473
484
  {
474
485
  "action": "ask_revise_only_if_filter_is_not_confirmed",
475
486
  "autoContinueWhen": {
@@ -601,19 +612,15 @@
601
612
  "requiredInlineMarker": "Status: message-review",
602
613
  "panels": [
603
614
  "subject",
604
- "tokenized template",
605
615
  "sample prospect fill",
606
616
  "my take",
607
- "suggested adjustment",
617
+ "concern",
608
618
  "question",
609
619
  "recommendation"
610
620
  ],
611
621
  "mustRenderInlineBeforeQuestion": true,
612
- "minimumVisibleMessageDetail": "tokenized_template_plus_sample_fill_only",
613
- "requiredArtifactLinks": [
614
- "message-review.md",
615
- "message-validation.md"
616
- ],
622
+ "minimumVisibleMessageDetail": "filled_sample_message_no_tokens",
623
+ "requiredArtifactLinks": ["message-review.md"],
617
624
  "artifactLinkTiming": "before_approval_question",
618
625
  "requiredFileLabels": [
619
626
  "Subject:",
@@ -635,15 +642,13 @@
635
642
  "requiredChatLabels": [
636
643
  "Status: message-review",
637
644
  "Subject:",
638
- "Tokenized template:",
639
645
  "Sample prospect fill:",
640
- "Token fill basis:",
641
646
  "My take:",
642
- "Suggested adjustment:",
647
+ "Concern:",
643
648
  "Question: approve-message or revise-messaging?",
644
649
  "Recommendation:"
645
650
  ],
646
- "chatRenderRule": "Show ONLY the tokenized template and one filled sample prospect version (with Token fill basis), then My take, Suggested adjustment, Question, Recommendation, and Open artifacts links. Do NOT inline Rendered examples, Good token fill, Good omit, Bad token fill, Why bad, Fallback if missing, or Token notes those live in message-review.md and message-validation.md only.",
651
+ "chatRenderRule": "Show one fully filled sample message with no {{tokens}} before asking for approval. Include subject, sample message, why it should work, one concern or None, recommendation, and Open artifact: message-review.md. Keep tokenized template, token fill basis, rendered examples, good/bad token fill examples, validation notes, and message-validation.md details in artifacts. Do not show plain filesystem paths unless links cannot be created.",
647
652
  "allowedRecommendations": ["approve-message", "revise-messaging"],
648
653
  "judgeAgainst": [
649
654
  "generate-messages rules",
@@ -676,11 +681,9 @@
676
681
  "questionPrerequisiteVisibleLabels": [
677
682
  "Status: message-review",
678
683
  "Subject:",
679
- "Tokenized template:",
680
684
  "Sample prospect fill:",
681
- "Token fill basis:",
682
685
  "My take:",
683
- "Suggested adjustment:",
686
+ "Concern:",
684
687
  "Recommendation:"
685
688
  ],
686
689
  "forbiddenWhenMissingVisibleMessage": true,
@@ -761,19 +764,15 @@
761
764
  "mustRenderInlineBeforeCommitGate": true,
762
765
  "panels": [
763
766
  "campaign direction",
764
- "lead source and sample",
765
- "filters and rubrics",
766
- "message review",
767
- "messages",
768
- "risks and next action"
769
- ],
770
- "requiredArtifactLinks": [
771
- "approval-packet.md",
772
- "message-review.md",
773
- "lead-review.md",
774
- "brief.md"
767
+ "lead source",
768
+ "filter",
769
+ "sample message",
770
+ "what approval creates"
775
771
  ],
772
+ "minimumVisibleDetail": "slim_final_approval_summary",
773
+ "requiredArtifactLinks": ["approval-packet.md"],
776
774
  "artifactLinkTiming": "before_commit_gate_question",
775
+ "chatRenderRule": "Show a slim final approval packet only. Include target with concrete role/title names, lead source with one key metric, filter summary, one fully filled sample message with no {{tokens}}, what approval creates, and safety note that nothing sends live until the review/greenlight step. Keep tokenized templates, evidence tables, rubrics, and validation details in approval-packet.md. Do not show sequence/settings in final approval; that comes after campaign creation. Do not show plain filesystem paths unless links cannot be created.",
777
776
  "userFacing": true,
778
777
  "doNotUseWords": ["anchor", "validation anchor", "lane"]
779
778
  },
@@ -865,17 +864,14 @@
865
864
  "requiredInlineMarker": "Status: approval-packet",
866
865
  "sameTurnAsCommitQuestion": true,
867
866
  "panels": [
868
- "brief",
869
- "lead sample",
870
- "lead filter",
871
- "message validation"
872
- ],
873
- "requiredArtifactLinks": [
874
- "approval-packet.md",
875
- "message-review.md",
876
- "lead-review.md",
877
- "brief.md"
867
+ "campaign direction",
868
+ "lead source",
869
+ "filter",
870
+ "sample message",
871
+ "what approval creates"
878
872
  ],
873
+ "requiredArtifactLinks": ["approval-packet.md"],
874
+ "chatRenderRule": "Same slim approval packet as approval-packet. Include target with concrete role/title names and one fully filled sample message without tokens. Do not include sequence/settings. Do not repeat tokenized template or long evidence tables in chat.",
879
875
  "artifactLinkTiming": "same_turn_before_commit_question"
880
876
  },
881
877
  {
@@ -59,6 +59,8 @@ lead-filter.md
59
59
  message-prep.md (optional)
60
60
  message-candidate-drafts.md (optional, generated from find-leads basis rows)
61
61
  message-validation.md
62
+ message-review.md
63
+ message-review-decision.md
62
64
  approval-packet.md
63
65
  commit-gate-decision.md
64
66
  ```
@@ -121,29 +121,33 @@ rerun `$sellable:create-campaign`. A normal chat question is acceptable only for
121
121
  non-interactive `codex exec` smoke/rehearsal runs because structured user input
122
122
  is unavailable by design there.
123
123
 
124
- The packet should read like an AI GTM engineer explaining the campaign, not an
125
- internal validation report. Start with the practical direction in plain
126
- language: who we will contact, why this buyer should care, what lead source we
127
- will use, what the first message says, and what happens if the user approves.
128
- Keep implementation details available, but move them below the customer-facing
129
- summary.
130
-
131
- 1. **brief** — `brief.md` thesis, product, ICP, offer
132
- 2. **lead sample** first 5-10 rows from `lead-sample.json` rendered as
133
- `Name / Title / Company` lines, plus the `lead-review.md` pass-rate
134
- and supplied-source framing when `lead-source-intake.json` exists:
135
- supplied people list, existing Sellable lead list, or supplied account list
136
- plus people search
137
- 3. **lead filter** — the `Decision`, `Who We'll Keep`, `Who We'll Exclude`,
138
- `Pass Rate`, and `Recommendation` blocks from `lead-filter.md`; keep
139
- rubric internals in `Implementation Details` unless the user asks to inspect
140
- the saved filter criteria
141
- 4. **message validation** — the `Selected Winner` from `message-validation.md`,
142
- rendered as it will appear in the outbound, plus the `Findings` + `Recommendation`
143
-
144
- The packet must include a dedicated `## Message Review` section immediately
145
- before `## Approved Message Template`. This is the customer-facing messaging
146
- gate. It should not be a raw validation dump; it should answer:
124
+ The packet should read like an AI GTM engineer asking for one final creation
125
+ decision, not an internal validation report. Chat should show a slim approval
126
+ surface only:
127
+
128
+ 1. **campaign** company + sender
129
+ 2. **target** — concise ICP summary from `brief.md`, including concrete
130
+ role/title names so the user can verify we are aiming at the right buyers
131
+ 3. **lead source** — selected source plus one key metric from `lead-review.md`
132
+ (for example `17/25 sampled fits`, `520 active profiles`, or estimated usable
133
+ leads). Put the full evidence table in `lead-review.md`, not chat.
134
+ 4. **filter** — one-line keep/exclude summary from `lead-filter.md`
135
+ 5. **sample message** one fully filled sample message with no `{{tokens}}`
136
+ 6. **what approval creates** — campaign draft + review batch preparation, not
137
+ live sending
138
+
139
+ Do not include sequence/settings in the pre-mint final approval packet. Sequence
140
+ attachment and launch settings happen after campaign creation and before the
141
+ later greenlight.
142
+
143
+ Keep implementation details, tokenized templates, lead tables, rubric JSON, and
144
+ validation notes available in `approval-packet.md` and the supporting artifacts.
145
+ Do not show raw filesystem paths unless links cannot be created or the user asks.
146
+ Use one normal chat link: `Open artifact: approval-packet.md`.
147
+
148
+ The packet artifact must include a dedicated `## Message Review` section
149
+ immediately before `## Approved Message Template`. This is the customer-facing
150
+ messaging gate. It should not be a raw validation dump; it should answer:
147
151
 
148
152
  - `Verdict:` strong / usable-but-could-improve / needs-revision
149
153
  - `What works:` why the message is likely to earn replies
@@ -163,6 +167,10 @@ message from the brief. If no winner/template can be extracted, this exact-match
163
167
  gate is skipped, but the packet still needs a usable approved template unless
164
168
  the user explicitly chose AI-generated messages.
165
169
 
170
+ The chat render must not lead with `## Approved Message Template` or token fill
171
+ rules. Show one filled sample first. The artifact can contain the tokenized
172
+ template and fill basis.
173
+
166
174
  Do NOT render the packet as a bundle of opaque validation anchors or a dump
167
175
  of raw JSON. The user is approving a live campaign — they need to see what
168
176
  they are approving.