{"record":{"id":"7ae72da97f4d9bd0","repo":"ruvnet/ruflo","slug":"semanticrouter-requires-a-dimension-in-config","errorCode":null,"errorMessage":"SemanticRouter requires a dimension in config","messagePattern":"SemanticRouter requires a dimension in config","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/cli/src/ruvector/semantic-router.ts","lineNumber":41,"sourceCode":"  dimension: number;\n  metric?: 'cosine' | 'euclidean' | 'dotProduct';\n}\n\ninterface StoredIntent {\n  name: string;\n  embeddings: Float32Array[];\n  metadata: Record<string, unknown>;\n}\n\nexport class SemanticRouter {\n  private dimension: number;\n  private metric: 'cosine' | 'euclidean' | 'dotProduct';\n  private intents: Map<string, StoredIntent> = new Map();\n  private totalVectors = 0;\n\n  constructor(config: RouterConfig) {\n    if (!config || typeof config.dimension !== 'number') {\n      throw new Error('SemanticRouter requires a dimension in config');\n    }\n    this.dimension = config.dimension;\n    this.metric = config.metric ?? 'cosine';\n  }\n\n  /**\n   * Add an intent with pre-computed embeddings\n   */\n  addIntentWithEmbeddings(\n    name: string,\n    embeddings: Float32Array[],\n    metadata: Record<string, unknown> = {}\n  ): void {\n    if (!name || !Array.isArray(embeddings)) {\n      throw new Error('Must provide name and embeddings array');\n    }\n\n    // Validate embeddings","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/ruvnet/ruflo/blob/6b01dc5a687b26b3e218f796de45ec51f8fa9e8c/v3/@claude-flow/cli/src/ruvector/semantic-router.ts#L23-L59","documentation":"SemanticRouter's constructor requires config.dimension to be a number; it uses it to validate every subsequent embedding length and to size normalization. The guard rejects undefined config, missing dimension, or a dimension that is not typeof 'number' (NaN passes this check because typeof NaN === 'number' — a known gap). The error throws synchronously during construction, before any intent is stored.","triggerScenarios":"Calling `new SemanticRouter({})`, `new SemanticRouter({ metric: 'cosine' })`, `new SemanticRouter(undefined)`, or `new SemanticRouter({ dimension: undefined })`. Also destructuring config from an env-parsed object that omitted dimension.","commonSituations":"Defaulting config to {} when no options are provided; reading dimension from a model config that did not load; JSON config where 'dimension' was misspelled as 'dimensions'.","solutions":["Pass a numeric dimension matching your embedding model (e.g., 384 for all-MiniLM-L6-v2, 1536 for text-embedding-ada-002).","Also guard against NaN: check Number.isFinite(config.dimension).","Load dimension from the embedding backend rather than hardcoding, so it stays in sync."],"exampleFix":"// before\nconst router = new SemanticRouter({ metric: 'cosine' }); // throws\n\n// after\nconst DIM = 384; // must match your embedder output\nif (!Number.isFinite(DIM)) throw new Error('dimension not configured');\nconst router = new SemanticRouter({ dimension: DIM, metric: 'cosine' });","handlingStrategy":"validation","validationCode":"function makeRouter(cfg) {\n  if (!cfg || !Number.isFinite(cfg.dimension) || cfg.dimension <= 0) {\n    throw new Error('SemanticRouter needs a positive finite numeric dimension');\n  }\n  return new SemanticRouter(cfg);\n}","typeGuard":"function isRouterConfig(c): c is { dimension: number; metric?: 'cosine' | 'euclidean' | 'dotProduct' } {\n  return c != null && typeof c.dimension === 'number' && Number.isFinite(c.dimension) && c.dimension > 0;\n}","tryCatchPattern":null,"preventionTips":["Source dimension from the embedder, not a hand-typed constant.","Note typeof NaN === 'number' — always use Number.isFinite for numeric config guards.","Fail construction early at app boot so the error surfaces before any routing."],"tags":["config","validation","semantic-router","constructor"],"backgroundTag":null,"analyzedSha":"6b01dc5a687b26b3e218f796de45ec51f8fa9e8c","analyzedAt":"2026-08-12T13:20:50.148Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}