@sellable/mcp 0.1.258 → 0.1.260
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +21 -18
- package/dist/tools/engage-discovery.js +90 -112
- package/dist/tools/leads.d.ts +381 -21
- package/dist/tools/leads.js +219 -5
- package/dist/tools/registry.d.ts +213 -21
- 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 +147 -120
- package/skills/create-post/references/gold-standard-post-pack.md +0 -11
- package/skills/create-post/references/hook-research-playbook.md +276 -311
- package/skills/create-post/references/post-file-contract.md +8 -16
- package/skills/create-post/references/post-validation.md +142 -211
- package/skills/create-post/references/premise-development.md +250 -5
- package/skills/find-leads/SKILL.md +6 -0
|
@@ -61,23 +61,15 @@ Hook research files must preserve:
|
|
|
61
61
|
- engagement totals
|
|
62
62
|
- author follower counts when available, target follower band, follower-band
|
|
63
63
|
fit, engagement per 1k followers, weighted engagement per 1k followers,
|
|
64
|
-
reach
|
|
65
|
-
|
|
66
|
-
confidence notes
|
|
64
|
+
reach-adjusted score, and normalization confidence notes when reach
|
|
65
|
+
normalization was used
|
|
67
66
|
- full-text availability
|
|
68
67
|
- source hook preview measurements, including text basis, char count including
|
|
69
68
|
newlines, physical/content line counts, longest nonblank line, blank-line
|
|
70
69
|
visual risk, and mobile/desktop preview budget status
|
|
71
|
-
- rendered preview records for
|
|
72
|
-
including literal mobile/desktop preview blocks
|
|
73
|
-
|
|
74
|
-
core point visibility, and whether the point lands after the mobile clamp
|
|
75
|
-
- hook reverse-engineering autopsies for kept source hooks, including source
|
|
76
|
-
mechanism, open-loop type, click question, promised payoff, specificity
|
|
77
|
-
anchor, source shape to keep, source words not to copy, and adaptation rule
|
|
78
|
-
- hook angle matrix summary, including angle territories tested, top generated
|
|
79
|
-
hooks, winning territory, runner-up territories, and why the winning angle
|
|
80
|
-
beat the alternatives
|
|
70
|
+
- rendered preview records for kept source hooks and adapted hook blocks,
|
|
71
|
+
including literal mobile/desktop preview blocks and whether the first-screen
|
|
72
|
+
promise is visible
|
|
81
73
|
- extracted hook patterns
|
|
82
74
|
- selected hook basis
|
|
83
75
|
|
|
@@ -96,11 +88,11 @@ Draft files must preserve:
|
|
|
96
88
|
- score fields for hook, proof, voice, specificity, skimmability, and publish confidence
|
|
97
89
|
- `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
|
|
98
90
|
- draft body
|
|
91
|
+
- pre-draft structure brief: hook, thesis, reader, core mechanism, key
|
|
92
|
+
definitions, proof claims, mobile scan path, section outline, body promise,
|
|
93
|
+
concrete examples, abstractions to remove, and draft risks
|
|
99
94
|
- validation receipt, including LinkedIn preview pass/warn/fail status and
|
|
100
95
|
compact fallback when the selected hook carries a warning
|
|
101
|
-
- selected hook reverse-engineering audit, hook angle matrix summary, and
|
|
102
|
-
see-more click audit when the selected hook intentionally hides the payoff
|
|
103
|
-
after the mobile fold
|
|
104
96
|
- rendered mobile and desktop preview blocks for the selected hook; drafts
|
|
105
97
|
cannot be ready when this rendered-preview audit is missing or fails mobile
|
|
106
98
|
visibility
|
|
@@ -11,10 +11,13 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
|
|
|
11
11
|
- `candidateHooksConsidered`
|
|
12
12
|
- `selectedHook`
|
|
13
13
|
- `selectedHookWhy`
|
|
14
|
-
- `
|
|
15
|
-
- `
|
|
16
|
-
- `
|
|
17
|
-
- `
|
|
14
|
+
- `preDraftStructureBrief`
|
|
15
|
+
- `selectedSourceTemplate`
|
|
16
|
+
- `postPositioningBreakdown`
|
|
17
|
+
- `viralPostOutline`
|
|
18
|
+
- `hookToBodyPromiseMap`
|
|
19
|
+
- `bodyExpressionCandidates`
|
|
20
|
+
- `combinedBodyPlan`
|
|
18
21
|
- `proofClaimsUsed`
|
|
19
22
|
- `proofClaimSources`
|
|
20
23
|
- `storyFilesConsulted`
|
|
@@ -22,6 +25,9 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
|
|
|
22
25
|
- `voiceRulesApplied`
|
|
23
26
|
- `marketBeliefAudit`
|
|
24
27
|
- `premiseValueAudit`
|
|
28
|
+
- `mobileScanabilityAudit`
|
|
29
|
+
- `templateAdaptationAudit`
|
|
30
|
+
- `abstractionToConcreteRewriteAudit`
|
|
25
31
|
- `linkedinPreviewAudit`
|
|
26
32
|
- `simplifierConcreteLanguageAudit`
|
|
27
33
|
- `antiAiAudit`
|
|
@@ -72,46 +78,20 @@ set the verdict to `revise` or `reject`.
|
|
|
72
78
|
|
|
73
79
|
## Candidate Set
|
|
74
80
|
|
|
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.
|
|
81
|
+
Generate multiple hook candidates before drafting. Do not lock onto the first draft.
|
|
87
82
|
|
|
88
83
|
Each candidate should include:
|
|
89
84
|
|
|
90
85
|
- hook text
|
|
91
86
|
- selected premise
|
|
92
|
-
-
|
|
87
|
+
- selected source template or no-template rationale
|
|
93
88
|
- premise tension opened
|
|
94
89
|
- reader value implied
|
|
95
90
|
- source pattern
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
follower band, follower-band fit, engagement per 1k followers, weighted
|
|
100
|
-
engagement per 1k followers, reach-adjusted score, baseline lift, and
|
|
101
|
-
confidence
|
|
91
|
+
- hook-to-body promise
|
|
92
|
+
- see-more tension
|
|
93
|
+
- curiosity debt
|
|
102
94
|
- 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
95
|
- char count including newlines and first-line / first-two-line preview measurements
|
|
116
96
|
- physical line count, content line count, longest nonblank line, and blank-line risk
|
|
117
97
|
- `previewBudgetStatus`: `pass`, `warn`, or `fail`
|
|
@@ -120,55 +100,6 @@ Each candidate should include:
|
|
|
120
100
|
- AI-tell risk
|
|
121
101
|
- why it should win or lose
|
|
122
102
|
|
|
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
103
|
## Finalizer Pass
|
|
173
104
|
|
|
174
105
|
After the first draft:
|
|
@@ -176,12 +107,15 @@ After the first draft:
|
|
|
176
107
|
1. remove unsupported claims
|
|
177
108
|
2. verify the draft is anchored to the selected market belief and controversy
|
|
178
109
|
3. verify the real story/scene, tension, and reader value are visible early
|
|
179
|
-
4.
|
|
180
|
-
5.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
110
|
+
4. verify the body repays the selected hook's curiosity debt
|
|
111
|
+
5. verify the final post follows the selected positioning sequence or explains
|
|
112
|
+
why it departed from the template
|
|
113
|
+
6. tighten the hook
|
|
114
|
+
7. simplify abstract phrasing
|
|
115
|
+
8. replace generic language with concrete words only when supported
|
|
116
|
+
9. preserve the user's actual story and point
|
|
117
|
+
10. remove AI tells
|
|
118
|
+
11. re-check LinkedIn preview fit after edits
|
|
185
119
|
|
|
186
120
|
## Premise Value Audit
|
|
187
121
|
|
|
@@ -199,15 +133,117 @@ Record:
|
|
|
199
133
|
- `readerValue`: what the reader learns, sees differently, or can do
|
|
200
134
|
- `proofAvailable`: source-backed proof used
|
|
201
135
|
- `proofMissing`: claims intentionally avoided or requiring user input
|
|
136
|
+
- `preDraftStructureBrief`: hook, thesis, reader, core mechanism, definitions,
|
|
137
|
+
proof claims, mobile scan path, section outline, and abstractions to remove
|
|
202
138
|
- `premiseQualityGates`: pass/fail for `specific_scene_or_pattern`,
|
|
203
139
|
`clear_reader`, `visible_tension`, `reader_value`, `credible_speaker`,
|
|
204
|
-
`proof_safety`, and `
|
|
140
|
+
`proof_safety`, `market_heat`, and `pre_draft_structure`
|
|
205
141
|
- `bodyOutline`: how the body delivers the premise before prose
|
|
142
|
+
- `viralPostOutline`: the selected narrative structure, including beat jobs
|
|
143
|
+
- `hookToBodyPromiseMap`: how the body repays the hook's open loop
|
|
144
|
+
- `combinedBodyPlan`: which body-expression lines were kept, rewritten, or cut
|
|
206
145
|
|
|
207
146
|
If the draft has no specific scene or observed pattern, no visible tension, or
|
|
208
147
|
no reader value beyond "this is interesting," save as `needs_revision`. Do not
|
|
209
148
|
mark it `ready` because the hook passes preview limits.
|
|
210
149
|
|
|
150
|
+
## Pre-Draft Structure Audit
|
|
151
|
+
|
|
152
|
+
Before a draft can be `ready`, validate that the structure was locked before the
|
|
153
|
+
body was written.
|
|
154
|
+
|
|
155
|
+
Record:
|
|
156
|
+
|
|
157
|
+
- `hook`: selected hook plus mobile/desktop rendered preview verdict
|
|
158
|
+
- `thesis`: one sentence the post defends
|
|
159
|
+
- `readerBeingTaught`: specific reader and why the post is written for them
|
|
160
|
+
- `coreEquationOrMechanism`: the operating idea being taught
|
|
161
|
+
- `keyDefinitions`: concrete definitions and examples for terms the reader
|
|
162
|
+
could misunderstand
|
|
163
|
+
- `proofClaims`: claims, sources, and public-safety status
|
|
164
|
+
- `sourceTemplateOrNoTemplateRationale`
|
|
165
|
+
- `mobileScanPath`: what a skimmer understands from the hook, separators,
|
|
166
|
+
section labels, numbers, and close
|
|
167
|
+
- `sectionOutline`: section order plus the job of each section
|
|
168
|
+
- `bodyPromiseAfterSeeMore`: what the body immediately repays
|
|
169
|
+
- `abstractionsToRemove`: abstract phrases and their concrete replacements
|
|
170
|
+
- `userCorrectionsApplied`: user corrections applied to the brief before prose
|
|
171
|
+
|
|
172
|
+
Save as `needs_revision` when the draft was written before the structure brief,
|
|
173
|
+
when the brief does not match the final prose, when the mobile scan path is
|
|
174
|
+
unclear, or when key terms are left abstract.
|
|
175
|
+
|
|
176
|
+
## Mobile Scanability Audit
|
|
177
|
+
|
|
178
|
+
A LinkedIn post must still teach the main idea when a reader scans it.
|
|
179
|
+
|
|
180
|
+
Record:
|
|
181
|
+
|
|
182
|
+
- `scanVisibleFrom`: hook, separators, numbered labels, ranges/numbers, example
|
|
183
|
+
prompts, and close
|
|
184
|
+
- `readerGetsWithoutReadingEveryWord`: the specific takeaway a skimmer gets
|
|
185
|
+
- `sectionSeparators`: present | absent | not_needed
|
|
186
|
+
- `sectionLabels`: concrete | abstract | missing
|
|
187
|
+
- `numbersOrProofVisible`: yes | no
|
|
188
|
+
- `mobileLineLengthRisk`: pass | warn | fail
|
|
189
|
+
- `skimVerdict`: pass | needs_revision
|
|
190
|
+
|
|
191
|
+
Save as `needs_revision` when a skimmer cannot understand the thesis, hierarchy,
|
|
192
|
+
or practical next action.
|
|
193
|
+
|
|
194
|
+
## Abstraction-To-Concrete Rewrite Audit
|
|
195
|
+
|
|
196
|
+
Record every meaningful abstraction found in the draft and the concrete
|
|
197
|
+
replacement. Do not merely say "made concrete."
|
|
198
|
+
|
|
199
|
+
Use this format:
|
|
200
|
+
|
|
201
|
+
```text
|
|
202
|
+
abstractionToConcreteRewriteAudit:
|
|
203
|
+
1.
|
|
204
|
+
original:
|
|
205
|
+
issue:
|
|
206
|
+
replacement:
|
|
207
|
+
source:
|
|
208
|
+
kept_or_cut:
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Common abstractions to flag:
|
|
212
|
+
|
|
213
|
+
- vague nouns such as `signal`, `market`, `attention`, `system`, `quality`,
|
|
214
|
+
`context`, `machine`, or `workflow` when the sentence does not name the actual
|
|
215
|
+
source, action, number, or object
|
|
216
|
+
- broad persona labels used as lead sources
|
|
217
|
+
- "warm" without explaining what made the source warm
|
|
218
|
+
- "offer" without explaining why the recipient would believe or want it
|
|
219
|
+
- "learning" without naming what metric changes the next decision
|
|
220
|
+
|
|
221
|
+
Do not make language concrete by inventing facts. If the concrete replacement
|
|
222
|
+
requires missing proof, ask the user or save as `needs_revision`.
|
|
223
|
+
|
|
224
|
+
## Template Adaptation Audit
|
|
225
|
+
|
|
226
|
+
Before a draft can be `ready`, validate that source posts were converted into
|
|
227
|
+
templates rather than copied.
|
|
228
|
+
|
|
229
|
+
Record:
|
|
230
|
+
|
|
231
|
+
- `selectedSourceTemplate`: source, template name, and why it fits
|
|
232
|
+
- `positioningSequenceBorrowed`: category sequence being adapted
|
|
233
|
+
- `viralPostOutlineBorrowed`: beat sequence being adapted
|
|
234
|
+
- `lineShapesBorrowed`: reusable line shapes, not copied wording
|
|
235
|
+
- `userStoryInputsUsed`: source-backed user facts filling the template
|
|
236
|
+
- `userProofInputsUsed`: source-backed user proof filling the template
|
|
237
|
+
- `forbiddenBorrowingAvoided`: source proof, jokes, personal context, status,
|
|
238
|
+
phrases, or examples not used
|
|
239
|
+
- `hookToBodyRepayment`: whether the body answers the hook's curiosity debt
|
|
240
|
+
- `bodyExpressionCandidatesReviewed`: which variants were tested and what won
|
|
241
|
+
- `copyingRisk`: pass | needs_revision | blocked
|
|
242
|
+
|
|
243
|
+
Save as `needs_revision` when the draft copies outside wording, borrows outside
|
|
244
|
+
proof, keeps a source template's status without equivalent user authority, or
|
|
245
|
+
uses a hook whose promised body payoff is not delivered.
|
|
246
|
+
|
|
211
247
|
## Market Belief Audit
|
|
212
248
|
|
|
213
249
|
Before a draft can be `ready`, validate that it is not merely an internally
|
|
@@ -230,104 +266,24 @@ If `selectedControversy` is missing, if the audience belief is only a generic
|
|
|
230
266
|
label like "founders want growth," or if `credibleWhyUs` depends on borrowed
|
|
231
267
|
proof from another creator, save as `needs_revision`.
|
|
232
268
|
|
|
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:
|
|
239
|
-
|
|
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.
|
|
261
|
-
|
|
262
269
|
## LinkedIn Preview Audit
|
|
263
270
|
|
|
264
|
-
Audit the selected hook and top candidates against
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
gate, not a claim about an official LinkedIn limit.
|
|
271
|
+
Audit the selected hook and top candidates against conservative LinkedIn
|
|
272
|
+
preview budgets. LinkedIn does not publish exact "see more" cutoff rules, and
|
|
273
|
+
rendering varies by device, app version, font, media, and line break. This audit
|
|
274
|
+
is a mobile-first safety gate, not a claim about an official LinkedIn limit.
|
|
269
275
|
|
|
270
|
-
|
|
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
|
-
```
|
|
276
|
+
Use:
|
|
287
277
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
- `
|
|
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.
|
|
278
|
+
- `pass`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
|
|
279
|
+
- `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.
|
|
280
|
+
- `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
281
|
|
|
303
282
|
Desktop preview usually has more room. Still record desktop fit, but never let
|
|
304
283
|
desktop fit compensate for a mobile `fail`.
|
|
305
284
|
|
|
306
285
|
Record:
|
|
307
286
|
|
|
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
287
|
- `charCount`
|
|
332
288
|
- `charCountIncludingNewlines`
|
|
333
289
|
- `firstLineChars`
|
|
@@ -346,37 +302,10 @@ Record:
|
|
|
346
302
|
- `rewriteIfTruncated`
|
|
347
303
|
- `compactFallback` when `previewBudgetStatus` is `warn`
|
|
348
304
|
|
|
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`.
|
|
305
|
+
If the hook only works after likely truncation, rewrite it. A draft cannot be
|
|
306
|
+
`ready` with `previewBudgetStatus: fail`. A draft may be `ready` with
|
|
307
|
+
`previewBudgetStatus: warn` only when the warning is explicit, usually because
|
|
308
|
+
the user prefers blank-line rhythm, and the receipt includes a compact fallback.
|
|
380
309
|
|
|
381
310
|
## Simplifier / Concrete-Language Audit
|
|
382
311
|
|
|
@@ -449,7 +378,9 @@ If the necessary proof or story is missing, ask the user or return blocked/retry
|
|
|
449
378
|
|
|
450
379
|
Use:
|
|
451
380
|
|
|
452
|
-
- `ready` only when proof, voice, anti-AI,
|
|
381
|
+
- `ready` only when proof, voice, anti-AI, concrete-language, pre-draft
|
|
382
|
+
structure, mobile-scanability, hook-to-body repayment, and
|
|
383
|
+
template-adaptation gates pass
|
|
453
384
|
- `needs_revision` when a draft exists but a gate failed
|
|
454
385
|
- `blocked` when required context is missing
|
|
455
386
|
- `retry-needed` when a tool/package/search failure blocked the pipeline
|