{"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":null,"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/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/cli/src/ruvector/semantic-router.ts#L23-L59","documentation":"The SemanticRouter constructor requires config.dimension to be a number (it sizes every embedding it will store — addIntentWithEmbeddings later enforces Float32Array of exactly this length). A missing, undefined, or non-numeric dimension throws immediately at construction.","triggerScenarios":"new SemanticRouter({} as any) or new SemanticRouter({metric:'cosine'}) with dimension forgotten; dimension passed as a string ('384') from env/config parsing; config objects built conditionally where the dimension field is only set on one branch; new SemanticRouter(null).","commonSituations":"Config loaded from JSON/env where everything arrives as strings; switching embedding models and deleting the dimension field while refactoring; partial config objects satisfying TypeScript via casts; copying router setup code that assumed a default dimension (there is none).","solutions":["Pass dimension matching your embedding model: 384 (all-MiniLM-L6-v2), 768 (bge-base), 1536 (text-embedding-3-small), 3072 (text-embedding-3-large), etc.","Parse/validate config at load time: Number.isFinite(config.dimension) before constructing","Centralize the dimension in one constant shared by the embedder and the router so they cannot diverge","If config is dynamic, default it explicitly (e.g., ?? 384) rather than leaving it undefined"],"exampleFix":"// before\nconst router = new SemanticRouter({ metric: 'cosine' } as any); // throws: requires a dimension\n// after\nconst DIM = 384; // all-MiniLM-L6-v2\nconst router = new SemanticRouter({ dimension: DIM, metric: 'cosine' });","handlingStrategy":"validation","validationCode":"function makeRouter(cfg: unknown) {\n  const dimension = Number((cfg as any)?.dimension);\n  if (!Number.isFinite(dimension) || dimension <= 0) {\n    throw new Error('SemanticRouter config needs numeric dimension (e.g., 384 for MiniLM)');\n  }\n  return new SemanticRouter({ dimension, metric: 'cosine' });\n}","typeGuard":"function hasNumericDimension(cfg: unknown): cfg is { dimension: number } {\n  return !!cfg && typeof (cfg as any).dimension === 'number' && Number.isFinite((cfg as any).dimension);\n}","tryCatchPattern":"try {\n  router = new SemanticRouter(config as any);\n} catch (e) {\n  if (e instanceof Error && e.message === 'SemanticRouter requires a dimension in config') {\n    router = new SemanticRouter({ dimension: DEFAULT_DIMENSION }); // fail loud in dev, default in prod\n  } else throw e;\n}","preventionTips":["Parse config with a schema (zod) that requires dimension: number before it reaches the constructor","Share one DIMENSION constant between the embedder and the router so they always match","Env/config values arrive as strings — Number() them at load time, never at use time"],"tags":["semantic-router","embeddings","constructor","config-validation","missing-field"],"backgroundTag":"missing-required-config","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}