@sellable/mcp 0.1.240 → 0.1.243

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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.243",
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`
@@ -101,10 +108,19 @@ Load user memory before hook generation or drafting:
101
108
  - `core/answer-bank.md`
102
109
  - `core/context-modes.md`
103
110
  - `core/decision-rules.md`
111
+ - `core/content-memory/**`
104
112
  - `core/references/**`
105
113
  3. Use `memory.postWritingRules` returned by `mcp__sellable__get_engage_memory` when present. If the host permits direct file reads and the memory response does not include it, read post-specific writing rules from `~/.sellable/configs/writing/posts.md` when available.
106
114
  4. Read the gold-standard post pack from `core/references/linkedin-posts/INDEX.md` and its approved copied/distilled examples when present. `get_engage_memory` may return this through the composed `core/references/**` indexes; if the host permits direct file reads, load the files directly when needed.
107
115
 
116
+ Treat `get_engage_memory` as the backward-compatible tool name for unified
117
+ Sellable memory. For transcript-derived posts, rough source notes, recurring
118
+ ideas, or post seeds, load `core/content-memory/**` before hook generation.
119
+ Use it to find the idea cluster, story/proof/question cards, proof gaps, and
120
+ post seeds. If the cluster is weak, ask workshop questions before drafting. If
121
+ the seed is mature, use it as the source packet for premise development and
122
+ external LinkedIn research.
123
+
108
124
  `writing/posts.md` is a post-writing config file, not a draft library. Treat its structure this way:
109
125
 
110
126
  - Top scratch or `## Draft Rule Candidates` sections are candidate taste notes only.
@@ -130,6 +146,8 @@ Durable write-back targets:
130
146
  privacy decisions, and downstream prompt/operator notes
131
147
  - `core/story-bank.md` for reusable first-person stories
132
148
  - `core/transcripts/INDEX.md` for source interview or voice-memo references
149
+ - `core/content-memory/INDEX.md`, cluster files, and card files for evolving
150
+ transcript-derived ideas, story cards, proof cards, questions, and post seeds
133
151
  - `core/references/linkedin-posts/INDEX.md` and adjacent files for approved
134
152
  gold-standard post references
135
153
  - `discovery/influencers.md` for approved creators/persons the user wants the
@@ -159,9 +177,10 @@ Use when the user gives an existing idea ID.
159
177
  1. Call `mcp__sellable__get_post_idea({ ideaId })`.
160
178
  2. Treat the idea's raw source as immutable source material.
161
179
  3. Run hook research.
162
- 4. Save hook research.
163
- 5. Draft and validate.
164
- 6. Save the draft.
180
+ 4. Develop and select a premise card.
181
+ 5. Save hook research.
182
+ 6. Draft and validate.
183
+ 7. Save the draft.
165
184
 
166
185
  ## Capture Mode
167
186
 
@@ -171,9 +190,10 @@ Use when the user gives a new rough idea, voice memo transcript, freestyle note,
171
190
  2. Preserve the raw source exactly.
172
191
  3. Distill only what the user actually said.
173
192
  4. Run hook research.
174
- 5. Save hook research.
175
- 6. Draft and validate.
176
- 7. Save the draft.
193
+ 5. Develop and select a premise card.
194
+ 6. Save hook research.
195
+ 7. Draft and validate.
196
+ 8. Save the draft.
177
197
 
178
198
  ## Ad Hoc Mode
179
199
 
@@ -267,6 +287,8 @@ The research worker must return a compact packet only:
267
287
 
268
288
  - source examples kept and rejected
269
289
  - full adapted hook blocks
290
+ - market belief map: resonating ideas, implicit beliefs, audience wants, resentments, fears, and credible controversy angles
291
+ - premise inputs: real scenes, observed tensions, reader value openings, and proof gaps
270
292
  - exact phrase patterns and sentence shapes
271
293
  - body structures and exact body language moves
272
294
  - preview measurements
@@ -286,10 +308,12 @@ Default flow:
286
308
  5. If full text cannot be matched, record `full_text_unavailable` and use only the preview. Do not invent missing body details.
287
309
  6. Weigh shares/reposts above comments, comments above reactions, and reactions as weak reach unless paired with stronger signals. If shares/reposts are unavailable, record `repost_data_unavailable`.
288
310
  7. Penalize lead-magnet or giveaway mechanics unless the user explicitly asks for a lead magnet post.
289
- 8. 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
311
+ 8. Build a market belief map before hook generation: what the space is rewarding, what the audience implicitly believes, what they want permission to say, what they resent or fear, what they will argue with, and which controversial angle the user can credibly own. If the user's raw idea is internally coherent but not attached to a live market tension, do not draft from the internal idea alone; present stronger directions or rewrite the draft angle around the external tension.
312
+ 9. Extract premise inputs: real story/scene possibilities, observed tensions, useful reader takeaways, and proof gaps. A good hook cannot rescue a premise with no value.
313
+ 10. For story posts, extract the story mechanism that made the post work, not just the first line.
314
+ 11. Extract hook structures plus specific reusable words, phrases, sentence
291
315
  shapes, transitions, and body language patterns.
292
- 10. Save the research with `mcp__sellable__save_hook_research`.
316
+ 12. Save the research with `mcp__sellable__save_hook_research`.
293
317
 
294
318
  Record provenance:
295
319
 
@@ -305,6 +329,8 @@ Record provenance:
305
329
  - full-text match status
306
330
  - source hook preview measurements and whether they came from full text or a search preview
307
331
  - selected hook patterns
332
+ - market belief map and selected controversy
333
+ - premise cards and selected premise
308
334
  - exact phrase patterns and sentence shapes
309
335
  - body structures and body language patterns
310
336
  - why each pattern fits the user's idea and voice
@@ -337,6 +363,19 @@ Research status:
337
363
  Best source examples:
338
364
  1. author, URL, engagement, why kept, why not copied
339
365
 
366
+ Market belief map:
367
+ - resonating ideas:
368
+ - implicit beliefs:
369
+ - audience wants:
370
+ - audience resentments:
371
+ - audience fears:
372
+ - controversial angles to test:
373
+ - avoid because:
374
+ - selected controversy:
375
+
376
+ Premise cards:
377
+ 1. premise + real story/scene + tension + reader value + proof gap + score
378
+
340
379
  Hook patterns learned:
341
380
  1. full adapted hook block
342
381
  - source mechanism:
@@ -368,20 +407,51 @@ Save recommendations:
368
407
  - gold-standard candidates:
369
408
 
370
409
  Recommended draft directions:
371
- 1. hook block + body structure
372
- 2. hook block + body structure
373
- 3. hook block + body structure
410
+ 1. premise card + hook block + body structure
411
+ 2. premise card + hook block + body structure
412
+ 3. premise card + hook block + body structure
374
413
  ```
375
414
 
376
415
  Keep this report concise enough to read, but concrete enough that another agent
377
416
  could draft from it without redoing research.
378
417
 
418
+ ## Step 1.75: Premise Development
419
+
420
+ Use `references/premise-development.md`.
421
+
422
+ Generate 3-5 `Premise Card` candidates from the raw idea, market research, core
423
+ memory, story/proof files, and current-session user feedback. Each card must
424
+ include a real story/scene or observed pattern, target reader, common belief,
425
+ contrarian truth, tension, reader value, proof available, proof missing, and a
426
+ score.
427
+
428
+ Select the strongest premise before hook generation. The selected premise must
429
+ pass:
430
+
431
+ - `specific_scene_or_pattern`
432
+ - `clear_reader`
433
+ - `visible_tension`
434
+ - `reader_value`
435
+ - `credible_speaker`
436
+ - `proof_safety`
437
+ - `market_heat`
438
+
439
+ If the idea has market heat but no real scene, ask for the missing scene unless
440
+ the user explicitly requested an immediate draft. For immediate draft mode, use
441
+ only source-backed observed patterns and save the draft as `needs_revision`
442
+ unless the premise still has concrete reader value.
443
+
379
444
  ## Step 2: Hook Candidates
380
445
 
381
- Generate at least 12 hook candidates unless the user requested a smaller set.
446
+ Generate at least 12 hook candidates from the selected premise unless the user
447
+ requested a smaller set. Do not generate hooks directly from the raw idea before
448
+ the premise is selected.
382
449
 
383
450
  Each hook must include:
384
451
 
452
+ - selected premise
453
+ - premise tension opened
454
+ - reader value implied
385
455
  - source hook pattern
386
456
  - why it fits this idea
387
457
  - `charCount`
@@ -426,6 +496,7 @@ fallback in the validation receipt.
426
496
  Draft from:
427
497
 
428
498
  - exact raw idea
499
+ - selected premise card
429
500
  - selected hook
430
501
  - hook research artifact
431
502
  - user's core memory
@@ -443,12 +514,16 @@ Every saved draft needs a validation receipt with:
443
514
 
444
515
  - source idea ID
445
516
  - hook research ID
517
+ - iteration metadata: version, priorDraftId, changeIntent, what changed,
518
+ what improved, what got worse, score, and verdict
519
+ - selected premise card
446
520
  - candidate hooks considered
447
521
  - selected hook and why
448
522
  - proof claims used and source
449
523
  - story/proof files consulted
450
524
  - gold standards consulted
451
525
  - LinkedIn preview audit
526
+ - premise/value audit findings
452
527
  - simplifier/concrete-language audit findings
453
528
  - voice audit findings
454
529
  - anti-AI audit findings
@@ -463,6 +538,32 @@ If validation fails, do not save the draft as `ready`. Save as `needs_revision`
463
538
 
464
539
  Call `mcp__sellable__save_post_draft`.
465
540
 
541
+ Use versioned draft IDs for multiple attempts on the same idea:
542
+
543
+ ```text
544
+ draft_YYYYMMDD_slug_v1
545
+ draft_YYYYMMDD_slug_v2
546
+ draft_YYYYMMDD_slug_v3
547
+ ```
548
+
549
+ Keep the `ideaId` stable across versions. Treat `v1` as the baseline unless the
550
+ user explicitly picks another draft as the baseline. For `v2+`, pass
551
+ `priorDraftId` and include an iteration receipt comparing the new draft against
552
+ the prior draft. If the user asks to patch the same version's receipt, status,
553
+ or copy without creating a new version, call `mcp__sellable__update_post_draft`.
554
+
555
+ When deciding whether a draft improved, use:
556
+
557
+ - hook
558
+ - proof
559
+ - voice
560
+ - specificity
561
+ - skimmability
562
+ - publish confidence
563
+
564
+ Do not mark a draft as improved only because it is newer. Preserve what got
565
+ worse.
566
+
466
567
  Drafts live under:
467
568
 
468
569
  ```text
@@ -487,6 +588,12 @@ Published post records live under:
487
588
  ~/.sellable/content/linkedin/published/
488
589
  ```
489
590
 
591
+ When the user publishes a post or provides a LinkedIn URL, call
592
+ `mcp__sellable__mark_post_published`. This records the published post separately
593
+ and marks the source draft as `published` by default. When later performance
594
+ data is available, call `mcp__sellable__update_published_post_metrics` to append
595
+ metric snapshots for learning.
596
+
490
597
  </pipeline>
491
598
 
492
599
  <legacy>
@@ -504,8 +611,15 @@ idea_id: <id or none>
504
611
  hook_research_id: <id or none>
505
612
  draft_id: <id or none>
506
613
  draft_path: <path or none>
614
+ iteration:
615
+ version: <v1/v2/etc>
616
+ prior_draft_id: <id or none>
617
+ verdict: <baseline | keep | revise | reject | publish_candidate>
618
+ score: <compact score object>
619
+ selected_premise: <premise or none>
507
620
  selected_hook: <hook>
508
621
  validation_summary:
622
+ premise_value: pass | needs_user_input | needs_revision
509
623
  proof: pass | needs_user_input | blocked
510
624
  voice: pass | needs_revision
511
625
  anti_ai: pass | needs_revision
@@ -1,6 +1,6 @@
1
1
  # Hook Research Playbook
2
2
 
3
- Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`.
3
+ Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`. The goal is not only to find hooks. The goal is to find what the market is currently rewarding, what the audience implicitly believes/wants/resents/fears, which controversial angle the user can credibly test, and what premise would deliver real reader value.
4
4
 
5
5
  ## Search Inputs
6
6
 
@@ -29,6 +29,8 @@ Worker owns:
29
29
  - full-text matching by URL/activity ID
30
30
  - duplicate removal
31
31
  - lead-magnet, giveaway, engagement-bait, and off-voice filtering
32
+ - market belief mapping across kept and rejected examples
33
+ - premise input extraction: real scenes, observed tensions, reader value, proof gaps
32
34
  - hook opening measurement
33
35
  - exact phrase-pattern extraction
34
36
  - body-structure extraction
@@ -49,6 +51,9 @@ Worker output must be a compressed research packet, not a data dump:
49
51
  Research packet:
50
52
  - sources kept: max 8
51
53
  - sources rejected: max 8
54
+ - market belief map: max 8 bullets
55
+ - controversy candidates: max 8
56
+ - premise inputs: max 8
52
57
  - full adapted hook blocks: max 12
53
58
  - exact phrase patterns: max 20
54
59
  - body patterns: max 8
@@ -113,6 +118,67 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
113
118
  - "like and comment"
114
119
  - broad giveaway framing that makes engagement inflate without proving the hook/body worked
115
120
 
121
+ ## Market Belief Map
122
+
123
+ Before selecting a hook or writing a draft, synthesize a market belief map from
124
+ the kept and rejected posts. This is the step that prevents an internally
125
+ coherent post from becoming externally boring.
126
+
127
+ Record:
128
+
129
+ - resonating ideas: what topics or claims are repeatedly earning real
130
+ engagement in the last 30-120 days
131
+ - implicit beliefs: what the audience seems to already believe but may not say
132
+ directly
133
+ - audience wants: what they want to feel, learn, try, buy, avoid, or be early to
134
+ - audience resentments: what they are tired of, embarrassed by, or angry about
135
+ - audience fears: what risk would make them hesitate
136
+ - argument bait: what they will plausibly disagree with in comments
137
+ - credible controversy: what the user can argue without borrowing someone else's
138
+ proof or pretending to have data they do not have
139
+ - avoid list: ideas that are inflated by comment bait, stale category claims,
140
+ celebrity reach, giveaway mechanics, or poor voice fit
141
+
142
+ The selected direction must include:
143
+
144
+ ```text
145
+ Selected controversy:
146
+ <one sentence>
147
+
148
+ Why this audience would engage:
149
+ <specific belief/want/resentment/fear>
150
+
151
+ Why this user can credibly say it:
152
+ <raw idea, memory, story, proof, or product mechanism>
153
+
154
+ What not to claim:
155
+ <unsupported metric, borrowed proof, or hype phrase to avoid>
156
+ ```
157
+
158
+ If the raw idea is true but the market belief map does not show a live tension,
159
+ do not draft from the raw idea as-is. Present stronger directions or reframe the
160
+ idea around the closest supported external tension.
161
+
162
+ ## Premise Inputs
163
+
164
+ After the market belief map, extract the ingredients needed for premise
165
+ development. Do this before hook generation.
166
+
167
+ Record:
168
+
169
+ - real story or scene candidates from the raw idea, memory, transcript, or
170
+ current-session context
171
+ - observed pattern candidates when no first-person story is available
172
+ - visible tension: the uncomfortable gap, cost, contradiction, or tradeoff
173
+ - common belief: what the audience probably believes right now
174
+ - contrarian truth: what the user can credibly argue instead
175
+ - reader value: what the reader learns, sees differently, or can do
176
+ - proof available: what can be safely used
177
+ - proof missing: what cannot be claimed without user confirmation
178
+
179
+ If this section is weak, say so. Do not let the hook lab proceed as if a clever
180
+ opening can create value that the premise does not have.
181
+
116
182
  ## Full Text Reality
117
183
 
118
184
  Search results may only include previews.
@@ -171,7 +237,8 @@ appears cut off or body context is unavailable.
171
237
 
172
238
  Extract structure and reusable language patterns, not copied prose. The goal is
173
239
  to learn the exact kinds of words, phrase shapes, sentence rhythms, and body
174
- moves that are working, then adapt them into the user's 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