@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.
Files changed (58) hide show
  1. package/dist/index.js +204 -8
  2. package/package.json +2 -2
  3. package/skill/awesomate-app-builder/SKILL.md +5 -1
  4. package/skill/awesomate-credentials/SKILL.md +1 -1
  5. package/skill/awesomate-hosting/SKILL.md +50 -159
  6. package/skill/awesomate-hosting/references/connect-troubleshooting.md +77 -0
  7. package/skill/awesomate-hosting/references/multi-account.md +33 -0
  8. package/skill/awesomate-hosting/references/rest-fallback.md +30 -0
  9. package/skill/awesomate-hosting/scripts/bootstrap.mjs +27 -7
  10. package/skill/awesomate-n8n/SKILL.md +153 -147
  11. package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +31 -0
  12. package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +1 -0
  13. package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +30 -0
  14. package/skill/awesomate-n8n/evals/build-form-email/prompt.md +1 -0
  15. package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +32 -0
  16. package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +2 -0
  17. package/skill/awesomate-n8n/evals/diagnose-failure/graders/grader.md +27 -0
  18. package/skill/awesomate-n8n/evals/diagnose-failure/prompt.md +2 -0
  19. package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +27 -0
  20. package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +2 -0
  21. package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +35 -0
  22. package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +2 -0
  23. package/skill/awesomate-n8n/evals/possibilities-grounded/graders/grader.md +28 -0
  24. package/skill/awesomate-n8n/evals/possibilities-grounded/prompt.md +1 -0
  25. package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +27 -0
  26. package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +2 -0
  27. package/skill/awesomate-n8n/evals/vars-not-env/graders/grader.md +26 -0
  28. package/skill/awesomate-n8n/evals/vars-not-env/prompt.md +2 -0
  29. package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +26 -0
  30. package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +3 -0
  31. package/skill/awesomate-n8n/references/ai-agents.md +135 -0
  32. package/skill/awesomate-n8n/references/datatables.md +105 -0
  33. package/skill/awesomate-n8n/references/{node-recipes.md → platform-notes.md} +56 -7
  34. package/skill/awesomate-n8n/references/possibilities.md +83 -0
  35. package/skill/awesomate-n8n/references/testing-policy.md +115 -0
  36. package/skill/awesomate-n8n/references/troubleshooting.md +69 -0
  37. package/skill/awesomate-n8n/references/upgrade-loop.md +98 -0
  38. package/skill/awesomate-n8n/references/vendor/MANIFEST.json +26 -0
  39. package/skill/awesomate-n8n/references/vendor/code-node/BUILTIN_FUNCTIONS.md +779 -0
  40. package/skill/awesomate-n8n/references/vendor/code-node/COMMON_PATTERNS.md +1123 -0
  41. package/skill/awesomate-n8n/references/vendor/code-node/DATA_ACCESS.md +797 -0
  42. package/skill/awesomate-n8n/references/vendor/code-node/ERROR_PATTERNS.md +776 -0
  43. package/skill/awesomate-n8n/references/vendor/code-node/SKILL.md +703 -0
  44. package/skill/awesomate-n8n/references/vendor/expressions/COMMON_MISTAKES.md +406 -0
  45. package/skill/awesomate-n8n/references/vendor/expressions/EXAMPLES.md +496 -0
  46. package/skill/awesomate-n8n/references/vendor/expressions/SKILL.md +525 -0
  47. package/skill/awesomate-n8n/references/vendor/node-configuration/DEPENDENCIES.md +743 -0
  48. package/skill/awesomate-n8n/references/vendor/node-configuration/OPERATION_PATTERNS.md +926 -0
  49. package/skill/awesomate-n8n/references/vendor/node-configuration/SKILL.md +583 -0
  50. package/skill/awesomate-n8n/references/vendor/validation/ERROR_CATALOG.md +781 -0
  51. package/skill/awesomate-n8n/references/vendor/validation/FALSE_POSITIVES.md +695 -0
  52. package/skill/awesomate-n8n/references/vendor/validation/SKILL.md +414 -0
  53. package/skill/awesomate-n8n/references/vendor/workflow-patterns/SKILL.md +413 -0
  54. package/skill/awesomate-n8n/references/vendor/workflow-patterns/ai_agent_workflow.md +797 -0
  55. package/skill/awesomate-n8n/references/vendor/workflow-patterns/database_operations.md +798 -0
  56. package/skill/awesomate-n8n/references/vendor/workflow-patterns/http_api_integration.md +747 -0
  57. package/skill/awesomate-n8n/references/vendor/workflow-patterns/scheduled_tasks.md +786 -0
  58. 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