@awesomate/hosting-mcp 0.12.0 → 0.13.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/dist/index.js +204 -8
- package/package.json +2 -2
- package/skill/awesomate-app-builder/SKILL.md +5 -1
- package/skill/awesomate-credentials/SKILL.md +1 -1
- package/skill/awesomate-hosting/SKILL.md +50 -159
- package/skill/awesomate-hosting/references/connect-troubleshooting.md +77 -0
- package/skill/awesomate-hosting/references/multi-account.md +33 -0
- package/skill/awesomate-hosting/references/rest-fallback.md +30 -0
- package/skill/awesomate-hosting/scripts/bootstrap.mjs +27 -7
- package/skill/awesomate-n8n/SKILL.md +153 -147
- package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +31 -0
- package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +30 -0
- package/skill/awesomate-n8n/evals/build-form-email/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +32 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +35 -0
- package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/graders/grader.md +28 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/vars-not-env/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/vars-not-env/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +3 -0
- package/skill/awesomate-n8n/references/ai-agents.md +135 -0
- package/skill/awesomate-n8n/references/datatables.md +105 -0
- package/skill/awesomate-n8n/references/{node-recipes.md → platform-notes.md} +56 -7
- package/skill/awesomate-n8n/references/possibilities.md +83 -0
- package/skill/awesomate-n8n/references/testing-policy.md +115 -0
- package/skill/awesomate-n8n/references/troubleshooting.md +69 -0
- package/skill/awesomate-n8n/references/upgrade-loop.md +98 -0
- package/skill/awesomate-n8n/references/vendor/MANIFEST.json +26 -0
- package/skill/awesomate-n8n/references/vendor/code-node/BUILTIN_FUNCTIONS.md +779 -0
- package/skill/awesomate-n8n/references/vendor/code-node/COMMON_PATTERNS.md +1123 -0
- package/skill/awesomate-n8n/references/vendor/code-node/DATA_ACCESS.md +797 -0
- package/skill/awesomate-n8n/references/vendor/code-node/ERROR_PATTERNS.md +776 -0
- package/skill/awesomate-n8n/references/vendor/code-node/SKILL.md +703 -0
- package/skill/awesomate-n8n/references/vendor/expressions/COMMON_MISTAKES.md +406 -0
- package/skill/awesomate-n8n/references/vendor/expressions/EXAMPLES.md +496 -0
- package/skill/awesomate-n8n/references/vendor/expressions/SKILL.md +525 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/DEPENDENCIES.md +743 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/OPERATION_PATTERNS.md +926 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/SKILL.md +583 -0
- package/skill/awesomate-n8n/references/vendor/validation/ERROR_CATALOG.md +781 -0
- package/skill/awesomate-n8n/references/vendor/validation/FALSE_POSITIVES.md +695 -0
- package/skill/awesomate-n8n/references/vendor/validation/SKILL.md +414 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/SKILL.md +413 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/ai_agent_workflow.md +797 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/database_operations.md +798 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/http_api_integration.md +747 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/scheduled_tasks.md +786 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/webhook_processing.md +558 -0
|
@@ -0,0 +1,781 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
VENDORED from n8n-builder@d293559 (n8n-validation-expert/ERROR_CATALOG.md) — DO NOT EDIT HERE.
|
|
3
|
+
Edit the source in ~/Projects/n8n-builder, then re-run:
|
|
4
|
+
node mcp/scripts/sync-n8n-references.mjs --write
|
|
5
|
+
|
|
6
|
+
Awesomate platform overrides — where this file conflicts with
|
|
7
|
+
../platform-notes.md, platform-notes wins:
|
|
8
|
+
- $env is BLOCKED fleet-wide → use {{ $vars.key || 'fallback' }}
|
|
9
|
+
- Task runners are ON → no $helpers in Code nodes; use HTTP Request nodes
|
|
10
|
+
- Webhook payloads live at $json.body
|
|
11
|
+
- saveExecutionProgress must stay false
|
|
12
|
+
-->
|
|
13
|
+
|
|
14
|
+
# Error Catalog
|
|
15
|
+
|
|
16
|
+
Comprehensive catalog of n8n configuration errors with real examples and fixes. These are the error shapes you'll see in editor warnings, execution error messages, and when reviewing workflow JSON.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Error Types Overview
|
|
21
|
+
|
|
22
|
+
Common errors by priority:
|
|
23
|
+
|
|
24
|
+
| Error Type | Priority | Severity | Editor Fixes on Save |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| missing_required | Highest | Error | ❌ |
|
|
27
|
+
| invalid_value | High | Error | ❌ |
|
|
28
|
+
| type_mismatch | Medium | Error | ❌ |
|
|
29
|
+
| invalid_expression | Medium | Error | ❌ |
|
|
30
|
+
| invalid_reference | Low | Error | ❌ |
|
|
31
|
+
| operator_structure | Lowest | Warning | ✅ |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Errors (Must Fix)
|
|
36
|
+
|
|
37
|
+
### 1. missing_required
|
|
38
|
+
|
|
39
|
+
**What it means**: Required field is not provided in node configuration
|
|
40
|
+
|
|
41
|
+
**When it occurs**:
|
|
42
|
+
- Creating new nodes without all required fields
|
|
43
|
+
- Copying configurations between different operations
|
|
44
|
+
- Switching operations that have different requirements
|
|
45
|
+
|
|
46
|
+
**Most common configuration error**
|
|
47
|
+
|
|
48
|
+
#### Example 1: Slack Channel Missing
|
|
49
|
+
|
|
50
|
+
**Error**:
|
|
51
|
+
```
|
|
52
|
+
Problem in node 'Slack'
|
|
53
|
+
Channel name is required (parameters.channel)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Broken Configuration**:
|
|
57
|
+
```javascript
|
|
58
|
+
{
|
|
59
|
+
"resource": "message",
|
|
60
|
+
"operation": "post"
|
|
61
|
+
// Missing: channel
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Fix**:
|
|
66
|
+
```javascript
|
|
67
|
+
{
|
|
68
|
+
"resource": "message",
|
|
69
|
+
"operation": "post",
|
|
70
|
+
"channel": "#general" // ✅ Added required field
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**How to identify required fields**: open the node in the editor - required fields are marked and highlighted red when empty. When reviewing JSON, compare against a freshly-added node of the same type.
|
|
75
|
+
|
|
76
|
+
#### Example 2: HTTP Request Missing URL
|
|
77
|
+
|
|
78
|
+
**Error**:
|
|
79
|
+
```
|
|
80
|
+
Problem in node 'HTTP Request'
|
|
81
|
+
URL is required (parameters.url)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Broken Configuration**:
|
|
85
|
+
```javascript
|
|
86
|
+
{
|
|
87
|
+
"method": "GET",
|
|
88
|
+
"authentication": "none"
|
|
89
|
+
// Missing: url
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Fix**:
|
|
94
|
+
```javascript
|
|
95
|
+
{
|
|
96
|
+
"method": "GET",
|
|
97
|
+
"authentication": "none",
|
|
98
|
+
"url": "https://api.example.com/data" // ✅ Added
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### Example 3: Database Query Missing
|
|
103
|
+
|
|
104
|
+
**Error**:
|
|
105
|
+
```
|
|
106
|
+
Problem in node 'Postgres'
|
|
107
|
+
SQL query is required (parameters.query)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Broken Configuration**:
|
|
111
|
+
```javascript
|
|
112
|
+
{
|
|
113
|
+
"operation": "executeQuery"
|
|
114
|
+
// Missing: query
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Fix**:
|
|
119
|
+
```javascript
|
|
120
|
+
{
|
|
121
|
+
"operation": "executeQuery",
|
|
122
|
+
"query": "SELECT * FROM users WHERE active = true" // ✅ Added
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### Example 4: Conditional Fields
|
|
127
|
+
|
|
128
|
+
**Error**:
|
|
129
|
+
```
|
|
130
|
+
Problem in node 'HTTP Request'
|
|
131
|
+
Request body is required when sendBody is true (parameters.body)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Broken Configuration**:
|
|
135
|
+
```javascript
|
|
136
|
+
{
|
|
137
|
+
"method": "POST",
|
|
138
|
+
"url": "https://api.example.com/create",
|
|
139
|
+
"sendBody": true
|
|
140
|
+
// Missing: body (required when sendBody=true)
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Fix**:
|
|
145
|
+
```javascript
|
|
146
|
+
{
|
|
147
|
+
"method": "POST",
|
|
148
|
+
"url": "https://api.example.com/create",
|
|
149
|
+
"sendBody": true,
|
|
150
|
+
"body": {
|
|
151
|
+
"contentType": "json",
|
|
152
|
+
"content": {
|
|
153
|
+
"name": "John",
|
|
154
|
+
"email": "john@example.com"
|
|
155
|
+
}
|
|
156
|
+
} // ✅ Added conditional required field
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
### 2. invalid_value
|
|
163
|
+
|
|
164
|
+
**What it means**: Provided value doesn't match allowed options or format
|
|
165
|
+
|
|
166
|
+
**When it occurs**:
|
|
167
|
+
- Using wrong enum value
|
|
168
|
+
- Typos in operation names
|
|
169
|
+
- Invalid format for specialized fields (emails, URLs, channels)
|
|
170
|
+
|
|
171
|
+
**Second most common error**
|
|
172
|
+
|
|
173
|
+
#### Example 1: Invalid Operation
|
|
174
|
+
|
|
175
|
+
**Error**:
|
|
176
|
+
```
|
|
177
|
+
Operation must be one of: post, update, delete, get
|
|
178
|
+
(current: "send")
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Broken Configuration**:
|
|
182
|
+
```javascript
|
|
183
|
+
{
|
|
184
|
+
"resource": "message",
|
|
185
|
+
"operation": "send" // ❌ Invalid - should be "post"
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Fix**:
|
|
190
|
+
```javascript
|
|
191
|
+
{
|
|
192
|
+
"resource": "message",
|
|
193
|
+
"operation": "post" // ✅ Use valid operation
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### Example 2: Invalid HTTP Method
|
|
198
|
+
|
|
199
|
+
**Error**:
|
|
200
|
+
```
|
|
201
|
+
Method must be one of: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
|
|
202
|
+
(current: "FETCH")
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Broken Configuration**:
|
|
206
|
+
```javascript
|
|
207
|
+
{
|
|
208
|
+
"method": "FETCH", // ❌ Invalid
|
|
209
|
+
"url": "https://api.example.com"
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Fix**:
|
|
214
|
+
```javascript
|
|
215
|
+
{
|
|
216
|
+
"method": "GET", // ✅ Use valid HTTP method
|
|
217
|
+
"url": "https://api.example.com"
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
#### Example 3: Invalid Channel Format
|
|
222
|
+
|
|
223
|
+
**Error**:
|
|
224
|
+
```
|
|
225
|
+
Channel name must start with # and be lowercase (e.g., #general)
|
|
226
|
+
(current: "General")
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Broken Configuration**:
|
|
230
|
+
```javascript
|
|
231
|
+
{
|
|
232
|
+
"resource": "message",
|
|
233
|
+
"operation": "post",
|
|
234
|
+
"channel": "General" // ❌ Wrong format
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Fix**:
|
|
239
|
+
```javascript
|
|
240
|
+
{
|
|
241
|
+
"resource": "message",
|
|
242
|
+
"operation": "post",
|
|
243
|
+
"channel": "#general" // ✅ Correct format
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
#### Example 4: Invalid Enum with Case Sensitivity
|
|
248
|
+
|
|
249
|
+
**Error**:
|
|
250
|
+
```
|
|
251
|
+
Resource must be one of: channel, message, user, file
|
|
252
|
+
(current: "Message")
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Note**: Enums are case-sensitive!
|
|
256
|
+
|
|
257
|
+
**Broken Configuration**:
|
|
258
|
+
```javascript
|
|
259
|
+
{
|
|
260
|
+
"resource": "Message", // ❌ Capital M
|
|
261
|
+
"operation": "post"
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Fix**:
|
|
266
|
+
```javascript
|
|
267
|
+
{
|
|
268
|
+
"resource": "message", // ✅ Lowercase
|
|
269
|
+
"operation": "post"
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
### 3. type_mismatch
|
|
276
|
+
|
|
277
|
+
**What it means**: Value is wrong data type (string instead of number, etc.)
|
|
278
|
+
|
|
279
|
+
**When it occurs**:
|
|
280
|
+
- Hardcoding values that should be numbers
|
|
281
|
+
- Using expressions where literals are expected
|
|
282
|
+
- JSON serialization issues
|
|
283
|
+
|
|
284
|
+
**Common error**
|
|
285
|
+
|
|
286
|
+
#### Example 1: String Instead of Number
|
|
287
|
+
|
|
288
|
+
**Error**:
|
|
289
|
+
```
|
|
290
|
+
Expected number, got string (property: limit, current: "100")
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Broken Configuration**:
|
|
294
|
+
```javascript
|
|
295
|
+
{
|
|
296
|
+
"operation": "executeQuery",
|
|
297
|
+
"query": "SELECT * FROM users",
|
|
298
|
+
"limit": "100" // ❌ String
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Fix**:
|
|
303
|
+
```javascript
|
|
304
|
+
{
|
|
305
|
+
"operation": "executeQuery",
|
|
306
|
+
"query": "SELECT * FROM users",
|
|
307
|
+
"limit": 100 // ✅ Number
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
#### Example 2: Number Instead of String
|
|
312
|
+
|
|
313
|
+
**Error**:
|
|
314
|
+
```
|
|
315
|
+
Expected string, got number (property: channel, current: 12345)
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Broken Configuration**:
|
|
319
|
+
```javascript
|
|
320
|
+
{
|
|
321
|
+
"resource": "message",
|
|
322
|
+
"operation": "post",
|
|
323
|
+
"channel": 12345 // ❌ Number (even if channel ID)
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Fix**:
|
|
328
|
+
```javascript
|
|
329
|
+
{
|
|
330
|
+
"resource": "message",
|
|
331
|
+
"operation": "post",
|
|
332
|
+
"channel": "#general" // ✅ String (channel name, not ID)
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
#### Example 3: Boolean as String
|
|
337
|
+
|
|
338
|
+
**Error**:
|
|
339
|
+
```
|
|
340
|
+
Expected boolean, got string (property: sendHeaders, current: "true")
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
**Broken Configuration**:
|
|
344
|
+
```javascript
|
|
345
|
+
{
|
|
346
|
+
"method": "GET",
|
|
347
|
+
"url": "https://api.example.com",
|
|
348
|
+
"sendHeaders": "true" // ❌ String "true"
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Fix**:
|
|
353
|
+
```javascript
|
|
354
|
+
{
|
|
355
|
+
"method": "GET",
|
|
356
|
+
"url": "https://api.example.com",
|
|
357
|
+
"sendHeaders": true // ✅ Boolean true
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
#### Example 4: Object Instead of Array
|
|
362
|
+
|
|
363
|
+
**Error**:
|
|
364
|
+
```
|
|
365
|
+
Expected array, got object (property: tags, current: {"tag": "important"})
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Broken Configuration**:
|
|
369
|
+
```javascript
|
|
370
|
+
{
|
|
371
|
+
"name": "New Channel",
|
|
372
|
+
"tags": {"tag": "important"} // ❌ Object
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**Fix**:
|
|
377
|
+
```javascript
|
|
378
|
+
{
|
|
379
|
+
"name": "New Channel",
|
|
380
|
+
"tags": ["important", "alerts"] // ✅ Array
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
### 4. invalid_expression
|
|
387
|
+
|
|
388
|
+
**What it means**: n8n expression has syntax errors or invalid references
|
|
389
|
+
|
|
390
|
+
**When it occurs**:
|
|
391
|
+
- Missing `{{}}` around expressions
|
|
392
|
+
- Typos in variable names
|
|
393
|
+
- Referencing non-existent nodes or fields
|
|
394
|
+
- Invalid JavaScript syntax in expressions
|
|
395
|
+
|
|
396
|
+
**Moderately common**
|
|
397
|
+
|
|
398
|
+
**Related**: See **n8n Expression Syntax** skill for comprehensive expression guidance
|
|
399
|
+
|
|
400
|
+
#### Example 1: Missing Curly Braces
|
|
401
|
+
|
|
402
|
+
**Error**:
|
|
403
|
+
```
|
|
404
|
+
Expressions must be wrapped in {{}} (property: text, current: "$json.name")
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Broken Configuration**:
|
|
408
|
+
```javascript
|
|
409
|
+
{
|
|
410
|
+
"resource": "message",
|
|
411
|
+
"operation": "post",
|
|
412
|
+
"channel": "#general",
|
|
413
|
+
"text": "$json.name" // ❌ Missing {{}}
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
**Fix**:
|
|
418
|
+
```javascript
|
|
419
|
+
{
|
|
420
|
+
"resource": "message",
|
|
421
|
+
"operation": "post",
|
|
422
|
+
"channel": "#general",
|
|
423
|
+
"text": "={{$json.name}}" // ✅ Wrapped in {{}}
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
#### Example 2: Invalid Node Reference
|
|
428
|
+
|
|
429
|
+
**Error**:
|
|
430
|
+
```
|
|
431
|
+
Referenced node 'HTTP Requets' does not exist
|
|
432
|
+
(current: "={{$node['HTTP Requets'].json.data}}")
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
**Broken Configuration**:
|
|
436
|
+
```javascript
|
|
437
|
+
{
|
|
438
|
+
"field": "data",
|
|
439
|
+
"value": "={{$node['HTTP Requets'].json.data}}" // ❌ Typo in node name
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
**Fix**:
|
|
444
|
+
```javascript
|
|
445
|
+
{
|
|
446
|
+
"field": "data",
|
|
447
|
+
"value": "={{$node['HTTP Request'].json.data}}" // ✅ Correct node name
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
#### Example 3: Invalid Property Access
|
|
452
|
+
|
|
453
|
+
**Error** (at execution time):
|
|
454
|
+
```
|
|
455
|
+
Cannot access property 'user' of undefined
|
|
456
|
+
(current: "={{$json.data.user.name}}")
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
**Broken Configuration**:
|
|
460
|
+
```javascript
|
|
461
|
+
{
|
|
462
|
+
"text": "={{$json.data.user.name}}" // ❌ Structure doesn't exist
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
**Fix** (with safe navigation):
|
|
467
|
+
```javascript
|
|
468
|
+
{
|
|
469
|
+
"text": "={{$json.data?.user?.name || 'Unknown'}}" // ✅ Safe navigation + fallback
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
#### Example 4: Webhook Data Access Error
|
|
474
|
+
|
|
475
|
+
**Error** (at execution time):
|
|
476
|
+
```
|
|
477
|
+
Property 'email' not found in $json (current: "={{$json.email}}")
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
**Common Gotcha**: Webhook data is under `.body`!
|
|
481
|
+
|
|
482
|
+
**Broken Configuration**:
|
|
483
|
+
```javascript
|
|
484
|
+
{
|
|
485
|
+
"field": "email",
|
|
486
|
+
"value": "={{$json.email}}" // ❌ Missing .body
|
|
487
|
+
}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Fix**:
|
|
491
|
+
```javascript
|
|
492
|
+
{
|
|
493
|
+
"field": "email",
|
|
494
|
+
"value": "={{$json.body.email}}" // ✅ Webhook data under .body
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
500
|
+
### 5. invalid_reference
|
|
501
|
+
|
|
502
|
+
**What it means**: Configuration references a node that doesn't exist in the workflow
|
|
503
|
+
|
|
504
|
+
**When it occurs**:
|
|
505
|
+
- Node was renamed or deleted
|
|
506
|
+
- Typo in node name
|
|
507
|
+
- Copy-pasting from another workflow
|
|
508
|
+
|
|
509
|
+
**Less common error**
|
|
510
|
+
|
|
511
|
+
#### Example 1: Deleted Node Reference
|
|
512
|
+
|
|
513
|
+
**Error**:
|
|
514
|
+
```
|
|
515
|
+
Node 'Transform Data' does not exist in workflow
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**Broken Configuration**:
|
|
519
|
+
```javascript
|
|
520
|
+
{
|
|
521
|
+
"value": "={{$node['Transform Data'].json.result}}" // ❌ Node deleted
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
**Fix**:
|
|
526
|
+
```javascript
|
|
527
|
+
// Option 1: Update to existing node
|
|
528
|
+
{
|
|
529
|
+
"value": "={{$node['Set'].json.result}}"
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// Option 2: Remove expression if not needed
|
|
533
|
+
{
|
|
534
|
+
"value": "default_value"
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
#### Example 2: Connection to Non-Existent Node
|
|
539
|
+
|
|
540
|
+
**Error**:
|
|
541
|
+
```
|
|
542
|
+
Connection references node 'Slack1' which does not exist
|
|
543
|
+
(source: "HTTP Request", target: "Slack1")
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
**Fix**: Remove the stale entry from the workflow JSON's `connections` object, or delete and re-draw the connection in the editor. Connections are keyed by node **name**, so renames outside the editor break them.
|
|
547
|
+
|
|
548
|
+
#### Example 3: Renamed Node Not Updated
|
|
549
|
+
|
|
550
|
+
**Error**:
|
|
551
|
+
```
|
|
552
|
+
Node 'Get Weather' does not exist (did you mean 'Weather API'?)
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
**Broken Configuration**:
|
|
556
|
+
```javascript
|
|
557
|
+
{
|
|
558
|
+
"value": "={{$node['Get Weather'].json.temperature}}" // ❌ Old name
|
|
559
|
+
}
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
**Fix**:
|
|
563
|
+
```javascript
|
|
564
|
+
{
|
|
565
|
+
"value": "={{$node['Weather API'].json.temperature}}" // ✅ Current name
|
|
566
|
+
}
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## Warnings (Should Fix)
|
|
572
|
+
|
|
573
|
+
### 6. best_practice
|
|
574
|
+
|
|
575
|
+
**What it means**: Configuration works but doesn't follow best practices
|
|
576
|
+
|
|
577
|
+
**Severity**: Warning (doesn't block execution)
|
|
578
|
+
|
|
579
|
+
**When acceptable**: Development, testing, simple workflows
|
|
580
|
+
|
|
581
|
+
**When to fix**: Production workflows, critical operations
|
|
582
|
+
|
|
583
|
+
#### Example 1: Missing Error Handling
|
|
584
|
+
|
|
585
|
+
**Warning**: Slack API can have rate limits and connection issues - no error handling configured.
|
|
586
|
+
|
|
587
|
+
**Current Configuration**:
|
|
588
|
+
```javascript
|
|
589
|
+
{
|
|
590
|
+
"resource": "message",
|
|
591
|
+
"operation": "post",
|
|
592
|
+
"channel": "#alerts"
|
|
593
|
+
// No error handling ⚠️
|
|
594
|
+
}
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
**Recommended Fix**:
|
|
598
|
+
```javascript
|
|
599
|
+
{
|
|
600
|
+
"resource": "message",
|
|
601
|
+
"operation": "post",
|
|
602
|
+
"channel": "#alerts",
|
|
603
|
+
"continueOnFail": true,
|
|
604
|
+
"retryOnFail": true,
|
|
605
|
+
"maxTries": 3
|
|
606
|
+
}
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
#### Example 2: No Retry Logic
|
|
610
|
+
|
|
611
|
+
**Warning**: External API calls should retry on failure - add `retryOnFail: true, maxTries: 3, waitBetweenTries: 1000` (in the editor: Settings tab → Retry On Fail).
|
|
612
|
+
|
|
613
|
+
**When to ignore**: Idempotent operations, APIs with their own retry logic
|
|
614
|
+
|
|
615
|
+
**When to fix**: Flaky external services, production automation
|
|
616
|
+
|
|
617
|
+
---
|
|
618
|
+
|
|
619
|
+
### 7. deprecated
|
|
620
|
+
|
|
621
|
+
**What it means**: Using old API version or deprecated feature
|
|
622
|
+
|
|
623
|
+
**Severity**: Warning (still works but may stop working in future)
|
|
624
|
+
|
|
625
|
+
**When to fix**: Always (eventually)
|
|
626
|
+
|
|
627
|
+
#### Example 1: Old typeVersion
|
|
628
|
+
|
|
629
|
+
**Warning**:
|
|
630
|
+
```
|
|
631
|
+
typeVersion 1 is deprecated for Slack node, use version 2
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
**Fix**:
|
|
635
|
+
```javascript
|
|
636
|
+
{
|
|
637
|
+
"type": "n8n-nodes-base.slack",
|
|
638
|
+
"typeVersion": 2, // ✅ Updated
|
|
639
|
+
// May need to update configuration for new version
|
|
640
|
+
}
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
---
|
|
644
|
+
|
|
645
|
+
### 8. performance
|
|
646
|
+
|
|
647
|
+
**What it means**: Configuration may cause performance issues
|
|
648
|
+
|
|
649
|
+
**Severity**: Warning
|
|
650
|
+
|
|
651
|
+
**When to fix**: High-volume workflows, large datasets
|
|
652
|
+
|
|
653
|
+
#### Example 1: Unbounded Query
|
|
654
|
+
|
|
655
|
+
**Warning**: SELECT without LIMIT can return massive datasets - add LIMIT clause or use pagination.
|
|
656
|
+
|
|
657
|
+
**Current**:
|
|
658
|
+
```sql
|
|
659
|
+
SELECT * FROM users WHERE active = true
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
**Fix**:
|
|
663
|
+
```sql
|
|
664
|
+
SELECT * FROM users WHERE active = true LIMIT 1000
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
---
|
|
668
|
+
|
|
669
|
+
## Editor-Normalized Structures
|
|
670
|
+
|
|
671
|
+
### 9. operator_structure
|
|
672
|
+
|
|
673
|
+
**What it means**: IF/Switch operator structure issues
|
|
674
|
+
|
|
675
|
+
**Severity**: Warning
|
|
676
|
+
|
|
677
|
+
**Editor fixes on save**: ✅ YES - the n8n editor normalizes these when the node is saved
|
|
678
|
+
|
|
679
|
+
**Rare** (matters mainly for hand-written JSON before import)
|
|
680
|
+
|
|
681
|
+
#### Normalized: Binary Operators
|
|
682
|
+
|
|
683
|
+
**Wrong** (hand-written JSON):
|
|
684
|
+
```javascript
|
|
685
|
+
{
|
|
686
|
+
"type": "boolean",
|
|
687
|
+
"operation": "equals",
|
|
688
|
+
"singleValue": true // ❌ Wrong for binary operator
|
|
689
|
+
}
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
**Correct**:
|
|
693
|
+
```javascript
|
|
694
|
+
{
|
|
695
|
+
"type": "boolean",
|
|
696
|
+
"operation": "equals"
|
|
697
|
+
// singleValue removed ✅
|
|
698
|
+
}
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
#### Normalized: Unary Operators
|
|
702
|
+
|
|
703
|
+
**Wrong**:
|
|
704
|
+
```javascript
|
|
705
|
+
{
|
|
706
|
+
"type": "boolean",
|
|
707
|
+
"operation": "isEmpty"
|
|
708
|
+
// Missing singleValue ❌
|
|
709
|
+
}
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
**Correct**:
|
|
713
|
+
```javascript
|
|
714
|
+
{
|
|
715
|
+
"type": "boolean",
|
|
716
|
+
"operation": "isEmpty",
|
|
717
|
+
"singleValue": true // ✅ Required
|
|
718
|
+
}
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
**What you should do**: get these right when hand-writing JSON; for workflows built in the editor, opening and re-saving the node normalizes them.
|
|
722
|
+
|
|
723
|
+
---
|
|
724
|
+
|
|
725
|
+
## Recovery Patterns
|
|
726
|
+
|
|
727
|
+
### Pattern 1: Progressive Configuration
|
|
728
|
+
|
|
729
|
+
**Problem**: Too many errors at once
|
|
730
|
+
|
|
731
|
+
**Solution**:
|
|
732
|
+
```javascript
|
|
733
|
+
// Step 1: Minimal valid config - execute to confirm it works
|
|
734
|
+
{
|
|
735
|
+
resource: "message",
|
|
736
|
+
operation: "post",
|
|
737
|
+
channel: "#general",
|
|
738
|
+
text: "Hello"
|
|
739
|
+
}
|
|
740
|
+
// ✅ Runs
|
|
741
|
+
|
|
742
|
+
// Step 2: Add features one by one, re-executing after each
|
|
743
|
+
// + attachments → re-execute
|
|
744
|
+
// + blocks → re-execute
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
### Pattern 2: Error Triage
|
|
748
|
+
|
|
749
|
+
**Problem**: Multiple errors and warnings pasted at once
|
|
750
|
+
|
|
751
|
+
**Solution** - sort into three buckets:
|
|
752
|
+
1. **MUST FIX**: errors that block execution (missing fields, invalid values, broken references)
|
|
753
|
+
2. **SHOULD FIX**: warnings (error handling, retries, deprecation)
|
|
754
|
+
3. **OPTIONAL**: suggestions (optimizations, alternatives)
|
|
755
|
+
|
|
756
|
+
Fix the errors first, one at a time, rechecking between fixes.
|
|
757
|
+
|
|
758
|
+
### Pattern 3: Compare with a Fresh Node
|
|
759
|
+
|
|
760
|
+
**Problem**: Don't know what's required
|
|
761
|
+
|
|
762
|
+
**Solution**: Add a fresh node of the same type in the editor - required fields are marked in the panel, and its exported JSON shows the correct default structure to compare against.
|
|
763
|
+
|
|
764
|
+
---
|
|
765
|
+
|
|
766
|
+
## Summary
|
|
767
|
+
|
|
768
|
+
**Most Common Errors**:
|
|
769
|
+
1. `missing_required` - Check the node panel for marked required fields
|
|
770
|
+
2. `invalid_value` - Check allowed values (case-sensitive)
|
|
771
|
+
3. `type_mismatch` - Use correct data types
|
|
772
|
+
4. `invalid_expression` - Use Expression Syntax skill
|
|
773
|
+
5. `invalid_reference` - Clean stale connections/references
|
|
774
|
+
|
|
775
|
+
**Editor-Normalized**:
|
|
776
|
+
- `operator_structure` - the editor fixes these on save
|
|
777
|
+
|
|
778
|
+
**Related Files**:
|
|
779
|
+
- **[SKILL.md](SKILL.md)** - Main guide
|
|
780
|
+
- **[FALSE_POSITIVES.md](FALSE_POSITIVES.md)** - When to ignore warnings
|
|
781
|
+
- **n8n Expression Syntax** - Fix expression errors
|