@sellable/mcp 0.1.258 → 0.1.259
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/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/server.js +4 -1
- package/dist/tools/csv-dnc.d.ts +36 -0
- package/dist/tools/csv-dnc.js +94 -2
- package/dist/tools/engage-discovery.d.ts +0 -21
- package/dist/tools/engage-discovery.js +9 -136
- package/dist/tools/leads.d.ts +381 -21
- package/dist/tools/leads.js +219 -5
- package/dist/tools/registry.d.ts +207 -23
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +6 -0
- package/skills/create-campaign-v2/references/filter-leads.md +2 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +2 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +3 -1
- package/skills/create-post/SKILL.md +28 -122
- package/skills/create-post/references/gold-standard-post-pack.md +0 -11
- package/skills/create-post/references/hook-research-playbook.md +15 -314
- package/skills/create-post/references/post-file-contract.md +0 -21
- package/skills/create-post/references/post-validation.md +15 -205
- package/skills/find-leads/SKILL.md +6 -0
- package/skills/create-post/references/linkedin-preview-rendering.md +0 -176
- package/skills/research/config.json +0 -9
|
@@ -11,10 +11,6 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
|
|
|
11
11
|
- `candidateHooksConsidered`
|
|
12
12
|
- `selectedHook`
|
|
13
13
|
- `selectedHookWhy`
|
|
14
|
-
- `sourceHookReachAudit`
|
|
15
|
-
- `hookReverseEngineeringAudit`
|
|
16
|
-
- `hookAngleMatrix`
|
|
17
|
-
- `seeMoreClickAudit`
|
|
18
14
|
- `proofClaimsUsed`
|
|
19
15
|
- `proofClaimSources`
|
|
20
16
|
- `storyFilesConsulted`
|
|
@@ -72,46 +68,16 @@ set the verdict to `revise` or `reject`.
|
|
|
72
68
|
|
|
73
69
|
## Candidate Set
|
|
74
70
|
|
|
75
|
-
Generate
|
|
76
|
-
|
|
77
|
-
Minimum candidate set:
|
|
78
|
-
|
|
79
|
-
- normal drafting: at least 8 angle territories and 24 hook candidates
|
|
80
|
-
- hook-critical requests: at least 12 angle territories and 40 hook candidates
|
|
81
|
-
- smaller set only when the user explicitly asks for fewer options
|
|
82
|
-
|
|
83
|
-
An angle territory is a distinct reason the reader might care, such as hidden
|
|
84
|
-
asset, tool/enemy contrast, first-person build proof, workflow reveal,
|
|
85
|
-
contrarian category claim, mistake/confession, market timing, operator pain,
|
|
86
|
-
specific person/company signal, before/after transformation, or question hook.
|
|
71
|
+
Generate multiple hook candidates before drafting. Do not lock onto the first draft.
|
|
87
72
|
|
|
88
73
|
Each candidate should include:
|
|
89
74
|
|
|
90
75
|
- hook text
|
|
91
76
|
- selected premise
|
|
92
|
-
- angle territory
|
|
93
77
|
- premise tension opened
|
|
94
78
|
- reader value implied
|
|
95
79
|
- source pattern
|
|
96
|
-
- source shape kept
|
|
97
|
-
- source words not copied
|
|
98
|
-
- source pattern reach signals: author follower count when available, target
|
|
99
|
-
follower band, follower-band fit, engagement per 1k followers, weighted
|
|
100
|
-
engagement per 1k followers, reach-adjusted score, baseline lift, and
|
|
101
|
-
confidence
|
|
102
80
|
- score
|
|
103
|
-
- `renderedPreview` using `references/linkedin-preview-rendering.md`
|
|
104
|
-
- literal mobile and desktop rendered preview blocks
|
|
105
|
-
- mobile and desktop rendered line wraps
|
|
106
|
-
- first-screen promise: pain, proof, or curiosity visible by the mobile clamp
|
|
107
|
-
- `intentionalOpenLoop`
|
|
108
|
-
- `specificClickQuestionVisible`
|
|
109
|
-
- `seeMoreClickReason`
|
|
110
|
-
- `clickQuestion`
|
|
111
|
-
- `payoffAfterFold`
|
|
112
|
-
- `bodyProofObligation`
|
|
113
|
-
- whether the core point is visible in the mobile rendered preview
|
|
114
|
-
- whether the point lands after the mobile clamp
|
|
115
81
|
- char count including newlines and first-line / first-two-line preview measurements
|
|
116
82
|
- physical line count, content line count, longest nonblank line, and blank-line risk
|
|
117
83
|
- `previewBudgetStatus`: `pass`, `warn`, or `fail`
|
|
@@ -120,55 +86,6 @@ Each candidate should include:
|
|
|
120
86
|
- AI-tell risk
|
|
121
87
|
- why it should win or lose
|
|
122
88
|
|
|
123
|
-
## Hook Reverse Engineering Audit
|
|
124
|
-
|
|
125
|
-
Before a draft can be `ready`, validate that the selected hook came from a real
|
|
126
|
-
source-shape analysis, not from generic brainstorming.
|
|
127
|
-
|
|
128
|
-
Record:
|
|
129
|
-
|
|
130
|
-
- `sourceHooksStudied`
|
|
131
|
-
- `sourceHookAutopsies`
|
|
132
|
-
- `selectedSourceShape`
|
|
133
|
-
- `sourceShapeKept`
|
|
134
|
-
- `sourceWordsNotCopied`
|
|
135
|
-
- `whyItWorks`
|
|
136
|
-
- `openLoopType`: `none`, `hidden_payoff`, `contradiction`, `proof_gap`,
|
|
137
|
-
`workflow_reveal`, `asset_reveal`, or `story_gap`
|
|
138
|
-
- `clickQuestion`
|
|
139
|
-
- `promisedPayoff`
|
|
140
|
-
- `specificityAnchor`
|
|
141
|
-
- `tensionOpened`
|
|
142
|
-
- `proofImplied`
|
|
143
|
-
- `adaptationRule`
|
|
144
|
-
- `bodyPayoffObligation`
|
|
145
|
-
|
|
146
|
-
The selected draft cannot be `ready` if the hook was copied verbatim from
|
|
147
|
-
another creator, if the receipt only says "contrarian" or "curiosity" without
|
|
148
|
-
the concrete shape, or if the body does not pay off the hook quickly.
|
|
149
|
-
|
|
150
|
-
## Hook Angle Matrix Audit
|
|
151
|
-
|
|
152
|
-
Before a draft can be `ready`, validate that the hook was chosen after exploring
|
|
153
|
-
materially different angles.
|
|
154
|
-
|
|
155
|
-
Record:
|
|
156
|
-
|
|
157
|
-
- `angleTerritoriesTested`
|
|
158
|
-
- `hookCandidatesGenerated`
|
|
159
|
-
- `winningTerritory`
|
|
160
|
-
- `runnerUpTerritories`
|
|
161
|
-
- `whyWinningAngleBeatsAlternatives`
|
|
162
|
-
- `whyRejectedHooksLost`
|
|
163
|
-
- `mobileRenderedPreviewBlocksForTopCandidates`
|
|
164
|
-
- `desktopRenderedPreviewBlocksForTopCandidates`
|
|
165
|
-
- `proofNeededByWinningAngle`
|
|
166
|
-
|
|
167
|
-
If the user asked to "nail the hook," "focus on hooks," or explore "a ton of
|
|
168
|
-
angles," the draft cannot be `ready` unless at least 12 territories and 40 hook
|
|
169
|
-
candidates were considered or the receipt explains why the user explicitly
|
|
170
|
-
requested fewer.
|
|
171
|
-
|
|
172
89
|
## Finalizer Pass
|
|
173
90
|
|
|
174
91
|
After the first draft:
|
|
@@ -181,7 +98,7 @@ After the first draft:
|
|
|
181
98
|
6. replace generic language with concrete words only when supported
|
|
182
99
|
7. preserve the user's actual story and point
|
|
183
100
|
8. remove AI tells
|
|
184
|
-
9. re-
|
|
101
|
+
9. re-check LinkedIn preview fit after edits
|
|
185
102
|
|
|
186
103
|
## Premise Value Audit
|
|
187
104
|
|
|
@@ -230,104 +147,24 @@ If `selectedControversy` is missing, if the audience belief is only a generic
|
|
|
230
147
|
label like "founders want growth," or if `credibleWhyUs` depends on borrowed
|
|
231
148
|
proof from another creator, save as `needs_revision`.
|
|
232
149
|
|
|
233
|
-
##
|
|
234
|
-
|
|
235
|
-
Before a draft can be `ready`, validate that the selected source hook pattern
|
|
236
|
-
was chosen for a reach-normalized reason, not raw audience size.
|
|
237
|
-
|
|
238
|
-
Record:
|
|
150
|
+
## LinkedIn Preview Audit
|
|
239
151
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
- `engagementPer1kFollowers`
|
|
245
|
-
- `weightedEngagementPer1kFollowers`
|
|
246
|
-
- `reachAdjustedScore`
|
|
247
|
-
- `reachPenaltyMultiplier`
|
|
248
|
-
- `creatorBaselineMedianEngagement` or `creator_baseline_unavailable`
|
|
249
|
-
- `baselineLift` or `creator_baseline_unavailable`
|
|
250
|
-
- `bigAccountPenaltyApplied`
|
|
251
|
-
- `whyTheHookCarries`
|
|
252
|
-
- `followerCountUnavailableSources`
|
|
253
|
-
- `whyThisHookIsAReachAdjustedSignal`
|
|
254
|
-
|
|
255
|
-
If the user asked for a follower range and the selected source pattern is from a
|
|
256
|
-
large account above the target range, the receipt must explain why it survived
|
|
257
|
-
the celebrity reach penalty. Use large-account hooks as secondary pattern
|
|
258
|
-
evidence unless they clearly overperform the creator's baseline or the hook
|
|
259
|
-
itself carries after reach is controlled. A draft cannot be `ready` when the
|
|
260
|
-
selected hook is justified only by raw total engagement or follower count.
|
|
152
|
+
Audit the selected hook and top candidates against conservative LinkedIn
|
|
153
|
+
preview budgets. LinkedIn does not publish exact "see more" cutoff rules, and
|
|
154
|
+
rendering varies by device, app version, font, media, and line break. This audit
|
|
155
|
+
is a mobile-first safety gate, not a claim about an official LinkedIn limit.
|
|
261
156
|
|
|
262
|
-
|
|
157
|
+
Use:
|
|
263
158
|
|
|
264
|
-
|
|
265
|
-
`
|
|
266
|
-
|
|
267
|
-
media, and line break. This audit is a mobile-first rendered-preview safety
|
|
268
|
-
gate, not a claim about an official LinkedIn limit.
|
|
269
|
-
|
|
270
|
-
Character budgets are secondary diagnostics. They cannot be the only evidence
|
|
271
|
-
that a hook works. Every selected hook must include literal rendered mobile and
|
|
272
|
-
desktop preview blocks.
|
|
273
|
-
|
|
274
|
-
Default deterministic renderer when no authenticated LinkedIn screenshot is
|
|
275
|
-
available:
|
|
276
|
-
|
|
277
|
-
```text
|
|
278
|
-
cssContractVersion: linkedin-preview-rendering/v1
|
|
279
|
-
font size: 14px
|
|
280
|
-
line height: 21px
|
|
281
|
-
white space: pre-wrap
|
|
282
|
-
overflow wrap: break-word
|
|
283
|
-
mobile text width: 308px
|
|
284
|
-
desktop text width: 582px
|
|
285
|
-
review clamp: first 3 rendered text lines
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
Use rendered gates:
|
|
289
|
-
|
|
290
|
-
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
|
|
291
|
-
the end of the first 3 rendered lines, and either the core point is
|
|
292
|
-
understandable without opening "see more" or an intentional open loop creates
|
|
293
|
-
a specific click question with an immediate planned payoff.
|
|
294
|
-
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
295
|
-
point or click question is slightly softened by wrapping, blank-line rhythm,
|
|
296
|
-
or one missing context word. A compact fallback is required.
|
|
297
|
-
- `fail`: the hook's real point appears after the first 3 mobile rendered
|
|
298
|
-
lines without an intentional open-loop plan, the visible open loop is vague,
|
|
299
|
-
the first rendered line is generic setup, blank lines consume the preview
|
|
300
|
-
before the reader sees the point, or desktop fit is the only reason it looks
|
|
301
|
-
good.
|
|
159
|
+
- `pass`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
|
|
160
|
+
- `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.
|
|
161
|
+
- `fail`: hook is > 140 chars including newlines, any nonblank line is > 55 chars, or the hook's point depends on text after likely truncation.
|
|
302
162
|
|
|
303
163
|
Desktop preview usually has more room. Still record desktop fit, but never let
|
|
304
164
|
desktop fit compensate for a mobile `fail`.
|
|
305
165
|
|
|
306
166
|
Record:
|
|
307
167
|
|
|
308
|
-
- `renderedPreview`
|
|
309
|
-
- `renderBasis`: `linkedin_css_contract`, `authenticated_linkedin_screenshot`,
|
|
310
|
-
or `manual_user_source`
|
|
311
|
-
- `cssContractVersion`
|
|
312
|
-
- `mobileRenderedPreviewBlock`
|
|
313
|
-
- `desktopRenderedPreviewBlock`
|
|
314
|
-
- `mobileRenderedLines`
|
|
315
|
-
- `desktopRenderedLines`
|
|
316
|
-
- `mobileTextWidthPx`
|
|
317
|
-
- `desktopTextWidthPx`
|
|
318
|
-
- `mobileRenderedLineCount`
|
|
319
|
-
- `desktopRenderedLineCount`
|
|
320
|
-
- `corePainProofOrCuriosityVisibleMobile`
|
|
321
|
-
- `corePainProofOrCuriosityVisibleDesktop`
|
|
322
|
-
- `corePointVisibleMobile`
|
|
323
|
-
- `corePointVisibleDesktop`
|
|
324
|
-
- `intentionalOpenLoop`
|
|
325
|
-
- `specificClickQuestionVisible`
|
|
326
|
-
- `payoffPlannedImmediatelyAfterClamp`
|
|
327
|
-
- `seeMoreClickReason`
|
|
328
|
-
- `clickQuestion`
|
|
329
|
-
- `payoffAfterFold`
|
|
330
|
-
- `pointAfterMobileClamp`
|
|
331
168
|
- `charCount`
|
|
332
169
|
- `charCountIncludingNewlines`
|
|
333
170
|
- `firstLineChars`
|
|
@@ -346,37 +183,10 @@ Record:
|
|
|
346
183
|
- `rewriteIfTruncated`
|
|
347
184
|
- `compactFallback` when `previewBudgetStatus` is `warn`
|
|
348
185
|
|
|
349
|
-
If the hook only works after
|
|
350
|
-
|
|
351
|
-
`
|
|
352
|
-
|
|
353
|
-
`corePointVisibleMobile: false` unless the receipt has
|
|
354
|
-
`intentionalOpenLoop: true`, `specificClickQuestionVisible: true`, and
|
|
355
|
-
`payoffPlannedImmediatelyAfterClamp: true`, or `pointAfterMobileClamp: true`
|
|
356
|
-
unless the post is intentionally hiding the payoff for a specific see-more
|
|
357
|
-
click. A draft may be `ready` with `previewBudgetStatus: warn` only when the
|
|
358
|
-
warning is explicit, usually because the user prefers blank-line rhythm, and
|
|
359
|
-
the receipt includes a compact fallback.
|
|
360
|
-
|
|
361
|
-
## See-More Click Audit
|
|
362
|
-
|
|
363
|
-
When the selected hook intentionally hides the payoff after the mobile fold,
|
|
364
|
-
record:
|
|
365
|
-
|
|
366
|
-
- `intentionalOpenLoop: true`
|
|
367
|
-
- `openLoopType`
|
|
368
|
-
- `visibleBeforeFold`
|
|
369
|
-
- `clickQuestion`
|
|
370
|
-
- `payoffAfterFold`
|
|
371
|
-
- `firstPayoffLine`
|
|
372
|
-
- `payoffArrivesWithinFirstBodySection`
|
|
373
|
-
- `readerValueAfterClick`
|
|
374
|
-
- `baitRisk`
|
|
375
|
-
- `baitRiskMitigation`
|
|
376
|
-
|
|
377
|
-
Open loops are allowed only when the body actually delivers the promised payoff.
|
|
378
|
-
If the hook withholds the answer but the body switches topics, save as
|
|
379
|
-
`needs_revision`.
|
|
186
|
+
If the hook only works after likely truncation, rewrite it. A draft cannot be
|
|
187
|
+
`ready` with `previewBudgetStatus: fail`. A draft may be `ready` with
|
|
188
|
+
`previewBudgetStatus: warn` only when the warning is explicit, usually because
|
|
189
|
+
the user prefers blank-line rhythm, and the receipt includes a compact fallback.
|
|
380
190
|
|
|
381
191
|
## Simplifier / Concrete-Language Audit
|
|
382
192
|
|
|
@@ -90,6 +90,7 @@ should stay focused on source evidence.
|
|
|
90
90
|
- `mcp__sellable__search_prospeo`
|
|
91
91
|
- `mcp__sellable__search_prospeo_companies`
|
|
92
92
|
- `mcp__sellable__confirm_prospeo_company_accounts`
|
|
93
|
+
- `mcp__sellable__list_dnc_entries`
|
|
93
94
|
- `mcp__sellable__load_csv_dnc_entries`
|
|
94
95
|
- `mcp__sellable__load_csv_domains`
|
|
95
96
|
- `mcp__sellable__load_csv_linkedin_leads`
|
|
@@ -105,6 +106,9 @@ should stay focused on source evidence.
|
|
|
105
106
|
list after confirming the exact active workspace. Keep the mechanism to
|
|
106
107
|
Sellable DNC and `DNC Check`, not provider search work or Prospeo domain
|
|
107
108
|
filters.
|
|
109
|
+
- If the user asks to see the current DNC count, list names, or first page
|
|
110
|
+
before import, call `list_dnc_entries`. Report the active workspace name and
|
|
111
|
+
ID from the tool response before any DNC write.
|
|
108
112
|
- Do not infer sender identities from meeting attendance alone. Only treat someone as a sender when the source material explicitly identifies them as a sender or supplies their LinkedIn URL.
|
|
109
113
|
- Do not ask Layer 1 questions already answered by a transcript, ICP doc, or Layer 0 research.
|
|
110
114
|
- Do not include Apollo in the explorer set for this phase.
|
|
@@ -136,6 +140,8 @@ Execution flow:
|
|
|
136
140
|
DNC entries.
|
|
137
141
|
- Campaign creation already includes `DNC Check`, which checks domain/profile
|
|
138
142
|
before message generation.
|
|
143
|
+
- If the user wants the existing DNC count or first page first, call
|
|
144
|
+
`list_dnc_entries` before previewing the import.
|
|
139
145
|
3. If the user has a CSV of LinkedIn profile URLs on disk, call `load_csv_linkedin_leads` first.
|
|
140
146
|
- Preview, confirm, then review the resulting lead list before `confirm_lead_list`.
|
|
141
147
|
- Confirmed execution uploads the raw CSV file, starts the server-owned import job, and waits on lead-list readiness before returning.
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
# LinkedIn Preview Rendering
|
|
2
|
-
|
|
3
|
-
This asset defines the required rendered-preview contract for create-post hook
|
|
4
|
-
research, hook candidate generation, gold-standard decomposition, and draft
|
|
5
|
-
validation.
|
|
6
|
-
|
|
7
|
-
Character budgets are only diagnostics. They are not the preview gate. A hook is
|
|
8
|
-
not studied, selected, or ready until it has been rendered through this contract
|
|
9
|
-
or through a stricter authenticated LinkedIn screenshot.
|
|
10
|
-
|
|
11
|
-
## Rendering Basis
|
|
12
|
-
|
|
13
|
-
LinkedIn does not publish exact feed truncation rules, and rendering can vary by
|
|
14
|
-
surface, app version, device, media attachment, and account state. Use this
|
|
15
|
-
deterministic renderer as the MCP review gate for unpublished drafts.
|
|
16
|
-
|
|
17
|
-
When an authenticated LinkedIn feed/composer/browser screenshot is available,
|
|
18
|
-
that screenshot is the strongest evidence. Still record the fields below so
|
|
19
|
-
future agents can compare candidates without redoing the visual inspection.
|
|
20
|
-
|
|
21
|
-
Observed public LinkedIn post text style for feed-style post pages:
|
|
22
|
-
|
|
23
|
-
```text
|
|
24
|
-
selector basis: p.attributed-text-segment-list__content
|
|
25
|
-
font family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
|
|
26
|
-
"Fira Sans", Ubuntu, "Oxygen Sans", Cantarell, "Droid Sans",
|
|
27
|
-
"Lucida Grande", Helvetica, Arial, sans-serif
|
|
28
|
-
font size: 14px
|
|
29
|
-
line height: 21px
|
|
30
|
-
font weight: 400
|
|
31
|
-
letter spacing: normal
|
|
32
|
-
white space: pre-wrap
|
|
33
|
-
overflow wrap: break-word
|
|
34
|
-
text color: rgba(0, 0, 0, 0.9)
|
|
35
|
-
mobile text width: 308px
|
|
36
|
-
desktop text width: 582px
|
|
37
|
-
review clamp: first 3 rendered text lines
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
The `review clamp` is not an official LinkedIn rule. It is the conservative
|
|
41
|
-
apples-to-apples region create-post must use when comparing hooks. Do not let a
|
|
42
|
-
desktop pass rescue a mobile fail.
|
|
43
|
-
|
|
44
|
-
## Required Rendering Record
|
|
45
|
-
|
|
46
|
-
Every shortlisted source hook, adapted hook block, generated hook candidate, and
|
|
47
|
-
selected hook must include a `renderedPreview` record:
|
|
48
|
-
|
|
49
|
-
```text
|
|
50
|
-
renderedPreview:
|
|
51
|
-
basis: linkedin_css_contract | authenticated_linkedin_screenshot | manual_user_source
|
|
52
|
-
cssContractVersion: linkedin-preview-rendering/v1
|
|
53
|
-
mobile:
|
|
54
|
-
textWidthPx: 308
|
|
55
|
-
fontSizePx: 14
|
|
56
|
-
lineHeightPx: 21
|
|
57
|
-
visibleTextBlock: <literal first rendered review-clamp block>
|
|
58
|
-
renderedLines:
|
|
59
|
-
- <line 1 exactly as wrapped>
|
|
60
|
-
- <line 2 exactly as wrapped>
|
|
61
|
-
- <line 3 exactly as wrapped>
|
|
62
|
-
lineCountBeforeClamp: <number>
|
|
63
|
-
blankLinesBeforeClamp: <number>
|
|
64
|
-
corePainProofOrCuriosityVisible: true | false
|
|
65
|
-
corePointVisible: true | false
|
|
66
|
-
intentionalOpenLoop: true | false
|
|
67
|
-
specificClickQuestionVisible: true | false
|
|
68
|
-
payoffPlannedImmediatelyAfterClamp: true | false
|
|
69
|
-
seeMoreClickReason: <why a reader would click see more>
|
|
70
|
-
seeMoreRisk: pass | warn | fail
|
|
71
|
-
screenshotPath: <optional local path>
|
|
72
|
-
desktop:
|
|
73
|
-
textWidthPx: 582
|
|
74
|
-
fontSizePx: 14
|
|
75
|
-
lineHeightPx: 21
|
|
76
|
-
visibleTextBlock: <literal first rendered review-clamp block>
|
|
77
|
-
renderedLines:
|
|
78
|
-
- <line 1 exactly as wrapped>
|
|
79
|
-
- <line 2 exactly as wrapped>
|
|
80
|
-
- <line 3 exactly as wrapped>
|
|
81
|
-
lineCountBeforeClamp: <number>
|
|
82
|
-
blankLinesBeforeClamp: <number>
|
|
83
|
-
corePainProofOrCuriosityVisible: true | false
|
|
84
|
-
corePointVisible: true | false
|
|
85
|
-
seeMoreRisk: pass | warn | fail
|
|
86
|
-
screenshotPath: <optional local path>
|
|
87
|
-
diagnostics:
|
|
88
|
-
charCount: <number>
|
|
89
|
-
charCountIncludingNewlines: <number>
|
|
90
|
-
firstLineChars: <number>
|
|
91
|
-
firstTwoPhysicalLinesChars: <number>
|
|
92
|
-
longestNonblankLineChars: <number>
|
|
93
|
-
blankLineVisualRisk: none | low | medium | high
|
|
94
|
-
pointAfterMobileClamp: true | false
|
|
95
|
-
openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
|
|
96
|
-
rewriteIfTruncated: <short fallback>
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
If a host cannot produce screenshots, it must still produce the literal wrapped
|
|
100
|
-
line blocks using the CSS contract. If it cannot produce either screenshots or
|
|
101
|
-
literal line wraps, return `blocked` or `needs_revision`; do not claim the hook
|
|
102
|
-
passed preview validation from character counts alone.
|
|
103
|
-
|
|
104
|
-
## Study Rules
|
|
105
|
-
|
|
106
|
-
For source-post research:
|
|
107
|
-
|
|
108
|
-
- Render the exact visible opening from full text when full text is available.
|
|
109
|
-
- If only a search preview is available, render only the preview text and set
|
|
110
|
-
`basis: manual_user_source` or record `sourceTextBasis: search_preview`.
|
|
111
|
-
- Lower confidence when the search preview is cut off or the body is
|
|
112
|
-
unavailable.
|
|
113
|
-
- Extract hook lessons from the rendered first-screen experience, not from the
|
|
114
|
-
full post in isolation.
|
|
115
|
-
|
|
116
|
-
For generated hooks:
|
|
117
|
-
|
|
118
|
-
- Generate the hook from the selected premise first.
|
|
119
|
-
- Render the hook for mobile and desktop before scoring it.
|
|
120
|
-
- Score the rendered first-screen click reason before scoring cleverness.
|
|
121
|
-
- If the goal is see-more clicks, the hook may intentionally hide the payoff
|
|
122
|
-
after the mobile clamp, but the visible block must create a specific question
|
|
123
|
-
the target reader wants answered.
|
|
124
|
-
- Rewrite any candidate whose real point appears after the mobile clamp unless
|
|
125
|
-
that point is the planned payoff for an intentional open loop.
|
|
126
|
-
|
|
127
|
-
## Pass, Warn, Fail
|
|
128
|
-
|
|
129
|
-
Use these rendered gates:
|
|
130
|
-
|
|
131
|
-
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by the
|
|
132
|
-
end of the first 3 rendered lines, and either the core point is
|
|
133
|
-
understandable without opening "see more" or an intentional open loop creates
|
|
134
|
-
a specific click question with an immediate planned payoff.
|
|
135
|
-
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
136
|
-
point or click question is slightly softened by wrapping, blank-line rhythm,
|
|
137
|
-
or one missing context word. A compact fallback is required.
|
|
138
|
-
- `fail`: the hook's real point appears after the first 3 mobile rendered lines,
|
|
139
|
-
the visible open loop is vague, the first rendered line is generic setup,
|
|
140
|
-
blank lines consume the preview before the reader sees the point, or desktop
|
|
141
|
-
fit is the only reason it looks good.
|
|
142
|
-
|
|
143
|
-
A draft cannot be `ready` when the selected hook has:
|
|
144
|
-
|
|
145
|
-
- no `renderedPreview`
|
|
146
|
-
- `mobile.seeMoreRisk: fail`
|
|
147
|
-
- `mobile.corePainProofOrCuriosityVisible: false`
|
|
148
|
-
- `mobile.corePointVisible: false` unless `mobile.intentionalOpenLoop: true`,
|
|
149
|
-
`mobile.specificClickQuestionVisible: true`, and
|
|
150
|
-
`mobile.payoffPlannedImmediatelyAfterClamp: true`
|
|
151
|
-
- `pointAfterMobileClamp: true` unless the point after the clamp is the
|
|
152
|
-
intentional payoff for a specific open loop
|
|
153
|
-
|
|
154
|
-
## Report Format
|
|
155
|
-
|
|
156
|
-
Research reports must show rendered preview blocks for the best examples and
|
|
157
|
-
recommended draft directions:
|
|
158
|
-
|
|
159
|
-
```text
|
|
160
|
-
Rendered preview:
|
|
161
|
-
mobile:
|
|
162
|
-
<line 1>
|
|
163
|
-
<line 2>
|
|
164
|
-
<line 3>
|
|
165
|
-
|
|
166
|
-
desktop:
|
|
167
|
-
<line 1>
|
|
168
|
-
<line 2>
|
|
169
|
-
<line 3>
|
|
170
|
-
|
|
171
|
-
verdict: pass | warn | fail
|
|
172
|
-
why: <what is visible before the fold>
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
Do not say "it fits on mobile" without showing what the mobile reader actually
|
|
176
|
-
sees.
|