@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 +3 -0
- package/agents/post-find-leads-message-scout.md +44 -0
- package/agents/registry.json +2 -2
- package/agents/source-scout-linkedin-engagement.md +4 -3
- package/agents/source-scout-prospeo-contact.md +1 -1
- package/agents/source-scout-sales-nav.md +3 -2
- package/bin/sellable-install.mjs +69 -12
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +55 -34
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.
|
package/agents/registry.json
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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).
|
|
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
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -40,7 +40,7 @@ function getMcpVersion() {
|
|
|
40
40
|
} catch {}
|
|
41
41
|
return "latest";
|
|
42
42
|
}
|
|
43
|
-
const CODEX_PLUGIN_VERSION = "0.1.
|
|
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
|
|
634
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
@@ -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
|
|
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
|
|
106
|
-
|
|
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
|
-
-
|
|
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
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
614
|
-
|
|
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
|
|
624
|
-
as filters are approved, `apply-icp-rubric` after rubrics save
|
|
625
|
-
for
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
`
|
|
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.
|