@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 live campaign inputs supplied by the parent thread:
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
- - compact initial campaign-table execution-slice basis: copied source row count,
30
- review-batch row count, and review-batch basis/hash. Do not require the
31
- parent to paste a long review-batch row-id list.
32
- - filter basis at branch start: `pending`, `use-filters`, or `skip-filters`
33
- - any already-saved fit/rubric result summaries supplied by the parent
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 current review-batch
44
- rows from those tools before drafting. Reject the task as `blocked` if the
45
- campaign id, workspace, `selectedLeadListId`, `workflowTableId`, review-batch
46
- row count, or review-batch basis/hash does not match the branch input.
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 First Steps
52
+ ## Required Work Loop
49
53
 
50
- 1. Load the current campaign brief and compact campaign/table state:
51
- campaign name, `campaignId`, `selectedLeadListId`, `workflowTableId`,
52
- copied source row count, review-batch row count, review-batch basis/hash,
53
- selected source summary, filter choice, and parent-supplied brief summary.
54
- Then read the current campaign/table state through scoped Sellable tools.
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 the reference assets required by that prompt's Reference Asset Loading
61
- pack, including validation/QA criteria. If a required validation asset cannot
62
- load, return `blocked` or `retry-needed` instead of drafting from memory.
63
- 4. Use that prompt as the drafting and QA contract. Do not use any alternate
64
- prompt, examples-only shortcut, or create-campaign safety/checklist
65
- instructions as a substitute for the full message prompt.
66
- 5. Draft only from the current campaign brief, selected source context, and
67
- review-batch rows loaded through scoped Sellable tools.
68
- 6. Run the normal message validation/QA rules before final return. The final
69
- recommendation must include the QA pass/fail receipt, not just draft copy.
70
- 7. Keep the work provisional until the user chooses `Use Template` in Messages.
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
- - basis token containing campaign revision/updatedAt, brief hash,
85
- `selectedLeadListId`, `workflowTableId`, compact execution-slice row
86
- count/hash, filter choice, and rubric/filter basis when present
87
- - output timestamp/hash and any retry/error detail
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 Prospect Filters finished,
112
- rubrics were saved, Filter Leads completed, enrichment cells populated, or more
113
- row data became available after this branch started.
114
-
115
- Treat later filter/enrichment data as optional rewrite context. If campaign id,
116
- brief hash, selected source, `selectedLeadListId`, `workflowTableId`, and
117
- execution-slice row count/hash still match, keep the initial recommendation usable
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
- brief hash, selected source, `selectedLeadListId`, `workflowTableId`, or
126
- execution-slice row count/hash. Filter/rubric/enrichment basis drift alone is not a stale
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 and validation assets, then return a revised or
136
- QA-only recommendation with:
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
- - `qaReceipt` with pass/fail notes against the loaded validation assets
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 token rules,
215
- omit/fallback examples, and bad-fill avoidance notes in your internal
216
- recommendation so the parent can persist them to the campaign brief after
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
@@ -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
- "imported review-batch rows"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.155",
3
+ "version": "0.1.156",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -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 compact. Include campaign identity,
283
- campaign name, `selectedLeadListId`, `workflowTableId`, copied source row count,
284
- review-batch row count, review-batch basis/hash, filter choice, source summary,
285
- and a concise campaign brief summary. Do not paste the full review-batch row ID
286
- list or row data into the spawn prompt. Message Drafting must load the current
287
- campaign brief, campaign/table state, and review-batch rows through Sellable
288
- tools, then load the normal message validation/QA rules and run a QA pass before
289
- returning its concise review-ready recommendation.
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 Prospect Filters / Message Drafting.
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 only normal post-import background branches are
436
- Prospect Filters and Message Drafting.
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
- When filters are chosen, use `post-find-leads-filter-scout` for Prospect
754
- Filters and `post-find-leads-message-scout` for Message Drafting. The parent
755
- waits for Prospect Filters first, verifies `save_rubrics` succeeded or saves
756
- returned production rubrics itself, asks filter approval, and only then joins
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 compact basis only, not a long row-id list; the
783
- branch loads current brief/table rows and validation assets itself.
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 Prospect Filters plus
790
- Message Drafting when filters are chosen, or only Message Drafting when
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 Prospect Filters drafts/saves
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.