ruvnet/ruflo · error
- ${f.toolA} <-> ${f.toolB}: ${f.reason}
Error message
- ${f.toolA} <-> ${f.toolB}: ${f.reason} What it means
Per-finding detail line printed by evaluateToolComposition() under block mode: toolA and toolB share a suspicious fragment whose reason is shown. It is diagnostic output accompanying the block decision, not a separate failure.
Source
Thrown at v3/@claude-flow/security/src/mcp-composition-inspector.ts:336
*/
export function evaluateToolComposition(
tools: readonly McpToolDescriptor[],
options: CompositionInspectorOptions = {},
): CompositionGuardResult {
const result = inspectToolComposition(tools, options);
if (result.findings.length === 0) {
return { result, action: 'none', blocked: false };
}
const summary =
`MCP Composition Inspector: ${result.findings.length} suspicious cross-tool fragment(s) ` +
`across ${result.stats.toolsScanned} tools (${result.stats.pairsCompared} pairs compared)`;
if (isCompositionBlockEnabled()) {
const message = `${summary} — blocking chain (${COMPOSITION_BLOCK_ENV}=1)`;
console.warn(`[mcp-composition-inspector] ${message}`);
for (const f of result.findings) {
console.warn(` - ${f.toolA} <-> ${f.toolB}: ${f.reason}`);
}
return { result, action: 'block', blocked: true, message };
}
console.warn(`[mcp-composition-inspector] ${summary}`);
for (const f of result.findings) {
console.warn(` - ${f.toolA} <-> ${f.toolB}: ${f.reason}`);
}
return { result, action: 'warn', blocked: false, message: summary };
}
View on GitHub (pinned to fa13ee4ad6)
Solutions
- Review the flagged tool pair and the reason; avoid enabling both tools together in one composition.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at v3/@claude-flow/security/src/mcp-composition-inspector.ts:336 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18).
Data as JSON: /api/errors/e1b0050d31598999.
Report an issue: GitHub.