@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.
@@ -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.240",
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,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. Save hook research.
163
- 5. Draft and validate.
164
- 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.
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. Save hook research.
175
- 6. Draft and validate.
176
- 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.
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. For story posts, extract the story mechanism that made the post work, not just the first line.
290
- 9. Extract hook structures plus specific reusable words, phrases, sentence
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
- 10. Save the research with `mcp__sellable__save_hook_research`.
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 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.
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 voice.
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 `needs_revision`
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
- - optional future metrics placeholders
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