{
  "id": "incidentLifecycle01",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Incident Lifecycle Management with Port",
  "tags": [],
  "nodes": [
    {
      "id": "incident-trigger",
      "name": "On PagerDuty Incident",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -1400,
        240
      ],
      "parameters": {
        "path": "pagerduty/incident",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1
    },
    {
      "id": "check-event-type",
      "name": "Check Event Type",
      "type": "n8n-nodes-base.switch",
      "position": [
        -1160,
        240
      ],
      "parameters": {
        "rules": {
          "rules": [
            {
              "value": "incident.triggered",
              "output": 0,
              "value2": "={{ $json.body.event.event_type }}",
              "operation": "equals"
            },
            {
              "value": "incident.resolved",
              "output": 1,
              "value2": "={{ $json.body.event.event_type }}",
              "operation": "equals"
            }
          ]
        },
        "fallbackOutput": 2
      },
      "typeVersion": 2
    },
    {
      "id": "extract-context-triggered",
      "name": "Extract Context (New Incident)",
      "type": "CUSTOM.portIo",
      "position": [
        -880,
        120
      ],
      "parameters": {
        "model": "gpt-5",
        "labels": "{\n    \"source\": \"n8n-workflow\",\n    \"use_case\": \"incident-context-enrichment\"\n  }",
        "prompt": "=A PagerDuty incident has been triggered.\n\nIncident Details:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('On PagerDuty Incident').item.json.body.event.data.service.name }}\n- Urgency: {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n- Created At: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n\nQuery the Port catalog for comprehensive context about this incident.\n\nRetrieve:\n1. Affected service details (tier, criticality, SLA)\n2. Service owners and current on-call engineers\n3. Recent deployments (last 48 hours)\n4. Related pull requests or configuration changes\n5. Dependencies and upstream/downstream services\n6. Known vulnerabilities or ongoing issues\n7. Runbook URLs and monitoring dashboards\n8. Past similar incidents and resolution patterns\n9. Team's Slack channel\n\nOutput as JSON:\n{\n  \"service_name\": \"\",\n  \"service_tier\": \"tier1|tier2|tier3\",\n  \"sla_minutes\": 0,\n  \"owners\": [],\n  \"on_call_engineers\": [],\n  \"slack_channel\": \"\",\n  \"recent_deployments\": [],\n  \"recent_changes\": [],\n  \"dependencies\": [],\n  \"runbook_url\": \"\",\n  \"dashboard_url\": \"\",\n  \"past_incidents_summary\": \"\",\n  \"known_issues\": [],\n  \"jira_project_key\": \"\"\n}\n\nRules:\n- Only include data that exists in Port\n- Use empty strings/arrays if not found",
        "agentIdentifier": "context_retriever_agent"
      },
      "credentials": {
        "portIoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "parse-context-triggered",
      "name": "Parse Context (New Incident)",
      "type": "CUSTOM.portIo",
      "position": [
        -640,
        120
      ],
      "parameters": {
        "operation": "getInvocation",
        "invocationId": "={{ $json.invocationIdentifier }}"
      },
      "credentials": {
        "portIoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "assess-severity",
      "name": "Assess Severity",
      "type": "n8n-nodes-base.openAi",
      "position": [
        -400,
        120
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "prompt": {
          "messages": [
            {
              "content": "=You are an incident management expert. Assess this incident and determine if immediate escalation is needed.\n\nIncident:\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('On PagerDuty Incident').item.json.body.event.data.service.name }}\n- Urgency: {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n\nContext from Port:\n{{ $json.result.message }}\n\nConsider:\n1. Is this a production service?\n2. Were there recent deployments that could be related?\n3. Are there known issues affecting this service?\n4. What is the SLA requirement?\n\nProvide your response as JSON:\n{\n  \"severity_assessment\": \"critical|high|medium|low\",\n  \"needs_escalation\": true or false,\n  \"escalation_reason\": \"reason if needs_escalation is true\",\n  \"likely_cause\": \"brief assessment of likely cause\",\n  \"recommended_actions\": [\"action 1\", \"action 2\", \"action 3\"],\n  \"investigation_checklist\": [\"check 1\", \"check 2\", \"check 3\"]\n}\n\nReturn ONLY the JSON object."
            }
          ]
        },
        "options": {},
        "resource": "chat",
        "requestOptions": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "check-needs-escalation",
      "name": "Needs Escalation?",
      "type": "n8n-nodes-base.if",
      "position": [
        -160,
        120
      ],
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{ $json.message.content.parseJson().needs_escalation }}",
              "value2": "={{ true }}"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "notify-team",
      "name": "Notify Team Channel",
      "type": "n8n-nodes-base.slack",
      "position": [
        80,
        40
      ],
      "parameters": {
        "text": "=:rotating_light: *INCIDENT ALERT*\n\n*{{ $('On PagerDuty Incident').item.json.body.event.data.title }}*\n\n*Service:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_name }} ({{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_tier }})\n*Urgency:* {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n*Severity Assessment:* {{ $('Assess Severity').item.json.message.content.parseJson().severity_assessment }}\n\n*On-Call:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().on_call_engineers.join(', ') || 'Check PagerDuty' }}\n\n*Likely Cause:*\n{{ $('Assess Severity').item.json.message.content.parseJson().likely_cause }}\n\n*Recommended Actions:*\n{{ $('Assess Severity').item.json.message.content.parseJson().recommended_actions.map((a, i) => (i+1) + '. ' + a).join('\\n') }}\n\n*Recent Changes:*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().recent_deployments.slice(0,3).map(d => '- ' + d).join('\\n') || 'None in last 48h' }}\n\n*Resources:*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().runbook_url ? '<' + $('Parse Context (New Incident)').item.json.result.message.parseJson().runbook_url + '|Runbook>' : '' }} {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().dashboard_url ? '| <' + $('Parse Context (New Incident)').item.json.result.message.parseJson().dashboard_url + '|Dashboard>' : '' }}\n\n:pagerduty: <{{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}|View in PagerDuty>",
        "channel": "={{ $('Parse Context (New Incident)').item.json.result.message.parseJson().slack_channel || '#incidents' }}",
        "attachments": [],
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "escalate-leadership",
      "name": "Escalate to Leadership",
      "type": "n8n-nodes-base.slack",
      "position": [
        80,
        -120
      ],
      "parameters": {
        "text": "=:rotating_light::rotating_light: *INCIDENT ESCALATION*\n\n*{{ $('On PagerDuty Incident').item.json.body.event.data.title }}*\n\n*Service:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_name }} ({{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_tier }})\n*Escalation Reason:* {{ $('Assess Severity').item.json.message.content.parseJson().escalation_reason }}\n\n*Team Channel:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().slack_channel || '#incidents' }}\n*On-Call:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().on_call_engineers.join(', ') || 'Check PagerDuty' }}\n\n:pagerduty: <{{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}|View in PagerDuty>\n\n_Response team has been notified._",
        "channel": "#leadership-alerts",
        "attachments": [],
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "create-jira-incident",
      "name": "Create Jira Incident Ticket",
      "type": "n8n-nodes-base.jira",
      "position": [
        320,
        120
      ],
      "parameters": {
        "project": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Parse Context (New Incident)').item.json.result.message.parseJson().jira_project_key || 'INC' }}"
        },
        "summary": "=[INC] {{ $('On PagerDuty Incident').item.json.body.event.data.title }}",
        "resource": "issue",
        "issueType": {
          "__rl": true,
          "mode": "name",
          "value": "Bug"
        },
        "additionalFields": {
          "labels": [
            "incident",
            "pagerduty",
            "auto-generated"
          ],
          "priority": {
            "__rl": true,
            "mode": "name",
            "value": "={{ $('Assess Severity').item.json.message.content.parseJson().severity_assessment === 'critical' ? 'Highest' : ($('Assess Severity').item.json.message.content.parseJson().severity_assessment === 'high' ? 'High' : 'Medium') }}"
          },
          "description": "=*Incident Details*\n- PagerDuty ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- PagerDuty URL: {{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}\n- Created: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n- Urgency: {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n\n*Service Context*\n- Service: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_name }}\n- Tier: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_tier }}\n- On-Call: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().on_call_engineers.join(', ') }}\n- Owners: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().owners.join(', ') }}\n\n*AI Assessment*\n- Severity: {{ $('Assess Severity').item.json.message.content.parseJson().severity_assessment }}\n- Likely Cause: {{ $('Assess Severity').item.json.message.content.parseJson().likely_cause }}\n\n*Investigation Checklist*\n{{ $('Assess Severity').item.json.message.content.parseJson().investigation_checklist.map(c => '- [ ] ' + c).join('\\n') }}\n\n*Recommended Actions*\n{{ $('Assess Severity').item.json.message.content.parseJson().recommended_actions.map((a, i) => (i+1) + '. ' + a).join('\\n') }}\n\n*Recent Changes*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().recent_deployments.map(d => '- ' + d).join('\\n') || 'None' }}\n\n*Resources*\n- Runbook: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().runbook_url || 'N/A' }}\n- Dashboard: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().dashboard_url || 'N/A' }}\n\n*Past Incidents*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().past_incidents_summary || 'No similar incidents found' }}\n\n---\n_Auto-generated by n8n + Port incident workflow_"
        }
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "notify-jira-created",
      "name": "Notify Jira Created",
      "type": "n8n-nodes-base.slack",
      "position": [
        560,
        120
      ],
      "parameters": {
        "text": "=:jira: *Incident Ticket Created*\n\n{{ $json.key }}\n\nTrack investigation and resolution in Jira.",
        "channel": "={{ $('Parse Context (New Incident)').item.json.result.message.parseJson().slack_channel || '#incidents' }}",
        "attachments": [],
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "extract-context-resolved",
      "name": "Extract Context (Resolved)",
      "type": "CUSTOM.portIo",
      "position": [
        -880,
        360
      ],
      "parameters": {
        "model": "gpt-5",
        "labels": "{\n    \"source\": \"n8n-workflow\",\n    \"use_case\": \"incident-resolution-context\"\n  }",
        "prompt": "=A PagerDuty incident has been resolved.\n\nIncident Details:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('On PagerDuty Incident').item.json.body.event.data.service.name }}\n- Created At: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n- Resolved At: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at || new Date().toISOString() }}\n\nQuery the Port catalog for post-incident context.\n\nRetrieve:\n1. Service details and owners\n2. Team's Slack channel\n3. Changes made during the incident window\n4. Confluence/Notion space for post-mortems\n5. Calendar integration details for scheduling\n\nCalculate incident_duration_minutes from created_at to resolved_at.\n\nOutput as JSON:\n{\n  \"service_name\": \"\",\n  \"owners\": [],\n  \"slack_channel\": \"\",\n  \"confluence_space\": \"\",\n  \"calendar_id\": \"\",\n  \"incident_duration_minutes\": 0,\n  \"changes_during_incident\": [],\n  \"stakeholders_to_invite\": []\n}\n\nOnly include data that exists in Port.",
        "agentIdentifier": "context_retriever_agent"
      },
      "credentials": {
        "portIoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "parse-context-resolved",
      "name": "Parse Context (Resolved)",
      "type": "CUSTOM.portIo",
      "position": [
        -640,
        360
      ],
      "parameters": {
        "operation": "getInvocation",
        "invocationId": "={{ $json.invocationIdentifier }}"
      },
      "credentials": {
        "portIoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "generate-postmortem",
      "name": "Generate Post-Mortem Template",
      "type": "n8n-nodes-base.openAi",
      "position": [
        -400,
        360
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "prompt": {
          "messages": [
            {
              "content": "=Create a post-mortem document template for this resolved incident.\n\nIncident:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $json.result.message.parseJson().service_name }}\n- Duration: {{ $json.result.message.parseJson().incident_duration_minutes }} minutes\n- Created: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n- Resolved: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at }}\n\nContext:\n{{ $json.result.message }}\n\nCreate a structured post-mortem template as JSON:\n{\n  \"title\": \"Post-Mortem: [incident title]\",\n  \"summary\": \"Brief 2-3 sentence summary\",\n  \"timeline\": [\n    {\"time\": \"HH:MM\", \"event\": \"Incident detected\"},\n    {\"time\": \"HH:MM\", \"event\": \"Response initiated\"},\n    {\"time\": \"HH:MM\", \"event\": \"Root cause identified\"},\n    {\"time\": \"HH:MM\", \"event\": \"Resolution applied\"},\n    {\"time\": \"HH:MM\", \"event\": \"Incident resolved\"}\n  ],\n  \"impact\": \"Description of customer/business impact\",\n  \"root_cause_analysis\": \"[To be filled during post-mortem meeting]\",\n  \"action_items\": [\n    {\"action\": \"Suggested action 1\", \"owner\": \"TBD\", \"due_date\": \"TBD\"},\n    {\"action\": \"Suggested action 2\", \"owner\": \"TBD\", \"due_date\": \"TBD\"}\n  ],\n  \"lessons_learned\": \"[To be filled during post-mortem meeting]\",\n  \"meeting_attendees\": []\n}\n\nReturn ONLY the JSON object."
            }
          ]
        },
        "options": {},
        "resource": "chat",
        "requestOptions": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "schedule-postmortem",
      "name": "Schedule Post-Mortem via Port",
      "type": "CUSTOM.portIo",
      "position": [
        -160,
        360
      ],
      "parameters": {
        "model": "gpt-5",
        "labels": "{\n    \"source\": \"n8n-workflow\",\n    \"use_case\": \"post-mortem-scheduling\"\n  }",
        "prompt": "=An incident has been resolved and needs a post-mortem meeting scheduled.\n\nIncident Details:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().service_name }}\n- Duration: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes }} minutes\n- Resolved At: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at }}\n\nStakeholders to invite:\n{{ $('Parse Context (Resolved)').item.json.result.message.parseJson().stakeholders_to_invite.join(', ') || $('Parse Context (Resolved)').item.json.result.message.parseJson().owners.join(', ') }}\n\nPost-Mortem Template:\n{{ $('Generate Post-Mortem Template').item.json.message.content }}\n\nYour tasks:\n1. Create a post-mortem document (in Confluence/Notion if available) with the template content\n2. Schedule a post-mortem meeting for 2-3 business days from now\n3. Invite relevant stakeholders (service owners, on-call engineers who responded)\n4. Include the incident details and post-mortem document link in the meeting invite\n\nRespond with JSON:\n{\n  \"document_created\": true or false,\n  \"document_url\": \"URL if created\",\n  \"meeting_scheduled\": true or false,\n  \"meeting_time\": \"ISO timestamp\",\n  \"attendees_invited\": [],\n  \"status\": \"success|partial|failed\",\n  \"message\": \"Summary of actions taken\"\n}",
        "agentIdentifier": "post_mortem_scheduler_agent"
      },
      "credentials": {
        "portIoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "parse-schedule-response",
      "name": "Parse Schedule Response",
      "type": "CUSTOM.portIo",
      "position": [
        80,
        360
      ],
      "parameters": {
        "operation": "getInvocation",
        "invocationId": "={{ $json.invocationIdentifier }}"
      },
      "credentials": {
        "portIoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "notify-resolved",
      "name": "Notify Incident Resolved",
      "type": "n8n-nodes-base.slack",
      "position": [
        320,
        360
      ],
      "parameters": {
        "text": "=:white_check_mark: *INCIDENT RESOLVED*\n\n*{{ $('On PagerDuty Incident').item.json.body.event.data.title }}*\n\n*Service:* {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().service_name }}\n*Duration:* {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes }} minutes\n*MTTR:* {{ Math.floor($('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes / 60) }}h {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes % 60 }}m\n\n*Post-Mortem:*\n{{ $json.result.message.parseJson().document_url ? '<' + $json.result.message.parseJson().document_url + '|View Document>' : 'Document creation pending' }}\n\n*Post-Mortem Meeting:*\n{{ $json.result.message.parseJson().meeting_scheduled ? 'Scheduled for ' + $json.result.message.parseJson().meeting_time : 'Scheduling in progress' }}\n{{ $json.result.message.parseJson().attendees_invited.length > 0 ? 'Attendees: ' + $json.result.message.parseJson().attendees_invited.join(', ') : '' }}\n\n{{ $json.result.message.parseJson().message }}\n\n:pagerduty: <{{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}|View in PagerDuty>",
        "channel": "={{ $('Parse Context (Resolved)').item.json.result.message.parseJson().slack_channel || '#incidents' }}",
        "attachments": [],
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "log-mttr-port",
      "name": "Log MTTR to Port",
      "type": "CUSTOM.portIo",
      "position": [
        320,
        520
      ],
      "parameters": {
        "model": "gpt-5",
        "labels": "{\n    \"source\": \"n8n-workflow\",\n    \"use_case\": \"metrics-logging\"\n  }",
        "prompt": "=Log the incident resolution metrics to Port.\n\nIncident:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Service: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().service_name }}\n- MTTR: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes }} minutes\n- Resolved At: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at }}\n\nUpdate the service entity in Port with:\n1. Latest incident MTTR\n2. Increment incident count\n3. Update last incident timestamp\n\nRespond with JSON:\n{\n  \"metrics_logged\": true or false,\n  \"service_updated\": \"\",\n  \"message\": \"\"\n}",
        "agentIdentifier": "metrics_logger_agent"
      },
      "credentials": {
        "portIoApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-main",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        -120
      ],
      "parameters": {
        "color": 7,
        "width": 520,
        "height": 800,
        "content": "## Incident Lifecycle Management with Port\n\nComplete incident workflow from detection through resolution to post-mortem, with full organizational context from Port's catalog.\n\n### How it works\n\n**On Incident Triggered:**\n1. Receive PagerDuty webhook\n2. Query Port for service context, on-call, recent changes\n3. AI assesses severity and recommends actions\n4. Route notifications based on severity\n5. Create Jira ticket with context\n\n**On Incident Resolved:**\n1. Calculate MTTR\n2. Generate post-mortem template\n3. Port AI Agent schedules post-mortem meeting\n4. Create post-mortem document\n5. Notify team with resolution summary\n6. Log MTTR metrics to Port\n\n### Setup\n- [ ] Register for free at [Port.io](https://www.port.io)\n- [ ] Configure Port with services, on-call, and deployment history\n- [ ] Set up Port AI agents for post-mortem scheduling\n- [ ] Connect PagerDuty webhook for incident events\n- [ ] Configure Jira project for incidents\n- [ ] Set up Slack channels for alerts\n- [ ] Add OpenAI credentials\n- [ ] Test with a sample incident"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-triggered",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -920,
        -120
      ],
      "parameters": {
        "color": 4,
        "width": 840,
        "height": 320,
        "content": "## Incident Triggered Flow\n\nPort context enrichment + AI severity assessment + intelligent routing + Jira creation"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-resolved",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -920,
        280
      ],
      "parameters": {
        "color": 3,
        "width": 560,
        "height": 360,
        "content": "## Incident Resolved Flow\n\nMTTR calculation + Post-mortem generation + Port AI Agent schedules meeting + Document creation + Metrics logging"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-port-agent",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -200,
        200
      ],
      "parameters": {
        "color": 6,
        "width": 320,
        "height": 240,
        "content": "## Port AI Agent\n\nSchedules post-mortem meeting:\n- Creates document\n- Invites stakeholders\n- Sets appropriate time\n- Links to incident"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "incident-lifecycle-v2",
  "connections": {
    "Assess Severity": {
      "main": [
        [
          {
            "node": "Needs Escalation?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Event Type": {
      "main": [
        [
          {
            "node": "Extract Context (New Incident)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract Context (Resolved)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Needs Escalation?": {
      "main": [
        [
          {
            "node": "Notify Team Channel",
            "type": "main",
            "index": 0
          },
          {
            "node": "Escalate to Leadership",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Team Channel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Team Channel": {
      "main": [
        [
          {
            "node": "Create Jira Incident Ticket",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On PagerDuty Incident": {
      "main": [
        [
          {
            "node": "Check Event Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Escalate to Leadership": {
      "main": [
        [
          {
            "node": "Create Jira Incident Ticket",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Schedule Response": {
      "main": [
        [
          {
            "node": "Notify Incident Resolved",
            "type": "main",
            "index": 0
          },
          {
            "node": "Log MTTR to Port",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Context (Resolved)": {
      "main": [
        [
          {
            "node": "Generate Post-Mortem Template",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Context (Resolved)": {
      "main": [
        [
          {
            "node": "Parse Context (Resolved)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Jira Incident Ticket": {
      "main": [
        [
          {
            "node": "Notify Jira Created",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Context (New Incident)": {
      "main": [
        [
          {
            "node": "Assess Severity",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Post-Mortem Template": {
      "main": [
        [
          {
            "node": "Schedule Post-Mortem via Port",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Post-Mortem via Port": {
      "main": [
        [
          {
            "node": "Parse Schedule Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Context (New Incident)": {
      "main": [
        [
          {
            "node": "Parse Context (New Incident)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}