bps-kit 1.2.2 → 1.3.1

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 (51) hide show
  1. package/.bps-kit.json +4 -4
  2. package/README.md +3 -0
  3. package/implementation_plan.md.resolved +37 -0
  4. package/package.json +2 -2
  5. package/templates/agents-template/ARCHITECTURE.md +21 -9
  6. package/templates/agents-template/agents/automation-specialist.md +157 -0
  7. package/templates/agents-template/rules/GEMINI.md +2 -10
  8. package/templates/agents-template/workflows/automate.md +153 -0
  9. package/templates/skills_normal/n8n-code-javascript/BUILTIN_FUNCTIONS.md +764 -0
  10. package/templates/skills_normal/n8n-code-javascript/COMMON_PATTERNS.md +1110 -0
  11. package/templates/skills_normal/n8n-code-javascript/DATA_ACCESS.md +782 -0
  12. package/templates/skills_normal/n8n-code-javascript/ERROR_PATTERNS.md +763 -0
  13. package/templates/skills_normal/n8n-code-javascript/README.md +350 -0
  14. package/templates/skills_normal/n8n-code-javascript/SKILL.md +699 -0
  15. package/templates/skills_normal/n8n-code-python/COMMON_PATTERNS.md +794 -0
  16. package/templates/skills_normal/n8n-code-python/DATA_ACCESS.md +702 -0
  17. package/templates/skills_normal/n8n-code-python/ERROR_PATTERNS.md +601 -0
  18. package/templates/skills_normal/n8n-code-python/README.md +386 -0
  19. package/templates/skills_normal/n8n-code-python/SKILL.md +748 -0
  20. package/templates/skills_normal/n8n-code-python/STANDARD_LIBRARY.md +974 -0
  21. package/templates/skills_normal/n8n-expression-syntax/COMMON_MISTAKES.md +393 -0
  22. package/templates/skills_normal/n8n-expression-syntax/EXAMPLES.md +483 -0
  23. package/templates/skills_normal/n8n-expression-syntax/README.md +93 -0
  24. package/templates/skills_normal/n8n-expression-syntax/SKILL.md +516 -0
  25. package/templates/skills_normal/n8n-mcp-tools-expert/README.md +99 -0
  26. package/templates/skills_normal/n8n-mcp-tools-expert/SEARCH_GUIDE.md +374 -0
  27. package/templates/skills_normal/n8n-mcp-tools-expert/SKILL.md +642 -0
  28. package/templates/skills_normal/n8n-mcp-tools-expert/VALIDATION_GUIDE.md +442 -0
  29. package/templates/skills_normal/n8n-mcp-tools-expert/WORKFLOW_GUIDE.md +618 -0
  30. package/templates/skills_normal/n8n-node-configuration/DEPENDENCIES.md +789 -0
  31. package/templates/skills_normal/n8n-node-configuration/OPERATION_PATTERNS.md +913 -0
  32. package/templates/skills_normal/n8n-node-configuration/README.md +364 -0
  33. package/templates/skills_normal/n8n-node-configuration/SKILL.md +785 -0
  34. package/templates/skills_normal/n8n-validation-expert/ERROR_CATALOG.md +943 -0
  35. package/templates/skills_normal/n8n-validation-expert/FALSE_POSITIVES.md +720 -0
  36. package/templates/skills_normal/n8n-validation-expert/README.md +290 -0
  37. package/templates/skills_normal/n8n-validation-expert/SKILL.md +689 -0
  38. package/templates/skills_normal/n8n-workflow-patterns/README.md +251 -0
  39. package/templates/skills_normal/n8n-workflow-patterns/SKILL.md +411 -0
  40. package/templates/skills_normal/n8n-workflow-patterns/ai_agent_workflow.md +784 -0
  41. package/templates/skills_normal/n8n-workflow-patterns/database_operations.md +785 -0
  42. package/templates/skills_normal/n8n-workflow-patterns/http_api_integration.md +734 -0
  43. package/templates/skills_normal/n8n-workflow-patterns/scheduled_tasks.md +773 -0
  44. package/templates/skills_normal/n8n-workflow-patterns/webhook_processing.md +545 -0
  45. package/templates/vault/n8n-code-javascript/SKILL.md +10 -10
  46. package/templates/vault/n8n-code-python/SKILL.md +11 -11
  47. package/templates/vault/n8n-expression-syntax/SKILL.md +4 -4
  48. package/templates/vault/n8n-mcp-tools-expert/SKILL.md +9 -9
  49. package/templates/vault/n8n-node-configuration/SKILL.md +2 -2
  50. package/templates/vault/n8n-validation-expert/SKILL.md +3 -3
  51. package/templates/vault/n8n-workflow-patterns/SKILL.md +11 -11
@@ -0,0 +1,943 @@
1
+ # Error Catalog
2
+
3
+ Comprehensive catalog of n8n validation errors with real examples and fixes.
4
+
5
+ ---
6
+
7
+ ## Error Types Overview
8
+
9
+ Common validation errors by priority:
10
+
11
+ | Error Type | Priority | Severity | Auto-Fix |
12
+ |---|---|---|---|
13
+ | missing_required | Highest | Error | ❌ |
14
+ | invalid_value | High | Error | ❌ |
15
+ | type_mismatch | Medium | Error | ❌ |
16
+ | invalid_expression | Medium | Error | ❌ |
17
+ | invalid_reference | Low | Error | ❌ |
18
+ | operator_structure | Lowest | Warning | ✅ |
19
+
20
+ ---
21
+
22
+ ## Errors (Must Fix)
23
+
24
+ ### 1. missing_required
25
+
26
+ **What it means**: Required field is not provided in node configuration
27
+
28
+ **When it occurs**:
29
+ - Creating new nodes without all required fields
30
+ - Copying configurations between different operations
31
+ - Switching operations that have different requirements
32
+
33
+ **Most common validation error**
34
+
35
+ #### Example 1: Slack Channel Missing
36
+
37
+ **Error**:
38
+ ```json
39
+ {
40
+ "type": "missing_required",
41
+ "property": "channel",
42
+ "message": "Channel name is required",
43
+ "node": "Slack",
44
+ "path": "parameters.channel"
45
+ }
46
+ ```
47
+
48
+ **Broken Configuration**:
49
+ ```javascript
50
+ {
51
+ "resource": "message",
52
+ "operation": "post"
53
+ // Missing: channel
54
+ }
55
+ ```
56
+
57
+ **Fix**:
58
+ ```javascript
59
+ {
60
+ "resource": "message",
61
+ "operation": "post",
62
+ "channel": "#general" // ✅ Added required field
63
+ }
64
+ ```
65
+
66
+ **How to identify required fields**:
67
+ ```javascript
68
+ // Use get_node to see what's required
69
+ const info = get_node({
70
+ nodeType: "nodes-base.slack"
71
+ });
72
+ // Check properties marked as "required": true
73
+ ```
74
+
75
+ #### Example 2: HTTP Request Missing URL
76
+
77
+ **Error**:
78
+ ```json
79
+ {
80
+ "type": "missing_required",
81
+ "property": "url",
82
+ "message": "URL is required for HTTP Request",
83
+ "node": "HTTP Request",
84
+ "path": "parameters.url"
85
+ }
86
+ ```
87
+
88
+ **Broken Configuration**:
89
+ ```javascript
90
+ {
91
+ "method": "GET",
92
+ "authentication": "none"
93
+ // Missing: url
94
+ }
95
+ ```
96
+
97
+ **Fix**:
98
+ ```javascript
99
+ {
100
+ "method": "GET",
101
+ "authentication": "none",
102
+ "url": "https://api.example.com/data" // ✅ Added
103
+ }
104
+ ```
105
+
106
+ #### Example 3: Database Query Missing Connection
107
+
108
+ **Error**:
109
+ ```json
110
+ {
111
+ "type": "missing_required",
112
+ "property": "query",
113
+ "message": "SQL query is required",
114
+ "node": "Postgres",
115
+ "path": "parameters.query"
116
+ }
117
+ ```
118
+
119
+ **Broken Configuration**:
120
+ ```javascript
121
+ {
122
+ "operation": "executeQuery"
123
+ // Missing: query
124
+ }
125
+ ```
126
+
127
+ **Fix**:
128
+ ```javascript
129
+ {
130
+ "operation": "executeQuery",
131
+ "query": "SELECT * FROM users WHERE active = true" // ✅ Added
132
+ }
133
+ ```
134
+
135
+ #### Example 4: Conditional Fields
136
+
137
+ **Error**:
138
+ ```json
139
+ {
140
+ "type": "missing_required",
141
+ "property": "body",
142
+ "message": "Request body is required when sendBody is true",
143
+ "node": "HTTP Request",
144
+ "path": "parameters.body"
145
+ }
146
+ ```
147
+
148
+ **Broken Configuration**:
149
+ ```javascript
150
+ {
151
+ "method": "POST",
152
+ "url": "https://api.example.com/create",
153
+ "sendBody": true
154
+ // Missing: body (required when sendBody=true)
155
+ }
156
+ ```
157
+
158
+ **Fix**:
159
+ ```javascript
160
+ {
161
+ "method": "POST",
162
+ "url": "https://api.example.com/create",
163
+ "sendBody": true,
164
+ "body": {
165
+ "contentType": "json",
166
+ "content": {
167
+ "name": "John",
168
+ "email": "john@example.com"
169
+ }
170
+ } // ✅ Added conditional required field
171
+ }
172
+ ```
173
+
174
+ ---
175
+
176
+ ### 2. invalid_value
177
+
178
+ **What it means**: Provided value doesn't match allowed options or format
179
+
180
+ **When it occurs**:
181
+ - Using wrong enum value
182
+ - Typos in operation names
183
+ - Invalid format for specialized fields (emails, URLs, channels)
184
+
185
+ **Second most common error**
186
+
187
+ #### Example 1: Invalid Operation
188
+
189
+ **Error**:
190
+ ```json
191
+ {
192
+ "type": "invalid_value",
193
+ "property": "operation",
194
+ "message": "Operation must be one of: post, update, delete, get",
195
+ "current": "send",
196
+ "allowed": ["post", "update", "delete", "get"]
197
+ }
198
+ ```
199
+
200
+ **Broken Configuration**:
201
+ ```javascript
202
+ {
203
+ "resource": "message",
204
+ "operation": "send" // ❌ Invalid - should be "post"
205
+ }
206
+ ```
207
+
208
+ **Fix**:
209
+ ```javascript
210
+ {
211
+ "resource": "message",
212
+ "operation": "post" // ✅ Use valid operation
213
+ }
214
+ ```
215
+
216
+ #### Example 2: Invalid HTTP Method
217
+
218
+ **Error**:
219
+ ```json
220
+ {
221
+ "type": "invalid_value",
222
+ "property": "method",
223
+ "message": "Method must be one of: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS",
224
+ "current": "FETCH",
225
+ "allowed": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]
226
+ }
227
+ ```
228
+
229
+ **Broken Configuration**:
230
+ ```javascript
231
+ {
232
+ "method": "FETCH", // ❌ Invalid
233
+ "url": "https://api.example.com"
234
+ }
235
+ ```
236
+
237
+ **Fix**:
238
+ ```javascript
239
+ {
240
+ "method": "GET", // ✅ Use valid HTTP method
241
+ "url": "https://api.example.com"
242
+ }
243
+ ```
244
+
245
+ #### Example 3: Invalid Channel Format
246
+
247
+ **Error**:
248
+ ```json
249
+ {
250
+ "type": "invalid_value",
251
+ "property": "channel",
252
+ "message": "Channel name must start with # and be lowercase (e.g., #general)",
253
+ "current": "General"
254
+ }
255
+ ```
256
+
257
+ **Broken Configuration**:
258
+ ```javascript
259
+ {
260
+ "resource": "message",
261
+ "operation": "post",
262
+ "channel": "General" // ❌ Wrong format
263
+ }
264
+ ```
265
+
266
+ **Fix**:
267
+ ```javascript
268
+ {
269
+ "resource": "message",
270
+ "operation": "post",
271
+ "channel": "#general" // ✅ Correct format
272
+ }
273
+ ```
274
+
275
+ #### Example 4: Invalid Enum with Case Sensitivity
276
+
277
+ **Error**:
278
+ ```json
279
+ {
280
+ "type": "invalid_value",
281
+ "property": "resource",
282
+ "message": "Resource must be one of: channel, message, user, file",
283
+ "current": "Message",
284
+ "allowed": ["channel", "message", "user", "file"]
285
+ }
286
+ ```
287
+
288
+ **Note**: Enums are case-sensitive!
289
+
290
+ **Broken Configuration**:
291
+ ```javascript
292
+ {
293
+ "resource": "Message", // ❌ Capital M
294
+ "operation": "post"
295
+ }
296
+ ```
297
+
298
+ **Fix**:
299
+ ```javascript
300
+ {
301
+ "resource": "message", // ✅ Lowercase
302
+ "operation": "post"
303
+ }
304
+ ```
305
+
306
+ ---
307
+
308
+ ### 3. type_mismatch
309
+
310
+ **What it means**: Value is wrong data type (string instead of number, etc.)
311
+
312
+ **When it occurs**:
313
+ - Hardcoding values that should be numbers
314
+ - Using expressions where literals are expected
315
+ - JSON serialization issues
316
+
317
+ **Common error**
318
+
319
+ #### Example 1: String Instead of Number
320
+
321
+ **Error**:
322
+ ```json
323
+ {
324
+ "type": "type_mismatch",
325
+ "property": "limit",
326
+ "message": "Expected number, got string",
327
+ "expected": "number",
328
+ "current": "100"
329
+ }
330
+ ```
331
+
332
+ **Broken Configuration**:
333
+ ```javascript
334
+ {
335
+ "operation": "executeQuery",
336
+ "query": "SELECT * FROM users",
337
+ "limit": "100" // ❌ String
338
+ }
339
+ ```
340
+
341
+ **Fix**:
342
+ ```javascript
343
+ {
344
+ "operation": "executeQuery",
345
+ "query": "SELECT * FROM users",
346
+ "limit": 100 // ✅ Number
347
+ }
348
+ ```
349
+
350
+ #### Example 2: Number Instead of String
351
+
352
+ **Error**:
353
+ ```json
354
+ {
355
+ "type": "type_mismatch",
356
+ "property": "channel",
357
+ "message": "Expected string, got number",
358
+ "expected": "string",
359
+ "current": 12345
360
+ }
361
+ ```
362
+
363
+ **Broken Configuration**:
364
+ ```javascript
365
+ {
366
+ "resource": "message",
367
+ "operation": "post",
368
+ "channel": 12345 // ❌ Number (even if channel ID)
369
+ }
370
+ ```
371
+
372
+ **Fix**:
373
+ ```javascript
374
+ {
375
+ "resource": "message",
376
+ "operation": "post",
377
+ "channel": "#general" // ✅ String (channel name, not ID)
378
+ }
379
+ ```
380
+
381
+ #### Example 3: Boolean as String
382
+
383
+ **Error**:
384
+ ```json
385
+ {
386
+ "type": "type_mismatch",
387
+ "property": "sendHeaders",
388
+ "message": "Expected boolean, got string",
389
+ "expected": "boolean",
390
+ "current": "true"
391
+ }
392
+ ```
393
+
394
+ **Broken Configuration**:
395
+ ```javascript
396
+ {
397
+ "method": "GET",
398
+ "url": "https://api.example.com",
399
+ "sendHeaders": "true" // ❌ String "true"
400
+ }
401
+ ```
402
+
403
+ **Fix**:
404
+ ```javascript
405
+ {
406
+ "method": "GET",
407
+ "url": "https://api.example.com",
408
+ "sendHeaders": true // ✅ Boolean true
409
+ }
410
+ ```
411
+
412
+ #### Example 4: Object Instead of Array
413
+
414
+ **Error**:
415
+ ```json
416
+ {
417
+ "type": "type_mismatch",
418
+ "property": "tags",
419
+ "message": "Expected array, got object",
420
+ "expected": "array",
421
+ "current": {"tag": "important"}
422
+ }
423
+ ```
424
+
425
+ **Broken Configuration**:
426
+ ```javascript
427
+ {
428
+ "name": "New Channel",
429
+ "tags": {"tag": "important"} // ❌ Object
430
+ }
431
+ ```
432
+
433
+ **Fix**:
434
+ ```javascript
435
+ {
436
+ "name": "New Channel",
437
+ "tags": ["important", "alerts"] // ✅ Array
438
+ }
439
+ ```
440
+
441
+ ---
442
+
443
+ ### 4. invalid_expression
444
+
445
+ **What it means**: n8n expression has syntax errors or invalid references
446
+
447
+ **When it occurs**:
448
+ - Missing `{{}}` around expressions
449
+ - Typos in variable names
450
+ - Referencing non-existent nodes or fields
451
+ - Invalid JavaScript syntax in expressions
452
+
453
+ **Moderately common**
454
+
455
+ **Related**: See **n8n Expression Syntax** skill for comprehensive expression guidance
456
+
457
+ #### Example 1: Missing Curly Braces
458
+
459
+ **Error**:
460
+ ```json
461
+ {
462
+ "type": "invalid_expression",
463
+ "property": "text",
464
+ "message": "Expressions must be wrapped in {{}}",
465
+ "current": "$json.name"
466
+ }
467
+ ```
468
+
469
+ **Broken Configuration**:
470
+ ```javascript
471
+ {
472
+ "resource": "message",
473
+ "operation": "post",
474
+ "channel": "#general",
475
+ "text": "$json.name" // ❌ Missing {{}}
476
+ }
477
+ ```
478
+
479
+ **Fix**:
480
+ ```javascript
481
+ {
482
+ "resource": "message",
483
+ "operation": "post",
484
+ "channel": "#general",
485
+ "text": "={{$json.name}}" // ✅ Wrapped in {{}}
486
+ }
487
+ ```
488
+
489
+ #### Example 2: Invalid Node Reference
490
+
491
+ **Error**:
492
+ ```json
493
+ {
494
+ "type": "invalid_expression",
495
+ "property": "value",
496
+ "message": "Referenced node 'HTTP Requets' does not exist",
497
+ "current": "={{$node['HTTP Requets'].json.data}}"
498
+ }
499
+ ```
500
+
501
+ **Broken Configuration**:
502
+ ```javascript
503
+ {
504
+ "field": "data",
505
+ "value": "={{$node['HTTP Requets'].json.data}}" // ❌ Typo in node name
506
+ }
507
+ ```
508
+
509
+ **Fix**:
510
+ ```javascript
511
+ {
512
+ "field": "data",
513
+ "value": "={{$node['HTTP Request'].json.data}}" // ✅ Correct node name
514
+ }
515
+ ```
516
+
517
+ #### Example 3: Invalid Property Access
518
+
519
+ **Error**:
520
+ ```json
521
+ {
522
+ "type": "invalid_expression",
523
+ "property": "text",
524
+ "message": "Cannot access property 'user' of undefined",
525
+ "current": "={{$json.data.user.name}}"
526
+ }
527
+ ```
528
+
529
+ **Broken Configuration**:
530
+ ```javascript
531
+ {
532
+ "text": "={{$json.data.user.name}}" // ❌ Structure doesn't exist
533
+ }
534
+ ```
535
+
536
+ **Fix** (with safe navigation):
537
+ ```javascript
538
+ {
539
+ "text": "={{$json.data?.user?.name || 'Unknown'}}" // ✅ Safe navigation + fallback
540
+ }
541
+ ```
542
+
543
+ #### Example 4: Webhook Data Access Error
544
+
545
+ **Error**:
546
+ ```json
547
+ {
548
+ "type": "invalid_expression",
549
+ "property": "value",
550
+ "message": "Property 'email' not found in $json",
551
+ "current": "={{$json.email}}"
552
+ }
553
+ ```
554
+
555
+ **Common Gotcha**: Webhook data is under `.body`!
556
+
557
+ **Broken Configuration**:
558
+ ```javascript
559
+ {
560
+ "field": "email",
561
+ "value": "={{$json.email}}" // ❌ Missing .body
562
+ }
563
+ ```
564
+
565
+ **Fix**:
566
+ ```javascript
567
+ {
568
+ "field": "email",
569
+ "value": "={{$json.body.email}}" // ✅ Webhook data under .body
570
+ }
571
+ ```
572
+
573
+ ---
574
+
575
+ ### 5. invalid_reference
576
+
577
+ **What it means**: Configuration references a node that doesn't exist in the workflow
578
+
579
+ **When it occurs**:
580
+ - Node was renamed or deleted
581
+ - Typo in node name
582
+ - Copy-pasting from another workflow
583
+
584
+ **Less common error**
585
+
586
+ #### Example 1: Deleted Node Reference
587
+
588
+ **Error**:
589
+ ```json
590
+ {
591
+ "type": "invalid_reference",
592
+ "property": "expression",
593
+ "message": "Node 'Transform Data' does not exist in workflow",
594
+ "referenced_node": "Transform Data"
595
+ }
596
+ ```
597
+
598
+ **Broken Configuration**:
599
+ ```javascript
600
+ {
601
+ "value": "={{$node['Transform Data'].json.result}}" // ❌ Node deleted
602
+ }
603
+ ```
604
+
605
+ **Fix**:
606
+ ```javascript
607
+ // Option 1: Update to existing node
608
+ {
609
+ "value": "={{$node['Set'].json.result}}"
610
+ }
611
+
612
+ // Option 2: Remove expression if not needed
613
+ {
614
+ "value": "default_value"
615
+ }
616
+ ```
617
+
618
+ #### Example 2: Connection to Non-Existent Node
619
+
620
+ **Error**:
621
+ ```json
622
+ {
623
+ "type": "invalid_reference",
624
+ "message": "Connection references node 'Slack1' which does not exist",
625
+ "source": "HTTP Request",
626
+ "target": "Slack1"
627
+ }
628
+ ```
629
+
630
+ **Fix**: Use `cleanStaleConnections` operation:
631
+ ```javascript
632
+ n8n_update_partial_workflow({
633
+ id: "workflow-id",
634
+ operations: [{
635
+ type: "cleanStaleConnections"
636
+ }]
637
+ })
638
+ ```
639
+
640
+ #### Example 3: Renamed Node Not Updated
641
+
642
+ **Error**:
643
+ ```json
644
+ {
645
+ "type": "invalid_reference",
646
+ "property": "expression",
647
+ "message": "Node 'Get Weather' does not exist (did you mean 'Weather API'?)",
648
+ "referenced_node": "Get Weather",
649
+ "suggestions": ["Weather API"]
650
+ }
651
+ ```
652
+
653
+ **Broken Configuration**:
654
+ ```javascript
655
+ {
656
+ "value": "={{$node['Get Weather'].json.temperature}}" // ❌ Old name
657
+ }
658
+ ```
659
+
660
+ **Fix**:
661
+ ```javascript
662
+ {
663
+ "value": "={{$node['Weather API'].json.temperature}}" // ✅ Current name
664
+ }
665
+ ```
666
+
667
+ ---
668
+
669
+ ## Warnings (Should Fix)
670
+
671
+ ### 6. best_practice
672
+
673
+ **What it means**: Configuration works but doesn't follow best practices
674
+
675
+ **Severity**: Warning (doesn't block execution)
676
+
677
+ **When acceptable**: Development, testing, simple workflows
678
+
679
+ **When to fix**: Production workflows, critical operations
680
+
681
+ #### Example 1: Missing Error Handling
682
+
683
+ **Warning**:
684
+ ```json
685
+ {
686
+ "type": "best_practice",
687
+ "property": "onError",
688
+ "message": "Slack API can have rate limits and connection issues",
689
+ "suggestion": "Add error handling: onError: 'continueRegularOutput'"
690
+ }
691
+ ```
692
+
693
+ **Current Configuration**:
694
+ ```javascript
695
+ {
696
+ "resource": "message",
697
+ "operation": "post",
698
+ "channel": "#alerts"
699
+ // No error handling ⚠️
700
+ }
701
+ ```
702
+
703
+ **Recommended Fix**:
704
+ ```javascript
705
+ {
706
+ "resource": "message",
707
+ "operation": "post",
708
+ "channel": "#alerts",
709
+ "continueOnFail": true,
710
+ "retryOnFail": true,
711
+ "maxTries": 3
712
+ }
713
+ ```
714
+
715
+ #### Example 2: No Retry Logic
716
+
717
+ **Warning**:
718
+ ```json
719
+ {
720
+ "type": "best_practice",
721
+ "property": "retryOnFail",
722
+ "message": "External API calls should retry on failure",
723
+ "suggestion": "Add retryOnFail: true, maxTries: 3, waitBetweenTries: 1000"
724
+ }
725
+ ```
726
+
727
+ **When to ignore**: Idempotent operations, APIs with their own retry logic
728
+
729
+ **When to fix**: Flaky external services, production automation
730
+
731
+ ---
732
+
733
+ ### 7. deprecated
734
+
735
+ **What it means**: Using old API version or deprecated feature
736
+
737
+ **Severity**: Warning (still works but may stop working in future)
738
+
739
+ **When to fix**: Always (eventually)
740
+
741
+ #### Example 1: Old typeVersion
742
+
743
+ **Warning**:
744
+ ```json
745
+ {
746
+ "type": "deprecated",
747
+ "property": "typeVersion",
748
+ "message": "typeVersion 1 is deprecated for Slack node, use version 2",
749
+ "current": 1,
750
+ "recommended": 2
751
+ }
752
+ ```
753
+
754
+ **Fix**:
755
+ ```javascript
756
+ {
757
+ "type": "n8n-nodes-base.slack",
758
+ "typeVersion": 2, // ✅ Updated
759
+ // May need to update configuration for new version
760
+ }
761
+ ```
762
+
763
+ ---
764
+
765
+ ### 8. performance
766
+
767
+ **What it means**: Configuration may cause performance issues
768
+
769
+ **Severity**: Warning
770
+
771
+ **When to fix**: High-volume workflows, large datasets
772
+
773
+ #### Example 1: Unbounded Query
774
+
775
+ **Warning**:
776
+ ```json
777
+ {
778
+ "type": "performance",
779
+ "property": "query",
780
+ "message": "SELECT without LIMIT can return massive datasets",
781
+ "suggestion": "Add LIMIT clause or use pagination"
782
+ }
783
+ ```
784
+
785
+ **Current**:
786
+ ```sql
787
+ SELECT * FROM users WHERE active = true
788
+ ```
789
+
790
+ **Fix**:
791
+ ```sql
792
+ SELECT * FROM users WHERE active = true LIMIT 1000
793
+ ```
794
+
795
+ ---
796
+
797
+ ## Auto-Sanitization Fixes
798
+
799
+ ### 9. operator_structure
800
+
801
+ **What it means**: IF/Switch operator structure issues
802
+
803
+ **Severity**: Warning
804
+
805
+ **Auto-Fix**: ✅ YES - Fixed automatically on workflow save
806
+
807
+ **Rare** (mostly auto-fixed)
808
+
809
+ #### Fixed Automatically: Binary Operators
810
+
811
+ **Before** (you create this):
812
+ ```javascript
813
+ {
814
+ "type": "boolean",
815
+ "operation": "equals",
816
+ "singleValue": true // ❌ Wrong for binary operator
817
+ }
818
+ ```
819
+
820
+ **After** (auto-sanitization fixes it):
821
+ ```javascript
822
+ {
823
+ "type": "boolean",
824
+ "operation": "equals"
825
+ // singleValue removed ✅
826
+ }
827
+ ```
828
+
829
+ **You don't need to do anything** - this is fixed on save!
830
+
831
+ #### Fixed Automatically: Unary Operators
832
+
833
+ **Before**:
834
+ ```javascript
835
+ {
836
+ "type": "boolean",
837
+ "operation": "isEmpty"
838
+ // Missing singleValue ❌
839
+ }
840
+ ```
841
+
842
+ **After**:
843
+ ```javascript
844
+ {
845
+ "type": "boolean",
846
+ "operation": "isEmpty",
847
+ "singleValue": true // ✅ Added automatically
848
+ }
849
+ ```
850
+
851
+ **What you should do**: Trust auto-sanitization, don't manually fix these!
852
+
853
+ ---
854
+
855
+ ## Recovery Patterns
856
+
857
+ ### Pattern 1: Progressive Validation
858
+
859
+ **Problem**: Too many errors at once
860
+
861
+ **Solution**:
862
+ ```javascript
863
+ // Step 1: Minimal valid config
864
+ let config = {
865
+ resource: "message",
866
+ operation: "post",
867
+ channel: "#general",
868
+ text: "Hello"
869
+ };
870
+
871
+ validate_node({nodeType: "nodes-base.slack", config, profile: "runtime"});
872
+ // ✅ Valid
873
+
874
+ // Step 2: Add features one by one
875
+ config.attachments = [...];
876
+ validate_node({nodeType: "nodes-base.slack", config, profile: "runtime"});
877
+
878
+ config.blocks = [...];
879
+ validate_node({nodeType: "nodes-base.slack", config, profile: "runtime"});
880
+ ```
881
+
882
+ ### Pattern 2: Error Triage
883
+
884
+ **Problem**: Multiple errors
885
+
886
+ **Solution**:
887
+ ```javascript
888
+ const result = validate_node_operation({...});
889
+
890
+ // 1. Fix errors (must fix)
891
+ result.errors.forEach(error => {
892
+ console.log(`MUST FIX: ${error.property} - ${error.message}`);
893
+ });
894
+
895
+ // 2. Review warnings (should fix)
896
+ result.warnings.forEach(warning => {
897
+ console.log(`SHOULD FIX: ${warning.property} - ${warning.message}`);
898
+ });
899
+
900
+ // 3. Consider suggestions (optional)
901
+ result.suggestions.forEach(sug => {
902
+ console.log(`OPTIONAL: ${sug.message}`);
903
+ });
904
+ ```
905
+
906
+ ### Pattern 3: Use get_node
907
+
908
+ **Problem**: Don't know what's required
909
+
910
+ **Solution**:
911
+ ```javascript
912
+ // Before configuring, check requirements
913
+ const info = get_node({
914
+ nodeType: "nodes-base.slack"
915
+ });
916
+
917
+ // Look for required fields
918
+ info.properties.forEach(prop => {
919
+ if (prop.required) {
920
+ console.log(`Required: ${prop.name} (${prop.type})`);
921
+ }
922
+ });
923
+ ```
924
+
925
+ ---
926
+
927
+ ## Summary
928
+
929
+ **Most Common Errors**:
930
+ 1. `missing_required` (45%) - Always check get_node
931
+ 2. `invalid_value` (28%) - Check allowed values
932
+ 3. `type_mismatch` (12%) - Use correct data types
933
+ 4. `invalid_expression` (8%) - Use Expression Syntax skill
934
+ 5. `invalid_reference` (5%) - Clean stale connections
935
+
936
+ **Auto-Fixed**:
937
+ - `operator_structure` - Trust auto-sanitization!
938
+
939
+ **Related Skills**:
940
+ - **[SKILL.md](SKILL.md)** - Main validation guide
941
+ - **[FALSE_POSITIVES.md](FALSE_POSITIVES.md)** - When to ignore warnings
942
+ - **n8n Expression Syntax** - Fix expression errors
943
+ - **n8n MCP Tools Expert** - Use validation tools correctly