@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,212 @@
1
+ # Gold-Standard Message Validation Example
2
+
3
+ A fully worked `message-validation.md` that shows what "good" looks like when
4
+ the dry-mode chain runs end to end. Use it as a quality reference for the
5
+ document shape, the Finalizer Pass reasoning, and the voice of the candidate
6
+ messages — not as a template to copy.
7
+
8
+ The brief behind this example is a fictional event-led security motion for a
9
+ company called `Threshold Defense` attending `BlackHat 2026`. The motion is
10
+ close to Example 1 (Revvix / Spektion) but the sentences are written fresh
11
+ from the fictional brief.
12
+
13
+ ---
14
+
15
+ ```md
16
+ # Message Validation
17
+
18
+ Status: confirmed
19
+ Mode: DRY MODE (no DB mutation)
20
+ Template Used: event-led canonical template
21
+ Primary Example: Example 1 — Revvix / Spektion Event-Led Security
22
+ Secondary Influence: Example 7 — Useful CTA Shapes (binary option)
23
+ Lead Sample Basis: 3 validated leads (Dana Patel — VP Security Eng at Arco;
24
+ Mariko Stein — Head of AppSec at Fernway; Ben Oduya — Director, Vuln Mgmt
25
+ at Plantform)
26
+
27
+ ## Proof Inventory
28
+
29
+ - Mechanism: rank 1 — "shows which CVEs are actually reachable at runtime on
30
+ your endpoints, including unsigned scripts that scanners miss"
31
+ - Credibility / Social Proof: rank 2 — "three Fortune 500 security teams
32
+ piloting now" (in brief safe-claims)
33
+ - Outcome Proof: none — the brief does not contain a safe outcome number yet
34
+ - Deployment / Simplicity Proof: rank 4 — "runs in read-only mode for the
35
+ first two weeks, no agent rollout"
36
+ - Founder / Backing / Prior-Work Proof: rank 5 — "built by the team that ran
37
+ runtime detection at Okta" (in brief safe-claims)
38
+
39
+ Winner proof pick: rank 1 in the body, rank 5 moved into a short `PS` so the
40
+ body stays event-relevant and the credibility lands without bloating the
41
+ message.
42
+
43
+ ## Token Fill Rules
44
+
45
+ | Token | Source Field | Allowed Transformation | Fallback |
46
+ | -------------- | ---------------- | ---------------------- | ---------------- |
47
+ | {{first_name}} | lead.firstName | first token only | omit token |
48
+ | {{team_type}} | lead.titleFamily | plain noun phrase | "security teams" |
49
+ | {{event}} | brief.eventName | literal | no fallback |
50
+
51
+ No other tokens are allowed in this campaign.
52
+
53
+ ## Token Adherence Table
54
+
55
+ | Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded | Thomas Filters | Result |
56
+ | ------ | --------------------- | ------------------- | ---------- | ------------------------ | -------------- | ------ |
57
+ | Dana | yes | yes | yes | yes | pass | pass |
58
+ | Mariko | yes | yes | yes | yes | pass | pass |
59
+ | Ben | yes | yes | yes | yes | pass | pass |
60
+
61
+ ## Candidate Messages
62
+
63
+ ### Candidate A (motion-aligned)
64
+
65
+ - Why this candidate exists: closest to the Revvix/Spektion rhythm — event
66
+ hook first, one pain, one mechanism, low-pressure CTA.
67
+ - Message:
68
+
69
+ Subject: BlackHat next week
70
+
71
+ Hey Dana,
72
+
73
+ Saw you'll be at BlackHat and wanted to reach out before the week fills up.
74
+
75
+ Most security teams we talk to are watching "critical" CVE counts balloon
76
+ while reachability stays a guessing game.
77
+
78
+ Threshold Defense shows which CVEs are actually reachable at runtime on
79
+ your endpoints, including unsigned scripts that scanners miss.
80
+
81
+ We'll be at booth #4412 all week if you want to grab coffee or just say hi.
82
+
83
+ Let me know if worth a few minutes.
84
+
85
+ ### Candidate B (proof-forward)
86
+
87
+ - Why this candidate exists: leads with the strongest safe proof element
88
+ (rank 5 founder/backing) to test whether credibility carries the event.
89
+ - Message:
90
+
91
+ Subject: BlackHat next week
92
+
93
+ Hey Dana,
94
+
95
+ Quick one before BlackHat gets busy.
96
+
97
+ We built Threshold Defense to fix the reachability guesswork your team
98
+ probably runs into every week — the CVE list is long but the actually-
99
+ exploitable set is small and scanners don't show it.
100
+
101
+ Three Fortune 500 security teams are piloting now, built by folks who ran
102
+ runtime detection at Okta.
103
+
104
+ Happy to grab coffee at booth #4412 or send a 2-min overview first.
105
+
106
+ ### Candidate C (inbox-distinct opener)
107
+
108
+ - Why this candidate exists: sharpest opener inside the same motion — uses
109
+ the buyer's actual daily pain in one line instead of the event as the
110
+ opener.
111
+ - Message:
112
+
113
+ Subject: reachability at BlackHat
114
+
115
+ Hey Dana,
116
+
117
+ Your scanner queue is probably 4x what it needs to be this week. Most of
118
+ those "critical" CVEs aren't reachable at runtime.
119
+
120
+ Threshold Defense shows which ones actually are on your endpoints,
121
+ including the unsigned-script path scanners miss.
122
+
123
+ We're at booth #4412 all week. Happy to grab coffee or send a short
124
+ overview first.
125
+
126
+ ## Finalizer Pass
127
+
128
+ - Best opener: **Candidate C** — "Your scanner queue is probably 4x what it
129
+ needs to be this week" is sharper than the event-first opener and keeps
130
+ the event hook intact via the subject line.
131
+ - Best proof sentence: **Candidate A** — "shows which CVEs are actually
132
+ reachable at runtime on your endpoints, including unsigned scripts that
133
+ scanners miss" is the cleanest rank-1 mechanism line. B's body line is
134
+ similar but softer; C's is close to A but slightly less specific.
135
+ - Best bridge: **Candidate A** — single-line transition from pain to
136
+ mechanism without editorializing.
137
+ - Best CTA: **Candidate C** — "Happy to grab coffee or send a short
138
+ overview first" is the binary option from Example 7 and matches the
139
+ low-pressure event motion better than A's open-ended close.
140
+ - Assembly note: clean combination — opener from C, bridge + mechanism from
141
+ A, CTA from C, plus a new short `PS` carrying the rank-5 founder proof
142
+ that none of the candidates placed well.
143
+
144
+ ## Selected Winner
145
+
146
+ - Winner: finalizer-remix
147
+ - Why it won: sharper inbox-distinct opener (distinctiveness) + cleanest
148
+ mechanism (proof) + low-pressure binary CTA (coherence). No single
149
+ candidate held all three pieces.
150
+ - Lead: Dana Patel — VP Security Eng at Arco
151
+ - Signals Used: BlackHat attendee (validated in lead-sample.json), runtime
152
+ security titleFamily
153
+ - Tokens Used: {{first_name}}, {{event}}
154
+ - Message:
155
+
156
+ Subject: reachability at BlackHat
157
+
158
+ Hi Dana,
159
+
160
+ Your scanner queue is probably 4x what you need this week.
161
+
162
+ Most of those "critical" CVEs will never actually run on your endpoints.
163
+
164
+ Threshold Defense shows you which ones do.
165
+
166
+ That includes the unsigned scripts your scanners miss.
167
+
168
+ We'll be at booth #4412 all week.
169
+
170
+ Want to grab coffee, or should I send a short overview first?
171
+
172
+ PS - our team came out of runtime detection at Okta, which is why we
173
+ started with the reachability problem first instead of more scanner noise.
174
+
175
+ ## Findings
176
+
177
+ - Event hook is strong enough to carry the message; rank-1 mechanism is
178
+ clean in the body and rank-5 founder proof fits cleanly in a final-line
179
+ `PS`.
180
+ - Candidate C's opener beat the event-first opener on distinctiveness
181
+ without losing the event relevance (it lives in the subject line now).
182
+ - No unsupported tokens, no invented metrics, no fabricated customer names.
183
+ - Sample set reads like three siblings from one campaign, not three
184
+ experiments — the subject varies but the rhythm and tone match.
185
+
186
+ ## Recommendation
187
+
188
+ - proceed
189
+ ```
190
+
191
+ ---
192
+
193
+ ## What this example demonstrates
194
+
195
+ - The Primary Example is named explicitly (Example 1), and the winner
196
+ **matches the quality bar without copying the wording** — the sentences
197
+ are fresh from the fictional brief but the rhythm is recognizable.
198
+ - The Finalizer Pass actually _combines_ pieces from three candidates into
199
+ a winner no single candidate produced. Opener from C, bridge and
200
+ mechanism from A, CTA from C, new `PS` for rank-5 proof.
201
+ - Proof ranks (1 in body, 5 in PS) line up with
202
+ `gold-standard-message-patterns.md` — the model didn't settle for "one
203
+ generic credibility sentence."
204
+ - Token fill rules are declared once, with source fields and fallbacks, and
205
+ the adherence table reports pass/fail per lead.
206
+ - The "What Good Looks Like" bar in `thomas-revision-filters.md` is met:
207
+ sharp voice, grounded personalization, motion-aligned structure, useful
208
+ CTA proportional to signal.
209
+
210
+ Use this example when dry-mode output needs a concrete target for
211
+ reasoning shape and finalizer discipline. Do not copy the Threshold Defense
212
+ sentences into real briefs — it is a fictional motion reference.
@@ -0,0 +1,172 @@
1
+ # Lead Validation Preview
2
+
3
+ This reference defines the Phase 84 `find leads` output contract.
4
+
5
+ ## Inputs
6
+
7
+ - `brief.md`
8
+ - optional `lead-source-intake.json`
9
+ - the existing `find-leads` capability in campaignless preview mode
10
+
11
+ ## Output Files
12
+
13
+ ```text
14
+ lead-review.md
15
+ lead-sample.json
16
+ lead-source-intake.json # only when the user intentionally supplied a source
17
+ ```
18
+
19
+ ## Tooling Rules
20
+
21
+ Preview only:
22
+
23
+ - use `find-leads` without `campaignOfferId`
24
+ - do not call `import_leads`
25
+ - do not set `selectedLeadListId`
26
+ - do not call `confirm_lead_list`
27
+ - do not create workflow rows or campaign rows
28
+ - do not call `save_domain_filters`
29
+
30
+ Supplied-source preview:
31
+
32
+ - `normal-discovery` is the default when the user does not already know the
33
+ people/accounts.
34
+ - `supplied-linkedin-profiles` uses `load_csv_linkedin_leads` before approval
35
+ only as preview. Pre-approval calls must omit `confirmed: true`,
36
+ `campaignOfferId`, `currentStep`, `leadListId`, `sourceLeadListId`, and
37
+ provider-import parameters.
38
+ - `supplied-domains` uses `load_csv_domains`. Pre-approval confirmation is
39
+ allowed only to create a standalone `domainFilterId` and must omit
40
+ `campaignOfferId` and `currentStep`. Use that `domainFilterId` for a
41
+ campaignless account-constrained people sample.
42
+ In other words, pre-approval domain CSV confirmation must omit
43
+ `campaignOfferId` and `currentStep`.
44
+ - `existing-lead-list` samples from the existing Sellable lead list before
45
+ approval and does not clone/import it until after approval.
46
+
47
+ `lead-source-intake.json` records:
48
+
49
+ ```json
50
+ {
51
+ "sourceType": "normal-discovery | supplied-linkedin-profiles | supplied-domains | existing-lead-list",
52
+ "sourceInputMode": "file | paste | existingLeadList",
53
+ "filePath": "/absolute/path/to/source.csv",
54
+ "existingLeadListId": "lead_list_...",
55
+ "selectedColumns": ["linkedin_url", "title", "company"],
56
+ "confirmationToken": "preview-token",
57
+ "normalizedCounts": {
58
+ "sourceRows": 100,
59
+ "validRows": 98,
60
+ "duplicateRows": 1,
61
+ "invalidRows": 1
62
+ },
63
+ "domainFilterId": "domain_filter_..."
64
+ }
65
+ ```
66
+
67
+ ## `lead-review.md` Shape
68
+
69
+ Use a compact markdown report with these sections:
70
+
71
+ ```md
72
+ # Lead Review
73
+
74
+ ## Result
75
+
76
+ - Status: confirmed | rejected | unclear
77
+ - Confidence: low | medium | high
78
+ - Provider Path: {provider or provider sequence}
79
+ - Source Type: normal-discovery | supplied-linkedin-profiles | supplied-domains | existing-lead-list
80
+ - Source Counts: {rows/accounts supplied, valid, duplicate, invalid}
81
+ - Sample Method: {provider preview, supplied-row sample, existing-list sample, domain-constrained people sample}
82
+ - Preview Count: {n}
83
+ - ICP Match Rate: {x/y or % if supportable}
84
+ - Volume Comparison: above target | in range | below target
85
+ - Expected LinkedIn Funnel: connection acceptance {range}, reply {range}, estimate basis {sample-backed | historical | founder-supplied | directional}
86
+
87
+ ## Source Decision
88
+
89
+ - Best Path: {provider or provider sequence}
90
+ - Why It Won: {volume + reply-likelihood + fit rationale}
91
+
92
+ ## Expected LinkedIn Funnel
93
+
94
+ - Source Volume: {n or range}
95
+ - Expected Usable Leads After Filtering: {n or range}
96
+ - Likely Connection Acceptance: {range}
97
+ - Likely Reply Rate: {range}
98
+ - Estimate Basis: sample-backed | historical | founder-supplied | directional
99
+
100
+ ## Pros
101
+
102
+ - ...
103
+
104
+ ## Tradeoffs
105
+
106
+ - ...
107
+
108
+ ## Discarded Paths
109
+
110
+ - ...
111
+
112
+ ## What Matched
113
+
114
+ - ...
115
+
116
+ ## What Was Noisy
117
+
118
+ - ...
119
+
120
+ ## Sample Notes
121
+
122
+ | Name | Title | Company | Why it matched / why it was noisy |
123
+ | ---- | ----- | ------- | --------------------------------- |
124
+
125
+ ## Next Action
126
+
127
+ - proceed to filter leads
128
+ - revise leads
129
+ - halt for provider/auth issue
130
+ ```
131
+
132
+ ## `lead-sample.json` Shape
133
+
134
+ Write a machine-readable object:
135
+
136
+ ```json
137
+ {
138
+ "status": "confirmed",
139
+ "providerPath": ["prospeo"],
140
+ "previewCount": 25,
141
+ "icpMatchRate": {
142
+ "matched": 18,
143
+ "sampled": 25
144
+ },
145
+ "volumeComparison": "in-range",
146
+ "falsePositivePatterns": ["agencies", "junior SDR titles"],
147
+ "leads": [
148
+ {
149
+ "name": "Jane Doe",
150
+ "title": "Director of Marketing Operations",
151
+ "company": "Example SaaS",
152
+ "linkedinUrl": "https://www.linkedin.com/in/janedoe/",
153
+ "provider": "prospeo",
154
+ "signals": ["HubSpot", "hiring demand gen"]
155
+ }
156
+ ]
157
+ }
158
+ ```
159
+
160
+ The sample does not need every available provider field. It does need enough
161
+ structure for the next step to decide:
162
+
163
+ - keep
164
+ - exclude
165
+ - optional supporting signal
166
+
167
+ For supplied LinkedIn profile CSVs and existing lead lists, avoid generic TAM
168
+ language and provider-discovery framing. For supplied domain/account lists,
169
+ state that domains are account constraints and include actual sampled people
170
+ from those accounts. If the constrained people sample returns zero or too few
171
+ usable rows, write that evidence and route to `revise-leads` or
172
+ `confirm-with-user`; do not remove the `domainFilterId` silently.