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