@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.
- package/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/README.md +355 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +73 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +246 -0
- package/dist/engage-memory.d.ts +63 -0
- package/dist/engage-memory.js +354 -0
- package/dist/index-dev.d.ts +2 -0
- package/dist/index-dev.js +17 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +499 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +97 -0
- package/dist/tools/auth.d.ts +30 -0
- package/dist/tools/auth.js +124 -0
- package/dist/tools/blueprint-commit.d.ts +174 -0
- package/dist/tools/blueprint-commit.js +286 -0
- package/dist/tools/bootstrap.d.ts +64 -0
- package/dist/tools/bootstrap.js +246 -0
- package/dist/tools/campaigns.d.ts +589 -0
- package/dist/tools/campaigns.js +892 -0
- package/dist/tools/cells.d.ts +58 -0
- package/dist/tools/cells.js +48 -0
- package/dist/tools/context.d.ts +88 -0
- package/dist/tools/context.js +271 -0
- package/dist/tools/csv-domains.d.ts +73 -0
- package/dist/tools/csv-domains.js +464 -0
- package/dist/tools/csv-linkedin.d.ts +102 -0
- package/dist/tools/csv-linkedin.js +712 -0
- package/dist/tools/direct-campaigns.d.ts +240 -0
- package/dist/tools/direct-campaigns.js +250 -0
- package/dist/tools/engage-bootstrap.d.ts +94 -0
- package/dist/tools/engage-bootstrap.js +205 -0
- package/dist/tools/engage-discovery.d.ts +78 -0
- package/dist/tools/engage-discovery.js +150 -0
- package/dist/tools/engage-memory.d.ts +181 -0
- package/dist/tools/engage-memory.js +143 -0
- package/dist/tools/engage-state.d.ts +72 -0
- package/dist/tools/engage-state.js +62 -0
- package/dist/tools/enrichment.d.ts +167 -0
- package/dist/tools/enrichment.js +174 -0
- package/dist/tools/flow-preflight.d.ts +68 -0
- package/dist/tools/flow-preflight.js +138 -0
- package/dist/tools/framework.d.ts +44 -0
- package/dist/tools/framework.js +153 -0
- package/dist/tools/interaction-mode.d.ts +27 -0
- package/dist/tools/interaction-mode.js +102 -0
- package/dist/tools/leads.d.ts +2417 -0
- package/dist/tools/leads.js +2307 -0
- package/dist/tools/linkedin.d.ts +210 -0
- package/dist/tools/linkedin.js +229 -0
- package/dist/tools/navigation.d.ts +91 -0
- package/dist/tools/navigation.js +381 -0
- package/dist/tools/one-off.d.ts +229 -0
- package/dist/tools/one-off.js +273 -0
- package/dist/tools/processing.d.ts +70 -0
- package/dist/tools/processing.js +56 -0
- package/dist/tools/prompts.d.ts +211 -0
- package/dist/tools/prompts.js +210 -0
- package/dist/tools/provider-preflight.d.ts +21 -0
- package/dist/tools/provider-preflight.js +59 -0
- package/dist/tools/readiness.d.ts +261 -0
- package/dist/tools/readiness.js +510 -0
- package/dist/tools/rows.d.ts +126 -0
- package/dist/tools/rows.js +105 -0
- package/dist/tools/rubrics.d.ts +497 -0
- package/dist/tools/rubrics.js +681 -0
- package/dist/tools/senders.d.ts +44 -0
- package/dist/tools/senders.js +69 -0
- package/dist/tools/sequencer.d.ts +127 -0
- package/dist/tools/sequencer.js +194 -0
- package/dist/tools/tables.d.ts +35 -0
- package/dist/tools/tables.js +36 -0
- package/dist/tools/verify-row.d.ts +36 -0
- package/dist/tools/verify-row.js +38 -0
- package/dist/tools/workspaces.d.ts +140 -0
- package/dist/tools/workspaces.js +139 -0
- package/dist/utils/workspace-root.d.ts +1 -0
- package/dist/utils/workspace-root.js +39 -0
- package/package.json +46 -0
- package/skills/building-gtm-tables/SKILL.md +216 -0
- package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
- package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
- package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
- package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
- package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
- package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
- package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
- package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
- package/skills/building-gtm-tables/references/verify-loop.md +74 -0
- package/skills/campaign-messages/SKILL.md +173 -0
- package/skills/campaign-messages/flow.v1.json +75 -0
- package/skills/craft-message/SKILL.md +401 -0
- package/skills/create-campaign/ARCHITECTURE.md +232 -0
- package/skills/create-campaign/DISCUSS.md +296 -0
- package/skills/create-campaign/FLOW_ASCII.md +240 -0
- package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
- package/skills/create-campaign/README.md +142 -0
- package/skills/create-campaign/SKILL.md +286 -0
- package/skills/create-campaign/context/README.md +67 -0
- package/skills/create-campaign/context/_TEMPLATE.md +12 -0
- package/skills/create-campaign/context/context.md +35 -0
- package/skills/create-campaign/context/learnings.md +16 -0
- package/skills/create-campaign/context/registry.json +19 -0
- package/skills/create-campaign/core/flow.v1.json +217 -0
- package/skills/create-campaign/core/policy.md +191 -0
- package/skills/create-campaign/core/providers/apollo.json +35 -0
- package/skills/create-campaign/core/providers/prospeo.json +34 -0
- package/skills/create-campaign/core/providers/registry.json +31 -0
- package/skills/create-campaign/core/providers/sales-nav.json +37 -0
- package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
- package/skills/create-campaign/references/brief-template.md +64 -0
- package/skills/create-campaign/references/campaign-quality.md +84 -0
- package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
- package/skills/create-campaign/references/offer-patterns.md +108 -0
- package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
- package/skills/create-campaign/references/question-examples.md +167 -0
- package/skills/create-campaign/references/token-fill-examples.md +81 -0
- package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
- package/skills/create-campaign-brief/DISCUSS.md +64 -0
- package/skills/create-campaign-brief/README.md +176 -0
- package/skills/create-campaign-brief/SKILL.md +537 -0
- package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
- package/skills/create-campaign-brief/references/brief-template.md +220 -0
- package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
- package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
- package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
- package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
- package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
- package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
- package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
- package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
- package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
- package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
- package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
- package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
- package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
- package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
- package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
- package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
- package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
- package/skills/create-campaign-v2/SKILL.md +1619 -0
- package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
- package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
- package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
- package/skills/create-campaign-v2/core/policy.md +82 -0
- package/skills/create-campaign-v2/references/ai-tells.md +253 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
- package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
- package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
- package/skills/create-campaign-v2/references/filter-leads.md +495 -0
- package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
- package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
- package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
- package/skills/create-campaign-v2-validation/SKILL.md +296 -0
- package/skills/create-post/SKILL.md +1308 -0
- package/skills/create-rubric/SKILL.md +251 -0
- package/skills/engage/SKILL.md +549 -0
- package/skills/engage/core/README.md +23 -0
- package/skills/engage/core/proven-searches.json +11 -0
- package/skills/engage/core/style-guide.template.md +47 -0
- package/skills/engage/core/tracked-people.json +10 -0
- package/skills/enrich-prospects/SKILL.md +97 -0
- package/skills/find-leads/SKILL.md +467 -0
- package/skills/generate-messages/SKILL.md +2361 -0
- package/skills/interview/SKILL.md +132 -0
- package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
- package/skills/interview/core/ICP.template.md +54 -0
- package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
- package/skills/providers/apollo.md +520 -0
- package/skills/providers/prospeo.md +398 -0
- package/skills/providers/sales-nav.md +372 -0
- package/skills/providers/signal-discovery.md +495 -0
- package/skills/research/SKILL.md +258 -0
- package/skills/research/config.json +9 -0
- package/skills/research/override.md +13 -0
- package/skills/research-prospect/SKILL.md +99 -0
- package/skills/research-sender/SKILL.md +158 -0
- 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.
|