{
  "id": "7zXszfBim9mQdK1ODJvby",
  "name": "Analyze error logs with AI and auto-create GitHub issues with fix suggestions",
  "tags": [
    {
      "id": "addb41c949ff46d1",
      "name": "ai",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    },
    {
      "id": "eebac8f1dd994d2d",
      "name": "gpt-4",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    },
    {
      "id": "974fcaceccbc4c61",
      "name": "openai",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    },
    {
      "id": "98a19c2575b04811",
      "name": "github",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    },
    {
      "id": "6a7e671d8c0b46de",
      "name": "slack",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    },
    {
      "id": "a8428579025b4357",
      "name": "error-monitoring",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    },
    {
      "id": "aad203a3b6794dba",
      "name": "devops",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    },
    {
      "id": "1ef881bea50f4f5f",
      "name": "automation",
      "createdAt": "2026-04-30T18:38:11.353194Z",
      "updatedAt": "2026-04-30T18:38:11.353194Z"
    }
  ],
  "nodes": [
    {
      "id": "0e2ab42f-ef8c-4794-993c-72f61d2f9c1d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1088,
        -48
      ],
      "parameters": {
        "width": 480,
        "height": 848,
        "content": "## Analyze error logs with AI and auto-create GitHub issues with fix suggestions\n\n## How it works\n\n1. The workflow is triggered by receiving an error log via a webhook.\n2. The log is parsed and existing GitHub issues are searched to avoid duplicates.\n3. If no duplicate is found, the error is analyzed and fix suggestions are generated using AI.\n4. New GitHub issues are created based on AI suggestions or duplicates are notified via Slack.\n5. Critical errors trigger alerts on Slack and the system pauses before re-executing.\n\n## Setup steps\n\n- [ ] Set up a webhook to receive error logs.\n- [ ] Configure GitHub node with appropriate repository access.\n- [ ] Set up OpenAI API credentials for AI analysis.\n- [ ] Integrate Slack for alerts and notifications.\n\n## Customization\n\nCustomize AI prompt for error analysis to improve suggestions."
      },
      "typeVersion": 1
    },
    {
      "id": "01d25baf-6090-4ee2-a612-5a7c477df4db",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -528,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 304,
        "content": "## Receive and parse log\n\nInitial step receiving error logs via webhook and parsing."
      },
      "typeVersion": 1
    },
    {
      "id": "4b399d3d-f4e9-44c6-a5de-ffe3e3f36332",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -16,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 304,
        "content": "## Check for duplicate GitHub issues\n\nSearches GitHub for existing issues related to the error and scores potential duplicates."
      },
      "typeVersion": 1
    },
    {
      "id": "b38dd85c-4e2a-4233-b54e-2f08e4e9434f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        688,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 304,
        "content": "## Handle duplicates and notify\n\nNotifies in Slack and responds if a duplicate issue is found."
      },
      "typeVersion": 1
    },
    {
      "id": "865e480b-bc8a-437c-ba86-b7a0bc3e563c",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        704,
        384
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 304,
        "content": "## Analyze error and suggest fixes\n\nProcesses errors with AI to generate fix suggestions for new GitHub issues."
      },
      "typeVersion": 1
    },
    {
      "id": "f1c7b2cc-a61e-4fb3-bb69-87fe7a2769b1",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1424,
        256
      ],
      "parameters": {
        "color": 7,
        "width": 704,
        "height": 544,
        "content": "## Send alerts and summarize\n\nEvaluates error severity and sends Slack alerts, summarizing non-critical errors to dev-alerts."
      },
      "typeVersion": 1
    },
    {
      "id": "5a9dc61e-aeca-4840-acf8-38ee21776e7b",
      "name": "Webhook for Error Logs",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -480,
        240
      ],
      "parameters": {
        "path": "error-log-intake",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2
    },
    {
      "id": "011ea5d6-742a-4e70-a9b4-22c74f457c2d",
      "name": "Parse and Enrich Log",
      "type": "n8n-nodes-base.code",
      "position": [
        -256,
        240
      ],
      "parameters": {
        "jsCode": "// ========================================\n// Node: Parse & Enrich Error Log\n// ========================================\nconst body = $input.first().json.body || $input.first().json;\n\n// Validate required fields\nconst required = ['service', 'level', 'message'];\nfor (const field of required) {\n  if (!body[field]) {\n    throw new Error(`Missing required field: ${field}`);\n  }\n}\n\n// Normalize log level\nconst level = (body.level || '').toUpperCase();\nconst validLevels = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL', 'FATAL'];\nconst normalizedLevel = validLevels.includes(level) ? level : 'ERROR';\n\n// Parse stack trace if present\nconst stackTrace = body.stack_trace || body.stackTrace || body.stack || null;\nconst stackLines = stackTrace ? stackTrace.split('\\n').slice(0, 20).join('\\n') : null;\n\n// Extract error type from message or stack\nlet errorType = body.error_type || body.errorType || null;\nif (!errorType && stackTrace) {\n  const match = stackTrace.match(/^([A-Za-z]+(?:Error|Exception|Fault|Warning))/);\n  errorType = match ? match[1] : 'UnknownError';\n} else if (!errorType) {\n  const match = body.message.match(/([A-Za-z]+(?:Error|Exception|Fault))/);\n  errorType = match ? match[1] : 'ApplicationError';\n}\n\nconst searchKeyword = `[${body.service}] ${errorType}`;\n\nconst enrichedLog = {\n  service: body.service,\n  environment: body.environment || body.env || 'production',\n  level: normalizedLevel,\n  isCritical: ['CRITICAL', 'FATAL'].includes(normalizedLevel) || body.isCritical === true,\n  message: body.message,\n  errorType,\n  timestamp: body.timestamp || new Date().toISOString(),\n  traceId: body.trace_id || body.traceId || null,\n  userId: body.user_id || body.userId || null,\n  endpoint: body.endpoint || body.path || null,\n  httpMethod: body.http_method || body.method || null,\n  statusCode: body.status_code || body.statusCode || null,\n  stackTrace: stackLines,\n  stackRaw: stackTrace ? stackTrace.substring(0, 3000) : null,\n  searchKeyword,\n  rawLog: JSON.stringify(body).substring(0, 2000)\n};\n\nreturn [{ json: enrichedLog }];"
      },
      "typeVersion": 2
    },
    {
      "id": "1c808aba-b152-4815-a6c3-d33206936b11",
      "name": "Search GitHub Issues",
      "type": "n8n-nodes-base.github",
      "position": [
        32,
        240
      ],
      "parameters": {
        "owner": "={{ $vars.GITHUB_OWNER }}",
        "operation": "getAll",
        "repository": "={{ $vars.GITHUB_REPO }}"
      },
      "typeVersion": 1
    },
    {
      "id": "65a4b977-3fa6-4e70-82d4-f1e58a3c468d",
      "name": "Score GitHub Issue Duplicates",
      "type": "n8n-nodes-base.code",
      "position": [
        272,
        240
      ],
      "parameters": {
        "jsCode": "// ========================================\n// Node: Duplicate Issue Check\n// ========================================\nconst log = $('Parse and Enrich Log').first().json;\nconst issues = $input.all().map(i => i.json);\n\nconst service = log.service || '';\nconst errorType = log.errorType || '';\nconst message = (log.message || '').toLowerCase().substring(0, 100);\n\nlet bestMatch = null;\nlet bestScore = 0;\n\nfor (const issue of issues) {\n  if (!issue || !issue.title) continue;\n\n  let score = 0;\n  const title = (issue.title || '').toLowerCase();\n  const body = (issue.body || '').toLowerCase();\n\n  if (title.includes(service.toLowerCase())) score += 40;\n  if (title.includes(errorType.toLowerCase())) score += 40;\n\n  const words = message.split(' ').filter(w => w.length > 4);\n  const wordMatches = words.filter(w => title.includes(w) || body.includes(w)).length;\n  score += Math.min(wordMatches * 5, 20);\n\n  if (score > bestScore) {\n    bestScore = score;\n    bestMatch = issue;\n  }\n}\n\nconst isDuplicate = bestScore >= 60;\n\nreturn [{\n  json: {\n    ...log,\n    duplicateCheck: {\n      isDuplicate,\n      score: bestScore,\n      matchedIssue: isDuplicate ? {\n        number: bestMatch.number,\n        title: bestMatch.title,\n        url: bestMatch.html_url,\n        state: bestMatch.state,\n        createdAt: bestMatch.created_at\n      } : null,\n      totalIssuesChecked: issues.length\n    }\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "9521cc4d-d5bf-4ab7-8bd8-4178e8bc0340",
      "name": "Check for Duplicates",
      "type": "n8n-nodes-base.if",
      "position": [
        512,
        240
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "duplicate-condition",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.duplicateCheck.isDuplicate }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "14e78b43-f309-4bbf-b2ce-65d43824ab1c",
      "name": "OpenAI Error Analysis",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        752,
        512
      ],
      "parameters": {
        "resource": "chat"
      },
      "typeVersion": 1.8
    },
    {
      "id": "20b47b0e-9772-4cb2-81e0-2e50ca184c10",
      "name": "Build GitHub Issue Body",
      "type": "n8n-nodes-base.code",
      "position": [
        992,
        512
      ],
      "parameters": {
        "jsCode": "// ========================================\n// Node: Parse OpenAI Analysis\n// ========================================\nconst log = $('Score GitHub Issue Duplicates').first().json;\nconst aiResponse = $input.first().json;\n\nlet rawContent = '';\nif (aiResponse.message && aiResponse.message.content) {\n  rawContent = aiResponse.message.content;\n} else if (aiResponse.choices && aiResponse.choices[0]) {\n  rawContent = aiResponse.choices[0].message?.content || '';\n} else if (typeof aiResponse === 'string') {\n  rawContent = aiResponse;\n}\n\nlet analysis = {};\ntry {\n  const jsonMatch = rawContent.match(/\\{[\\s\\S]*\\}/);\n  if (jsonMatch) {\n    analysis = JSON.parse(jsonMatch[0]);\n  } else {\n    throw new Error('No JSON found in response');\n  }\n} catch (e) {\n  analysis = {\n    summary: `${log.errorType} in ${log.service}: ${log.message.substring(0, 80)}`,\n    rootCause: 'Automated analysis could not parse AI response. Manual review required.',\n    impact: 'Unknown - requires manual assessment',\n    severity: log.isCritical ? 'CRITICAL' : 'HIGH',\n    category: log.errorType,\n    fixSuggestions: [{ step: 1, title: 'Manual Review', description: 'Review the error logs manually and investigate the root cause.', codeExample: '' }],\n    preventionMeasures: ['Add monitoring alerts', 'Review error handling logic'],\n    estimatedEffort: 'M',\n    relatedComponents: [log.service],\n    labels: ['bug', 'auto-generated', 'needs-review']\n  };\n}\n\nconst fixSteps = (analysis.fixSuggestions || []).map(s => {\n  let step = `### Step ${s.step}: ${s.title}\\n${s.description}`;\n  if (s.codeExample) step += `\\n\\n\\`\\`\\`\\n${s.codeExample}\\n\\`\\`\\``;\n  return step;\n}).join('\\n\\n');\n\nconst prevention = (analysis.preventionMeasures || []).map(m => `- ${m}`).join('\\n');\nconst components = (analysis.relatedComponents || []).map(c => `\\`${c}\\``).join(', ');\n\nconst issueTitle = `[${log.service}] ${analysis.summary || log.message.substring(0, 100)}`;\n\nconst issueBody = `## \ud83d\udc1b Error Report\\n\\n> **Auto-generated by AI Error Log Analyzer** | ${new Date().toUTCString()}\\n\\n---\\n\\n## \ud83d\udccb Error Details\\n\\n| Field | Value |\\n|-------|-------|\\n| **Service** | \\`${log.service}\\` |\\n| **Environment** | \\`${log.environment}\\` |\\n| **Severity** | \\`${analysis.severity || log.level}\\` |\\n| **Category** | \\`${analysis.category || log.errorType}\\` |\\n| **Error Type** | \\`${log.errorType}\\` |\\n| **Timestamp** | \\`${log.timestamp}\\` |\\n| **Trace ID** | \\`${log.traceId || 'N/A'}\\` |\\n| **Estimated Effort** | \\`${analysis.estimatedEffort || 'M'}\\` |\\n| **Affected Components** | ${components || 'N/A'} |\\n\\n---\\n\\n## \ud83d\udcac Error Message\\n\\n\\`\\`\\`\\n${log.message}\\n\\`\\`\\`\\n\\n${log.stackTrace ? `## \ud83d\udccd Stack Trace\\n\\n\\`\\`\\`\\n${log.stackTrace}\\n\\`\\`\\`` : ''}\\n\\n---\\n\\n## \ud83d\udd0d Root Cause Analysis\\n\\n${analysis.rootCause}\\n\\n**Potential Impact:** ${analysis.impact}\\n\\n---\\n\\n## \ud83d\udee0\ufe0f Suggested Fixes\\n\\n${fixSteps}\\n\\n---\\n\\n## \ud83d\udee1\ufe0f Prevention Measures\\n\\n${prevention}\\n\\n---\\n\\n## \ud83d\udd17 Additional Context\\n\\n<details>\\n<summary>Request Details</summary>\\n\\n- **Endpoint:** \\`${log.endpoint || 'N/A'}\\`\\n- **Method:** \\`${log.httpMethod || 'N/A'}\\`\\n- **Status Code:** \\`${log.statusCode || 'N/A'}\\`\\n- **User ID:** \\`${log.userId || 'N/A'}\\`\\n\\n</details>\\n\\n---\\n*This issue was automatically created by the AI Error Log Analyzer workflow.*`;\n\nconst labels = analysis.labels || ['bug', 'auto-generated'];\nif (log.isCritical && !labels.includes('critical')) labels.push('critical');\nif (!labels.includes(log.environment)) labels.push(log.environment);\n\nreturn [{\n  json: {\n    ...log,\n    analysis,\n    issueTitle,\n    issueBody,\n    labels\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "36e2c794-9209-40ad-bf28-1c3ac5ebf558",
      "name": "Create GitHub Issue",
      "type": "n8n-nodes-base.github",
      "position": [
        1232,
        512
      ],
      "parameters": {
        "body": "={{ $json.issueBody }}",
        "owner": "={{ $vars.GITHUB_OWNER }}",
        "title": "={{ $json.issueTitle }}",
        "labels": [],
        "assignees": [],
        "repository": "={{ $vars.GITHUB_REPO }}"
      },
      "typeVersion": 1
    },
    {
      "id": "cf33420c-7115-4c7d-b0ab-4e7d33e49d42",
      "name": "If Critical Error",
      "type": "n8n-nodes-base.if",
      "position": [
        1472,
        512
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "critical-condition",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $('Build GitHub Issue Body').first().json.isCritical }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "dd909d3f-5f0b-401c-97ba-1754e78104b7",
      "name": "Post Critical Alert to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        1744,
        384
      ],
      "parameters": {
        "text": "=\ud83d\udea8 *CRITICAL ERROR ALERT* \ud83d\udea8\n\n*Service:* `{{ $('Build GitHub Issue Body').first().json.service }}`\n*Environment:* `{{ $('Build GitHub Issue Body').first().json.environment }}`\n*Error Type:* `{{ $('Build GitHub Issue Body').first().json.errorType }}`\n*Severity:* `{{ $('Build GitHub Issue Body').first().json.analysis.severity }}`\n*Timestamp:* `{{ $('Build GitHub Issue Body').first().json.timestamp }}`\n\n*Error Message:*\n```{{ $('Build GitHub Issue Body').first().json.message.substring(0, 300) }}```\n\n*Root Cause:*\n{{ $('Build GitHub Issue Body').first().json.analysis.rootCause }}\n\n*Estimated Fix Effort:* `{{ $('Build GitHub Issue Body').first().json.analysis.estimatedEffort }}`\n\n\ud83d\udccb *GitHub Issue Created:* {{ $json.html_url }}\n\n@here Immediate attention required!",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#incident"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "3350f0a0-d927-4086-bf50-1192073cf036",
      "name": "Post Error Summary to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        1744,
        624
      ],
      "parameters": {
        "text": "=\u26a0\ufe0f *New Error Issue Created*\n\n*Service:* `{{ $('Build GitHub Issue Body').first().json.service }}`\n*Environment:* `{{ $('Build GitHub Issue Body').first().json.environment }}`\n*Level:* `{{ $('Build GitHub Issue Body').first().json.level }}`\n*Category:* `{{ $('Build GitHub Issue Body').first().json.analysis.category }}`\n*Estimated Effort:* `{{ $('Build GitHub Issue Body').first().json.analysis.estimatedEffort }}`\n\n*Summary:*\n{{ $('Build GitHub Issue Body').first().json.analysis.summary }}\n\n\ud83d\udccb *GitHub Issue:* {{ $json.html_url }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#dev-alerts"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "51633a34-5880-40b1-9319-8943512f180d",
      "name": "Notify Duplicate to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        736,
        80
      ],
      "parameters": {
        "text": "=\u2139\ufe0f *Duplicate Issue Detected \u2014 Skipped*\n\n*Service:* `{{ $json.service }}`\n*Error Type:* `{{ $json.errorType }}`\n*Match Score:* `{{ $json.duplicateCheck.score }}/100`\n\n*Existing Issue:*\n\u2022 Number: #{{ $json.duplicateCheck.matchedIssue.number }}\n\u2022 Title: {{ $json.duplicateCheck.matchedIssue.title }}\n\u2022 URL: {{ $json.duplicateCheck.matchedIssue.url }}\n\n_No new issue created. Add context to the existing issue if needed._",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#dev-alerts"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "cc1d49bb-151c-4820-9b28-b08bd10d4a11",
      "name": "Wait 30 Minutes",
      "type": "n8n-nodes-base.wait",
      "position": [
        1984,
        512
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "090df419-6375-4e6f-a5f9-2168213daaf3",
      "name": "Respond with Duplicate Status",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        976,
        80
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ status: 'ok', message: 'Duplicate detected. No issue created.', timestamp: new Date().toISOString() }) }}"
      },
      "typeVersion": 1.1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "6613d635-f841-4b62-81b7-b16f59e239ae",
  "connections": {
    "If Critical Error": {
      "main": [
        [
          {
            "node": "Post Critical Alert to Slack",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post Error Summary to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create GitHub Issue": {
      "main": [
        [
          {
            "node": "If Critical Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for Duplicates": {
      "main": [
        [
          {
            "node": "Notify Duplicate to Slack",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "OpenAI Error Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse and Enrich Log": {
      "main": [
        [
          {
            "node": "Search GitHub Issues",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search GitHub Issues": {
      "main": [
        [
          {
            "node": "Score GitHub Issue Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Error Analysis": {
      "main": [
        [
          {
            "node": "Build GitHub Issue Body",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook for Error Logs": {
      "main": [
        [
          {
            "node": "Parse and Enrich Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build GitHub Issue Body": {
      "main": [
        [
          {
            "node": "Create GitHub Issue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Duplicate to Slack": {
      "main": [
        [
          {
            "node": "Respond with Duplicate Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post Error Summary to Slack": {
      "main": [
        [
          {
            "node": "Wait 30 Minutes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post Critical Alert to Slack": {
      "main": [
        [
          {
            "node": "Wait 30 Minutes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Score GitHub Issue Duplicates": {
      "main": [
        [
          {
            "node": "Check for Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}