@awesomate/hosting-mcp 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +204 -8
- package/package.json +2 -2
- package/skill/awesomate-app-builder/SKILL.md +5 -1
- package/skill/awesomate-credentials/SKILL.md +1 -1
- package/skill/awesomate-hosting/SKILL.md +50 -159
- package/skill/awesomate-hosting/references/connect-troubleshooting.md +77 -0
- package/skill/awesomate-hosting/references/multi-account.md +33 -0
- package/skill/awesomate-hosting/references/rest-fallback.md +30 -0
- package/skill/awesomate-hosting/scripts/bootstrap.mjs +27 -7
- package/skill/awesomate-n8n/SKILL.md +153 -147
- package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +31 -0
- package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +30 -0
- package/skill/awesomate-n8n/evals/build-form-email/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +32 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +35 -0
- package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/graders/grader.md +28 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/vars-not-env/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/vars-not-env/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +3 -0
- package/skill/awesomate-n8n/references/ai-agents.md +135 -0
- package/skill/awesomate-n8n/references/datatables.md +105 -0
- package/skill/awesomate-n8n/references/{node-recipes.md → platform-notes.md} +56 -7
- package/skill/awesomate-n8n/references/possibilities.md +83 -0
- package/skill/awesomate-n8n/references/testing-policy.md +115 -0
- package/skill/awesomate-n8n/references/troubleshooting.md +69 -0
- package/skill/awesomate-n8n/references/upgrade-loop.md +98 -0
- package/skill/awesomate-n8n/references/vendor/MANIFEST.json +26 -0
- package/skill/awesomate-n8n/references/vendor/code-node/BUILTIN_FUNCTIONS.md +779 -0
- package/skill/awesomate-n8n/references/vendor/code-node/COMMON_PATTERNS.md +1123 -0
- package/skill/awesomate-n8n/references/vendor/code-node/DATA_ACCESS.md +797 -0
- package/skill/awesomate-n8n/references/vendor/code-node/ERROR_PATTERNS.md +776 -0
- package/skill/awesomate-n8n/references/vendor/code-node/SKILL.md +703 -0
- package/skill/awesomate-n8n/references/vendor/expressions/COMMON_MISTAKES.md +406 -0
- package/skill/awesomate-n8n/references/vendor/expressions/EXAMPLES.md +496 -0
- package/skill/awesomate-n8n/references/vendor/expressions/SKILL.md +525 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/DEPENDENCIES.md +743 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/OPERATION_PATTERNS.md +926 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/SKILL.md +583 -0
- package/skill/awesomate-n8n/references/vendor/validation/ERROR_CATALOG.md +781 -0
- package/skill/awesomate-n8n/references/vendor/validation/FALSE_POSITIVES.md +695 -0
- package/skill/awesomate-n8n/references/vendor/validation/SKILL.md +414 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/SKILL.md +413 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/ai_agent_workflow.md +797 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/database_operations.md +798 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/http_api_integration.md +747 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/scheduled_tasks.md +786 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/webhook_processing.md +558 -0
|
@@ -0,0 +1,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
|