@sellable/mcp 0.1.237 → 0.1.239
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/engage-memory.d.ts +1 -0
- package/dist/engage-memory.js +18 -2
- package/dist/identity-memory.d.ts +1 -0
- package/dist/identity-memory.js +27 -0
- package/dist/tools/content-posts.d.ts +8 -0
- package/dist/tools/content-posts.js +23 -7
- package/dist/tools/engage-memory.js +1 -1
- package/dist/tools/registry.d.ts +2 -0
- package/package.json +2 -1
- package/skills/create-campaign-v2/SKILL.md +5 -4
- package/skills/create-campaign-v2/SOUL.md +4 -3
- package/skills/create-campaign-v2/core/flow.v2.json +1 -1
- package/skills/create-campaign-v2/references/approval-gate-framing.md +1 -1
- package/skills/create-campaign-v2/references/validation-criteria.md +4 -4
- package/skills/create-post/SKILL.md +119 -13
- package/skills/create-post/references/gold-standard-post-pack.md +211 -0
- package/skills/create-post/references/hook-research-playbook.md +103 -4
- package/skills/create-post/references/post-file-contract.md +5 -1
- package/skills/create-post/references/post-validation.md +76 -1
- package/skills/generate-messages/SKILL.md +5 -0
- package/skills/interview/references/reference-curation.md +27 -0
|
@@ -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
|
|
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.
|
|
13
13
|
|
|
14
14
|
Hard fail patterns:
|
|
15
15
|
|
|
@@ -20,7 +20,7 @@ Hard fail patterns:
|
|
|
20
20
|
- drafts that skip raw idea capture
|
|
21
21
|
- hooks copied verbatim from another creator
|
|
22
22
|
- using `~/.sellable/configs/content/linkedin-posts-drafts.md` as the normal save target
|
|
23
|
-
</role>
|
|
23
|
+
</role>
|
|
24
24
|
|
|
25
25
|
<scope>
|
|
26
26
|
V1 is posts-only and hooks-first.
|
|
@@ -42,7 +42,7 @@ Do not:
|
|
|
42
42
|
- optimize a comment workflow
|
|
43
43
|
- move identity/proof/story memory into content files
|
|
44
44
|
- append new drafts to the legacy flat file
|
|
45
|
-
</scope>
|
|
45
|
+
</scope>
|
|
46
46
|
|
|
47
47
|
<required_assets>
|
|
48
48
|
Before drafting, load all required assets with `mcp__sellable__get_subskill_asset`:
|
|
@@ -50,6 +50,7 @@ Before drafting, load all required assets with `mcp__sellable__get_subskill_asse
|
|
|
50
50
|
1. `subskillName: "create-post", assetPath: "references/post-file-contract.md"`
|
|
51
51
|
2. `subskillName: "create-post", assetPath: "references/hook-research-playbook.md"`
|
|
52
52
|
3. `subskillName: "create-post", assetPath: "references/post-validation.md"`
|
|
53
|
+
4. `subskillName: "create-post", assetPath: "references/gold-standard-post-pack.md"`
|
|
53
54
|
|
|
54
55
|
If any required asset is missing, unreadable, truncated without continuation, or internally inconsistent, return:
|
|
55
56
|
|
|
@@ -89,7 +90,7 @@ Do not call outbound/campaign tools from this skill. Do not call message-generat
|
|
|
89
90
|
Load user memory before hook generation or drafting:
|
|
90
91
|
|
|
91
92
|
1. Call `mcp__sellable__get_engage_memory`.
|
|
92
|
-
2. Read or use the returned core memory fields:
|
|
93
|
+
2. Read or use the returned core identity memory and company memory fields:
|
|
93
94
|
- `core/about-me.md`
|
|
94
95
|
- `core/my-company.md`
|
|
95
96
|
- `core/anti-ai-writing-style.md`
|
|
@@ -100,11 +101,44 @@ Load user memory before hook generation or drafting:
|
|
|
100
101
|
- `core/context-modes.md`
|
|
101
102
|
- `core/decision-rules.md`
|
|
102
103
|
- `core/references/**`
|
|
103
|
-
3.
|
|
104
|
+
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.
|
|
105
|
+
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.
|
|
106
|
+
|
|
107
|
+
`writing/posts.md` is a post-writing config file, not a draft library. Treat its structure this way:
|
|
108
|
+
|
|
109
|
+
- Top scratch or `## Draft Rule Candidates` sections are candidate taste notes only.
|
|
110
|
+
- The bottom `## Canonical Compiled Rules` section is the active post-writing config.
|
|
111
|
+
- `## Canonical Compiled Rules` overrides conflicting draft notes.
|
|
112
|
+
- Use draft candidates only when they do not conflict with canonical rules or when the user explicitly asks to test one.
|
|
113
|
+
- Do not save post bodies, hook research, or published records into `writing/posts.md`.
|
|
104
114
|
|
|
105
115
|
New users may have blank or missing core files until they run `$sellable:interview`. If story, proof, identity, or company memory is missing, ask for the missing material or ask the user to run `$sellable:interview`. Never fabricate what should have come from `story-bank.md`, `proof-ledger.md`, or `answer-bank.md`.
|
|
106
116
|
|
|
107
117
|
The interview/core memory files remain the durable source for stories and proof. This skill may read them, but it must not move them into `~/.sellable/content/**`.
|
|
118
|
+
|
|
119
|
+
Use core context modes as drafting constraints, not decorative labels. If a
|
|
120
|
+
post idea exposes durable memory that should help future writing, propose a
|
|
121
|
+
core write-back before saving it. The user must be able to approve, edit, or
|
|
122
|
+
reject each proposed memory update before it is written.
|
|
123
|
+
|
|
124
|
+
Durable write-back targets:
|
|
125
|
+
|
|
126
|
+
- `core/answer-bank.md` for reusable user answers, positioning, or taste rules
|
|
127
|
+
- `core/wins-ledger.md` for verified wins and outcomes
|
|
128
|
+
- `core/change-log.md` for approved corrections, rejected-but-useful proposals,
|
|
129
|
+
privacy decisions, and downstream prompt/operator notes
|
|
130
|
+
- `core/story-bank.md` for reusable first-person stories
|
|
131
|
+
- `core/transcripts/INDEX.md` for source interview or voice-memo references
|
|
132
|
+
- `core/references/linkedin-posts/INDEX.md` and adjacent files for approved
|
|
133
|
+
gold-standard post references
|
|
134
|
+
|
|
135
|
+
Write-backs must use stable source keys such as
|
|
136
|
+
`create-post:{date}:{ideaId}:{slug}` or
|
|
137
|
+
`create-post-research:{date}:{sourcePostHash}:{slug}`. Check existing copied
|
|
138
|
+
paths before adding references, create no duplicate reference rows, and keep
|
|
139
|
+
manual sections preserved. If the user says to mark private, store only the
|
|
140
|
+
minimum private-safe metadata and do not promote it into public proof,
|
|
141
|
+
references, or examples.
|
|
108
142
|
</memory_contract>
|
|
109
143
|
|
|
110
144
|
<modes>
|
|
@@ -138,6 +172,31 @@ Use when the user says "run the pipeline on this idea" or asks for an immediate
|
|
|
138
172
|
Normal ad hoc mode still creates an ID'd idea artifact first with `mcp__sellable__capture_post_idea`, preserving the raw input first. Then run the full pipeline immediately.
|
|
139
173
|
|
|
140
174
|
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
|
+
|
|
176
|
+
## Gold Standard Pack Mode
|
|
177
|
+
|
|
178
|
+
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.
|
|
179
|
+
|
|
180
|
+
Load `references/gold-standard-post-pack.md` and follow it exactly.
|
|
181
|
+
|
|
182
|
+
Personal best import:
|
|
183
|
+
|
|
184
|
+
1. Ask for the user's LinkedIn profile URL or handle if missing.
|
|
185
|
+
2. Call `mcp__sellable__fetch_linkedin_posts`.
|
|
186
|
+
3. Rank candidate posts by engagement quality, full-text availability, voice usefulness, and topic fit.
|
|
187
|
+
4. Split each candidate into hook, content/body mechanism, rhythm, sentence structure, proof/story use, voice fit, risks, and allowed use.
|
|
188
|
+
5. Show a numbered list and ask which posts to add.
|
|
189
|
+
6. Add only the user-approved selections to `~/.sellable/configs/core/references/linkedin-posts/**`.
|
|
190
|
+
|
|
191
|
+
Space benchmark research:
|
|
192
|
+
|
|
193
|
+
1. Use `mcp__sellable__search_engagement_posts` and the hook research playbook.
|
|
194
|
+
2. Shortlist high-performing posts from the user's space using the weighted signal rules.
|
|
195
|
+
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.
|
|
198
|
+
|
|
199
|
+
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.
|
|
141
200
|
</modes>
|
|
142
201
|
|
|
143
202
|
<pipeline>
|
|
@@ -145,8 +204,9 @@ If the user explicitly says not to save anything, label the output `unsaved_prev
|
|
|
145
204
|
|
|
146
205
|
1. Load all required assets.
|
|
147
206
|
2. Load memory and post writing rules.
|
|
148
|
-
3.
|
|
149
|
-
4.
|
|
207
|
+
3. Load the gold-standard post pack if present.
|
|
208
|
+
4. Verify auth/workspace if hook research will use Sellable search.
|
|
209
|
+
5. Capture or load the source idea.
|
|
150
210
|
|
|
151
211
|
If local idea capture succeeds but auth/workspace is missing, keep the idea and return a typed blocked state for draft readiness:
|
|
152
212
|
|
|
@@ -163,21 +223,29 @@ Use `references/hook-research-playbook.md`.
|
|
|
163
223
|
Default flow:
|
|
164
224
|
|
|
165
225
|
1. Convert the idea into 3-8 search keywords.
|
|
166
|
-
2. Call `mcp__sellable__search_engagement_posts
|
|
167
|
-
3. Shortlist high-engagement posts by topic fit and
|
|
226
|
+
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.
|
|
227
|
+
3. Shortlist high-engagement posts by topic fit, hook strength, creator repeat evidence, and weighted engagement quality.
|
|
168
228
|
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.
|
|
169
229
|
5. If full text cannot be matched, record `full_text_unavailable` and use only the preview. Do not invent missing body details.
|
|
170
|
-
6.
|
|
171
|
-
7.
|
|
230
|
+
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
|
+
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`.
|
|
172
235
|
|
|
173
236
|
Record provenance:
|
|
174
237
|
|
|
175
238
|
- keywords
|
|
176
239
|
- filters
|
|
240
|
+
- search window
|
|
177
241
|
- source post URLs
|
|
178
242
|
- authors/profile URLs
|
|
179
|
-
- engagement totals
|
|
243
|
+
- engagement totals and available likes/comments/shares breakdown
|
|
244
|
+
- creator repeat evidence
|
|
245
|
+
- lead-magnet or engagement-bait penalties
|
|
246
|
+
- story mechanism when relevant
|
|
180
247
|
- full-text match status
|
|
248
|
+
- source hook preview measurements and whether they came from full text or a search preview
|
|
181
249
|
- selected hook patterns
|
|
182
250
|
- why each pattern fits the user's idea and voice
|
|
183
251
|
|
|
@@ -189,13 +257,43 @@ Each hook must include:
|
|
|
189
257
|
|
|
190
258
|
- source hook pattern
|
|
191
259
|
- why it fits this idea
|
|
192
|
-
-
|
|
260
|
+
- `charCount`
|
|
261
|
+
- `charCountIncludingNewlines`
|
|
262
|
+
- `firstLineChars`
|
|
263
|
+
- `firstTwoLinesChars`
|
|
264
|
+
- `physicalLineCount`
|
|
265
|
+
- `contentLineCount`
|
|
266
|
+
- `longestNonblankLineChars`
|
|
267
|
+
- `blankLineVisualRisk`
|
|
268
|
+
- `previewBudgetStatus`
|
|
269
|
+
- `mobilePreviewFit`
|
|
270
|
+
- `desktopPreviewFit`
|
|
271
|
+
- `lineCountEstimate`
|
|
272
|
+
- `truncationRisk`
|
|
273
|
+
- `rewriteIfTruncated`
|
|
193
274
|
- proof/story dependency
|
|
194
275
|
- AI-tell risk
|
|
195
276
|
- score
|
|
196
277
|
|
|
197
278
|
Do not copy source wording. Copy only the structure.
|
|
198
279
|
|
|
280
|
+
Use this conservative mobile-first LinkedIn preview gate. LinkedIn does not
|
|
281
|
+
publish exact "see more" cutoff rules, and rendering varies by device, app
|
|
282
|
+
version, font, media, and line break. These are v1 safety budgets, not claims
|
|
283
|
+
about an official LinkedIn limit:
|
|
284
|
+
|
|
285
|
+
- `pass`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
|
|
286
|
+
- `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.
|
|
287
|
+
- `fail`: hook is > 140 chars including newlines, any nonblank line is > 55 chars, or the hook's point depends on text after likely truncation.
|
|
288
|
+
|
|
289
|
+
Desktop preview usually has more room. Still record `desktopPreviewFit`, but
|
|
290
|
+
never let desktop fit compensate for a mobile `fail`.
|
|
291
|
+
|
|
292
|
+
If a hook's point depends on text after the likely preview, rewrite it before
|
|
293
|
+
selecting it. A selected hook may carry a `warn` only when the warning is about
|
|
294
|
+
intentional blank-line rhythm or a slight line-length overage; include a compact
|
|
295
|
+
fallback in the validation receipt.
|
|
296
|
+
|
|
199
297
|
## Step 3: Draft
|
|
200
298
|
|
|
201
299
|
Draft from:
|
|
@@ -206,6 +304,7 @@ Draft from:
|
|
|
206
304
|
- user's core memory
|
|
207
305
|
- story/proof files
|
|
208
306
|
- post writing rules
|
|
307
|
+
- 1-3 relevant approved gold standards when available
|
|
209
308
|
|
|
210
309
|
If a claim cannot be traced to the raw idea, core memory, or user answer in the current session, remove it or ask.
|
|
211
310
|
|
|
@@ -221,9 +320,13 @@ Every saved draft needs a validation receipt with:
|
|
|
221
320
|
- selected hook and why
|
|
222
321
|
- proof claims used and source
|
|
223
322
|
- story/proof files consulted
|
|
323
|
+
- gold standards consulted
|
|
324
|
+
- LinkedIn preview audit
|
|
224
325
|
- simplifier/concrete-language audit findings
|
|
225
326
|
- voice audit findings
|
|
226
327
|
- anti-AI audit findings
|
|
328
|
+
- outbound AI-tell audit findings
|
|
329
|
+
- hook preview pass/warn/fail status and compact fallback when warned
|
|
227
330
|
- finalizer changes
|
|
228
331
|
- blocked/retry-needed reasons, if any
|
|
229
332
|
|
|
@@ -256,6 +359,7 @@ Published post records live under:
|
|
|
256
359
|
```text
|
|
257
360
|
~/.sellable/content/linkedin/published/
|
|
258
361
|
```
|
|
362
|
+
|
|
259
363
|
</pipeline>
|
|
260
364
|
|
|
261
365
|
<legacy>
|
|
@@ -278,7 +382,9 @@ validation_summary:
|
|
|
278
382
|
proof: pass | needs_user_input | blocked
|
|
279
383
|
voice: pass | needs_revision
|
|
280
384
|
anti_ai: pass | needs_revision
|
|
385
|
+
linkedin_preview: pass | warn | needs_revision
|
|
281
386
|
concrete_language: pass | needs_revision
|
|
282
387
|
next_step: <what the user should do next>
|
|
283
388
|
```
|
|
389
|
+
|
|
284
390
|
</response_shape>
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Gold Standard Post Pack
|
|
2
|
+
|
|
3
|
+
The gold-standard pack is user-owned memory with an MCP-owned schema.
|
|
4
|
+
|
|
5
|
+
MCP owns:
|
|
6
|
+
|
|
7
|
+
- this schema
|
|
8
|
+
- selection workflow
|
|
9
|
+
- scoring rubric
|
|
10
|
+
- decomposition rules
|
|
11
|
+
- validation rules
|
|
12
|
+
|
|
13
|
+
The user's computer owns:
|
|
14
|
+
|
|
15
|
+
- personal best posts
|
|
16
|
+
- approved inspiration posts from the space
|
|
17
|
+
- copied or distilled examples
|
|
18
|
+
- approval notes
|
|
19
|
+
- allowed-use limits
|
|
20
|
+
|
|
21
|
+
## Storage
|
|
22
|
+
|
|
23
|
+
Approved gold standards live under:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
~/.sellable/configs/core/references/linkedin-posts/
|
|
27
|
+
INDEX.md
|
|
28
|
+
gold-standard-<slug>.md
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The pack is capped at 20 approved gold standards. Candidate examples do not
|
|
32
|
+
count toward the cap until the user approves them.
|
|
33
|
+
|
|
34
|
+
Do not store gold standards under `~/.sellable/content/linkedin/**`. Content
|
|
35
|
+
folders are for ideas, hook research, drafts, published records, and future
|
|
36
|
+
comment history. Gold standards are durable writing memory.
|
|
37
|
+
|
|
38
|
+
## Import Modes
|
|
39
|
+
|
|
40
|
+
### Personal Best Import
|
|
41
|
+
|
|
42
|
+
Use when the user asks to import their best posts, calibrate on their old posts,
|
|
43
|
+
or build the pack from their LinkedIn profile.
|
|
44
|
+
|
|
45
|
+
1. Ask for the user's LinkedIn profile URL or handle if it is not already known.
|
|
46
|
+
2. Call `mcp__sellable__fetch_linkedin_posts`.
|
|
47
|
+
3. Rank candidate personal posts by engagement quality, topic fit, full-text
|
|
48
|
+
availability, voice usefulness, and whether the user says the post felt like
|
|
49
|
+
them.
|
|
50
|
+
4. Present a numbered candidate list.
|
|
51
|
+
5. Ask which posts to add, skip, or mark as anti-examples.
|
|
52
|
+
6. Add only the user-approved selections.
|
|
53
|
+
|
|
54
|
+
### Space Benchmark Research
|
|
55
|
+
|
|
56
|
+
Use when the user asks to research what is working in the space or add outside
|
|
57
|
+
gold standards.
|
|
58
|
+
|
|
59
|
+
1. Derive search terms from the user's topic, ICP, current idea, and proven
|
|
60
|
+
search memory.
|
|
61
|
+
2. Use the hook research playbook and `mcp__sellable__search_engagement_posts`.
|
|
62
|
+
3. Prefer recent multi-month winners, repeated creator success, strong
|
|
63
|
+
share/repost signals, and full-text availability.
|
|
64
|
+
4. Penalize lead magnets, giveaway mechanics, engagement bait, celebrity-only
|
|
65
|
+
reach, and examples that cannot be adapted to the user's voice.
|
|
66
|
+
5. Present candidates with a clear "should we use these as gold standards?"
|
|
67
|
+
approval gate.
|
|
68
|
+
6. Add only the user-approved selections.
|
|
69
|
+
|
|
70
|
+
## Candidate Presentation
|
|
71
|
+
|
|
72
|
+
Show compact candidate cards. Include:
|
|
73
|
+
|
|
74
|
+
- candidate number
|
|
75
|
+
- type: `personal_best`, `space_benchmark`, or `anti_example`
|
|
76
|
+
- author
|
|
77
|
+
- source URL
|
|
78
|
+
- engagement breakdown when available
|
|
79
|
+
- why it might belong in the pack
|
|
80
|
+
- hook mechanism
|
|
81
|
+
- hook preview budget status and measurement basis
|
|
82
|
+
- content/body mechanism
|
|
83
|
+
- rhythm notes
|
|
84
|
+
- sentence-structure notes
|
|
85
|
+
- proof/story use
|
|
86
|
+
- voice fit
|
|
87
|
+
- risks
|
|
88
|
+
- allowed use recommendation
|
|
89
|
+
|
|
90
|
+
Approval prompt:
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
Gold-standard pack: <current_count>/20 approved.
|
|
94
|
+
|
|
95
|
+
These look like candidates worth saving. Which should I add?
|
|
96
|
+
Reply with numbers to add, "skip all", or "replace <existing> with <new>" if the pack is full.
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Do not write candidates to the approved pack before the user chooses.
|
|
100
|
+
|
|
101
|
+
## Approved Index Schema
|
|
102
|
+
|
|
103
|
+
`INDEX.md` should use a table with these fields:
|
|
104
|
+
|
|
105
|
+
- `Status` - `approved` or `anti-example`
|
|
106
|
+
- `Type` - `personal_best` or `space_benchmark`
|
|
107
|
+
- `Title`
|
|
108
|
+
- `Source URL`
|
|
109
|
+
- `Copied Path`
|
|
110
|
+
- `Added`
|
|
111
|
+
- `Score`
|
|
112
|
+
- `Tags`
|
|
113
|
+
- `Primary Use`
|
|
114
|
+
- `Allowed Use`
|
|
115
|
+
- `Hook Pattern`
|
|
116
|
+
- `Body Pattern`
|
|
117
|
+
- `Rhythm Notes`
|
|
118
|
+
- `Sentence Notes`
|
|
119
|
+
- `Risks`
|
|
120
|
+
- `Key`
|
|
121
|
+
|
|
122
|
+
Use stable keys from normalized source URL/title plus an optional content hash.
|
|
123
|
+
If the same source appears again, update the existing row instead of adding a
|
|
124
|
+
duplicate.
|
|
125
|
+
|
|
126
|
+
## Approved Example File Schema
|
|
127
|
+
|
|
128
|
+
Each copied or distilled `gold-standard-<slug>.md` should include:
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
# <Title>
|
|
132
|
+
|
|
133
|
+
Source URL:
|
|
134
|
+
Type:
|
|
135
|
+
Status:
|
|
136
|
+
Added:
|
|
137
|
+
Allowed use:
|
|
138
|
+
Tags:
|
|
139
|
+
|
|
140
|
+
## Original Or Distilled Text
|
|
141
|
+
|
|
142
|
+
<Full text only when safe and approved. Otherwise store a short distilled summary.>
|
|
143
|
+
|
|
144
|
+
## Hook Breakdown
|
|
145
|
+
|
|
146
|
+
- hook text:
|
|
147
|
+
- char count:
|
|
148
|
+
- char count including newlines:
|
|
149
|
+
- first-line chars:
|
|
150
|
+
- first-two-line chars:
|
|
151
|
+
- physical line count:
|
|
152
|
+
- content line count:
|
|
153
|
+
- longest nonblank line chars:
|
|
154
|
+
- blank-line visual risk:
|
|
155
|
+
- source text basis:
|
|
156
|
+
- preview budget status:
|
|
157
|
+
- mobile preview fit:
|
|
158
|
+
- desktop preview fit:
|
|
159
|
+
- hook mechanism:
|
|
160
|
+
- internal question:
|
|
161
|
+
- emotional trigger:
|
|
162
|
+
|
|
163
|
+
## Content / Body Breakdown
|
|
164
|
+
|
|
165
|
+
- thesis:
|
|
166
|
+
- body mechanism:
|
|
167
|
+
- story mechanism:
|
|
168
|
+
- proof mechanism:
|
|
169
|
+
- argument moves:
|
|
170
|
+
- close:
|
|
171
|
+
- what made it work:
|
|
172
|
+
|
|
173
|
+
## Rhythm
|
|
174
|
+
|
|
175
|
+
- line breaks:
|
|
176
|
+
- paragraph length:
|
|
177
|
+
- sentence length:
|
|
178
|
+
- pacing:
|
|
179
|
+
- punctuation:
|
|
180
|
+
|
|
181
|
+
## Sentence Structure
|
|
182
|
+
|
|
183
|
+
- sentence starts:
|
|
184
|
+
- fragments:
|
|
185
|
+
- contrast moves:
|
|
186
|
+
- specificity moves:
|
|
187
|
+
- repeated syntax:
|
|
188
|
+
|
|
189
|
+
## Usage Notes
|
|
190
|
+
|
|
191
|
+
- imitate:
|
|
192
|
+
- do not copy:
|
|
193
|
+
- voice fit:
|
|
194
|
+
- risks:
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Selection Rules For Drafting
|
|
198
|
+
|
|
199
|
+
Before drafting a post, use at most 1-3 relevant gold standards. Prefer:
|
|
200
|
+
|
|
201
|
+
- the user's own approved posts over outside benchmarks
|
|
202
|
+
- examples with matching topic, mechanism, or story shape
|
|
203
|
+
- examples whose allowed use includes `imitate structure`
|
|
204
|
+
- examples with clear hook/body/rhythm/sentence decomposition
|
|
205
|
+
|
|
206
|
+
Never copy outside wording. For personal posts, reuse wording only when the user
|
|
207
|
+
explicitly asks to reuse their own line. Otherwise, use the pack for structure,
|
|
208
|
+
taste, and judgment.
|
|
209
|
+
|
|
210
|
+
If the pack is empty, continue with core memory and hook research. Do not block
|
|
211
|
+
normal drafting just because no gold standards exist.
|
|
@@ -15,11 +15,51 @@ Derive 3-8 keyword searches from:
|
|
|
15
15
|
|
|
16
16
|
Use `mcp__sellable__search_engagement_posts` with practical constraints:
|
|
17
17
|
|
|
18
|
-
-
|
|
18
|
+
- explicit `maxAgeDays: 120` by default so research covers the past 30-120 days, not only this week's posts
|
|
19
|
+
- tighten to 30-60 days for trend-sensitive topics; widen only when the topic has low volume
|
|
19
20
|
- high enough engagement to matter
|
|
20
21
|
- narrow enough to match the idea
|
|
22
|
+
- enough result depth to see whether a creator has repeated winners, not just one viral outlier
|
|
21
23
|
|
|
22
|
-
Record every keyword, filter, and result count.
|
|
24
|
+
Record every keyword, filter, search window, page, and result count.
|
|
25
|
+
|
|
26
|
+
## Weighted Signals
|
|
27
|
+
|
|
28
|
+
Rank source posts with a weighted signal view. Do not sort by total engagement alone.
|
|
29
|
+
|
|
30
|
+
Use this scoring shape:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
hook_score =
|
|
34
|
+
topic_fit
|
|
35
|
+
+ hook_clarity
|
|
36
|
+
+ creator_repeat_success
|
|
37
|
+
+ repost_share_strength
|
|
38
|
+
+ comment_quality
|
|
39
|
+
- lead_magnet_penalty
|
|
40
|
+
- engagement_bait_penalty
|
|
41
|
+
- off_voice_penalty
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Guidance:
|
|
45
|
+
|
|
46
|
+
- Shares/reposts are the strongest signal because a reader spends their own feed reputation.
|
|
47
|
+
- Comments are stronger than reactions only when they are substantive; giveaway comments are weak.
|
|
48
|
+
- Reactions are weak reach unless paired with shares/reposts or strong comments.
|
|
49
|
+
- If the tool returns `engagement.shares`, treat it as the repost/share proxy.
|
|
50
|
+
- If share or repost data is unavailable, record `repost_data_unavailable` instead of inventing it.
|
|
51
|
+
- Prefer creators with repeated high-performing posts in the same lane over one-off viral posts.
|
|
52
|
+
|
|
53
|
+
Penalize lead-magnet and engagement-bait mechanics unless the user explicitly asks for that style:
|
|
54
|
+
|
|
55
|
+
- `comment "template"` / `comment "guide"` / `comment "playbook"`
|
|
56
|
+
- "DM me"
|
|
57
|
+
- "I'll send it"
|
|
58
|
+
- "free template"
|
|
59
|
+
- "free prompt"
|
|
60
|
+
- "repost for access"
|
|
61
|
+
- "like and comment"
|
|
62
|
+
- broad giveaway framing that makes engagement inflate without proving the hook/body worked
|
|
23
63
|
|
|
24
64
|
## Full Text Reality
|
|
25
65
|
|
|
@@ -34,6 +74,47 @@ When full hook/body text matters:
|
|
|
34
74
|
|
|
35
75
|
If full text is unavailable, record `full_text_unavailable`. Use only the preview for hook analysis and do not infer missing body details.
|
|
36
76
|
|
|
77
|
+
## Opening Preview Measurement
|
|
78
|
+
|
|
79
|
+
Measure the visible opening for every shortlisted source post before extracting
|
|
80
|
+
the hook pattern. This makes the study useful for LinkedIn, not just generally
|
|
81
|
+
"good writing."
|
|
82
|
+
|
|
83
|
+
LinkedIn does not publish exact "see more" cutoff rules. Treat these as
|
|
84
|
+
conservative v1 planning budgets:
|
|
85
|
+
|
|
86
|
+
- `pass`: opening hook is <= 110 chars including newlines, every nonblank line
|
|
87
|
+
is <= 45 chars, and the hook's core point lands before likely truncation.
|
|
88
|
+
- `warn`: opening hook is 111-140 chars including newlines, any nonblank line is
|
|
89
|
+
46-55 chars, or blank lines create visual-line risk. Blank lines are allowed,
|
|
90
|
+
but they count as physical lines.
|
|
91
|
+
- `fail`: opening hook is > 140 chars including newlines, any nonblank line is
|
|
92
|
+
> 55 chars, or the hook's core point depends on text after likely truncation.
|
|
93
|
+
|
|
94
|
+
Desktop preview has more room, so record it separately, but never let desktop
|
|
95
|
+
fit compensate for a mobile `fail`.
|
|
96
|
+
|
|
97
|
+
For each source, record:
|
|
98
|
+
|
|
99
|
+
- `sourceTextBasis`: `full_text`, `search_preview`, or `manual_user_source`
|
|
100
|
+
- `openingTextUsed`
|
|
101
|
+
- `charCountIncludingNewlines`
|
|
102
|
+
- `physicalLineCount`
|
|
103
|
+
- `contentLineCount`
|
|
104
|
+
- `firstLineChars`
|
|
105
|
+
- `firstTwoPhysicalLinesChars`
|
|
106
|
+
- `firstTwoContentLinesChars`
|
|
107
|
+
- `longestNonblankLineChars`
|
|
108
|
+
- `blankLineCountBeforeFold`
|
|
109
|
+
- `mobilePreviewBudget`: `pass`, `warn`, or `fail`
|
|
110
|
+
- `desktopPreviewBudget`: `pass`, `warn`, or `fail`
|
|
111
|
+
- `blankLineVisualRisk`
|
|
112
|
+
- `corePointBeforeLikelyTruncation`
|
|
113
|
+
|
|
114
|
+
If only a search preview is available, do not pretend the opening is complete.
|
|
115
|
+
Record `sourceTextBasis: search_preview` and lower confidence when the hook
|
|
116
|
+
appears cut off or body context is unavailable.
|
|
117
|
+
|
|
37
118
|
## Hook Extraction
|
|
38
119
|
|
|
39
120
|
Extract structure, not wording.
|
|
@@ -42,15 +123,33 @@ For each shortlisted source post, record:
|
|
|
42
123
|
|
|
43
124
|
- URL
|
|
44
125
|
- author
|
|
45
|
-
- engagement totals
|
|
126
|
+
- engagement totals and available likes/comments/shares breakdown
|
|
127
|
+
- creator repeat evidence
|
|
46
128
|
- visible hook text or preview
|
|
47
|
-
-
|
|
129
|
+
- opening preview measurement fields from the section above
|
|
48
130
|
- hook mechanism
|
|
131
|
+
- story mechanism when the post is a story
|
|
49
132
|
- internal question created
|
|
50
133
|
- emotional trigger
|
|
51
134
|
- proof/story dependency
|
|
135
|
+
- lead magnet or engagement bait penalty
|
|
136
|
+
- weighted signal notes
|
|
52
137
|
- replicability score
|
|
53
138
|
|
|
139
|
+
## Story Mechanism
|
|
140
|
+
|
|
141
|
+
For story posts, do not reduce the source to "strong first line" or a generic lesson. Extract the mechanism that made the story travel:
|
|
142
|
+
|
|
143
|
+
- concrete first-person moment
|
|
144
|
+
- visible tension or tradeoff
|
|
145
|
+
- mistake, regret, reversal, or confession
|
|
146
|
+
- before/after shift
|
|
147
|
+
- founder/operator decision point
|
|
148
|
+
- uncomfortable but specific truth
|
|
149
|
+
- proof embedded in the scene rather than pasted on later
|
|
150
|
+
|
|
151
|
+
If the source story only works because of celebrity, outrage, giveaway mechanics, or an unavailable body section, mark it as low-replicability or `full_text_unavailable`.
|
|
152
|
+
|
|
54
153
|
## Blocked States
|
|
55
154
|
|
|
56
155
|
Local idea capture can still succeed when research fails.
|
|
@@ -59,6 +59,9 @@ Hook research files must preserve:
|
|
|
59
59
|
- author/profile URLs
|
|
60
60
|
- engagement totals
|
|
61
61
|
- full-text availability
|
|
62
|
+
- source hook preview measurements, including text basis, char count including
|
|
63
|
+
newlines, physical/content line counts, longest nonblank line, blank-line
|
|
64
|
+
visual risk, and mobile/desktop preview budget status
|
|
62
65
|
- extracted hook patterns
|
|
63
66
|
- selected hook basis
|
|
64
67
|
|
|
@@ -67,7 +70,8 @@ Draft files must preserve:
|
|
|
67
70
|
- source idea ID
|
|
68
71
|
- hook research ID
|
|
69
72
|
- draft body
|
|
70
|
-
- validation receipt
|
|
73
|
+
- validation receipt, including LinkedIn preview pass/warn/fail status and
|
|
74
|
+
compact fallback when the selected hook carries a warning
|
|
71
75
|
- status: `draft`, `ready`, or `needs_revision`
|
|
72
76
|
|
|
73
77
|
Published files must preserve:
|