@sellable/mcp 0.1.47 → 0.1.48

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.48",
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, sequence/settings, 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
@@ -56,6 +56,7 @@ Validated draft directory:
56
56
  lead-review.md
57
57
  lead-sample.json
58
58
  lead-filter.md
59
+ sequence-settings.md
59
60
  message-prep.md # optional speed artifact
60
61
  message-candidate-drafts.md # optional provisional message artifact
61
62
  message-validation.md
@@ -135,11 +136,12 @@ Validated draft directory:
135
136
  "mkdir", "campaign thesis", or "same approved campaign thesis" in
136
137
  customer-facing progress copy.
137
138
  - 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.
139
+ content. Show a short `Open artifact:` line with the one key clickable
140
+ markdown link for that stage. Do not show raw filesystem paths unless links
141
+ cannot be created or the user asks. Do this for brief approval, lead-source
142
+ approval/review, lead-filter review, message review, sequence/settings, and
143
+ final approval packet. Do not use the link as a substitute for rendering the
144
+ decision in chat; links are for deeper inspection.
143
145
  - Do not treat the active Sellable workspace as the campaign subject. The
144
146
  workspace only tells you where the campaign will be saved. Before buyer, CTA,
145
147
  proof, or source questions, identify two things:
@@ -421,6 +423,10 @@ should test for this campaign. Those can run in parallel and usually take
421
423
  - `lead-review.md` and `lead-sample.json` are the required outputs of `find leads`.
422
424
  - `lead-filter.md` is the primary output of `filter leads`.
423
425
  - `rubric.json` is optional and secondary to `lead-filter.md`.
426
+ - `sequence-settings.md` is a cheap pre-mint preview artifact. It summarizes
427
+ recommended sequence/settings for the user's approval packet. It must not call
428
+ sequence tools or rerun research; actual sequence attachment still happens
429
+ after campaign creation via `attach_recommended_sequence`.
424
430
  - `message-prep.md` is an optional speed artifact produced by the explicit
425
431
  message path after find-leads. It can prepare proof inventory, buyer
426
432
  objections, CTA options, gold-standard strategy maps, and candidate angles
@@ -707,14 +713,34 @@ usable leads after filtering, likely connection acceptance range, likely reply
707
713
  range, and estimate basis. If exact performance data is unavailable, use a
708
714
  directional range and label it `directional`, not definitive.
709
715
 
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.
716
+ When showing `lead-review.md` to the user, render a slim decision summary in
717
+ chat, not the full evidence table. The visible response must include:
718
+
719
+ - `Lead source decision`
720
+ - `Chosen source`
721
+ - `Why it won`
722
+ - `Key numbers` with raw volume, sampled fit rate as `n/N`, estimated usable
723
+ leads, expected connection acceptance range, and expected reply rate range
724
+ - `Sample leads` with 3-5 representative `Name — Title, Company` rows
725
+ - `Tradeoff`
726
+ - `Open artifact: lead-review.md`
727
+
728
+ Keep `## Evidence Snapshot`, selected posts, discarded paths, full sample rows,
729
+ and `lead-sample.json` details in artifacts. Do not show raw filesystem paths
730
+ unless links cannot be created or the user asks.
731
+
732
+ After the lead source is set, use this progress copy before the parallel
733
+ filter/message work:
734
+
735
+ ```text
736
+ Lead source is set.
737
+
738
+ I’m kicking off two workstreams now:
739
+ 1. Tighten the fit filter so we only reach out to the right people.
740
+ 2. Draft the first message from the approved brief and real sample leads.
741
+
742
+ These can run in parallel and usually take ~2-3 min.
743
+ ```
718
744
 
719
745
  For supplied profile CSVs and existing lead lists, `lead-review.md` must not
720
746
  describe a generic TAM estimate or pretend the rows came from Sales Nav/Prospeo
@@ -786,6 +812,29 @@ Required behavior:
786
812
  - `Recommendation`
787
813
  - `Implementation Details`
788
814
 
815
+ When showing the filter result in chat, render a slim summary before moving to
816
+ message review:
817
+
818
+ ```text
819
+ Lead filter
820
+
821
+ Keep:
822
+ {1-3 lines}
823
+
824
+ Exclude:
825
+ {1-3 lines}
826
+
827
+ Why:
828
+ {sample-backed reason}
829
+
830
+ Expected impact:
831
+ {1 line}
832
+
833
+ Open artifact: lead-filter.md
834
+ ```
835
+
836
+ Keep production rubric details and `rubric.json` internals in the artifact.
837
+
789
838
  When `rubric.json` is emitted, it must use the production rubric shape, not a
790
839
  custom sidecar schema:
791
840
 
@@ -826,6 +875,68 @@ Continue chunked-read until `hasMore=false`. Treat all chunks as one prompt load
826
875
 
827
876
  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
877
 
878
+ When showing message review in chat, lead with one fully filled sample message,
879
+ not the tokenized template. The visible response must include:
880
+
881
+ - `Message review`
882
+ - `Subject`
883
+ - `Sample message` with no `{{tokens}}`
884
+ - `Why it should work`
885
+ - `Concern`
886
+ - `Recommendation`
887
+ - `Open artifact: message-review.md`
888
+
889
+ Keep tokenized templates, token fill basis, rendered examples, good/bad token
890
+ fill examples, validation notes, and `message-validation.md` details in
891
+ artifacts.
892
+
893
+ ## Step 4: Sequence + Settings Preview
894
+
895
+ Before the final approval packet, write a cheap `sequence-settings.md` preview.
896
+ This is a planning artifact only. Do not call `attach_sequence` or
897
+ `attach_recommended_sequence` here, and do not rerun research or message
898
+ generation. Actual sequence attachment happens after campaign creation at
899
+ `awaiting-user-greenlight`.
900
+
901
+ Show this slim chat summary:
902
+
903
+ ```text
904
+ Sequence + settings
905
+
906
+ Recommended sequence:
907
+ Recommended LinkedIn sequence based on the connected sender’s tier and limits.
908
+
909
+ Review batch:
910
+ First review batch only.
911
+
912
+ Launch state:
913
+ Paused / review-gated. Nothing sends live until final greenlight.
914
+
915
+ Safety checks:
916
+ Sender and workspace will be checked again before start.
917
+
918
+ Open artifact: sequence-settings.md
919
+ ```
920
+
921
+ ## Step 5: Final Approval Packet
922
+
923
+ When showing the final approval packet, render a slim "ready to create" summary
924
+ in chat. The visible response must include:
925
+
926
+ - `Ready to create campaign`
927
+ - `Campaign`
928
+ - `Target`
929
+ - `Lead source` with one key metric
930
+ - `Filter`
931
+ - `Sample message` with one fully filled sample and no `{{tokens}}`
932
+ - `Sequence/settings`
933
+ - `What approval creates`
934
+ - `Safety`
935
+ - `Open artifact: approval-packet.md`
936
+
937
+ Keep tokenized templates, evidence tables, rubrics, validation notes, and long
938
+ implementation details in `approval-packet.md`.
939
+
829
940
  ## Tail (MANDATORY TOOL ORDER + Steps 13-16 + Threshold Trips + Hard Rules)
830
941
 
831
942
  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,18 @@ 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, lead
134
+ source, filter, sequence/settings, one filled sample message, what approval
135
+ creates, and the safety note that nothing sends live until greenlight.
136
+
127
137
  Avoid:
128
138
 
129
139
  ```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,
@@ -724,11 +727,60 @@
724
727
  "watchRequired": false,
725
728
  "waitFor": ["message_approved", "revise_messaging"],
726
729
  "transitions": {
727
- "message_approved": "approval-packet",
730
+ "message_approved": "sequence-settings-preview",
728
731
  "revise_messaging": "message-generation"
729
732
  },
730
733
  "interruptOnly": true
731
734
  },
735
+ {
736
+ "id": "sequence-settings-preview",
737
+ "label": "Sequence and settings preview",
738
+ "normalFlow": true,
739
+ "resumeOnly": false,
740
+ "onEnter": [
741
+ {
742
+ "action": "write_sequence_settings_preview",
743
+ "artifact": "sequence-settings.md",
744
+ "requiredInlineMarker": "Status: sequence-settings-preview",
745
+ "inputs": ["brief.md", "lead-review.md", "lead-filter.md", "message-review.md"],
746
+ "mustBeFast": true,
747
+ "doNotCallTailTools": true,
748
+ "requiredSections": [
749
+ "Recommended sequence",
750
+ "Review batch",
751
+ "Launch state",
752
+ "Safety checks"
753
+ ],
754
+ "chatRenderRule": "Show a slim sequence/settings summary: recommended LinkedIn sequence based on connected sender tier and limits, first review batch only, paused/review-gated launch state, nothing sends live until final greenlight, and sender/workspace checked again before start. Keep any details in sequence-settings.md. Do not show plain filesystem paths unless links cannot be created."
755
+ }
756
+ ],
757
+ "requiredArtifacts": [
758
+ "brief.md",
759
+ "lead-review.md",
760
+ "lead-filter.md",
761
+ "message-review.md",
762
+ "message-review-decision.md"
763
+ ],
764
+ "producesArtifacts": ["sequence-settings.md"],
765
+ "allowedTools": ["AskUserQuestion", "request_user_input"],
766
+ "doNotAllow": [
767
+ "attach_sequence",
768
+ "attach_recommended_sequence",
769
+ "create_campaign",
770
+ "save_rubrics",
771
+ "import_leads",
772
+ "confirm_lead_list",
773
+ "update_campaign",
774
+ "queue_cells",
775
+ "start_campaign"
776
+ ],
777
+ "watchRequired": false,
778
+ "waitFor": "sequence_settings_ready",
779
+ "transitions": {
780
+ "sequence_settings_ready": "approval-packet"
781
+ },
782
+ "interruptOnly": true
783
+ },
732
784
  {
733
785
  "id": "approval-packet",
734
786
  "label": "Approval packet",
@@ -744,7 +796,8 @@
744
796
  "lead-filter.md",
745
797
  "message-validation.md",
746
798
  "message-review.md",
747
- "message-review-decision.md"
799
+ "message-review-decision.md",
800
+ "sequence-settings.md"
748
801
  ],
749
802
  "optionalFiles": ["rubric.json"]
750
803
  },
@@ -761,19 +814,16 @@
761
814
  "mustRenderInlineBeforeCommitGate": true,
762
815
  "panels": [
763
816
  "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"
817
+ "lead source",
818
+ "filter",
819
+ "sequence and settings",
820
+ "sample message",
821
+ "what approval creates"
775
822
  ],
823
+ "minimumVisibleDetail": "slim_final_approval_summary",
824
+ "requiredArtifactLinks": ["approval-packet.md"],
776
825
  "artifactLinkTiming": "before_commit_gate_question",
826
+ "chatRenderRule": "Show a slim final approval packet only. Include target, lead source with one key metric, filter summary, sequence/settings 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 plain filesystem paths unless links cannot be created.",
777
827
  "userFacing": true,
778
828
  "doNotUseWords": ["anchor", "validation anchor", "lane"]
779
829
  },
@@ -791,7 +841,8 @@
791
841
  "lead-filter.md",
792
842
  "message-validation.md",
793
843
  "message-review.md",
794
- "message-review-decision.md"
844
+ "message-review-decision.md",
845
+ "sequence-settings.md"
795
846
  ],
796
847
  "producesArtifacts": ["approval-packet.md"],
797
848
  "optionalProducesArtifacts": ["customer-roleplay.md"],
@@ -865,17 +916,15 @@
865
916
  "requiredInlineMarker": "Status: approval-packet",
866
917
  "sameTurnAsCommitQuestion": true,
867
918
  "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"
919
+ "campaign direction",
920
+ "lead source",
921
+ "filter",
922
+ "sequence and settings",
923
+ "sample message",
924
+ "what approval creates"
878
925
  ],
926
+ "requiredArtifactLinks": ["approval-packet.md"],
927
+ "chatRenderRule": "Same slim approval packet as approval-packet. Include one fully filled sample message without tokens. Do not repeat tokenized template or long evidence tables in chat.",
879
928
  "artifactLinkTiming": "same_turn_before_commit_question"
880
929
  },
881
930
  {
@@ -59,6 +59,9 @@ 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
64
+ sequence-settings.md
62
65
  approval-packet.md
63
66
  commit-gate-decision.md
64
67
  ```
@@ -121,29 +121,32 @@ 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`
130
+ 3. **lead source** — selected source plus one key metric from `lead-review.md`
131
+ (for example `17/25 sampled fits`, `520 active profiles`, or estimated usable
132
+ leads). Put the full evidence table in `lead-review.md`, not chat.
133
+ 4. **filter** one-line keep/exclude summary from `lead-filter.md`
134
+ 5. **sequence/settings** conservative defaults from `sequence-settings.md`:
135
+ recommended sequence, first review batch, paused/review-gated launch state,
136
+ nothing sends live until greenlight, sender/workspace checked again before
137
+ start
138
+ 6. **sample message** one fully filled sample message with no `{{tokens}}`
139
+ 7. **what approval creates** campaign draft + review batch preparation, not
140
+ live sending
141
+
142
+ Keep implementation details, tokenized templates, lead tables, rubric JSON, and
143
+ validation notes available in `approval-packet.md` and the supporting artifacts.
144
+ Do not show raw filesystem paths unless links cannot be created or the user asks.
145
+ Use one normal chat link: `Open artifact: approval-packet.md`.
146
+
147
+ The packet artifact must include a dedicated `## Message Review` section
148
+ immediately before `## Approved Message Template`. This is the customer-facing
149
+ messaging gate. It should not be a raw validation dump; it should answer:
147
150
 
148
151
  - `Verdict:` strong / usable-but-could-improve / needs-revision
149
152
  - `What works:` why the message is likely to earn replies
@@ -163,6 +166,10 @@ message from the brief. If no winner/template can be extracted, this exact-match
163
166
  gate is skipped, but the packet still needs a usable approved template unless
164
167
  the user explicitly chose AI-generated messages.
165
168
 
169
+ The chat render must not lead with `## Approved Message Template` or token fill
170
+ rules. Show one filled sample first. The artifact can contain the tokenized
171
+ template and fill basis.
172
+
166
173
  Do NOT render the packet as a bundle of opaque validation anchors or a dump
167
174
  of raw JSON. The user is approving a live campaign — they need to see what
168
175
  they are approving.