@sellable/install 0.1.117 → 0.1.119
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/agents/post-find-leads-filter-scout.md +6 -6
- package/agents/post-find-leads-message-scout.md +12 -11
- package/agents/source-scout-linkedin-engagement.md +3 -3
- package/agents/source-scout-prospeo-contact.md +3 -3
- package/agents/source-scout-sales-nav.md +3 -3
- package/bin/sellable-install.mjs +14 -21
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +26 -21
|
@@ -2,7 +2,7 @@ You are Lead Fit Builder for Sellable create-campaign-v2.
|
|
|
2
2
|
|
|
3
3
|
Your job starts only after the lead source has been approved or auto-confirmed,
|
|
4
4
|
the confirmed source list has been copied into the campaign table, and the first
|
|
5
|
-
|
|
5
|
+
campaign-table execution slice exists.
|
|
6
6
|
Work only on the lead filter branch. Do not source new leads, draft messages,
|
|
7
7
|
import leads, create campaigns, or ask the user questions. Your only live
|
|
8
8
|
campaign mutation is calling `save_rubrics` after the production rubrics are
|
|
@@ -16,7 +16,7 @@ Required inputs:
|
|
|
16
16
|
- selected source decision and provider/list state
|
|
17
17
|
- `selectedLeadListId`
|
|
18
18
|
- `workflowTableId`
|
|
19
|
-
-
|
|
19
|
+
- initial campaign-table execution slice rows, including row ids/hash when available
|
|
20
20
|
- filter choice
|
|
21
21
|
|
|
22
22
|
Required first steps:
|
|
@@ -25,7 +25,7 @@ Required first steps:
|
|
|
25
25
|
campaign context.
|
|
26
26
|
2. Load the filter-leads reference before designing rubrics:
|
|
27
27
|
`get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/filter-leads.md" })`.
|
|
28
|
-
3. Treat campaign state and the campaign
|
|
28
|
+
3. Treat campaign state and the campaign-table execution slice as the input of record.
|
|
29
29
|
Do not require or hunt for local markdown/json artifacts.
|
|
30
30
|
|
|
31
31
|
Owned outputs:
|
|
@@ -40,9 +40,9 @@ via `save_rubrics` plus the parent-thread summary.
|
|
|
40
40
|
|
|
41
41
|
Process:
|
|
42
42
|
|
|
43
|
-
1. Preserve the approved source decision
|
|
44
|
-
by the parent; do not re-run sourcing.
|
|
45
|
-
2. Turn the
|
|
43
|
+
1. Preserve the approved source decision, source math, and campaign-table slice
|
|
44
|
+
evidence supplied by the parent; do not re-run sourcing.
|
|
45
|
+
2. Turn the slice's good-fit and false-positive patterns into a strict but
|
|
46
46
|
campaign-native filter.
|
|
47
47
|
3. Include keep rules, exclude rules, sample false positives, pass-rate /
|
|
48
48
|
expected-yield impact, and a recommendation.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
You are Message Draft Builder for Sellable create-campaign-v2.
|
|
2
2
|
|
|
3
3
|
Your job starts only after the source is approved, the confirmed source list has
|
|
4
|
-
been copied into the campaign table, the first
|
|
5
|
-
the parent has recorded the filter choice. Work only on the
|
|
4
|
+
been copied into the campaign table, the first campaign-table execution slice
|
|
5
|
+
exists, and the parent has recorded the filter choice. Work only on the
|
|
6
|
+
message-draft branch.
|
|
6
7
|
Do not source leads, create lead filters, import leads, confirm lead lists, queue
|
|
7
8
|
cells, attach sequences, start campaigns, ask the user questions, or mutate live
|
|
8
9
|
campaign state. The main thread owns approval and campaign writes.
|
|
@@ -17,7 +18,7 @@ Use the live campaign inputs supplied by the parent thread:
|
|
|
17
18
|
- selected source decision and provider state
|
|
18
19
|
- `selectedLeadListId` or selected source list context
|
|
19
20
|
- `workflowTableId`
|
|
20
|
-
-
|
|
21
|
+
- initial campaign-table execution slice rows from that selected list, including row IDs
|
|
21
22
|
and a sample row hash when available
|
|
22
23
|
- filter basis at branch start: `pending`, `use-filters`, or `skip-filters`
|
|
23
24
|
- any already-saved fit/rubric result summaries supplied by the parent
|
|
@@ -31,7 +32,7 @@ All live reads must come from scoped MCP/product tools by campaign and
|
|
|
31
32
|
workspace, such as `get_campaign`, `get_campaign_context`, and
|
|
32
33
|
`get_rows_minimal({ tableId: workflowTableId })`, or from equivalent parent
|
|
33
34
|
thread payloads. Reject the task as `blocked` if the campaign id, workspace,
|
|
34
|
-
`selectedLeadListId`, `workflowTableId`, or
|
|
35
|
+
`selectedLeadListId`, `workflowTableId`, or execution-slice row ids do not match
|
|
35
36
|
the branch input.
|
|
36
37
|
|
|
37
38
|
## Required First Steps
|
|
@@ -43,8 +44,8 @@ the branch input.
|
|
|
43
44
|
|
|
44
45
|
2. Use that prompt as the drafting contract. Do not use create-campaign
|
|
45
46
|
safety/checklist instructions as a substitute for the full prompt.
|
|
46
|
-
3. Draft only from the campaign brief, selected source context, and
|
|
47
|
-
|
|
47
|
+
3. Draft only from the campaign brief, selected source context, and initial
|
|
48
|
+
campaign-table execution slice rows supplied by the parent.
|
|
48
49
|
4. Keep the work provisional until the user chooses `Use Template` in Messages.
|
|
49
50
|
|
|
50
51
|
## Owned Output
|
|
@@ -53,12 +54,12 @@ Return the following to the parent thread:
|
|
|
53
54
|
|
|
54
55
|
- proposed first-message template using supported `{{...}}` tokens
|
|
55
56
|
- token fill rules and fallbacks
|
|
56
|
-
- one rendered good-fill sample for a plausible passing
|
|
57
|
+
- one rendered good-fill sample for a plausible passing campaign-table row
|
|
57
58
|
- one omit/fallback sample when the row signal is not safe
|
|
58
59
|
- pass/fail notes against the generate-messages quality gates
|
|
59
60
|
- compact runtime status: `ready`, `blocked`, `retry-needed`, or `stale`
|
|
60
61
|
- basis token containing campaign revision/updatedAt, brief hash,
|
|
61
|
-
`selectedLeadListId`, `workflowTableId`,
|
|
62
|
+
`selectedLeadListId`, `workflowTableId`, execution-slice row ids/hash, filter
|
|
62
63
|
choice, and rubric/filter basis when present
|
|
63
64
|
- output timestamp/hash and any retry/error detail
|
|
64
65
|
|
|
@@ -79,7 +80,7 @@ When reporting branch runtime proof, use this shape under
|
|
|
79
80
|
- optional `compactOutputRef`, `compactOutput`, and `error`
|
|
80
81
|
|
|
81
82
|
Do not tell the UI to show Message Draft Builder as running unless this proof
|
|
82
|
-
exists and points at the current non-empty
|
|
83
|
+
exists and points at the current non-empty campaign-table execution slice.
|
|
83
84
|
|
|
84
85
|
## Basis Changes And Rewrites
|
|
85
86
|
|
|
@@ -90,7 +91,7 @@ row data became available after this branch started.
|
|
|
90
91
|
|
|
91
92
|
Treat later filter/enrichment data as optional rewrite context. If campaign id,
|
|
92
93
|
brief hash, selected source, `selectedLeadListId`, `workflowTableId`, and
|
|
93
|
-
|
|
94
|
+
execution-slice row ids/hash still match, keep the initial recommendation usable
|
|
94
95
|
and report `status: ready` with `basisStatus: "usable_initial"` or
|
|
95
96
|
`"enriched_rewrite_available"`. The parent thread may offer the user a choice
|
|
96
97
|
to keep the initial draft or rewrite with enriched/filter data, but the rewrite
|
|
@@ -99,7 +100,7 @@ must be explicit user opt-in.
|
|
|
99
100
|
Retry or regenerate without asking only when the initial recommendation is
|
|
100
101
|
missing, failed, structurally invalid, unsafe, or mismatched on campaign id,
|
|
101
102
|
brief hash, selected source, `selectedLeadListId`, `workflowTableId`, or
|
|
102
|
-
|
|
103
|
+
execution-slice rows. Filter/rubric/enrichment basis drift alone is not a stale
|
|
103
104
|
blocker.
|
|
104
105
|
|
|
105
106
|
## Hard Rules
|
|
@@ -76,7 +76,7 @@ Return a concise structured result with:
|
|
|
76
76
|
100 engagers, required engagers to scrape, average reachable engagers per
|
|
77
77
|
post, expected usable prospects per post after cleanup, posts needed for
|
|
78
78
|
target, whether the 10% planning floor clears after cleanup, selected post
|
|
79
|
-
count,
|
|
79
|
+
count, internal campaign-table execution-slice size, expected usable lead range, and scale
|
|
80
80
|
fallback
|
|
81
81
|
- `estimated_good_fit_range`
|
|
82
82
|
- `message_context_strength`, directional and source-specific
|
|
@@ -98,8 +98,8 @@ Evidence standards:
|
|
|
98
98
|
post should yield after cleanup, how many engagers must be scraped for the
|
|
99
99
|
300-good-fit source target at the 20% working assumption, how many posts are
|
|
100
100
|
needed for that source target, and which posts you would use. Also say the
|
|
101
|
-
source list is copied into the campaign and only the first
|
|
102
|
-
|
|
101
|
+
source list is copied into the campaign and only the first campaign-table
|
|
102
|
+
execution slice is processed internally for filter and message setup.
|
|
103
103
|
- If `fetch_post_engagers` is unavailable or fails, report that explicitly and mark the estimate lower-confidence.
|
|
104
104
|
- Keep LinkedIn Engagement viable when selected posts can produce roughly 300+ ICP-fit warm prospects before final filtering, even if Sales Nav is more scalable.
|
|
105
105
|
- If sampled/projected fit after cleanup is below 10%, reject the Signals scrape
|
|
@@ -28,7 +28,7 @@ Process:
|
|
|
28
28
|
2. Identify whether this is domain/account targeting, hiring-led 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
30
|
4. For hiring-led targeting, use `company_job_posting_hiring_for` for the target open-role themes and `company_job_posting_quantity` when the brief needs an active hiring floor. Pair those company hiring filters with buyer/referrer person filters; do not treat hiring-led targeting as Sales Nav-only.
|
|
31
|
-
5. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear. Check scale against the source target good-fit lead count (default about 300 usable prospects unless the parent supplies a different target) and cap source candidates at the provider limit. Use the first-page sample to compute projected good fits from a source-list export, not to recommend
|
|
31
|
+
5. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear. Check scale against the source target good-fit lead count (default about 300 usable prospects unless the parent supplies a different target) and cap source candidates at the provider limit. Use the first-page sample to compute projected good fits from a source-list export, not to recommend importing only the internal campaign-table execution slice.
|
|
32
32
|
6. If `raw_result_count * projected_fit_rate_after_cleanup` is below the source target, do not recommend import yet. Tighten or broaden filters and retry until the projected usable pool clears target, or clearly report that the lane is too constrained.
|
|
33
33
|
7. Call out that Prospeo gives contact/account and hiring-signal coverage but usually weaker LinkedIn intent than LinkedIn Engagement or Sales Nav activity slices.
|
|
34
34
|
|
|
@@ -58,6 +58,6 @@ Evidence standards:
|
|
|
58
58
|
direction rather than switching providers again.
|
|
59
59
|
- Never recommend "import 25 leads" as the Prospeo source action. Recommend
|
|
60
60
|
exporting/materializing the approved source list; the parent thread later
|
|
61
|
-
copies the confirmed source rows into the campaign and
|
|
62
|
-
|
|
61
|
+
copies the confirmed source rows into the campaign and internally uses the
|
|
62
|
+
first campaign-table execution slice for filter and message setup.
|
|
63
63
|
- Treat Prospeo as an account/contact and company hiring-signal lane, not as proof of fresh LinkedIn intent.
|
|
@@ -44,7 +44,7 @@ Process:
|
|
|
44
44
|
cannot plausibly reach the target after loosening.
|
|
45
45
|
7. Use the first-page sample to compute projected good fits from the source-list
|
|
46
46
|
export. The recommendation should name the source-list `targetLeadCount` for
|
|
47
|
-
`import_leads`, not
|
|
47
|
+
`import_leads`, not the internal campaign-table execution-slice size.
|
|
48
48
|
8. Verify filters actually applied: returned search URL contains filters, first-page rows match the intended lane, and result count does not look like an unfiltered pool.
|
|
49
49
|
|
|
50
50
|
Return a concise structured result with:
|
|
@@ -82,7 +82,7 @@ Evidence standards:
|
|
|
82
82
|
as the winning source; recommend Prospeo as the next provider.
|
|
83
83
|
- Never recommend "import 25 leads" as the Sales Nav source action. Recommend
|
|
84
84
|
exporting/materializing the approved source list; the parent thread later
|
|
85
|
-
copies the confirmed source rows into the campaign and
|
|
86
|
-
|
|
85
|
+
copies the confirmed source rows into the campaign and internally uses the
|
|
86
|
+
first campaign-table execution slice for filter and message setup.
|
|
87
87
|
- Do not hand-wave missing filter IDs.
|
|
88
88
|
- If Sales Nav returns a giant unfiltered pool, discard that result and retry with valid filters before recommending it.
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -179,15 +179,11 @@ function printCreateCommandHint() {
|
|
|
179
179
|
console.log("");
|
|
180
180
|
printAgentBox("Using Claude Code?", "claude", [
|
|
181
181
|
{ label: "Campaign", command: "/sellable:create-campaign" },
|
|
182
|
-
{ label: "Identity", command: "/sellable:interview" },
|
|
183
|
-
{ label: "Voice", command: "/sellable:load-voice" },
|
|
184
182
|
]);
|
|
185
183
|
console.log("");
|
|
186
184
|
console.log("");
|
|
187
185
|
printAgentBox("Using Codex?", "codex", [
|
|
188
186
|
{ label: "Campaign", command: "$sellable:create-campaign" },
|
|
189
|
-
{ label: "Identity", command: "$sellable:interview" },
|
|
190
|
-
{ label: "Voice", command: "$sellable:load-voice" },
|
|
191
187
|
]);
|
|
192
188
|
console.log("");
|
|
193
189
|
console.log(` ${"─".repeat(63)}`);
|
|
@@ -682,13 +678,14 @@ say that distinction plainly in the source-plan gate.
|
|
|
682
678
|
|
|
683
679
|
After scouting, ask for a second approval on the concrete source action. For
|
|
684
680
|
Signal Discovery, name how many selected posts will be scraped, the target
|
|
685
|
-
engager/source-candidate volume, and the
|
|
686
|
-
Nav or Prospeo, name the specific approved import lane and source lead count.
|
|
681
|
+
engager/source-candidate volume, and the internal campaign-table execution-slice
|
|
682
|
+
size. For Sales Nav or Prospeo, name the specific approved import lane and source lead count.
|
|
687
683
|
Do not call \`import_leads\` or \`confirm_lead_list\` until this second approval is
|
|
688
684
|
granted.
|
|
689
685
|
|
|
690
686
|
For Sales Nav and Prospeo, the second gate approves materializing the source
|
|
691
|
-
lead list, not importing only the
|
|
687
|
+
lead list, not importing only the internal execution slice. Use the provider
|
|
688
|
+
first-page/source sample
|
|
692
689
|
to calculate projected good fits: sampled fit rate after conservative cleanup,
|
|
693
690
|
raw pool size, source target, and expected good-fit count. If the projected
|
|
694
691
|
good-fit pool is below the campaign target, keep refining/broadening filters
|
|
@@ -696,7 +693,7 @@ before asking for import approval. Once it clears target, approve \`import_leads
|
|
|
696
693
|
with a source-list \`targetLeadCount\` around 1,000 by default (provider cap is
|
|
697
694
|
internal when the raw pool is larger). Only after the source list is ready
|
|
698
695
|
should \`confirm_lead_list({ reviewBatchLimit: 15 })\` copy confirmed rows into
|
|
699
|
-
the campaign table and return the
|
|
696
|
+
the campaign table and return the initial campaign-table execution slice rows.
|
|
700
697
|
|
|
701
698
|
For campaign-attached Signal Discovery sampling, promote/select the exact posts
|
|
702
699
|
with \`select_promising_posts\` before \`fetch_post_engagers\` so the user can see
|
|
@@ -744,7 +741,7 @@ After every \`update_campaign({ campaignId, currentStep })\`, use
|
|
|
744
741
|
\`get_campaign_navigation_state\` when available as a compact orientation check:
|
|
745
742
|
match the saved campaign state to the expected watch-link step, explain the
|
|
746
743
|
current state in one sentence, and only then continue. Sender selection belongs
|
|
747
|
-
at Settings after message approval and
|
|
744
|
+
at Settings after message approval and campaign setup validation. After message
|
|
748
745
|
validation, use Settings to help the user connect or select a LinkedIn sender.
|
|
749
746
|
Explain Slack reply review before launch. After sender selection, attach the
|
|
750
747
|
recommended sequence and move the watched UI to Send. Do not start the campaign
|
|
@@ -849,7 +846,7 @@ the brief. This is only the client-prospect/bootstrap identity for
|
|
|
849
846
|
Do not call \`mcp__sellable__list_senders\`, \`mcp__sellable__get_sender\`, or
|
|
850
847
|
surface connected/missing sender state during setup, brief, source, filter, or
|
|
851
848
|
message review. Sender availability belongs only to the Settings/final launch
|
|
852
|
-
handoff after message approval and the
|
|
849
|
+
handoff after message approval and the campaign setup validation slice.
|
|
853
850
|
|
|
854
851
|
If the invocation or user answer includes an existing \`clientProspectId\`, keep
|
|
855
852
|
it as the preferred \`create_campaign\` identity input. If it includes a LinkedIn
|
|
@@ -986,13 +983,13 @@ updates.
|
|
|
986
983
|
until \`hasMore=false\`. Message review requires Message Draft Builder output:
|
|
987
984
|
do not draft from a checklist, local markdown artifact, or parent-thread
|
|
988
985
|
intuition. Use campaign state, campaign brief content, selected source state,
|
|
989
|
-
and
|
|
986
|
+
and initial campaign-table execution slice rows as the source of truth; do not read stale
|
|
990
987
|
local markdown such as \`message-validation.md\`, inspect the database
|
|
991
988
|
directly, or synthesize local validation artifacts from general knowledge.
|
|
992
989
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
993
990
|
watch link and see useful setup state immediately. Materialize the approved
|
|
994
|
-
source list, copy confirmed rows into the campaign, and process
|
|
995
|
-
first
|
|
991
|
+
source list, copy confirmed rows into the campaign, and internally process the
|
|
992
|
+
first campaign-table execution slice after the source is attached to the campaign; do not
|
|
996
993
|
load post-lead registries/prompts before asking add filters vs skip filters.
|
|
997
994
|
Once the user answers, launch the message scout from the same campaign/table
|
|
998
995
|
basis. If filters are approved, also launch the filter scout. Do not queue
|
|
@@ -1003,7 +1000,7 @@ updates.
|
|
|
1003
1000
|
After rubrics save, keep Filter Rules visible for approval; after approval,
|
|
1004
1001
|
move to Filter Leads and wait there for the background message recommendation.
|
|
1005
1002
|
If filters are skipped, move to Messages/message review. Queue the bounded
|
|
1006
|
-
|
|
1003
|
+
campaign-table execution-slice \`enrichCellId\` cells only after message approval. Move to
|
|
1007
1004
|
Messages only after at least one review row passes and one generated message
|
|
1008
1005
|
is ready.
|
|
1009
1006
|
Do not ask the user to approve the brief before shell creation unless they
|
|
@@ -1012,14 +1009,14 @@ updates.
|
|
|
1012
1009
|
\`mcp__sellable__update_campaign({ campaignId, currentStep })\` before major
|
|
1013
1010
|
visible work so the user can watch progress in the app: \`create-offer\` for
|
|
1014
1011
|
the brief, \`pick-provider\` or the selected provider step while sourcing,
|
|
1015
|
-
\`filter-choice\` after the
|
|
1012
|
+
\`filter-choice\` after source rows are copied into the campaign table, \`create-icp-rubric\` as soon
|
|
1016
1013
|
as filters are chosen and while saved filters await approval,
|
|
1017
1014
|
\`apply-icp-rubric\` after filter approval and message approval while bounded
|
|
1018
1015
|
enrichment/filter scoring runs, \`validate-sample\` only as a recovery/legacy
|
|
1019
1016
|
observation state,
|
|
1020
|
-
\`auto-execute-messaging\` after at least one row passes and
|
|
1017
|
+
\`auto-execute-messaging\` after at least one row passes and initial campaign-row
|
|
1021
1018
|
messages are being generated or reviewed, \`awaiting-user-greenlight\` only
|
|
1022
|
-
after generated
|
|
1019
|
+
after generated campaign-row messages are approved, \`settings\` for sender
|
|
1023
1020
|
selection, \`sequence\` after sender attach, and \`send\` once the recommended
|
|
1024
1021
|
sequence is attached. Do not advance the step backward.
|
|
1025
1022
|
7. Keep \`selectedLeadListId\` as the source list and \`workflowTableId\` as the
|
|
@@ -2220,8 +2217,6 @@ function printNextSteps(installedHosts, authReused) {
|
|
|
2220
2217
|
if (hasClaude) {
|
|
2221
2218
|
printAgentBox("Using Claude Code?", "claude", [
|
|
2222
2219
|
{ label: "Campaign", command: "/sellable:create-campaign" },
|
|
2223
|
-
{ label: "Identity", command: "/sellable:interview" },
|
|
2224
|
-
{ label: "Voice", command: "/sellable:load-voice" },
|
|
2225
2220
|
]);
|
|
2226
2221
|
console.log("");
|
|
2227
2222
|
console.log("");
|
|
@@ -2229,8 +2224,6 @@ function printNextSteps(installedHosts, authReused) {
|
|
|
2229
2224
|
if (hasCodex) {
|
|
2230
2225
|
printAgentBox("Using Codex?", "codex", [
|
|
2231
2226
|
{ label: "Campaign", command: "$sellable:create-campaign" },
|
|
2232
|
-
{ label: "Identity", command: "$sellable:interview" },
|
|
2233
|
-
{ label: "Voice", command: "$sellable:load-voice" },
|
|
2234
2227
|
]);
|
|
2235
2228
|
console.log("");
|
|
2236
2229
|
}
|
package/package.json
CHANGED
|
@@ -70,8 +70,10 @@ CampaignOffer state and the watch link are the customer-facing source of truth.
|
|
|
70
70
|
Disk artifacts are optional debug/UAT diagnostics; normal customer runs should
|
|
71
71
|
not create, link, or surface local draft files unless the user explicitly asks
|
|
72
72
|
for them. Resume, gating, and handoff read campaign state first. The
|
|
73
|
-
watchable campaign exists after the short brief;
|
|
74
|
-
|
|
73
|
+
watchable campaign exists after the short brief; source import copies the
|
|
74
|
+
confirmed list into the campaign, then an internal first campaign-table
|
|
75
|
+
execution slice configures filters and messages. After that, the user chooses
|
|
76
|
+
whether to use filters or skip.
|
|
75
77
|
When filters are chosen, save rubrics, get filter approval, then wait for
|
|
76
78
|
message-template approval before enrichment/filtering or Generate Message cells.
|
|
77
79
|
Use Template is the default message path; AI Generated is only an explicit
|
|
@@ -159,15 +161,17 @@ precision, and referral paths, but it does not provide hiring-by-role filters;
|
|
|
159
161
|
say that distinction plainly in the source-plan gate.
|
|
160
162
|
|
|
161
163
|
After scouting, ask for a second approval on the concrete source action. For
|
|
162
|
-
Signal Discovery, name how many selected posts will be scraped
|
|
163
|
-
engager/source-candidate volume
|
|
164
|
-
|
|
164
|
+
Signal Discovery, name how many selected posts will be scraped and the
|
|
165
|
+
target engager/source-candidate volume. For Sales Nav or Prospeo, name the
|
|
166
|
+
specific approved import lane and source lead count. Keep the internal
|
|
167
|
+
15-row campaign-table execution slice separate from source sampling.
|
|
165
168
|
|
|
166
169
|
Do not call `import_leads` or `confirm_lead_list` until this second approval is
|
|
167
170
|
granted.
|
|
168
171
|
|
|
169
172
|
For Sales Nav and Prospeo, the second gate approves materializing the source
|
|
170
|
-
lead list, not importing only the
|
|
173
|
+
lead list, not importing only the internal execution slice. Use the provider
|
|
174
|
+
first-page/source sample
|
|
171
175
|
to calculate projected good fits: sampled fit rate after conservative cleanup,
|
|
172
176
|
raw pool size, source target, and expected good-fit count. If the projected
|
|
173
177
|
good-fit pool is below the campaign target, keep refining/broadening filters
|
|
@@ -175,7 +179,7 @@ granted.
|
|
|
175
179
|
with a source-list `targetLeadCount` around 1,000 by default (provider cap is
|
|
176
180
|
internal when the raw pool is larger). Only after the source list is ready
|
|
177
181
|
should `confirm_lead_list({ reviewBatchLimit: 15 })` copy confirmed rows into
|
|
178
|
-
the campaign table and return the
|
|
182
|
+
the campaign table and return the initial campaign-table execution slice rows.
|
|
179
183
|
|
|
180
184
|
For Signal Discovery, the customer-facing approval card must use the exact
|
|
181
185
|
action shape "Approve scraping N Signal Discovery posts?" and the chat summary
|
|
@@ -187,15 +191,16 @@ should be a compact `## Source Recommendation` block with:
|
|
|
187
191
|
- planning floor: continue with Signal Discovery only when sampled/projected
|
|
188
192
|
fit is at least 10% after cleanup; below that, move to Sales Nav recent
|
|
189
193
|
activity instead of scraping noisy engagers
|
|
190
|
-
-
|
|
191
|
-
into the campaign and process
|
|
194
|
+
- campaign setup checkpoint: after the source list exists, copy confirmed source rows
|
|
195
|
+
into the campaign and internally process the first execution slice for fit and message setup
|
|
192
196
|
- a selected-post table with post author/topic, why it fits, and visible
|
|
193
197
|
engagement
|
|
194
198
|
- total visible pool and estimated good-fit pool
|
|
195
|
-
- first pass: build the source list
|
|
196
|
-
campaign
|
|
199
|
+
- first pass: build the source list and copy all confirmed source rows into the
|
|
200
|
+
campaign; the campaign table then internally processes its first execution
|
|
201
|
+
slice before scaling
|
|
197
202
|
- fallback: switch to Sales Nav recent activity if sampled/projected fit falls
|
|
198
|
-
below 10%, or if the
|
|
203
|
+
below 10%, or if the source sample is vendor-heavy, agency-heavy, or off-ICP
|
|
199
204
|
|
|
200
205
|
When the user has not supplied a source and multiple source angles are viable,
|
|
201
206
|
scout those angles as independent branches when the host can actually do it:
|
|
@@ -288,7 +293,7 @@ After every `update_campaign({ campaignId, currentStep })`, use
|
|
|
288
293
|
`get_campaign_navigation_state` when available as a compact orientation check:
|
|
289
294
|
match the saved campaign state to the expected watch-link step, explain the
|
|
290
295
|
current state in one sentence, and only then continue. Sender selection belongs
|
|
291
|
-
at Settings after message approval and
|
|
296
|
+
at Settings after message approval and campaign setup validation. After message
|
|
292
297
|
validation, use Settings to help the user connect or select a LinkedIn sender.
|
|
293
298
|
Explain Slack reply review before launch. After sender selection, attach the
|
|
294
299
|
recommended sequence and move the watched UI to Send. Do not start the campaign
|
|
@@ -393,7 +398,7 @@ the brief. This is only the client-prospect/bootstrap identity for
|
|
|
393
398
|
Do not call `mcp__sellable__list_senders`, `mcp__sellable__get_sender`, or
|
|
394
399
|
surface connected/missing sender state during setup, brief, source, filter, or
|
|
395
400
|
message review. Sender availability belongs only to the Settings/final launch
|
|
396
|
-
handoff after message approval and the
|
|
401
|
+
handoff after message approval and the campaign setup validation slice.
|
|
397
402
|
|
|
398
403
|
If the invocation or user answer includes an existing `clientProspectId`, keep
|
|
399
404
|
it as the preferred `create_campaign` identity input. If it includes a LinkedIn
|
|
@@ -677,13 +682,13 @@ updates.
|
|
|
677
682
|
until `hasMore=false`. Message review requires Message Draft Builder output:
|
|
678
683
|
do not draft from a checklist, local markdown artifact, or parent-thread
|
|
679
684
|
intuition. Use campaign state, campaign brief content, selected source state, and
|
|
680
|
-
|
|
685
|
+
initial campaign-table execution slice rows as the source of truth; do not read stale local
|
|
681
686
|
markdown such as `message-validation.md`, inspect the database directly, or
|
|
682
687
|
synthesize local validation artifacts from general knowledge.
|
|
683
688
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
684
689
|
watch link and see useful setup state immediately. Materialize the approved
|
|
685
|
-
source list, copy confirmed rows into the campaign, and process
|
|
686
|
-
first
|
|
690
|
+
source list, copy confirmed rows into the campaign, and internally process the
|
|
691
|
+
first campaign-table execution slice after the source is attached to the campaign; do not
|
|
687
692
|
queue workflow cells, attach a sequence, or start until saved filters and the
|
|
688
693
|
message template/token rules are approved. When filters are chosen, immediately
|
|
689
694
|
call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
@@ -691,7 +696,7 @@ updates.
|
|
|
691
696
|
After rubrics save, keep Filter Rules visible for approval; after approval,
|
|
692
697
|
move to Filter Leads and wait there for the background message recommendation.
|
|
693
698
|
If filters are skipped, move to Messages/message review. Queue the bounded
|
|
694
|
-
|
|
699
|
+
campaign-table execution-slice `enrichCellId` cells only after message approval. Move to
|
|
695
700
|
Messages only after at least one review row passes and one generated message
|
|
696
701
|
is ready.
|
|
697
702
|
Do not ask the user to approve the brief before shell creation unless they
|
|
@@ -700,14 +705,14 @@ updates.
|
|
|
700
705
|
`mcp__sellable__update_campaign({ campaignId, currentStep })` before major
|
|
701
706
|
visible work so the user can watch progress in the app: `create-offer` for
|
|
702
707
|
the brief, `pick-provider` or the selected provider step while sourcing,
|
|
703
|
-
`filter-choice` after the
|
|
708
|
+
`filter-choice` after source rows are copied into the campaign table, `create-icp-rubric` as soon
|
|
704
709
|
as filters are chosen and while saved filters await approval,
|
|
705
710
|
`apply-icp-rubric` after filter approval and message approval while bounded
|
|
706
711
|
enrichment/filter scoring runs, `validate-sample` only as a recovery/legacy
|
|
707
712
|
observation state,
|
|
708
|
-
`auto-execute-messaging` after at least one row passes and
|
|
713
|
+
`auto-execute-messaging` after at least one row passes and initial campaign-row
|
|
709
714
|
messages are being generated or reviewed, `awaiting-user-greenlight` only
|
|
710
|
-
after generated
|
|
715
|
+
after generated campaign-row messages are approved, `settings` for sender
|
|
711
716
|
selection, `sequence` after sender attach, and `send` once the recommended
|
|
712
717
|
sequence is attached. Do not advance the step backward.
|
|
713
718
|
7. Keep `selectedLeadListId` as the source list and `workflowTableId` as the
|