kipn.ai
Shared workflow report

01 - Alert Triage with LLM Verdict

Analyzed

Executive Summary
n8n
Production RiskHigh

Fragile expression — likely to fail when production data shape differs from test data — These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.

Cost ExposureHigh

No output token cap — Missing max-token limits allow unbounded completion length and runaway spend.

Observability Gap

Side-effect node has no audit trail — If this action is disputed, replayed, or causes a data inconsistency, there is no structured record of what was sent, when, and with what data. Debugging requires cross-referencing n8n execution history with the external system's own logs.

60/ 100
Overall
Risk: HighCost: High
Reliability
0
Security
85
Cost Risk
100
Observability
76
AI Governance
100
Naming
100
Complexity
100
Nodes
11
Edges
13
External calls
4
LLM nodes
1
AI via HTTP
0
Loops
0
Error handlers
0
Unreachable
0
Max depth
7
Workflow Graph
Graph
11 nodes · 13 edges
100%
click a node to highlight its upstream & downstream paths
Controls Matrix
Present Partial Missing
CheckDescriptionStatus
Failure Alerting

Failures silent — only visible in execution log

Missing
Retry on Failure

Transient failures cause permanent stops

Present
Request Timeouts

Slow providers can block execution indefinitely

Missing
Duplicate Prevention

Retry on write events creates duplicate records

Missing
Empty Response Handling

Zero-result lookups break downstream logic

Present
AI Output Limits

Output cost and parsing risk unbounded

Present
AI Output Format

Free-form output will break downstream parsers

Missing
Activity Logging

Side effects unlogged

Missing
Write Deduplication

Webhook replays may create duplicate records

Missing

Run this analysis on your own workflows

Break Points
2Fragile expressionRisk HighConfidence 85%1 node affected
Affected Nodes:
  • Slack: Escalate TP
What happens:

These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.

Recommended Fix:
  • In `text`, change {{ $json.rule_name }} to {{ $json?.rule_name }}.
  • In `text`, change {{ ($json.mitre_techniques || []).map(t => `${t.id} ${t.name}`).join(', ') || 'n/a' }} to {{ ($json?.mitre_techniques || [])?.map(t => `${t?.id} ${t?.name}`)?.join(', ') || 'n/a' }}.

3AI blocks webhook responseRisk HighConfidence 85%3 nodes affected
Affected Nodes:
  • SIEM Alert Webhook
  • LLM Triage (Tier-2 Analyst)
  • Respond to SIEM
What happens:

Webhook senders have hard response timeouts: Slack 3 s, Shopify 5 s, GitHub 10 s, Stripe 30 s. AI calls typically take 10–60 seconds. When the sender times out, it marks the delivery failed and retries — the workflow processes the same event twice, potentially creating duplicate records, emails, or actions.

Recommended Fix:

Respond to the webhook immediately with a 202 Accepted using a Respond to Webhook node placed before the AI work. Move the AI processing to continue asynchronously after the response.


4Missing timeoutRisk MediumConfidence 90%4 nodes affected
Affected Nodes:
  • LLM Triage (Tier-2 Analyst)
  • Slack: Escalate TP
  • Slack: FP/Benign Digest
What happens:

A single slow external call can block the entire workflow execution. At high trigger frequency, accumulated stuck executions can exhaust the n8n execution queue.

Recommended Fix:

Set a timeout under the node's Additional Options. A value of 10,000–30,000 ms (10–30 seconds) is a reasonable starting point for most APIs; adjust based on the provider's documented SLA.


5Fragile expressionRisk MediumConfidence 85%1 node affected
Affected Nodes:
  • Respond to SIEM
What happens:

These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.

Recommended Fix:
  • In `responseBody`, change {{ JSON.stringify({ alert_id: $json.alert_id, verdict: $json.verdict, confidence: $json.confidence, mitre_techniques: $json.mitre_techniques ?? [] }) }} to {{ JSON?.stringify({ alert_id: $json?.alert_id, verdict: $json?.verdict, confidence: $json?.confidence, mitre_techniques: $json?.mitre_techniques ?? [] }) }}.

6Missing error handlerRisk MediumConfidence 85%7 nodes affected
Affected Nodes:
  • Normalize Alert
  • LLM Triage (Tier-2 Analyst)
  • Parse & Validate Verdict
What happens:

Operators cannot tell from external signals that a run failed. Silent failures go undetected until a downstream system shows missing data or a user reports a problem.

Recommended Fix:

Connect a dedicated Error Workflow in workflow settings, or add a per-node onError: "continueErrorOutput" path that sends an alert via Slack, email, or a logging service.


7Fragile expressionRisk MediumConfidence 75%1 node affected
Affected Nodes:
  • Slack: FP/Benign Digest
What happens:

These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.

Recommended Fix:
  • In `text`, change {{ $json.rule_name }} to {{ $json?.rule_name }}.

8Fragile expressionRisk MediumConfidence 75%1 node affected
Affected Nodes:
  • Slack: Needs Analyst Review
What happens:

These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.

Recommended Fix:
  • In `text`, change {{ $json.rule_name }} to {{ $json?.rule_name }}.

9Missing audit logRisk MediumConfidence 70%3 nodes affected
Affected Nodes:
  • Slack: Escalate TP
  • Slack: FP/Benign Digest
  • Slack: Needs Analyst Review
What happens:

If this action is disputed, replayed, or causes a data inconsistency, there is no structured record of what was sent, when, and with what data. Debugging requires cross-referencing n8n execution history with the external system's own logs.

Recommended Fix:

After the write node, add a step that records the key fields of the action to a log — a Google Sheet row append, a database insert to an audit table, or a Slack message to a dedicated ops channel. Include: timestamp, action type, affected ID, and result.


10Webhook write without dedupeRisk MediumConfidence 65%7 nodes affected
Affected Nodes:
  • SIEM Alert Webhook
  • Normalize Alert
  • Severity Gate (drop informational)
What happens:

Webhook providers retry on delivery failure. Without a unique key on the target record, a retried delivery creates a duplicate.

Recommended Fix:

Add a unique field to the write operation using a stable identifier from the webhook payload (event ID, order ID, etc.), or add a read-before-write existence check before the write node.

Raw Findings (19)
#Issue titleIssue descriptionAffected nodes
1ReliabilityAI node blocks synchronous webhook response path

Node "SIEM Alert Webhook" executes in the synchronous response path of the webhook trigger. The webhook trigger's responseMode is "responseNode", meaning the webhook sender waits for a response before marking delivery complete.

SIEM Alert Webhook, LLM Triage (Tier-2 Analyst), Respond to SIEMHigh85%
2ReliabilityExternal call with no timeout configured

Node "LLM Triage (Tier-2 Analyst)" makes an external call with no timeout parameter set. The n8n execution will wait indefinitely if the provider is slow or unresponsive.

LLM Triage (Tier-2 Analyst), Slack: Escalate TP, Slack: FP/Benign Digest, Slack: Needs Analyst ReviewHigh90%
3SecurityFinding: webhook no auth

authentication: absent. path: short custom path "__KIPNAI_SAN__WEBHOOK_URL__p7w4FJYj__" (enumerable). downstream write node(s): "Slack: Escalate TP", "Slack: FP/Benign Digest", "Slack: Needs Analyst Review"

SIEM Alert Webhook, Slack: Escalate TP, Slack: FP/Benign Digest, Slack: Needs Analyst ReviewHigh90%
4ReliabilityFragile expression — likely to fail when production data shape differs from test data

Node "Slack: Escalate TP" contains expression(s) with risky patterns that assume fields are always present.

Slack: Escalate TPHigh85%
5ReliabilityNo error handler or failure notification path

Workflow has 7 high-risk nodes (external calls or writes) with no configured error workflow and no inline notification path. If a production execution fails, the failure only appears in execution history.

Normalize Alert, LLM Triage (Tier-2 Analyst), Parse & Validate Verdict, Slack: Escalate TP, Slack: FP/Benign Digest, Slack: Needs Analyst Review, Archive: Below Severity FloorHigh85%
6ReliabilityAI output drives downstream logic without a structured format

Node "LLM Triage (Tier-2 Analyst)" produces free-form text output that flows into downstream logic with no Output Parser or JSON mode configured.

LLM Triage (Tier-2 Analyst)Medium75%
7ReliabilityFragile expression — likely to fail when production data shape differs from test data

Node "LLM Triage (Tier-2 Analyst)" contains expression(s) with risky patterns that assume fields are always present.

LLM Triage (Tier-2 Analyst)Medium75%
8ReliabilityFragile expression — likely to fail when production data shape differs from test data

Node "Slack: FP/Benign Digest" contains expression(s) with risky patterns that assume fields are always present.

Slack: FP/Benign DigestMedium75%
9ReliabilityFragile expression — likely to fail when production data shape differs from test data

Node "Slack: Needs Analyst Review" contains expression(s) with risky patterns that assume fields are always present.

Slack: Needs Analyst ReviewMedium75%
10ReliabilityFragile expression — likely to fail when production data shape differs from test data

Node "Respond to SIEM" contains expression(s) with risky patterns that assume fields are always present.

Respond to SIEMMedium85%
11ObservabilitySide-effect node has no audit trail

Node "Slack: Escalate TP" performs a write node: "slack: escalate tp" (sideeffect: external_write) operation with no logging or audit trail detected downstream.

Slack: Escalate TPMedium70%
12ObservabilitySide-effect node has no audit trail

Node "Slack: FP/Benign Digest" performs a write node: "slack: fp/benign digest" (sideeffect: external_write) operation with no logging or audit trail detected downstream.

Slack: FP/Benign DigestMedium70%
13ObservabilitySide-effect node has no audit trail

Node "Slack: Needs Analyst Review" performs a write node: "slack: needs analyst review" (sideeffect: external_write) operation with no logging or audit trail detected downstream.

Slack: Needs Analyst ReviewMedium70%
14ReliabilityWebhook trigger feeds write operation without unique-key protection

The webhook trigger feeds node "SIEM Alert Webhook" without a visible unique key constraint or deduplication step. No ID field parameter was detected in the write node configuration.

SIEM Alert Webhook, Slack: Escalate TPMedium65%
15ReliabilityWebhook trigger feeds write operation without unique-key protection

The webhook trigger feeds node "SIEM Alert Webhook" without a visible unique key constraint or deduplication step. No ID field parameter was detected in the write node configuration.

SIEM Alert Webhook, Slack: FP/Benign DigestMedium65%
16ReliabilityWebhook trigger feeds write operation without unique-key protection

The webhook trigger feeds node "SIEM Alert Webhook" without a visible unique key constraint or deduplication step. No ID field parameter was detected in the write node configuration.

SIEM Alert Webhook, Slack: Needs Analyst ReviewMedium65%
17ReliabilityFragile expression — likely to fail when production data shape differs from test data

Node "Severity Gate (drop informational)" contains expression(s) with risky patterns that assume fields are always present.

Severity Gate (drop informational)Low75%
18ReliabilityFragile expression — likely to fail when production data shape differs from test data

Node "Route by Verdict" contains expression(s) with risky patterns that assume fields are always present.

Route by VerdictLow75%
19ReliabilityFinding: external without retry

Node "LLM Triage (Tier-2 Analyst)" (@n8n/n8n-nodes-langchain.openAi) is a read-only external call with no retry configured.. sideEffect: read_only, role: ai_model_call. Read-only calls are typically safe to retry; enabling retryOnFail improves resilience to transient failures.

LLM Triage (Tier-2 Analyst)Info70%

Catch workflow risks before they catch you