@sellable/mcp 0.1.239 → 0.1.242

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.
@@ -35,6 +35,42 @@ Do not store gold standards under `~/.sellable/content/linkedin/**`. Content
35
35
  folders are for ideas, hook research, drafts, published records, and future
36
36
  comment history. Gold standards are durable writing memory.
37
37
 
38
+ ## Creator Tracking
39
+
40
+ When an outside creator/person is approved as someone the user wants to keep
41
+ learning from, save the person separately from the gold-standard post.
42
+
43
+ Use:
44
+
45
+ ```text
46
+ mcp__sellable__upsert_engage_tracked_person({
47
+ name,
48
+ linkedinUrl,
49
+ reason
50
+ })
51
+ ```
52
+
53
+ Tracked people live in:
54
+
55
+ ```text
56
+ ~/.sellable/configs/discovery/influencers.md
57
+ ```
58
+
59
+ Gold-standard post records live in:
60
+
61
+ ```text
62
+ ~/.sellable/configs/core/references/linkedin-posts/
63
+ ```
64
+
65
+ Save both when both are approved:
66
+
67
+ - tracked person: "keep fetching this creator's new posts"
68
+ - gold-standard post: "use this specific post as decomposed writing memory"
69
+
70
+ Do not conflate the two. A person can be tracked without any one post becoming
71
+ a gold standard, and a post can be saved as a gold standard without tracking the
72
+ author.
73
+
38
74
  ## Import Modes
39
75
 
40
76
  ### Personal Best Import
@@ -65,7 +101,11 @@ gold standards.
65
101
  reach, and examples that cannot be adapted to the user's voice.
66
102
  5. Present candidates with a clear "should we use these as gold standards?"
67
103
  approval gate.
68
- 6. Add only the user-approved selections.
104
+ 6. Include a `track person?` recommendation for authors with repeated strong
105
+ topic-fit posts or when the user says they like the person.
106
+ 7. Add only the user-approved post selections.
107
+ 8. Call `mcp__sellable__upsert_engage_tracked_person` only for user-approved
108
+ tracked people.
69
109
 
70
110
  ## Candidate Presentation
71
111
 
@@ -86,6 +126,7 @@ Show compact candidate cards. Include:
86
126
  - voice fit
87
127
  - risks
88
128
  - allowed use recommendation
129
+ - track person recommendation and reason
89
130
 
90
131
  Approval prompt:
91
132
 
@@ -93,7 +134,7 @@ Approval prompt:
93
134
  Gold-standard pack: <current_count>/20 approved.
94
135
 
95
136
  These look like candidates worth saving. Which should I add?
96
- Reply with numbers to add, "skip all", or "replace <existing> with <new>" if the pack is full.
137
+ Reply with numbers to add, "track <author>", "skip all", or "replace <existing> with <new>" if the pack is full.
97
138
  ```
98
139
 
99
140
  Do not write candidates to the approved pack before the user chooses.
@@ -1,6 +1,6 @@
1
1
  # Hook Research Playbook
2
2
 
3
- Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`.
3
+ Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`. The goal is not only to find hooks. The goal is to find what the market is currently rewarding, what the audience implicitly believes/wants/resents/fears, which controversial angle the user can credibly test, and what premise would deliver real reader value.
4
4
 
5
5
  ## Search Inputs
6
6
 
@@ -11,6 +11,63 @@ Derive 3-8 keyword searches from:
11
11
  - proven search terms in engage memory
12
12
  - tracked people/inspiration references when relevant
13
13
 
14
+ When research reveals a creator/person the user likes, keep their profile URL
15
+ with the source post. If the user approves tracking them, save them with
16
+ `mcp__sellable__upsert_engage_tracked_person` so future sessions can fetch
17
+ their posts directly instead of rediscovering them ad hoc.
18
+
19
+ ## Background Research Worker
20
+
21
+ Use a background research worker when the host supports it and the research
22
+ needs more than a small handful of posts. This keeps the main orchestrator
23
+ focused on decisions instead of carrying a large source corpus.
24
+
25
+ Worker owns:
26
+
27
+ - broad keyword search
28
+ - tracked-person post fetches
29
+ - full-text matching by URL/activity ID
30
+ - duplicate removal
31
+ - lead-magnet, giveaway, engagement-bait, and off-voice filtering
32
+ - market belief mapping across kept and rejected examples
33
+ - premise input extraction: real scenes, observed tensions, reader value, proof gaps
34
+ - hook opening measurement
35
+ - exact phrase-pattern extraction
36
+ - body-structure extraction
37
+ - rejected-example notes
38
+ - track-person and gold-standard recommendations
39
+
40
+ Orchestrator owns:
41
+
42
+ - deciding whether research is enough
43
+ - saving `mcp__sellable__save_hook_research`
44
+ - showing the `Research Learning Report`
45
+ - asking which direction to draft
46
+ - drafting and validation
47
+
48
+ Worker output must be a compressed research packet, not a data dump:
49
+
50
+ ```text
51
+ Research packet:
52
+ - sources kept: max 8
53
+ - sources rejected: max 8
54
+ - market belief map: max 8 bullets
55
+ - controversy candidates: max 8
56
+ - premise inputs: max 8
57
+ - full adapted hook blocks: max 12
58
+ - exact phrase patterns: max 20
59
+ - body patterns: max 8
60
+ - source URLs and author profile URLs
61
+ - preview measurements
62
+ - confidence gaps
63
+ - save recommendations
64
+ ```
65
+
66
+ Do not return the full raw text of every post to the orchestrator. Include only
67
+ short source excerpts needed to explain a phrase pattern, plus URLs. Full text
68
+ belongs in the saved research artifact only when the user approves a specific
69
+ gold-standard candidate and it is safe to store.
70
+
14
71
  ## Default Search
15
72
 
16
73
  Use `mcp__sellable__search_engagement_posts` with practical constraints:
@@ -61,6 +118,67 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
61
118
  - "like and comment"
62
119
  - broad giveaway framing that makes engagement inflate without proving the hook/body worked
63
120
 
121
+ ## Market Belief Map
122
+
123
+ Before selecting a hook or writing a draft, synthesize a market belief map from
124
+ the kept and rejected posts. This is the step that prevents an internally
125
+ coherent post from becoming externally boring.
126
+
127
+ Record:
128
+
129
+ - resonating ideas: what topics or claims are repeatedly earning real
130
+ engagement in the last 30-120 days
131
+ - implicit beliefs: what the audience seems to already believe but may not say
132
+ directly
133
+ - audience wants: what they want to feel, learn, try, buy, avoid, or be early to
134
+ - audience resentments: what they are tired of, embarrassed by, or angry about
135
+ - audience fears: what risk would make them hesitate
136
+ - argument bait: what they will plausibly disagree with in comments
137
+ - credible controversy: what the user can argue without borrowing someone else's
138
+ proof or pretending to have data they do not have
139
+ - avoid list: ideas that are inflated by comment bait, stale category claims,
140
+ celebrity reach, giveaway mechanics, or poor voice fit
141
+
142
+ The selected direction must include:
143
+
144
+ ```text
145
+ Selected controversy:
146
+ <one sentence>
147
+
148
+ Why this audience would engage:
149
+ <specific belief/want/resentment/fear>
150
+
151
+ Why this user can credibly say it:
152
+ <raw idea, memory, story, proof, or product mechanism>
153
+
154
+ What not to claim:
155
+ <unsupported metric, borrowed proof, or hype phrase to avoid>
156
+ ```
157
+
158
+ If the raw idea is true but the market belief map does not show a live tension,
159
+ do not draft from the raw idea as-is. Present stronger directions or reframe the
160
+ idea around the closest supported external tension.
161
+
162
+ ## Premise Inputs
163
+
164
+ After the market belief map, extract the ingredients needed for premise
165
+ development. Do this before hook generation.
166
+
167
+ Record:
168
+
169
+ - real story or scene candidates from the raw idea, memory, transcript, or
170
+ current-session context
171
+ - observed pattern candidates when no first-person story is available
172
+ - visible tension: the uncomfortable gap, cost, contradiction, or tradeoff
173
+ - common belief: what the audience probably believes right now
174
+ - contrarian truth: what the user can credibly argue instead
175
+ - reader value: what the reader learns, sees differently, or can do
176
+ - proof available: what can be safely used
177
+ - proof missing: what cannot be claimed without user confirmation
178
+
179
+ If this section is weak, say so. Do not let the hook lab proceed as if a clever
180
+ opening can create value that the premise does not have.
181
+
64
182
  ## Full Text Reality
65
183
 
66
184
  Search results may only include previews.
@@ -117,17 +235,23 @@ appears cut off or body context is unavailable.
117
235
 
118
236
  ## Hook Extraction
119
237
 
120
- Extract structure, not wording.
238
+ Extract structure and reusable language patterns, not copied prose. The goal is
239
+ to learn the exact kinds of words, phrase shapes, sentence rhythms, and body
240
+ moves that are working, then adapt them into the selected premise in the user's
241
+ voice. Hooks must come from a premise card, not from the raw idea alone.
121
242
 
122
243
  For each shortlisted source post, record:
123
244
 
124
245
  - URL
125
246
  - author
247
+ - author profile URL when available
126
248
  - engagement totals and available likes/comments/shares breakdown
127
249
  - creator repeat evidence
128
250
  - visible hook text or preview
129
251
  - opening preview measurement fields from the section above
130
252
  - hook mechanism
253
+ - exact hook language patterns: reusable words, phrase shapes, contrast forms,
254
+ sentence shapes, and transition moves
131
255
  - story mechanism when the post is a story
132
256
  - internal question created
133
257
  - emotional trigger
@@ -135,6 +259,81 @@ For each shortlisted source post, record:
135
259
  - lead magnet or engagement bait penalty
136
260
  - weighted signal notes
137
261
  - replicability score
262
+ - track person recommendation: `yes`, `no`, or `ask_user`
263
+ - tracking reason when recommended
264
+
265
+ ## Specific Language Extraction
266
+
267
+ For each keeper, extract the source's specific language mechanics in this
268
+ format:
269
+
270
+ ```text
271
+ Phrase pattern:
272
+ "<phrase or phrase shape>"
273
+
274
+ Role:
275
+ <what the words do: create contrast, compress pain, name the enemy, make timing
276
+ the villain, move from surface action to system outcome, etc.>
277
+
278
+ Source:
279
+ <author + URL>
280
+
281
+ Reusable forms:
282
+ - <template form 1>
283
+ - <template form 2>
284
+ - <template form 3>
285
+
286
+ Adapted to user's idea:
287
+ - <new phrase in the user's voice>
288
+
289
+ Do not copy:
290
+ <words, proof, joke, or company context that belongs to the source>
291
+ ```
292
+
293
+ Examples of the level of specificity required:
294
+
295
+ - "not because [obvious reason]. because [real reason]."
296
+ - "most teams stop at [surface step]."
297
+ - "the [thing] was [state]. you just never [saw/used/launched] it in time."
298
+ - "the maintenance is the tax."
299
+ - "[thing] does not fail in your head. it fails in the gap between [A] and [B]."
300
+ - "the important part is not that AI [surface action]. the important part is that [system outcome]."
301
+ - "one [constrained operator] can run the whole [machine] if [constraint]."
302
+
303
+ Never reduce this section to high-level labels like "contrarian" or
304
+ "founder story." Those labels are allowed only after the exact phrase mechanics
305
+ are captured.
306
+
307
+ ## Body Structure Extraction
308
+
309
+ For each keeper with full text available, extract the body in this format:
310
+
311
+ ```text
312
+ Body pattern:
313
+ <short name>
314
+
315
+ Source:
316
+ <author + URL>
317
+
318
+ Sequence:
319
+ 1. <paragraph/job 1>
320
+ 2. <paragraph/job 2>
321
+ 3. <paragraph/job 3>
322
+
323
+ Exact language moves:
324
+ - "<phrase shape or transition>"
325
+ - "<sentence pattern>"
326
+ - "<closing move>"
327
+
328
+ Adapted body move:
329
+ <how this would show up in the user's post>
330
+
331
+ Replicability:
332
+ high | medium | low
333
+ ```
334
+
335
+ If full text is unavailable, record `full_text_unavailable` and do not infer
336
+ body structure beyond the visible preview.
138
337
 
139
338
  ## Story Mechanism
140
339
 
@@ -165,3 +364,19 @@ Draft-ready output must block or retry when:
165
364
  ## Save Requirement
166
365
 
167
366
  Save the research with `mcp__sellable__save_hook_research` before drafting.
367
+
368
+ The saved research must contain enough detail to support a user-visible
369
+ `Research Learning Report`: source examples, full adapted hook blocks, exact
370
+ phrase patterns, body structures, rejected examples, tracked-person
371
+ recommendations, and gold-standard recommendations.
372
+
373
+ If the user approves a creator/person as a recurring inspiration source, also
374
+ call `mcp__sellable__upsert_engage_tracked_person` with:
375
+
376
+ - `name`: display name
377
+ - `linkedinUrl`: canonical LinkedIn profile URL
378
+ - `reason`: concise lane and why they are worth tracking
379
+
380
+ Do not track a person only because one post was viral. Track them when they have
381
+ repeated strong posts, unusually high topic fit, or the user explicitly says
382
+ they like them.
@@ -31,6 +31,7 @@ Customer computer owns:
31
31
  research_YYYYMMDD_slug.md
32
32
  drafts/
33
33
  draft_YYYYMMDD_slug_v1.md
34
+ draft_YYYYMMDD_slug_v2.md
34
35
  published/
35
36
  YYYY/
36
37
  post_linkedinActivityId.md
@@ -69,10 +70,26 @@ Draft files must preserve:
69
70
 
70
71
  - source idea ID
71
72
  - hook research ID
73
+ - versioned draft ID, normally ending in `_v1`, `_v2`, `_v3`, etc.
74
+ - iteration metadata when there is a prior or baseline draft:
75
+ - `version`
76
+ - `priorDraftId`
77
+ - `changeIntent`
78
+ - `whatChanged`
79
+ - `whatImproved`
80
+ - `whatGotWorse`
81
+ - score fields for hook, proof, voice, specificity, skimmability, and publish confidence
82
+ - `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
72
83
  - draft body
73
84
  - validation receipt, including LinkedIn preview pass/warn/fail status and
74
85
  compact fallback when the selected hook carries a warning
75
- - status: `draft`, `ready`, or `needs_revision`
86
+ - status: `draft`, `ready`, `needs_revision`, `published`, or `archived`
87
+
88
+ Multiple drafts for the same idea are expected. Keep the `ideaId` stable and
89
+ create a new versioned `draftId` for each materially different attempt. Do not
90
+ overwrite a prior version just to compare alternatives. Use
91
+ `update_post_draft` only for same-version receipt fixes, status changes, or
92
+ copy edits that should remain part of that version.
76
93
 
77
94
  Published files must preserve:
78
95
 
@@ -80,7 +97,12 @@ Published files must preserve:
80
97
  - publish URL
81
98
  - LinkedIn activity ID when available
82
99
  - published date
83
- - optional future metrics placeholders
100
+ - future metrics placeholders and appended metric snapshots when available
101
+
102
+ When a draft is published, `mark_post_published` records the published post
103
+ separately and marks the source draft as `published` by default. Use
104
+ `update_published_post_metrics` to append later performance snapshots instead
105
+ of editing the draft.
84
106
 
85
107
  ## Safety
86
108
 
@@ -6,6 +6,8 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
6
6
 
7
7
  - `sourceIdeaId`
8
8
  - `hookResearchId`
9
+ - `iteration`
10
+ - `selectedPremiseCard`
9
11
  - `candidateHooksConsidered`
10
12
  - `selectedHook`
11
13
  - `selectedHookWhy`
@@ -14,6 +16,8 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
14
16
  - `storyFilesConsulted`
15
17
  - `goldStandardsConsulted`
16
18
  - `voiceRulesApplied`
19
+ - `marketBeliefAudit`
20
+ - `premiseValueAudit`
17
21
  - `linkedinPreviewAudit`
18
22
  - `simplifierConcreteLanguageAudit`
19
23
  - `antiAiAudit`
@@ -23,6 +27,45 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
23
27
  - `retryNeededReasons`
24
28
  - `readyStatus`
25
29
 
30
+ ## Iteration Receipt
31
+
32
+ Every saved draft needs iteration metadata, even the first draft. This lets the
33
+ content library show whether later drafts are actually improving.
34
+
35
+ For the first ready draft of an idea, record:
36
+
37
+ - `version: v1`
38
+ - `priorDraftId: none`
39
+ - `iterationRole: baseline`
40
+ - `changeIntent`
41
+ - `score`
42
+ - `verdict`
43
+ - `nextIterationTargets`
44
+
45
+ For later drafts, record:
46
+
47
+ - `version`
48
+ - `priorDraftId`
49
+ - `changeIntent`
50
+ - `whatChanged`
51
+ - `whatImproved`
52
+ - `whatGotWorse`
53
+ - `score`
54
+ - `verdict`
55
+
56
+ Use a score object with at least:
57
+
58
+ - `hook`
59
+ - `proof`
60
+ - `voice`
61
+ - `specificity`
62
+ - `skimmability`
63
+ - `publishConfidence`
64
+
65
+ Do not call a later draft better just because it is newer. If the hook is
66
+ stronger but proof, voice, or clarity got worse, say that in `whatGotWorse` and
67
+ set the verdict to `revise` or `reject`.
68
+
26
69
  ## Candidate Set
27
70
 
28
71
  Generate multiple hook candidates before drafting. Do not lock onto the first draft.
@@ -30,6 +73,9 @@ Generate multiple hook candidates before drafting. Do not lock onto the first dr
30
73
  Each candidate should include:
31
74
 
32
75
  - hook text
76
+ - selected premise
77
+ - premise tension opened
78
+ - reader value implied
33
79
  - source pattern
34
80
  - score
35
81
  - char count including newlines and first-line / first-two-line preview measurements
@@ -45,12 +91,61 @@ Each candidate should include:
45
91
  After the first draft:
46
92
 
47
93
  1. remove unsupported claims
48
- 2. tighten the hook
49
- 3. simplify abstract phrasing
50
- 4. replace generic language with concrete words only when supported
51
- 5. preserve the user's actual story and point
52
- 6. remove AI tells
53
- 7. re-check LinkedIn preview fit after edits
94
+ 2. verify the draft is anchored to the selected market belief and controversy
95
+ 3. verify the real story/scene, tension, and reader value are visible early
96
+ 4. tighten the hook
97
+ 5. simplify abstract phrasing
98
+ 6. replace generic language with concrete words only when supported
99
+ 7. preserve the user's actual story and point
100
+ 8. remove AI tells
101
+ 9. re-check LinkedIn preview fit after edits
102
+
103
+ ## Premise Value Audit
104
+
105
+ Before a draft can be `ready`, validate that the post is valuable, not just
106
+ well wrapped.
107
+
108
+ Record:
109
+
110
+ - `premise`: the selected premise in one sentence
111
+ - `realStoryOrScene`: the concrete scene, observation, or pattern used
112
+ - `targetReader`: who should care
113
+ - `commonBelief`: the belief the post argues against
114
+ - `contrarianTruth`: the sharper belief the post offers
115
+ - `visibleTension`: the uncomfortable gap or cost
116
+ - `readerValue`: what the reader learns, sees differently, or can do
117
+ - `proofAvailable`: source-backed proof used
118
+ - `proofMissing`: claims intentionally avoided or requiring user input
119
+ - `premiseQualityGates`: pass/fail for `specific_scene_or_pattern`,
120
+ `clear_reader`, `visible_tension`, `reader_value`, `credible_speaker`,
121
+ `proof_safety`, and `market_heat`
122
+ - `bodyOutline`: how the body delivers the premise before prose
123
+
124
+ If the draft has no specific scene or observed pattern, no visible tension, or
125
+ no reader value beyond "this is interesting," save as `needs_revision`. Do not
126
+ mark it `ready` because the hook passes preview limits.
127
+
128
+ ## Market Belief Audit
129
+
130
+ Before a draft can be `ready`, validate that it is not merely an internally
131
+ coherent idea. It must be anchored to the saved research's market belief map.
132
+
133
+ Record:
134
+
135
+ - `resonatingIdea`: the current-space idea this draft enters
136
+ - `implicitBelief`: the belief the audience likely already holds
137
+ - `audienceWant`: what the audience wants permission, leverage, proof, or a new
138
+ category for
139
+ - `audienceResentmentOrFear`: what frustration or risk gives the post tension
140
+ - `selectedControversy`: the claim the post is testing
141
+ - `credibleWhyUs`: why the user can credibly say this from raw idea, memory,
142
+ story, proof, or product mechanism
143
+ - `engagementReason`: why someone would react, comment, repost, or argue
144
+ - `unsupportedHypeRemoved`: unsupported claims removed during finalizer
145
+
146
+ If `selectedControversy` is missing, if the audience belief is only a generic
147
+ label like "founders want growth," or if `credibleWhyUs` depends on borrowed
148
+ proof from another creator, save as `needs_revision`.
54
149
 
55
150
  ## LinkedIn Preview Audit
56
151
 
@@ -0,0 +1,159 @@
1
+ # Premise Development
2
+
3
+ A strong post is not an idea with a better hook. A strong post is a valuable
4
+ premise wrapped in a sharp opening.
5
+
6
+ Use this stage after market/hook research and before hook candidates. Do not
7
+ generate hook candidates until at least one `Premise Card` exists.
8
+
9
+ ## Goal
10
+
11
+ Turn the raw idea into a real story, observed tension, or useful argument that a
12
+ specific reader would care about.
13
+
14
+ The premise must answer:
15
+
16
+ - who this is for
17
+ - what real scene, observation, or pattern created the idea
18
+ - what tension makes it worth reading
19
+ - what common belief it argues against
20
+ - what hidden truth or mechanism it reveals
21
+ - what value the reader gets
22
+ - why now
23
+ - why this user can credibly say it
24
+ - what proof is available and what proof is missing
25
+
26
+ If the premise has no real scene, no tension, and no reader value, stop before
27
+ drafting. Ask for the missing story or save only a `needs_revision` premise
28
+ artifact. Do not compensate with clever hooks.
29
+
30
+ ## Real Story / Scene Search
31
+
32
+ Before writing premise cards, search the available source material:
33
+
34
+ - raw idea text
35
+ - voice memo or transcript if provided
36
+ - `core/story-bank.md`
37
+ - `core/answer-bank.md`
38
+ - `core/proof-ledger.md`
39
+ - `core/wins-ledger.md`
40
+ - approved references and gold standards
41
+ - current-session user corrections or rejections
42
+
43
+ Look for:
44
+
45
+ - a moment: "I saw X", "a founder said Y", "I opened Z and noticed..."
46
+ - a contradiction: the user wanted one thing but the workflow rewarded another
47
+ - a cost: time, attention, trust, missed learning, reputation, money
48
+ - a before/after: what changed in the user's belief
49
+ - a specific object: Slack note, customer call, campaign table, reply, list,
50
+ demo, failed draft, stale idea, messy workflow
51
+
52
+ If no real story is present, use an observed pattern only if it is traceable to
53
+ the raw source or memory. Mark the gap in the premise card. Do not fabricate a
54
+ customer, call, outcome, date, metric, or private scene.
55
+
56
+ ## Premise Cards
57
+
58
+ Generate 3-5 premise cards before hooks. Each card must use this shape:
59
+
60
+ ```text
61
+ Premise Card
62
+
63
+ premise:
64
+ <one-sentence argument>
65
+
66
+ real story / scene:
67
+ <specific moment, observation, or pattern from source/memory>
68
+
69
+ target reader:
70
+ <who should care>
71
+
72
+ common belief:
73
+ <what the reader or market usually believes>
74
+
75
+ contrarian truth:
76
+ <what this post argues instead>
77
+
78
+ tension:
79
+ <why this is uncomfortable, costly, or worth arguing about>
80
+
81
+ reader value:
82
+ <what the reader learns, sees differently, or can do after reading>
83
+
84
+ why now / market heat:
85
+ <what current research says is resonating>
86
+
87
+ credible why-us:
88
+ <why this user can say it from source, memory, proof, or product mechanism>
89
+
90
+ proof available:
91
+ <specific usable proof or source>
92
+
93
+ proof missing:
94
+ <claims that cannot be made yet>
95
+
96
+ best frame:
97
+ story | contrarian take | teardown | founder confession | future thesis | lesson
98
+
99
+ hook territories:
100
+ - <territory 1>
101
+ - <territory 2>
102
+ - <territory 3>
103
+
104
+ risk:
105
+ <why this premise might still be weak>
106
+
107
+ score:
108
+ <1-100 with short reason>
109
+ ```
110
+
111
+ ## Premise Quality Gate
112
+
113
+ A premise can move to hook generation only when it passes all of these:
114
+
115
+ - `specific_scene_or_pattern`: pass
116
+ - `clear_reader`: pass
117
+ - `visible_tension`: pass
118
+ - `reader_value`: pass
119
+ - `credible_speaker`: pass
120
+ - `proof_safety`: pass
121
+ - `market_heat`: pass or explained
122
+
123
+ If any gate fails:
124
+
125
+ - in research checkpoint mode, show the cards and ask for the missing story or
126
+ direction
127
+ - in immediate draft mode, save the draft as `needs_revision`, not `ready`
128
+ - never mark a draft `ready` because the hook is clever
129
+
130
+ ## Hook Relationship
131
+
132
+ Hooks are generated from the selected premise, not from the raw idea alone.
133
+
134
+ For each hook candidate, include:
135
+
136
+ - selected premise ID or title
137
+ - which tension it opens
138
+ - which reader value it implies
139
+ - whether the real scene appears in the first screen or shortly after
140
+
141
+ Reject hooks that are accurate but do not reveal the premise's tension or value.
142
+
143
+ ## Body Relationship
144
+
145
+ Before drafting prose, create a short body outline for the selected premise:
146
+
147
+ ```text
148
+ body outline:
149
+ 1. hook stack opens the tension
150
+ 2. real scene or pattern makes it concrete
151
+ 3. common belief gets named
152
+ 4. contrarian truth lands
153
+ 5. mechanism explains why
154
+ 6. reader value becomes clear
155
+ 7. close returns to the premise without summarizing
156
+ ```
157
+
158
+ If this outline cannot be filled without inventing proof, return to premise
159
+ development.