@sellable/mcp 0.1.258 → 0.1.260

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.
@@ -60,9 +60,8 @@ Do:
60
60
 
61
61
  - capture rough ideas, voice memos, freestyle notes, and ad hoc prompts
62
62
  - research currently working LinkedIn hooks
63
- - reverse engineer why source hooks work, what shape to keep, and what not to copy
64
63
  - develop premise cards with real story/observed tension and reader value
65
- - explore many hook angle territories before choosing the winning hook
64
+ - generate hook candidates
66
65
  - draft a post body that stays true to the source idea
67
66
  - run validation before calling a draft ready
68
67
  - save ideas, hook research, drafts, and published records under `~/.sellable/content/linkedin/**`
@@ -306,8 +305,7 @@ If local idea capture succeeds but auth/workspace is missing, keep the idea and
306
305
 
307
306
  ## Step 1: Hook Research
308
307
 
309
- Use `references/hook-research-playbook.md` and
310
- `references/linkedin-preview-rendering.md`.
308
+ Use `references/hook-research-playbook.md`.
311
309
 
312
310
  If the host supports background agents, delegate the search/fetch/autopsy work
313
311
  to one bounded `research-worker` before hook candidate generation. The worker
@@ -319,16 +317,18 @@ and drafting gate.
319
317
  The research worker must return a compact packet only:
320
318
 
321
319
  - source examples kept and rejected
322
- - hook reverse-engineering autopsies: why each source hook works, which shape to
323
- keep, what not to copy, and what payoff the body must deliver
324
320
  - full adapted hook blocks
325
- - angle territories tested before drafting
326
321
  - market belief map: resonating ideas, implicit beliefs, audience wants, resentments, fears, and credible controversy angles
327
322
  - premise inputs: real scenes, observed tensions, reader value openings, and proof gaps
328
- - reach-normalized signal notes, including follower-band fit when available
329
323
  - exact phrase patterns and sentence shapes
324
+ - post positioning breakdowns that label each meaningful line or phrase by
325
+ narrative job and category
326
+ - viral-post outlines for the best source posts
327
+ - line-to-template conversions that turn source structures into reusable
328
+ templates without source wording
329
+ - hook-to-body promise maps that show how each hook tells the body
330
330
  - body structures and exact body language moves
331
- - rendered mobile and desktop preview records
331
+ - preview measurements
332
332
  - track-person and gold-standard recommendations
333
333
  - blocked states or confidence gaps
334
334
 
@@ -339,24 +339,26 @@ the exact extracted phrase shapes.
339
339
  Default flow:
340
340
 
341
341
  1. Convert the idea into 3-8 search keywords.
342
- 2. Call `mcp__sellable__search_engagement_posts` with an explicit multi-month window. Default to `maxAgeDays: 120`, tightening to 30-60 days only when the topic is trend-sensitive. When the user gives a follower range, pass it as `targetFollowerMin` and `targetFollowerMax`; for example, "8k-20k followers" means `targetFollowerMin: 8000` and `targetFollowerMax: 20000`.
343
- 3. Shortlist posts by topic fit, rendered hook strength, content pattern replicability, creator repeat evidence, weighted engagement quality, and reach-normalized signal quality. Do not sort by raw engagement alone, and do not let the numeric reach score choose the final hook by itself.
344
- 4. Because search results may only include previews, call `mcp__sellable__fetch_linkedin_posts` for shortlisted authors/profile URLs and match recent posts by URL/activity ID when full text is needed. If a promising source is missing follower count and the user requested reach normalization, call `mcp__sellable__fetch_linkedin_profile` on a bounded shortlist before treating the source as a keeper.
342
+ 2. Call `mcp__sellable__search_engagement_posts` with an explicit multi-month window. Default to `maxAgeDays: 120`, tightening to 30-60 days only when the topic is trend-sensitive.
343
+ 3. Shortlist high-engagement posts by topic fit, hook strength, creator repeat evidence, and weighted engagement quality.
344
+ 4. Because search results may only include previews, call `mcp__sellable__fetch_linkedin_posts` for shortlisted authors/profile URLs and match recent posts by URL/activity ID when full text is needed.
345
345
  5. If full text cannot be matched, record `full_text_unavailable` and use only the preview. Do not invent missing body details.
346
- 6. Weigh shares/reposts above comments, comments above reactions, and reactions as weak reach unless paired with stronger signals. Normalize engagement against follower count when available: record `authorFollowerCount`, `targetFollowerBand`, `followerBandFit`, `engagementPer1kFollowers`, `weightedEngagementPer1kFollowers`, `reachPenaltyMultiplier`, `reachAdjustedScore`, and `baselineLift` when repeated creator posts make it possible. If follower count is unavailable, record `follower_count_unavailable`; if shares/reposts are unavailable, record `repost_data_unavailable`.
346
+ 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`.
347
347
  7. Penalize lead-magnet or giveaway mechanics unless the user explicitly asks for a lead magnet post.
348
348
  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.
349
349
  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.
350
350
  10. For story posts, extract the story mechanism that made the post work, not just the first line.
351
351
  11. Extract hook structures plus specific reusable words, phrases, sentence
352
352
  shapes, transitions, and body language patterns.
353
- 12. For each keeper, create a `hookAutopsy`: the source mechanism, open-loop
354
- type, click question, promised payoff, specificity anchor, tension opened,
355
- source shape to keep, source words not to copy, and adaptation rule for the
356
- user's idea.
357
- 13. Render each kept source hook and adapted hook block through the LinkedIn
358
- preview rendering contract. Character counts alone are not enough.
359
- 14. Save the research with `mcp__sellable__save_hook_research`.
353
+ 12. Create a post positioning breakdown for each keeper post: line/phrase,
354
+ category, narrative technique, tension created, reader question opened,
355
+ proof dependency, and reusable template line.
356
+ 13. Convert each keeper into a viral-post outline: hook job, see-more trigger,
357
+ body payoff, close job, and beat-by-beat narrative structure.
358
+ 14. Convert the best outlines into reusable post templates with positioning
359
+ sequences, required story/proof inputs, forbidden borrowing, and
360
+ Sellable-specific adaptation instructions.
361
+ 15. Save the research with `mcp__sellable__save_hook_research`.
360
362
 
361
363
  Record provenance:
362
364
 
@@ -365,29 +367,22 @@ Record provenance:
365
367
  - search window
366
368
  - source post URLs
367
369
  - authors/profile URLs
368
- - author follower counts and target follower-band fit when available
369
370
  - engagement totals and available likes/comments/shares breakdown
370
- - reach-normalized scoring fields and confidence notes
371
371
  - creator repeat evidence
372
372
  - lead-magnet or engagement-bait penalties
373
373
  - story mechanism when relevant
374
374
  - full-text match status
375
- - source hook rendered preview records and whether they came from full text,
376
- authenticated LinkedIn screenshots, or a search preview
375
+ - source hook preview measurements and whether they came from full text or a search preview
377
376
  - selected hook patterns
378
- - hook reverse-engineering autopsies, including `clickQuestion`,
379
- `promisedPayoff`, `sourceShapeToKeep`, `sourceWordsNotToCopy`, and
380
- `adaptationRule`
381
377
  - market belief map and selected controversy
382
378
  - premise cards and selected premise
383
379
  - exact phrase patterns and sentence shapes
380
+ - post positioning breakdowns
381
+ - viral-post outlines
382
+ - reusable post templates
383
+ - hook-to-body promise maps
384
384
  - body structures and body language patterns
385
385
  - why each pattern fits the user's idea and voice
386
- - `whyTheHookCarries`: why the selected hook works from the words, tension, and
387
- content pattern independent of the source creator's reach
388
- - `whyTheReachEvidenceIsTrustworthy`: follower-band fit, reach-adjusted score,
389
- baseline lift, share/comment quality, or why a large-account example is only
390
- secondary pattern evidence
391
386
 
392
387
  ## Step 1.5: Research Learning Report
393
388
 
@@ -413,9 +408,6 @@ Research status:
413
408
  - keywords:
414
409
  - full-text coverage:
415
410
  - repost/share data:
416
- - target follower band:
417
- - reach-normalized winners:
418
- - big-account examples used only as secondary pattern evidence:
419
411
 
420
412
  Best source examples:
421
413
  1. author, URL, engagement, why kept, why not copied
@@ -436,16 +428,11 @@ Premise cards:
436
428
  Hook patterns learned:
437
429
  1. full adapted hook block
438
430
  - source mechanism:
439
- - open-loop type:
440
- - click question:
441
- - promised payoff:
442
- - source shape to keep:
443
- - source words not to copy:
444
- - rendered preview:
445
- - mobile visible block:
446
- - desktop visible block:
447
- - verdict:
431
+ - preview budget:
432
+ - see-more tension:
433
+ - curiosity debt:
448
434
  - internal question:
435
+ - hook-to-body promise:
449
436
  - why it fits / why it does not:
450
437
 
451
438
  Specific words and phrase shapes:
@@ -456,9 +443,35 @@ Specific words and phrase shapes:
456
443
  - adapted Sellable form:
457
444
  - do not copy:
458
445
 
446
+ Post positioning breakdown templates:
447
+ 1. source + template name
448
+ - positioning sequence:
449
+ - line-level narrative techniques:
450
+ - tension created:
451
+ - reader questions opened:
452
+ - reusable template lines:
453
+ - Sellable adaptation:
454
+
455
+ Viral-post outlines:
456
+ 1. outline name
457
+ - hook job:
458
+ - see-more trigger:
459
+ - body payoff:
460
+ - close job:
461
+ - beat sequence:
462
+
463
+ Line-to-template conversion:
464
+ 1. source line/beat
465
+ - narrative job:
466
+ - template line shape:
467
+ - required user story/proof:
468
+ - forbidden borrowing:
469
+ - adapted Sellable expression:
470
+
459
471
  Body structures learned:
460
472
  1. structure name
461
473
  - source:
474
+ - positioning sequence:
462
475
  - sequence:
463
476
  - exact language moves:
464
477
  - adapted Sellable body move:
@@ -472,9 +485,9 @@ Save recommendations:
472
485
  - gold-standard candidates:
473
486
 
474
487
  Recommended draft directions:
475
- 1. premise card + hook territory + hook block + click question + body structure
476
- 2. premise card + hook territory + hook block + click question + body structure
477
- 3. premise card + hook territory + hook block + click question + body structure
488
+ 1. premise card + source template + hook block + viral outline + body structure
489
+ 2. premise card + source template + hook block + viral outline + body structure
490
+ 3. premise card + source template + hook block + viral outline + body structure
478
491
  ```
479
492
 
480
493
  Keep this report concise enough to read, but concrete enough that another agent
@@ -488,7 +501,9 @@ Generate 3-5 `Premise Card` candidates from the raw idea, market research, core
488
501
  memory, story/proof files, and current-session user feedback. Each card must
489
502
  include a real story/scene or observed pattern, target reader, common belief,
490
503
  contrarian truth, tension, reader value, proof available, proof missing, and a
491
- score.
504
+ score. Each card must also evaluate which source template or no-template path
505
+ fits, which positioning sequence to test, and how the hook promise will be
506
+ repaid in the body.
492
507
 
493
508
  Select the strongest premise before hook generation. The selected premise must
494
509
  pass:
@@ -500,56 +515,76 @@ pass:
500
515
  - `credible_speaker`
501
516
  - `proof_safety`
502
517
  - `market_heat`
518
+ - `template_fit`
519
+ - `hook_to_body_repayment`
503
520
 
504
521
  If the idea has market heat but no real scene, ask for the missing scene unless
505
522
  the user explicitly requested an immediate draft. For immediate draft mode, use
506
523
  only source-backed observed patterns and save the draft as `needs_revision`
507
524
  unless the premise still has concrete reader value.
508
525
 
509
- ## Step 2: Hook Candidates
526
+ ## Step 1.9: Pre-Draft Structure Brief
527
+
528
+ Before generating final draft prose, create and show a compact `Pre-Draft
529
+ Structure Brief`. In other words, show a compact Pre-Draft Structure Brief
530
+ before the final draft body. This is the checkpoint that prevents the agent from
531
+ jumping from a good hook into a messy body.
510
532
 
511
- Generate a hook angle matrix from the selected premise before writing the post
512
- body. Do not generate hooks directly from the raw idea before the premise is
513
- selected.
533
+ The brief must be concise, mobile-scanable, and concrete enough for the user to
534
+ approve or correct. Do not hide it inside the validation receipt after the
535
+ draft. Show it before writing the draft body unless the user explicitly says to
536
+ skip outline/structure and write immediately. Even when the user skips the
537
+ visible checkpoint, still include the brief in the validation receipt.
514
538
 
515
- Minimum exploration:
539
+ The `Pre-Draft Structure Brief` must include:
516
540
 
517
- - normal drafting: at least 8 distinct angle territories and 24 hook candidates
518
- - hook-critical requests, "nail the hook," "a ton of angles," or space research:
519
- at least 12 distinct angle territories and 40 hook candidates
520
- - smaller set only when the user explicitly asks for fewer options
541
+ ```text
542
+ Pre-Draft Structure Brief
543
+ - hook:
544
+ - thesis:
545
+ - reader being taught:
546
+ - why this reader cares now:
547
+ - core equation or mechanism:
548
+ - key definitions:
549
+ - proof claims:
550
+ - proof source / risk:
551
+ - source template or no-template rationale:
552
+ - mobile scan path:
553
+ - section outline:
554
+ - body promise after see more:
555
+ - concrete examples to include:
556
+ - abstractions to remove:
557
+ - draft risks:
558
+ ```
521
559
 
522
- Angle territories must be genuinely different. Use options such as enemy/tool
523
- contrast, hidden asset, first-person build proof, workflow reveal, contrarian
524
- category claim, mistake/confession, market timing, operator pain,
525
- asset/free-reveal without comment bait, specific person/company signal,
526
- before/after transformation, and question hook.
560
+ Rules:
561
+
562
+ - The hook must already have a rendered mobile and desktop preview record.
563
+ - The thesis must be one sentence the post can defend.
564
+ - The reader must be specific enough to guide what gets cut.
565
+ - Key definitions must name concrete examples when the post teaches an
566
+ operating concept. For example, define `lead source` as how the list was
567
+ built, not as a persona label.
568
+ - `mobile scan path` must say what a reader understands if they read only the
569
+ hook, separators, section labels, numbers, and final line.
570
+ - `abstractions to remove` must list abstract phrases and the concrete words
571
+ that will replace them.
572
+ - If the user corrects the brief, update the brief first, then draft. Do not
573
+ patch the final prose while leaving the brief stale.
574
+
575
+ ## Step 2: Hook Candidates
576
+
577
+ Generate at least 12 hook candidates from the selected premise unless the user
578
+ requested a smaller set. Do not generate hooks directly from the raw idea before
579
+ the premise is selected.
527
580
 
528
581
  Each hook must include:
529
582
 
530
583
  - selected premise
531
- - angle territory
532
584
  - premise tension opened
533
585
  - reader value implied
534
586
  - source hook pattern
535
- - source shape kept
536
- - source words not copied
537
587
  - why it fits this idea
538
- - `renderedPreview` using `references/linkedin-preview-rendering.md`
539
- - `mobileRenderedPreviewBlock`
540
- - `desktopRenderedPreviewBlock`
541
- - `mobileRenderedLines`
542
- - `desktopRenderedLines`
543
- - `firstScreenPromise`
544
- - `intentionalOpenLoop`
545
- - `specificClickQuestionVisible`
546
- - `seeMoreClickReason`
547
- - `clickQuestion`
548
- - `payoffAfterFold`
549
- - `bodyProofObligation`
550
- - `corePainProofOrCuriosityVisibleMobile`
551
- - `corePointVisibleMobile`
552
- - `pointAfterMobileClamp`
553
588
  - `charCount`
554
589
  - `charCountIncludingNewlines`
555
590
  - `firstLineChars`
@@ -566,50 +601,26 @@ Each hook must include:
566
601
  - `rewriteIfTruncated`
567
602
  - proof/story dependency
568
603
  - AI-tell risk
569
- - why it should win
570
- - why it should lose
571
604
  - score
572
605
 
573
606
  Do not copy source wording. Copy only the structure.
574
607
 
575
- Render every candidate before scoring it. The LinkedIn preview rendering
576
- contract is the gate; character counts are secondary diagnostics only. Use the
577
- deterministic CSS contract when no authenticated LinkedIn screenshot is
578
- available:
579
-
580
- - mobile text width: `308px`
581
- - desktop text width: `582px`
582
- - font size: `14px`
583
- - line height: `21px`
584
- - white space: `pre-wrap`
585
- - overflow wrap: `break-word`
586
- - review clamp: first 3 rendered text lines
587
-
588
- Use the rendered gates from `references/linkedin-preview-rendering.md`:
589
-
590
- - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
591
- the end of the first 3 rendered lines, and either the core point is
592
- understandable without opening "see more" or an intentional open loop creates
593
- a specific click question with an immediate planned payoff.
594
- - `warn`: the mobile rendered preview creates useful curiosity but the core
595
- point or click question is slightly softened by wrapping, blank-line rhythm,
596
- or one missing context word. A compact fallback is required.
597
- - `fail`: the hook's real point appears after the first 3 mobile rendered
598
- lines without an intentional open-loop plan, the visible open loop is vague,
599
- the first rendered line is generic setup, blank lines consume the preview
600
- before the reader sees the point, or desktop fit is the only reason it looks
601
- good.
608
+ Use this conservative mobile-first LinkedIn preview gate. LinkedIn does not
609
+ publish exact "see more" cutoff rules, and rendering varies by device, app
610
+ version, font, media, and line break. These are v1 safety budgets, not claims
611
+ about an official LinkedIn limit:
612
+
613
+ - `pass`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
614
+ - `warn`: hook is 111-140 chars including newlines, any nonblank line is 46-55 chars, or blank lines create visual-line risk. Blank lines are allowed, but they count as physical lines.
615
+ - `fail`: hook is > 140 chars including newlines, any nonblank line is > 55 chars, or the hook's point depends on text after likely truncation.
602
616
 
603
617
  Desktop preview usually has more room. Still record `desktopPreviewFit`, but
604
618
  never let desktop fit compensate for a mobile `fail`.
605
619
 
606
- If a hook's point depends on text after the rendered mobile preview clamp,
607
- rewrite it before selecting it unless the hook is intentionally using a
608
- see-more open loop. Intentional open loops must show a specific click question
609
- inside the mobile clamp and must define the first payoff line after the fold. A
610
- selected hook may carry a `warn` only when the warning is explicit and the
611
- validation receipt includes a compact fallback. A hook with no rendered mobile
612
- and desktop preview record cannot be selected.
620
+ If a hook's point depends on text after the likely preview, rewrite it before
621
+ selecting it. A selected hook may carry a `warn` only when the warning is about
622
+ intentional blank-line rhythm or a slight line-length overage; include a compact
623
+ fallback in the validation receipt.
613
624
 
614
625
  ## Step 3: Draft
615
626
 
@@ -618,7 +629,12 @@ Draft from:
618
629
  - exact raw idea
619
630
  - selected premise card
620
631
  - selected hook
632
+ - approved or latest `Pre-Draft Structure Brief`
621
633
  - hook research artifact
634
+ - selected source template or no-template rationale
635
+ - viral-post outline
636
+ - post positioning breakdown template
637
+ - body expression candidates and combined body plan
622
638
  - user's core memory
623
639
  - story/proof files
624
640
  - post writing rules
@@ -639,15 +655,20 @@ Every saved draft needs a validation receipt with:
639
655
  - selected premise card
640
656
  - candidate hooks considered
641
657
  - selected hook and why
642
- - hook reverse-engineering audit
643
- - hook angle matrix summary
644
- - see-more click audit
658
+ - pre-draft structure brief
659
+ - selected source template and no-copy adaptation rationale
660
+ - post positioning breakdown
661
+ - viral-post outline
662
+ - hook-to-body promise map
663
+ - body expression candidates and combined body plan
645
664
  - proof claims used and source
646
665
  - story/proof files consulted
647
666
  - gold standards consulted
648
667
  - LinkedIn preview audit
649
- - rendered mobile and desktop hook preview blocks
650
668
  - premise/value audit findings
669
+ - mobile scanability audit findings
670
+ - template-adaptation audit findings
671
+ - abstraction-to-concrete rewrite audit findings
651
672
  - simplifier/concrete-language audit findings
652
673
  - voice audit findings
653
674
  - anti-AI audit findings
@@ -742,8 +763,14 @@ iteration:
742
763
  score: <compact score object>
743
764
  selected_premise: <premise or none>
744
765
  selected_hook: <hook>
766
+ pre_draft_structure_brief: <compact structure summary or none>
767
+ selected_source_template: <template name/source or none>
745
768
  validation_summary:
746
769
  premise_value: pass | needs_user_input | needs_revision
770
+ mobile_scanability: pass | needs_revision
771
+ template_adaptation: pass | needs_revision | blocked
772
+ abstraction_to_concrete: pass | needs_revision
773
+ hook_to_body_repayment: pass | needs_revision
747
774
  proof: pass | needs_user_input | blocked
748
775
  voice: pass | needs_revision
749
776
  anti_ai: pass | needs_revision
@@ -119,8 +119,6 @@ Show compact candidate cards. Include:
119
119
  - why it might belong in the pack
120
120
  - hook mechanism
121
121
  - hook preview budget status and measurement basis
122
- - rendered mobile preview block and verdict
123
- - rendered desktop preview block and verdict
124
122
  - content/body mechanism
125
123
  - rhythm notes
126
124
  - sentence-structure notes
@@ -196,15 +194,6 @@ Tags:
196
194
  - longest nonblank line chars:
197
195
  - blank-line visual risk:
198
196
  - source text basis:
199
- - render basis:
200
- - css contract version:
201
- - mobile rendered preview block:
202
- - desktop rendered preview block:
203
- - mobile rendered lines:
204
- - desktop rendered lines:
205
- - core pain/proof/curiosity visible on mobile:
206
- - core point visible on mobile:
207
- - point after mobile clamp:
208
197
  - preview budget status:
209
198
  - mobile preview fit:
210
199
  - desktop preview fit: