@sellable/mcp 0.1.206 → 0.1.208
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -27
- package/agents/post-find-leads-message-scout.md +56 -17
- package/dist/tools/prompts.d.ts +1 -1
- package/dist/tools/prompts.js +21 -17
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +47 -53
- package/skills/create-campaign-v2/SKILL.md +93 -96
- package/skills/create-campaign-v2/SOUL.md +34 -32
- package/skills/create-campaign-v2/core/flow.v2.json +1 -1
- package/skills/create-campaign-v2-tail/SKILL.md +1 -1
|
@@ -21,34 +21,26 @@ validate-sample tool:
|
|
|
21
21
|
get_subskill_prompt({ subskillName: "create-campaign-v2-tail" })
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
CampaignOffer state and the watch link are canonical. Resume, gating, and
|
|
25
|
-
read campaign state first: `campaignId`, `watchUrl`, `campaignBrief`,
|
|
26
|
-
`currentStep`, source/search
|
|
27
|
-
`
|
|
28
|
-
`
|
|
29
|
-
debug-only; do not create, link, or surface them in normal runs.
|
|
24
|
+
CampaignOffer state and the watch link are canonical. Resume, gating, and
|
|
25
|
+
handoff read campaign state first: `campaignId`, `watchUrl`, `campaignBrief`,
|
|
26
|
+
`currentStep`, source/search IDs, `selectedLeadListId`, `workflowTableId`,
|
|
27
|
+
`leadScoringRubrics`, `approvedMessageTemplate`, `senderIds`,
|
|
28
|
+
`sequenceTemplate`, and running state. Local draft files are debug-only.
|
|
30
29
|
|
|
31
30
|
## Normal Flow
|
|
32
31
|
|
|
33
|
-
There is no normal approval-packet.
|
|
34
|
-
Legacy commit-gate/atomic-mint is only in create-campaign-v2-validation.
|
|
35
|
-
|
|
36
32
|
1. Bootstrap and tell the user the active Sellable workspace.
|
|
37
33
|
2. Resolve the client/company before strategy questions.
|
|
38
34
|
3. Research the client/company and current offer enough to draft a concrete brief.
|
|
39
35
|
4. Create the watchable campaign shell with `create_campaign` and the v1 brief.
|
|
40
36
|
5. Surface the direct watch link once before brief approval.
|
|
41
37
|
6. Approve the Find Buyers Plan, then approve Start Import.
|
|
42
|
-
7. Materialize the
|
|
43
|
-
filter/message setup; do not present that as source sampling.
|
|
38
|
+
7. Materialize the source list and confirm 15 campaign-table rows for setup.
|
|
44
39
|
8. Ask whether to use filters or skip them.
|
|
45
|
-
9. Persist
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
12. Sync the approved template into the brief, then queue bounded filtering.
|
|
50
|
-
13. After one row passes with a generated message, review it, then hand off to
|
|
51
|
-
Settings, sender, sequence, and launch.
|
|
40
|
+
9. Persist rubrics, approve saved criteria, then move to Filter Leads.
|
|
41
|
+
10. Review and approve/revise the message template.
|
|
42
|
+
11. Sync the approved template into the brief, then queue bounded filtering.
|
|
43
|
+
12. After one generated pass, review it, then hand off to Settings and launch.
|
|
52
44
|
|
|
53
45
|
## Identity-First Campaign Setup
|
|
54
46
|
|
|
@@ -68,12 +60,10 @@ messages, and wait for final launch approval.
|
|
|
68
60
|
What's your LinkedIn profile URL or handle?
|
|
69
61
|
```
|
|
70
62
|
|
|
71
|
-
Require a LinkedIn profile URL
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
`
|
|
75
|
-
lightweight profile lookup before strategy questions, then invite
|
|
76
|
-
corrections.
|
|
63
|
+
Require a LinkedIn profile URL/handle before setup continues. Normalize
|
|
64
|
+
handles like `@csreyes92` to `https://www.linkedin.com/in/{handle}/`; otherwise
|
|
65
|
+
ask again. Retain it as `senderLinkedinUrl` or resolve `clientProspectId` for
|
|
66
|
+
`create_campaign`. Run one lightweight profile lookup before strategy questions.
|
|
77
67
|
|
|
78
68
|
Restore the full setup intake before the brief. Ask bounded choices for:
|
|
79
69
|
|
|
@@ -84,22 +74,21 @@ Restore the full setup intake before the brief. Ask bounded choices for:
|
|
|
84
74
|
- prospect source: "How should we find prospects?" with "Find prospects for me",
|
|
85
75
|
"Use a CSV of LinkedIn profiles", and "Use a CSV of company domains"
|
|
86
76
|
|
|
87
|
-
If setup choices were supplied and questions skipped,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
recommendation; you can replace it with your current offer."
|
|
77
|
+
If setup choices were supplied and questions skipped, state before the brief
|
|
78
|
+
that the LinkedIn input was normalized and the offer path came from supplied or
|
|
79
|
+
researched direction.
|
|
91
80
|
|
|
92
|
-
Do not call `list_senders`, infer
|
|
93
|
-
|
|
94
|
-
|
|
81
|
+
Do not call `list_senders`, infer from connected senders, or show a sender
|
|
82
|
+
picker during setup. Sender availability belongs only to Settings after message
|
|
83
|
+
approval and campaign setup validation.
|
|
95
84
|
|
|
96
85
|
Use `research-sender`, call `complete_sender_research` before shell creation,
|
|
97
86
|
and carry proof gaps into the brief.
|
|
98
87
|
|
|
99
88
|
## Brief Provenance
|
|
100
89
|
|
|
101
|
-
When rendering the first brief, do not add bracketed inline source tags
|
|
102
|
-
|
|
90
|
+
When rendering the first brief, do not add bracketed inline source tags. Start
|
|
91
|
+
with one short provenance line:
|
|
103
92
|
|
|
104
93
|
```text
|
|
105
94
|
This brief is based on Sellable's research and your answers.
|
|
@@ -120,9 +109,9 @@ keep it as non-final bullets and say: "This is not the message yet; I will write
|
|
|
120
109
|
real examples after we find and filter leads."
|
|
121
110
|
|
|
122
111
|
Keep brief approval positive: no "does not approve..." list. The first brief
|
|
123
|
-
must be visible exactly once before
|
|
124
|
-
|
|
125
|
-
|
|
112
|
+
must be visible exactly once before approval. If rendered before
|
|
113
|
+
`create_campaign`, do not render it again after shell creation; append the one
|
|
114
|
+
watch-link handoff, then ask approve/revise.
|
|
126
115
|
|
|
127
116
|
## YOLO Mode
|
|
128
117
|
|
|
@@ -155,8 +144,8 @@ when a bounded choice needs an escape hatch.
|
|
|
155
144
|
## Watch Link And Narration
|
|
156
145
|
|
|
157
146
|
Create the shell before lead import so the user can watch. When
|
|
158
|
-
`create_campaign` returns `watchUrl`, print that exact value once
|
|
159
|
-
|
|
147
|
+
`create_campaign` returns `watchUrl`, print that exact value once before brief
|
|
148
|
+
approval. It must be a direct
|
|
160
149
|
`/campaign-builder/{campaignId}?mode={claude|codex}` URL with `workspaceId` and
|
|
161
150
|
`token`; never derive, shorten, reconstruct, or print a bare campaign URL. If
|
|
162
151
|
missing/broken, recover with `create_campaign({ campaignId })` or `get_campaign`
|
|
@@ -189,9 +178,8 @@ when not hiring-led. For hiring-by-role signals, start with Prospeo because
|
|
|
189
178
|
|
|
190
179
|
Before any provider prompt/search/scout call, move the watched campaign to
|
|
191
180
|
source selection, show `## Find Buyers Plan`, then open `request_user_input`
|
|
192
|
-
without repeating the URL. The plan must appear before the question
|
|
193
|
-
|
|
194
|
-
add anyone yet. Write:
|
|
181
|
+
without repeating the URL. The plan must appear before the question and only
|
|
182
|
+
authorizes where to look; it does not add anyone yet. Write:
|
|
195
183
|
|
|
196
184
|
- the buyer groups or places we could check
|
|
197
185
|
- the best place to start
|
|
@@ -207,28 +195,24 @@ scouting", or "not importing leads" in customer-facing copy.
|
|
|
207
195
|
Terms: buyers=market; people to check=raw reactions/comments; prospects=likely
|
|
208
196
|
after fit; leads=rows.
|
|
209
197
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
"
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
`search_sales_nav`, `search_prospeo`, `fetch_post_engagers`, or provider
|
|
219
|
-
subagents until approved.
|
|
198
|
+
Make the recommendation campaign-specific. If LinkedIn engagement is
|
|
199
|
+
recommended, name exact post themes in plain language. Avoid chat terms "Signal
|
|
200
|
+
Discovery", "lead-source scouting", "source scouting", "lane", "provider",
|
|
201
|
+
"precision/scale tradeoff", "evidence quality", "pilot volume", "workflow
|
|
202
|
+
pain", or "ICP". Only the approval question after that visible plan, or an
|
|
203
|
+
explicit post-plan source choice, satisfies this gate. Do not ask a second
|
|
204
|
+
source-plan question or call `search_signals`, `search_sales_nav`,
|
|
205
|
+
`search_prospeo`, `fetch_post_engagers`, or provider subagents until approved.
|
|
220
206
|
Only then persist `leadSourceType`, `leadSourceProvider`, and provider `currentStep`.
|
|
221
207
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
Use a 10% planning floor after
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if it also falls below 10%, tighten the ICP/source direction instead of
|
|
231
|
-
inventing another provider.
|
|
208
|
+
Source work stays inline in the parent thread in normal create-campaign runs.
|
|
209
|
+
Do not launch source-scout background agents. Run the approved provider probes
|
|
210
|
+
with MCP tools, loading only the provider prompt for the active sequential
|
|
211
|
+
source. Use source scouts only if the user explicitly asks for a source
|
|
212
|
+
comparison/debug run.
|
|
213
|
+
Use a 10% planning floor after cleanup. If LinkedIn engagement falls below it,
|
|
214
|
+
move to Sales Nav, then Prospeo. If Prospeo also falls below 10%, tighten the
|
|
215
|
+
ICP/source direction instead of inventing another provider.
|
|
232
216
|
|
|
233
217
|
After scouting, show a second approval gate for Start Import.
|
|
234
218
|
For LinkedIn engagement (`signal-discovery` internally), use plain language:
|
|
@@ -241,13 +225,11 @@ Prospeo, name the specific search/import path and source lead count. Do not call
|
|
|
241
225
|
`import_leads` or `confirm_lead_list` until this gate is approved.
|
|
242
226
|
|
|
243
227
|
For Sales Nav and Prospeo, do not ask to import only the internal 15-row
|
|
244
|
-
campaign-table execution slice at
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
`
|
|
248
|
-
|
|
249
|
-
confirmed source rows into the campaign table and returns the initial
|
|
250
|
-
campaign-table execution slice row ids for filter and message setup.
|
|
228
|
+
campaign-table execution slice at Start Import. First-page samples are source
|
|
229
|
+
math. Once the path clears, ask approval for a source list with
|
|
230
|
+
`targetLeadCount` around 1,000 contacts by default. Then
|
|
231
|
+
`confirm_lead_list({ reviewBatchLimit: 15 })` copies rows into the campaign
|
|
232
|
+
table and returns execution-slice row ids for filter/message setup.
|
|
251
233
|
|
|
252
234
|
After the user approves this Start Import gate, do not show the
|
|
253
235
|
Source Recommendation again or ask another Start Import question.
|
|
@@ -265,15 +247,13 @@ For LinkedIn engagement, the Start Import approval uses `## Source
|
|
|
265
247
|
Recommendation`, plain language, selected posts, people to check, likely
|
|
266
248
|
prospects, cleanup risk, fallback, and the first 15-lead review.
|
|
267
249
|
|
|
268
|
-
A source recommendation must show
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
refine or broaden filters, not to run the internal campaign-table execution slice
|
|
276
|
-
as if it were source sampling.
|
|
250
|
+
A source recommendation must show source path, filters/recipe, raw volume,
|
|
251
|
+
sample size, sampled fits as n/N plus percentage/range, estimated usable
|
|
252
|
+
prospects, cleanup risk, runner-up, and post-approval action. Sales
|
|
253
|
+
Nav/Prospeo also show `rawResultCount`, `sampledFitRate`, conservative
|
|
254
|
+
projected fit rate, `targetLeadCount` for the source list, and projected
|
|
255
|
+
good-fit count from that export. If below target, refine/broaden filters, not
|
|
256
|
+
run the internal campaign-table execution slice as if it were source sampling.
|
|
277
257
|
|
|
278
258
|
Supplied profile CSVs, company/domain CSVs, pasted domains, and existing
|
|
279
259
|
Sellable lead lists are supported, but keep provider mechanics out of the first
|
|
@@ -281,40 +261,57 @@ customer-facing source-choice labels.
|
|
|
281
261
|
|
|
282
262
|
## Prospect Setup Workstreams
|
|
283
263
|
|
|
284
|
-
After `confirm_lead_list` copies a non-empty
|
|
285
|
-
|
|
286
|
-
|
|
264
|
+
After `confirm_lead_list` copies a non-empty source into the campaign and
|
|
265
|
+
records the compact review batch, ask the filter-choice question immediately.
|
|
266
|
+
Do not call
|
|
287
267
|
`get_post_find_leads_scout_registry`, load filter/message subskill prompts, or
|
|
288
|
-
spawn
|
|
289
|
-
before the question should be a short
|
|
268
|
+
spawn Message Drafting before that question. The only
|
|
269
|
+
customer-facing work before the question should be a short setup summary and the choice:
|
|
290
270
|
add filters, skip filters, or revise source. Do not include another watch link
|
|
291
271
|
in this summary; the existing app view updates through campaign state.
|
|
292
272
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
273
|
+
Once filter choice is known, start only Message Drafting in the background from
|
|
274
|
+
the same campaign/table basis. If the user chooses filters, the parent thread
|
|
275
|
+
continues inline: move to Filter Rules, load the filter reference, draft/save
|
|
276
|
+
rubrics, and ask for filter approval while Message Drafting runs. If filters are
|
|
277
|
+
skipped, move the watched app to Messages and run Message Drafting there. Debug
|
|
278
|
+
markdown/json artifacts are optional only.
|
|
279
|
+
|
|
280
|
+
Keep the Message Drafting handoff compact: campaign identity/name,
|
|
281
|
+
`selectedLeadListId`, `workflowTableId`, copied-row count, review-batch
|
|
282
|
+
count/hash, filter choice, source summary, and a concise brief summary. Do not
|
|
283
|
+
paste the full row ID list or row data. The branch loads the current brief,
|
|
284
|
+
table state, and review rows through Sellable tools before drafting.
|
|
298
285
|
|
|
299
286
|
When the user chooses filters, immediately call
|
|
300
287
|
`update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
301
288
|
before rubric thinking or branch work. After `save_rubrics`, keep Filter Rules
|
|
302
289
|
visible so the user can approve saved criteria. Only after approval should
|
|
303
290
|
`update_campaign` move to `apply-icp-rubric` / Filter Leads and show
|
|
304
|
-
`Filters saved + waiting for message approval` until the template is approved.
|
|
305
|
-
queue enrichment/filtering/Generate Message cells until message
|
|
306
|
-
the user Message Drafting is preparing the template in the
|
|
291
|
+
`Filters saved + waiting for message approval` until the template is approved.
|
|
292
|
+
Do not queue enrichment/filtering/Generate Message cells until message
|
|
293
|
+
approval. Tell the user Message Drafting is preparing the template in the
|
|
294
|
+
background.
|
|
307
295
|
|
|
308
|
-
|
|
309
|
-
are enabled.
|
|
310
|
-
`lead-sample.json`.
|
|
296
|
+
The parent thread persists production rubrics with `save_rubrics` when filters
|
|
297
|
+
are enabled. Do not spawn Prospect Filters in normal create-campaign runs.
|
|
311
298
|
|
|
312
299
|
Run compatibility agent `post-find-leads-message-scout` as Message Drafting
|
|
313
300
|
when allowed. Keep the long prompt and refs there.
|
|
314
301
|
|
|
315
|
-
Codex: YOLO counts as
|
|
316
|
-
after filter choice. Use generic `gpt-5.5` / `xhigh`
|
|
317
|
-
parent silently.
|
|
302
|
+
Codex: YOLO counts as permission for the single Message Drafting bg-agent. If no
|
|
303
|
+
permission, ask once after filter choice. Use generic `gpt-5.5` / `xhigh`
|
|
304
|
+
Message Drafting if needed. Never draft in parent silently.
|
|
305
|
+
|
|
306
|
+
If the user critiques or edits the template before `approve-message`, route the
|
|
307
|
+
feedback back to Message Drafting with current `messageDraftRecommendation`,
|
|
308
|
+
basis token, campaign/table basis, and latest user text. Do not rewrite copy in
|
|
309
|
+
the parent or call `update_campaign_brief`. Message Drafting must load/use
|
|
310
|
+
`generate-messages` and return a revised `messageDraftRecommendation`; parent
|
|
311
|
+
renders it and asks approval. Message QA and validation before approval also
|
|
312
|
+
belong to Message Drafting; the parent renders its QA receipt, not a fresh
|
|
313
|
+
parent-thread critique. The branch must load the normal validation/QA rules and
|
|
314
|
+
run a QA pass before returning its concise review-ready recommendation.
|
|
318
315
|
|
|
319
316
|
Load:
|
|
320
317
|
|
|
@@ -275,40 +275,31 @@ gate; tell the customer what happens next instead.
|
|
|
275
275
|
|
|
276
276
|
## Parallelism + Naming
|
|
277
277
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
with the right titles who recently posted on LinkedIn, then people with the
|
|
285
|
-
right titles from a broader LinkedIn search, then a broader company and contact
|
|
286
|
-
search.
|
|
278
|
+
After the Find Buyers Plan is approved, source selection stays in the parent
|
|
279
|
+
thread for normal create-campaign runs. Do not launch source scouts unless the
|
|
280
|
+
user explicitly asks for a source comparison/debug run. Only try a fallback after
|
|
281
|
+
the current place fails, the user asks for comparison, or the first place is
|
|
282
|
+
borderline. Keep fallback copy plain: people talking on LinkedIn, recent
|
|
283
|
+
LinkedIn titles, broader LinkedIn titles, then company/contact search.
|
|
287
284
|
Use a 10% planning floor after conservative cleanup. If LinkedIn engagement falls
|
|
288
285
|
below that floor, move to Sales Nav. If Sales Nav falls below that floor after
|
|
289
286
|
reasonable refinement, move to Prospeo. Prospeo is the terminal fallback; if it
|
|
290
287
|
also falls below 10%, tighten the ICP/source direction instead of inventing
|
|
291
288
|
another provider.
|
|
292
289
|
|
|
293
|
-
Source-angle comparison should be real, not implied.
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
source scouts in the same turn only when the user explicitly requested source
|
|
297
|
-
comparison, a prior lane failed, or the active flow marks the first lane as
|
|
298
|
-
borderline. The parent thread should not fetch every provider prompt first; each
|
|
299
|
-
scout loads only its matching provider prompt. If source work is sequential,
|
|
300
|
-
keep the output numeric but do not claim the source scout was parallel or
|
|
301
|
-
surface install status to the customer.
|
|
290
|
+
Source-angle comparison should be real, not implied. Normal source work uses MCP
|
|
291
|
+
provider tools inline from the parent and loads only the active provider prompt.
|
|
292
|
+
Do not claim a source scout ran and do not surface install status.
|
|
302
293
|
|
|
303
294
|
For prospect setup work, call `get_post_find_leads_scout_registry` after
|
|
304
295
|
the user chooses filters, not before the filter-choice question. After
|
|
305
296
|
`confirm_lead_list` copies source rows and records the first review/process
|
|
306
297
|
sample, ask add-filters vs skip-filters
|
|
307
298
|
immediately. Once the user answers, start Message Drafting via
|
|
308
|
-
`post-find-leads-message-scout` from the same campaign/table basis.
|
|
309
|
-
chooses filters,
|
|
310
|
-
|
|
311
|
-
then ask for filter approval. After approval, keep the
|
|
299
|
+
`post-find-leads-message-scout` from the same campaign/table basis. This is the
|
|
300
|
+
only normal background agent. If the user chooses filters, the parent thread
|
|
301
|
+
keeps working inline: move the browser to Filter Rules, load the filter
|
|
302
|
+
reference, save rubrics, then ask for filter approval. After approval, keep the
|
|
312
303
|
browser on Filter Leads and show `Filters saved + waiting for message approval`
|
|
313
304
|
while the message recommendation is reviewed. If the user skips filters, move
|
|
314
305
|
the browser to Messages/message review. The join gate is saved-filter approval or
|
|
@@ -316,21 +307,30 @@ a resolved skip-filter choice, plus a message recommendation grounded in the sam
|
|
|
316
307
|
campaign/table basis. Enrichment, filtering, and Generate Message cells wait for
|
|
317
308
|
template approval on the Use Template path.
|
|
318
309
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
310
|
+
Keep the Message Drafting handoff compact: campaign identity, campaign name,
|
|
311
|
+
selected lead list ID, workflow table ID, copied source row count, review-batch
|
|
312
|
+
row count, review-batch basis/hash, filter choice, source summary, and a concise
|
|
313
|
+
campaign brief summary. Do not paste the full review-batch row ID list or row
|
|
314
|
+
data into the spawn prompt. Message Drafting loads the current campaign brief,
|
|
315
|
+
campaign/table state, review rows, full generate-messages prompt, and
|
|
316
|
+
validation/QA rules inside its own branch before returning review-ready output.
|
|
317
|
+
|
|
318
|
+
Only promise background work for Message Drafting when it actually started. If
|
|
319
|
+
the host cannot or should not launch that branch, do not silently move the long
|
|
320
|
+
message prompt into the parent thread. In Codex, ask once for permission to use
|
|
321
|
+
background Message Drafting. If the user declines or asks to continue without
|
|
322
|
+
background agents, say the real sequence:
|
|
324
323
|
|
|
325
324
|
```text
|
|
326
325
|
I’ll tighten the filter first, then run message generation from the same sample.
|
|
327
326
|
```
|
|
328
327
|
|
|
329
|
-
Do not say `kicking off two workstreams`, `in parallel`, or `background`
|
|
330
|
-
|
|
328
|
+
Do not say `kicking off two workstreams`, `in parallel`, or `background` for
|
|
329
|
+
source or filter work. Only Message Drafting may be described as background.
|
|
331
330
|
|
|
332
331
|
Call the post-filter message stage `message generation` in chat.
|
|
333
|
-
Message validation is
|
|
332
|
+
Message validation/QA is owned by Message Drafting; the parent renders its
|
|
333
|
+
approval proof, not a fresh critique from memory.
|
|
334
334
|
|
|
335
335
|
Be explicit about what has and has not happened:
|
|
336
336
|
|
|
@@ -359,8 +359,10 @@ language. The YOLO option approves the brief, continues with best guesses, and
|
|
|
359
359
|
still stops before final launch.
|
|
360
360
|
|
|
361
361
|
At message review, if the user asks for edits, write the revised template and
|
|
362
|
-
examples before asking approval again.
|
|
363
|
-
|
|
362
|
+
examples before asking approval again. Route the feedback back to Message
|
|
363
|
+
Drafting with the current recommendation and basis; do not rewrite in the
|
|
364
|
+
parent and do not call `update_campaign_brief`. Do not ask whether an unseen
|
|
365
|
+
revision is better. Save to the campaign only after `approve-message`.
|
|
364
366
|
During message generation or revision, do not call `request_user_input` or
|
|
365
367
|
`AskUserQuestion`; render the revised copy first, then enter message review.
|
|
366
368
|
|