@sellable/install 0.1.152 → 0.1.154
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 +7 -8
- package/agents/post-find-leads-message-scout.md +56 -17
- package/bin/sellable-install.mjs +15 -21
- package/package.json +1 -1
- package/skill-templates/create-campaign.md +47 -53
package/README.md
CHANGED
|
@@ -56,14 +56,13 @@ Auth is stored once at:
|
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
Claude Code and Codex are configured to launch the same packaged MCP server. The
|
|
59
|
-
installer also writes Sellable
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
starts in one registry entry instead of scattered prompt edits.
|
|
59
|
+
installer also writes Sellable agent definitions from the packaged `agents/`
|
|
60
|
+
registry, but normal create-campaign runs use only the Message Drafting
|
|
61
|
+
background agent. Source discovery and filter/rubric setup stay in the parent
|
|
62
|
+
thread with product-native MCP tools unless the user explicitly asks for a
|
|
63
|
+
source-comparison/debug run. `get_post_find_leads_scout_registry` returns the
|
|
64
|
+
Message Drafting worker for the normal path; `get_source_scout_registry` is
|
|
65
|
+
metadata for explicit debug/comparison use.
|
|
67
66
|
|
|
68
67
|
## Names
|
|
69
68
|
|
|
@@ -21,12 +21,14 @@ Use the live campaign inputs supplied by the parent thread:
|
|
|
21
21
|
|
|
22
22
|
- `campaignId`
|
|
23
23
|
- campaign revision or `campaignUpdatedAt`
|
|
24
|
-
- `campaignBrief` /
|
|
24
|
+
- campaign brief summary from the parent, then the current `campaignBrief` /
|
|
25
|
+
campaign brief content loaded through Sellable tools
|
|
25
26
|
- selected source decision and provider state
|
|
26
27
|
- `selectedLeadListId` or selected source list context
|
|
27
28
|
- `workflowTableId`
|
|
28
|
-
- initial campaign-table execution
|
|
29
|
-
|
|
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.
|
|
30
32
|
- filter basis at branch start: `pending`, `use-filters`, or `skip-filters`
|
|
31
33
|
- any already-saved fit/rubric result summaries supplied by the parent
|
|
32
34
|
|
|
@@ -38,22 +40,34 @@ read stale local markdown files to reconstruct campaign state.
|
|
|
38
40
|
All live reads must come from scoped MCP/product tools by campaign and
|
|
39
41
|
workspace, such as `get_campaign`, `get_campaign_context`, and
|
|
40
42
|
`get_rows_minimal({ tableId: workflowTableId })`, or from equivalent parent
|
|
41
|
-
thread payloads.
|
|
42
|
-
|
|
43
|
-
|
|
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.
|
|
44
47
|
|
|
45
48
|
## Required First Steps
|
|
46
49
|
|
|
47
|
-
1. Load the
|
|
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:
|
|
48
57
|
|
|
49
58
|
`get_subskill_prompt({ subskillName: "generate-messages" })`
|
|
50
59
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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.
|
|
57
71
|
|
|
58
72
|
## Owned Output
|
|
59
73
|
|
|
@@ -64,10 +78,12 @@ Return the following to the parent thread:
|
|
|
64
78
|
- one rendered good-fill sample for a plausible passing campaign-table row
|
|
65
79
|
- one omit/fallback sample when the row signal is not safe
|
|
66
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
|
|
67
83
|
- message-draft runtime status: `ready`, `blocked`, `retry-needed`, or `stale`
|
|
68
84
|
- basis token containing campaign revision/updatedAt, brief hash,
|
|
69
|
-
`selectedLeadListId`, `workflowTableId`, execution-slice row
|
|
70
|
-
choice, and rubric/filter basis when present
|
|
85
|
+
`selectedLeadListId`, `workflowTableId`, compact execution-slice row
|
|
86
|
+
count/hash, filter choice, and rubric/filter basis when present
|
|
71
87
|
- output timestamp/hash and any retry/error detail
|
|
72
88
|
|
|
73
89
|
Do not write local markdown/json artifacts in normal live campaign runs. Return
|
|
@@ -98,7 +114,7 @@ row data became available after this branch started.
|
|
|
98
114
|
|
|
99
115
|
Treat later filter/enrichment data as optional rewrite context. If campaign id,
|
|
100
116
|
brief hash, selected source, `selectedLeadListId`, `workflowTableId`, and
|
|
101
|
-
execution-slice row
|
|
117
|
+
execution-slice row count/hash still match, keep the initial recommendation usable
|
|
102
118
|
and report `status: ready` with `basisStatus: "usable_initial"` or
|
|
103
119
|
`"enriched_rewrite_available"`. The parent thread may offer the user a choice
|
|
104
120
|
to keep the initial draft or rewrite with enriched/filter data, but the rewrite
|
|
@@ -107,9 +123,32 @@ must be explicit user opt-in.
|
|
|
107
123
|
Retry or regenerate without asking only when the initial recommendation is
|
|
108
124
|
missing, failed, structurally invalid, unsafe, or mismatched on campaign id,
|
|
109
125
|
brief hash, selected source, `selectedLeadListId`, `workflowTableId`, or
|
|
110
|
-
execution-slice
|
|
126
|
+
execution-slice row count/hash. Filter/rubric/enrichment basis drift alone is not a stale
|
|
111
127
|
blocker.
|
|
112
128
|
|
|
129
|
+
## User Revision Feedback And QA
|
|
130
|
+
|
|
131
|
+
If the parent sends user feedback, a QA request, or a rewrite request about the
|
|
132
|
+
template before `approve-message`, treat it as Message Drafting work, not a
|
|
133
|
+
campaign write. Use the current `messageDraftRecommendation`, basis token/hash,
|
|
134
|
+
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:
|
|
137
|
+
|
|
138
|
+
- revised proposed template
|
|
139
|
+
- what changed and why
|
|
140
|
+
- token fill rule/fallback changes, if any
|
|
141
|
+
- 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
|
|
144
|
+
- updated output timestamp/hash and basis token
|
|
145
|
+
|
|
146
|
+
Keep the revision grounded in the same source/list/table rows unless the parent
|
|
147
|
+
explicitly supplies a new selected list or review slice. Do not call
|
|
148
|
+
`update_campaign_brief`, do not persist the template, and do not approve your
|
|
149
|
+
own revision. The parent renders the revised template and waits for
|
|
150
|
+
`approve-message`.
|
|
151
|
+
|
|
113
152
|
## Hard Rules
|
|
114
153
|
|
|
115
154
|
- Do not call product Generate Message cells. This worker drafts the template
|
package/bin/sellable-install.mjs
CHANGED
|
@@ -918,26 +918,19 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
918
918
|
- \`load_subprompt_asset\`: call
|
|
919
919
|
\`mcp__sellable__get_subskill_asset({ subskillName, assetPath, offset?, limit? })\`
|
|
920
920
|
and continue chunks until \`hasMore\` is false.
|
|
921
|
-
- \`load_source_scout_registry\`:
|
|
922
|
-
|
|
921
|
+
- \`load_source_scout_registry\`: explicit source-comparison/debug runs only; do
|
|
922
|
+
not call it in the normal create-campaign source path.
|
|
923
923
|
- \`load_post_find_leads_scout_registry\`: call
|
|
924
924
|
\`mcp__sellable__get_post_find_leads_scout_registry({})\` after source
|
|
925
|
-
import and before dispatching
|
|
926
|
-
- \`
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
\`source-scout-linkedin-engagement\`, \`source-scout-sales-nav\`, and
|
|
930
|
-
\`source-scout-prospeo-contact\` when subagents are available.
|
|
931
|
-
- \`launch_post_find_leads_scout\`: Claude Code uses \`Task\` with
|
|
932
|
-
\`subagent_type\` equal to the returned prospect-setup registry \`name\` only when
|
|
933
|
-
the session lists those agents; Codex uses the returned compatibility agents such as
|
|
934
|
-
\`post-find-leads-filter-scout\` and \`post-find-leads-message-scout\` when
|
|
935
|
-
subagents are available.
|
|
925
|
+
import and before dispatching Message Drafting only.
|
|
926
|
+
- \`launch_message_drafting\`: Claude Code uses \`Task\` with \`subagent_type\`
|
|
927
|
+
\`post-find-leads-message-scout\` when listed; Codex uses the returned
|
|
928
|
+
compatibility agent or a generic \`gpt-5.5\` / \`xhigh\` Message Drafting agent.
|
|
936
929
|
|
|
937
930
|
If a required interactive question function or MCP loader is missing, stop and
|
|
938
|
-
explain the Sellable install/reload problem.
|
|
939
|
-
|
|
940
|
-
|
|
931
|
+
explain the Sellable install/reload problem. Source and filter work use
|
|
932
|
+
product-native MCP orchestration in the parent; the only normal background
|
|
933
|
+
branch is Message Drafting.
|
|
941
934
|
|
|
942
935
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
943
936
|
save drafts, write artifacts, or persist intermediate state, translate it into
|
|
@@ -1132,11 +1125,12 @@ updates.
|
|
|
1132
1125
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
1133
1126
|
watch link and see useful setup state immediately. Materialize the approved
|
|
1134
1127
|
source list, copy confirmed rows into the campaign, and internally process the
|
|
1135
|
-
|
|
1136
|
-
load prospect-setup registries/prompts before asking add
|
|
1137
|
-
Once the user answers, launch Message Drafting
|
|
1138
|
-
basis. If filters are approved,
|
|
1139
|
-
|
|
1128
|
+
first campaign-table execution slice after the source is attached to the
|
|
1129
|
+
campaign; do not load prospect-setup registries/prompts before asking add
|
|
1130
|
+
filters vs skip filters. Once the user answers, launch only Message Drafting
|
|
1131
|
+
from the same campaign/table basis. If filters are approved, do filter/rubric
|
|
1132
|
+
work inline in the parent thread. Do not queue workflow cells, attach a
|
|
1133
|
+
sequence, or start until saved filters and the
|
|
1140
1134
|
message template/token rules are approved. When filters are chosen, immediately
|
|
1141
1135
|
call \`mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })\`
|
|
1142
1136
|
so the watched app moves to Filter Rules while rubrics are drafted/saved.
|
package/package.json
CHANGED
|
@@ -248,25 +248,12 @@ summary should be a compact `## Source Recommendation` block with:
|
|
|
248
248
|
- fallback: switch to active LinkedIn profiles if the first sample is too noisy
|
|
249
249
|
or has too few prospects
|
|
250
250
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
258
|
-
`source-scout-prospeo-contact` for the credible lanes only when the current host
|
|
259
|
-
exposes those names; Codex does not infer subagent fan-out from generic source
|
|
260
|
-
comparison wording. In Claude Code, invoke the generated `source-scout-*`
|
|
261
|
-
Task/Agent subagents for all credible lanes in one assistant message only when
|
|
262
|
-
the current session lists those names. The installer writes them from the same
|
|
263
|
-
canonical Sellable agent registry with explicit Sellable MCP tool allowlists.
|
|
264
|
-
The create-campaign-v2 subskill calls `get_source_scout_registry` before
|
|
265
|
-
dispatch so the current registry, not this copy, is the runtime source of truth.
|
|
266
|
-
If the host runs them sequentially or the named agents are unavailable, do not
|
|
267
|
-
claim they ran in parallel and do not surface install status to the customer. In
|
|
268
|
-
chat, call the downstream copy stage `message generation`; message validation is
|
|
269
|
-
only an internal approval proof.
|
|
251
|
+
Source discovery stays inline in the parent thread for normal create-campaign
|
|
252
|
+
runs. Use the approved provider prompt and MCP tools sequentially; do not spawn
|
|
253
|
+
source-scout background agents unless the user explicitly asks for a source
|
|
254
|
+
comparison/debug run. Do not claim a scout ran unless one did, and do not surface
|
|
255
|
+
install status to the customer. In chat, call the downstream copy stage
|
|
256
|
+
`message generation`; message validation/QA is owned by Message Drafting.
|
|
270
257
|
|
|
271
258
|
For campaign-attached Signal Discovery sampling, promote/select the exact posts
|
|
272
259
|
with `select_promising_posts` before `fetch_post_engagers` so the user can see
|
|
@@ -279,20 +266,27 @@ math should import the smallest set that covers a target. The watch guide should
|
|
|
279
266
|
say that we are checking people from these posts to confirm the right people are
|
|
280
267
|
actually engaging and the source is viable.
|
|
281
268
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
prospect setup work, but do not load that registry or any deep filter/message prompt
|
|
269
|
+
After confirmed source rows exist in the campaign table, do not load the
|
|
270
|
+
message registry or any deep filter/message prompt
|
|
285
271
|
before the filter-choice question. After `confirm_lead_list`, ask add filters
|
|
286
|
-
vs skip filters immediately. Once the user answers, launch Message Drafting
|
|
287
|
-
from the same campaign/table basis. If the user chooses filters,
|
|
288
|
-
|
|
289
|
-
approval. After approval, move to
|
|
290
|
-
|
|
291
|
-
skips filters, move to
|
|
292
|
-
|
|
293
|
-
opt-out from the template
|
|
294
|
-
|
|
295
|
-
|
|
272
|
+
vs skip filters immediately. Once the user answers, launch only Message Drafting
|
|
273
|
+
from the same campaign/table basis. If the user chooses filters, the parent
|
|
274
|
+
thread moves to Filter Rules, loads the filter reference, saves rubrics, then
|
|
275
|
+
asks for filter approval while Message Drafting runs. After approval, move to
|
|
276
|
+
Filter Leads and show `Filters saved + waiting for message approval` while the
|
|
277
|
+
message recommendation is reviewed. If the user skips filters, move to
|
|
278
|
+
Messages/message review. Enrichment/filtering and Generate Message cells wait
|
|
279
|
+
for message approval. AI Generated is an explicit opt-out from the template
|
|
280
|
+
path.
|
|
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.
|
|
296
290
|
|
|
297
291
|
Use rendered Markdown for user review surfaces, not fenced code blocks. Keep
|
|
298
292
|
lines short, use indexed section labels and bullets, and translate internal
|
|
@@ -423,26 +417,19 @@ Treat host capabilities as concrete functions, not prose conventions:
|
|
|
423
417
|
- `load_subprompt_asset`: call
|
|
424
418
|
`mcp__sellable__get_subskill_asset({ subskillName, assetPath, offset?, limit? })`
|
|
425
419
|
and continue chunks until `hasMore` is false.
|
|
426
|
-
- `load_source_scout_registry`:
|
|
427
|
-
|
|
420
|
+
- `load_source_scout_registry`: explicit source-comparison/debug runs only; do
|
|
421
|
+
not call it in the normal create-campaign source path.
|
|
428
422
|
- `load_post_find_leads_scout_registry`: call
|
|
429
423
|
`mcp__sellable__get_post_find_leads_scout_registry({})` after source
|
|
430
|
-
import and before dispatching
|
|
431
|
-
- `
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
`source-scout-linkedin-engagement`, `source-scout-sales-nav`, and
|
|
435
|
-
`source-scout-prospeo-contact` when subagents are available.
|
|
436
|
-
- `launch_post_find_leads_scout`: Claude Code uses `Task` with `subagent_type`
|
|
437
|
-
equal to the returned prospect-setup registry `name` only when the session
|
|
438
|
-
lists those agents; Codex uses the returned compatibility agents such as
|
|
439
|
-
`post-find-leads-filter-scout` and `post-find-leads-message-scout` when
|
|
440
|
-
subagents are available.
|
|
424
|
+
import and before dispatching Message Drafting only.
|
|
425
|
+
- `launch_message_drafting`: Claude Code uses `Task` with `subagent_type`
|
|
426
|
+
`post-find-leads-message-scout` when listed; Codex uses the returned
|
|
427
|
+
compatibility agent or a generic `gpt-5.5` / `xhigh` Message Drafting agent.
|
|
441
428
|
|
|
442
429
|
If a required interactive question function or MCP loader is missing, stop and
|
|
443
|
-
explain the Sellable install/reload problem.
|
|
444
|
-
|
|
445
|
-
|
|
430
|
+
explain the Sellable install/reload problem. Source and filter work use
|
|
431
|
+
product-native MCP orchestration in the parent; the only normal background
|
|
432
|
+
branch is Message Drafting.
|
|
446
433
|
|
|
447
434
|
Never narrate local draft housekeeping to the user. If you create directories,
|
|
448
435
|
save drafts, write artifacts, or persist intermediate state, translate it into
|
|
@@ -764,7 +751,7 @@ updates.
|
|
|
764
751
|
and the current host policy allows agent launch. The worker must load
|
|
765
752
|
`mcp__sellable__get_subskill_prompt({ subskillName: "generate-messages" })`.
|
|
766
753
|
In Codex, YOLO/autonomous mode counts as campaign-scoped permission to use
|
|
767
|
-
|
|
754
|
+
this single Message Drafting background agent. If the user has not enabled
|
|
768
755
|
YOLO and has not explicitly asked for background agents, subagents, parallel
|
|
769
756
|
agents, delegation, or a message/bg agent in this campaign, ask once for
|
|
770
757
|
permission before loading the long message prompt in the parent. If
|
|
@@ -774,17 +761,24 @@ updates.
|
|
|
774
761
|
silently fall back to parent-thread message drafting; parent fallback is
|
|
775
762
|
allowed only when the user explicitly says to continue without a background
|
|
776
763
|
agent.
|
|
777
|
-
Do not use any alternate or examples-only message prompt. Message review
|
|
764
|
+
Do not use any alternate or examples-only message prompt. Message review and
|
|
765
|
+
message QA require Message Drafting output:
|
|
778
766
|
do not draft from a checklist, local markdown artifact, or parent-thread
|
|
779
767
|
intuition. Use campaign state, campaign brief content, selected source state, and
|
|
780
768
|
initial campaign-table execution slice rows as the source of truth; do not read stale local
|
|
781
769
|
markdown such as `message-validation.md`, inspect the database directly, or
|
|
782
|
-
synthesize local validation artifacts from general knowledge.
|
|
770
|
+
synthesize local validation artifacts from general knowledge. The handoff to
|
|
771
|
+
Message Drafting should pass compact basis only, not a long row-id list; the
|
|
772
|
+
branch loads current brief/table rows and validation assets itself.
|
|
783
773
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
784
774
|
watch link and see useful setup state immediately. Materialize the approved
|
|
785
775
|
source list, copy confirmed rows into the campaign, and internally process the
|
|
786
|
-
first campaign-table execution slice after the source is attached to the
|
|
787
|
-
|
|
776
|
+
first campaign-table execution slice after the source is attached to the
|
|
777
|
+
campaign; do not load prospect-setup registries/prompts before asking add
|
|
778
|
+
filters vs skip filters. Once the user answers, launch only Message Drafting
|
|
779
|
+
from the same campaign/table basis. If filters are approved, do filter/rubric
|
|
780
|
+
work inline in the parent thread. Do not queue workflow cells, attach a
|
|
781
|
+
sequence, or start until saved filters and the
|
|
788
782
|
message template/token rules are approved. When filters are chosen, immediately
|
|
789
783
|
call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
790
784
|
so the watched app moves to Filter Rules while rubrics are drafted/saved.
|