@sellable/install 0.1.104 → 0.1.106

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 CHANGED
@@ -61,11 +61,14 @@ Use the same public entrypoints in both hosts:
61
61
 
62
62
  - Claude Code: `/sellable:create-campaign`
63
63
  - Claude Code: `/sellable:interview`
64
+ - Claude Code: `/sellable:load-voice`
64
65
  - Codex: `$sellable:create-campaign`
65
66
  - Codex: `$sellable:interview`
67
+ - Codex: `$sellable:load-voice`
66
68
  - Codex Desktop plugin: `sellable@sellable`
67
69
  - Codex visible skill: `Sellable Create Campaign`
68
70
  - Codex visible skill: `Sellable Identity Interview`
71
+ - Codex visible skill: `Sellable Load Voice`
69
72
  - Internal MCP workflow prompt: `create-campaign-v2`
70
73
 
71
74
  Do not ask users to run `/sellable:create-campaign-v2`,
@@ -136,3 +136,47 @@ Return a concise status with:
136
136
  - one rendered omit/fallback sample
137
137
  - quality-gate pass/fail summary
138
138
  - whether final template review is ready or needs revision
139
+
140
+ When the parent will show the recommendation in chat, format the customer-facing
141
+ message review as Markdown with distinct copy blocks:
142
+
143
+ ````markdown
144
+ ## Message Template
145
+
146
+ **Subject**
147
+
148
+ ```text
149
+ {{tokenized_subject}}
150
+ ```
151
+
152
+ **Body**
153
+
154
+ ```text
155
+ {{tokenized_message_body}}
156
+ ```
157
+
158
+ ## Rendered Examples
159
+
160
+ ### Good token fill
161
+
162
+ ```text
163
+ Subject: ...
164
+
165
+ Hey First,
166
+
167
+ ...
168
+ ```
169
+
170
+ ### Good omit / fallback
171
+
172
+ ```text
173
+ Subject: ...
174
+
175
+ Hey First,
176
+
177
+ ...
178
+ ```
179
+ ````
180
+
181
+ Use a table for token rules. Keep explanations outside the fenced `text` blocks
182
+ so the user can quickly see exactly what copy is being approved.
@@ -168,7 +168,7 @@
168
168
  "optionalProducesArtifacts": [],
169
169
  "ownership": "lead quality, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
170
170
  "codex": {
171
- "description": "Lead Fit Builder for campaign-backed lead filtering and rubric persistence after source approval.",
171
+ "description": "Lead Fit Builder for campaign-backed lead filtering and rubric persistence after review-batch import and filter approval.",
172
172
  "model": "gpt-5.5",
173
173
  "modelReasoningEffort": "high",
174
174
  "sandboxMode": "read-only",
@@ -179,7 +179,7 @@
179
179
  ]
180
180
  },
181
181
  "claude": {
182
- "description": "Use proactively as Lead Fit Builder after lead source approval to persist campaign rubrics from campaign state.",
182
+ "description": "Use proactively as Lead Fit Builder after review-batch import and filter approval to persist campaign rubrics from campaign state.",
183
183
  "model": "inherit",
184
184
  "background": true,
185
185
  "maxTurns": 8,
@@ -51,7 +51,8 @@ currentStep: "signal-discovery" })` before sampling so the watched Signal
51
51
  visible headline/display-name cues only. Do not enrich people during
52
52
  viability estimation.
53
53
  7. Compute capacity before recommending the source: source target good-fit
54
- leads (default 300 unless the parent supplies a target), reachable engagers,
54
+ leads (default 150 for Signal Discovery unless the parent supplies a target),
55
+ reachable engagers,
55
56
  sampled ICP-fit rate as `n/N` plus an easy percentage/range, expected usable
56
57
  leads per 100 engagers before and after a conservative dedupe/cleanup
57
58
  factor, required engagers to scrape (`source target / fit rate`), average
@@ -93,8 +94,8 @@ Evidence standards:
93
94
  exist, how many sampled engagers looked in-ICP, how many good-fit prospects
94
95
  that implies per 100 engagers, how many usable prospects one right-content
95
96
  post should yield after cleanup, how many engagers must be scraped for the
96
- 300-good-fit source target, how many posts are needed for that source target,
97
+ 150-good-fit source target, how many posts are needed for that source target,
97
98
  and which posts you would use. Also say the first campaign import remains the
98
- bounded 15-row review batch.
99
+ bounded review batch.
99
100
  - If `fetch_post_engagers` is unavailable or fails, report that explicitly and mark the estimate lower-confidence.
100
101
  - Keep LinkedIn Engagement viable when selected posts can produce roughly 150+ ICP-fit warm prospects before final filtering, even if Sales Nav is more scalable.
@@ -27,7 +27,7 @@ Process:
27
27
  1. Read the campaign brief, source intake, kickoff doc, or lane prompt supplied by the parent.
28
28
  2. Identify whether this is domain/account targeting or broad persona expansion.
29
29
  3. For domain targeting, use or create the standalone `domainFilterId` before searching; never pass raw domains directly into `search_prospeo`.
30
- 4. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear.
30
+ 4. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear. Check scale against a default 300+ good-fit target, capped at 2,500 source candidates unless the parent supplies a different target.
31
31
  5. Call out that Prospeo gives contact/account coverage but usually weaker LinkedIn intent than LinkedIn Engagement or Sales Nav activity slices.
32
32
 
33
33
  Return a concise structured result with:
@@ -28,8 +28,9 @@ Process:
28
28
  2. Preserve target role names with `CURRENT_TITLE` lookups; do not rely on seniority alone when the brief names concrete roles.
29
29
  3. When `lookup_sales_nav_filter` returns multiple title options, choose the closest semantic title match instead of the first result.
30
30
  4. Build a broad-but-reasonable baseline from role/title, geography, company size, industry/account context, and recent LinkedIn activity when relevant.
31
- 5. Check scale against the source target good-fit lead count (default 300
32
- unless the parent supplies a target). If raw preview volume or projected usable volume
31
+ 5. Check scale against the source target good-fit lead count (default 300+
32
+ for Sales Nav, capped at 2,500 source candidates unless the parent supplies a target).
33
+ If raw preview volume or projected usable volume
33
34
  is below target, do not present the tiny result as the scale fallback yet.
34
35
  Loosen nonessential filters in order: remove recent-activity first, widen
35
36
  adjacent title variants, widen geography/company-size constraints, and only
@@ -40,7 +40,7 @@ function getMcpVersion() {
40
40
  } catch {}
41
41
  return "latest";
42
42
  }
43
- const CODEX_PLUGIN_VERSION = "0.1.32";
43
+ const CODEX_PLUGIN_VERSION = "0.1.33";
44
44
  const CODEX_PLUGIN_COMPAT_VERSIONS = [
45
45
  "0.1.8",
46
46
  "0.1.9",
@@ -166,9 +166,7 @@ Auth:
166
166
 
167
167
  function printCreateCommandHint() {
168
168
  printBanner();
169
- console.log(
170
- ` ${C.bold}Run Sellable from Claude Code or Codex.${C.reset}`
171
- );
169
+ console.log(` ${C.bold}Run Sellable from Claude Code or Codex.${C.reset}`);
172
170
  console.log("");
173
171
  console.log(
174
172
  ` ${C.grey}The terminal command installs and verifies Sellable. Campaign creation runs inside your agent session so the workflow can use MCP tools, live state, and approval gates.${C.reset}`
@@ -182,12 +180,14 @@ function printCreateCommandHint() {
182
180
  printAgentBox("Using Claude Code?", "claude", [
183
181
  { label: "Campaign", command: "/sellable:create-campaign" },
184
182
  { label: "Identity", command: "/sellable:interview" },
183
+ { label: "Voice", command: "/sellable:load-voice" },
185
184
  ]);
186
185
  console.log("");
187
186
  console.log("");
188
187
  printAgentBox("Using Codex?", "codex", [
189
188
  { label: "Campaign", command: "$sellable:create-campaign" },
190
189
  { label: "Identity", command: "$sellable:interview" },
190
+ { label: "Voice", command: "$sellable:load-voice" },
191
191
  ]);
192
192
  console.log("");
193
193
  console.log(` ${"─".repeat(63)}`);
@@ -630,8 +630,8 @@ clear business decisions, tradeoffs, and approval gates. Use product language:
630
630
  - "a couple setup choices", not \`request_user_input\`
631
631
  - "campaign brief", not prompt artifact
632
632
  - "lead source", not provider internals unless comparing source options
633
- - "I can create a draft shell for you to watch, but no leads import and nothing
634
- sends until you approve", not mutation jargon
633
+ - "I can create a draft shell for you to watch with approval gates before
634
+ sourcing", not mutation jargon
635
635
 
636
636
  When explaining lead-source decisions, show the concrete counts behind the
637
637
  logic: lanes searched, timeframe, raw result counts, finalist posts or preview
@@ -717,7 +717,7 @@ After every \`update_campaign({ campaignId, currentStep })\`, use
717
717
  \`get_campaign_navigation_state\` when available as a compact orientation check:
718
718
  match the saved campaign state to the expected watch-link step, explain the
719
719
  current state in one sentence, and only then continue. Sender selection belongs
720
- at Settings after message approval and 15-row validation. After message
720
+ at Settings after message approval and review-batch validation. After message
721
721
  validation, use Settings to help the user connect or select a LinkedIn sender.
722
722
  Explain Slack reply review before launch. After sender selection, attach the
723
723
  recommended sequence and move the watched UI to Send. Do not start the campaign
@@ -822,7 +822,7 @@ the brief. This is only the client-prospect/bootstrap identity for
822
822
  Do not call \`mcp__sellable__list_senders\`, \`mcp__sellable__get_sender\`, or
823
823
  surface connected/missing sender state during setup, brief, source, filter, or
824
824
  message review. Sender availability belongs only to the Settings/final launch
825
- handoff after message approval and the 10-lead validation sample.
825
+ handoff after message approval and the review-batch validation sample.
826
826
 
827
827
  If the invocation or user answer includes an existing \`clientProspectId\`, keep
828
828
  it as the preferred \`create_campaign\` identity input. If it includes a LinkedIn
@@ -959,9 +959,9 @@ updates.
959
959
  until \`hasMore=false\`. The create-campaign message-review safety gate is a
960
960
  supplemental approval checklist, not a replacement for the long prompt. Use
961
961
  campaign state, campaign brief content, selected source state, and imported
962
- review-batch rows as the source of truth; do not read stale local markdown,
963
- inspect the database directly, or synthesize local validation artifacts from
964
- general knowledge.
962
+ review-batch rows as the source of truth; do not read stale local markdown
963
+ such as \`message-validation.md\`, inspect the database directly, or synthesize
964
+ local validation artifacts from general knowledge.
965
965
  5. Create the campaign shell early with the v1 brief so the user can open the
966
966
  watch link and see useful setup state immediately. Import only the first
967
967
  bounded review batch after the source is attached to the campaign; do not
@@ -979,7 +979,7 @@ updates.
979
979
  path before that template/token approval. AI Generated uses the
980
980
  product's AI-generated path and cancels or ignores the background template
981
981
  draft.
982
- 6. The main thread owns watch navigation: use \`filter-choice\` after the 15-row
982
+ 6. The main thread owns watch navigation: use \`filter-choice\` after the review
983
983
  review batch, \`create-icp-rubric\` as soon as filters are approved,
984
984
  \`apply-icp-rubric\` after rubrics save, \`messages\` for the Use Template / AI Generated mode choice,
985
985
  \`auto-execute-messaging\` for approved message work or the product's
@@ -1089,6 +1089,55 @@ then retry \`get_subskill_prompt\`.
1089
1089
  `;
1090
1090
  }
1091
1091
 
1092
+ function loadVoiceSkillMd() {
1093
+ return `---
1094
+ name: load-voice
1095
+ description: Load Sellable voice/company memory for answering questions, writing posts, applications, replies, and reviews in the user's voice.
1096
+ allowed-tools:
1097
+ - mcp__sellable__get_subskill_prompt
1098
+ - mcp__sellable__search_subskill_prompts
1099
+ - Read
1100
+ - Glob
1101
+ - Grep
1102
+ ---
1103
+
1104
+ # Sellable Load Voice
1105
+
1106
+ Use this as the customer-facing entrypoint for loading Sellable voice/company
1107
+ memory before drafting, answering, rewriting, reviewing, or calibrating copy in
1108
+ the user's voice.
1109
+
1110
+ ## Bootstrap
1111
+
1112
+ MCP prompt access and local read tools are required. Do not run shell commands,
1113
+ use \`npm\`, \`node\`, local harness scripts, or read local prompt files to
1114
+ emulate this workflow.
1115
+
1116
+ If the Sellable MCP prompt tools are unavailable, stop and say this is a Codex
1117
+ install/reload problem. Tell the user to run
1118
+ \`npx -y ${INSTALL_PACKAGE_SPEC} --host all\`, fully quit and reopen Codex
1119
+ Desktop, then start a new thread.
1120
+
1121
+ ## Execute Workflow
1122
+
1123
+ 1. Load the canonical prompt via
1124
+ \`mcp__sellable__get_subskill_prompt({ subskillName: "load-voice" })\`.
1125
+ If the response has \`hasMore=true\`, continue with \`nextOffset\` until
1126
+ \`hasMore=false\`.
1127
+ 2. Follow the canonical prompt exactly. Read the relevant
1128
+ \`.sellable/configs/**\` memory files it names.
1129
+ 3. Apply the loaded memory silently to the user's requested writing or answer.
1130
+ If the user only asked to load voice, summarize the active rules briefly and
1131
+ ask what they want drafted, answered, or reviewed.
1132
+
1133
+ ## MCP Prompt Fallback
1134
+
1135
+ If exact subskill lookup fails, use
1136
+ \`mcp__sellable__search_subskill_prompts({ query: "load-voice", includePublic: true })\`,
1137
+ then retry \`get_subskill_prompt\`.
1138
+ `;
1139
+ }
1140
+
1092
1141
  function createCampaignSoulMd() {
1093
1142
  return `# Sellable Campaign GTM Engineer Soul
1094
1143
 
@@ -1283,6 +1332,12 @@ function codexPluginSkills() {
1283
1332
  description: "Build durable identity and company memory",
1284
1333
  skillMd: interviewSkillMd(),
1285
1334
  },
1335
+ {
1336
+ dir: "sellable-load-voice",
1337
+ displayName: "Sellable Load Voice",
1338
+ description: "Load voice memory for writing and answers",
1339
+ skillMd: loadVoiceSkillMd(),
1340
+ },
1286
1341
  ];
1287
1342
  }
1288
1343
 
@@ -2129,6 +2184,7 @@ function printNextSteps(installedHosts, authReused) {
2129
2184
  printAgentBox("Using Claude Code?", "claude", [
2130
2185
  { label: "Campaign", command: "/sellable:create-campaign" },
2131
2186
  { label: "Identity", command: "/sellable:interview" },
2187
+ { label: "Voice", command: "/sellable:load-voice" },
2132
2188
  ]);
2133
2189
  console.log("");
2134
2190
  console.log("");
@@ -2137,6 +2193,7 @@ function printNextSteps(installedHosts, authReused) {
2137
2193
  printAgentBox("Using Codex?", "codex", [
2138
2194
  { label: "Campaign", command: "$sellable:create-campaign" },
2139
2195
  { label: "Identity", command: "$sellable:interview" },
2196
+ { label: "Voice", command: "$sellable:load-voice" },
2140
2197
  ]);
2141
2198
  console.log("");
2142
2199
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.104",
3
+ "version": "0.1.106",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -86,7 +86,7 @@ or tool discovery. Start in product language:
86
86
  ```text
87
87
  I’ll help you launch this as a Sellable campaign. First I’ll resolve the
88
88
  client/company this campaign is for, then I’ll turn that into a campaign brief
89
- before any leads are imported or anything can send.
89
+ before we move into lead sourcing.
90
90
  ```
91
91
 
92
92
  If a linked/local skill file is stale or missing, silently use the installed
@@ -102,8 +102,14 @@ clear business decisions, tradeoffs, and approval gates. Use product language:
102
102
  - "a couple setup choices", not `request_user_input`
103
103
  - "campaign brief", not prompt artifact
104
104
  - "lead source", not provider internals unless comparing source options
105
- - "I can create a draft shell for you to watch, but no leads import and nothing
106
- sends until you approve", not mutation jargon
105
+ - "I can create a draft shell for you to watch with approval gates before
106
+ sourcing", not mutation jargon
107
+
108
+ Approval and safety copy should be tasteful. State what the current approval
109
+ covers once, in one short sentence, then move on. Do not append repeated
110
+ "nothing starts / no leads import / no sending" disclaimers to routine progress
111
+ updates. Use positive gate language like "Next gate: selected-post scrape" or
112
+ "Approval covers scouting/search only" instead of long negative lists.
107
113
 
108
114
  When explaining lead-source decisions, show the concrete counts behind the
109
115
  logic: lanes searched, timeframe, raw result counts, finalist posts or preview
@@ -127,7 +133,7 @@ authorizes scouting/search only. The gate should say:
127
133
  - why that lane fits the buyer, offer, and likely public activity
128
134
  - what will be tested next
129
135
  - the fallback lane if relevant posts or ICP engagement look thin
130
- - that approval authorizes scouting/search only, not lead import or sending
136
+ - what approval covers in one concise line
131
137
 
132
138
  Do not surface blanket source heuristics as product copy. Make the
133
139
  recommendation specific to the campaign. If Signal Discovery is recommended,
@@ -142,6 +148,21 @@ Signal Discovery, name how many selected posts will be scraped, the target
142
148
  engager/source-candidate volume, and the bounded review-batch size. For Sales
143
149
  Nav or Prospeo, name the specific approved import lane. Do not call
144
150
  `import_leads` or `confirm_lead_list` until this second approval is granted.
151
+ For Signal Discovery, the customer-facing approval card must use the exact
152
+ action shape "Approve scraping N Signal Discovery posts?" and the chat summary
153
+ should be a compact `## Source Recommendation` block with:
154
+
155
+ - good-fit target: about 150 prospects after cleanup, enrichment, and filters
156
+ - source-candidate plan: about 1,000 raw engagers using a conservative 15%
157
+ fit-rate assumption unless sampled data supports a different number
158
+ - review checkpoint: import the first 25 leads for fit and message review
159
+ - a selected-post table with post author/topic, why it fits, and visible
160
+ engagement
161
+ - total visible pool and estimated good-fit pool
162
+ - first pass: build the source list, then import only the review
163
+ batch
164
+ - fallback: switch to Sales Nav recent activity if the review batch is
165
+ vendor-heavy, agency-heavy, or off-ICP
145
166
 
146
167
  When the user has not supplied a source and multiple source angles are viable,
147
168
  scout those angles as independent branches when the host can actually do it:
@@ -168,19 +189,17 @@ which posts are being sampled in the watched app. The watch guide should say
168
189
  that we are pulling sample engagers from these posts to confirm the ICP is
169
190
  actually engaging and the source is viable.
170
191
 
171
- After find-leads returns a lead source and the user approves it, use the same
172
- registry pattern for the two post-lead branches. The create-campaign-v2 subskill
173
- calls `get_post_find_leads_scout_registry`, then launches the returned
174
- filter-leads scout and message-generation scout together when real subagents are
175
- available and the current session exposes the returned names. Message
176
- generation is the provisional Message Draft Builder: it may start after the
177
- review batch exists, including while the user is on filter choice, but workflow
178
- cell execution must wait. After rubrics are saved, do not queue enrichment,
179
- filtering, or Generate Message cells until the user approves the message
180
- template. AI Generated is an explicit opt-out that cancels or ignores the
181
- background template draft. If the post-lead agents are absent, the main thread
182
- still orchestrates the same branches from the compact context with MCP
183
- tools/assets.
192
+ After the bounded review batch exists, use the same registry pattern for
193
+ post-lead work. The create-campaign-v2 subskill calls
194
+ `get_post_find_leads_scout_registry`, then launches the returned
195
+ message-generation scout immediately when real subagents are available and the
196
+ current session exposes the returned name. If the user chooses filters, launch
197
+ the filter-leads scout then and join it with the already-running or completed
198
+ message draft before message review. Workflow cell execution still waits for
199
+ filter and template approval. AI Generated is an explicit opt-out that cancels
200
+ or ignores the background template draft. If the post-lead agents are absent,
201
+ the main thread still orchestrates the same branches from the compact context
202
+ with MCP tools/assets.
184
203
 
185
204
  Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
186
205
  lines short, use indexed section labels and bullets, and translate internal
@@ -233,7 +252,7 @@ After every `update_campaign({ campaignId, currentStep })`, use
233
252
  `get_campaign_navigation_state` when available as a compact orientation check:
234
253
  match the saved campaign state to the expected watch-link step, explain the
235
254
  current state in one sentence, and only then continue. Sender selection belongs
236
- at Settings after message approval and 15-row validation. After message
255
+ at Settings after message approval and review-batch validation. After message
237
256
  validation, use Settings to help the user connect or select a LinkedIn sender.
238
257
  Explain Slack reply review before launch. After sender selection, attach the
239
258
  recommended sequence and move the watched UI to Send. Do not start the campaign
@@ -412,7 +431,7 @@ First I’ll resolve the client/company this campaign is for. I’ll use that
412
431
  context to choose the target, offer, proof, and lead source.
413
432
 
414
433
  Then I’ll turn that into a campaign brief for you to approve before any leads
415
- are imported or anything can send.
434
+ are sourced.
416
435
  ```
417
436
 
418
437
  Do not silently ask Codex intake or approval questions as plain chat when
@@ -596,9 +615,9 @@ updates.
596
615
  until `hasMore=false`. The create-campaign message-review safety gate is a
597
616
  supplemental approval checklist, not a replacement for the long prompt. Use
598
617
  campaign state, campaign brief content, selected source state, and imported
599
- review-batch rows as the source of truth; do not read stale local markdown,
600
- inspect the database directly, or synthesize local validation artifacts from
601
- general knowledge.
618
+ review-batch rows as the source of truth; do not read stale local markdown
619
+ such as `message-validation.md`, inspect the database directly, or synthesize
620
+ local validation artifacts from general knowledge.
602
621
  5. Create the campaign shell early with the v1 brief so the user can open the
603
622
  watch link and see useful setup state immediately. Import only the first
604
623
  bounded review batch after the source is attached to the campaign; do not
@@ -609,9 +628,11 @@ updates.
609
628
  call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
610
629
  so the watched app moves to Filter Rules while rubrics are drafted/saved.
611
630
  After rubrics save, move the watched app to `apply-icp-rubric` / Filter
612
- Leads and say the fit rules are saved; approve the message template next;
613
- after approval, queue the bounded review-batch
614
- `enrichCellId` cells to kick off enrichment/filtering.
631
+ Leads and say the fit rules are saved; approve the message template next
632
+ while the browser stays on Filter Leads. After approval, save the template
633
+ to the campaign brief, then queue the bounded review-batch `enrichCellId`
634
+ cells to kick off enrichment/filtering. Move to Messages only after at
635
+ least one review row passes and Generate Message cells are running or ready.
615
636
  Product Generate Message cells must not run from the background template
616
637
  path before that template/token approval.
617
638
  Do not ask the user to approve the brief before shell creation unless they
@@ -620,15 +641,15 @@ updates.
620
641
  `mcp__sellable__update_campaign({ campaignId, currentStep })` before major
621
642
  visible work so the user can watch progress in the app: `create-offer` for
622
643
  the brief, `pick-provider` or the selected provider step while sourcing,
623
- `filter-choice` after the 15-row review batch, `create-icp-rubric` as soon
624
- as filters are approved, `apply-icp-rubric` after rubrics save, `messages`
625
- for the Use Template / AI Generated mode
626
- choice, `auto-execute-messaging` for approved
627
- message work or the product's AI-generated path, `awaiting-user-greenlight`
628
- for the final handoff, `settings` for sender selection, `sequence` after
629
- sender attach, and `send` once the recommended sequence is attached.
630
- `validate-sample` is recovery/legacy only if reached. Do not advance the
631
- step backward.
644
+ `filter-choice` after the review batch, `create-icp-rubric` as soon
645
+ as filters are approved, `apply-icp-rubric` after rubrics save and while
646
+ waiting for message-template approval, `validate-sample` while the approved
647
+ template unlocks bounded enrichment/filter scoring on Filter Leads,
648
+ `auto-execute-messaging` after at least one row passes and review-batch
649
+ messages are being generated or reviewed, `awaiting-user-greenlight` only
650
+ after generated review-batch messages are approved, `settings` for sender
651
+ selection, `sequence` after sender attach, and `send` once the recommended
652
+ sequence is attached. Do not advance the step backward.
632
653
  7. Keep `selectedLeadListId` as the source list and `workflowTableId` as the
633
654
  campaign table. Do not use disk files as the post-mint source of truth.
634
655
  8. Do not ask the user to run another command.