{"record":{"id":"433a7964eb599294","repo":"ruvnet/ruflo","slug":"unknown-gnn-layer-type-type-available-types","errorCode":null,"errorMessage":"Unknown GNN layer type: ${type}. Available types: ${this.getLayerTypes().join(', ')}","messagePattern":"Unknown GNN layer type: (.+?)\\. Available types: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/plugins/src/integrations/ruvector/gnn.ts","lineNumber":326,"sourceCode":"   * @param type - Layer type to remove\n   * @returns Whether the layer was removed\n   */\n  unregisterLayer(type: GNNLayerType | string): boolean {\n    this.defaultConfigs.delete(type);\n    return this.factories.delete(type);\n  }\n\n  /**\n   * Create a GNN layer instance.\n   * @param type - Layer type\n   * @param config - Layer configuration\n   * @returns IGNNLayer instance\n   * @throws Error if layer type is not registered\n   */\n  createLayer(type: GNNLayerType, config: Partial<GNNLayerConfig>): IGNNLayer {\n    const factory = this.factories.get(type);\n    if (!factory) {\n      throw new Error(`Unknown GNN layer type: ${type}. Available types: ${this.getLayerTypes().join(', ')}`);\n    }\n\n    const defaultConfig = this.defaultConfigs.get(type) ?? {};\n    const fullConfig: GNNLayerConfig = {\n      type,\n      inputDim: config.inputDim ?? 64,\n      outputDim: config.outputDim ?? 64,\n      dropout: config.dropout ?? defaultConfig.dropout ?? GNN_DEFAULTS.dropout,\n      aggregation: config.aggregation ?? defaultConfig.aggregation ?? GNN_DEFAULTS.aggregation,\n      addSelfLoops: config.addSelfLoops ?? defaultConfig.addSelfLoops ?? GNN_DEFAULTS.addSelfLoops,\n      normalize: config.normalize ?? defaultConfig.normalize ?? GNN_DEFAULTS.normalize,\n      useBias: config.useBias ?? defaultConfig.useBias ?? GNN_DEFAULTS.useBias,\n      activation: config.activation ?? defaultConfig.activation ?? GNN_DEFAULTS.activation,\n      ...config,\n    };\n\n    return factory(fullConfig);\n  }","sourceCodeStart":308,"sourceCodeEnd":344,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/plugins/src/integrations/ruvector/gnn.ts#L308-L344","documentation":"GNNRegistry.createLayer() dispatches to a factory registered per layer type. Built-in registrations (gnn.ts:377-453) cover 'gcn', 'gat', 'gat_v2', 'sage', 'gin', 'mpnn', 'edge_conv', 'point_conv', 'transformer', 'pna', 'film', 'rgcn', 'hgt', 'han', 'metapath'. Requesting any other key throws this error, and the message conveniently lists the available types via getLayerTypes().","triggerScenarios":"Calling registry.createLayer('graphconv', config) with a typo or a layer from another library (PyG/DGL names like 'GraphConv', 'SGConv'); using a layer type registered only after unregisterLayer() was called; passing user-supplied layer names straight from config.","commonSituations":"Porting PyTorch Geometric model code and reusing its layer names; config files with stale layer names after a library upgrade; case mismatches ('GCN' vs 'gcn').","solutions":["Read the error message: it lists every available type — pick the closest match (e.g. 'sage' for GraphSAGE)","Guard user/config input with registry.getLayerTypes().includes(type) before calling createLayer","For custom layers, register a factory first via registry.registerLayer('my_layer', factory, defaults)","Check exact casing: built-ins are lowercase with underscores ('gat_v2', 'edge_conv')"],"exampleFix":"// before\nconst layer = registry.createLayer('GraphConv' as GNNLayerType, { inputDim: 64 }); // throws\n\n// after\nconst layer = registry.createLayer('gcn', { inputDim: 64, outputDim: 64 });","handlingStrategy":"validation","validationCode":"const layerType = cfg.layer as string;\nconst available = registry.getLayerTypes();\nif (!available.includes(layerType)) {\n  throw new Error(`Unsupported layer '${layerType}'. Supported: ${available.join(', ')}`);\n}\nconst layer = registry.createLayer(layerType as GNNLayerType, cfg);","typeGuard":"function isGNNLayerType(registry: GNNRegistry, type: string): type is GNNLayerType {\n  return registry.getLayerTypes().includes(type);\n}","tryCatchPattern":"try {\n  layer = registry.createLayer(type, config);\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Unknown GNN layer type')) {\n    // message already lists valid types; surface to config validation\n    throw new ConfigError(err.message, { field: 'layer', value: type });\n  }\n  throw err;\n}","preventionTips":["Build model configs from the registry's own getLayerTypes() output (e.g. dropdowns, schema enums)","Register custom layers via registerLayer() at startup rather than reaching for unregistered names later","Beware PyG/DGL naming habits: this registry uses lowercase snake_case ('gat_v2', 'edge_conv')"],"tags":["gnn","factory","registry","ruvector","graph-neural-network"],"backgroundTag":"unknown-factory-type","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"}