@sellable/mcp 0.1.240 → 0.1.243
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 +2 -1
- package/dist/engage-memory.d.ts +1 -0
- package/dist/engage-memory.js +3 -0
- package/dist/identity-memory.d.ts +2 -0
- package/dist/identity-memory.js +5 -0
- package/dist/server.js +13 -1
- package/dist/tools/content-posts.d.ts +315 -0
- package/dist/tools/content-posts.js +370 -15
- package/dist/tools/engage-memory.js +1 -1
- package/dist/tools/registry.d.ts +204 -0
- package/package.json +1 -1
- package/skills/create-post/SKILL.md +132 -18
- package/skills/create-post/references/hook-research-playbook.md +69 -2
- package/skills/create-post/references/post-file-contract.md +24 -2
- package/skills/create-post/references/post-validation.md +101 -6
- package/skills/create-post/references/premise-development.md +159 -0
- package/skills/engage/SKILL.md +1 -0
- package/skills/engage/core/README.md +15 -12
package/dist/tools/registry.d.ts
CHANGED
|
@@ -1219,9 +1219,21 @@ export declare const allTools: ({
|
|
|
1219
1219
|
createdAt?: undefined;
|
|
1220
1220
|
draftId?: undefined;
|
|
1221
1221
|
hookResearchId?: undefined;
|
|
1222
|
+
priorDraftId?: undefined;
|
|
1223
|
+
iteration?: undefined;
|
|
1222
1224
|
body?: undefined;
|
|
1223
1225
|
validationReceipt?: undefined;
|
|
1224
1226
|
status?: undefined;
|
|
1227
|
+
updatedAt?: undefined;
|
|
1228
|
+
publishUrl?: undefined;
|
|
1229
|
+
activityId?: undefined;
|
|
1230
|
+
publishedAt?: undefined;
|
|
1231
|
+
finalText?: undefined;
|
|
1232
|
+
updateDraftStatus?: undefined;
|
|
1233
|
+
publishedPostId?: undefined;
|
|
1234
|
+
year?: undefined;
|
|
1235
|
+
metrics?: undefined;
|
|
1236
|
+
note?: undefined;
|
|
1225
1237
|
};
|
|
1226
1238
|
required: string[];
|
|
1227
1239
|
additionalProperties: boolean;
|
|
@@ -1255,6 +1267,15 @@ export declare const allTools: ({
|
|
|
1255
1267
|
hookResearchId: {
|
|
1256
1268
|
type: string;
|
|
1257
1269
|
};
|
|
1270
|
+
priorDraftId: {
|
|
1271
|
+
type: string;
|
|
1272
|
+
description: string;
|
|
1273
|
+
};
|
|
1274
|
+
iteration: {
|
|
1275
|
+
type: string;
|
|
1276
|
+
description: string;
|
|
1277
|
+
additionalProperties: boolean;
|
|
1278
|
+
};
|
|
1258
1279
|
title: {
|
|
1259
1280
|
type: string;
|
|
1260
1281
|
};
|
|
@@ -1282,6 +1303,189 @@ export declare const allTools: ({
|
|
|
1282
1303
|
selectedPatterns?: undefined;
|
|
1283
1304
|
previewBudget?: undefined;
|
|
1284
1305
|
notes?: undefined;
|
|
1306
|
+
updatedAt?: undefined;
|
|
1307
|
+
publishUrl?: undefined;
|
|
1308
|
+
activityId?: undefined;
|
|
1309
|
+
publishedAt?: undefined;
|
|
1310
|
+
finalText?: undefined;
|
|
1311
|
+
updateDraftStatus?: undefined;
|
|
1312
|
+
publishedPostId?: undefined;
|
|
1313
|
+
year?: undefined;
|
|
1314
|
+
metrics?: undefined;
|
|
1315
|
+
note?: undefined;
|
|
1316
|
+
};
|
|
1317
|
+
required: string[];
|
|
1318
|
+
additionalProperties: boolean;
|
|
1319
|
+
};
|
|
1320
|
+
} | {
|
|
1321
|
+
name: string;
|
|
1322
|
+
description: string;
|
|
1323
|
+
inputSchema: {
|
|
1324
|
+
type: string;
|
|
1325
|
+
properties: {
|
|
1326
|
+
draftId: {
|
|
1327
|
+
type: string;
|
|
1328
|
+
};
|
|
1329
|
+
hookResearchId: {
|
|
1330
|
+
type: string;
|
|
1331
|
+
};
|
|
1332
|
+
priorDraftId: {
|
|
1333
|
+
type: string;
|
|
1334
|
+
description?: undefined;
|
|
1335
|
+
};
|
|
1336
|
+
iteration: {
|
|
1337
|
+
type: string;
|
|
1338
|
+
description: string;
|
|
1339
|
+
additionalProperties: boolean;
|
|
1340
|
+
};
|
|
1341
|
+
title: {
|
|
1342
|
+
type: string;
|
|
1343
|
+
};
|
|
1344
|
+
body: {
|
|
1345
|
+
type: string;
|
|
1346
|
+
};
|
|
1347
|
+
validationReceipt: {
|
|
1348
|
+
description: string;
|
|
1349
|
+
};
|
|
1350
|
+
status: {
|
|
1351
|
+
type: string;
|
|
1352
|
+
};
|
|
1353
|
+
updatedAt: {
|
|
1354
|
+
type: string;
|
|
1355
|
+
};
|
|
1356
|
+
rawSource?: undefined;
|
|
1357
|
+
distilledBrief?: undefined;
|
|
1358
|
+
ideaId?: undefined;
|
|
1359
|
+
sourceType?: undefined;
|
|
1360
|
+
sourceUrl?: undefined;
|
|
1361
|
+
capturedAt?: undefined;
|
|
1362
|
+
researchId?: undefined;
|
|
1363
|
+
topic?: undefined;
|
|
1364
|
+
keywords?: undefined;
|
|
1365
|
+
sourcePosts?: undefined;
|
|
1366
|
+
selectedPatterns?: undefined;
|
|
1367
|
+
previewBudget?: undefined;
|
|
1368
|
+
notes?: undefined;
|
|
1369
|
+
createdAt?: undefined;
|
|
1370
|
+
publishUrl?: undefined;
|
|
1371
|
+
activityId?: undefined;
|
|
1372
|
+
publishedAt?: undefined;
|
|
1373
|
+
finalText?: undefined;
|
|
1374
|
+
updateDraftStatus?: undefined;
|
|
1375
|
+
publishedPostId?: undefined;
|
|
1376
|
+
year?: undefined;
|
|
1377
|
+
metrics?: undefined;
|
|
1378
|
+
note?: undefined;
|
|
1379
|
+
};
|
|
1380
|
+
required: string[];
|
|
1381
|
+
additionalProperties: boolean;
|
|
1382
|
+
};
|
|
1383
|
+
} | {
|
|
1384
|
+
name: string;
|
|
1385
|
+
description: string;
|
|
1386
|
+
inputSchema: {
|
|
1387
|
+
type: string;
|
|
1388
|
+
properties: {
|
|
1389
|
+
draftId: {
|
|
1390
|
+
type: string;
|
|
1391
|
+
};
|
|
1392
|
+
publishUrl: {
|
|
1393
|
+
type: string;
|
|
1394
|
+
};
|
|
1395
|
+
activityId: {
|
|
1396
|
+
type: string;
|
|
1397
|
+
};
|
|
1398
|
+
publishedAt: {
|
|
1399
|
+
type: string;
|
|
1400
|
+
};
|
|
1401
|
+
finalText: {
|
|
1402
|
+
type: string;
|
|
1403
|
+
};
|
|
1404
|
+
title: {
|
|
1405
|
+
type: string;
|
|
1406
|
+
};
|
|
1407
|
+
updateDraftStatus: {
|
|
1408
|
+
type: string;
|
|
1409
|
+
description: string;
|
|
1410
|
+
};
|
|
1411
|
+
rawSource?: undefined;
|
|
1412
|
+
distilledBrief?: undefined;
|
|
1413
|
+
ideaId?: undefined;
|
|
1414
|
+
sourceType?: undefined;
|
|
1415
|
+
sourceUrl?: undefined;
|
|
1416
|
+
capturedAt?: undefined;
|
|
1417
|
+
researchId?: undefined;
|
|
1418
|
+
topic?: undefined;
|
|
1419
|
+
keywords?: undefined;
|
|
1420
|
+
sourcePosts?: undefined;
|
|
1421
|
+
selectedPatterns?: undefined;
|
|
1422
|
+
previewBudget?: undefined;
|
|
1423
|
+
notes?: undefined;
|
|
1424
|
+
createdAt?: undefined;
|
|
1425
|
+
hookResearchId?: undefined;
|
|
1426
|
+
priorDraftId?: undefined;
|
|
1427
|
+
iteration?: undefined;
|
|
1428
|
+
body?: undefined;
|
|
1429
|
+
validationReceipt?: undefined;
|
|
1430
|
+
status?: undefined;
|
|
1431
|
+
updatedAt?: undefined;
|
|
1432
|
+
publishedPostId?: undefined;
|
|
1433
|
+
year?: undefined;
|
|
1434
|
+
metrics?: undefined;
|
|
1435
|
+
note?: undefined;
|
|
1436
|
+
};
|
|
1437
|
+
required: string[];
|
|
1438
|
+
additionalProperties: boolean;
|
|
1439
|
+
};
|
|
1440
|
+
} | {
|
|
1441
|
+
name: string;
|
|
1442
|
+
description: string;
|
|
1443
|
+
inputSchema: {
|
|
1444
|
+
type: string;
|
|
1445
|
+
properties: {
|
|
1446
|
+
publishedPostId: {
|
|
1447
|
+
type: string;
|
|
1448
|
+
};
|
|
1449
|
+
year: {
|
|
1450
|
+
type: string;
|
|
1451
|
+
};
|
|
1452
|
+
capturedAt: {
|
|
1453
|
+
type: string;
|
|
1454
|
+
};
|
|
1455
|
+
metrics: {
|
|
1456
|
+
type: string;
|
|
1457
|
+
additionalProperties: boolean;
|
|
1458
|
+
};
|
|
1459
|
+
note: {
|
|
1460
|
+
type: string;
|
|
1461
|
+
};
|
|
1462
|
+
rawSource?: undefined;
|
|
1463
|
+
title?: undefined;
|
|
1464
|
+
distilledBrief?: undefined;
|
|
1465
|
+
ideaId?: undefined;
|
|
1466
|
+
sourceType?: undefined;
|
|
1467
|
+
sourceUrl?: undefined;
|
|
1468
|
+
researchId?: undefined;
|
|
1469
|
+
topic?: undefined;
|
|
1470
|
+
keywords?: undefined;
|
|
1471
|
+
sourcePosts?: undefined;
|
|
1472
|
+
selectedPatterns?: undefined;
|
|
1473
|
+
previewBudget?: undefined;
|
|
1474
|
+
notes?: undefined;
|
|
1475
|
+
createdAt?: undefined;
|
|
1476
|
+
draftId?: undefined;
|
|
1477
|
+
hookResearchId?: undefined;
|
|
1478
|
+
priorDraftId?: undefined;
|
|
1479
|
+
iteration?: undefined;
|
|
1480
|
+
body?: undefined;
|
|
1481
|
+
validationReceipt?: undefined;
|
|
1482
|
+
status?: undefined;
|
|
1483
|
+
updatedAt?: undefined;
|
|
1484
|
+
publishUrl?: undefined;
|
|
1485
|
+
activityId?: undefined;
|
|
1486
|
+
publishedAt?: undefined;
|
|
1487
|
+
finalText?: undefined;
|
|
1488
|
+
updateDraftStatus?: undefined;
|
|
1285
1489
|
};
|
|
1286
1490
|
required: string[];
|
|
1287
1491
|
additionalProperties: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-post
|
|
3
|
-
description: Capture rough LinkedIn post ideas, preserve the raw source, research currently working hooks, and save validated drafts in the user's voice.
|
|
3
|
+
description: Capture rough LinkedIn post ideas, preserve the raw source, develop a valuable premise, research currently working hooks, and save validated drafts in the user's voice.
|
|
4
4
|
visibility: internal
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ visibility: internal
|
|
|
9
9
|
<role>
|
|
10
10
|
You are the Sellable LinkedIn post writer for a specific user.
|
|
11
11
|
|
|
12
|
-
Your job is not to invent a "viral" post from thin air. Your job is to preserve the user's raw idea, load their real voice/proof/stories, research what hooks have been
|
|
12
|
+
Your job is not to invent a "viral" post from thin air. Your job is to preserve the user's raw idea, load their real voice/proof/stories, research what ideas and hooks have been resonating over the past few months, extract what the audience implicitly believes/wants/resents/fears, develop a real premise with story/tension/reader value, choose a credible controversial angle to test, and save a validated draft that sounds like them.
|
|
13
13
|
|
|
14
14
|
Hard fail patterns:
|
|
15
15
|
|
|
@@ -18,17 +18,19 @@ Hard fail patterns:
|
|
|
18
18
|
- outbound, campaign, cold email, or lead-generation workflow behavior
|
|
19
19
|
- comment drafting behavior
|
|
20
20
|
- drafts that skip raw idea capture
|
|
21
|
+
- drafts that skip premise development
|
|
21
22
|
- hooks copied verbatim from another creator
|
|
22
23
|
- using `~/.sellable/configs/content/linkedin-posts-drafts.md` as the normal save target
|
|
23
24
|
</role>
|
|
24
25
|
|
|
25
26
|
<scope>
|
|
26
|
-
V1 is posts-only and
|
|
27
|
+
V1 is posts-only and premise-first, hook-second.
|
|
27
28
|
|
|
28
29
|
Do:
|
|
29
30
|
|
|
30
31
|
- capture rough ideas, voice memos, freestyle notes, and ad hoc prompts
|
|
31
32
|
- research currently working LinkedIn hooks
|
|
33
|
+
- develop premise cards with real story/observed tension and reader value
|
|
32
34
|
- generate hook candidates
|
|
33
35
|
- draft a post body that stays true to the source idea
|
|
34
36
|
- run validation before calling a draft ready
|
|
@@ -49,8 +51,9 @@ Before drafting, load all required assets with `mcp__sellable__get_subskill_asse
|
|
|
49
51
|
|
|
50
52
|
1. `subskillName: "create-post", assetPath: "references/post-file-contract.md"`
|
|
51
53
|
2. `subskillName: "create-post", assetPath: "references/hook-research-playbook.md"`
|
|
52
|
-
3. `subskillName: "create-post", assetPath: "references/
|
|
53
|
-
4. `subskillName: "create-post", assetPath: "references/
|
|
54
|
+
3. `subskillName: "create-post", assetPath: "references/premise-development.md"`
|
|
55
|
+
4. `subskillName: "create-post", assetPath: "references/post-validation.md"`
|
|
56
|
+
5. `subskillName: "create-post", assetPath: "references/gold-standard-post-pack.md"`
|
|
54
57
|
|
|
55
58
|
If any required asset is missing, unreadable, truncated without continuation, or internally inconsistent, return:
|
|
56
59
|
|
|
@@ -75,8 +78,12 @@ Use these MCP tools when available:
|
|
|
75
78
|
- `mcp__sellable__list_post_ideas`
|
|
76
79
|
- `mcp__sellable__save_hook_research`
|
|
77
80
|
- `mcp__sellable__save_post_draft`
|
|
81
|
+
- `mcp__sellable__update_post_draft`
|
|
82
|
+
- `mcp__sellable__list_post_draft_iterations`
|
|
78
83
|
- `mcp__sellable__get_post_draft`
|
|
79
84
|
- `mcp__sellable__mark_post_published`
|
|
85
|
+
- `mcp__sellable__get_published_post`
|
|
86
|
+
- `mcp__sellable__update_published_post_metrics`
|
|
80
87
|
- `mcp__sellable__list_published_posts`
|
|
81
88
|
- `mcp__sellable__search_engagement_posts`
|
|
82
89
|
- `mcp__sellable__fetch_linkedin_posts`
|
|
@@ -101,10 +108,19 @@ Load user memory before hook generation or drafting:
|
|
|
101
108
|
- `core/answer-bank.md`
|
|
102
109
|
- `core/context-modes.md`
|
|
103
110
|
- `core/decision-rules.md`
|
|
111
|
+
- `core/content-memory/**`
|
|
104
112
|
- `core/references/**`
|
|
105
113
|
3. Use `memory.postWritingRules` returned by `mcp__sellable__get_engage_memory` when present. If the host permits direct file reads and the memory response does not include it, read post-specific writing rules from `~/.sellable/configs/writing/posts.md` when available.
|
|
106
114
|
4. Read the gold-standard post pack from `core/references/linkedin-posts/INDEX.md` and its approved copied/distilled examples when present. `get_engage_memory` may return this through the composed `core/references/**` indexes; if the host permits direct file reads, load the files directly when needed.
|
|
107
115
|
|
|
116
|
+
Treat `get_engage_memory` as the backward-compatible tool name for unified
|
|
117
|
+
Sellable memory. For transcript-derived posts, rough source notes, recurring
|
|
118
|
+
ideas, or post seeds, load `core/content-memory/**` before hook generation.
|
|
119
|
+
Use it to find the idea cluster, story/proof/question cards, proof gaps, and
|
|
120
|
+
post seeds. If the cluster is weak, ask workshop questions before drafting. If
|
|
121
|
+
the seed is mature, use it as the source packet for premise development and
|
|
122
|
+
external LinkedIn research.
|
|
123
|
+
|
|
108
124
|
`writing/posts.md` is a post-writing config file, not a draft library. Treat its structure this way:
|
|
109
125
|
|
|
110
126
|
- Top scratch or `## Draft Rule Candidates` sections are candidate taste notes only.
|
|
@@ -130,6 +146,8 @@ Durable write-back targets:
|
|
|
130
146
|
privacy decisions, and downstream prompt/operator notes
|
|
131
147
|
- `core/story-bank.md` for reusable first-person stories
|
|
132
148
|
- `core/transcripts/INDEX.md` for source interview or voice-memo references
|
|
149
|
+
- `core/content-memory/INDEX.md`, cluster files, and card files for evolving
|
|
150
|
+
transcript-derived ideas, story cards, proof cards, questions, and post seeds
|
|
133
151
|
- `core/references/linkedin-posts/INDEX.md` and adjacent files for approved
|
|
134
152
|
gold-standard post references
|
|
135
153
|
- `discovery/influencers.md` for approved creators/persons the user wants the
|
|
@@ -159,9 +177,10 @@ Use when the user gives an existing idea ID.
|
|
|
159
177
|
1. Call `mcp__sellable__get_post_idea({ ideaId })`.
|
|
160
178
|
2. Treat the idea's raw source as immutable source material.
|
|
161
179
|
3. Run hook research.
|
|
162
|
-
4.
|
|
163
|
-
5.
|
|
164
|
-
6.
|
|
180
|
+
4. Develop and select a premise card.
|
|
181
|
+
5. Save hook research.
|
|
182
|
+
6. Draft and validate.
|
|
183
|
+
7. Save the draft.
|
|
165
184
|
|
|
166
185
|
## Capture Mode
|
|
167
186
|
|
|
@@ -171,9 +190,10 @@ Use when the user gives a new rough idea, voice memo transcript, freestyle note,
|
|
|
171
190
|
2. Preserve the raw source exactly.
|
|
172
191
|
3. Distill only what the user actually said.
|
|
173
192
|
4. Run hook research.
|
|
174
|
-
5.
|
|
175
|
-
6.
|
|
176
|
-
7.
|
|
193
|
+
5. Develop and select a premise card.
|
|
194
|
+
6. Save hook research.
|
|
195
|
+
7. Draft and validate.
|
|
196
|
+
8. Save the draft.
|
|
177
197
|
|
|
178
198
|
## Ad Hoc Mode
|
|
179
199
|
|
|
@@ -267,6 +287,8 @@ The research worker must return a compact packet only:
|
|
|
267
287
|
|
|
268
288
|
- source examples kept and rejected
|
|
269
289
|
- full adapted hook blocks
|
|
290
|
+
- market belief map: resonating ideas, implicit beliefs, audience wants, resentments, fears, and credible controversy angles
|
|
291
|
+
- premise inputs: real scenes, observed tensions, reader value openings, and proof gaps
|
|
270
292
|
- exact phrase patterns and sentence shapes
|
|
271
293
|
- body structures and exact body language moves
|
|
272
294
|
- preview measurements
|
|
@@ -286,10 +308,12 @@ Default flow:
|
|
|
286
308
|
5. If full text cannot be matched, record `full_text_unavailable` and use only the preview. Do not invent missing body details.
|
|
287
309
|
6. Weigh shares/reposts above comments, comments above reactions, and reactions as weak reach unless paired with stronger signals. If shares/reposts are unavailable, record `repost_data_unavailable`.
|
|
288
310
|
7. Penalize lead-magnet or giveaway mechanics unless the user explicitly asks for a lead magnet post.
|
|
289
|
-
8.
|
|
290
|
-
9. Extract
|
|
311
|
+
8. Build a market belief map before hook generation: what the space is rewarding, what the audience implicitly believes, what they want permission to say, what they resent or fear, what they will argue with, and which controversial angle the user can credibly own. If the user's raw idea is internally coherent but not attached to a live market tension, do not draft from the internal idea alone; present stronger directions or rewrite the draft angle around the external tension.
|
|
312
|
+
9. Extract premise inputs: real story/scene possibilities, observed tensions, useful reader takeaways, and proof gaps. A good hook cannot rescue a premise with no value.
|
|
313
|
+
10. For story posts, extract the story mechanism that made the post work, not just the first line.
|
|
314
|
+
11. Extract hook structures plus specific reusable words, phrases, sentence
|
|
291
315
|
shapes, transitions, and body language patterns.
|
|
292
|
-
|
|
316
|
+
12. Save the research with `mcp__sellable__save_hook_research`.
|
|
293
317
|
|
|
294
318
|
Record provenance:
|
|
295
319
|
|
|
@@ -305,6 +329,8 @@ Record provenance:
|
|
|
305
329
|
- full-text match status
|
|
306
330
|
- source hook preview measurements and whether they came from full text or a search preview
|
|
307
331
|
- selected hook patterns
|
|
332
|
+
- market belief map and selected controversy
|
|
333
|
+
- premise cards and selected premise
|
|
308
334
|
- exact phrase patterns and sentence shapes
|
|
309
335
|
- body structures and body language patterns
|
|
310
336
|
- why each pattern fits the user's idea and voice
|
|
@@ -337,6 +363,19 @@ Research status:
|
|
|
337
363
|
Best source examples:
|
|
338
364
|
1. author, URL, engagement, why kept, why not copied
|
|
339
365
|
|
|
366
|
+
Market belief map:
|
|
367
|
+
- resonating ideas:
|
|
368
|
+
- implicit beliefs:
|
|
369
|
+
- audience wants:
|
|
370
|
+
- audience resentments:
|
|
371
|
+
- audience fears:
|
|
372
|
+
- controversial angles to test:
|
|
373
|
+
- avoid because:
|
|
374
|
+
- selected controversy:
|
|
375
|
+
|
|
376
|
+
Premise cards:
|
|
377
|
+
1. premise + real story/scene + tension + reader value + proof gap + score
|
|
378
|
+
|
|
340
379
|
Hook patterns learned:
|
|
341
380
|
1. full adapted hook block
|
|
342
381
|
- source mechanism:
|
|
@@ -368,20 +407,51 @@ Save recommendations:
|
|
|
368
407
|
- gold-standard candidates:
|
|
369
408
|
|
|
370
409
|
Recommended draft directions:
|
|
371
|
-
1. hook block + body structure
|
|
372
|
-
2. hook block + body structure
|
|
373
|
-
3. hook block + body structure
|
|
410
|
+
1. premise card + hook block + body structure
|
|
411
|
+
2. premise card + hook block + body structure
|
|
412
|
+
3. premise card + hook block + body structure
|
|
374
413
|
```
|
|
375
414
|
|
|
376
415
|
Keep this report concise enough to read, but concrete enough that another agent
|
|
377
416
|
could draft from it without redoing research.
|
|
378
417
|
|
|
418
|
+
## Step 1.75: Premise Development
|
|
419
|
+
|
|
420
|
+
Use `references/premise-development.md`.
|
|
421
|
+
|
|
422
|
+
Generate 3-5 `Premise Card` candidates from the raw idea, market research, core
|
|
423
|
+
memory, story/proof files, and current-session user feedback. Each card must
|
|
424
|
+
include a real story/scene or observed pattern, target reader, common belief,
|
|
425
|
+
contrarian truth, tension, reader value, proof available, proof missing, and a
|
|
426
|
+
score.
|
|
427
|
+
|
|
428
|
+
Select the strongest premise before hook generation. The selected premise must
|
|
429
|
+
pass:
|
|
430
|
+
|
|
431
|
+
- `specific_scene_or_pattern`
|
|
432
|
+
- `clear_reader`
|
|
433
|
+
- `visible_tension`
|
|
434
|
+
- `reader_value`
|
|
435
|
+
- `credible_speaker`
|
|
436
|
+
- `proof_safety`
|
|
437
|
+
- `market_heat`
|
|
438
|
+
|
|
439
|
+
If the idea has market heat but no real scene, ask for the missing scene unless
|
|
440
|
+
the user explicitly requested an immediate draft. For immediate draft mode, use
|
|
441
|
+
only source-backed observed patterns and save the draft as `needs_revision`
|
|
442
|
+
unless the premise still has concrete reader value.
|
|
443
|
+
|
|
379
444
|
## Step 2: Hook Candidates
|
|
380
445
|
|
|
381
|
-
Generate at least 12 hook candidates
|
|
446
|
+
Generate at least 12 hook candidates from the selected premise unless the user
|
|
447
|
+
requested a smaller set. Do not generate hooks directly from the raw idea before
|
|
448
|
+
the premise is selected.
|
|
382
449
|
|
|
383
450
|
Each hook must include:
|
|
384
451
|
|
|
452
|
+
- selected premise
|
|
453
|
+
- premise tension opened
|
|
454
|
+
- reader value implied
|
|
385
455
|
- source hook pattern
|
|
386
456
|
- why it fits this idea
|
|
387
457
|
- `charCount`
|
|
@@ -426,6 +496,7 @@ fallback in the validation receipt.
|
|
|
426
496
|
Draft from:
|
|
427
497
|
|
|
428
498
|
- exact raw idea
|
|
499
|
+
- selected premise card
|
|
429
500
|
- selected hook
|
|
430
501
|
- hook research artifact
|
|
431
502
|
- user's core memory
|
|
@@ -443,12 +514,16 @@ Every saved draft needs a validation receipt with:
|
|
|
443
514
|
|
|
444
515
|
- source idea ID
|
|
445
516
|
- hook research ID
|
|
517
|
+
- iteration metadata: version, priorDraftId, changeIntent, what changed,
|
|
518
|
+
what improved, what got worse, score, and verdict
|
|
519
|
+
- selected premise card
|
|
446
520
|
- candidate hooks considered
|
|
447
521
|
- selected hook and why
|
|
448
522
|
- proof claims used and source
|
|
449
523
|
- story/proof files consulted
|
|
450
524
|
- gold standards consulted
|
|
451
525
|
- LinkedIn preview audit
|
|
526
|
+
- premise/value audit findings
|
|
452
527
|
- simplifier/concrete-language audit findings
|
|
453
528
|
- voice audit findings
|
|
454
529
|
- anti-AI audit findings
|
|
@@ -463,6 +538,32 @@ If validation fails, do not save the draft as `ready`. Save as `needs_revision`
|
|
|
463
538
|
|
|
464
539
|
Call `mcp__sellable__save_post_draft`.
|
|
465
540
|
|
|
541
|
+
Use versioned draft IDs for multiple attempts on the same idea:
|
|
542
|
+
|
|
543
|
+
```text
|
|
544
|
+
draft_YYYYMMDD_slug_v1
|
|
545
|
+
draft_YYYYMMDD_slug_v2
|
|
546
|
+
draft_YYYYMMDD_slug_v3
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
Keep the `ideaId` stable across versions. Treat `v1` as the baseline unless the
|
|
550
|
+
user explicitly picks another draft as the baseline. For `v2+`, pass
|
|
551
|
+
`priorDraftId` and include an iteration receipt comparing the new draft against
|
|
552
|
+
the prior draft. If the user asks to patch the same version's receipt, status,
|
|
553
|
+
or copy without creating a new version, call `mcp__sellable__update_post_draft`.
|
|
554
|
+
|
|
555
|
+
When deciding whether a draft improved, use:
|
|
556
|
+
|
|
557
|
+
- hook
|
|
558
|
+
- proof
|
|
559
|
+
- voice
|
|
560
|
+
- specificity
|
|
561
|
+
- skimmability
|
|
562
|
+
- publish confidence
|
|
563
|
+
|
|
564
|
+
Do not mark a draft as improved only because it is newer. Preserve what got
|
|
565
|
+
worse.
|
|
566
|
+
|
|
466
567
|
Drafts live under:
|
|
467
568
|
|
|
468
569
|
```text
|
|
@@ -487,6 +588,12 @@ Published post records live under:
|
|
|
487
588
|
~/.sellable/content/linkedin/published/
|
|
488
589
|
```
|
|
489
590
|
|
|
591
|
+
When the user publishes a post or provides a LinkedIn URL, call
|
|
592
|
+
`mcp__sellable__mark_post_published`. This records the published post separately
|
|
593
|
+
and marks the source draft as `published` by default. When later performance
|
|
594
|
+
data is available, call `mcp__sellable__update_published_post_metrics` to append
|
|
595
|
+
metric snapshots for learning.
|
|
596
|
+
|
|
490
597
|
</pipeline>
|
|
491
598
|
|
|
492
599
|
<legacy>
|
|
@@ -504,8 +611,15 @@ idea_id: <id or none>
|
|
|
504
611
|
hook_research_id: <id or none>
|
|
505
612
|
draft_id: <id or none>
|
|
506
613
|
draft_path: <path or none>
|
|
614
|
+
iteration:
|
|
615
|
+
version: <v1/v2/etc>
|
|
616
|
+
prior_draft_id: <id or none>
|
|
617
|
+
verdict: <baseline | keep | revise | reject | publish_candidate>
|
|
618
|
+
score: <compact score object>
|
|
619
|
+
selected_premise: <premise or none>
|
|
507
620
|
selected_hook: <hook>
|
|
508
621
|
validation_summary:
|
|
622
|
+
premise_value: pass | needs_user_input | needs_revision
|
|
509
623
|
proof: pass | needs_user_input | blocked
|
|
510
624
|
voice: pass | needs_revision
|
|
511
625
|
anti_ai: pass | needs_revision
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Hook Research Playbook
|
|
2
2
|
|
|
3
|
-
Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`.
|
|
3
|
+
Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`. The goal is not only to find hooks. The goal is to find what the market is currently rewarding, what the audience implicitly believes/wants/resents/fears, which controversial angle the user can credibly test, and what premise would deliver real reader value.
|
|
4
4
|
|
|
5
5
|
## Search Inputs
|
|
6
6
|
|
|
@@ -29,6 +29,8 @@ Worker owns:
|
|
|
29
29
|
- full-text matching by URL/activity ID
|
|
30
30
|
- duplicate removal
|
|
31
31
|
- lead-magnet, giveaway, engagement-bait, and off-voice filtering
|
|
32
|
+
- market belief mapping across kept and rejected examples
|
|
33
|
+
- premise input extraction: real scenes, observed tensions, reader value, proof gaps
|
|
32
34
|
- hook opening measurement
|
|
33
35
|
- exact phrase-pattern extraction
|
|
34
36
|
- body-structure extraction
|
|
@@ -49,6 +51,9 @@ Worker output must be a compressed research packet, not a data dump:
|
|
|
49
51
|
Research packet:
|
|
50
52
|
- sources kept: max 8
|
|
51
53
|
- sources rejected: max 8
|
|
54
|
+
- market belief map: max 8 bullets
|
|
55
|
+
- controversy candidates: max 8
|
|
56
|
+
- premise inputs: max 8
|
|
52
57
|
- full adapted hook blocks: max 12
|
|
53
58
|
- exact phrase patterns: max 20
|
|
54
59
|
- body patterns: max 8
|
|
@@ -113,6 +118,67 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
|
|
|
113
118
|
- "like and comment"
|
|
114
119
|
- broad giveaway framing that makes engagement inflate without proving the hook/body worked
|
|
115
120
|
|
|
121
|
+
## Market Belief Map
|
|
122
|
+
|
|
123
|
+
Before selecting a hook or writing a draft, synthesize a market belief map from
|
|
124
|
+
the kept and rejected posts. This is the step that prevents an internally
|
|
125
|
+
coherent post from becoming externally boring.
|
|
126
|
+
|
|
127
|
+
Record:
|
|
128
|
+
|
|
129
|
+
- resonating ideas: what topics or claims are repeatedly earning real
|
|
130
|
+
engagement in the last 30-120 days
|
|
131
|
+
- implicit beliefs: what the audience seems to already believe but may not say
|
|
132
|
+
directly
|
|
133
|
+
- audience wants: what they want to feel, learn, try, buy, avoid, or be early to
|
|
134
|
+
- audience resentments: what they are tired of, embarrassed by, or angry about
|
|
135
|
+
- audience fears: what risk would make them hesitate
|
|
136
|
+
- argument bait: what they will plausibly disagree with in comments
|
|
137
|
+
- credible controversy: what the user can argue without borrowing someone else's
|
|
138
|
+
proof or pretending to have data they do not have
|
|
139
|
+
- avoid list: ideas that are inflated by comment bait, stale category claims,
|
|
140
|
+
celebrity reach, giveaway mechanics, or poor voice fit
|
|
141
|
+
|
|
142
|
+
The selected direction must include:
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
Selected controversy:
|
|
146
|
+
<one sentence>
|
|
147
|
+
|
|
148
|
+
Why this audience would engage:
|
|
149
|
+
<specific belief/want/resentment/fear>
|
|
150
|
+
|
|
151
|
+
Why this user can credibly say it:
|
|
152
|
+
<raw idea, memory, story, proof, or product mechanism>
|
|
153
|
+
|
|
154
|
+
What not to claim:
|
|
155
|
+
<unsupported metric, borrowed proof, or hype phrase to avoid>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
If the raw idea is true but the market belief map does not show a live tension,
|
|
159
|
+
do not draft from the raw idea as-is. Present stronger directions or reframe the
|
|
160
|
+
idea around the closest supported external tension.
|
|
161
|
+
|
|
162
|
+
## Premise Inputs
|
|
163
|
+
|
|
164
|
+
After the market belief map, extract the ingredients needed for premise
|
|
165
|
+
development. Do this before hook generation.
|
|
166
|
+
|
|
167
|
+
Record:
|
|
168
|
+
|
|
169
|
+
- real story or scene candidates from the raw idea, memory, transcript, or
|
|
170
|
+
current-session context
|
|
171
|
+
- observed pattern candidates when no first-person story is available
|
|
172
|
+
- visible tension: the uncomfortable gap, cost, contradiction, or tradeoff
|
|
173
|
+
- common belief: what the audience probably believes right now
|
|
174
|
+
- contrarian truth: what the user can credibly argue instead
|
|
175
|
+
- reader value: what the reader learns, sees differently, or can do
|
|
176
|
+
- proof available: what can be safely used
|
|
177
|
+
- proof missing: what cannot be claimed without user confirmation
|
|
178
|
+
|
|
179
|
+
If this section is weak, say so. Do not let the hook lab proceed as if a clever
|
|
180
|
+
opening can create value that the premise does not have.
|
|
181
|
+
|
|
116
182
|
## Full Text Reality
|
|
117
183
|
|
|
118
184
|
Search results may only include previews.
|
|
@@ -171,7 +237,8 @@ appears cut off or body context is unavailable.
|
|
|
171
237
|
|
|
172
238
|
Extract structure and reusable language patterns, not copied prose. The goal is
|
|
173
239
|
to learn the exact kinds of words, phrase shapes, sentence rhythms, and body
|
|
174
|
-
moves that are working, then adapt them into the user's
|
|
240
|
+
moves that are working, then adapt them into the selected premise in the user's
|
|
241
|
+
voice. Hooks must come from a premise card, not from the raw idea alone.
|
|
175
242
|
|
|
176
243
|
For each shortlisted source post, record:
|
|
177
244
|
|