{"id":"gNbN6yVeVzGN6aTyLh1ha","meta":{"instanceId":"b91e510ebae4127f953fd2f5f8d40d58ca1e71c746d4500c12ae86aad04c1502"},"name":"Smart Public Consultation Analysis and Governance Coordination System","tags":[],"nodes":[{"id":"3968902b-1eed-41f5-956a-a1825d14e7e0","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-2640,192],"parameters":{"rule":{"interval":[{}]}},"typeVersion":1.3},{"id":"afc856df-dd03-49af-99d8-35faf562688e","name":"Workflow Configuration","type":"n8n-nodes-base.set","position":[-2416,192],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"consultationApiUrl","type":"string","value":"<__PLACEHOLDER_VALUE__Consultation API endpoint URL__>"},{"id":"id-2","name":"biasThreshold","type":"number","value":0.7},{"id":"id-3","name":"criticalEscalationThreshold","type":"number","value":0.8},{"id":"id-4","name":"standardReportThreshold","type":"number","value":0.5},{"id":"id-5","name":"traceabilityStorageUrl","type":"string","value":"<__PLACEHOLDER_VALUE__Traceability storage API endpoint__>"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"aad1dc82-401c-48f0-8aa4-44614c5d443b","name":"Fetch Consultation Data","type":"n8n-nodes-base.httpRequest","position":[-2192,192],"parameters":{"url":"={{ $('Workflow Configuration').first().json.consultationApiUrl }}","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.3},{"id":"f41fd7b2-ae59-4c64-9dc3-702be79246d0","name":"Split Submissions","type":"n8n-nodes-base.splitOut","position":[-1968,192],"parameters":{"include":"allOtherFields","options":{},"fieldToSplitOut":"submissions"},"typeVersion":1},{"id":"6f717f69-1a55-47f2-a8b1-ebacdb1d3c90","name":"Anthropic Model - Analysis","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[-1736,416],"parameters":{"model":{"__rl":true,"mode":"list","value":"claude-sonnet-4-5-20250929","cachedResultName":"Claude Sonnet 4.5"},"options":{}},"credentials":{"anthropicApi":{"id":"S8laStQPC1u3EYuZ","name":"Anthropic account"}},"typeVersion":1.3},{"id":"7f257eb3-7e4d-412d-841e-9dea26d7ec68","name":"Analysis Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[-1608,416],"parameters":{"jsonSchemaExample":"{\n  \"submissionId\": \"string\",\n  \"sentiment\": \"positive | neutral | negative | mixed\",\n  \"keyThemes\": [\"string\"],\n  \"stakeholderType\": \"individual | organization | government | advocacy_group\",\n  \"urgencyLevel\": \"low | medium | high | critical\",\n  \"policyRelevance\": \"number between 0 and 1\",\n  \"evidenceQuality\": \"low | medium | high\",\n  \"geographicScope\": \"local | regional | national | international\",\n  \"impactedPopulation\": \"string\",\n  \"recommendations\": [\"string\"],\n  \"concerns\": [\"string\"],\n  \"supportingData\": \"boolean\",\n  \"conflictingViews\": \"boolean\"\n}"},"typeVersion":1.3},{"id":"d2370967-ce59-45b9-9a9c-0b39e381ebae","name":"Consultation Analysis Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[-1744,192],"parameters":{"text":"={{ $json.submissionText || $json.content }}","options":{"systemMessage":"=You are a Consultation Analysis Agent specialized in evaluating public feedback and consultation submissions.\n\nYour task is to:\n1. Analyze the structured submission content for sentiment, themes, and stakeholder perspectives\n2. Identify key policy-relevant insights without making policy recommendations\n3. Assess the quality and credibility of evidence provided\n4. Categorize stakeholder type and geographic scope\n5. Evaluate urgency and potential impact on affected populations\n6. Extract specific concerns and recommendations made by the submitter\n7. Identify any conflicting views or supporting data\n8. Rate policy relevance on a scale of 0 to 1\n\nIMPORTANT CONSTRAINTS:\n- You analyze and categorize feedback objectively\n- You DO NOT make policy recommendations\n- You DO NOT evaluate the merit of policy positions\n- You DO NOT influence substantive policy outcomes\n- You focus on extracting, structuring, and categorizing information\n\nSubmission metadata available:\n- Submission ID: {{ $json.submissionId || \"N/A\" }}\n- Submitter type: {{ $json.submitterType || \"N/A\" }}\n- Submission date: {{ $json.submissionDate || \"N/A\" }}\n- Geographic location: {{ $json.location || \"N/A\" }}\n\nReturn your analysis in the structured format defined by the output parser."},"promptType":"define","hasOutputParser":true},"typeVersion":3.1},{"id":"83c3acce-71cd-44c4-8873-ac7652ea146d","name":"Aggregate Analysis Results","type":"n8n-nodes-base.aggregate","position":[-1392,192],"parameters":{"options":{},"aggregate":"aggregateAllItemData"},"typeVersion":1},{"id":"7c62fe35-8a52-4b63-9d96-e2bb8c9cb125","name":"Anthropic Model - Governance","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[-1168,416],"parameters":{"model":{"__rl":true,"mode":"list","value":"claude-sonnet-4-5-20250929","cachedResultName":"Claude Sonnet 4.5"},"options":{}},"credentials":{"anthropicApi":{"id":"S8laStQPC1u3EYuZ","name":"Anthropic account"}},"typeVersion":1.3},{"id":"0880ee7c-c9e2-465c-9380-4624d55ea800","name":"Bias Detection Tool","type":"@n8n/n8n-nodes-langchain.toolCode","position":[-1040,416],"parameters":{"jsCode":"// Bias Detection Tool for Consultation Analysis\n// Analyzes aggregated consultation data for various types of bias\n\nconst analysisData = JSON.parse(query);\nconst data = analysisData.data || analysisData;\n\n// Initialize bias detection results\nconst biasResults = {\n  biasDetected: false,\n  biasScore: 0,\n  biasDetails: [],\n  demographicBias: { detected: false, score: 0, details: [] },\n  geographicBias: { detected: false, score: 0, details: [] },\n  stakeholderBias: { detected: false, score: 0, details: [] },\n  temporalBias: { detected: false, score: 0, details: [] }\n};\n\n// Helper function to calculate distribution variance\nfunction calculateVariance(distribution) {\n  const values = Object.values(distribution);\n  const mean = values.reduce((a, b) => a + b, 0) / values.length;\n  const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / values.length;\n  return Math.sqrt(variance) / mean; // Coefficient of variation\n}\n\n// 1. Demographic Bias Detection\nconst stakeholderTypes = {};\ndata.forEach(item => {\n  const type = item.stakeholderType || 'unknown';\n  stakeholderTypes[type] = (stakeholderTypes[type] || 0) + 1;\n});\n\nconst totalSubmissions = data.length;\nconst stakeholderVariance = calculateVariance(stakeholderTypes);\n\nif (stakeholderVariance > 0.7) {\n  biasResults.demographicBias.detected = true;\n  biasResults.demographicBias.score = Math.min(stakeholderVariance, 1);\n  biasResults.demographicBias.details.push(\n    `Significant stakeholder imbalance detected. Distribution: ${JSON.stringify(stakeholderTypes)}`\n  );\n}\n\n// Check for over-representation\nfor (const [type, count] of Object.entries(stakeholderTypes)) {\n  const percentage = (count / totalSubmissions) * 100;\n  if (percentage > 60) {\n    biasResults.demographicBias.detected = true;\n    biasResults.demographicBias.score = Math.max(biasResults.demographicBias.score, percentage / 100);\n    biasResults.demographicBias.details.push(\n      `Over-representation of ${type}: ${percentage.toFixed(1)}% of submissions`\n    );\n  }\n}\n\n// 2. Geographic Bias Detection\nconst geographicScopes = {};\ndata.forEach(item => {\n  const scope = item.geographicScope || 'unknown';\n  geographicScopes[scope] = (geographicScopes[scope] || 0) + 1;\n});\n\nconst geoVariance = calculateVariance(geographicScopes);\n\nif (geoVariance > 0.6) {\n  biasResults.geographicBias.detected = true;\n  biasResults.geographicBias.score = Math.min(geoVariance, 1);\n  biasResults.geographicBias.details.push(\n    `Geographic representation imbalance. Distribution: ${JSON.stringify(geographicScopes)}`\n  );\n}\n\n// 3. Stakeholder Representation Bias\nconst urgencyLevels = {};\ndata.forEach(item => {\n  const urgency = item.urgencyLevel || 'unknown';\n  urgencyLevels[urgency] = (urgencyLevels[urgency] || 0) + 1;\n});\n\nconst criticalCount = urgencyLevels.critical || 0;\nconst criticalPercentage = (criticalCount / totalSubmissions) * 100;\n\nif (criticalPercentage > 40) {\n  biasResults.stakeholderBias.detected = true;\n  biasResults.stakeholderBias.score = criticalPercentage / 100;\n  biasResults.stakeholderBias.details.push(\n    `High proportion of critical urgency submissions (${criticalPercentage.toFixed(1)}%) may indicate coordinated campaign or crisis response`\n  );\n}\n\n// Check for evidence quality bias\nconst evidenceQuality = {};\ndata.forEach(item => {\n  const quality = item.evidenceQuality || 'unknown';\n  evidenceQuality[quality] = (evidenceQuality[quality] || 0) + 1;\n});\n\nconst lowEvidencePercentage = ((evidenceQuality.low || 0) / totalSubmissions) * 100;\nif (lowEvidencePercentage > 50) {\n  biasResults.stakeholderBias.detected = true;\n  biasResults.stakeholderBias.score = Math.max(biasResults.stakeholderBias.score, lowEvidencePercentage / 100);\n  biasResults.stakeholderBias.details.push(\n    `High proportion of low-evidence submissions (${lowEvidencePercentage.toFixed(1)}%)`\n  );\n}\n\n// 4. Temporal Bias Detection (if submission dates available)\nconst submissionDates = data.filter(item => item.submissionDate).map(item => new Date(item.submissionDate));\n\nif (submissionDates.length > 0) {\n  submissionDates.sort((a, b) => a - b);\n  const firstDate = submissionDates[0];\n  const lastDate = submissionDates[submissionDates.length - 1];\n  const totalDays = (lastDate - firstDate) / (1000 * 60 * 60 * 24);\n  \n  // Check for clustering (>50% of submissions in <20% of time period)\n  const midpoint = new Date(firstDate.getTime() + (lastDate - firstDate) / 5);\n  const earlySubmissions = submissionDates.filter(d => d <= midpoint).length;\n  const earlyPercentage = (earlySubmissions / submissionDates.length) * 100;\n  \n  if (earlyPercentage > 50) {\n    biasResults.temporalBias.detected = true;\n    biasResults.temporalBias.score = earlyPercentage / 100;\n    biasResults.temporalBias.details.push(\n      `Temporal clustering detected: ${earlyPercentage.toFixed(1)}% of submissions in first 20% of consultation period`\n    );\n  }\n}\n\n// Calculate overall bias score (weighted average)\nconst weights = { demographic: 0.3, geographic: 0.25, stakeholder: 0.3, temporal: 0.15 };\nbiasResults.biasScore = \n  (biasResults.demographicBias.score * weights.demographic) +\n  (biasResults.geographicBias.score * weights.geographic) +\n  (biasResults.stakeholderBias.score * weights.stakeholder) +\n  (biasResults.temporalBias.score * weights.temporal);\n\n// Determine if bias is detected (threshold: 0.4)\nbiasResults.biasDetected = biasResults.biasScore > 0.4;\n\n// Compile all bias details\nif (biasResults.demographicBias.detected) {\n  biasResults.biasDetails.push(...biasResults.demographicBias.details);\n}\nif (biasResults.geographicBias.detected) {\n  biasResults.biasDetails.push(...biasResults.geographicBias.details);\n}\nif (biasResults.stakeholderBias.detected) {\n  biasResults.biasDetails.push(...biasResults.stakeholderBias.details);\n}\nif (biasResults.temporalBias.detected) {\n  biasResults.biasDetails.push(...biasResults.temporalBias.details);\n}\n\nif (!biasResults.biasDetected) {\n  biasResults.biasDetails.push('No significant bias detected in consultation data');\n}\n\n// Return results as JSON string\nreturn JSON.stringify(biasResults, null, 2);","description":"Detects potential bias in consultation analysis including demographic bias, geographic bias, stakeholder representation bias, and temporal bias"},"typeVersion":1.3},{"id":"6085ef06-fe04-4786-a686-f26c73198909","name":"Traceability Record Tool","type":"@n8n/n8n-nodes-langchain.toolCode","position":[-912,416],"parameters":{"jsCode":"// Parse the input query which should contain governance metadata\nconst metadata = typeof query === 'string' ? JSON.parse(query) : query;\n\n// Generate a unique traceability record ID\nconst recordId = `trace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n// Create comprehensive traceability record\nconst traceabilityRecord = {\n  recordId: recordId,\n  timestamp: new Date().toISOString(),\n  recordType: 'consultation_analysis_governance',\n  \n  // Analysis metadata\n  analysisMetadata: {\n    totalSubmissions: metadata.totalSubmissions || 0,\n    analysisDate: metadata.analysisDate || new Date().toISOString(),\n    analysisAgent: 'Consultation Analysis Agent',\n    governanceAgent: 'Decision Governance Agent'\n  },\n  \n  // Decision points\n  decisionPoints: {\n    governanceDecision: metadata.governanceDecision || 'unknown',\n    escalationLevel: metadata.escalationLevel || 'routine',\n    escalationReason: metadata.escalationReason || 'N/A',\n    biasDetected: metadata.biasDetected || false,\n    biasScore: metadata.biasScore || 0,\n    confidenceScore: metadata.confidenceScore || 0\n  },\n  \n  // Data lineage\n  dataLineage: {\n    sourceNode: 'Fetch Consultation Data',\n    processingNodes: [\n      'Split Submissions',\n      'Consultation Analysis Agent',\n      'Aggregate Analysis Results',\n      'Decision Governance Agent'\n    ],\n    outputDestination: 'Store Traceability Records',\n    dataTransformations: [\n      'Individual submission analysis',\n      'Sentiment and theme extraction',\n      'Aggregation of results',\n      'Bias detection',\n      'Governance decision'\n    ]\n  },\n  \n  // Governance actions\n  governanceActions: {\n    summaryGenerated: metadata.summaryGenerated || false,\n    traceabilityRecordCreated: true,\n    recommendedActions: metadata.recommendedActions || [],\n    stakeholdersToNotify: metadata.stakeholdersToNotify || [],\n    timelineForResponse: metadata.timelineForResponse || 'N/A',\n    governanceNotes: metadata.governanceNotes || ''\n  },\n  \n  // Audit trail\n  auditTrail: {\n    workflowExecutionId: $execution.id || 'unknown',\n    workflowName: 'Public Consultation Analysis and Governance Coordination System',\n    executionMode: $execution.mode || 'unknown',\n    createdBy: 'system',\n    recordStatus: 'active',\n    retentionPeriod: '7_years',\n    complianceFlags: {\n      transparencyCompliant: true,\n      accountabilityCompliant: true,\n      dataProtectionCompliant: true\n    }\n  }\n};\n\n// Return the traceability record as a JSON string\nreturn JSON.stringify(traceabilityRecord, null, 2);","description":"Creates comprehensive traceability records for audit trails including analysis metadata, decision points, data lineage, and governance actions"},"typeVersion":1.3},{"id":"6ce6d045-e433-4d5a-983b-03168843d490","name":"Summary Generation Tool","type":"@n8n/n8n-nodes-langchain.toolCode","position":[-784,416],"parameters":{"jsCode":"// Summary Generation Tool\n// Generates executive summaries, thematic summaries, and statistical summaries\n\nconst analysisData = JSON.parse(query);\n\n// Extract key statistics\nconst totalSubmissions = analysisData.data ? analysisData.data.length : 0;\nconst sentimentCounts = {};\nconst urgencyCounts = {};\nconst stakeholderCounts = {};\nconst themeFrequency = {};\n\nif (analysisData.data) {\n  analysisData.data.forEach(item => {\n    // Count sentiments\n    const sentiment = item.sentiment || 'unknown';\n    sentimentCounts[sentiment] = (sentimentCounts[sentiment] || 0) + 1;\n    \n    // Count urgency levels\n    const urgency = item.urgencyLevel || 'unknown';\n    urgencyCounts[urgency] = (urgencyCounts[urgency] || 0) + 1;\n    \n    // Count stakeholder types\n    const stakeholder = item.stakeholderType || 'unknown';\n    stakeholderCounts[stakeholder] = (stakeholderCounts[stakeholder] || 0) + 1;\n    \n    // Count themes\n    if (item.keyThemes && Array.isArray(item.keyThemes)) {\n      item.keyThemes.forEach(theme => {\n        themeFrequency[theme] = (themeFrequency[theme] || 0) + 1;\n      });\n    }\n  });\n}\n\n// Get top themes\nconst topThemes = Object.entries(themeFrequency)\n  .sort((a, b) => b[1] - a[1])\n  .slice(0, 5)\n  .map(([theme, count]) => `${theme} (${count} mentions)`);\n\n// Calculate average policy relevance\nlet avgPolicyRelevance = 0;\nif (analysisData.data && analysisData.data.length > 0) {\n  const relevanceSum = analysisData.data.reduce((sum, item) => {\n    return sum + (item.policyRelevance || 0);\n  }, 0);\n  avgPolicyRelevance = (relevanceSum / analysisData.data.length).toFixed(2);\n}\n\n// Generate executive summary\nconst executiveSummary = `\nEXECUTIVE SUMMARY\n=================\n\nTotal Submissions Analyzed: ${totalSubmissions}\n\nSENTIMENT DISTRIBUTION:\n${Object.entries(sentimentCounts).map(([k, v]) => `  - ${k}: ${v} (${((v/totalSubmissions)*100).toFixed(1)}%)`).join('\\n')}\n\nURGENCY LEVELS:\n${Object.entries(urgencyCounts).map(([k, v]) => `  - ${k}: ${v} (${((v/totalSubmissions)*100).toFixed(1)}%)`).join('\\n')}\n\nSTAKEHOLDER BREAKDOWN:\n${Object.entries(stakeholderCounts).map(([k, v]) => `  - ${k}: ${v} (${((v/totalSubmissions)*100).toFixed(1)}%)`).join('\\n')}\n\nTOP THEMES:\n${topThemes.map((theme, i) => `  ${i+1}. ${theme}`).join('\\n')}\n\nAVERAGE POLICY RELEVANCE: ${avgPolicyRelevance}/1.0\n\nKEY INSIGHTS:\n- ${urgencyCounts.critical || 0} submissions flagged as CRITICAL urgency\n- ${urgencyCounts.high || 0} submissions flagged as HIGH urgency\n- Dominant sentiment: ${Object.entries(sentimentCounts).sort((a,b) => b[1] - a[1])[0]?.[0] || 'N/A'}\n- Primary stakeholder group: ${Object.entries(stakeholderCounts).sort((a,b) => b[1] - a[1])[0]?.[0] || 'N/A'}\n\nThis summary provides an objective overview of consultation submissions for governance coordination purposes only.\n`;\n\nreturn executiveSummary;","description":"Generates executive summaries, thematic summaries, and statistical summaries of consultation analysis for policymakers"},"typeVersion":1.3},{"id":"010dd035-96fd-4c72-8656-a135e51834ec","name":"Governance Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[-656,416],"parameters":{"jsonSchemaExample":"{\n  \"governanceDecision\": \"proceed | review_required | escalate | hold\",\n  \"escalationLevel\": \"routine | standard | critical\",\n  \"escalationReason\": \"string\",\n  \"biasDetected\": \"boolean\",\n  \"biasScore\": \"number between 0 and 1\",\n  \"biasDetails\": [\"string\"],\n  \"summaryGenerated\": \"boolean\",\n  \"traceabilityRecordCreated\": \"boolean\",\n  \"recommendedActions\": [\"string\"],\n  \"stakeholdersToNotify\": [\"string\"],\n  \"timelineForResponse\": \"immediate | 24_hours | 7_days | 30_days\",\n  \"confidenceScore\": \"number between 0 and 1\",\n  \"governanceNotes\": \"string\"\n}"},"typeVersion":1.3},{"id":"d2c71d38-5d2d-4459-beb1-aecb24ca8bf8","name":"Decision Governance Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[-984,192],"parameters":{"text":"={{ JSON.stringify($json) }}","options":{"systemMessage":"=You are a Decision Governance Agent responsible for coordinating consultation analysis governance without influencing substantive policy outcomes.\n\nYour task is to:\n1. Review aggregated consultation analysis results\n2. Coordinate bias detection checks using the Bias Detection Tool\n3. Generate executive summaries using the Summary Generation Tool\n4. Create traceability records using the Traceability Record Tool\n5. Determine appropriate escalation levels based on urgency, bias, and impact\n6. Identify stakeholders who need to be notified\n7. Recommend governance actions (NOT policy actions)\n8. Ensure transparency and accountability in the consultation process\n\nCRITICAL CONSTRAINTS:\n- You coordinate governance processes ONLY\n- You DO NOT make policy recommendations\n- You DO NOT evaluate the merit of policy positions\n- You DO NOT influence substantive policy outcomes\n- You focus on process integrity, transparency, and appropriate escalation\n\nEscalation criteria:\n- CRITICAL: Bias score > 0.7, or >50 critical urgency submissions, or significant stakeholder representation issues\n- STANDARD: Bias score 0.4-0.7, or 20-50 high urgency submissions, or moderate concerns\n- ROUTINE: Bias score < 0.4, standard consultation processing\n\nWorkflow:\n1. First, call the Bias Detection Tool with the aggregated analysis data\n2. Then, call the Summary Generation Tool with the aggregated analysis data\n3. Then, call the Traceability Record Tool with governance metadata\n4. Finally, determine escalation level and recommended governance actions\n\nConfiguration thresholds:\n- Bias threshold: {{ $('Workflow Configuration').first().json.biasThreshold }}\n- Critical escalation threshold: {{ $('Workflow Configuration').first().json.criticalEscalationThreshold }}\n- Standard report threshold: {{ $('Workflow Configuration').first().json.standardReportThreshold }}\n\nReturn your governance decision in the structured format defined by the output parser."},"promptType":"define","hasOutputParser":true},"typeVersion":3.1},{"id":"534ba87d-c430-49a1-82ca-8561e37fa2e9","name":"Route by Escalation Level","type":"n8n-nodes-base.switch","position":[16,368],"parameters":{"rules":{"values":[{"outputKey":"Critical","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.escalationLevel }}","rightValue":"critical"}]},"renameOutput":true},{"outputKey":"Standard","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.escalationLevel }}","rightValue":"standard"}]},"renameOutput":true},{"outputKey":"Routine","conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.escalationLevel }}","rightValue":"routine"}]},"renameOutput":true}]},"options":{}},"typeVersion":3.4},{"id":"143edb23-ebb6-48e8-8b3d-33fa0408f5b9","name":"Prepare Critical Escalation","type":"n8n-nodes-base.set","position":[240,192],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"escalationType","type":"string","value":"critical"},{"id":"id-2","name":"notificationPriority","type":"string","value":"immediate"},{"id":"id-3","name":"recipientGroup","type":"string","value":"senior_policymakers"},{"id":"id-4","name":"subject","type":"string","value":"CRITICAL: Public Consultation Governance Alert"},{"id":"id-5","name":"messageBody","type":"string","value":"=Critical escalation required for consultation analysis.\n\nEscalation Reason: {{ $json.escalationReason }}\n\nBias Score: {{ $json.biasScore }}\n\nRecommended Actions: {{ JSON.stringify($json.recommendedActions) }}\n\nTimeline: {{ $json.timelineForResponse }}\n\nGovernance Notes: {{ $json.governanceNotes }}"},{"id":"id-6","name":"escalationTimestamp","type":"string","value":"={{ $now.toISO() }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"c0eba31a-d002-495e-9cd1-9eb9ece14be8","name":"Prepare Standard Report","type":"n8n-nodes-base.set","position":[240,384],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"escalationType","type":"string","value":"standard"},{"id":"id-2","name":"notificationPriority","type":"string","value":"24_hours"},{"id":"id-3","name":"recipientGroup","type":"string","value":"policy_team"},{"id":"id-4","name":"subject","type":"string","value":"Public Consultation Analysis Report - Review Required"},{"id":"id-5","name":"messageBody","type":"string","value":"=Standard consultation analysis report ready for review.\n\nEscalation Reason: {{ $json.escalationReason }}\n\nBias Score: {{ $json.biasScore }}\n\nRecommended Actions: {{ JSON.stringify($json.recommendedActions) }}\n\nTimeline: {{ $json.timelineForResponse }}"},{"id":"id-6","name":"reportTimestamp","type":"string","value":"={{ $now.toISO() }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"71e47d30-8ff9-4a88-aac2-5a5e32533561","name":"Prepare Routine Update","type":"n8n-nodes-base.set","position":[240,576],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"escalationType","type":"string","value":"routine"},{"id":"id-2","name":"notificationPriority","type":"string","value":"7_days"},{"id":"id-3","name":"recipientGroup","type":"string","value":"consultation_team"},{"id":"id-4","name":"subject","type":"string","value":"Routine Public Consultation Update"},{"id":"id-5","name":"messageBody","type":"string","value":"=Routine consultation analysis completed.\n\nSummary available for review.\n\nBias Score: {{ $json.biasScore }}\n\nNo immediate action required."},{"id":"id-6","name":"updateTimestamp","type":"string","value":"={{ $now.toISO() }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"0f90afab-2034-47ac-a859-a97bd40a898d","name":"Store Traceability Records","type":"n8n-nodes-base.code","position":[688,384],"parameters":{"jsCode":"// Consolidate and store traceability records for all escalation paths\n// This creates a comprehensive audit trail for governance decisions\n\nconst items = $input.all();\nconst traceabilityRecords = [];\n\n// Process each escalation path item\nfor (const item of items) {\n  const record = {\n    // Core identification\n    recordId: `trace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n    timestamp: new Date().toISOString(),\n    \n    // Escalation metadata\n    escalationType: item.json.escalationType || 'unknown',\n    escalationLevel: item.json.escalationLevel || 'routine',\n    escalationReason: item.json.escalationReason || 'N/A',\n    \n    // Governance decision details\n    governanceDecision: item.json.governanceDecision || 'N/A',\n    confidenceScore: item.json.confidenceScore || 0,\n    governanceNotes: item.json.governanceNotes || '',\n    \n    // Bias detection results\n    biasDetected: item.json.biasDetected || false,\n    biasScore: item.json.biasScore || 0,\n    biasDetails: item.json.biasDetails || [],\n    biasAlertFlag: item.json.biasAlertFlag || false,\n    \n    // Notification and action tracking\n    notificationPriority: item.json.notificationPriority || 'routine',\n    recipientGroup: item.json.recipientGroup || 'consultation_team',\n    stakeholdersToNotify: item.json.stakeholdersToNotify || [],\n    recommendedActions: item.json.recommendedActions || [],\n    timelineForResponse: item.json.timelineForResponse || '7_days',\n    \n    // Summary and reporting\n    summaryGenerated: item.json.summaryGenerated || false,\n    traceabilityRecordCreated: true,\n    \n    // Audit trail metadata\n    workflowExecutionId: $execution.id,\n    workflowName: $workflow.name,\n    nodeExecutionTime: new Date().toISOString(),\n    \n    // Full data snapshot for audit purposes\n    fullDataSnapshot: item.json\n  };\n  \n  traceabilityRecords.push(record);\n}\n\n// Prepare consolidated output\nconst consolidatedOutput = {\n  totalRecords: traceabilityRecords.length,\n  recordsCreated: new Date().toISOString(),\n  executionId: $execution.id,\n  workflowName: $workflow.name,\n  traceabilityRecords: traceabilityRecords,\n  \n  // Summary statistics\n  summary: {\n    criticalEscalations: traceabilityRecords.filter(r => r.escalationType === 'critical').length,\n    standardReports: traceabilityRecords.filter(r => r.escalationType === 'standard').length,\n    routineUpdates: traceabilityRecords.filter(r => r.escalationType === 'routine').length,\n    biasAlertsTriggered: traceabilityRecords.filter(r => r.biasAlertFlag === true).length,\n    averageBiasScore: traceabilityRecords.reduce((sum, r) => sum + (r.biasScore || 0), 0) / traceabilityRecords.length,\n    averageConfidenceScore: traceabilityRecords.reduce((sum, r) => sum + (r.confidenceScore || 0), 0) / traceabilityRecords.length\n  },\n  \n  // Storage metadata\n  storageUrl: $('Workflow Configuration').first().json.traceabilityStorageUrl || '<PLACEHOLDER>',\n  storageStatus: 'pending_api_call',\n  storageNote: 'Records prepared for storage. Implement HTTP Request to storage API endpoint.'\n};\n\n// Return consolidated traceability records\nreturn [consolidatedOutput];"},"typeVersion":2},{"id":"381c9200-224c-4301-8db7-6d27fd96f28d","name":"Check for Bias Flags","type":"n8n-nodes-base.if","position":[-448,192],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"id-1","operator":{"type":"boolean","operation":"equals"},"leftValue":"={{ $('Decision Governance Agent').item.json.biasDetected }}","rightValue":"true"}]}},"typeVersion":2.3},{"id":"c48375db-44bb-4ce2-9fc8-98e8ef0117a7","name":"Flag Bias Alert","type":"n8n-nodes-base.set","position":[-208,464],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"biasAlertFlag","type":"boolean","value":true},{"id":"id-2","name":"biasScore","type":"number","value":"={{ $json.biasScore }}"},{"id":"id-3","name":"biasDetails","type":"object","value":"={{ JSON.stringify($json.biasDetails) }}"},{"id":"id-4","name":"alertTimestamp","type":"string","value":"={{ $now.toISO() }}"},{"id":"id-5","name":"requiresReview","type":"boolean","value":true}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"da89bb9e-c9f3-4d5e-932c-a53f1c2f2949","name":"Merge Escalation Paths","type":"n8n-nodes-base.merge","position":[464,368],"parameters":{"numberInputs":3},"typeVersion":3.2},{"id":"d86d15bf-1417-4830-952e-ceda3549268d","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2672,48],"parameters":{"color":7,"width":1408,"height":592,"content":"## Automated Data Collection & Dual-Agent Validation\n**What**: Compliance Analyzer validates regulatory requirements; Decision Agent coordinates specialized ESG sub-agents  \n**Why**: Parallel compliance checking and data quality analysis ensures accuracy across multiple reporting frameworks"},"typeVersion":1},{"id":"d1dedf76-3e3b-41eb-978f-66d584a1640c","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1424,-320],"parameters":{"color":6,"width":544,"height":336,"content":"## Prerequisites\nESG data management system access, AI service accounts\n## Use Cases\nCarbon emissions tracking and reporting, supply chain sustainability monitoring\n## Customization\nModify agent prompts for industry-specific materiality topics\n## Benefits\nReduces reporting cycle time by 90%, ensures multi-framework compliance simultaneously"},"typeVersion":1},{"id":"47dbe518-eb27-4882-8174-a2a9c6f36a62","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1888,-256],"parameters":{"width":400,"height":288,"content":"## Setup Steps\n1. Connect **Schedule Trigger** for monitoring frequency \n2. Configure **ESG data sources** with API credentials\n3. Add **AI model API keys** to Compliance Analyzer and Decision Coordination Agent nodes\n4. Define **reporting frameworks** and compliance requirements in agent prompts\n5. Set **quality rating thresholds** for data completeness and materiality scoring parameters\n6. Configure **alert mechanisms** for critical compliance gaps requiring immediate remediation"},"typeVersion":1},{"id":"31008958-d5e6-4e4a-aa00-a0f3280a5dfc","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-2640,-336],"parameters":{"width":704,"height":352,"content":"## How It Works\nThis workflow automates environmental, social, and governance (ESG) data collection, compliance validation, and sustainability reporting for corporations managing complex regulatory requirements and stakeholder transparency expectations. Designed for sustainability officers, compliance teams, and investor relations departments, it solves the challenge of aggregating ESG metrics across global operations, validating data accuracy, and generating standardized reports for multiple frameworks. The system schedules regular monitoring, fetches consolidated ESG data from operational systems, generates S&D (sustainability and disclosure) submissions, validates compliance through dual AI agents (Compliance Analyzer ensures regulatory adherence, Decision Coordination orchestrates specialized sub-agents for aggregate analysis, traceability monitoring, summary generation, and governance reporting), checks star ratings for data quality, routes findings by compliance status (critical/routine), and produces standardized reports with traceability records. Organizations achieve 90% reduction in reporting cycle time, ensure multi-framework compliance, eliminate manual data aggregation errors, and maintain complete audit trails for regulatory scrutiny."},"typeVersion":1},{"id":"ece6cb40-4c40-4122-af8d-0ff657eca936","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-1248,64],"parameters":{"color":7,"width":928,"height":528,"content":"## Quality Rating Assessment\n**What**: Checks ESG data completeness and reliability scores against established quality thresholds  \n**Why**: Quality-based filtering identifies data gaps requiring remediation before regulatory submission deadlines"},"typeVersion":1},{"id":"90b478c1-5329-40d8-8253-4cf93b36eeba","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-288,64],"parameters":{"color":7,"width":1152,"height":720,"content":"## Intelligent Report Generation\n**What**: Routes by status—critical issues trigger immediate alerts, routine generates standard reports with traceability  \n**Why**: Risk-based workflows ensure compliance violations receive urgent attention while automating routine disclosures"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"availableInMCP":false,"executionOrder":"v1"},"versionId":"fd0e1115-084f-4cd2-ad2e-dfec2e7411b9","connections":{"Flag Bias Alert":{"main":[[{"node":"Route by Escalation Level","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Workflow Configuration","type":"main","index":0}]]},"Split Submissions":{"main":[[{"node":"Consultation Analysis Agent","type":"main","index":0}]]},"Bias Detection Tool":{"ai_tool":[[{"node":"Decision Governance Agent","type":"ai_tool","index":0}]]},"Check for Bias Flags":{"main":[[{"node":"Flag Bias Alert","type":"main","index":0}],[{"node":"Route by Escalation Level","type":"main","index":0}]]},"Analysis Output Parser":{"ai_outputParser":[[{"node":"Consultation Analysis Agent","type":"ai_outputParser","index":0}]]},"Merge Escalation Paths":{"main":[[{"node":"Store Traceability Records","type":"main","index":0}]]},"Prepare Routine Update":{"main":[[{"node":"Merge Escalation Paths","type":"main","index":0}]]},"Workflow Configuration":{"main":[[{"node":"Fetch Consultation Data","type":"main","index":0}]]},"Fetch Consultation Data":{"main":[[{"node":"Split Submissions","type":"main","index":0}]]},"Prepare Standard Report":{"main":[[{"node":"Merge Escalation Paths","type":"main","index":0}]]},"Summary Generation Tool":{"ai_tool":[[{"node":"Decision Governance Agent","type":"ai_tool","index":0}]]},"Governance Output Parser":{"ai_outputParser":[[{"node":"Decision Governance Agent","type":"ai_outputParser","index":0}]]},"Traceability Record Tool":{"ai_tool":[[{"node":"Decision Governance Agent","type":"ai_tool","index":0}]]},"Decision Governance Agent":{"main":[[{"node":"Check for Bias Flags","type":"main","index":0}]]},"Route by Escalation Level":{"main":[[{"node":"Prepare Critical Escalation","type":"main","index":0}],[{"node":"Prepare Standard Report","type":"main","index":0}],[{"node":"Prepare Routine Update","type":"main","index":0}]]},"Aggregate Analysis Results":{"main":[[{"node":"Decision Governance Agent","type":"main","index":0}]]},"Anthropic Model - Analysis":{"ai_languageModel":[[{"node":"Consultation Analysis Agent","type":"ai_languageModel","index":0}]]},"Consultation Analysis Agent":{"main":[[{"node":"Aggregate Analysis Results","type":"main","index":0}]]},"Prepare Critical Escalation":{"main":[[{"node":"Merge Escalation Paths","type":"main","index":0}]]},"Anthropic Model - Governance":{"ai_languageModel":[[{"node":"Decision Governance Agent","type":"ai_languageModel","index":0}]]}}}