@sellable/mcp 0.1.269 → 0.1.272

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.
@@ -1,16 +1,42 @@
1
- # Premise Development
1
+ # Premise Development V2
2
2
 
3
3
  A strong post is not an idea with a better hook. A strong post is a valuable
4
4
  premise wrapped in a sharp opening.
5
5
 
6
- Use this stage after market/hook research and before hook candidates. Do not
7
- generate hook candidates until at least one `Premise Card` exists.
6
+ Use this stage after audience/hook research and before hook candidates. V2 premise
7
+ development also consumes the source post templates from hook research:
8
+ post positioning breakdowns, viral-post outlines, hook-to-body promise maps, and
9
+ body expression inputs.
10
+
11
+ Do not generate hook candidates until at least one `Premise Card` exists and at
12
+ least one source template has either been selected or explicitly rejected as a
13
+ poor fit.
8
14
 
9
15
  ## Goal
10
16
 
11
17
  Turn the raw idea into a real story, observed tension, or useful argument that a
12
18
  specific reader would care about.
13
19
 
20
+ Use this post tension framework when evaluating whether the premise can hold
21
+ attention:
22
+
23
+ ```text
24
+ Belief -> Contradiction -> Stakes -> Proof -> Mechanism -> Reframe -> Useful Move
25
+ ```
26
+
27
+ - `Belief`: what the reader already thinks or wants to be true
28
+ - `Contradiction`: what the source story reveals that does not fit the belief
29
+ - `Stakes`: what the reader loses if they keep believing the old version
30
+ - `Proof`: the scene, number, repeated pattern, or concrete artifact that makes
31
+ the contradiction credible
32
+ - `Mechanism`: why the thing actually works or fails
33
+ - `Reframe`: the sharper way to see the problem after the mechanism is clear
34
+ - `Useful Move`: what the reader can do, notice, stop doing, or test next
35
+
36
+ A post feels "edge of seat" when the hook creates a contradiction the target
37
+ reader cares about, the body delays the answer only while adding proof, and each
38
+ beat either raises tension or repays tension. If a beat does neither, cut it.
39
+
14
40
  The premise must answer:
15
41
 
16
42
  - who this is for
@@ -22,6 +48,8 @@ The premise must answer:
22
48
  - why now
23
49
  - why this user can credibly say it
24
50
  - what proof is available and what proof is missing
51
+ - which source template, if any, should shape the narrative
52
+ - which positioning sequence the user's post should follow
25
53
 
26
54
  If the premise has no real scene, no tension, and no reader value, stop before
27
55
  drafting. Ask for the missing story or save only a `needs_revision` premise
@@ -33,10 +61,14 @@ Before writing premise cards, search the available source material:
33
61
 
34
62
  - raw idea text
35
63
  - voice memo or transcript if provided
64
+ - `Transcript Worldview Packet` from create-post capture
36
65
  - `core/story-bank.md`
37
66
  - `core/answer-bank.md`
38
67
  - `core/proof-ledger.md`
39
68
  - `core/wins-ledger.md`
69
+ - `core/transcripts/INDEX.md`
70
+ - `core/content-memory/INDEX.md`, relevant clusters, cards, questions, and
71
+ post seeds
40
72
  - approved references and gold standards
41
73
  - current-session user corrections or rejections
42
74
 
@@ -48,11 +80,37 @@ Look for:
48
80
  - a before/after: what changed in the user's belief
49
81
  - a specific object: Slack note, customer call, campaign table, reply, list,
50
82
  demo, failed draft, stale idea, messy workflow
83
+ - repeated worldview: the user's recurring operating belief behind the idea
84
+ - hot-take ingredient: the specific advice, default behavior, or market cliche
85
+ the user is pushing against
51
86
 
52
87
  If no real story is present, use an observed pattern only if it is traceable to
53
88
  the raw source or memory. Mark the gap in the premise card. Do not fabricate a
54
89
  customer, call, outcome, date, metric, or private scene.
55
90
 
91
+ ## Worldview And Hot-Take Extraction
92
+
93
+ Before scoring premise cards, extract the user's source-backed worldview from
94
+ the transcript packet:
95
+
96
+ ```text
97
+ Worldview extraction:
98
+ - worldview claim:
99
+ - source transcript/cluster/card:
100
+ - repeated phrase or language pattern:
101
+ - lived proof behind it:
102
+ - common advice it challenges:
103
+ - hot take version:
104
+ - public-safe version:
105
+ - private/sensitive material to avoid:
106
+ - confidence: strong | medium | weak
107
+ ```
108
+
109
+ A good hot take is not just a contrarian sentence. It must trace to something
110
+ the user has said, seen, shipped, sold, or learned repeatedly. If the hot take
111
+ only exists because an outside creator framed it well, mark it as borrowed and
112
+ do not use it as the user's premise.
113
+
56
114
  ## Premise Cards
57
115
 
58
116
  Generate 3-5 premise cards before hooks. Each card must use this shape:
@@ -81,7 +139,7 @@ tension:
81
139
  reader value:
82
140
  <what the reader learns, sees differently, or can do after reading>
83
141
 
84
- why now / market heat:
142
+ why now / audience tension:
85
143
  <what current research says is resonating>
86
144
 
87
145
  credible why-us:
@@ -93,14 +151,32 @@ proof available:
93
151
  proof missing:
94
152
  <claims that cannot be made yet>
95
153
 
154
+ worldview source:
155
+ <transcript/cluster/card/source-backed belief used>
156
+
157
+ hot take:
158
+ <public-safe sharp version of the user's source-backed disagreement>
159
+
96
160
  best frame:
97
161
  story | contrarian take | teardown | founder confession | future thesis | lesson
98
162
 
163
+ source template fit:
164
+ <selected source template name or none>
165
+
166
+ positioning sequence to test:
167
+ <Category -> Category -> Category -> ...>
168
+
169
+ viral outline to adapt:
170
+ <beat names from selected source template, rewritten for this user's story>
171
+
99
172
  hook territories:
100
173
  - <territory 1>
101
174
  - <territory 2>
102
175
  - <territory 3>
103
176
 
177
+ body expression inputs:
178
+ - <line shape, proof slot, story beat, mechanism explanation, or closing move>
179
+
104
180
  risk:
105
181
  <why this premise might still be weak>
106
182
 
@@ -108,6 +184,214 @@ score:
108
184
  <1-100 with short reason>
109
185
  ```
110
186
 
187
+ ## Template-Aware Premise Selection
188
+
189
+ Do not treat source templates as decoration. A source template is useful only
190
+ when its narrative engine matches something the user can credibly say.
191
+
192
+ For each premise card, compare it against the selected keeper templates from
193
+ hook research:
194
+
195
+ ```text
196
+ Template fit check:
197
+ premise:
198
+ source_template:
199
+ template narrative engine:
200
+ matching user story/proof:
201
+ missing user story/proof:
202
+ positioning sequence fit:
203
+ hook promise fit:
204
+ body payoff fit:
205
+ voice fit:
206
+ borrow:
207
+ do not borrow:
208
+ fit verdict: strong | partial | weak | reject
209
+ ```
210
+
211
+ Reject a template when it depends on source-specific proof, celebrity reach,
212
+ personal context the user does not have, or a body structure that would force a
213
+ fake story. Prefer a less viral template that fits the user's real proof over a
214
+ more viral template that requires borrowed authority.
215
+
216
+ ## Viral Narrative Structure
217
+
218
+ Once a premise and source template are selected, create the user's viral-post
219
+ outline before writing body prose.
220
+
221
+ Use this format:
222
+
223
+ ```text
224
+ User viral-post outline:
225
+ selected_premise:
226
+ selected_source_template:
227
+ hook_promise:
228
+ see_more_tension:
229
+ body_payoff:
230
+ positioning_sequence:
231
+ <Category> -> <Category> -> <Category> -> ...
232
+
233
+ beats:
234
+ 1.
235
+ beat_name:
236
+ narrative_job:
237
+ user_story_or_proof:
238
+ positioning_categories:
239
+ reader_state_before:
240
+ reader_state_after:
241
+ line_shape_to_test:
242
+ proof_safety:
243
+ ```
244
+
245
+ The outline should preserve the source template's useful narrative jobs while
246
+ replacing all source-specific proof, scenes, status, jokes, and examples with
247
+ the user's material.
248
+
249
+ ## Body Expression Lab
250
+
251
+ After the selected hook and viral-post outline exist, generate body expression
252
+ candidates before writing the final draft. This is where the system tests
253
+ different ways to express the same structure.
254
+
255
+ Generate 5-8 body expression candidates. Every candidate must use:
256
+
257
+ - the same selected hook or hook territory
258
+ - the same selected premise
259
+ - the same viral-post outline
260
+ - the same positioning sequence
261
+ - only user-sourced story and proof
262
+
263
+ Each candidate should vary the expression, not the facts:
264
+
265
+ ```text
266
+ Body expression candidate:
267
+ name:
268
+ expression_strategy:
269
+ opening_after_hook:
270
+ beat_lines:
271
+ 1. <line or paragraph>
272
+ 2. <line or paragraph>
273
+ positioning_sequence_coverage:
274
+ hook_promise_repaid:
275
+ best_lines:
276
+ weak_lines:
277
+ proof_risk:
278
+ voice_risk:
279
+ score:
280
+ ```
281
+
282
+ Useful expression strategies:
283
+
284
+ - plain field guide
285
+ - founder confession
286
+ - proof-first roadmap
287
+ - teardown then replacement
288
+ - scene then lesson
289
+ - enemy naming then mechanism
290
+ - compact build-in-public note
291
+
292
+ Do not create candidates by changing the claim. Create candidates by changing
293
+ line order, amount of scene, proof placement, rhythm, and how the mechanism is
294
+ explained.
295
+
296
+ ## Combine Pass
297
+
298
+ After body expression candidates are scored, combine the best parts into one
299
+ draft outline before prose.
300
+
301
+ Record:
302
+
303
+ ```text
304
+ Combined body plan:
305
+ selected_hook:
306
+ selected_expression_parts:
307
+ lines_kept:
308
+ lines_rewritten:
309
+ lines_cut:
310
+ positioning_sequence_final:
311
+ hook_promise_repayment:
312
+ proof_gaps_remaining:
313
+ why_this_combination_wins:
314
+ ```
315
+
316
+ If no candidate repays the hook promise with real user proof, return to premise
317
+ development or ask the user for the missing story. Do not save a `ready` draft.
318
+
319
+ ## Pre-Draft Narrative Outline
320
+
321
+ Before final prose, produce a compact `Pre-Draft Narrative Outline`. This is the
322
+ user-visible argument skeleton that lets the user confirm what the post is
323
+ trying to say, in what order, and which proven body shapes are being adapted
324
+ before the system writes body copy.
325
+
326
+ Use this format:
327
+
328
+ ```text
329
+ Pre-Draft Narrative Outline
330
+ I. Hook and click debt
331
+ A. Selected hook: <selected hook>
332
+ B. Rendered mobile preview verdict: <pass | warn | fail + why>
333
+ C. What "see more" must repay: <the open loop the first body beat must answer>
334
+
335
+ II. Thesis the post will defend
336
+ A. One-sentence thesis: <the post's operating claim>
337
+ B. Reader being taught: <specific audience, not a broad persona>
338
+ C. Why this reader cares now: <timely pain, belief, or decision>
339
+
340
+ III. Operating model
341
+ A. Core equation or mechanism: <the model the post teaches>
342
+ B. Key definitions:
343
+ i. <term>: <plain definition + concrete examples>
344
+ ii. <term>: <plain definition + concrete examples>
345
+
346
+ IV. Body shape borrowed from posts that worked
347
+ A. Selected source template or no-template rationale: <source or rationale>
348
+ B. Source-message outline being adapted:
349
+ i. <source post + P1/P2/P3 branch sequence from the original message>
350
+ ii. <which original paragraph/line/phrase jobs matter most>
351
+ C. Working body pattern(s) being adapted:
352
+ i. <pattern name>: <beat order and why it works>
353
+ ii. <pattern name>: <beat order and why it works>
354
+ D. What gets borrowed:
355
+ i. <narrative job, sequence, transition, or proof order>
356
+ E. What must not be copied:
357
+ i. <source wording, creator-specific proof, joke, or context>
358
+
359
+ V. Narrative beats
360
+ A. Beat 1: <job, reader state before/after, example/proof>
361
+ i. Line shape or section label: <how it will appear>
362
+ ii. Concrete examples: <examples/numbers>
363
+ B. Beat 2: <job, reader state before/after, example/proof>
364
+ i. Line shape or section label: <how it will appear>
365
+ ii. Concrete examples: <examples/numbers>
366
+ C. Beat 3: <job, reader state before/after, example/proof>
367
+ i. Line shape or section label: <how it will appear>
368
+ ii. Concrete examples: <examples/numbers>
369
+
370
+ VI. Scan path and proof safety
371
+ A. Mobile scan path: <what skimmers learn from labels/numbers/close>
372
+ B. Proof claims:
373
+ i. <claim>: <source + public-safety status>
374
+ C. Abstractions to remove:
375
+ i. <abstract phrase> -> <concrete replacement>
376
+ D. Draft risks: <risk and how to avoid it>
377
+ ```
378
+
379
+ Quality gate:
380
+
381
+ - The outline must explain the post before the draft exists.
382
+ - The outline must be useful to a reader who only scans the finished post.
383
+ - The outline must include proof claims and risk before prose.
384
+ - The outline must define any operating terms that could be misunderstood.
385
+ - The outline must use `I.`, `A.`, and `i.` hierarchy. A flat field list fails.
386
+ - If the post is adapting bodies that worked, the outline must name the source
387
+ message outline being adapted and the body pattern, including which original
388
+ paragraph/line/phrase jobs transfer and what beat order, proof order, or
389
+ transition logic is being borrowed.
390
+ - If the post is a field guide, the narrative beats must show the hierarchy
391
+ before prose, such as best-to-worst, highest-to-lowest intent, or
392
+ source-to-outcome.
393
+ - If the outline cannot be made concrete, return to premise development.
394
+
111
395
  ## Premise Quality Gate
112
396
 
113
397
  A premise can move to hook generation only when it passes all of these:
@@ -118,7 +402,10 @@ A premise can move to hook generation only when it passes all of these:
118
402
  - `reader_value`: pass
119
403
  - `credible_speaker`: pass
120
404
  - `proof_safety`: pass
121
- - `market_heat`: pass or explained
405
+ - `audience_tension`: pass or explained
406
+ - `template_fit`: pass or explicitly no-template
407
+ - `hook_to_body_repayment`: pass
408
+ - `pre_draft_narrative_outline`: pass
122
409
 
123
410
  If any gate fails:
124
411
 
@@ -137,8 +424,11 @@ For each hook candidate, include:
137
424
  - which tension it opens
138
425
  - which reader value it implies
139
426
  - whether the real scene appears in the first screen or shortly after
427
+ - source template or no-template rationale
428
+ - hook promise the body must repay
140
429
 
141
430
  Reject hooks that are accurate but do not reveal the premise's tension or value.
431
+ Reject hooks that create a promise the selected viral-post outline cannot repay.
142
432
 
143
433
  ## Body Relationship
144
434
 
@@ -155,5 +445,6 @@ body outline:
155
445
  7. close returns to the premise without summarizing
156
446
  ```
157
447
 
158
- If this outline cannot be filled without inventing proof, return to premise
159
- development.
448
+ Replace this generic outline with the selected viral-post outline when a source
449
+ template is available. If the outline cannot be filled without inventing proof,
450
+ return to premise development.
@@ -9,31 +9,10 @@ Prospeo supports search + import in the campaign builder flow.
9
9
  ## Provider Decision Tree
10
10
 
11
11
  - Known account list or CSV: use `load_csv_domains` or `save_domain_filters`, then `search_prospeo`.
12
- - Current LinkedIn job-post intent: use `search_harvest_jobs`, review the job artifact, then use `confirm_harvest_job_companies` with selected Harvest job IDs to create a `domainFilterId`; only then call `search_prospeo` for hiring stakeholders at those companies. Harvest jobs are the account source, not a people-search replacement.
13
12
  - Company/account lookalikes: use `search_prospeo_companies`, review the account sample, then use `confirm_prospeo_company_accounts` with the returned `companySearchToken` to create a `domainFilterId`; only then call `search_prospeo` for people at those accounts. Account rows are not people leads yet.
14
13
  - Person search with known filters: use `search_prospeo` directly.
15
14
  - LinkedIn activity, content-source, or post-engagement intent: stay on Signal Discovery or Sales Nav, not Prospeo.
16
15
 
17
- Current LinkedIn job-post account sourcing must follow:
18
-
19
- ```text
20
- search_harvest_jobs -> confirm_harvest_job_companies -> search_prospeo
21
- ```
22
-
23
- Use `search_harvest_jobs` when the user's account-source intent is current
24
- LinkedIn job posts, for example "companies hiring Power BI developers in the US
25
- this month." The search tool writes review artifacts and returns a token or
26
- `mcp-harvest-job-search-token:*` reference. After reviewing selected jobs, call
27
- `confirm_harvest_job_companies` with selected Harvest job IDs only. It resolves
28
- real company website domains from selected job details and bounded
29
- `/linkedin/company` fallback, then returns a `domainFilterId` for
30
- `search_prospeo`.
31
-
32
- Do not paste LinkedIn company URLs as domains. Do not detail-fetch every job row
33
- by default; fetch details only for selected batches during confirmation. Use
34
- Prospeo directly when the user wants broader volume, company attributes,
35
- lookalikes, or people search without needing current LinkedIn job evidence.
36
-
37
16
  Company/account lookalikes must follow:
38
17
 
39
18
  ```text
@@ -0,0 +1,9 @@
1
+ {
2
+ "parallelMode": "wide",
3
+ "agentCount": 6,
4
+ "maxToolCallsPerAgent": 2,
5
+ "senderMaxAgents": 2,
6
+ "senderMaxToolCallsPerAgent": 3,
7
+ "progressMode": true,
8
+ "debugMode": true
9
+ }
@@ -1,182 +0,0 @@
1
- type ArtifactFormat = "markdown" | "csv" | "both";
2
- export interface SearchHarvestJobsInput {
3
- search?: string;
4
- searches?: string[];
5
- location?: string;
6
- geoId?: string;
7
- postedLimit?: "24h" | "week" | "month";
8
- sortBy?: "relevance" | "date";
9
- workplaceType?: string | string[];
10
- employmentType?: string | string[];
11
- experienceLevel?: string | string[];
12
- easyApply?: boolean;
13
- under10Applicants?: boolean;
14
- salary?: string;
15
- pages?: number;
16
- maxRows?: number;
17
- artifactFormat?: ArtifactFormat;
18
- outputDir?: string;
19
- fileBaseName?: string;
20
- }
21
- export interface ConfirmHarvestJobCompaniesInput {
22
- searchToken?: string;
23
- selectedJobIds?: string[];
24
- name?: string;
25
- outputDir?: string;
26
- fileBaseName?: string;
27
- [key: string]: unknown;
28
- }
29
- export declare const harvestJobToolDefinitions: ({
30
- name: string;
31
- description: string;
32
- inputSchema: {
33
- type: string;
34
- properties: {
35
- search: {
36
- type: string;
37
- };
38
- searches: {
39
- type: string;
40
- items: {
41
- type: string;
42
- };
43
- };
44
- location: {
45
- type: string;
46
- };
47
- geoId: {
48
- type: string;
49
- };
50
- postedLimit: {
51
- type: string;
52
- enum: string[];
53
- };
54
- sortBy: {
55
- type: string;
56
- enum: string[];
57
- };
58
- workplaceType: {
59
- oneOf: ({
60
- type: string;
61
- items?: undefined;
62
- } | {
63
- type: string;
64
- items: {
65
- type: string;
66
- };
67
- })[];
68
- };
69
- employmentType: {
70
- oneOf: ({
71
- type: string;
72
- items?: undefined;
73
- } | {
74
- type: string;
75
- items: {
76
- type: string;
77
- };
78
- })[];
79
- };
80
- experienceLevel: {
81
- oneOf: ({
82
- type: string;
83
- items?: undefined;
84
- } | {
85
- type: string;
86
- items: {
87
- type: string;
88
- };
89
- })[];
90
- };
91
- easyApply: {
92
- type: string;
93
- };
94
- under10Applicants: {
95
- type: string;
96
- };
97
- salary: {
98
- type: string;
99
- };
100
- pages: {
101
- type: string;
102
- description: string;
103
- };
104
- maxRows: {
105
- type: string;
106
- description: string;
107
- };
108
- artifactFormat: {
109
- type: string;
110
- enum: string[];
111
- description: string;
112
- };
113
- outputDir: {
114
- type: string;
115
- description: string;
116
- };
117
- fileBaseName: {
118
- type: string;
119
- description: string;
120
- };
121
- searchToken?: undefined;
122
- selectedJobIds?: undefined;
123
- name?: undefined;
124
- };
125
- required: never[];
126
- additionalProperties: boolean;
127
- };
128
- } | {
129
- name: string;
130
- description: string;
131
- inputSchema: {
132
- type: string;
133
- properties: {
134
- searchToken: {
135
- type: string;
136
- description: string;
137
- };
138
- selectedJobIds: {
139
- type: string;
140
- items: {
141
- type: string;
142
- };
143
- description: string;
144
- };
145
- name: {
146
- type: string;
147
- };
148
- outputDir: {
149
- type: string;
150
- description: string;
151
- };
152
- fileBaseName: {
153
- type: string;
154
- description: string;
155
- };
156
- search?: undefined;
157
- searches?: undefined;
158
- location?: undefined;
159
- geoId?: undefined;
160
- postedLimit?: undefined;
161
- sortBy?: undefined;
162
- workplaceType?: undefined;
163
- employmentType?: undefined;
164
- experienceLevel?: undefined;
165
- easyApply?: undefined;
166
- under10Applicants?: undefined;
167
- salary?: undefined;
168
- pages?: undefined;
169
- maxRows?: undefined;
170
- artifactFormat?: undefined;
171
- };
172
- required: string[];
173
- additionalProperties: boolean;
174
- };
175
- })[];
176
- export declare function searchHarvestJobs(input: SearchHarvestJobsInput): Promise<{
177
- [k: string]: unknown;
178
- }>;
179
- export declare function confirmHarvestJobCompanies(input: ConfirmHarvestJobCompaniesInput): Promise<{
180
- [k: string]: unknown;
181
- }>;
182
- export {};