@sellable/mcp 0.1.240 → 0.1.242
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/server.js +13 -1
- package/dist/tools/content-posts.d.ts +315 -0
- package/dist/tools/content-posts.js +366 -15
- package/dist/tools/registry.d.ts +204 -0
- package/package.json +1 -1
- package/skills/create-post/SKILL.md +121 -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/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`
|
|
@@ -159,9 +166,10 @@ Use when the user gives an existing idea ID.
|
|
|
159
166
|
1. Call `mcp__sellable__get_post_idea({ ideaId })`.
|
|
160
167
|
2. Treat the idea's raw source as immutable source material.
|
|
161
168
|
3. Run hook research.
|
|
162
|
-
4.
|
|
163
|
-
5.
|
|
164
|
-
6.
|
|
169
|
+
4. Develop and select a premise card.
|
|
170
|
+
5. Save hook research.
|
|
171
|
+
6. Draft and validate.
|
|
172
|
+
7. Save the draft.
|
|
165
173
|
|
|
166
174
|
## Capture Mode
|
|
167
175
|
|
|
@@ -171,9 +179,10 @@ Use when the user gives a new rough idea, voice memo transcript, freestyle note,
|
|
|
171
179
|
2. Preserve the raw source exactly.
|
|
172
180
|
3. Distill only what the user actually said.
|
|
173
181
|
4. Run hook research.
|
|
174
|
-
5.
|
|
175
|
-
6.
|
|
176
|
-
7.
|
|
182
|
+
5. Develop and select a premise card.
|
|
183
|
+
6. Save hook research.
|
|
184
|
+
7. Draft and validate.
|
|
185
|
+
8. Save the draft.
|
|
177
186
|
|
|
178
187
|
## Ad Hoc Mode
|
|
179
188
|
|
|
@@ -267,6 +276,8 @@ The research worker must return a compact packet only:
|
|
|
267
276
|
|
|
268
277
|
- source examples kept and rejected
|
|
269
278
|
- full adapted hook blocks
|
|
279
|
+
- market belief map: resonating ideas, implicit beliefs, audience wants, resentments, fears, and credible controversy angles
|
|
280
|
+
- premise inputs: real scenes, observed tensions, reader value openings, and proof gaps
|
|
270
281
|
- exact phrase patterns and sentence shapes
|
|
271
282
|
- body structures and exact body language moves
|
|
272
283
|
- preview measurements
|
|
@@ -286,10 +297,12 @@ Default flow:
|
|
|
286
297
|
5. If full text cannot be matched, record `full_text_unavailable` and use only the preview. Do not invent missing body details.
|
|
287
298
|
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
299
|
7. Penalize lead-magnet or giveaway mechanics unless the user explicitly asks for a lead magnet post.
|
|
289
|
-
8.
|
|
290
|
-
9. Extract
|
|
300
|
+
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.
|
|
301
|
+
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.
|
|
302
|
+
10. For story posts, extract the story mechanism that made the post work, not just the first line.
|
|
303
|
+
11. Extract hook structures plus specific reusable words, phrases, sentence
|
|
291
304
|
shapes, transitions, and body language patterns.
|
|
292
|
-
|
|
305
|
+
12. Save the research with `mcp__sellable__save_hook_research`.
|
|
293
306
|
|
|
294
307
|
Record provenance:
|
|
295
308
|
|
|
@@ -305,6 +318,8 @@ Record provenance:
|
|
|
305
318
|
- full-text match status
|
|
306
319
|
- source hook preview measurements and whether they came from full text or a search preview
|
|
307
320
|
- selected hook patterns
|
|
321
|
+
- market belief map and selected controversy
|
|
322
|
+
- premise cards and selected premise
|
|
308
323
|
- exact phrase patterns and sentence shapes
|
|
309
324
|
- body structures and body language patterns
|
|
310
325
|
- why each pattern fits the user's idea and voice
|
|
@@ -337,6 +352,19 @@ Research status:
|
|
|
337
352
|
Best source examples:
|
|
338
353
|
1. author, URL, engagement, why kept, why not copied
|
|
339
354
|
|
|
355
|
+
Market belief map:
|
|
356
|
+
- resonating ideas:
|
|
357
|
+
- implicit beliefs:
|
|
358
|
+
- audience wants:
|
|
359
|
+
- audience resentments:
|
|
360
|
+
- audience fears:
|
|
361
|
+
- controversial angles to test:
|
|
362
|
+
- avoid because:
|
|
363
|
+
- selected controversy:
|
|
364
|
+
|
|
365
|
+
Premise cards:
|
|
366
|
+
1. premise + real story/scene + tension + reader value + proof gap + score
|
|
367
|
+
|
|
340
368
|
Hook patterns learned:
|
|
341
369
|
1. full adapted hook block
|
|
342
370
|
- source mechanism:
|
|
@@ -368,20 +396,51 @@ Save recommendations:
|
|
|
368
396
|
- gold-standard candidates:
|
|
369
397
|
|
|
370
398
|
Recommended draft directions:
|
|
371
|
-
1. hook block + body structure
|
|
372
|
-
2. hook block + body structure
|
|
373
|
-
3. hook block + body structure
|
|
399
|
+
1. premise card + hook block + body structure
|
|
400
|
+
2. premise card + hook block + body structure
|
|
401
|
+
3. premise card + hook block + body structure
|
|
374
402
|
```
|
|
375
403
|
|
|
376
404
|
Keep this report concise enough to read, but concrete enough that another agent
|
|
377
405
|
could draft from it without redoing research.
|
|
378
406
|
|
|
407
|
+
## Step 1.75: Premise Development
|
|
408
|
+
|
|
409
|
+
Use `references/premise-development.md`.
|
|
410
|
+
|
|
411
|
+
Generate 3-5 `Premise Card` candidates from the raw idea, market research, core
|
|
412
|
+
memory, story/proof files, and current-session user feedback. Each card must
|
|
413
|
+
include a real story/scene or observed pattern, target reader, common belief,
|
|
414
|
+
contrarian truth, tension, reader value, proof available, proof missing, and a
|
|
415
|
+
score.
|
|
416
|
+
|
|
417
|
+
Select the strongest premise before hook generation. The selected premise must
|
|
418
|
+
pass:
|
|
419
|
+
|
|
420
|
+
- `specific_scene_or_pattern`
|
|
421
|
+
- `clear_reader`
|
|
422
|
+
- `visible_tension`
|
|
423
|
+
- `reader_value`
|
|
424
|
+
- `credible_speaker`
|
|
425
|
+
- `proof_safety`
|
|
426
|
+
- `market_heat`
|
|
427
|
+
|
|
428
|
+
If the idea has market heat but no real scene, ask for the missing scene unless
|
|
429
|
+
the user explicitly requested an immediate draft. For immediate draft mode, use
|
|
430
|
+
only source-backed observed patterns and save the draft as `needs_revision`
|
|
431
|
+
unless the premise still has concrete reader value.
|
|
432
|
+
|
|
379
433
|
## Step 2: Hook Candidates
|
|
380
434
|
|
|
381
|
-
Generate at least 12 hook candidates
|
|
435
|
+
Generate at least 12 hook candidates from the selected premise unless the user
|
|
436
|
+
requested a smaller set. Do not generate hooks directly from the raw idea before
|
|
437
|
+
the premise is selected.
|
|
382
438
|
|
|
383
439
|
Each hook must include:
|
|
384
440
|
|
|
441
|
+
- selected premise
|
|
442
|
+
- premise tension opened
|
|
443
|
+
- reader value implied
|
|
385
444
|
- source hook pattern
|
|
386
445
|
- why it fits this idea
|
|
387
446
|
- `charCount`
|
|
@@ -426,6 +485,7 @@ fallback in the validation receipt.
|
|
|
426
485
|
Draft from:
|
|
427
486
|
|
|
428
487
|
- exact raw idea
|
|
488
|
+
- selected premise card
|
|
429
489
|
- selected hook
|
|
430
490
|
- hook research artifact
|
|
431
491
|
- user's core memory
|
|
@@ -443,12 +503,16 @@ Every saved draft needs a validation receipt with:
|
|
|
443
503
|
|
|
444
504
|
- source idea ID
|
|
445
505
|
- hook research ID
|
|
506
|
+
- iteration metadata: version, priorDraftId, changeIntent, what changed,
|
|
507
|
+
what improved, what got worse, score, and verdict
|
|
508
|
+
- selected premise card
|
|
446
509
|
- candidate hooks considered
|
|
447
510
|
- selected hook and why
|
|
448
511
|
- proof claims used and source
|
|
449
512
|
- story/proof files consulted
|
|
450
513
|
- gold standards consulted
|
|
451
514
|
- LinkedIn preview audit
|
|
515
|
+
- premise/value audit findings
|
|
452
516
|
- simplifier/concrete-language audit findings
|
|
453
517
|
- voice audit findings
|
|
454
518
|
- anti-AI audit findings
|
|
@@ -463,6 +527,32 @@ If validation fails, do not save the draft as `ready`. Save as `needs_revision`
|
|
|
463
527
|
|
|
464
528
|
Call `mcp__sellable__save_post_draft`.
|
|
465
529
|
|
|
530
|
+
Use versioned draft IDs for multiple attempts on the same idea:
|
|
531
|
+
|
|
532
|
+
```text
|
|
533
|
+
draft_YYYYMMDD_slug_v1
|
|
534
|
+
draft_YYYYMMDD_slug_v2
|
|
535
|
+
draft_YYYYMMDD_slug_v3
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
Keep the `ideaId` stable across versions. Treat `v1` as the baseline unless the
|
|
539
|
+
user explicitly picks another draft as the baseline. For `v2+`, pass
|
|
540
|
+
`priorDraftId` and include an iteration receipt comparing the new draft against
|
|
541
|
+
the prior draft. If the user asks to patch the same version's receipt, status,
|
|
542
|
+
or copy without creating a new version, call `mcp__sellable__update_post_draft`.
|
|
543
|
+
|
|
544
|
+
When deciding whether a draft improved, use:
|
|
545
|
+
|
|
546
|
+
- hook
|
|
547
|
+
- proof
|
|
548
|
+
- voice
|
|
549
|
+
- specificity
|
|
550
|
+
- skimmability
|
|
551
|
+
- publish confidence
|
|
552
|
+
|
|
553
|
+
Do not mark a draft as improved only because it is newer. Preserve what got
|
|
554
|
+
worse.
|
|
555
|
+
|
|
466
556
|
Drafts live under:
|
|
467
557
|
|
|
468
558
|
```text
|
|
@@ -487,6 +577,12 @@ Published post records live under:
|
|
|
487
577
|
~/.sellable/content/linkedin/published/
|
|
488
578
|
```
|
|
489
579
|
|
|
580
|
+
When the user publishes a post or provides a LinkedIn URL, call
|
|
581
|
+
`mcp__sellable__mark_post_published`. This records the published post separately
|
|
582
|
+
and marks the source draft as `published` by default. When later performance
|
|
583
|
+
data is available, call `mcp__sellable__update_published_post_metrics` to append
|
|
584
|
+
metric snapshots for learning.
|
|
585
|
+
|
|
490
586
|
</pipeline>
|
|
491
587
|
|
|
492
588
|
<legacy>
|
|
@@ -504,8 +600,15 @@ idea_id: <id or none>
|
|
|
504
600
|
hook_research_id: <id or none>
|
|
505
601
|
draft_id: <id or none>
|
|
506
602
|
draft_path: <path or none>
|
|
603
|
+
iteration:
|
|
604
|
+
version: <v1/v2/etc>
|
|
605
|
+
prior_draft_id: <id or none>
|
|
606
|
+
verdict: <baseline | keep | revise | reject | publish_candidate>
|
|
607
|
+
score: <compact score object>
|
|
608
|
+
selected_premise: <premise or none>
|
|
507
609
|
selected_hook: <hook>
|
|
508
610
|
validation_summary:
|
|
611
|
+
premise_value: pass | needs_user_input | needs_revision
|
|
509
612
|
proof: pass | needs_user_input | blocked
|
|
510
613
|
voice: pass | needs_revision
|
|
511
614
|
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
|
|
|
@@ -31,6 +31,7 @@ Customer computer owns:
|
|
|
31
31
|
research_YYYYMMDD_slug.md
|
|
32
32
|
drafts/
|
|
33
33
|
draft_YYYYMMDD_slug_v1.md
|
|
34
|
+
draft_YYYYMMDD_slug_v2.md
|
|
34
35
|
published/
|
|
35
36
|
YYYY/
|
|
36
37
|
post_linkedinActivityId.md
|
|
@@ -69,10 +70,26 @@ Draft files must preserve:
|
|
|
69
70
|
|
|
70
71
|
- source idea ID
|
|
71
72
|
- hook research ID
|
|
73
|
+
- versioned draft ID, normally ending in `_v1`, `_v2`, `_v3`, etc.
|
|
74
|
+
- iteration metadata when there is a prior or baseline draft:
|
|
75
|
+
- `version`
|
|
76
|
+
- `priorDraftId`
|
|
77
|
+
- `changeIntent`
|
|
78
|
+
- `whatChanged`
|
|
79
|
+
- `whatImproved`
|
|
80
|
+
- `whatGotWorse`
|
|
81
|
+
- score fields for hook, proof, voice, specificity, skimmability, and publish confidence
|
|
82
|
+
- `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
|
|
72
83
|
- draft body
|
|
73
84
|
- validation receipt, including LinkedIn preview pass/warn/fail status and
|
|
74
85
|
compact fallback when the selected hook carries a warning
|
|
75
|
-
- status: `draft`, `ready`, or `
|
|
86
|
+
- status: `draft`, `ready`, `needs_revision`, `published`, or `archived`
|
|
87
|
+
|
|
88
|
+
Multiple drafts for the same idea are expected. Keep the `ideaId` stable and
|
|
89
|
+
create a new versioned `draftId` for each materially different attempt. Do not
|
|
90
|
+
overwrite a prior version just to compare alternatives. Use
|
|
91
|
+
`update_post_draft` only for same-version receipt fixes, status changes, or
|
|
92
|
+
copy edits that should remain part of that version.
|
|
76
93
|
|
|
77
94
|
Published files must preserve:
|
|
78
95
|
|
|
@@ -80,7 +97,12 @@ Published files must preserve:
|
|
|
80
97
|
- publish URL
|
|
81
98
|
- LinkedIn activity ID when available
|
|
82
99
|
- published date
|
|
83
|
-
-
|
|
100
|
+
- future metrics placeholders and appended metric snapshots when available
|
|
101
|
+
|
|
102
|
+
When a draft is published, `mark_post_published` records the published post
|
|
103
|
+
separately and marks the source draft as `published` by default. Use
|
|
104
|
+
`update_published_post_metrics` to append later performance snapshots instead
|
|
105
|
+
of editing the draft.
|
|
84
106
|
|
|
85
107
|
## Safety
|
|
86
108
|
|