@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,695 @@
1
+ <!--
2
+ VENDORED from n8n-builder@d293559 (n8n-validation-expert/FALSE_POSITIVES.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
+ # False Positives Guide
15
+
16
+ When n8n warnings are acceptable and how to handle them.
17
+
18
+ ---
19
+
20
+ ## What Are False Positives?
21
+
22
+ **Definition**: Warnings that are technically "issues" but acceptable - or plain incorrect - in your specific use case.
23
+
24
+ **Key insight**: Not all warnings need to be fixed!
25
+
26
+ Many warnings are context-dependent: a large share of them are acceptable in specific use cases, and some are simply wrong about your workflow.
27
+
28
+ ---
29
+
30
+ ## Philosophy
31
+
32
+ ### ✅ Good Practice
33
+ ```
34
+ 1. Read every warning in the editor / review output
35
+ 2. Fix all ERRORS
36
+ 3. Review each WARNING
37
+ 4. Decide if acceptable for your use case
38
+ 5. Document why you accepted it
39
+ 6. Activate with confidence
40
+ ```
41
+
42
+ ### ❌ Bad Practice
43
+ ```
44
+ 1. Ignore all warnings blindly
45
+ 2. Skip the review entirely to avoid warnings
46
+ 3. Activate without understanding risks
47
+ ```
48
+
49
+ ---
50
+
51
+ ## Structural False Positives
52
+
53
+ These aren't judgment calls - the warning itself is wrong about your workflow.
54
+
55
+ ### A. Community/Custom Nodes Reported as Unknown
56
+
57
+ **Warning**:
58
+ ```
59
+ Unknown node type: n8n-nodes-zernio.late
60
+ ```
61
+
62
+ **Status**: False positive when the target instance has the community package installed
63
+
64
+ **Why it occurs**: Community and custom nodes (`CUSTOM.*`, `n8n-nodes-*`) can't be recognized outside the instance that has them - reviewing exported JSON elsewhere flags them as unknown.
65
+
66
+ **What to do**: Confirm the package is installed on the target instance; if so, ignore. Only treat as an error if the node type is a typo or the package is genuinely missing.
67
+
68
+ ### B. Cycle-Based Polling Flagged as Circular Dependency
69
+
70
+ **Warning**:
71
+ ```
72
+ Circular dependency detected: Check Status → Wait → Check Status
73
+ ```
74
+
75
+ **Status**: False positive for intentional polling loops
76
+
77
+ **Why it occurs**: Structural review flags any cycle, but loop-back polling (Wait → check status → IF not done → loop back) is a legitimate pattern.
78
+
79
+ **What to do**: Ignore if the loop has a clear exit condition (IF branch that leaves the loop, max-attempts counter). Fix only if there's no way out of the cycle.
80
+
81
+ ---
82
+
83
+ ## Common Context-Dependent Warnings
84
+
85
+ ### 1. Missing Error Handling
86
+
87
+ **Warning**:
88
+ ```
89
+ No error handling configured
90
+ Suggestion: Add continueOnFail: true and retryOnFail: true
91
+ ```
92
+
93
+ #### When Acceptable
94
+
95
+ **✅ Development/Testing Workflows**
96
+ ```javascript
97
+ // Testing workflow - failures are obvious
98
+ {
99
+ "name": "Test Slack Integration",
100
+ "nodes": [{
101
+ "type": "n8n-nodes-base.slack",
102
+ "parameters": {
103
+ "resource": "message",
104
+ "operation": "post",
105
+ "channel": "#test"
106
+ // No error handling - OK for testing
107
+ }
108
+ }]
109
+ }
110
+ ```
111
+
112
+ **Reasoning**: You WANT to see failures during testing.
113
+
114
+ **✅ Non-Critical Notifications**
115
+ ```javascript
116
+ // Nice-to-have notification
117
+ {
118
+ "name": "Optional Slack Notification",
119
+ "parameters": {
120
+ "channel": "#general",
121
+ "text": "FYI: Process completed"
122
+ // If this fails, no big deal
123
+ }
124
+ }
125
+ ```
126
+
127
+ **Reasoning**: Notification failure doesn't affect core functionality.
128
+
129
+ **✅ Manual Trigger Workflows**
130
+ ```javascript
131
+ // Manual workflow - user is watching
132
+ {
133
+ "nodes": [{
134
+ "type": "n8n-nodes-base.webhook",
135
+ "parameters": {
136
+ "path": "manual-test"
137
+ // No error handling - user will retry manually
138
+ }
139
+ }]
140
+ }
141
+ ```
142
+
143
+ **Reasoning**: User is present to see and handle errors.
144
+
145
+ #### When to Fix
146
+
147
+ **❌ Production Automation**
148
+ ```javascript
149
+ // BAD: Critical workflow without error handling
150
+ {
151
+ "name": "Process Customer Orders",
152
+ "nodes": [{
153
+ "type": "n8n-nodes-base.postgres",
154
+ "parameters": {
155
+ "query": "INSERT INTO orders..."
156
+ // ❌ Should have error handling!
157
+ }
158
+ }]
159
+ }
160
+ ```
161
+
162
+ **Fix**:
163
+ ```javascript
164
+ {
165
+ "parameters": {
166
+ "query": "INSERT INTO orders...",
167
+ "continueOnFail": true,
168
+ "retryOnFail": true,
169
+ "maxTries": 3,
170
+ "waitBetweenTries": 1000
171
+ }
172
+ }
173
+ ```
174
+
175
+ **❌ Critical Integrations**
176
+ ```javascript
177
+ // BAD: Payment processing without error handling
178
+ {
179
+ "name": "Process Payment",
180
+ "type": "n8n-nodes-base.stripe"
181
+ // ❌ Payment failures MUST be handled!
182
+ }
183
+ ```
184
+
185
+ ---
186
+
187
+ ### 2. No Retry Logic
188
+
189
+ **Warning**:
190
+ ```
191
+ External API calls should retry on failure
192
+ Suggestion: Add retryOnFail: true with exponential backoff
193
+ ```
194
+
195
+ #### When Acceptable
196
+
197
+ **✅ APIs with Built-in Retry**
198
+ ```javascript
199
+ // Stripe has its own retry mechanism
200
+ {
201
+ "type": "n8n-nodes-base.stripe",
202
+ "parameters": {
203
+ "resource": "charge",
204
+ "operation": "create"
205
+ // Stripe SDK retries automatically
206
+ }
207
+ }
208
+ ```
209
+
210
+ **✅ Idempotent Operations**
211
+ ```javascript
212
+ // GET request - safe to retry manually if needed
213
+ {
214
+ "method": "GET",
215
+ "url": "https://api.example.com/status"
216
+ // Read-only, no side effects
217
+ }
218
+ ```
219
+
220
+ **✅ Local/Internal Services**
221
+ ```javascript
222
+ // Internal API with high reliability
223
+ {
224
+ "url": "http://localhost:3000/process"
225
+ // Local service, failures are rare and obvious
226
+ }
227
+ ```
228
+
229
+ #### When to Fix
230
+
231
+ **❌ Flaky External APIs**
232
+ ```javascript
233
+ // BAD: Known unreliable API without retries
234
+ {
235
+ "url": "https://unreliable-api.com/data"
236
+ // ❌ Should retry!
237
+ }
238
+
239
+ // GOOD:
240
+ {
241
+ "url": "https://unreliable-api.com/data",
242
+ "retryOnFail": true,
243
+ "maxTries": 3,
244
+ "waitBetweenTries": 2000
245
+ }
246
+ ```
247
+
248
+ **❌ Non-Idempotent Operations**
249
+ ```javascript
250
+ // BAD: POST without retry - may lose data
251
+ {
252
+ "method": "POST",
253
+ "url": "https://api.example.com/create"
254
+ // ❌ Could timeout and lose data
255
+ }
256
+ ```
257
+
258
+ ---
259
+
260
+ ### 3. Missing Rate Limiting
261
+
262
+ **Warning**:
263
+ ```
264
+ API may have rate limits
265
+ Suggestion: Add rate limiting or batch requests
266
+ ```
267
+
268
+ #### When Acceptable
269
+
270
+ **✅ Internal APIs**
271
+ ```javascript
272
+ // Internal microservice - no rate limits
273
+ {
274
+ "url": "http://internal-api/process"
275
+ // Company controls both ends
276
+ }
277
+ ```
278
+
279
+ **✅ Low-Volume Workflows**
280
+ ```javascript
281
+ // Runs once per day
282
+ {
283
+ "trigger": {
284
+ "type": "n8n-nodes-base.cron",
285
+ "parameters": {
286
+ "mode": "everyDay",
287
+ "hour": 9
288
+ }
289
+ },
290
+ "nodes": [{
291
+ "type": "n8n-nodes-base.httpRequest",
292
+ "parameters": {
293
+ "url": "https://api.example.com/daily-report"
294
+ // Once per day = no rate limit concerns
295
+ }
296
+ }]
297
+ }
298
+ ```
299
+
300
+ **✅ APIs with Server-Side Limits**
301
+ ```javascript
302
+ // API returns 429 and n8n handles it
303
+ {
304
+ "url": "https://api.example.com/data",
305
+ "options": {
306
+ "response": {
307
+ "response": {
308
+ "neverError": false // Will error on 429
309
+ }
310
+ }
311
+ },
312
+ "retryOnFail": true // Retry on 429
313
+ }
314
+ ```
315
+
316
+ #### When to Fix
317
+
318
+ **❌ High-Volume Public APIs**
319
+ ```javascript
320
+ // BAD: Loop hitting rate-limited API
321
+ {
322
+ "nodes": [{
323
+ "type": "n8n-nodes-base.splitInBatches",
324
+ "parameters": {
325
+ "batchSize": 100
326
+ }
327
+ }, {
328
+ "type": "n8n-nodes-base.httpRequest",
329
+ "parameters": {
330
+ "url": "https://api.github.com/..."
331
+ // ❌ GitHub has strict rate limits!
332
+ }
333
+ }]
334
+ }
335
+
336
+ // GOOD: Add rate limiting
337
+ {
338
+ "type": "n8n-nodes-base.httpRequest",
339
+ "parameters": {
340
+ "url": "https://api.github.com/...",
341
+ "options": {
342
+ "batching": {
343
+ "batch": {
344
+ "batchSize": 10,
345
+ "batchInterval": 1000 // 1 second between batches
346
+ }
347
+ }
348
+ }
349
+ }
350
+ }
351
+ ```
352
+
353
+ ---
354
+
355
+ ### 4. Unbounded Database Queries
356
+
357
+ **Warning**:
358
+ ```
359
+ SELECT without LIMIT can return massive datasets
360
+ Suggestion: Add LIMIT clause or use pagination
361
+ ```
362
+
363
+ #### When Acceptable
364
+
365
+ **✅ Small Known Datasets**
366
+ ```javascript
367
+ // Config table with ~10 rows
368
+ {
369
+ "query": "SELECT * FROM app_config"
370
+ // Known to be small, no LIMIT needed
371
+ }
372
+ ```
373
+
374
+ **✅ Aggregation Queries**
375
+ ```javascript
376
+ // COUNT/SUM operations
377
+ {
378
+ "query": "SELECT COUNT(*) as total FROM users WHERE active = true"
379
+ // Aggregation, not returning rows
380
+ }
381
+ ```
382
+
383
+ **✅ Development/Testing**
384
+ ```javascript
385
+ // Testing with small dataset
386
+ {
387
+ "query": "SELECT * FROM test_users"
388
+ // Test database has 5 rows
389
+ }
390
+ ```
391
+
392
+ #### When to Fix
393
+
394
+ **❌ Production Queries on Large Tables**
395
+ ```javascript
396
+ // BAD: User table could have millions of rows
397
+ {
398
+ "query": "SELECT * FROM users"
399
+ // ❌ Could return millions of rows!
400
+ }
401
+
402
+ // GOOD: Add LIMIT
403
+ {
404
+ "query": "SELECT * FROM users LIMIT 1000"
405
+ }
406
+
407
+ // BETTER: Use pagination
408
+ {
409
+ "query": "SELECT * FROM users WHERE id > {{$json.lastId}} LIMIT 1000"
410
+ }
411
+ ```
412
+
413
+ ---
414
+
415
+ ### 5. Missing Input Validation
416
+
417
+ **Warning**:
418
+ ```
419
+ Webhook doesn't validate input data
420
+ Suggestion: Add IF node to validate required fields
421
+ ```
422
+
423
+ #### When Acceptable
424
+
425
+ **✅ Internal Webhooks**
426
+ ```javascript
427
+ // Webhook from your own backend
428
+ {
429
+ "type": "n8n-nodes-base.webhook",
430
+ "parameters": {
431
+ "path": "internal-trigger"
432
+ // Your backend already validates
433
+ }
434
+ }
435
+ ```
436
+
437
+ **✅ Trusted Sources**
438
+ ```javascript
439
+ // Webhook from Stripe (cryptographically signed)
440
+ {
441
+ "type": "n8n-nodes-base.webhook",
442
+ "parameters": {
443
+ "path": "stripe-webhook",
444
+ "authentication": "headerAuth"
445
+ // Stripe signature validates authenticity
446
+ }
447
+ }
448
+ ```
449
+
450
+ #### When to Fix
451
+
452
+ **❌ Public Webhooks**
453
+ ```javascript
454
+ // BAD: Public webhook without validation
455
+ {
456
+ "type": "n8n-nodes-base.webhook",
457
+ "parameters": {
458
+ "path": "public-form-submit"
459
+ // ❌ Anyone can send anything!
460
+ }
461
+ }
462
+
463
+ // GOOD: Add validation
464
+ {
465
+ "nodes": [
466
+ {
467
+ "name": "Webhook",
468
+ "type": "n8n-nodes-base.webhook"
469
+ },
470
+ {
471
+ "name": "Validate Input",
472
+ "type": "n8n-nodes-base.if",
473
+ "parameters": {
474
+ "conditions": {
475
+ "boolean": [
476
+ {
477
+ "value1": "={{$json.body.email}}",
478
+ "operation": "isNotEmpty"
479
+ },
480
+ {
481
+ "value1": "={{$json.body.email}}",
482
+ "operation": "regex",
483
+ "value2": "^[^@]+@[^@]+\\.[^@]+$"
484
+ }
485
+ ]
486
+ }
487
+ }
488
+ }
489
+ ]
490
+ }
491
+ ```
492
+
493
+ ---
494
+
495
+ ### 6. Hardcoded Credentials
496
+
497
+ **Warning**:
498
+ ```
499
+ Credentials should not be hardcoded
500
+ Suggestion: Use n8n credential system
501
+ ```
502
+
503
+ #### When Acceptable
504
+
505
+ **✅ Public APIs (No Auth)**
506
+ ```javascript
507
+ // Truly public API with no secrets
508
+ {
509
+ "url": "https://api.ipify.org"
510
+ // No credentials needed
511
+ }
512
+ ```
513
+
514
+ **✅ Demo/Example Workflows**
515
+ ```javascript
516
+ // Example workflow in documentation
517
+ {
518
+ "url": "https://example.com/api",
519
+ "headers": {
520
+ "Authorization": "Bearer DEMO_TOKEN"
521
+ }
522
+ // Clearly marked as example
523
+ }
524
+ ```
525
+
526
+ #### When to Fix (Always!)
527
+
528
+ **❌ Real Credentials**
529
+ ```javascript
530
+ // BAD: Real API key in workflow
531
+ {
532
+ "headers": {
533
+ "Authorization": "Bearer sk_live_abc123..."
534
+ }
535
+ // ❌ NEVER hardcode real credentials!
536
+ }
537
+
538
+ // GOOD: Use credentials system
539
+ {
540
+ "authentication": "headerAuth",
541
+ "credentials": {
542
+ "headerAuth": {
543
+ "id": "credential-id",
544
+ "name": "My API Key"
545
+ }
546
+ }
547
+ }
548
+ ```
549
+
550
+ ---
551
+
552
+ ## Review Strictness by Workflow Type
553
+
554
+ **Quick Automations**:
555
+ - Review: required fields + expressions
556
+ - Accept: Most warnings
557
+ - Fix: Only errors + security warnings
558
+
559
+ **Business-Critical Workflows**:
560
+ - Review: full pass (fields, values, types, expressions, connections, error handling, retries, rate limits)
561
+ - Accept: Very few warnings
562
+ - Fix: Everything possible
563
+
564
+ **Integration Testing**:
565
+ - Review: just enough to execute
566
+ - Accept: All warnings (just testing connections)
567
+ - Fix: Only errors that prevent execution
568
+
569
+ ---
570
+
571
+ ## Decision Framework
572
+
573
+ ### Should I Fix This Warning?
574
+
575
+ ```
576
+ ┌─────────────────────────────────┐
577
+ │ Is it a SECURITY warning? │
578
+ ├─────────────────────────────────┤
579
+ │ YES → Always fix │
580
+ │ NO → Continue │
581
+ └─────────────────────────────────┘
582
+ ↓
583
+ ┌─────────────────────────────────┐
584
+ │ Is this a production workflow? │
585
+ ├─────────────────────────────────┤
586
+ │ YES → Continue │
587
+ │ NO → Probably acceptable │
588
+ └─────────────────────────────────┘
589
+ ↓
590
+ ┌─────────────────────────────────┐
591
+ │ Does it handle critical data? │
592
+ ├─────────────────────────────────┤
593
+ │ YES → Fix the warning │
594
+ │ NO → Continue │
595
+ └─────────────────────────────────┘
596
+ ↓
597
+ ┌─────────────────────────────────┐
598
+ │ Is there a known workaround? │
599
+ ├─────────────────────────────────┤
600
+ │ YES → Acceptable if documented │
601
+ │ NO → Fix the warning │
602
+ └─────────────────────────────────┘
603
+ ```
604
+
605
+ ---
606
+
607
+ ## Documentation Template
608
+
609
+ When accepting a warning, document why (e.g. in a sticky note next to the node, or a comment in the exported JSON):
610
+
611
+ ```javascript
612
+ // workflows/customer-notifications.json
613
+
614
+ {
615
+ "nodes": [{
616
+ "name": "Send Slack Notification",
617
+ "type": "n8n-nodes-base.slack",
618
+ "parameters": {
619
+ "channel": "#notifications"
620
+ // ACCEPTED WARNING: No error handling
621
+ // Reason: Non-critical notification, failures are acceptable
622
+ // Reviewed: 2025-10-20
623
+ // Reviewer: Engineering Team
624
+ }
625
+ }]
626
+ }
627
+ ```
628
+
629
+ ---
630
+
631
+ ## Known Structural Quirks
632
+
633
+ ### IF Node Metadata
634
+
635
+ **Warning**: IF node missing `conditions.options` metadata
636
+
637
+ **Status**: False positive for IF v2.2+
638
+
639
+ **Why it occurs**: The editor adds the metadata when the node is saved - JSON written by hand or reviewed before import may lack it
640
+
641
+ **What to do**: Ignore - metadata is added when the user opens and saves the node
642
+
643
+ ### Switch Branch Count
644
+
645
+ **Warning**: Switch has 3 rules but 4 output connections
646
+
647
+ **Status**: False positive when using "fallback" mode
648
+
649
+ **Why it occurs**: Fallback creates an extra output
650
+
651
+ **What to do**: Ignore if using fallback intentionally
652
+
653
+ ### Credential Errors Before Execution
654
+
655
+ **Warning**: Cannot validate credentials without execution context
656
+
657
+ **Status**: False positive when reviewing static workflow JSON
658
+
659
+ **Why it occurs**: Credentials are validated at runtime, not build time - exported JSON only carries credential IDs/names
660
+
661
+ **What to do**: Ignore during review - credentials are checked when the workflow runs on the instance
662
+
663
+ ---
664
+
665
+ ## Summary
666
+
667
+ ### Always Fix
668
+ - ❌ Security warnings
669
+ - ❌ Hardcoded credentials
670
+ - ❌ SQL injection risks
671
+ - ❌ Production workflow errors
672
+
673
+ ### Usually Fix
674
+ - ⚠️ Error handling (production)
675
+ - ⚠️ Retry logic (external APIs)
676
+ - ⚠️ Input validation (public webhooks)
677
+ - ⚠️ Rate limiting (high volume)
678
+
679
+ ### Often Acceptable
680
+ - ✅ Error handling (dev/test)
681
+ - ✅ Retry logic (internal APIs)
682
+ - ✅ Rate limiting (low volume)
683
+ - ✅ Query limits (small datasets)
684
+
685
+ ### Always Acceptable
686
+ - ✅ Community/custom nodes reported as unknown (when installed on the target instance)
687
+ - ✅ Intentional polling loops flagged as cycles (with an exit condition)
688
+ - ✅ Editor-normalized structures (IF/Switch metadata, operator structure)
689
+ - ✅ Static credential checks (validated at runtime)
690
+
691
+ **Golden Rule**: If you accept a warning, document WHY.
692
+
693
+ **Related Files**:
694
+ - **[SKILL.md](SKILL.md)** - Main guide
695
+ - **[ERROR_CATALOG.md](ERROR_CATALOG.md)** - Error types and fixes