{"record":{"id":"ff3b99baae6078e5","repo":"n8n-io/n8n","slug":"unimplemented-ff3b99","errorCode":"unimplemented","errorMessage":"unimplemented","messagePattern":"unimplemented","errorType":"http","errorClass":null,"httpStatus":501,"severity":"error","filePath":"packages/@n8n/engine/src/server/routes/workflow-executions.ts","lineNumber":79,"sourceCode":"\t\t\t\tdetails: parsed.error.flatten(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await startExecution.start(parsed.data);\n\t\t\tres.status(201).json(result);\n\t\t} catch (error) {\n\t\t\tif (error instanceof AdmittanceRejectedError) {\n\t\t\t\tres.status(429).json({ error: 'admittance_rejected', reason: error.reason });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (error instanceof GraphValidationError) {\n\t\t\t\tres.status(400).json({ error: 'invalid_graph', reason: error.message });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (error instanceof UnimplementedError) {\n\t\t\t\tres.status(501).json({ error: 'unimplemented', reason: error.message });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t});\n\n\treturn router;\n}\n","sourceCodeStart":61,"sourceCodeEnd":88,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/engine/src/server/routes/workflow-executions.ts#L61-L88","documentation":"Returned as HTTP 501 {error:'unimplemented', reason:...} when startExecution.start() throws UnimplementedError. validateExecutableGraph() throws this for graph shapes the engine does not support yet: back-edges/loops (CAT-2875), multi-slot outputs (CAT-2874, error 300), and same-slot convergence (CAT-3982, error 301). The graph passed schema and structural checks but uses a not-yet-built execution path.","triggerScenarios":"POST /workflow-executions with a graph containing an edge where isBackEdge is true (a loop), an edge with outputIndex !== 0, or two edges into the same target input slot. Each maps to the same 501 envelope but a distinct reason string.","commonSituations":"Porting loop/iteration workflows before CAT-2875. Porting branching (IF/Switch) before CAT-2874. Porting Merge/fan-in before CAT-3982. The reason string tells you which feature gate was hit.","solutions":["Read response.body.reason to identify which unimplemented path was hit (loops, multi-slot output, or convergence).","For back-edges: unroll the loop or move the iterative logic into a single node.","For multi-slot output: collapse to outputIndex 0 (see error 300).","For convergence: route branches into distinct inputIndex values (see error 301).","If the feature is required, track the corresponding CAT ticket and stay on the v1 engine until it lands."],"exampleFix":"// before — loop via back-edge\nedges: [{ from: 'process', to: 'check', inputIndex: 0 }, { from: 'check', to: 'process', inputIndex: 0, isBackEdge: true }]\n// after — remove the back-edge; do iteration inside one node\nedges: [{ from: 'process', to: 'check', inputIndex: 0 }]","handlingStrategy":"validation","validationCode":"function assertNoUnsupportedFeatures(graph) {\n  if (graph.edges.some(e => e.isBackEdge)) throw new Error('Loops not supported (CAT-2875)');\n  if (graph.edges.some(e => e.outputIndex !== undefined && e.outputIndex !== 0)) throw new Error('Multi-slot output not supported (CAT-2874)');\n  const seen = new Set();\n  for (const e of graph.edges) {\n    const slot = `${e.to}#${e.inputIndex ?? 0}`;\n    if (seen.has(slot)) throw new Error('Convergence not supported (CAT-3982)');\n    seen.add(slot);\n  }\n}","typeGuard":"function isFullySupportedGraph(graph) {\n  if (graph.edges.some(e => e.isBackEdge)) return false;\n  if (graph.edges.some(e => e.outputIndex !== undefined && e.outputIndex !== 0)) return false;\n  const seen = new Set();\n  for (const e of graph.edges) {\n    const slot = `${e.to}#${e.inputIndex ?? 0}`;\n    if (seen.has(slot)) return false;\n    seen.add(slot);\n  }\n  return true;\n}","tryCatchPattern":"const res = await fetch('/workflow-executions', { method: 'POST', body: JSON.stringify(payload) });\nif (res.status === 501) {\n  const body = await res.json(); // body.error === 'unimplemented', body.reason names the feature\n  // restructure the graph to avoid the unsupported feature, or use the v1 engine\n}","preventionTips":["Avoid back-edges (loops) until CAT-2875; unroll iteration into a single node.","Use only output slot 0 until CAT-2874.","Route converging branches into distinct inputIndex values until CAT-3982.","Run assertNoUnsupportedFeatures(graph) before submitting."],"tags":["engine","http","unimplemented","graph-validation"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}