{"record":{"id":"d0f1f718709613d9","repo":"ruvnet/RuView","slug":"mcp-specification-rejected-by-kernel-resolvedbac","errorCode":null,"errorMessage":"MCP specification rejected by ${kernel.resolvedBackend} kernel: ${kernel.mcpValidation}","messagePattern":"MCP specification rejected by (.+?) kernel: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"harness/homecore/src/mcp-server.js","lineNumber":146,"sourceCode":"        signal: context.signal,\n        timeoutMs: TOOL_TIMEOUT_MS,\n        onTimeout: () => context.controller?.abort(),\n      });\n      return result(id, {\n        content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],\n        isError: output?.ok === false,\n      });\n    }\n    default:\n      if (id !== undefined) error(id, -32601, `Method not found: ${method}`);\n      return undefined;\n  }\n}\n\nexport async function startMcpServer() {\n  const kernel = await getKernelStatus();\n  if (kernel.mcpValidation !== null) {\n    throw new Error(`MCP specification rejected by ${kernel.resolvedBackend} kernel: ${kernel.mcpValidation}`);\n  }\n  const configuredRoot = process.env.HOMECORE_TRUSTED_REPO\n    ? resolvePath(process.env.HOMECORE_TRUSTED_REPO)\n    : findHomecoreRepo();\n  const trustedRoot = configuredRoot\n    ? assertTrustedHomecoreRepo(configuredRoot, { trustedRoot: configuredRoot })\n    : null;\n  log(`starting v${SERVER_INFO.version} (protocol ${PROTOCOL_VERSION}, kernel ${kernel.resolvedBackend}, ${listTools({ source: 'mcp' }).length} tools)`);\n\n  let toolChain = Promise.resolve();\n  let queuedToolCalls = 0;\n  let acceptedToolCalls = 0;\n  const cancelled = new Set();\n  const queuedIds = new Set();\n  const controllers = new Map();\n  const dispatch = (message, extraContext = {}) => handle(message, {\n    source: 'mcp',\n    trustedRoot,","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/ruvnet/RuView/blob/4685618388a5e49fad5b3005806f3bdd6a7c25c3/harness/homecore/src/mcp-server.js#L128-L164","documentation":"RuntimeError raised by _validate_interface (rssi_collector.py:218) because is_available() found that /proc/net/wireless does not exist on this host. Linux exposes per-interface WiFi RSSI stats through that proc file; when the kernel has no wireless subsystem there is nothing to read, so the collector refuses to start. The message itself names the usual culprits: Docker, WSL, headless servers.","triggerScenarios":"Constructing/starting the RSSICollector (which calls _validate_interface) inside a Docker container, WSL1/WSL2 VM, or a VM/server whose kernel lacks cfg80211/wireless extensions; a headless CI runner; a machine whose only NIC is Ethernet (file absent when there is no wireless interface at all).","commonSituations":"Developing the WiFi-DensePose pipeline on a laptop inside Docker instead of the bare host; CI running unit/integration tests that instantiate the real collector; deploying to a cloud VM with no WiFi hardware; WSL2 where /proc is the VM's, not Windows'.","solutions":["Run the collector on a bare Linux host with a real wireless interface (e.g. wlan0 associated with an AP)","Guard construction with the provided non-raising probe before starting: available, reason = RSSICollector.is_available('wlan0'); only start when available","In Docker, run with --network host and ensure the host kernel exposes /proc/net/wireless (containers share the host kernel; if the host has WiFi, host networking plus /proc mounting makes it visible)","For tests/dev without hardware, feed recorded/synthetic RSSI data instead of the live collector"],"exampleFix":"# before\ncollector = RSSICollector(interface='wlan0')\ncollector.start()  # RuntimeError in Docker/WSL\n# after\nfrom src.sensing.rssi_collector import RSSICollector\navailable, reason = RSSICollector.is_available('wlan0')\nif not available:\n    logger.warning(f'RSSI collection unavailable: {reason}')\n    # fall back to recorded data or skip\nelse:\n    collector = RSSICollector(interface='wlan0')\n    collector.start()","handlingStrategy":"validation","validationCode":"from src.sensing.rssi_collector import RSSICollector\n\navailable, reason = RSSICollector.is_available(\"wlan0\")\nif not available:\n    print(f\"Skipping live RSSI collection: {reason}\")\n# only construct/start the collector when available is True","typeGuard":"import os\n\ndef host_has_wireless_proc() -> bool:\n    \"\"\"Narrow the environment: /proc/net/wireless must exist before the collector starts.\"\"\"\n    return os.path.exists(\"/proc/net/wireless\")","tryCatchPattern":"try:\n    collector = RSSICollector(interface=\"wlan0\")\n    collector.start()\nexcept RuntimeError as e:\n    if \"/proc/net/wireless not found\" in str(e):\n        # environment lacks a wireless subsystem -> use recorded data\n        feed = RecordedRSSIStream(\"captures/session1.rssi\")\n    else:\n        raise","preventionTips":["Call is_available() at startup and degrade gracefully instead of crashing","Run collection on the bare Linux host, not inside Docker/WSL","In CI, mock the collector or replay recorded RSSI captures","Name the exact interface that appears in /proc/net/wireless (verify with cat /proc/net/wireless)"],"tags":["hardware","linux","environment","sensing","rssi"],"backgroundTag":null,"analyzedSha":"4685618388a5e49fad5b3005806f3bdd6a7c25c3","analyzedAt":"2026-08-16T06:09:40.886Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}