{"record":{"id":"ccf53b6d9a2e486f","repo":"ruvnet/ruflo","slug":"localcompute-no-adapter-for-graphid-input-graph","errorCode":null,"errorMessage":"localCompute: no adapter for graphId=${input.graphId}","messagePattern":"localCompute: no adapter for graphId=(.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"plugins/ruflo-graph-intelligence/src/application/federation-client.ts","lineNumber":118,"sourceCode":"    }\n    // No usable response\n    return {\n      origin: 'local-fallback',\n      result: await this.localCompute(input),\n      fallbackReason: 'no usable response from peer',\n    };\n  }\n\n  private async localCompute(input: {\n    graphId: string;\n    nodeId: string;\n    alpha?: number;\n    epsilon?: number;\n    seedNodes?: string[];\n  }): Promise<PageRankResult> {\n    const adapter = getRegistry().get(input.graphId);\n    if (!adapter) {\n      throw new Error(`localCompute: no adapter for graphId=${input.graphId}`);\n    }\n    const matrix = await adapter.exportAsSparseMatrix();\n    return runPageRank(matrix, {\n      graphId: input.graphId,\n      nodeId: input.nodeId,\n      alpha: input.alpha ?? 0.85,\n      epsilon: input.epsilon ?? 1e-3,\n      seedNodes: input.seedNodes ?? [],\n      maxComplexityClass: 'polynomial',\n      coherenceThreshold: 0,\n    });\n  }\n}\n\n/**\n * Helper: an in-process transport stitching a client to a server. Useful for\n * testing the Phase 8 round-trip without spinning up real ADR-104 wiring.\n */","sourceCodeStart":100,"sourceCodeEnd":136,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/plugins/ruflo-graph-intelligence/src/application/federation-client.ts#L100-L136","documentation":"validateConfigPath() only lets through paths ending in .json, .config.json, .config.js, or .config.ts (the longer entries are redundant since plain .json already matches). Any other extension — or a wrong-case extension like .JSON — fails the case-sensitive endsWith() checks. This is a whitelist so that the config tools cannot be repurposed to read or overwrite arbitrary file types.","triggerScenarios":"path=\"claude-flow.config.yaml\" or \"config.yml\"; path=\"settings.toml\"; a case mismatch like \"CONFIG.JSON\" (endsWith is case-sensitive); a path with no extension at all, e.g. \"config/production\".","commonSituations":"Teams whose existing config lives in YAML/TOML trying to point claude-flow at it; tools that emit uppercase extensions; users assuming any text file can be loaded as config.","solutions":["Use a .json config file — that is the format handleSaveConfig writes with JSON.stringify anyway","Convert your YAML/TOML config to JSON (e.g. with js-yaml's safeLoad + JSON.stringify) and save it as claude-flow.config.json","Check the exact extension casing of the file on disk and pass it verbatim (lowercase .json)","For .config.js/.config.ts files, confirm the full suffix matches, e.g. \"claude-flow.config.ts\" not \"claude-flow.ts\""],"exampleFix":"// before\nawait client.callTool('config_load', { path: 'config/claude-flow.yaml' }); // throws [1122]\n\n// after\nimport fs from 'fs';\nimport yaml from 'js-yaml';\nconst cfg = yaml.load(fs.readFileSync('config/claude-flow.yaml', 'utf-8'));\nfs.writeFileSync('config/claude-flow.config.json', JSON.stringify(cfg, null, 2));\nawait client.callTool('config_load', { path: 'config/claude-flow.config.json' });","handlingStrategy":"validation","validationCode":"const ALLOWED = ['.json', '.config.json', '.config.js', '.config.ts'];\nfunction hasAllowedConfigExt(p: string): boolean {\n  const lower = p.toLowerCase();\n  return ALLOWED.some(ext => lower.endsWith(ext));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep claude-flow config as .json; convert YAML/TOML at build time, not tool-call time","Assert hasAllowedConfigExt(path) before every config tool call in a shared wrapper","Watch extension casing — the server's endsWith check is case-sensitive"],"tags":["mcp","config","file-extension","validation"],"backgroundTag":"file-extension-not-allowed","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}