{"record":{"id":"a7ce4ce82a939107","repo":"ruvnet/ruflo","slug":"no-nodes-available-for-leader-election","errorCode":null,"errorMessage":"No nodes available for leader election","messagePattern":"No nodes available for leader election","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/swarm/src/topology-manager.ts","lineNumber":196,"sourceCode":"    if (updates.status !== undefined) node.status = updates.status;\n    if (updates.connections !== undefined) {\n      node.connections = updates.connections;\n      this.adjacencyList.set(agentId, new Set(updates.connections));\n    }\n    if (updates.metadata !== undefined) {\n      node.metadata = { ...node.metadata, ...updates.metadata };\n    }\n\n    this.emit('node.updated', { agentId, updates });\n  }\n\n  getLeader(): string | undefined {\n    return this.state.leader;\n  }\n\n  async electLeader(): Promise<string> {\n    if (this.state.nodes.length === 0) {\n      throw new Error('No nodes available for leader election');\n    }\n\n    // For hierarchical topology, the queen is the leader (O(1) lookup)\n    if (this.config.type === 'hierarchical') {\n      const queen = this.queenNode;\n      if (queen) {\n        this.state.leader = queen.agentId;\n        return queen.agentId;\n      }\n    }\n\n    // For centralized topology, the coordinator is the leader (O(1) lookup)\n    if (this.config.type === 'centralized') {\n      const coordinator = this.coordinatorNode;\n      if (coordinator) {\n        this.state.leader = coordinator.agentId;\n        return coordinator.agentId;\n      }","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/swarm/src/topology-manager.ts#L178-L214","documentation":"electLeader() requires at least one node in state.nodes; on an empty topology it throws before any election strategy runs. The fast paths (hierarchical queen lookup, centralized coordinator) also cannot produce a leader without nodes. This is a bootstrap-ordering guard, not a transient failure.","triggerScenarios":"Calling electLeader() before any addNode(); calling it again after removeNode() drained the swarm; tests that tear down all nodes and then assert a new leader.","commonSituations":"Election triggered in startup hooks before agents join; shrinking a swarm to zero then re-electing; unit tests constructing a TopologyManager and immediately electing.","solutions":["addNode() at least one node before electLeader()","Guard the call: skip election while getState().nodes.length is 0","Re-check swarm size after mass removals before triggering re-election"],"exampleFix":"// before\nconst topology = new TopologyManager(config);\nawait topology.electLeader(); // throws: no nodes\n\n// after\nawait topology.addNode('queen-1', 'queen');\nawait topology.electLeader();","handlingStrategy":"validation","validationCode":"function hasNodes(topology: TopologyManager): boolean {\n  return topology.getState().nodes.length > 0;\n}\n\nif (hasNodes(topology)) {\n  await topology.electLeader();\n} else {\n  // defer election until the first node joins\n  topology.once('node.added', () => topology.electLeader());\n}","typeGuard":null,"tryCatchPattern":"try {\n  await topology.electLeader();\n} catch (err) {\n  if (err instanceof Error && err.message === 'No nodes available for leader election') {\n    await waitForFirstJoin(topology); // bootstrap race: retry once after a join\n    return topology.electLeader();\n  }\n  throw err;\n}","preventionTips":["Sequence startup as initialize, then addNode, then electLeader; never elect inside initialize","Skip re-election when the swarm empties after node.removed events","Seed at least one node in test setup before election assertions"],"tags":["leader-election","topology","empty-state","bootstrap"],"backgroundTag":"empty-cluster","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}