@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.
@@ -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 many hook candidates before drafting. Do not lock onto the first draft.
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-render the selected hook on mobile and desktop after edits
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
- ## Source Hook Reach Audit
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
- - `targetFollowerBand`
241
- - `authorFollowerCount` for each source pattern when available
242
- - `followerBandFit`: `in_target_band`, `below_target_band`,
243
- `above_target_band`, or `unknown`
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
- ## LinkedIn Preview Audit
157
+ Use:
263
158
 
264
- Audit the selected hook and top candidates against
265
- `references/linkedin-preview-rendering.md`. LinkedIn does not publish exact
266
- "see more" cutoff rules, and rendering varies by device, app version, font,
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 the rendered mobile clamp, rewrite it. A draft
350
- cannot be `ready` with `previewBudgetStatus: fail`,
351
- `mobilePreviewFit: fail`, missing `renderedPreview`,
352
- `corePainProofOrCuriosityVisibleMobile: false`,
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.
@@ -1,9 +0,0 @@
1
- {
2
- "parallelMode": "wide",
3
- "agentCount": 6,
4
- "maxToolCallsPerAgent": 2,
5
- "senderMaxAgents": 2,
6
- "senderMaxToolCallsPerAgent": 3,
7
- "progressMode": true,
8
- "debugMode": true
9
- }