@sellable/mcp 0.1.257 → 0.1.258

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.257",
3
+ "version": "0.1.258",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -60,8 +60,9 @@ Do:
60
60
 
61
61
  - capture rough ideas, voice memos, freestyle notes, and ad hoc prompts
62
62
  - research currently working LinkedIn hooks
63
+ - reverse engineer why source hooks work, what shape to keep, and what not to copy
63
64
  - develop premise cards with real story/observed tension and reader value
64
- - generate hook candidates
65
+ - explore many hook angle territories before choosing the winning hook
65
66
  - draft a post body that stays true to the source idea
66
67
  - run validation before calling a draft ready
67
68
  - save ideas, hook research, drafts, and published records under `~/.sellable/content/linkedin/**`
@@ -318,7 +319,10 @@ and drafting gate.
318
319
  The research worker must return a compact packet only:
319
320
 
320
321
  - source examples kept and rejected
322
+ - hook reverse-engineering autopsies: why each source hook works, which shape to
323
+ keep, what not to copy, and what payoff the body must deliver
321
324
  - full adapted hook blocks
325
+ - angle territories tested before drafting
322
326
  - market belief map: resonating ideas, implicit beliefs, audience wants, resentments, fears, and credible controversy angles
323
327
  - premise inputs: real scenes, observed tensions, reader value openings, and proof gaps
324
328
  - reach-normalized signal notes, including follower-band fit when available
@@ -346,9 +350,13 @@ Default flow:
346
350
  10. For story posts, extract the story mechanism that made the post work, not just the first line.
347
351
  11. Extract hook structures plus specific reusable words, phrases, sentence
348
352
  shapes, transitions, and body language patterns.
349
- 12. Render each kept source hook and adapted hook block through the LinkedIn
353
+ 12. For each keeper, create a `hookAutopsy`: the source mechanism, open-loop
354
+ type, click question, promised payoff, specificity anchor, tension opened,
355
+ source shape to keep, source words not to copy, and adaptation rule for the
356
+ user's idea.
357
+ 13. Render each kept source hook and adapted hook block through the LinkedIn
350
358
  preview rendering contract. Character counts alone are not enough.
351
- 13. Save the research with `mcp__sellable__save_hook_research`.
359
+ 14. Save the research with `mcp__sellable__save_hook_research`.
352
360
 
353
361
  Record provenance:
354
362
 
@@ -367,6 +375,9 @@ Record provenance:
367
375
  - source hook rendered preview records and whether they came from full text,
368
376
  authenticated LinkedIn screenshots, or a search preview
369
377
  - selected hook patterns
378
+ - hook reverse-engineering autopsies, including `clickQuestion`,
379
+ `promisedPayoff`, `sourceShapeToKeep`, `sourceWordsNotToCopy`, and
380
+ `adaptationRule`
370
381
  - market belief map and selected controversy
371
382
  - premise cards and selected premise
372
383
  - exact phrase patterns and sentence shapes
@@ -425,6 +436,11 @@ Premise cards:
425
436
  Hook patterns learned:
426
437
  1. full adapted hook block
427
438
  - source mechanism:
439
+ - open-loop type:
440
+ - click question:
441
+ - promised payoff:
442
+ - source shape to keep:
443
+ - source words not to copy:
428
444
  - rendered preview:
429
445
  - mobile visible block:
430
446
  - desktop visible block:
@@ -456,9 +472,9 @@ Save recommendations:
456
472
  - gold-standard candidates:
457
473
 
458
474
  Recommended draft directions:
459
- 1. premise card + hook block + body structure
460
- 2. premise card + hook block + body structure
461
- 3. premise card + hook block + body structure
475
+ 1. premise card + hook territory + hook block + click question + body structure
476
+ 2. premise card + hook territory + hook block + click question + body structure
477
+ 3. premise card + hook territory + hook block + click question + body structure
462
478
  ```
463
479
 
464
480
  Keep this report concise enough to read, but concrete enough that another agent
@@ -492,16 +508,32 @@ unless the premise still has concrete reader value.
492
508
 
493
509
  ## Step 2: Hook Candidates
494
510
 
495
- Generate at least 12 hook candidates from the selected premise unless the user
496
- requested a smaller set. Do not generate hooks directly from the raw idea before
497
- the premise is selected.
511
+ Generate a hook angle matrix from the selected premise before writing the post
512
+ body. Do not generate hooks directly from the raw idea before the premise is
513
+ selected.
514
+
515
+ Minimum exploration:
516
+
517
+ - normal drafting: at least 8 distinct angle territories and 24 hook candidates
518
+ - hook-critical requests, "nail the hook," "a ton of angles," or space research:
519
+ at least 12 distinct angle territories and 40 hook candidates
520
+ - smaller set only when the user explicitly asks for fewer options
521
+
522
+ Angle territories must be genuinely different. Use options such as enemy/tool
523
+ contrast, hidden asset, first-person build proof, workflow reveal, contrarian
524
+ category claim, mistake/confession, market timing, operator pain,
525
+ asset/free-reveal without comment bait, specific person/company signal,
526
+ before/after transformation, and question hook.
498
527
 
499
528
  Each hook must include:
500
529
 
501
530
  - selected premise
531
+ - angle territory
502
532
  - premise tension opened
503
533
  - reader value implied
504
534
  - source hook pattern
535
+ - source shape kept
536
+ - source words not copied
505
537
  - why it fits this idea
506
538
  - `renderedPreview` using `references/linkedin-preview-rendering.md`
507
539
  - `mobileRenderedPreviewBlock`
@@ -509,6 +541,12 @@ Each hook must include:
509
541
  - `mobileRenderedLines`
510
542
  - `desktopRenderedLines`
511
543
  - `firstScreenPromise`
544
+ - `intentionalOpenLoop`
545
+ - `specificClickQuestionVisible`
546
+ - `seeMoreClickReason`
547
+ - `clickQuestion`
548
+ - `payoffAfterFold`
549
+ - `bodyProofObligation`
512
550
  - `corePainProofOrCuriosityVisibleMobile`
513
551
  - `corePointVisibleMobile`
514
552
  - `pointAfterMobileClamp`
@@ -528,6 +566,8 @@ Each hook must include:
528
566
  - `rewriteIfTruncated`
529
567
  - proof/story dependency
530
568
  - AI-tell risk
569
+ - why it should win
570
+ - why it should lose
531
571
  - score
532
572
 
533
573
  Do not copy source wording. Copy only the structure.
@@ -548,23 +588,28 @@ available:
548
588
  Use the rendered gates from `references/linkedin-preview-rendering.md`:
549
589
 
550
590
  - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
551
- the end of the first 3 rendered lines, and the core point is understandable
552
- without opening "see more".
591
+ the end of the first 3 rendered lines, and either the core point is
592
+ understandable without opening "see more" or an intentional open loop creates
593
+ a specific click question with an immediate planned payoff.
553
594
  - `warn`: the mobile rendered preview creates useful curiosity but the core
554
- point is slightly softened by wrapping, blank-line rhythm, or one missing
555
- context word. A compact fallback is required.
595
+ point or click question is slightly softened by wrapping, blank-line rhythm,
596
+ or one missing context word. A compact fallback is required.
556
597
  - `fail`: the hook's real point appears after the first 3 mobile rendered
557
- lines, the first rendered line is generic setup, blank lines consume the
558
- preview before the reader sees the point, or desktop fit is the only reason it
559
- looks good.
598
+ lines without an intentional open-loop plan, the visible open loop is vague,
599
+ the first rendered line is generic setup, blank lines consume the preview
600
+ before the reader sees the point, or desktop fit is the only reason it looks
601
+ good.
560
602
 
561
603
  Desktop preview usually has more room. Still record `desktopPreviewFit`, but
562
604
  never let desktop fit compensate for a mobile `fail`.
563
605
 
564
606
  If a hook's point depends on text after the rendered mobile preview clamp,
565
- rewrite it before selecting it. A selected hook may carry a `warn` only when
566
- the warning is explicit and the validation receipt includes a compact fallback.
567
- A hook with no rendered mobile and desktop preview record cannot be selected.
607
+ rewrite it before selecting it unless the hook is intentionally using a
608
+ see-more open loop. Intentional open loops must show a specific click question
609
+ inside the mobile clamp and must define the first payoff line after the fold. A
610
+ selected hook may carry a `warn` only when the warning is explicit and the
611
+ validation receipt includes a compact fallback. A hook with no rendered mobile
612
+ and desktop preview record cannot be selected.
568
613
 
569
614
  ## Step 3: Draft
570
615
 
@@ -594,6 +639,9 @@ Every saved draft needs a validation receipt with:
594
639
  - selected premise card
595
640
  - candidate hooks considered
596
641
  - selected hook and why
642
+ - hook reverse-engineering audit
643
+ - hook angle matrix summary
644
+ - see-more click audit
597
645
  - proof claims used and source
598
646
  - story/proof files consulted
599
647
  - gold standards consulted
@@ -55,7 +55,9 @@ Research packet:
55
55
  - market belief map: max 8 bullets
56
56
  - controversy candidates: max 8
57
57
  - premise inputs: max 8
58
+ - hook reverse-engineering autopsies: max 12
58
59
  - full adapted hook blocks: max 12
60
+ - angle territories tested: max 12
59
61
  - exact phrase patterns: max 20
60
62
  - body patterns: max 8
61
63
  - source URLs and author profile URLs
@@ -261,6 +263,104 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
261
263
  - "like and comment"
262
264
  - broad giveaway framing that makes engagement inflate without proving the hook/body worked
263
265
 
266
+ ## Hook Reverse Engineering Autopsy
267
+
268
+ For any space or LinkedIn topic, do not stop at "this is a good hook." Reverse
269
+ engineer why the opening earned attention, which shape can be reused, and which
270
+ parts belong to the source and must not be copied.
271
+
272
+ For each keeper source hook, record a `hookAutopsy`:
273
+
274
+ ```text
275
+ hookAutopsy:
276
+ sourceHook: <exact visible opening used for analysis>
277
+ renderedFirstScreen: <mobile and desktop visible blocks>
278
+ sourceMechanism: <what the hook does structurally>
279
+ openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
280
+ clickQuestion: <the question a reader has before clicking see more>
281
+ promisedPayoff: <what the body/video must deliver after the click>
282
+ curiosityGap: <what is withheld and why that is fair>
283
+ specificityAnchor: <tool, person, number, object, scene, or enemy named>
284
+ tensionOpened: <belief, resentment, fear, status, cost, or contradiction>
285
+ proofImplied: <what proof the source suggests in the first screen>
286
+ whyItWorks: <specific words and structure, not a vibe label>
287
+ whyItMightBeInflated: <reach, giveaway, celebrity, outrage, or topic heat>
288
+ sourceShapeToKeep: <portable structure, written as a template>
289
+ sourceWordsNotToCopy: <phrases, jokes, proof, or context owned by source>
290
+ adaptationRule: <how to make it true for the user's idea and voice>
291
+ ```
292
+
293
+ Good `sourceShapeToKeep` examples:
294
+
295
+ - "The best [desired asset] I have right now is not in [default tool]."
296
+ - "I gave [system/person] one prompt: [specific request]."
297
+ - "[Common vanity metric] is useless until it becomes [business outcome]."
298
+ - "I built [familiar workflow] inside [new interface]."
299
+ - "Most teams [surface behavior]. Then they miss [hidden opportunity]."
300
+
301
+ Bad autopsies:
302
+
303
+ - "contrarian hook"
304
+ - "strong curiosity"
305
+ - "good storytelling"
306
+ - "viral format"
307
+
308
+ Those labels are allowed only after the concrete shape, click question, and
309
+ payoff obligation are recorded.
310
+
311
+ ## Angle Exploration Before Drafting
312
+
313
+ After selecting a premise, create a hook angle matrix before drafting the post.
314
+ This is mandatory when the user asks to nail the hook, study hooks, explore a
315
+ space, or write from a specific idea.
316
+
317
+ Default matrix:
318
+
319
+ - at least 8 angle territories for normal drafting
320
+ - at least 12 angle territories when the user asks for "a ton of angles" or
321
+ says the hook is the main constraint
322
+ - at least 24 generated hooks across those territories for normal drafting
323
+ - at least 40 generated hooks when the user explicitly asks to optimize hooks
324
+
325
+ Angle territories should be materially different, not synonyms. Use territories
326
+ such as:
327
+
328
+ - enemy/tool contrast
329
+ - hidden asset
330
+ - first-person build proof
331
+ - workflow reveal
332
+ - contrarian category claim
333
+ - mistake/confession
334
+ - market timing
335
+ - customer/operator pain
336
+ - asset/free reveal without comment bait
337
+ - specific person/company signal
338
+ - before/after transformation
339
+ - question hook
340
+
341
+ For each territory, record:
342
+
343
+ ```text
344
+ angleTerritory:
345
+ name:
346
+ sourceShapesUsed:
347
+ premiseTensionOpened:
348
+ readerValueImplied:
349
+ bestHook:
350
+ mobileRenderedPreview:
351
+ desktopRenderedPreview:
352
+ clickQuestion:
353
+ payoffAfterFold:
354
+ whyThisAngleShouldWin:
355
+ whyThisAngleShouldLose:
356
+ proofNeeded:
357
+ ```
358
+
359
+ Do not write the post body until the winning hook territory is chosen. The post
360
+ body must then pay off the selected hook quickly. If the best hook says the list
361
+ is not in Apollo, the next lines must reveal where it is. If the hook says "I
362
+ gave Sellable one prompt," the next lines must show the prompt or the demo.
363
+
264
364
  ## Market Belief Map
265
365
 
266
366
  Before selecting a hook or writing a draft, synthesize a market belief map from
@@ -382,6 +482,12 @@ For each source, record:
382
482
  - `corePainProofOrCuriosityVisibleDesktop`
383
483
  - `corePointVisibleMobile`
384
484
  - `corePointVisibleDesktop`
485
+ - `intentionalOpenLoop`
486
+ - `specificClickQuestionVisible`
487
+ - `payoffPlannedImmediatelyAfterClamp`
488
+ - `seeMoreClickReason`
489
+ - `clickQuestion`
490
+ - `payoffAfterFold`
385
491
  - `pointAfterMobileClamp`
386
492
  - `charCountIncludingNewlines`
387
493
  - `physicalLineCount`
@@ -395,6 +501,7 @@ For each source, record:
395
501
  - `desktopPreviewBudget`: `pass`, `warn`, or `fail`
396
502
  - `blankLineVisualRisk`
397
503
  - `corePointBeforeLikelyTruncation`
504
+ - `openLoopType`
398
505
  - `renderedPreviewVerdict`: `pass`, `warn`, or `fail`
399
506
 
400
507
  If only a search preview is available, do not pretend the opening is complete.
@@ -404,15 +511,17 @@ appears cut off or body context is unavailable.
404
511
  Pass/warn/fail is based on rendered output:
405
512
 
406
513
  - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
407
- the end of the first 3 rendered lines, and the core point is understandable
408
- without opening "see more".
514
+ the end of the first 3 rendered lines, and either the core point is
515
+ understandable without opening "see more" or an intentional open loop creates
516
+ a specific click question with an immediate planned payoff.
409
517
  - `warn`: the mobile rendered preview creates useful curiosity but the core
410
- point is slightly softened by wrapping, blank-line rhythm, or one missing
411
- context word. A compact fallback is required.
518
+ point or click question is slightly softened by wrapping, blank-line rhythm,
519
+ or one missing context word. A compact fallback is required.
412
520
  - `fail`: the hook's real point appears after the first 3 mobile rendered
413
- lines, the first rendered line is generic setup, blank lines consume the
414
- preview before the reader sees the point, or desktop fit is the only reason it
415
- looks good.
521
+ lines without an intentional open-loop plan, the visible open loop is vague,
522
+ the first rendered line is generic setup, blank lines consume the preview
523
+ before the reader sees the point, or desktop fit is the only reason it looks
524
+ good.
416
525
 
417
526
  ## Hook Extraction
418
527
 
@@ -63,6 +63,10 @@ renderedPreview:
63
63
  blankLinesBeforeClamp: <number>
64
64
  corePainProofOrCuriosityVisible: true | false
65
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>
66
70
  seeMoreRisk: pass | warn | fail
67
71
  screenshotPath: <optional local path>
68
72
  desktop:
@@ -88,6 +92,7 @@ renderedPreview:
88
92
  longestNonblankLineChars: <number>
89
93
  blankLineVisualRisk: none | low | medium | high
90
94
  pointAfterMobileClamp: true | false
95
+ openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
91
96
  rewriteIfTruncated: <short fallback>
92
97
  ```
93
98
 
@@ -112,31 +117,39 @@ For generated hooks:
112
117
 
113
118
  - Generate the hook from the selected premise first.
114
119
  - 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.
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.
117
126
 
118
127
  ## Pass, Warn, Fail
119
128
 
120
129
  Use these rendered gates:
121
130
 
122
131
  - `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".
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.
125
135
  - `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.
136
+ point or click question is slightly softened by wrapping, blank-line rhythm,
137
+ or one missing context word. A compact fallback is required.
128
138
  - `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.
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.
132
142
 
133
143
  A draft cannot be `ready` when the selected hook has:
134
144
 
135
145
  - no `renderedPreview`
136
146
  - `mobile.seeMoreRisk: fail`
137
147
  - `mobile.corePainProofOrCuriosityVisible: false`
138
- - `mobile.corePointVisible: false`
139
- - `pointAfterMobileClamp: true`
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
140
153
 
141
154
  ## Report Format
142
155
 
@@ -72,6 +72,12 @@ Hook research files must preserve:
72
72
  including literal mobile/desktop preview blocks, rendered line wraps, render
73
73
  basis, CSS contract version, text widths, first-screen promise visibility,
74
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
75
81
  - extracted hook patterns
76
82
  - selected hook basis
77
83
 
@@ -92,6 +98,9 @@ Draft files must preserve:
92
98
  - draft body
93
99
  - validation receipt, including LinkedIn preview pass/warn/fail status and
94
100
  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
95
104
  - rendered mobile and desktop preview blocks for the selected hook; drafts
96
105
  cannot be ready when this rendered-preview audit is missing or fails mobile
97
106
  visibility
@@ -12,6 +12,9 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
12
12
  - `selectedHook`
13
13
  - `selectedHookWhy`
14
14
  - `sourceHookReachAudit`
15
+ - `hookReverseEngineeringAudit`
16
+ - `hookAngleMatrix`
17
+ - `seeMoreClickAudit`
15
18
  - `proofClaimsUsed`
16
19
  - `proofClaimSources`
17
20
  - `storyFilesConsulted`
@@ -69,15 +72,29 @@ set the verdict to `revise` or `reject`.
69
72
 
70
73
  ## Candidate Set
71
74
 
72
- Generate multiple hook candidates before drafting. Do not lock onto the first draft.
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.
73
87
 
74
88
  Each candidate should include:
75
89
 
76
90
  - hook text
77
91
  - selected premise
92
+ - angle territory
78
93
  - premise tension opened
79
94
  - reader value implied
80
95
  - source pattern
96
+ - source shape kept
97
+ - source words not copied
81
98
  - source pattern reach signals: author follower count when available, target
82
99
  follower band, follower-band fit, engagement per 1k followers, weighted
83
100
  engagement per 1k followers, reach-adjusted score, baseline lift, and
@@ -87,6 +104,12 @@ Each candidate should include:
87
104
  - literal mobile and desktop rendered preview blocks
88
105
  - mobile and desktop rendered line wraps
89
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`
90
113
  - whether the core point is visible in the mobile rendered preview
91
114
  - whether the point lands after the mobile clamp
92
115
  - char count including newlines and first-line / first-two-line preview measurements
@@ -97,6 +120,55 @@ Each candidate should include:
97
120
  - AI-tell risk
98
121
  - why it should win or lose
99
122
 
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
+
100
172
  ## Finalizer Pass
101
173
 
102
174
  After the first draft:
@@ -216,15 +288,17 @@ review clamp: first 3 rendered text lines
216
288
  Use rendered gates:
217
289
 
218
290
  - `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".
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.
221
294
  - `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.
295
+ point or click question is slightly softened by wrapping, blank-line rhythm,
296
+ or one missing context word. A compact fallback is required.
224
297
  - `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.
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.
228
302
 
229
303
  Desktop preview usually has more room. Still record desktop fit, but never let
230
304
  desktop fit compensate for a mobile `fail`.
@@ -247,6 +321,12 @@ Record:
247
321
  - `corePainProofOrCuriosityVisibleDesktop`
248
322
  - `corePointVisibleMobile`
249
323
  - `corePointVisibleDesktop`
324
+ - `intentionalOpenLoop`
325
+ - `specificClickQuestionVisible`
326
+ - `payoffPlannedImmediatelyAfterClamp`
327
+ - `seeMoreClickReason`
328
+ - `clickQuestion`
329
+ - `payoffAfterFold`
250
330
  - `pointAfterMobileClamp`
251
331
  - `charCount`
252
332
  - `charCountIncludingNewlines`
@@ -270,10 +350,33 @@ If the hook only works after the rendered mobile clamp, rewrite it. A draft
270
350
  cannot be `ready` with `previewBudgetStatus: fail`,
271
351
  `mobilePreviewFit: fail`, missing `renderedPreview`,
272
352
  `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.
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`.
277
380
 
278
381
  ## Simplifier / Concrete-Language Audit
279
382