@sellable/mcp 0.1.189 → 0.1.190

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.
Files changed (29) hide show
  1. package/agents/post-find-leads-message-scout.md +8 -7
  2. package/agents/registry.json +2 -2
  3. package/dist/index-dev.js +0 -0
  4. package/dist/index.js +0 -0
  5. package/dist/server.js +22 -0
  6. package/dist/tools/campaign-processing.d.ts +383 -0
  7. package/dist/tools/campaign-processing.js +304 -0
  8. package/dist/tools/leads.d.ts +63 -19
  9. package/dist/tools/leads.js +59 -8
  10. package/dist/tools/prompts.js +2 -2
  11. package/dist/tools/registry.d.ts +289 -37
  12. package/dist/tools/registry.js +2 -0
  13. package/package.json +1 -1
  14. package/skills/create-campaign/SKILL.md +17 -12
  15. package/skills/create-campaign-v2/SKILL.md +17 -18
  16. package/skills/create-campaign-v2/SOUL.md +11 -4
  17. package/skills/create-campaign-v2/core/flow.v2.json +1 -1
  18. package/skills/create-campaign-v2/core/policy.md +3 -3
  19. package/skills/create-campaign-v2/references/approval-gate-framing.md +5 -5
  20. package/skills/create-campaign-v2/references/filter-leads.md +5 -3
  21. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +2 -2
  22. package/skills/create-campaign-v2/references/sample-validation-loop.md +46 -66
  23. package/skills/create-campaign-v2/references/step-15-re-cascade.md +20 -13
  24. package/skills/create-campaign-v2-tail/SKILL.md +52 -65
  25. package/skills/find-leads/SKILL.md +2 -1
  26. package/skills/generate-messages/SKILL.md +11 -0
  27. package/skills/generate-messages-compact/SKILL.md +100 -0
  28. package/skills/generate-messages-compact/references/examples-critique-revision.md +37 -0
  29. package/skills/providers/signal-discovery.md +9 -3
@@ -853,6 +853,278 @@ export declare const allTools: ({
853
853
  required: string[];
854
854
  additionalProperties?: undefined;
855
855
  };
856
+ } | {
857
+ name: string;
858
+ description: string;
859
+ inputSchema: {
860
+ type: string;
861
+ properties: {
862
+ campaignId: {
863
+ type: string;
864
+ description: string;
865
+ };
866
+ timeoutMs: {
867
+ type: string;
868
+ description: string;
869
+ };
870
+ intervalMs: {
871
+ type: string;
872
+ description: string;
873
+ };
874
+ requireRows: {
875
+ type: string;
876
+ description: string;
877
+ };
878
+ flowVersion: {
879
+ type: string;
880
+ enum: string[];
881
+ description: string;
882
+ };
883
+ leadListId?: undefined;
884
+ campaignOfferId?: undefined;
885
+ provider?: undefined;
886
+ jobId?: undefined;
887
+ targetLeadCount?: undefined;
888
+ requireComplete?: undefined;
889
+ };
890
+ required: string[];
891
+ additionalProperties: boolean;
892
+ };
893
+ } | {
894
+ name: string;
895
+ description: string;
896
+ inputSchema: {
897
+ type: string;
898
+ properties: {
899
+ campaignId: {
900
+ type: string;
901
+ };
902
+ tableId: {
903
+ type: string;
904
+ };
905
+ columnRole?: undefined;
906
+ rowSelector?: undefined;
907
+ limit?: undefined;
908
+ forceRerun?: undefined;
909
+ reason?: undefined;
910
+ minPassedCount?: undefined;
911
+ minGeneratedMessages?: undefined;
912
+ templateRevision?: undefined;
913
+ timeoutMs?: undefined;
914
+ intervalMs?: undefined;
915
+ templateMarkdown?: undefined;
916
+ approvedMessageTemplate?: undefined;
917
+ };
918
+ additionalProperties: boolean;
919
+ required?: undefined;
920
+ };
921
+ } | {
922
+ name: string;
923
+ description: string;
924
+ inputSchema: {
925
+ type: string;
926
+ properties: {
927
+ campaignId: {
928
+ type: string;
929
+ };
930
+ tableId: {
931
+ type: string;
932
+ };
933
+ columnRole: {
934
+ type: string;
935
+ enum: string[];
936
+ };
937
+ rowSelector: {
938
+ type: string;
939
+ properties: {
940
+ type: {
941
+ type: string;
942
+ enum: string[];
943
+ };
944
+ basisHash: {
945
+ type: string;
946
+ };
947
+ rowIds: {
948
+ type: string;
949
+ items: {
950
+ type: string;
951
+ };
952
+ };
953
+ limit: {
954
+ type: string;
955
+ };
956
+ };
957
+ required: string[];
958
+ additionalProperties: boolean;
959
+ };
960
+ limit: {
961
+ type: string;
962
+ };
963
+ forceRerun?: undefined;
964
+ reason?: undefined;
965
+ minPassedCount?: undefined;
966
+ minGeneratedMessages?: undefined;
967
+ templateRevision?: undefined;
968
+ timeoutMs?: undefined;
969
+ intervalMs?: undefined;
970
+ templateMarkdown?: undefined;
971
+ approvedMessageTemplate?: undefined;
972
+ };
973
+ required: string[];
974
+ additionalProperties: boolean;
975
+ };
976
+ } | {
977
+ name: string;
978
+ description: string;
979
+ inputSchema: {
980
+ type: string;
981
+ properties: {
982
+ campaignId: {
983
+ type: string;
984
+ };
985
+ tableId: {
986
+ type: string;
987
+ };
988
+ columnRole: {
989
+ type: string;
990
+ enum: string[];
991
+ };
992
+ rowSelector: {
993
+ type: string;
994
+ properties: {
995
+ type: {
996
+ type: string;
997
+ enum: string[];
998
+ };
999
+ basisHash: {
1000
+ type: string;
1001
+ };
1002
+ rowIds: {
1003
+ type: string;
1004
+ items: {
1005
+ type: string;
1006
+ };
1007
+ };
1008
+ limit: {
1009
+ type: string;
1010
+ };
1011
+ };
1012
+ required: string[];
1013
+ additionalProperties: boolean;
1014
+ };
1015
+ forceRerun: {
1016
+ type: string;
1017
+ };
1018
+ limit: {
1019
+ type: string;
1020
+ };
1021
+ reason: {
1022
+ type: string;
1023
+ };
1024
+ minPassedCount?: undefined;
1025
+ minGeneratedMessages?: undefined;
1026
+ templateRevision?: undefined;
1027
+ timeoutMs?: undefined;
1028
+ intervalMs?: undefined;
1029
+ templateMarkdown?: undefined;
1030
+ approvedMessageTemplate?: undefined;
1031
+ };
1032
+ required: string[];
1033
+ additionalProperties: boolean;
1034
+ };
1035
+ } | {
1036
+ name: string;
1037
+ description: string;
1038
+ inputSchema: {
1039
+ type: string;
1040
+ properties: {
1041
+ campaignId: {
1042
+ type: string;
1043
+ };
1044
+ tableId: {
1045
+ type: string;
1046
+ };
1047
+ minPassedCount: {
1048
+ type: string;
1049
+ };
1050
+ minGeneratedMessages: {
1051
+ type: string;
1052
+ };
1053
+ templateRevision: {
1054
+ type: string;
1055
+ description: string;
1056
+ };
1057
+ timeoutMs: {
1058
+ type: string;
1059
+ };
1060
+ intervalMs: {
1061
+ type: string;
1062
+ };
1063
+ columnRole?: undefined;
1064
+ rowSelector?: undefined;
1065
+ limit?: undefined;
1066
+ forceRerun?: undefined;
1067
+ reason?: undefined;
1068
+ templateMarkdown?: undefined;
1069
+ approvedMessageTemplate?: undefined;
1070
+ };
1071
+ additionalProperties: boolean;
1072
+ required?: undefined;
1073
+ };
1074
+ } | {
1075
+ name: string;
1076
+ description: string;
1077
+ inputSchema: {
1078
+ type: string;
1079
+ properties: {
1080
+ campaignId: {
1081
+ type: string;
1082
+ };
1083
+ tableId: {
1084
+ type: string;
1085
+ };
1086
+ templateMarkdown: {
1087
+ type: string;
1088
+ };
1089
+ approvedMessageTemplate: {
1090
+ type: string;
1091
+ };
1092
+ rowSelector: {
1093
+ type: string;
1094
+ properties: {
1095
+ type: {
1096
+ type: string;
1097
+ enum: string[];
1098
+ };
1099
+ rowIds: {
1100
+ type: string;
1101
+ items: {
1102
+ type: string;
1103
+ };
1104
+ };
1105
+ limit: {
1106
+ type: string;
1107
+ };
1108
+ basisHash?: undefined;
1109
+ };
1110
+ required: string[];
1111
+ additionalProperties: boolean;
1112
+ };
1113
+ limit: {
1114
+ type: string;
1115
+ };
1116
+ columnRole?: undefined;
1117
+ forceRerun?: undefined;
1118
+ reason?: undefined;
1119
+ minPassedCount?: undefined;
1120
+ minGeneratedMessages?: undefined;
1121
+ templateRevision?: undefined;
1122
+ timeoutMs?: undefined;
1123
+ intervalMs?: undefined;
1124
+ };
1125
+ required: string[];
1126
+ additionalProperties: boolean;
1127
+ };
856
1128
  } | {
857
1129
  name: string;
858
1130
  description: string;
@@ -1282,43 +1554,6 @@ export declare const allTools: ({
1282
1554
  };
1283
1555
  required: never[];
1284
1556
  };
1285
- } | {
1286
- name: string;
1287
- description: string;
1288
- inputSchema: {
1289
- type: string;
1290
- properties: {
1291
- campaignId: {
1292
- type: string;
1293
- description: string;
1294
- };
1295
- timeoutMs: {
1296
- type: string;
1297
- description: string;
1298
- };
1299
- intervalMs: {
1300
- type: string;
1301
- description: string;
1302
- };
1303
- requireRows: {
1304
- type: string;
1305
- description: string;
1306
- };
1307
- flowVersion: {
1308
- type: string;
1309
- enum: string[];
1310
- description: string;
1311
- };
1312
- leadListId?: undefined;
1313
- campaignOfferId?: undefined;
1314
- provider?: undefined;
1315
- jobId?: undefined;
1316
- targetLeadCount?: undefined;
1317
- requireComplete?: undefined;
1318
- };
1319
- required: string[];
1320
- additionalProperties: boolean;
1321
- };
1322
1557
  } | {
1323
1558
  name: string;
1324
1559
  description: string;
@@ -1393,6 +1628,7 @@ export declare const allTools: ({
1393
1628
  jobId?: undefined;
1394
1629
  reviewBatchLimit?: undefined;
1395
1630
  allowPartialSourceList?: undefined;
1631
+ includeRawImportResult?: undefined;
1396
1632
  selections?: undefined;
1397
1633
  selectionMode?: undefined;
1398
1634
  };
@@ -1570,6 +1806,7 @@ export declare const allTools: ({
1570
1806
  jobId?: undefined;
1571
1807
  reviewBatchLimit?: undefined;
1572
1808
  allowPartialSourceList?: undefined;
1809
+ includeRawImportResult?: undefined;
1573
1810
  selections?: undefined;
1574
1811
  selectionMode?: undefined;
1575
1812
  };
@@ -1646,6 +1883,7 @@ export declare const allTools: ({
1646
1883
  jobId?: undefined;
1647
1884
  reviewBatchLimit?: undefined;
1648
1885
  allowPartialSourceList?: undefined;
1886
+ includeRawImportResult?: undefined;
1649
1887
  selections?: undefined;
1650
1888
  selectionMode?: undefined;
1651
1889
  };
@@ -1794,6 +2032,7 @@ export declare const allTools: ({
1794
2032
  jobId?: undefined;
1795
2033
  reviewBatchLimit?: undefined;
1796
2034
  allowPartialSourceList?: undefined;
2035
+ includeRawImportResult?: undefined;
1797
2036
  selections?: undefined;
1798
2037
  selectionMode?: undefined;
1799
2038
  };
@@ -1884,6 +2123,7 @@ export declare const allTools: ({
1884
2123
  jobId?: undefined;
1885
2124
  reviewBatchLimit?: undefined;
1886
2125
  allowPartialSourceList?: undefined;
2126
+ includeRawImportResult?: undefined;
1887
2127
  selections?: undefined;
1888
2128
  selectionMode?: undefined;
1889
2129
  };
@@ -1983,6 +2223,7 @@ export declare const allTools: ({
1983
2223
  jobId?: undefined;
1984
2224
  reviewBatchLimit?: undefined;
1985
2225
  allowPartialSourceList?: undefined;
2226
+ includeRawImportResult?: undefined;
1986
2227
  selections?: undefined;
1987
2228
  selectionMode?: undefined;
1988
2229
  };
@@ -2064,6 +2305,7 @@ export declare const allTools: ({
2064
2305
  jobId?: undefined;
2065
2306
  reviewBatchLimit?: undefined;
2066
2307
  allowPartialSourceList?: undefined;
2308
+ includeRawImportResult?: undefined;
2067
2309
  selections?: undefined;
2068
2310
  selectionMode?: undefined;
2069
2311
  };
@@ -2684,6 +2926,7 @@ export declare const allTools: ({
2684
2926
  jobId?: undefined;
2685
2927
  reviewBatchLimit?: undefined;
2686
2928
  allowPartialSourceList?: undefined;
2929
+ includeRawImportResult?: undefined;
2687
2930
  selections?: undefined;
2688
2931
  selectionMode?: undefined;
2689
2932
  };
@@ -2817,6 +3060,7 @@ export declare const allTools: ({
2817
3060
  jobId?: undefined;
2818
3061
  reviewBatchLimit?: undefined;
2819
3062
  allowPartialSourceList?: undefined;
3063
+ includeRawImportResult?: undefined;
2820
3064
  selections?: undefined;
2821
3065
  selectionMode?: undefined;
2822
3066
  };
@@ -2938,6 +3182,7 @@ export declare const allTools: ({
2938
3182
  jobId?: undefined;
2939
3183
  reviewBatchLimit?: undefined;
2940
3184
  allowPartialSourceList?: undefined;
3185
+ includeRawImportResult?: undefined;
2941
3186
  selections?: undefined;
2942
3187
  selectionMode?: undefined;
2943
3188
  };
@@ -3017,6 +3262,7 @@ export declare const allTools: ({
3017
3262
  jobId?: undefined;
3018
3263
  reviewBatchLimit?: undefined;
3019
3264
  allowPartialSourceList?: undefined;
3265
+ includeRawImportResult?: undefined;
3020
3266
  selections?: undefined;
3021
3267
  selectionMode?: undefined;
3022
3268
  };
@@ -3068,6 +3314,10 @@ export declare const allTools: ({
3068
3314
  type: string;
3069
3315
  description: string;
3070
3316
  };
3317
+ includeRawImportResult: {
3318
+ type: string;
3319
+ description: string;
3320
+ };
3071
3321
  provider?: undefined;
3072
3322
  searchMode?: undefined;
3073
3323
  organization_num_employees_ranges?: undefined;
@@ -3230,6 +3480,7 @@ export declare const allTools: ({
3230
3480
  jobId?: undefined;
3231
3481
  reviewBatchLimit?: undefined;
3232
3482
  allowPartialSourceList?: undefined;
3483
+ includeRawImportResult?: undefined;
3233
3484
  };
3234
3485
  required: string[];
3235
3486
  };
@@ -3311,6 +3562,7 @@ export declare const allTools: ({
3311
3562
  jobId?: undefined;
3312
3563
  reviewBatchLimit?: undefined;
3313
3564
  allowPartialSourceList?: undefined;
3565
+ includeRawImportResult?: undefined;
3314
3566
  selections?: undefined;
3315
3567
  selectionMode?: undefined;
3316
3568
  };
@@ -2,6 +2,7 @@ import { authToolDefinitions } from "./auth.js";
2
2
  import { blueprintCommitToolDefinitions } from "./blueprint-commit.js";
3
3
  import { bootstrapToolDefinitions } from "./bootstrap.js";
4
4
  import { campaignToolDefinitions } from "./campaigns.js";
5
+ import { campaignProcessingToolDefinitions } from "./campaign-processing.js";
5
6
  import { cellToolDefinitions } from "./cells.js";
6
7
  import { startCliLoginToolDef, waitForCliLoginToolDef } from "./cli-login.js";
7
8
  import { contextToolDefinitions } from "./context.js";
@@ -28,6 +29,7 @@ import { verifyRowToolDefinitions } from "./verify-row.js";
28
29
  import { workspaceToolDefinitions } from "./workspaces.js";
29
30
  export const allTools = [
30
31
  ...campaignToolDefinitions,
32
+ ...campaignProcessingToolDefinitions,
31
33
  ...authToolDefinitions,
32
34
  startCliLoginToolDef,
33
35
  waitForCliLoginToolDef,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.189",
3
+ "version": "0.1.190",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -36,7 +36,11 @@ allowed-tools:
36
36
  - mcp__sellable__check_rubric
37
37
  - mcp__sellable__create_campaign
38
38
  - mcp__sellable__save_rubrics
39
- - mcp__sellable__wait_for_rubric_results
39
+ - mcp__sellable__get_campaign_table_schema
40
+ - mcp__sellable__select_campaign_cells
41
+ - mcp__sellable__queue_campaign_cells
42
+ - mcp__sellable__wait_for_campaign_processing
43
+ - mcp__sellable__revise_message_template_and_rerun
40
44
  - mcp__sellable__update_campaign_brief
41
45
  - mcp__sellable__update_campaign
42
46
  - mcp__sellable__get_campaign
@@ -52,7 +56,6 @@ allowed-tools:
52
56
  - mcp__sellable__get_table_rows
53
57
  - mcp__sellable__load_csv_linkedin_leads
54
58
  - mcp__sellable__load_csv_domains
55
- - mcp__sellable__queue_cells
56
59
  - mcp__sellable__get_campaign_messages_preview
57
60
  - mcp__sellable__attach_sequence
58
61
  - mcp__sellable__attach_recommended_sequence
@@ -132,9 +135,10 @@ label it explicitly as not estimated from this run.
132
135
  Before any provider prompt, search, source scout, or signal-discovery call, show
133
136
  one source-plan gate and ask for approval. Write this like a fifth grader could
134
137
  understand it: short sentences, no internal labels, and no GTM shorthand. The
135
- plan must be visible before the question, and this first approval only
136
- authorizes finding the best places to look for buyers. It does not add anyone
137
- to the campaign yet. The gate should say:
138
+ order is strict: first show the plan in chat, then open the approval question.
139
+ Do not open a generic approval first and reuse it after the plan. This first
140
+ approval only authorizes finding the best places to look for buyers. It does
141
+ not add anyone to the campaign yet. The gate should say:
138
142
 
139
143
  - the buyer groups or places we could check
140
144
  - the best place to start
@@ -183,9 +187,11 @@ instead and explain it in plain words once. Do not call `search_signals`,
183
187
  `fetch_post_engagers`, or provider-scoped subagents until the user approves this
184
188
  source plan or explicitly chooses a different source.
185
189
 
186
- If the user already answered a provider approval such as "Approve Prospeo plan",
187
- that answer satisfies the source-plan gate. Persist the approved provider and
188
- run the scouting/search next; do not ask a second source-plan approval question.
190
+ If the user answers a provider approval such as "Approve Prospeo plan" after
191
+ seeing the source plan, that answer satisfies the source-plan gate. Persist the
192
+ approved provider and run the scouting/search next; do not ask a second
193
+ source-plan approval question. A brief approval, generic "approve plan", or
194
+ provider state from before the visible source plan does not satisfy this gate.
189
195
 
190
196
  For hiring-led campaigns, do not default to Sales Nav just because the target is
191
197
  a role search. Prospeo is the primary lane when the brief asks for companies
@@ -748,10 +754,9 @@ updates.
748
754
  asset loader so they share the same config.
749
755
  3. Follow that prompt and workflow config exactly.
750
756
  4. For message generation, use the `post-find-leads-message-scout` agent when
751
- available. The worker and parent-thread fallback must load the full
752
- long-form `generate-messages` prompt with
753
- `mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages", offset, limit })`
754
- until `hasMore=false`. Message review requires Message Draft Builder output:
757
+ available. The worker and parent-thread fallback must load
758
+ `mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages-compact" })`.
759
+ Load lazy examples/critique/revision references only when needed. Message review requires Message Draft Builder output:
755
760
  do not draft from a checklist, local markdown artifact, or parent-thread
756
761
  intuition. Use campaign state, campaign brief content, selected source state, and
757
762
  initial campaign-table execution slice rows as the source of truth; do not read stale local
@@ -187,10 +187,10 @@ when not hiring-led. For hiring-by-role signals, start with Prospeo because
187
187
  `company_job_posting_quantity`; Sales Nav does not provide hiring-by-role filters.
188
188
 
189
189
  Before any provider prompt/search/scout call, move the watched campaign to
190
- provider/source selection, then show one `## Find Buyers Plan` before
191
- `request_user_input`, without repeating the watch URL. The plan must appear in
192
- chat before the question. This approval only authorizes finding where to look.
193
- It does not add anyone yet. Write:
190
+ source selection, show `## Find Buyers Plan`, then open
191
+ `request_user_input`, without repeating the URL. The plan must appear
192
+ before the question. Never ask first and reuse that approval. This only
193
+ authorizes where to look; it does not add anyone yet. Write:
194
194
 
195
195
  - the buyer groups or places we could check
196
196
  - the best place to start
@@ -211,12 +211,12 @@ specific. If LinkedIn engagement is recommended, name the exact post themes in
211
211
  plain language. Avoid using
212
212
  "Signal Discovery", "lead-source scouting", "source scouting", "lane", "provider",
213
213
  "precision/scale tradeoff", "evidence quality", "pilot volume", "workflow
214
- pain", or "ICP" in customer-facing chat; those are internal labels. If the
214
+ pain", or "ICP" in chat; those are internal labels. If the
215
215
  campaign looks unlikely
216
- to have relevant public conversations, recommend the specific Sales Nav or
217
- Prospeo path instead and explain it in plain words once. An approval like
218
- "Approve Prospeo plan" satisfies this gate; save that approved path and search
219
- next. Do not ask a second source-plan question. Do not call `search_signals`,
216
+ to have public conversations, recommend the specific Sales Nav or
217
+ Prospeo path instead and explain it in plain words once. Only the approval
218
+ question shown after that visible plan, or an explicit source choice made after
219
+ seeing it, satisfies this gate. Do not ask a second source-plan question. Do not call `search_signals`,
220
220
  `search_sales_nav`,
221
221
  `search_prospeo`,
222
222
  `fetch_post_engagers`, or provider-scoped subagents until the user approves this
@@ -284,9 +284,9 @@ customer-facing source-choice labels.
284
284
 
285
285
  ## Post-Lead Workstreams
286
286
 
287
- After `confirm_lead_list` copies a non-empty confirmed source into the campaign and
288
- `get_rows_minimal({ tableId: workflowTableId })` proves rows exist, ask the
289
- filter-choice question immediately. Do not call
287
+ After `confirm_lead_list` copies a non-empty confirmed source into the campaign
288
+ and records the compact review batch, ask the filter-choice question
289
+ immediately. Do not call
290
290
  `get_post_find_leads_scout_registry`, load filter/message subskill prompts, or
291
291
  spawn post-lead workers before that question. The only customer-facing work
292
292
  before the question should be a short campaign setup summary and the choice:
@@ -316,14 +316,13 @@ Run `post-find-leads-message-scout` as the background Message Draft Builder
316
316
  whenever the host exposes it. It must load:
317
317
 
318
318
  ```text
319
- get_subskill_prompt({ subskillName: "generate-messages", offset, limit }) until hasMore=false
319
+ get_subskill_prompt({ subskillName: "generate-messages-compact" })
320
320
  ```
321
321
 
322
- No shortcut message instructions are valid. If the host cannot launch the
323
- agent, the parent fallback must run the same full prompt from live campaign
324
- state before drafting. Do not render message review until
325
- `messageDraftRecommendation` proves current campaign/table/execution-slice
326
- `generate-messages` basis.
322
+ Load `generate-messages-compact/references/examples-critique-revision.md` only
323
+ for critique/revision. If the host cannot launch the agent, the parent fallback
324
+ must run the same compact prompt from live campaign state. Do not render message
325
+ review until `messageDraftRecommendation` proves current campaign/table basis.
327
326
 
328
327
  ## Hard Gates
329
328
 
@@ -243,8 +243,9 @@ call, move the watched campaign to the provider/source page, then give the user
243
243
  a compact source plan in grade-5 language: "here are the places we could look, I
244
244
  recommend starting here, here is why, and here is where I'll look next if this
245
245
  is too thin." The order matters: show the plan in normal chat first, then open
246
- the approval question. Do not reprint the watch link during source/provider
247
- selection. Ask them to approve that plan or choose a different source. Use plain
246
+ the approval question. Do not reuse a brief approval, a generic "approve plan",
247
+ or provider state from before the user saw the plan. Do not reprint the watch
248
+ link during source/provider selection. Ask them to approve that plan or choose a different source. Use plain
248
249
  customer language for the boundary: "This only approves me to look for the best
249
250
  places to find buyers. I won't add anyone yet." After brief approval, say
250
251
  "Brief approved. Next, we'll choose where to find buyers. I won't add anyone
@@ -302,8 +303,8 @@ surface install status to the customer.
302
303
 
303
304
  For post-lead work, call `get_post_find_leads_scout_registry` after
304
305
  the user chooses filters, not before the filter-choice question. After
305
- `confirm_lead_list` copies source rows and `get_rows_minimal` proves the first
306
- review/process sample exists, ask add-filters vs skip-filters
306
+ `confirm_lead_list` copies source rows and records the first review/process
307
+ sample, ask add-filters vs skip-filters
307
308
  immediately. Once the user answers, start `post-find-leads-message-scout` /
308
309
  message generation from the same campaign/table basis. If the user chooses
309
310
  filters, also start `post-find-leads-filter-scout`, move the browser to Filter
@@ -353,6 +354,12 @@ At the brief approval gate, do not add a negative list of future steps that are
353
354
  not approved. Ask approve/revise in plain language, then move to choosing where
354
355
  to find buyers.
355
356
 
357
+ At message review, if the user asks for edits, write the revised template and
358
+ examples before asking approval again. Do not ask whether an unseen revision is
359
+ better. Save to the campaign only after `approve-message`.
360
+ During message generation or revision, do not call `request_user_input` or
361
+ `AskUserQuestion`; render the revised copy first, then enter message review.
362
+
356
363
  ## What To Avoid
357
364
 
358
365
  - Do not mention MCP namespaces, prompt chunking, plugin cache paths, local skill