@sellable/mcp 0.1.239 → 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 +247 -17
- package/skills/create-post/references/gold-standard-post-pack.md +43 -2
- package/skills/create-post/references/hook-research-playbook.md +217 -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,13 +78,18 @@ 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`
|
|
83
90
|
- `mcp__sellable__fetch_linkedin_profile`
|
|
84
91
|
- `mcp__sellable__record_engage_proven_search`
|
|
92
|
+
- `mcp__sellable__upsert_engage_tracked_person`
|
|
85
93
|
|
|
86
94
|
Do not call outbound/campaign tools from this skill. Do not call message-generation prompts or tools. This skill reuses the quality architecture of the message pipeline: required assets, candidate set, finalizer pass, simplifier/concrete-language audit, anti-AI audit, proof/voice validation, and blocked/retry-needed states.
|
|
87
95
|
</tools>
|
|
@@ -131,6 +139,8 @@ Durable write-back targets:
|
|
|
131
139
|
- `core/transcripts/INDEX.md` for source interview or voice-memo references
|
|
132
140
|
- `core/references/linkedin-posts/INDEX.md` and adjacent files for approved
|
|
133
141
|
gold-standard post references
|
|
142
|
+
- `discovery/influencers.md` for approved creators/persons the user wants the
|
|
143
|
+
system to keep learning from
|
|
134
144
|
|
|
135
145
|
Write-backs must use stable source keys such as
|
|
136
146
|
`create-post:{date}:{ideaId}:{slug}` or
|
|
@@ -139,6 +149,13 @@ paths before adding references, create no duplicate reference rows, and keep
|
|
|
139
149
|
manual sections preserved. If the user says to mark private, store only the
|
|
140
150
|
minimum private-safe metadata and do not promote it into public proof,
|
|
141
151
|
references, or examples.
|
|
152
|
+
|
|
153
|
+
When the user says a creator/person is worth following, learning from, or using
|
|
154
|
+
again, persist them with `mcp__sellable__upsert_engage_tracked_person` before
|
|
155
|
+
continuing. Use the canonical LinkedIn profile URL, a concise reason that names
|
|
156
|
+
the content lane, and no senderId unless the user explicitly scopes the person
|
|
157
|
+
to one sender. If the person is already tracked, update the reason instead of
|
|
158
|
+
creating a duplicate.
|
|
142
159
|
</memory_contract>
|
|
143
160
|
|
|
144
161
|
<modes>
|
|
@@ -149,9 +166,10 @@ Use when the user gives an existing idea ID.
|
|
|
149
166
|
1. Call `mcp__sellable__get_post_idea({ ideaId })`.
|
|
150
167
|
2. Treat the idea's raw source as immutable source material.
|
|
151
168
|
3. Run hook research.
|
|
152
|
-
4.
|
|
153
|
-
5.
|
|
154
|
-
6.
|
|
169
|
+
4. Develop and select a premise card.
|
|
170
|
+
5. Save hook research.
|
|
171
|
+
6. Draft and validate.
|
|
172
|
+
7. Save the draft.
|
|
155
173
|
|
|
156
174
|
## Capture Mode
|
|
157
175
|
|
|
@@ -161,9 +179,10 @@ Use when the user gives a new rough idea, voice memo transcript, freestyle note,
|
|
|
161
179
|
2. Preserve the raw source exactly.
|
|
162
180
|
3. Distill only what the user actually said.
|
|
163
181
|
4. Run hook research.
|
|
164
|
-
5.
|
|
165
|
-
6.
|
|
166
|
-
7.
|
|
182
|
+
5. Develop and select a premise card.
|
|
183
|
+
6. Save hook research.
|
|
184
|
+
7. Draft and validate.
|
|
185
|
+
8. Save the draft.
|
|
167
186
|
|
|
168
187
|
## Ad Hoc Mode
|
|
169
188
|
|
|
@@ -173,6 +192,29 @@ Normal ad hoc mode still creates an ID'd idea artifact first with `mcp__sellable
|
|
|
173
192
|
|
|
174
193
|
If the user explicitly says not to save anything, label the output `unsaved_preview`, do not call it draft-ready, and do not mark it as validated for publishing.
|
|
175
194
|
|
|
195
|
+
## Research Checkpoint Mode
|
|
196
|
+
|
|
197
|
+
Use when the user asks to research hooks, research bodies, "show me what it
|
|
198
|
+
learned", "run the research phase", "what is working in the space", or anything
|
|
199
|
+
similar.
|
|
200
|
+
|
|
201
|
+
1. Capture or load the idea/topic if one is provided.
|
|
202
|
+
2. Run the hook/body research playbook.
|
|
203
|
+
3. Save the research with `mcp__sellable__save_hook_research`.
|
|
204
|
+
4. Present a `Research Learning Report` to the user.
|
|
205
|
+
5. Do not draft until the user approves a direction or explicitly says to run
|
|
206
|
+
the draft phase.
|
|
207
|
+
|
|
208
|
+
The report must include specific words, phrase shapes, sentence patterns, and
|
|
209
|
+
body moves from the research. Do not only report abstract labels like
|
|
210
|
+
"contrarian hook" or "tool-stack enemy."
|
|
211
|
+
|
|
212
|
+
When the host supports background agents or Task workers, run the heavy research
|
|
213
|
+
in a dedicated research worker so the main orchestrator stays clean. The
|
|
214
|
+
orchestrator should keep only the compressed research packet, final selected
|
|
215
|
+
examples, and user-facing learning report in context. Do not paste the entire
|
|
216
|
+
raw source-post corpus into the orchestrator conversation.
|
|
217
|
+
|
|
176
218
|
## Gold Standard Pack Mode
|
|
177
219
|
|
|
178
220
|
Use when the user asks to import their best posts, research best posts in the space, build a gold-standard pack, or add inspiration examples.
|
|
@@ -193,8 +235,11 @@ Space benchmark research:
|
|
|
193
235
|
1. Use `mcp__sellable__search_engagement_posts` and the hook research playbook.
|
|
194
236
|
2. Shortlist high-performing posts from the user's space using the weighted signal rules.
|
|
195
237
|
3. Penalize lead magnets, giveaways, engagement bait, celebrity-only reach, and poor voice fit.
|
|
196
|
-
4.
|
|
197
|
-
|
|
238
|
+
4. When a creator/person appears repeatedly strong, include a `track_person`
|
|
239
|
+
recommendation in the candidate card.
|
|
240
|
+
5. Show the user the candidates and ask: "These look good. Should we use any as gold standards or track any of these people?"
|
|
241
|
+
6. Add only the user-approved post selections.
|
|
242
|
+
7. For each approved tracked person, call `mcp__sellable__upsert_engage_tracked_person`.
|
|
198
243
|
|
|
199
244
|
The approved pack is capped at 20 gold standards. If adding new approved examples would exceed 20, ask which existing item to replace or skip the overflow. Candidate lists can be longer, but approved saved standards cannot exceed 20.
|
|
200
245
|
</modes>
|
|
@@ -220,6 +265,29 @@ If local idea capture succeeds but auth/workspace is missing, keep the idea and
|
|
|
220
265
|
|
|
221
266
|
Use `references/hook-research-playbook.md`.
|
|
222
267
|
|
|
268
|
+
If the host supports background agents, delegate the search/fetch/autopsy work
|
|
269
|
+
to one bounded `research-worker` before hook candidate generation. The worker
|
|
270
|
+
owns broad search, profile fetches, full-text matching, source filtering,
|
|
271
|
+
language extraction, and body-structure extraction. The orchestrator owns the
|
|
272
|
+
final save call, user-visible `Research Learning Report`, direction selection,
|
|
273
|
+
and drafting gate.
|
|
274
|
+
|
|
275
|
+
The research worker must return a compact packet only:
|
|
276
|
+
|
|
277
|
+
- source examples kept and rejected
|
|
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
|
|
281
|
+
- exact phrase patterns and sentence shapes
|
|
282
|
+
- body structures and exact body language moves
|
|
283
|
+
- preview measurements
|
|
284
|
+
- track-person and gold-standard recommendations
|
|
285
|
+
- blocked states or confidence gaps
|
|
286
|
+
|
|
287
|
+
The research worker must not return all raw post bodies unless a specific full
|
|
288
|
+
text is required as a gold-standard candidate. Prefer summaries plus URLs and
|
|
289
|
+
the exact extracted phrase shapes.
|
|
290
|
+
|
|
223
291
|
Default flow:
|
|
224
292
|
|
|
225
293
|
1. Convert the idea into 3-8 search keywords.
|
|
@@ -229,9 +297,12 @@ Default flow:
|
|
|
229
297
|
5. If full text cannot be matched, record `full_text_unavailable` and use only the preview. Do not invent missing body details.
|
|
230
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`.
|
|
231
299
|
7. Penalize lead-magnet or giveaway mechanics unless the user explicitly asks for a lead magnet post.
|
|
232
|
-
8.
|
|
233
|
-
9. Extract
|
|
234
|
-
10.
|
|
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
|
|
304
|
+
shapes, transitions, and body language patterns.
|
|
305
|
+
12. Save the research with `mcp__sellable__save_hook_research`.
|
|
235
306
|
|
|
236
307
|
Record provenance:
|
|
237
308
|
|
|
@@ -247,14 +318,129 @@ Record provenance:
|
|
|
247
318
|
- full-text match status
|
|
248
319
|
- source hook preview measurements and whether they came from full text or a search preview
|
|
249
320
|
- selected hook patterns
|
|
321
|
+
- market belief map and selected controversy
|
|
322
|
+
- premise cards and selected premise
|
|
323
|
+
- exact phrase patterns and sentence shapes
|
|
324
|
+
- body structures and body language patterns
|
|
250
325
|
- why each pattern fits the user's idea and voice
|
|
251
326
|
|
|
327
|
+
## Step 1.5: Research Learning Report
|
|
328
|
+
|
|
329
|
+
After saving research and before drafting, show the user what the system
|
|
330
|
+
learned when either:
|
|
331
|
+
|
|
332
|
+
- the user asked for research/checkpoint mode
|
|
333
|
+
- the research materially changes the likely hook/body direction
|
|
334
|
+
- the researched examples include new people worth tracking or examples worth
|
|
335
|
+
adding as gold standards
|
|
336
|
+
|
|
337
|
+
Default ad hoc drafting may proceed after this report only when the user clearly
|
|
338
|
+
asked for an immediate draft. In research checkpoint mode, stop here and ask
|
|
339
|
+
which direction to use.
|
|
340
|
+
|
|
341
|
+
The `Research Learning Report` must include:
|
|
342
|
+
|
|
343
|
+
```text
|
|
344
|
+
Research status:
|
|
345
|
+
- idea/topic:
|
|
346
|
+
- research artifact:
|
|
347
|
+
- search window:
|
|
348
|
+
- keywords:
|
|
349
|
+
- full-text coverage:
|
|
350
|
+
- repost/share data:
|
|
351
|
+
|
|
352
|
+
Best source examples:
|
|
353
|
+
1. author, URL, engagement, why kept, why not copied
|
|
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
|
+
|
|
368
|
+
Hook patterns learned:
|
|
369
|
+
1. full adapted hook block
|
|
370
|
+
- source mechanism:
|
|
371
|
+
- preview budget:
|
|
372
|
+
- internal question:
|
|
373
|
+
- why it fits / why it does not:
|
|
374
|
+
|
|
375
|
+
Specific words and phrase shapes:
|
|
376
|
+
1. "phrase or phrase shape"
|
|
377
|
+
- role:
|
|
378
|
+
- source:
|
|
379
|
+
- reusable forms:
|
|
380
|
+
- adapted Sellable form:
|
|
381
|
+
- do not copy:
|
|
382
|
+
|
|
383
|
+
Body structures learned:
|
|
384
|
+
1. structure name
|
|
385
|
+
- source:
|
|
386
|
+
- sequence:
|
|
387
|
+
- exact language moves:
|
|
388
|
+
- adapted Sellable body move:
|
|
389
|
+
|
|
390
|
+
Rejected examples:
|
|
391
|
+
- author/source:
|
|
392
|
+
- reason rejected:
|
|
393
|
+
|
|
394
|
+
Save recommendations:
|
|
395
|
+
- track people:
|
|
396
|
+
- gold-standard candidates:
|
|
397
|
+
|
|
398
|
+
Recommended draft directions:
|
|
399
|
+
1. premise card + hook block + body structure
|
|
400
|
+
2. premise card + hook block + body structure
|
|
401
|
+
3. premise card + hook block + body structure
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
Keep this report concise enough to read, but concrete enough that another agent
|
|
405
|
+
could draft from it without redoing research.
|
|
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
|
+
|
|
252
433
|
## Step 2: Hook Candidates
|
|
253
434
|
|
|
254
|
-
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.
|
|
255
438
|
|
|
256
439
|
Each hook must include:
|
|
257
440
|
|
|
441
|
+
- selected premise
|
|
442
|
+
- premise tension opened
|
|
443
|
+
- reader value implied
|
|
258
444
|
- source hook pattern
|
|
259
445
|
- why it fits this idea
|
|
260
446
|
- `charCount`
|
|
@@ -299,6 +485,7 @@ fallback in the validation receipt.
|
|
|
299
485
|
Draft from:
|
|
300
486
|
|
|
301
487
|
- exact raw idea
|
|
488
|
+
- selected premise card
|
|
302
489
|
- selected hook
|
|
303
490
|
- hook research artifact
|
|
304
491
|
- user's core memory
|
|
@@ -316,12 +503,16 @@ Every saved draft needs a validation receipt with:
|
|
|
316
503
|
|
|
317
504
|
- source idea ID
|
|
318
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
|
|
319
509
|
- candidate hooks considered
|
|
320
510
|
- selected hook and why
|
|
321
511
|
- proof claims used and source
|
|
322
512
|
- story/proof files consulted
|
|
323
513
|
- gold standards consulted
|
|
324
514
|
- LinkedIn preview audit
|
|
515
|
+
- premise/value audit findings
|
|
325
516
|
- simplifier/concrete-language audit findings
|
|
326
517
|
- voice audit findings
|
|
327
518
|
- anti-AI audit findings
|
|
@@ -336,6 +527,32 @@ If validation fails, do not save the draft as `ready`. Save as `needs_revision`
|
|
|
336
527
|
|
|
337
528
|
Call `mcp__sellable__save_post_draft`.
|
|
338
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
|
+
|
|
339
556
|
Drafts live under:
|
|
340
557
|
|
|
341
558
|
```text
|
|
@@ -360,6 +577,12 @@ Published post records live under:
|
|
|
360
577
|
~/.sellable/content/linkedin/published/
|
|
361
578
|
```
|
|
362
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
|
+
|
|
363
586
|
</pipeline>
|
|
364
587
|
|
|
365
588
|
<legacy>
|
|
@@ -377,8 +600,15 @@ idea_id: <id or none>
|
|
|
377
600
|
hook_research_id: <id or none>
|
|
378
601
|
draft_id: <id or none>
|
|
379
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>
|
|
380
609
|
selected_hook: <hook>
|
|
381
610
|
validation_summary:
|
|
611
|
+
premise_value: pass | needs_user_input | needs_revision
|
|
382
612
|
proof: pass | needs_user_input | blocked
|
|
383
613
|
voice: pass | needs_revision
|
|
384
614
|
anti_ai: pass | needs_revision
|