@sellable/mcp 0.1.257 → 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,7 +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
14
  - `proofClaimsUsed`
16
15
  - `proofClaimSources`
17
16
  - `storyFilesConsulted`
@@ -78,17 +77,7 @@ Each candidate should include:
78
77
  - premise tension opened
79
78
  - reader value implied
80
79
  - source pattern
81
- - source pattern reach signals: author follower count when available, target
82
- follower band, follower-band fit, engagement per 1k followers, weighted
83
- engagement per 1k followers, reach-adjusted score, baseline lift, and
84
- confidence
85
80
  - score
86
- - `renderedPreview` using `references/linkedin-preview-rendering.md`
87
- - literal mobile and desktop rendered preview blocks
88
- - mobile and desktop rendered line wraps
89
- - first-screen promise: pain, proof, or curiosity visible by the mobile clamp
90
- - whether the core point is visible in the mobile rendered preview
91
- - whether the point lands after the mobile clamp
92
81
  - char count including newlines and first-line / first-two-line preview measurements
93
82
  - physical line count, content line count, longest nonblank line, and blank-line risk
94
83
  - `previewBudgetStatus`: `pass`, `warn`, or `fail`
@@ -109,7 +98,7 @@ After the first draft:
109
98
  6. replace generic language with concrete words only when supported
110
99
  7. preserve the user's actual story and point
111
100
  8. remove AI tells
112
- 9. re-render the selected hook on mobile and desktop after edits
101
+ 9. re-check LinkedIn preview fit after edits
113
102
 
114
103
  ## Premise Value Audit
115
104
 
@@ -158,96 +147,24 @@ If `selectedControversy` is missing, if the audience belief is only a generic
158
147
  label like "founders want growth," or if `credibleWhyUs` depends on borrowed
159
148
  proof from another creator, save as `needs_revision`.
160
149
 
161
- ## Source Hook Reach Audit
162
-
163
- Before a draft can be `ready`, validate that the selected source hook pattern
164
- was chosen for a reach-normalized reason, not raw audience size.
165
-
166
- Record:
150
+ ## LinkedIn Preview Audit
167
151
 
168
- - `targetFollowerBand`
169
- - `authorFollowerCount` for each source pattern when available
170
- - `followerBandFit`: `in_target_band`, `below_target_band`,
171
- `above_target_band`, or `unknown`
172
- - `engagementPer1kFollowers`
173
- - `weightedEngagementPer1kFollowers`
174
- - `reachAdjustedScore`
175
- - `reachPenaltyMultiplier`
176
- - `creatorBaselineMedianEngagement` or `creator_baseline_unavailable`
177
- - `baselineLift` or `creator_baseline_unavailable`
178
- - `bigAccountPenaltyApplied`
179
- - `whyTheHookCarries`
180
- - `followerCountUnavailableSources`
181
- - `whyThisHookIsAReachAdjustedSignal`
182
-
183
- If the user asked for a follower range and the selected source pattern is from a
184
- large account above the target range, the receipt must explain why it survived
185
- the celebrity reach penalty. Use large-account hooks as secondary pattern
186
- evidence unless they clearly overperform the creator's baseline or the hook
187
- itself carries after reach is controlled. A draft cannot be `ready` when the
188
- 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.
189
156
 
190
- ## LinkedIn Preview Audit
157
+ Use:
191
158
 
192
- Audit the selected hook and top candidates against
193
- `references/linkedin-preview-rendering.md`. LinkedIn does not publish exact
194
- "see more" cutoff rules, and rendering varies by device, app version, font,
195
- media, and line break. This audit is a mobile-first rendered-preview safety
196
- gate, not a claim about an official LinkedIn limit.
197
-
198
- Character budgets are secondary diagnostics. They cannot be the only evidence
199
- that a hook works. Every selected hook must include literal rendered mobile and
200
- desktop preview blocks.
201
-
202
- Default deterministic renderer when no authenticated LinkedIn screenshot is
203
- available:
204
-
205
- ```text
206
- cssContractVersion: linkedin-preview-rendering/v1
207
- font size: 14px
208
- line height: 21px
209
- white space: pre-wrap
210
- overflow wrap: break-word
211
- mobile text width: 308px
212
- desktop text width: 582px
213
- review clamp: first 3 rendered text lines
214
- ```
215
-
216
- Use rendered gates:
217
-
218
- - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
219
- the end of the first 3 rendered lines, and the core point is understandable
220
- without opening "see more".
221
- - `warn`: the mobile rendered preview creates useful curiosity but the core
222
- point is slightly softened by wrapping, blank-line rhythm, or one missing
223
- context word. A compact fallback is required.
224
- - `fail`: the hook's real point appears after the first 3 mobile rendered
225
- lines, the first rendered line is generic setup, blank lines consume the
226
- preview before the reader sees the point, or desktop fit is the only reason it
227
- looks 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.
228
162
 
229
163
  Desktop preview usually has more room. Still record desktop fit, but never let
230
164
  desktop fit compensate for a mobile `fail`.
231
165
 
232
166
  Record:
233
167
 
234
- - `renderedPreview`
235
- - `renderBasis`: `linkedin_css_contract`, `authenticated_linkedin_screenshot`,
236
- or `manual_user_source`
237
- - `cssContractVersion`
238
- - `mobileRenderedPreviewBlock`
239
- - `desktopRenderedPreviewBlock`
240
- - `mobileRenderedLines`
241
- - `desktopRenderedLines`
242
- - `mobileTextWidthPx`
243
- - `desktopTextWidthPx`
244
- - `mobileRenderedLineCount`
245
- - `desktopRenderedLineCount`
246
- - `corePainProofOrCuriosityVisibleMobile`
247
- - `corePainProofOrCuriosityVisibleDesktop`
248
- - `corePointVisibleMobile`
249
- - `corePointVisibleDesktop`
250
- - `pointAfterMobileClamp`
251
168
  - `charCount`
252
169
  - `charCountIncludingNewlines`
253
170
  - `firstLineChars`
@@ -266,14 +183,10 @@ Record:
266
183
  - `rewriteIfTruncated`
267
184
  - `compactFallback` when `previewBudgetStatus` is `warn`
268
185
 
269
- If the hook only works after the rendered mobile clamp, rewrite it. A draft
270
- cannot be `ready` with `previewBudgetStatus: fail`,
271
- `mobilePreviewFit: fail`, missing `renderedPreview`,
272
- `corePainProofOrCuriosityVisibleMobile: false`,
273
- `corePointVisibleMobile: false`, or `pointAfterMobileClamp: true`. A draft may
274
- be `ready` with `previewBudgetStatus: warn` only when the warning is explicit,
275
- usually because the user prefers blank-line rhythm, and the receipt includes a
276
- compact fallback.
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.
277
190
 
278
191
  ## Simplifier / Concrete-Language Audit
279
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,163 +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
- seeMoreRisk: pass | warn | fail
67
- screenshotPath: <optional local path>
68
- desktop:
69
- textWidthPx: 582
70
- fontSizePx: 14
71
- lineHeightPx: 21
72
- visibleTextBlock: <literal first rendered review-clamp block>
73
- renderedLines:
74
- - <line 1 exactly as wrapped>
75
- - <line 2 exactly as wrapped>
76
- - <line 3 exactly as wrapped>
77
- lineCountBeforeClamp: <number>
78
- blankLinesBeforeClamp: <number>
79
- corePainProofOrCuriosityVisible: true | false
80
- corePointVisible: true | false
81
- seeMoreRisk: pass | warn | fail
82
- screenshotPath: <optional local path>
83
- diagnostics:
84
- charCount: <number>
85
- charCountIncludingNewlines: <number>
86
- firstLineChars: <number>
87
- firstTwoPhysicalLinesChars: <number>
88
- longestNonblankLineChars: <number>
89
- blankLineVisualRisk: none | low | medium | high
90
- pointAfterMobileClamp: true | false
91
- rewriteIfTruncated: <short fallback>
92
- ```
93
-
94
- If a host cannot produce screenshots, it must still produce the literal wrapped
95
- line blocks using the CSS contract. If it cannot produce either screenshots or
96
- literal line wraps, return `blocked` or `needs_revision`; do not claim the hook
97
- passed preview validation from character counts alone.
98
-
99
- ## Study Rules
100
-
101
- For source-post research:
102
-
103
- - Render the exact visible opening from full text when full text is available.
104
- - If only a search preview is available, render only the preview text and set
105
- `basis: manual_user_source` or record `sourceTextBasis: search_preview`.
106
- - Lower confidence when the search preview is cut off or the body is
107
- unavailable.
108
- - Extract hook lessons from the rendered first-screen experience, not from the
109
- full post in isolation.
110
-
111
- For generated hooks:
112
-
113
- - Generate the hook from the selected premise first.
114
- - Render the hook for mobile and desktop before scoring it.
115
- - Score the rendered first-screen promise before scoring cleverness.
116
- - Rewrite any candidate whose real point appears after the mobile clamp.
117
-
118
- ## Pass, Warn, Fail
119
-
120
- Use these rendered gates:
121
-
122
- - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by the
123
- end of the first 3 rendered lines, and the core point is understandable
124
- without opening "see more".
125
- - `warn`: the mobile rendered preview creates useful curiosity but the core
126
- point is slightly softened by wrapping, blank-line rhythm, or one missing
127
- context word. A compact fallback is required.
128
- - `fail`: the hook's real point appears after the first 3 mobile rendered lines,
129
- the first rendered line is generic setup, blank lines consume the preview
130
- before the reader sees the point, or desktop fit is the only reason it looks
131
- good.
132
-
133
- A draft cannot be `ready` when the selected hook has:
134
-
135
- - no `renderedPreview`
136
- - `mobile.seeMoreRisk: fail`
137
- - `mobile.corePainProofOrCuriosityVisible: false`
138
- - `mobile.corePointVisible: false`
139
- - `pointAfterMobileClamp: true`
140
-
141
- ## Report Format
142
-
143
- Research reports must show rendered preview blocks for the best examples and
144
- recommended draft directions:
145
-
146
- ```text
147
- Rendered preview:
148
- mobile:
149
- <line 1>
150
- <line 2>
151
- <line 3>
152
-
153
- desktop:
154
- <line 1>
155
- <line 2>
156
- <line 3>
157
-
158
- verdict: pass | warn | fail
159
- why: <what is visible before the fold>
160
- ```
161
-
162
- Do not say "it fits on mobile" without showing what the mobile reader actually
163
- 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
- }