@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,199 @@
|
|
|
1
|
+
import type { Blueprint } from "@/lib/workflow-tables/blueprint/schema";
|
|
2
|
+
|
|
3
|
+
export type CommonBlueprintEntry = {
|
|
4
|
+
slug: string;
|
|
5
|
+
description: string;
|
|
6
|
+
blueprint: Blueprint;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const enrichmentRubric = [
|
|
10
|
+
{
|
|
11
|
+
checkName: "vp_or_c_level",
|
|
12
|
+
criterion: "Must be VP or C-level in revenue, sales, marketing, or GTM.",
|
|
13
|
+
description: "Senior GTM operators with buying authority.",
|
|
14
|
+
reason: "Decision makers can approve workflow automation purchases.",
|
|
15
|
+
isRequiredCheck: "true",
|
|
16
|
+
allowPartialCredit: "false",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
checkName: "active_outbound_motion",
|
|
20
|
+
criterion: "Company shows evidence of outbound or pipeline-building work.",
|
|
21
|
+
description: "Outbound motion is visible in role, hiring, or messaging.",
|
|
22
|
+
reason: "The table is most useful when outbound volume creates ops pain.",
|
|
23
|
+
isRequiredCheck: "false",
|
|
24
|
+
allowPartialCredit: "true",
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const httpEnrichConfig = {
|
|
29
|
+
inputMapping: {
|
|
30
|
+
method: { value: "POST" },
|
|
31
|
+
endpoint: { value: "/api/v4/enrich-prospect" },
|
|
32
|
+
body: { value: '{"linkedinUrl":"{{LinkedIn URL}}"}' },
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const COMMON_BLUEPRINTS: CommonBlueprintEntry[] = [
|
|
37
|
+
{
|
|
38
|
+
slug: "enrich-and-score",
|
|
39
|
+
description: "Rank a prospect list against an ICP rubric.",
|
|
40
|
+
blueprint: {
|
|
41
|
+
columns: [
|
|
42
|
+
{ id: "c1", type: "text", name: "LinkedIn URL", config: {} },
|
|
43
|
+
{
|
|
44
|
+
id: "c2",
|
|
45
|
+
type: "http_request",
|
|
46
|
+
name: "Enrich Prospect",
|
|
47
|
+
config: httpEnrichConfig,
|
|
48
|
+
inputMapping: { linkedinUrl: "c1" },
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "c3",
|
|
52
|
+
type: "score_icp_mcp",
|
|
53
|
+
name: "ICP Score",
|
|
54
|
+
config: { rubric: enrichmentRubric },
|
|
55
|
+
inputMapping: { enrichedProspectId: "c2" },
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
edges: [
|
|
59
|
+
{ from: "c1", to: "c2", via: "linkedinUrl" },
|
|
60
|
+
{ from: "c2", to: "c3", via: "enrichedProspectId" },
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
slug: "enrich-score-send-invite",
|
|
66
|
+
description: "Enrich + score + conditionally send invite to top scorers.",
|
|
67
|
+
blueprint: {
|
|
68
|
+
columns: [
|
|
69
|
+
{ id: "c1", type: "text", name: "LinkedIn URL", config: {} },
|
|
70
|
+
{
|
|
71
|
+
id: "c2",
|
|
72
|
+
type: "http_request",
|
|
73
|
+
name: "Enrich Prospect",
|
|
74
|
+
config: httpEnrichConfig,
|
|
75
|
+
inputMapping: { linkedinUrl: "c1" },
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "c3",
|
|
79
|
+
type: "score_icp_mcp",
|
|
80
|
+
name: "ICP Score",
|
|
81
|
+
config: { rubric: enrichmentRubric },
|
|
82
|
+
inputMapping: { enrichedProspectId: "c2" },
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "c4",
|
|
86
|
+
type: "send_invite",
|
|
87
|
+
name: "Invite",
|
|
88
|
+
config: {
|
|
89
|
+
actionConfig: {
|
|
90
|
+
actionType: "INVITE",
|
|
91
|
+
waitForEvent: {
|
|
92
|
+
event: "connection_created",
|
|
93
|
+
timeoutDays: 14,
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
runCondition: "{{ICP Score.score}} >= 70",
|
|
97
|
+
},
|
|
98
|
+
inputMapping: { linkedinUrl: "c1" },
|
|
99
|
+
runCondition: "{{ICP Score.score}} >= 70",
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
edges: [
|
|
103
|
+
{ from: "c1", to: "c2", via: "linkedinUrl" },
|
|
104
|
+
{ from: "c2", to: "c3", via: "enrichedProspectId" },
|
|
105
|
+
{ from: "c1", to: "c4", via: "linkedinUrl" },
|
|
106
|
+
{ from: "c3", to: "c4", via: "runCondition" },
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
slug: "enrich-score-generate-message",
|
|
112
|
+
description:
|
|
113
|
+
"Enrich + score + generate campaign-backed messages for qualified prospects.",
|
|
114
|
+
blueprint: {
|
|
115
|
+
columns: [
|
|
116
|
+
{ id: "c1", type: "text", name: "LinkedIn URL", config: {} },
|
|
117
|
+
{
|
|
118
|
+
id: "c2",
|
|
119
|
+
type: "text",
|
|
120
|
+
name: "Campaign Offer ID",
|
|
121
|
+
config: {},
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "c3",
|
|
125
|
+
type: "http_request",
|
|
126
|
+
name: "Enrich Prospect",
|
|
127
|
+
config: httpEnrichConfig,
|
|
128
|
+
inputMapping: { linkedinUrl: "c1" },
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "c4",
|
|
132
|
+
type: "score_icp_mcp",
|
|
133
|
+
name: "ICP Score",
|
|
134
|
+
config: { rubric: enrichmentRubric },
|
|
135
|
+
inputMapping: { enrichedProspectId: "c3" },
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: "c5",
|
|
139
|
+
type: "generate_message",
|
|
140
|
+
name: "Generate Message",
|
|
141
|
+
config: {
|
|
142
|
+
runCondition: "{{ICP Score.score}} >= 70",
|
|
143
|
+
},
|
|
144
|
+
inputMapping: {
|
|
145
|
+
campaignOfferId: "c2",
|
|
146
|
+
enrichedProspectId: "c3",
|
|
147
|
+
},
|
|
148
|
+
runCondition: "{{ICP Score.score}} >= 70",
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
edges: [
|
|
152
|
+
{ from: "c1", to: "c3", via: "linkedinUrl" },
|
|
153
|
+
{ from: "c3", to: "c4", via: "enrichedProspectId" },
|
|
154
|
+
{ from: "c2", to: "c5", via: "campaignOfferId" },
|
|
155
|
+
{ from: "c3", to: "c5", via: "enrichedProspectId" },
|
|
156
|
+
{ from: "c4", to: "c5", via: "runCondition" },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
slug: "ai-column-escape-hatch",
|
|
162
|
+
description:
|
|
163
|
+
"Bring-your-own-prompt AI Column writes a one-line research summary per prospect.",
|
|
164
|
+
blueprint: {
|
|
165
|
+
columns: [
|
|
166
|
+
{ id: "c1", type: "text", name: "LinkedIn URL", config: {} },
|
|
167
|
+
{
|
|
168
|
+
id: "c2",
|
|
169
|
+
type: "text",
|
|
170
|
+
name: "Research Prompt",
|
|
171
|
+
config: {},
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "c3",
|
|
175
|
+
type: "ai_column",
|
|
176
|
+
name: "Post Summary",
|
|
177
|
+
config: {
|
|
178
|
+
aiConfig: {
|
|
179
|
+
modelName: "google/gemini-3.1-flash-lite-preview",
|
|
180
|
+
systemPrompt:
|
|
181
|
+
"Summarize only observable public LinkedIn evidence.",
|
|
182
|
+
userPrompt:
|
|
183
|
+
"Using {{LinkedIn URL}} and {{Research Prompt}}, write one sentence about the prospect's latest relevant LinkedIn activity.",
|
|
184
|
+
outputFields: [{ name: "summary", type: "text" }],
|
|
185
|
+
enableWebSearch: true,
|
|
186
|
+
maxSearchQueries: 3,
|
|
187
|
+
},
|
|
188
|
+
processing: { autoUpdate: true },
|
|
189
|
+
},
|
|
190
|
+
inputMapping: { linkedinUrl: "c1", prompt: "c2" },
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
edges: [
|
|
194
|
+
{ from: "c1", to: "c3", via: "linkedinUrl" },
|
|
195
|
+
{ from: "c2", to: "c3", via: "prompt" },
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Common Blueprints
|
|
2
|
+
|
|
3
|
+
The worked examples are defined once as a typed fixture at
|
|
4
|
+
[`./common-blueprints.fixtures.ts`](./common-blueprints.fixtures.ts). The
|
|
5
|
+
contract test imports `COMMON_BLUEPRINTS` directly and validates every blueprint
|
|
6
|
+
against the validator, so drift is caught by TypeScript or by an assertion.
|
|
7
|
+
|
|
8
|
+
Each entry has:
|
|
9
|
+
|
|
10
|
+
- `slug` - stable identifier
|
|
11
|
+
- `description` - one-line summary
|
|
12
|
+
- `blueprint` - full Blueprint object
|
|
13
|
+
|
|
14
|
+
## 1. Enrich + Score (`enrich-and-score`)
|
|
15
|
+
|
|
16
|
+
Rank a prospect list against an ICP rubric. Three columns: `text` for LinkedIn
|
|
17
|
+
URL, `http_request` named "Enrich Prospect" for `/api/v4/enrich-prospect`, then
|
|
18
|
+
`score_icp_mcp` with a natural-language rubric.
|
|
19
|
+
|
|
20
|
+
See `COMMON_BLUEPRINTS[0].blueprint` in the fixture.
|
|
21
|
+
|
|
22
|
+
## 2. Enrich + Score + Send Invite (`enrich-score-send-invite`)
|
|
23
|
+
|
|
24
|
+
Build the same enrichment and scoring spine, then add `send_invite` gated on the
|
|
25
|
+
ICP score. This is the default pattern when the table should both qualify and
|
|
26
|
+
act on high-fit prospects.
|
|
27
|
+
|
|
28
|
+
See `COMMON_BLUEPRINTS[1].blueprint` in the fixture.
|
|
29
|
+
|
|
30
|
+
## 3. Enrich + Score + Generate Message (`enrich-score-generate-message`)
|
|
31
|
+
|
|
32
|
+
Build the enrichment and scoring spine, then add `generate_message` for
|
|
33
|
+
campaign-backed production copy. Both `score_icp_mcp` and `generate_message`
|
|
34
|
+
map `enrichedProspectId` from the same `http_request` column named "Enrich
|
|
35
|
+
Prospect".
|
|
36
|
+
|
|
37
|
+
See `COMMON_BLUEPRINTS[2].blueprint` in the fixture.
|
|
38
|
+
|
|
39
|
+
## 4. AI Column Escape Hatch (`ai-column-escape-hatch`)
|
|
40
|
+
|
|
41
|
+
Use `ai_column` only when the user needs a bespoke prompt that is not covered by
|
|
42
|
+
fixed enrichment, scoring, or LinkedIn action columns.
|
|
43
|
+
|
|
44
|
+
See `COMMON_BLUEPRINTS[3].blueprint` in the fixture.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Failure Taxonomy
|
|
2
|
+
|
|
3
|
+
## TOC
|
|
4
|
+
|
|
5
|
+
- [Validator failure modes (what the Plan 04 validator catches)](#validator-failure-modes-what-the-plan-04-validator-catches)
|
|
6
|
+
- [LLM tool-calling failure modes (from 98-RESEARCH.md)](#llm-tool-calling-failure-modes-from-98-researchmd)
|
|
7
|
+
|
|
8
|
+
## Validator failure modes (what the Plan 04 validator catches)
|
|
9
|
+
|
|
10
|
+
### 1. Shape
|
|
11
|
+
|
|
12
|
+
What the LLM did wrong: emitted a blueprint that does not match the Zod shape.
|
|
13
|
+
|
|
14
|
+
Example:
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{ "column": [] }
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
How to fix: emit `{ "columns": [...], "edges": [...] }` with every column
|
|
21
|
+
containing `id`, `type`, `name`, and `config`.
|
|
22
|
+
|
|
23
|
+
### 2. Phantom type
|
|
24
|
+
|
|
25
|
+
What the LLM did wrong: invented or pluralized a type.
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"id": "enrich",
|
|
32
|
+
"type": "http_requests",
|
|
33
|
+
"name": "Enrich Prospect",
|
|
34
|
+
"config": {}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
How to fix: pick the active registry key from `column-type-catalog.md`, such as
|
|
39
|
+
`http_request`.
|
|
40
|
+
|
|
41
|
+
### 3. Deprecated type
|
|
42
|
+
|
|
43
|
+
What the LLM did wrong: used an old type such as `enrich_person`.
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"id": "enrich",
|
|
50
|
+
"type": "enrich_person",
|
|
51
|
+
"name": "Enrich Prospect",
|
|
52
|
+
"config": {}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
How to fix: use the `migrateToType` target, normally `http_request`, and preserve
|
|
57
|
+
the intended behavior in config.
|
|
58
|
+
|
|
59
|
+
### 4. Required field
|
|
60
|
+
|
|
61
|
+
What the LLM did wrong: omitted required config.
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"id": "enrich",
|
|
68
|
+
"type": "http_request",
|
|
69
|
+
"name": "Enrich Prospect",
|
|
70
|
+
"config": { "method": "POST" }
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
How to fix: include the required field, for example `endpoint:
|
|
75
|
+
"/api/v4/enrich-prospect"` plus the mapped body.
|
|
76
|
+
|
|
77
|
+
### 5. Missing producer
|
|
78
|
+
|
|
79
|
+
What the LLM did wrong: referenced a column id or template token that no column
|
|
80
|
+
produces.
|
|
81
|
+
|
|
82
|
+
Example:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"id": "score",
|
|
87
|
+
"type": "score_icp_mcp",
|
|
88
|
+
"name": "ICP Score",
|
|
89
|
+
"config": { "rubric": ["VP sales"] },
|
|
90
|
+
"inputMapping": { "enrichedProspectId": "ghost_enrich" }
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
How to fix: add the producer column or change the mapping to the actual producer
|
|
95
|
+
id.
|
|
96
|
+
|
|
97
|
+
### 6. Cycle
|
|
98
|
+
|
|
99
|
+
What the LLM did wrong: created two columns that depend on each other.
|
|
100
|
+
|
|
101
|
+
Example:
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"edges": [
|
|
106
|
+
{ "from": "a", "to": "b", "via": "x" },
|
|
107
|
+
{ "from": "b", "to": "a", "via": "y" }
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
How to fix: choose one true upstream source and remove the reverse dependency.
|
|
113
|
+
|
|
114
|
+
### 7. Wrong order
|
|
115
|
+
|
|
116
|
+
What the LLM did wrong: put a consumer before the producer in a way that the
|
|
117
|
+
commit planner cannot safely resolve.
|
|
118
|
+
|
|
119
|
+
Example: `score_icp_mcp` appears before `enrich_prospect` while mapping
|
|
120
|
+
`enrichedProspectId` from `enrich_prospect`.
|
|
121
|
+
|
|
122
|
+
How to fix: order columns topologically and keep `edges` consistent with
|
|
123
|
+
`inputMapping`.
|
|
124
|
+
|
|
125
|
+
### 8. Recommended producer missing
|
|
126
|
+
|
|
127
|
+
What the LLM did wrong: produced a valid but low-quality scoring blueprint.
|
|
128
|
+
|
|
129
|
+
Example: `score_icp_mcp` scores from only a LinkedIn URL even though Enrich Prospect
|
|
130
|
+
would provide richer data.
|
|
131
|
+
|
|
132
|
+
How to fix: this is a warning, not an error. Consider adding "Enrich Prospect"
|
|
133
|
+
as a `http_request` producer before scoring.
|
|
134
|
+
|
|
135
|
+
## LLM tool-calling failure modes (from 98-RESEARCH.md)
|
|
136
|
+
|
|
137
|
+
### 9. Non-existent tool name
|
|
138
|
+
|
|
139
|
+
Observable symptom: the agent calls a made-up configuration tool.
|
|
140
|
+
|
|
141
|
+
Defense mechanism: use the fully qualified tool inventory in `SKILL.md`; never
|
|
142
|
+
invent tools.
|
|
143
|
+
|
|
144
|
+
### 10. Wrong tool chosen
|
|
145
|
+
|
|
146
|
+
Observable symptom: the agent tries to update cells or run queueing instead of
|
|
147
|
+
authoring a blueprint.
|
|
148
|
+
|
|
149
|
+
Defense mechanism: the phase gates say BLUEPRINT before COMMIT before VERIFY,
|
|
150
|
+
and the catalog says when to use and when NOT to use each column type.
|
|
151
|
+
|
|
152
|
+
### 11. Invalid parameters
|
|
153
|
+
|
|
154
|
+
Observable symptom: the tool call has the right name but the wrong shape.
|
|
155
|
+
|
|
156
|
+
Defense mechanism: `core/blueprint-schema.json` constrains authoring, and the
|
|
157
|
+
runtime Zod validator safe-parses before commit.
|
|
158
|
+
|
|
159
|
+
### 12. Missing required arguments
|
|
160
|
+
|
|
161
|
+
Observable symptom: a commit is attempted without column config that the runtime
|
|
162
|
+
requires.
|
|
163
|
+
|
|
164
|
+
Defense mechanism: Zod required fields plus the validator's `required_field`
|
|
165
|
+
error report.
|
|
166
|
+
|
|
167
|
+
### 13. Tool simulation
|
|
168
|
+
|
|
169
|
+
Observable symptom: the agent says the blueprint is committed or verified but
|
|
170
|
+
no MCP tool was actually called.
|
|
171
|
+
|
|
172
|
+
Defense mechanism: phase gates require real `sellable:commit_blueprint` and
|
|
173
|
+
`sellable:verify_table_row` calls. Always call the tool, never simulate it.
|
|
174
|
+
|
|
175
|
+
### 14. Premature cell queueing
|
|
176
|
+
|
|
177
|
+
Observable symptom: cells are queued before the dependency graph is valid.
|
|
178
|
+
|
|
179
|
+
Defense mechanism: HARD INVARIANT forbids direct `sellable:queue_cells`; commit
|
|
180
|
+
creates columns and lets the orchestrator queue cells after validation.
|
|
181
|
+
|
|
182
|
+
### 15. Wait-column stall
|
|
183
|
+
|
|
184
|
+
Observable symptom: verification hangs or appears blocked on a wait or long
|
|
185
|
+
timer column.
|
|
186
|
+
|
|
187
|
+
Defense mechanism: option (d) passes wait column ids through `skipColumnIds`.
|
|
188
|
+
The skill does not override run conditions at runtime.
|
|
189
|
+
|
|
190
|
+
### 16. Missing enrichment dependency
|
|
191
|
+
|
|
192
|
+
Observable symptom: scoring works poorly or fails because the enriched prospect
|
|
193
|
+
object was never produced.
|
|
194
|
+
|
|
195
|
+
Defense mechanism: the `recommended_producer` warning surfaces "consider Enrich
|
|
196
|
+
Prospect for score_icp_mcp"; fix by adding the Enrich Prospect `http_request`
|
|
197
|
+
producer and mapping `enrichedProspectId`.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# UAT Seed Prompts
|
|
2
|
+
|
|
3
|
+
Use these prompts against a live workflow table to exercise the full
|
|
4
|
+
BLUEPRINT -> COMMIT -> VERIFY lifecycle.
|
|
5
|
+
|
|
6
|
+
## 1. Enrich + Score
|
|
7
|
+
|
|
8
|
+
Build a workflow table for a prospect list with LinkedIn URLs. Enrich every
|
|
9
|
+
prospect, then score ICP fit for VP+ revenue, sales, marketing, or GTM leaders
|
|
10
|
+
at B2B companies with an active outbound motion. Verify one row, then ask me for
|
|
11
|
+
2-5 more rows for batch confirmation.
|
|
12
|
+
|
|
13
|
+
Expected shape: `LinkedIn URL` -> `Enrich Prospect` -> `ICP Score`.
|
|
14
|
+
|
|
15
|
+
## 2. Enrich + Score + Invite
|
|
16
|
+
|
|
17
|
+
Build a workflow table that enriches each LinkedIn URL, scores ICP fit, and sends
|
|
18
|
+
a LinkedIn invite only when the ICP Score is at least 70. Skip deferred LinkedIn
|
|
19
|
+
action columns during row verification and show me the skipped/deferred list.
|
|
20
|
+
After single-row verification passes, ask me to choose 2-5 more rows.
|
|
21
|
+
|
|
22
|
+
Expected shape: `LinkedIn URL` -> `Enrich Prospect` -> `ICP Score` -> `Invite`.
|
|
23
|
+
|
|
24
|
+
## 3. AI Column Escape Hatch
|
|
25
|
+
|
|
26
|
+
Build a workflow table that takes a LinkedIn URL and a short research prompt,
|
|
27
|
+
then writes a one-sentence summary of the prospect's latest relevant LinkedIn
|
|
28
|
+
activity using an AI Column. Verify one row, then ask me for 2-5 more rows.
|
|
29
|
+
|
|
30
|
+
Expected shape: `LinkedIn URL` + `Research Prompt` -> `Post Summary`.
|
|
31
|
+
|
|
32
|
+
## Seeded Fault
|
|
33
|
+
|
|
34
|
+
Before committing, intentionally test the validator by changing one blueprint
|
|
35
|
+
column type to `http_requests`. Confirm the validator returns a `phantom_type`
|
|
36
|
+
error and that no columns are committed. Then fix the type to `http_request` and
|
|
37
|
+
continue with commit and verify.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Verify Loop
|
|
2
|
+
|
|
3
|
+
## TOC
|
|
4
|
+
|
|
5
|
+
- [Purpose](#purpose)
|
|
6
|
+
- [Step 1: single-row verify](#step-1-single-row-verify)
|
|
7
|
+
- [Step 2: status interpretation](#step-2-status-interpretation)
|
|
8
|
+
- [Step 3: fix-forward loop](#step-3-fix-forward-loop)
|
|
9
|
+
- [Step 4: Phase gate 3b batch confirmation](#step-4-phase-gate-3b-batch-confirmation)
|
|
10
|
+
- [Skipped columns policy: option (d)](#skipped-columns-policy-option-d)
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Verification proves the committed table graph actually works against rows. A
|
|
15
|
+
successful commit is not enough; it only proves the column shape was accepted.
|
|
16
|
+
|
|
17
|
+
## Step 1: single-row verify
|
|
18
|
+
|
|
19
|
+
Pick a representative row with the required seed inputs. Run:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
sellable:verify_table_row({ "rowId": "ROW_ID", "skipColumnIds": [], "forceRerun": true })
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Use `forceRerun: true` for the first pass unless the user explicitly asks to
|
|
26
|
+
preserve cache behavior.
|
|
27
|
+
|
|
28
|
+
## Step 2: status interpretation
|
|
29
|
+
|
|
30
|
+
Treat these statuses as green for the row-level `ok:true` result:
|
|
31
|
+
|
|
32
|
+
- `success`: the column ran or had a valid completed value.
|
|
33
|
+
- `skipped`: the caller intentionally skipped this column.
|
|
34
|
+
- `deferred_to_sweeper`: the runtime accepted the work and the sweeper owns the long-running part.
|
|
35
|
+
- `condition_not_met`: the production run condition correctly blocked execution.
|
|
36
|
+
|
|
37
|
+
Treat `error` as a fix-forward signal. Inspect the column id, config, and input
|
|
38
|
+
mapping. If the condition was not met, explain the branch to the user instead
|
|
39
|
+
of forcing it to run.
|
|
40
|
+
|
|
41
|
+
## Step 3: fix-forward loop
|
|
42
|
+
|
|
43
|
+
For a failing column:
|
|
44
|
+
|
|
45
|
+
1. Identify whether the issue is config, missing producer data, wrong input key,
|
|
46
|
+
wrong run condition, or an external service error.
|
|
47
|
+
2. Apply the smallest supported column/table change.
|
|
48
|
+
3. Re-run `sellable:verify_table_row` on the same row.
|
|
49
|
+
4. Stop and escalate after 3 failed attempts on the same column.
|
|
50
|
+
|
|
51
|
+
Keep the user-facing update concrete: name the failing column and the precise
|
|
52
|
+
config or dependency being corrected.
|
|
53
|
+
|
|
54
|
+
## Step 4: Phase gate 3b batch confirmation
|
|
55
|
+
|
|
56
|
+
Once the representative row is green, ask the user to pick 2-5 rows for a batch
|
|
57
|
+
confirmation pass. Run verification for every selected row.
|
|
58
|
+
|
|
59
|
+
The skill declares done only when all selected rows return `ok:true`. This
|
|
60
|
+
Phase gate 3b is required. The skill does NOT declare done on single-row green alone.
|
|
61
|
+
|
|
62
|
+
If a batch row fails and the representative row passed, prefer row-specific
|
|
63
|
+
diagnosis first: missing LinkedIn URL, private profile, malformed post URL, no
|
|
64
|
+
message source, or condition not met. Fix table config only when the failure is
|
|
65
|
+
structural across rows.
|
|
66
|
+
|
|
67
|
+
## Skipped columns policy: option (d)
|
|
68
|
+
|
|
69
|
+
Wait and long-timer columns are skipped by passing their ids in
|
|
70
|
+
`skipColumnIds`. This is option (d): caller-supplied skip list.
|
|
71
|
+
|
|
72
|
+
Do not override `runCondition` at runtime. The swap-and-restore pattern is
|
|
73
|
+
brittle, can be interrupted, and changes the very production behavior the
|
|
74
|
+
verify loop is meant to inspect.
|