@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 +1 -1
- package/skills/create-campaign/SKILL.md +6 -5
- package/skills/create-campaign-v2/SKILL.md +93 -14
- package/skills/create-campaign-v2/SOUL.md +22 -10
- package/skills/create-campaign-v2/core/flow.v2.json +46 -50
- package/skills/create-campaign-v2/core/policy.md +2 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +31 -23
package/package.json
CHANGED
|
@@ -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
|
|
100
|
-
|
|
101
|
-
Do this for brief approval, lead-source approval/review,
|
|
102
|
-
|
|
103
|
-
|
|
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
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
the
|
|
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
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
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
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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.
|
|
70
|
-
|
|
71
|
-
the bad fill is wrong, token notes,
|
|
72
|
-
|
|
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
|
-
"
|
|
369
|
-
"
|
|
370
|
-
"
|
|
371
|
-
"
|
|
372
|
-
"
|
|
373
|
-
"
|
|
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"
|
|
398
|
+
"requiredArtifactLinks": ["lead-review.md"],
|
|
401
399
|
"artifactLinkTiming": "before_next_step_or_revision_question",
|
|
402
|
-
"
|
|
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
|
-
"
|
|
410
|
-
"
|
|
411
|
-
"
|
|
412
|
-
"
|
|
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
|
-
"
|
|
617
|
+
"concern",
|
|
608
618
|
"question",
|
|
609
619
|
"recommendation"
|
|
610
620
|
],
|
|
611
621
|
"mustRenderInlineBeforeQuestion": true,
|
|
612
|
-
"minimumVisibleMessageDetail": "
|
|
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
|
-
"
|
|
647
|
+
"Concern:",
|
|
643
648
|
"Question: approve-message or revise-messaging?",
|
|
644
649
|
"Recommendation:"
|
|
645
650
|
],
|
|
646
|
-
"chatRenderRule": "Show
|
|
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
|
-
"
|
|
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
|
|
765
|
-
"
|
|
766
|
-
"message
|
|
767
|
-
"
|
|
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
|
-
"
|
|
869
|
-
"lead
|
|
870
|
-
"
|
|
871
|
-
"message
|
|
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
|
{
|
|
@@ -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
|
|
125
|
-
internal validation report.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
summary.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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.
|