@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.
@@ -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": "@sellable/mcp",
3
- "version": "0.1.239",
3
+ "version": "0.1.242",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -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 working over the past few months, and save a validated draft that sounds like them.
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 hooks-first.
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/post-validation.md"`
53
- 4. `subskillName: "create-post", assetPath: "references/gold-standard-post-pack.md"`
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. Save hook research.
153
- 5. Draft and validate.
154
- 6. Save the draft.
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. Save hook research.
165
- 6. Draft and validate.
166
- 7. Save the draft.
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. Show the user the candidates and ask: "These look good. Should we use any as gold standards?"
197
- 5. Add only the user-approved selections.
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. For story posts, extract the story mechanism that made the post work, not just the first line.
233
- 9. Extract hook structures, not wording.
234
- 10. Save the research with `mcp__sellable__save_hook_research`.
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 unless the user requested a smaller set.
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