@sellable/mcp 0.1.271 → 0.1.273

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.271",
3
+ "version": "0.1.273",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -336,6 +336,13 @@ write from the user's idea and context. The worker may write in a voice-inspired
336
336
  style for the private variant, but it must not claim the creator authored it,
337
337
  copy source wording, copy personal proof, or invent facts about the user.
338
338
 
339
+ Voice variants must model **writing mechanics**, not just a broad persona.
340
+ Before drafting, each worker must infer what "in this creator's voice" concretely
341
+ means for this idea: target word-count band, line and paragraph rhythm, hook
342
+ posture, recurring phrase families, vocabulary level, proof pattern, formatting
343
+ habits, close style, and normal amount of directness or humor. If every variant
344
+ comes back as the same long LinkedIn essay with different labels, the lab failed.
345
+
339
346
  The final orchestrator does not publish a collage of creator personas. It takes
340
347
  the best hooks, pressure, structure, rhythm, and proof moves from the role-played
341
348
  variants, then synthesizes the most compelling post for Christian/Sellable.
@@ -388,22 +395,26 @@ Default workflow:
388
395
  repeated patterns, engagement quality, and follower-adjusted signal when
389
396
  follower counts are available. Do not return the full scoring table.
390
397
  6. Each worker must build a `voice_model` before drafting:
391
- - representative length range for similar posts
398
+ - target word-count band and normal variance for similar posts
392
399
  - average paragraph/line length and spacing rhythm
393
400
  - hook posture and opening moves
394
- - common vocabulary, recurring phrases, and taboo phrases
401
+ - common vocabulary, recurring phrase families, and taboo phrases
395
402
  - proof style: story, numbers, teardown, checklist, confession, challenge
396
403
  - formatting: bullets, numbering, questions, equations, parentheticals
397
404
  - close style: command, reflection, CTA, punchline, open loop
398
405
  - factual boundaries: what must come from Christian/Sellable context
399
406
  7. Each worker writes the complete post that this creator would likely write
400
407
  from the user's idea and context. Match the inferred length/rhythm/style; do
401
- not compress to a generic short draft.
408
+ not compress to a generic short draft, and do not stretch a short-style
409
+ creator into a generic long post.
402
410
  8. Each worker returns a compact voice variant:
403
411
  - person and profile URL
404
412
  - worker status
405
413
  - recent post count sampled
406
414
  - voice model, max 8 bullets
415
+ - mechanics receipt: target length, actual length, line rhythm,
416
+ vocabulary markers used, formatting markers used, close style, and
417
+ `mechanics_match: pass | weak | fail`
407
418
  - complete post variant in that creator's inferred voice and representative
408
419
  length
409
420
  - hook options, max 3
@@ -427,6 +438,10 @@ Hard rules:
427
438
  by the creator.
428
439
  - Do not copy outside wording, proof, jokes, personal stories, or status.
429
440
  - Do not invent user proof just because it would fit the creator's style.
441
+ - Do not treat "voice" as a vibe label. Voice means concrete mechanics: length,
442
+ line rhythm, vocabulary, hook posture, proof style, formatting, and close.
443
+ - Do not publish or save a `ready` draft when voice variants are long generic
444
+ essays with swapped creator names instead of person-specific mechanics.
430
445
  - Do not let a large-audience creator win only because of reach. Use engagement
431
446
  per 1k followers when follower counts are available, and mark confidence when
432
447
  follower data is missing.
@@ -591,6 +606,7 @@ Visible Flow Trace
591
606
  - worker status per person:
592
607
  - recent posts sampled:
593
608
  - voice model:
609
+ - mechanics receipts:
594
610
  - complete voice variants:
595
611
  - follower-adjusted signal when available:
596
612
  - hook/body moves worth stealing:
@@ -608,6 +624,11 @@ Visible Flow Trace
608
624
  - proof gate:
609
625
  - voice gate:
610
626
  - anti-AI gate:
627
+ - local finalizer pass:
628
+ - turn separators added:
629
+ - contractions applied:
630
+ - lowercase pass:
631
+ - abstract-to-concrete rewrites:
611
632
  - mobile preview gate:
612
633
  - template adaptation gate:
613
634
  - hook-to-body repayment:
@@ -1118,8 +1139,11 @@ Each worker must return:
1118
1139
  - recent post count sampled
1119
1140
  - follower count when available
1120
1141
  - normalization confidence
1121
- - voice model, max 8 bullets, including representative length, rhythm,
1122
- vocabulary, formatting, proof style, and close style
1142
+ - voice model, max 8 bullets, including target length, rhythm, vocabulary,
1143
+ formatting, proof style, and close style
1144
+ - mechanics receipt, including target word-count band, actual word count,
1145
+ paragraph/line rhythm, vocabulary markers, formatting markers, close style,
1146
+ and `mechanics_match: pass | weak | fail`
1123
1147
  - complete role-played post variant in the creator's inferred voice and
1124
1148
  representative length
1125
1149
  - hook options, max 3
@@ -1138,6 +1162,7 @@ Variant labels must be:
1138
1162
  ```text
1139
1163
  voice_variant_from: <person>
1140
1164
  role_play_basis: public posts sampled + configured Reason lane
1165
+ mechanics_receipt: target length | actual length | rhythm | vocabulary markers | formatting markers | close | mechanics_match
1141
1166
  post_variant: <complete variant>
1142
1167
  steal_for_final: hook | structure | proof order | rhythm | close move
1143
1168
  drop_for_final: copied wording | borrowed personal proof | fake user fact
@@ -1156,6 +1181,7 @@ Before drafting, record:
1156
1181
  - `actualVoiceVariantCount`
1157
1182
  - `missingVoiceVariants`
1158
1183
  - `weakVoiceVariants`
1184
+ - `mechanicsReceipts`
1159
1185
  - `selectedSynthesisIngredients`
1160
1186
  - `voiceVariantsGeneratedBeforeFinalProse: yes | no`
1161
1187
  - `workerExecutionMode: background_agents | sequential_fallback`
@@ -1175,6 +1201,7 @@ actualVoiceVariantCount: <number>
1175
1201
 
1176
1202
  1. <person>
1177
1203
  - worker_status:
1204
+ - mechanics_match:
1178
1205
  - draft_review:
1179
1206
  - strongest_move:
1180
1207
  - weakness_or_drop:
@@ -1221,6 +1248,42 @@ either completed for every active configured influencer or the validation
1221
1248
  receipt has an explicit user opt-out reason. A light source-research summary
1222
1249
  does not satisfy this gate.
1223
1250
 
1251
+ ## Step 3.5: Local Finalizer Pass
1252
+
1253
+ Run this pass after the canonical draft exists and before validation and save.
1254
+
1255
+ 1. Add `--` between each major turn in the post so the story is easier to read.
1256
+ Use it to separate turns such as hook, context, problem, mechanism, product
1257
+ proof, concrete example, and CTA. Do not add `--` inside a tight list where
1258
+ it would make the post harder to scan.
1259
+ 2. Use contractions in the draft body by default: `don't`, `isn't`, `that's`,
1260
+ `it's`, `can't`, `we're`, `you're`, and similar natural phrasing. Keep the
1261
+ non-contracted form only when the user explicitly wrote it that way, when a
1262
+ quoted line must stay exact, or when the contraction would sound unnatural.
1263
+ 3. Keep optional headings, section labels, and line starts lowercase by default
1264
+ when the post still reads naturally. Preserve proper nouns, acronyms, product
1265
+ names, and required capitalization such as `Claude`, `LinkedIn`, `Codex`,
1266
+ `Sellable.dev`, `Clay`, `HeyReach`, and `ICP`.
1267
+ 4. Run a Harry Dry-style concrete-language audit:
1268
+ - highlight every abstract or vague word/phrase in the validation receipt
1269
+ before saving
1270
+ - replace each one in the draft with a concrete object, action, number,
1271
+ example, screen, list, person, place, or visible workflow step
1272
+ - prefer words a reader can picture, such as `lead list`, `send settings`,
1273
+ `reply inbox`, `follow-up`, `team post`, `warm LinkedIn prospect`,
1274
+ `reply handling`, or `one sentence in Claude Code`
1275
+ - do not make a phrase concrete by inventing proof, metrics, customers, or
1276
+ product behavior the user did not provide
1277
+ 5. Record this pass in the validation receipt as `localFinalizerPass` with:
1278
+ - `turnSeparatorsAdded: yes | no` and a short reason
1279
+ - `contractionsApplied: yes | no`
1280
+ - `lowercasePass: yes | no` with preserved proper nouns listed
1281
+ - `abstractToConcreteRewrites`, listing each abstract phrase, why it was
1282
+ weak, and the concrete replacement used
1283
+
1284
+ If this pass cannot be completed, save the draft as `needs_revision` instead of
1285
+ `ready`, and explain which finalizer requirement failed.
1286
+
1224
1287
  ## Step 4: Validation
1225
1288
 
1226
1289
  Use `references/post-validation.md`.
@@ -1238,7 +1301,8 @@ Every saved draft needs a validation receipt with:
1238
1301
  - pre-draft narrative outline
1239
1302
  - selected source template and no-copy adaptation rationale
1240
1303
  - thought leader voice variant lab, including skipped/opt-out reason when
1241
- omitted and expected-vs-actual variant counts for the active configured list
1304
+ omitted, expected-vs-actual variant counts for the active configured list,
1305
+ and per-person mechanics receipts
1242
1306
  - post positioning breakdown
1243
1307
  - viral-post outline
1244
1308
  - hook-to-body promise map
@@ -1258,6 +1322,8 @@ Every saved draft needs a validation receipt with:
1258
1322
  - outbound AI-tell audit findings
1259
1323
  - hook preview pass/warn/fail status and compact fallback when warned
1260
1324
  - finalizer changes
1325
+ - local finalizer pass with turn separators, contractions, lowercase pass, and
1326
+ abstract-to-concrete rewrites
1261
1327
  - blocked/retry-needed reasons, if any
1262
1328
 
1263
1329
  If validation fails, do not save the draft as `ready`. Save as `needs_revision` or return blocked/retry-needed.
@@ -718,6 +718,13 @@ missing variants, weak variants, and selected synthesis ingredients. Ready
718
718
  drafts require one voice variant per active configured person unless the user
719
719
  explicitly opted out or supplied a smaller named subset.
720
720
 
721
+ Voice variants must model writing mechanics, not just a broad creator lens.
722
+ Each worker has to define what "in this person's voice" means for this idea:
723
+ target word-count band, line and paragraph rhythm, hook posture, recurring
724
+ phrase families, vocabulary level, proof pattern, formatting habits, close
725
+ style, and normal directness or humor. If multiple creator variants all become
726
+ the same long LinkedIn essay with different labels, mark the lab weak or failed.
727
+
721
728
  Use one bounded background worker per person when the host supports background
722
729
  agents. This is required for Codex/Claude hosts that expose background agents or
723
730
  Task workers. If the host does not expose a worker mechanism, process the list
@@ -755,10 +762,10 @@ Worker steps:
755
762
  - adaptation fit for Christian/Sellable voice
756
763
  - lead-magnet, giveaway, and status-only penalties
757
764
  5. Build a `voice_model` before drafting. It must infer:
758
- - representative post length range for similar ideas
765
+ - target word-count band and normal variance for similar ideas
759
766
  - paragraph and line rhythm
760
767
  - hook posture and opening moves
761
- - vocabulary and recurring phrases
768
+ - vocabulary and recurring phrase families
762
769
  - formatting habits: bullets, numbering, equations, parentheticals, spacing
763
770
  - proof style: story, metric, teardown, confession, field guide, challenge
764
771
  - close style: command, reflection, CTA, punchline, or open loop
@@ -768,7 +775,8 @@ Worker steps:
768
775
  hook tension, pacing, section shape, directness, humor level, proof style,
769
776
  formatting, and editorial instincts.
770
777
  7. Write the complete post that this creator would likely write from the user's
771
- selected premise and context. Do not compress it into a short generic draft.
778
+ selected premise and context. Do not compress it into a short generic draft
779
+ or stretch a short-style creator into a generic long post.
772
780
  8. Identify what the final synthesis should steal and what it must drop.
773
781
  9. Keep factual claims grounded in the user's context. Do not invent user proof.
774
782
 
@@ -796,7 +804,15 @@ worker_status: pass | weak | retry_needed | blocked
796
804
  recent_posts_sampled:
797
805
  follower_count: <number | unavailable>
798
806
  normalization_confidence: high | medium | low
799
- voice_model: [max 8 bullets covering length, rhythm, vocabulary, formatting, proof style, close]
807
+ voice_model: [max 8 bullets covering target length, rhythm, vocabulary, formatting, proof style, close]
808
+ mechanics_receipt:
809
+ - target_word_count_band:
810
+ - actual_word_count:
811
+ - paragraph_line_rhythm:
812
+ - vocabulary_markers:
813
+ - formatting_markers:
814
+ - close_style:
815
+ - mechanics_match: pass | weak | fail
800
816
  hook_options: [max 3]
801
817
  post_variant: <complete post in the creator's inferred voice and representative length>
802
818
  steal_for_final: [max 5 bullets]
@@ -118,6 +118,10 @@ Draft files must preserve:
118
118
  promise, concrete examples, abstractions to remove, and draft risks
119
119
  - validation receipt, including LinkedIn preview pass/warn/fail status and
120
120
  compact fallback when the selected hook carries a warning
121
+ - local finalizer pass: whether `--` turn separators were added, whether
122
+ contractions were applied, whether lowercase style was applied where safe,
123
+ preserved proper nouns/acronyms, and abstract-to-concrete rewrites with the
124
+ before/after phrases used in the final draft
121
125
  - visible flow trace when the user asked for whole-flow, debug, or step-by-step
122
126
  mode, including checkpoint statuses, quality break, downstream effect, and
123
127
  whether the trace was shown before saving
@@ -125,6 +125,41 @@ After the first draft:
125
125
  9. preserve the user's actual story and point
126
126
  10. remove AI tells
127
127
  11. re-check LinkedIn preview fit after edits
128
+ 12. add `--` between major story turns when it improves scanability
129
+ 13. use natural contractions by default
130
+ 14. keep optional headings, section labels, and line starts lowercase when safe
131
+ 15. run the concrete-language audit below and replace abstract phrasing before
132
+ saving
133
+
134
+ ### Local Finalizer Pass
135
+
136
+ Before a draft can be saved as `ready`, record a local finalizer pass. This is
137
+ the last copy pass after the draft body exists and before `save_post_draft`.
138
+
139
+ Record:
140
+
141
+ - `turnSeparatorsAdded`: yes | no
142
+ - `turnSeparatorReason`: where `--` was inserted or why it was skipped
143
+ - `contractionsApplied`: yes | no
144
+ - `contractionsChanged`: examples such as `do not -> don't`, `is not -> isn't`,
145
+ `that is -> that's`, or `it is -> it's`
146
+ - `lowercasePass`: yes | no
147
+ - `preservedCapitalization`: proper nouns, acronyms, product names, and required
148
+ capitalization such as `Claude`, `LinkedIn`, `Codex`, `Sellable.dev`, `Clay`,
149
+ `HeyReach`, and `ICP`
150
+ - `abstractToConcreteRewrites`: every abstract phrase flagged, why it was weak,
151
+ and the concrete replacement used
152
+
153
+ Save as `needs_revision` when:
154
+
155
+ - major story turns are visually hard to follow and no `--` separators or other
156
+ clear turn markers were added
157
+ - the draft keeps stiff non-contracted phrasing without a user/source reason
158
+ - optional headings or labels stay title-cased in a way that clashes with the
159
+ user's lowercase post style
160
+ - meaningful abstract phrases remain in the draft after the concrete-language
161
+ audit
162
+ - the validation receipt does not show what changed during this finalizer pass
128
163
 
129
164
  ## Visible Flow Trace Audit
130
165
 
@@ -260,7 +295,9 @@ or practical next action.
260
295
  ## Abstraction-To-Concrete Rewrite Audit
261
296
 
262
297
  Record every meaningful abstraction found in the draft and the concrete
263
- replacement. Do not merely say "made concrete."
298
+ replacement. Do not merely say "made concrete." Use a Harry Dry-style standard:
299
+ if the reader cannot picture the word on a screen, in a list, in a sentence they
300
+ would type, or as a workflow step someone could perform, make it more concrete.
264
301
 
265
302
  Use this format:
266
303
 
@@ -279,11 +316,25 @@ Common abstractions to flag:
279
316
  - vague nouns such as `signal`, `market`, `attention`, `system`, `quality`,
280
317
  `context`, `machine`, or `workflow` when the sentence does not name the actual
281
318
  source, action, number, or object
319
+ - vague product words such as `orchestrator`, `campaign object`, `GTM
320
+ superpowers`, `agentic`, `AI-native`, or `platform` when the sentence does not
321
+ name the visible work being done
282
322
  - broad persona labels used as lead sources
283
323
  - "warm" without explaining what made the source warm
284
324
  - "offer" without explaining why the recipient would believe or want it
285
325
  - "learning" without naming what metric changes the next decision
286
326
 
327
+ Concrete replacements should name visible things, for example:
328
+
329
+ - `lead list`
330
+ - `send settings`
331
+ - `reply inbox`
332
+ - `follow-up`
333
+ - `team post`
334
+ - `warm LinkedIn prospect`
335
+ - `reply handling`
336
+ - `one sentence in Claude Code`
337
+
287
338
  Do not make language concrete by inventing facts. If the concrete replacement
288
339
  requires missing proof, ask the user or save as `needs_revision`.
289
340
 
@@ -356,8 +407,11 @@ Record:
356
407
  - `workerExecutionMode`: `background_agents` | `sequential_fallback`
357
408
  - `backgroundWorkerIds`: worker IDs or labels when available
358
409
  - `thoughtLeaderList`: names and profile URLs or handles
359
- - `voiceModels`: inferred length, rhythm, vocabulary, formatting, proof style,
360
- and close style per person
410
+ - `voiceModels`: inferred target length, rhythm, vocabulary, formatting, proof
411
+ style, and close style per person
412
+ - `mechanicsReceipts`: target word-count band, actual word count, line rhythm,
413
+ vocabulary markers, formatting markers, close style, and
414
+ `mechanics_match: pass | weak | fail` per person
361
415
  - `voiceVariants`: one representative-length role-played post per person, or
362
416
  `not_available` with reason
363
417
  - `normalizationConfidence`: high | medium | low
@@ -380,6 +434,12 @@ when variants are replaced by a generic influencer summary, or when voice
380
434
  variants were generated after final prose instead of before final prose. Return
381
435
  `retry-needed` when a tool/package/search failure prevents fetching configured
382
436
  profiles or posts.
437
+
438
+ Save as `needs_revision` when the variants do not demonstrate person-specific
439
+ writing mechanics, when `mechanicsReceipts` are missing, or when multiple
440
+ variants are effectively the same long LinkedIn essay with different creator
441
+ labels.
442
+
383
443
  Only mark `thought_leader_adaptation: not_used` when the user explicitly opted
384
444
  out before drafting.
385
445