@sellable/install 0.1.155 → 0.1.156
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.
|
@@ -17,20 +17,19 @@ campaign state. The main thread owns approval and campaign writes.
|
|
|
17
17
|
|
|
18
18
|
## Source Of Truth
|
|
19
19
|
|
|
20
|
-
Use the
|
|
20
|
+
Use the lean handoff supplied by the parent thread:
|
|
21
21
|
|
|
22
22
|
- `campaignId`
|
|
23
|
-
- campaign revision or `campaignUpdatedAt`
|
|
24
|
-
- campaign brief summary from the parent, then the current `campaignBrief` /
|
|
25
|
-
campaign brief content loaded through Sellable tools
|
|
26
|
-
- selected source decision and provider state
|
|
27
|
-
- `selectedLeadListId` or selected source list context
|
|
28
23
|
- `workflowTableId`
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
24
|
+
- concise brief summary: offer, buyer, source context, safe proof, blocked claims
|
|
25
|
+
- concise source summary and source-use rule
|
|
26
|
+
- 3-5 sample workflow-table rows with `rowId`, name, title, company, and short
|
|
27
|
+
signal
|
|
28
|
+
- optional `campaignName`, `selectedLeadListId`, and filter choice
|
|
29
|
+
|
|
30
|
+
Do not require campaign revision, brief hash, copied row count, review-batch
|
|
31
|
+
count, row hash, or a long review-batch row-id list. The branch can verify the
|
|
32
|
+
current state with live Sellable tools.
|
|
34
33
|
|
|
35
34
|
Do not require or hunt for `brief.md`, `lead-review.md`, or `lead-sample.json`.
|
|
36
35
|
Those files are optional debug context only when the parent explicitly provides
|
|
@@ -40,34 +39,47 @@ read stale local markdown files to reconstruct campaign state.
|
|
|
40
39
|
All live reads must come from scoped MCP/product tools by campaign and
|
|
41
40
|
workspace, such as `get_campaign`, `get_campaign_context`, and
|
|
42
41
|
`get_rows_minimal({ tableId: workflowTableId })`, or from equivalent parent
|
|
43
|
-
thread payloads. Load the current campaign brief and the
|
|
44
|
-
rows
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
thread payloads. Load the current campaign brief/context and use the provided
|
|
43
|
+
sample rows as the drafting sample. Reject the task as `blocked` if the campaign
|
|
44
|
+
id, workspace, or `workflowTableId` does not match the branch input.
|
|
45
|
+
|
|
46
|
+
Reference assets are packaged MCP assets. Load them only through
|
|
47
|
+
`get_subskill_asset`; do not use shell commands, local `Read`, `rg`, `cat`,
|
|
48
|
+
`wc`, plugin-cache paths, repo paths, or `/Users/...` paths to find them. If a
|
|
49
|
+
required message reference cannot be loaded through the MCP asset loader, return
|
|
50
|
+
`blocked` or `retry-needed`.
|
|
47
51
|
|
|
48
|
-
## Required
|
|
52
|
+
## Required Work Loop
|
|
49
53
|
|
|
50
|
-
1. Load
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
Do not ask the parent to paste row data or a long row-id list.
|
|
56
|
-
2. Load the full normal-path message prompt:
|
|
54
|
+
1. Load live campaign context:
|
|
55
|
+
`get_campaign`, `get_campaign_context`, and row details for the provided
|
|
56
|
+
sample row ids when available. Do not ask the parent for hashes or row-count
|
|
57
|
+
bookkeeping.
|
|
58
|
+
2. Load the full normal-path message prompt, all chunks:
|
|
57
59
|
|
|
58
60
|
`get_subskill_prompt({ subskillName: "generate-messages" })`
|
|
59
61
|
|
|
60
|
-
3. Load
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
5. Draft
|
|
67
|
-
|
|
68
|
-
6.
|
|
69
|
-
|
|
70
|
-
7.
|
|
62
|
+
3. Load every packaged reference asset required by that prompt's Reference Asset
|
|
63
|
+
Loading section with `get_subskill_asset`. If a required asset cannot load
|
|
64
|
+
through the MCP asset loader, return `blocked` or `retry-needed` instead of
|
|
65
|
+
drafting from memory.
|
|
66
|
+
4. Build positioning in a compact working note: buyer, pain, product, mechanism,
|
|
67
|
+
proof boundary, source-use rule, and CTA.
|
|
68
|
+
5. Draft 3 distinct first-message options: signal-led, product/mechanism-led,
|
|
69
|
+
and proof/credibility-led.
|
|
70
|
+
6. Combine the strongest opener, product line, mechanism line, proof treatment,
|
|
71
|
+
and CTA into one reusable template.
|
|
72
|
+
7. Define token fill rules and fallbacks, then render one good sample.
|
|
73
|
+
8. Before returning, load the validation prompt:
|
|
74
|
+
|
|
75
|
+
`get_subskill_prompt({ subskillName: "create-campaign-v2-validation" })`
|
|
76
|
+
|
|
77
|
+
Use it only as a validation contract for the candidate message in this live
|
|
78
|
+
campaign branch. Do not write dry-mode artifacts. Run the final candidate
|
|
79
|
+
against token safety, proof safety, source safety, Thomas filters, AI tells,
|
|
80
|
+
single-send rule, and "would I take this call?". If it fails, revise once and
|
|
81
|
+
validate again.
|
|
82
|
+
9. Keep the work provisional until the user chooses `Use Template` in Messages.
|
|
71
83
|
|
|
72
84
|
## Owned Output
|
|
73
85
|
|
|
@@ -76,15 +88,14 @@ Return the following to the parent thread:
|
|
|
76
88
|
- proposed first-message template using supported `{{...}}` tokens
|
|
77
89
|
- token fill rules and fallbacks
|
|
78
90
|
- one rendered good-fill sample for a plausible passing campaign-table row
|
|
79
|
-
- one omit/fallback sample when the row signal is not safe
|
|
80
|
-
- pass/fail notes against the generate-messages quality gates
|
|
81
|
-
- `qaReceipt` / validation notes showing token safety, proof safety, fit
|
|
82
|
-
uncertainty, bad-fill avoidance, and "would I take this call?" judgment
|
|
83
91
|
- message-draft runtime status: `ready`, `blocked`, `retry-needed`, or `stale`
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
92
|
+
- approve-or-revise recommendation
|
|
93
|
+
- validation status only: `passed`, `revised-then-passed`, or `blocked`
|
|
94
|
+
- output timestamp/hash and any blocked/retry detail
|
|
95
|
+
|
|
96
|
+
Do not return or render `renderedFallbackSample`, `concerns`, or a full
|
|
97
|
+
`qaReceipt` in the normal happy path. Validation is an internal gate; summarize
|
|
98
|
+
only if blocked or retry-needed.
|
|
88
99
|
|
|
89
100
|
Do not write local markdown/json artifacts in normal live campaign runs. Return
|
|
90
101
|
the recommendation directly to the parent thread. Emit debug artifacts only when
|
|
@@ -108,23 +119,21 @@ exists and points at the current non-empty campaign-table execution slice.
|
|
|
108
119
|
## Basis Changes And Rewrites
|
|
109
120
|
|
|
110
121
|
The first completed recommendation is the default message review candidate.
|
|
111
|
-
Do not automatically retry or regenerate only because
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
Treat later filter/enrichment data as optional rewrite context. If campaign id
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
and report `status: ready` with `basisStatus: "usable_initial"` or
|
|
122
|
+
Do not automatically retry or regenerate only because filters were saved, Filter
|
|
123
|
+
Leads completed, enrichment cells populated, or more row data became available
|
|
124
|
+
after this branch started.
|
|
125
|
+
|
|
126
|
+
Treat later filter/enrichment data as optional rewrite context. If campaign id
|
|
127
|
+
and `workflowTableId` still match, keep the initial recommendation usable and
|
|
128
|
+
report `status: ready` with `basisStatus: "usable_initial"` or
|
|
119
129
|
`"enriched_rewrite_available"`. The parent thread may offer the user a choice
|
|
120
130
|
to keep the initial draft or rewrite with enriched/filter data, but the rewrite
|
|
121
131
|
must be explicit user opt-in.
|
|
122
132
|
|
|
123
133
|
Retry or regenerate without asking only when the initial recommendation is
|
|
124
134
|
missing, failed, structurally invalid, unsafe, or mismatched on campaign id,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
blocker.
|
|
135
|
+
`workflowTableId`, or provided sample rows. Filter/rubric/enrichment basis drift
|
|
136
|
+
alone is not a stale blocker.
|
|
128
137
|
|
|
129
138
|
## User Revision Feedback And QA
|
|
130
139
|
|
|
@@ -132,17 +141,19 @@ If the parent sends user feedback, a QA request, or a rewrite request about the
|
|
|
132
141
|
template before `approve-message`, treat it as Message Drafting work, not a
|
|
133
142
|
campaign write. Use the current `messageDraftRecommendation`, basis token/hash,
|
|
134
143
|
campaign/table basis, and latest user feedback as inputs. Load or reuse the full
|
|
135
|
-
`generate-messages` contract
|
|
136
|
-
QA-only recommendation
|
|
144
|
+
`generate-messages` contract, all referenced assets, and
|
|
145
|
+
`create-campaign-v2-validation`, then return a revised or QA-only recommendation
|
|
146
|
+
with:
|
|
137
147
|
|
|
138
148
|
- revised proposed template
|
|
139
149
|
- what changed and why
|
|
140
150
|
- token fill rule/fallback changes, if any
|
|
141
151
|
- one rendered good-fill sample
|
|
142
|
-
-
|
|
143
|
-
- pass/fail notes against the same quality gates
|
|
152
|
+
- validation status: `passed`, `revised-then-passed`, or `blocked`
|
|
144
153
|
- updated output timestamp/hash and basis token
|
|
145
154
|
|
|
155
|
+
Do not return a full QA receipt unless the result is blocked or retry-needed.
|
|
156
|
+
|
|
146
157
|
Keep the revision grounded in the same source/list/table rows unless the parent
|
|
147
158
|
explicitly supplies a new selected list or review slice. Do not call
|
|
148
159
|
`update_campaign_brief`, do not persist the template, and do not approve your
|
|
@@ -201,20 +212,18 @@ enablement`, or omit it.
|
|
|
201
212
|
Return a concise status with:
|
|
202
213
|
|
|
203
214
|
- prompt basis loaded: `generate-messages`
|
|
215
|
+
- validation prompt loaded: `create-campaign-v2-validation`
|
|
204
216
|
- live campaign basis used
|
|
205
217
|
- proposed template
|
|
206
218
|
- token fill rules/fallbacks
|
|
207
219
|
- one rendered passing-row sample
|
|
208
|
-
- one rendered omit/fallback sample
|
|
209
|
-
- quality-gate pass/fail summary
|
|
210
220
|
- whether final template review is ready or needs revision
|
|
211
221
|
|
|
212
222
|
When the parent will show the recommendation in chat, keep the customer-facing
|
|
213
223
|
message review lightweight. Format only the approval target and one strong
|
|
214
|
-
good-fill example as Markdown with distinct copy blocks. Keep
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
approval; do not print them in the default chat approval packet.
|
|
224
|
+
good-fill example as Markdown with distinct copy blocks. Keep validation notes,
|
|
225
|
+
bad-fill avoidance notes, and QA details internal unless blocked; do not print
|
|
226
|
+
them in the default chat approval packet.
|
|
218
227
|
|
|
219
228
|
````markdown
|
|
220
229
|
## Message Template
|
package/agents/registry.json
CHANGED
|
@@ -150,50 +150,6 @@
|
|
|
150
150
|
]
|
|
151
151
|
}
|
|
152
152
|
},
|
|
153
|
-
{
|
|
154
|
-
"id": "filter-leads",
|
|
155
|
-
"name": "post-find-leads-filter-scout",
|
|
156
|
-
"kind": "post-find-leads-scout",
|
|
157
|
-
"promptFile": "post-find-leads-filter-scout.md",
|
|
158
|
-
"displayName": "Prospect Filters",
|
|
159
|
-
"target": "filter-leads",
|
|
160
|
-
"inputs": [
|
|
161
|
-
"campaignId",
|
|
162
|
-
"campaignBrief summary plus branch-loaded current campaignBrief",
|
|
163
|
-
"source decision and selectedLeadList/source state",
|
|
164
|
-
"workflowTableId",
|
|
165
|
-
"compact review-batch count/hash or branch-loaded review rows"
|
|
166
|
-
],
|
|
167
|
-
"producesArtifacts": [],
|
|
168
|
-
"optionalProducesArtifacts": [],
|
|
169
|
-
"ownership": "prospect-fit criteria, false-positive patterns, keep/exclude rules, ability-to-pay checks, and production rubric translation only",
|
|
170
|
-
"codex": {
|
|
171
|
-
"description": "Prospect Filters worker for campaign-backed fit criteria and rubric persistence after review-batch import and filter approval.",
|
|
172
|
-
"model": "gpt-5.5",
|
|
173
|
-
"modelReasoningEffort": "high",
|
|
174
|
-
"sandboxMode": "read-only",
|
|
175
|
-
"nicknameCandidates": [
|
|
176
|
-
"Prospect Filters",
|
|
177
|
-
"Fit Criteria",
|
|
178
|
-
"Rubric Builder"
|
|
179
|
-
]
|
|
180
|
-
},
|
|
181
|
-
"claude": {
|
|
182
|
-
"description": "Use proactively as Prospect Filters after review-batch import and filter approval to persist campaign rubrics from campaign state.",
|
|
183
|
-
"model": "inherit",
|
|
184
|
-
"background": true,
|
|
185
|
-
"maxTurns": 8,
|
|
186
|
-
"color": "yellow",
|
|
187
|
-
"tools": [
|
|
188
|
-
"mcp__sellable__get_subskill_prompt",
|
|
189
|
-
"mcp__sellable__get_subskill_asset",
|
|
190
|
-
"mcp__sellable__get_campaign",
|
|
191
|
-
"mcp__sellable__get_campaign_context",
|
|
192
|
-
"mcp__sellable__get_rows_minimal",
|
|
193
|
-
"mcp__sellable__save_rubrics"
|
|
194
|
-
]
|
|
195
|
-
}
|
|
196
|
-
},
|
|
197
153
|
{
|
|
198
154
|
"id": "message-generation",
|
|
199
155
|
"name": "post-find-leads-message-scout",
|
|
@@ -203,16 +159,17 @@
|
|
|
203
159
|
"target": "generate-messages",
|
|
204
160
|
"inputs": [
|
|
205
161
|
"campaignId",
|
|
206
|
-
"campaignBrief",
|
|
207
|
-
"selected source state",
|
|
208
|
-
"selectedLeadListId",
|
|
209
162
|
"workflowTableId",
|
|
210
|
-
"
|
|
163
|
+
"concise brief summary",
|
|
164
|
+
"concise source summary/source-use rule",
|
|
165
|
+
"3-5 sample workflow-table rows",
|
|
166
|
+
"optional campaignName, selectedLeadListId, filter choice"
|
|
211
167
|
],
|
|
212
168
|
"producesArtifacts": [
|
|
213
169
|
"template recommendation",
|
|
214
170
|
"token fill rules",
|
|
215
|
-
"rendered sample"
|
|
171
|
+
"one rendered good-fill sample",
|
|
172
|
+
"validation status"
|
|
216
173
|
],
|
|
217
174
|
"optionalProducesArtifacts": [],
|
|
218
175
|
"ownership": "message strategy, proof inventory, token rules, skeptical-prospect review, and selected winner only",
|
|
@@ -234,8 +191,8 @@
|
|
|
234
191
|
"maxTurns": 10,
|
|
235
192
|
"color": "magenta",
|
|
236
193
|
"tools": [
|
|
237
|
-
"Read",
|
|
238
194
|
"mcp__sellable__get_subskill_prompt",
|
|
195
|
+
"mcp__sellable__get_subskill_asset",
|
|
239
196
|
"mcp__sellable__get_campaign",
|
|
240
197
|
"mcp__sellable__get_campaign_context",
|
|
241
198
|
"mcp__sellable__get_rows_minimal"
|
package/package.json
CHANGED
|
@@ -279,14 +279,15 @@ Messages/message review. Enrichment/filtering and Generate Message cells wait
|
|
|
279
279
|
for message approval. AI Generated is an explicit opt-out from the template
|
|
280
280
|
path.
|
|
281
281
|
|
|
282
|
-
The Message Drafting handoff must stay
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
282
|
+
The Message Drafting handoff must stay lean. Include only `campaignId`,
|
|
283
|
+
`workflowTableId`, a concise brief summary, concise source summary/source-use
|
|
284
|
+
rule, and 3-5 sample workflow-table rows with `rowId`, name, title, company, and
|
|
285
|
+
signal. Optional: campaign name, `selectedLeadListId`, and filter choice. Do not
|
|
286
|
+
paste copied row counts, brief hashes, review-batch hashes, full row ID lists,
|
|
287
|
+
broad row data, or local debug artifacts into the spawn prompt. Message Drafting
|
|
288
|
+
must load the current campaign brief/context, full `generate-messages` prompt,
|
|
289
|
+
all referenced assets, and `create-campaign-v2-validation`; validation is an
|
|
290
|
+
internal gate before it returns the concise review-ready recommendation.
|
|
290
291
|
|
|
291
292
|
Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
|
|
292
293
|
lines short, use indexed section labels and bullets, and translate internal
|
|
@@ -421,19 +422,15 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
421
422
|
not call it in the normal create-campaign source path.
|
|
422
423
|
- `load_post_find_leads_scout_registry`: call
|
|
423
424
|
`mcp__sellable__get_post_find_leads_scout_registry({})` after source
|
|
424
|
-
import and before dispatching
|
|
425
|
-
- `launch_prospect_filters`: Claude Code uses `Task` with `subagent_type`
|
|
426
|
-
`post-find-leads-filter-scout` when filters are chosen; Codex uses the
|
|
427
|
-
returned compatibility agent. Prospect Filters must save or return production
|
|
428
|
-
rubrics before message review can proceed.
|
|
425
|
+
import and before dispatching Message Drafting only.
|
|
429
426
|
- `launch_message_drafting`: Claude Code uses `Task` with `subagent_type`
|
|
430
427
|
`post-find-leads-message-scout` when listed; Codex uses the returned
|
|
431
428
|
compatibility agent or a generic `gpt-5.5` / `xhigh` Message Drafting agent.
|
|
432
429
|
|
|
433
430
|
If a required interactive question function or MCP loader is missing, stop and
|
|
434
431
|
explain the Sellable install/reload problem. Source work uses product-native MCP
|
|
435
|
-
orchestration in the parent; the
|
|
436
|
-
|
|
432
|
+
orchestration in the parent; filters also stay in the parent with MCP tools. The
|
|
433
|
+
only normal post-import background branch is Message Drafting.
|
|
437
434
|
|
|
438
435
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
439
436
|
save drafts, write artifacts, or persist intermediate state, translate it into
|
|
@@ -750,10 +747,10 @@ updates.
|
|
|
750
747
|
asset loader so they share the same config.
|
|
751
748
|
3. Follow that prompt and workflow config exactly.
|
|
752
749
|
4. For filter and message setup, keep the parent thread as a lean orchestrator.
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
750
|
+
The only normal background agent is `post-find-leads-message-scout` for
|
|
751
|
+
Message Drafting. When filters are chosen, launch Message Drafting, then keep
|
|
752
|
+
filters in the parent thread: load `references/filter-leads.md`, draft
|
|
753
|
+
production rubrics, call `save_rubrics`, ask filter approval, and then join
|
|
757
754
|
Message Drafting for template review. When filters are skipped, launch only
|
|
758
755
|
Message Drafting.
|
|
759
756
|
5. For message generation, keep the parent thread as a lean orchestrator and
|
|
@@ -768,7 +765,7 @@ updates.
|
|
|
768
765
|
permission before loading the long message prompt in the parent. If
|
|
769
766
|
permission is granted but the named custom agent is not
|
|
770
767
|
available, spawn a generic background agent with `model: "gpt-5.5"` and
|
|
771
|
-
`reasoning_effort: "xhigh"` using the same campaign/table basis. Do not
|
|
768
|
+
`reasoning_effort: "xhigh"` using the same lean campaign/table basis. Do not
|
|
772
769
|
silently fall back to parent-thread message drafting; parent fallback is
|
|
773
770
|
allowed only when the user explicitly says to continue without a background
|
|
774
771
|
agent.
|
|
@@ -779,21 +776,23 @@ updates.
|
|
|
779
776
|
initial campaign-table execution slice rows as the source of truth; do not read stale local
|
|
780
777
|
markdown such as `message-validation.md`, inspect the database directly, or
|
|
781
778
|
synthesize local validation artifacts from general knowledge. The handoff to
|
|
782
|
-
Message Drafting should pass
|
|
783
|
-
branch loads current brief/
|
|
779
|
+
Message Drafting should pass lean basis only, not hashes, counts, or a long
|
|
780
|
+
row-id list; the branch loads current brief/context, the full
|
|
781
|
+
`generate-messages` prompt, all referenced assets, and
|
|
782
|
+
`create-campaign-v2-validation` itself. Do not render fallback sample,
|
|
783
|
+
concerns, or a QA receipt on the normal happy path.
|
|
784
784
|
6. Create the campaign shell early with the v1 brief so the user can open the
|
|
785
785
|
watch link and see useful setup state immediately. Materialize the approved
|
|
786
786
|
source list, copy confirmed rows into the campaign, and internally process the
|
|
787
787
|
first campaign-table execution slice after the source is attached to the
|
|
788
788
|
campaign; do not load prospect-setup registries/prompts before asking add
|
|
789
|
-
filters vs skip filters. Once the user answers, launch
|
|
790
|
-
|
|
791
|
-
filters are skipped. Do not queue workflow cells, attach a
|
|
789
|
+
filters vs skip filters. Once the user answers, launch only Message Drafting.
|
|
790
|
+
If filters are chosen, draft/save filters in the parent thread. Do not queue workflow cells, attach a
|
|
792
791
|
sequence, or start until saved filters and the
|
|
793
792
|
message template/token rules are approved. When filters are chosen, immediately
|
|
794
793
|
call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
795
|
-
so the watched app moves to Filter Rules while
|
|
796
|
-
rubrics.
|
|
794
|
+
so the watched app moves to Filter Rules while the parent drafts/saves
|
|
795
|
+
rubrics and Message Drafting runs.
|
|
797
796
|
After rubrics save, keep Filter Rules visible for approval; after approval,
|
|
798
797
|
move to Filter Leads and show `Filters saved + waiting for message approval`
|
|
799
798
|
until the template is approved.
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
You are Prospect Filters for Sellable create-campaign-v2.
|
|
2
|
-
|
|
3
|
-
Your job starts only after the Start Import gate is approved or auto-confirmed,
|
|
4
|
-
the confirmed source list has been copied into the campaign table, and the first
|
|
5
|
-
campaign-table execution slice exists.
|
|
6
|
-
Work only on the lead filter branch. Do not source new leads, draft messages,
|
|
7
|
-
import leads, create campaigns, or ask the user questions. Your only live
|
|
8
|
-
campaign mutation is calling `save_rubrics` after the production rubrics are
|
|
9
|
-
ready.
|
|
10
|
-
|
|
11
|
-
Required inputs:
|
|
12
|
-
|
|
13
|
-
- `campaignId`
|
|
14
|
-
- campaign revision or `campaignUpdatedAt`
|
|
15
|
-
- campaign brief summary from the parent, then the current campaign brief loaded
|
|
16
|
-
through Sellable tools
|
|
17
|
-
- selected source decision and provider/list state
|
|
18
|
-
- `selectedLeadListId`
|
|
19
|
-
- `workflowTableId`
|
|
20
|
-
- compact initial campaign-table execution-slice basis: copied source row count,
|
|
21
|
-
review-batch row count, and review-batch basis/hash. Do not require the
|
|
22
|
-
parent to paste every row id when scoped row tools are available.
|
|
23
|
-
- filter choice
|
|
24
|
-
|
|
25
|
-
Required first steps:
|
|
26
|
-
|
|
27
|
-
1. Verify the campaign/source/table ids from the parent thread match the live
|
|
28
|
-
campaign context. Read current campaign/table state and the review batch
|
|
29
|
-
through scoped Sellable tools such as `get_campaign`, `get_campaign_context`,
|
|
30
|
-
and `get_rows_minimal({ tableId: workflowTableId })`.
|
|
31
|
-
2. Load the filter-leads reference before designing rubrics:
|
|
32
|
-
`get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/filter-leads.md" })`.
|
|
33
|
-
3. Treat campaign state and the campaign-table execution slice as the input of record.
|
|
34
|
-
Do not require or hunt for local markdown/json artifacts.
|
|
35
|
-
|
|
36
|
-
Owned outputs:
|
|
37
|
-
|
|
38
|
-
- Durable campaign rubrics via `save_rubrics({ campaignOfferId, leadScoringRubrics })`
|
|
39
|
-
when the filter is confirmed and production-shaped rubrics are safe to write.
|
|
40
|
-
`save_rubrics` is the durable writer.
|
|
41
|
-
- If `save_rubrics` is unavailable in the branch, return production-shaped
|
|
42
|
-
`leadScoringRubrics` and mark `save_rubrics` as not yet persisted so the
|
|
43
|
-
parent can save them before filter approval.
|
|
44
|
-
- concise filter/rubric summary returned to the parent thread
|
|
45
|
-
|
|
46
|
-
Do not write or modify local markdown/json artifacts. Durable output is only
|
|
47
|
-
via `save_rubrics` plus the parent-thread summary.
|
|
48
|
-
|
|
49
|
-
Process:
|
|
50
|
-
|
|
51
|
-
1. Preserve the approved source decision, source math, and campaign-table slice
|
|
52
|
-
evidence supplied by the parent; do not re-run sourcing.
|
|
53
|
-
2. Turn the slice's good-fit and false-positive patterns into a strict but
|
|
54
|
-
campaign-native filter.
|
|
55
|
-
3. Include keep rules, exclude rules, sample false positives, pass-rate /
|
|
56
|
-
expected-yield impact, and a recommendation.
|
|
57
|
-
4. Add an explicit ability-to-pay or economic-capacity gate unless the brief
|
|
58
|
-
clearly says the offer is free or has no meaningful budget requirement.
|
|
59
|
-
5. Keep source mechanics out of production rubrics. Engagement, provider,
|
|
60
|
-
priority, or first-send ordering can inform prioritization, but they are not
|
|
61
|
-
standalone ICP qualification rules.
|
|
62
|
-
6. If status is `confirmed`, call `save_rubrics` with 2-5 production-shaped
|
|
63
|
-
active `leadScoringRubrics` before reporting success. If `save_rubrics`
|
|
64
|
-
fails, stop and report the blocker; do not claim the filter is persisted.
|
|
65
|
-
|
|
66
|
-
Return a concise final status with:
|
|
67
|
-
|
|
68
|
-
- filter status: `confirmed`, `confirm-with-user`, or `revise-find-leads`
|
|
69
|
-
- whether `save_rubrics` succeeded and how many active rubrics were persisted
|
|
70
|
-
- strongest keep rules
|
|
71
|
-
- strongest exclusion rules
|
|
72
|
-
- expected pass-rate / yield impact
|
|
73
|
-
- any blocker that prevents message review from joining
|
|
74
|
-
|
|
75
|
-
Quality bar:
|
|
76
|
-
|
|
77
|
-
- Every passing lead should be someone the user would be glad to hear back
|
|
78
|
-
from.
|
|
79
|
-
- Do not loosen the filter just to preserve volume.
|
|
80
|
-
- Do not make the filter so narrow that it contradicts the approved source
|
|
81
|
-
unless the sample evidence clearly requires it.
|