@sellable/mcp 0.1.0

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.
Files changed (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. package/skills/workflow-sequences/SKILL.md +85 -0
@@ -0,0 +1,151 @@
1
+ # Step 13 — Import Leads Contract
2
+
3
+ This reference governs Step 13 (`auto-execute-leads`) of the Plan 85-02
4
+ autonomous tail. Load before calling `import_leads` and on every resume
5
+ into Step 13.
6
+
7
+ ## Principle
8
+
9
+ Bounded review-batch sourcing + import happens AFTER atomic mint, not during.
10
+ The commit gate never calls `import_leads`; Step 13 is where the first real
11
+ review batch is pulled into the workspace. Do not spend credits on the full
12
+ source list until the user reviews the first batch and explicitly approves
13
+ expansion.
14
+
15
+ ## Resolve Approved Source
16
+
17
+ Before importing, read `lead-source-intake.json` if it exists. Treat it as a
18
+ manifest, not a suggestion. Revalidate file metadata and confirmation tokens on
19
+ resume, and persist/recover materialized IDs so retries do not duplicate
20
+ source lead lists, searches, campaign table rows, or queued cells.
21
+
22
+ Supported branches:
23
+
24
+ - **No manifest / normal discovery** — use the existing provider import path.
25
+ - **Supplied LinkedIn profile CSV** — confirm `load_csv_linkedin_leads` only
26
+ after approval, then import into the campaign table with
27
+ `confirm_lead_list({ sourceLeadListId, targetLeadCount: importLimit })`.
28
+ Do **not** call `wait_for_lead_list_ready` for this branch; there is no
29
+ provider import job to wait on, and probing readiness can leave the campaign
30
+ in an import-failed state before `confirm_lead_list`.
31
+ - **Existing Sellable lead list** — revalidate the source list in the same
32
+ workspace, then reuse it with
33
+ `confirm_lead_list({ sourceLeadListId, targetLeadCount: importLimit })`.
34
+ Do **not** call `wait_for_lead_list_ready` for this branch.
35
+ - **Supplied domain/account CSV** — reuse or confirm `load_csv_domains`, keep
36
+ its `domainFilterId`, run a campaign-associated Prospeo people search with
37
+ `campaignOfferId`, provider prompt preflight, and `domainFilterId`, then
38
+ import the review batch from that search.
39
+
40
+ If the source file changed after preview, or the existing list is missing or
41
+ wrong-workspace, escalate before materialization. If a supplied-domain search
42
+ returns zero or too few usable people, preserve `domainFilterId` and ask
43
+ whether to widen role filters, add more domains, or abort. Never silently drop
44
+ the domain constraint.
45
+
46
+ ## First-Import Path
47
+
48
+ Default case — no existing lead list bound to the campaign:
49
+
50
+ ```text
51
+ import_leads({
52
+ campaignOfferId,
53
+ targetLeadCount: <importLimit from auto-execute.yaml; default 25>
54
+ })
55
+ ```
56
+
57
+ Provider is inherited from the Phase 84 commit decision (not re-selected
58
+ here). Response returns `{ imported, skipped, duplicates }` — surface all
59
+ three to the escalation logic so dedup ratios are visible.
60
+
61
+ For supplied direct lists, `confirm_lead_list` must receive
62
+ `targetLeadCount: <importLimit>` or explicit `sourceRowIds` so a 100-row source
63
+ imports only the bounded review batch before greenlight.
64
+
65
+ ## `mode=add` Two-Step Handshake
66
+
67
+ When importing into an existing workflow table (e.g. signal-discovery
68
+ overlay onto an existing Sales Nav cohort), `import_leads` with
69
+ `mode=add` requires a two-step handshake:
70
+
71
+ ### Step 1 — First call returns `needsModeSelection=true`
72
+
73
+ ```text
74
+ import_leads({
75
+ campaignOfferId,
76
+ mode: "add",
77
+ targetLeadCount: ...
78
+ })
79
+ ```
80
+
81
+ Response:
82
+
83
+ ```text
84
+ {
85
+ needsModeSelection: true,
86
+ existingLeadListId: "lead_list_xyz",
87
+ ...
88
+ }
89
+ ```
90
+
91
+ This is NOT an error. It's the handshake. Do NOT retry the same call.
92
+ Do NOT treat this as a failure. Capture `existingLeadListId`.
93
+
94
+ ### Step 2 — Second call passes `sourceLeadListId`
95
+
96
+ ```text
97
+ import_leads({
98
+ campaignOfferId,
99
+ mode: "add",
100
+ sourceLeadListId: existingLeadListId,
101
+ targetLeadCount: ...
102
+ })
103
+ ```
104
+
105
+ Response: actual import result `{ imported, skipped, duplicates }`.
106
+
107
+ ## Dedup Ratio Surfacing
108
+
109
+ `import_leads` can produce wildly different outcomes depending on prior
110
+ imports into the same campaign. Surface all three counters to the tail
111
+ so escalation can distinguish "lane exhausted" from "good-looking import":
112
+
113
+ - **imported** — new rows added to the cohort
114
+ - **skipped** — rows that matched dedup keys (already in list)
115
+ - **duplicates** — rows that were in the raw pull but rejected by dedup
116
+
117
+ ### Interpretation
118
+
119
+ | imported | skipped | Interpretation |
120
+ | ---------- | ---------- | --------------------------------------------------- |
121
+ | near limit | low | Fresh lane; good pull |
122
+ | low | near limit | Lane mostly exhausted (dedup against prior imports) |
123
+ | 0 | high | Lane fully exhausted — escalate as "lane exhausted" |
124
+ | 0 | 0 | Real zero-lead case — escalate as "hard fail" |
125
+
126
+ Observed signal-discovery run: 911 scraped / 548 skipped / 363 imported
127
+ (≈40% fresh). That's a "good-looking import" not a lane-exhausted
128
+ state — escalation should NOT fire.
129
+
130
+ ## Zero-Leads Escalation
131
+
132
+ Per `escalation-ladder.md` condition #1: if `import_leads` returns 0
133
+ usable rows (imported = 0, skipped = 0), hard-fail escalate.
134
+
135
+ Distinction: 0 imported but high skipped = lane exhausted; this is NOT a
136
+ hard fail but DOES warrant surfacing to the operator — the campaign
137
+ cannot scale further without a new source lane.
138
+
139
+ ## Hard Rules
140
+
141
+ - `import_leads` with `mode=add` is ALWAYS a two-step handshake. Never
142
+ treat the first `needsModeSelection=true` response as a failure.
143
+ - Dedup ratios (imported / skipped / duplicates) are always surfaced for
144
+ escalation-logic input.
145
+ - Zero-imported + zero-skipped ⇒ hard-fail escalate.
146
+ - Zero-imported + high-skipped ⇒ lane-exhausted operator notice (NOT a
147
+ silent proceed).
148
+ - `import_leads` is NOT called in atomic mint. Only in Step 13.
149
+ - `import_leads` is NOT called again in Step 14 (validate-sample). Full
150
+ cohort import is a Step 13 action, not a recovery action for a bad
151
+ sample.
@@ -0,0 +1,90 @@
1
+ # Step 15 — Message Re-Cascade Contract
2
+
3
+ This reference governs Step 15 (`auto-execute-messaging`) re-cascade
4
+ behavior when Step 14's validate-sample loop graduates additional rows
5
+ from pending → passed after the first `generate_messages` call has
6
+ already run.
7
+
8
+ Load whenever Step 15 is about to transition to
9
+ `awaiting-user-greenlight`, and on every resume into Step 15.
10
+
11
+ ## Principle
12
+
13
+ Generate Message cells are cascade-scoped. If Step 14's rubric flips rows
14
+ from pending → passed AFTER Step 15 first observes messages for the review
15
+ batch, the new rows can sit pending with no message. Step 15 must explicitly
16
+ queue the newly-pending Generate Message cells for the review-batch subset.
17
+
18
+ Observed on manual Phase-85 signal-discovery run (2026-04-20): 15 new
19
+ rows graduated pending → passed mid-tail while `messagesCount` stayed
20
+ flat at 257. The new rows never got messages.
21
+
22
+ ## When Re-Cascade Fires
23
+
24
+ Re-cascade runs whenever ALL of the following are true:
25
+
26
+ 1. Step 15 has already observed the initial review-batch message cascade.
27
+ 2. A subsequent check of rubric state shows rows that were pending at
28
+ first generate_messages time are now passed.
29
+ 3. Those newly-passed rows do NOT yet have generated messages
30
+ (`messagesCount` flat relative to pre-cascade).
31
+ 4. Step 15 has NOT yet transitioned to `awaiting-user-greenlight`.
32
+
33
+ If condition 4 already fired (i.e. we're in Step 16), the re-cascade
34
+ runs on resume into Step 15 if validate-sample was re-entered and new
35
+ rows graduated.
36
+
37
+ ## Re-Cascade Loop Shape
38
+
39
+ ```text
40
+ 1. paginate campaign table (get_rows_minimal, strip carryData) to
41
+ collect rowIds where:
42
+ - rubricStatus = "passed"
43
+ - messageStatus = "pending" OR messagesCount = 0
44
+
45
+ 2. if newlyPassedRowIds.length == 0:
46
+ proceed to awaiting-user-greenlight
47
+ EXIT re-cascade loop
48
+
49
+ 3. else:
50
+ queue_cells({
51
+ tableId,
52
+ cellIds: newlyPassedGenerateMessageCellIds
53
+ })
54
+
55
+ 4. re-check token contract on the cascaded subset (strict mode default)
56
+ — see references/thomas-revision-filters.md + gold-standard-message-patterns.md
57
+
58
+ 5. go back to step 1 until newlyPassedRowIds == 0
59
+ ```
60
+
61
+ ## Cap
62
+
63
+ Re-cascade must not loop indefinitely. Cap at 3 cascade iterations —
64
+ if after 3 cascades the newly-passed set is still growing, escalate
65
+ (the validate-sample loop is likely mis-configured or the rubric is
66
+ flapping).
67
+
68
+ ## Interaction with Critique
69
+
70
+ When `messaging.critique.enabled=true`, the critique + finalizer pass
71
+ applies to the re-cascade subset same as the initial cohort. Budget
72
+ caps (`messaging.critique.budgetUsdCap`) are per-cascade, not
73
+ cumulative across cascades.
74
+
75
+ ## Interaction with Token Contract
76
+
77
+ Token contract (`messaging.tokenContract: strict`) applies to every
78
+ cascade subset. A cascade message that fails token resolution is
79
+ persisted as pending (same as sample-level token failures) — not
80
+ silently skipped.
81
+
82
+ ## Hard Rules
83
+
84
+ - Generate Message cells do not always auto-cascade on late-passed rows —
85
+ Step 15 must explicitly queue newly-pending Generate Message cells.
86
+ - Re-cascade iteration cap = 3. Trip escalates.
87
+ - `messagesCount` flat + rubric graduating rows ⇒ re-cascade required.
88
+ - Token contract enforcement applies per-cascade, not once-for-all.
89
+ - Re-cascade NEVER re-runs `import_leads`, `check_rubric`, or
90
+ `enrich_with_prospeo`. Those are Step 13 / Step 14 actions.