@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,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.