{"record":{"id":"25598329f26c76fe","repo":"affaan-m/ECC","slug":"unsupported-guided-harness-id","errorCode":null,"errorMessage":"Unsupported guided harness: ${id}","messagePattern":"Unsupported guided harness: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/lib/multi-harness-setup.js","lineNumber":480,"sourceCode":"}\n\nasync function createMultiHarnessPlan(request, injected = {}, options = {}) {\n  const dependencies = { ...defaultDependencies(options), ...injected };\n  let entries = [];\n  for (const id of request.harnesses) {\n    if (id === 'claude') {\n      entries = [...entries, { id, channel: 'native-plugin', preview: await dependencies.previewClaude(request) }];\n    } else if (id === 'codex') {\n      entries = [...entries, { id, channel: 'native-plugin', preview: await dependencies.previewCodex(request) }];\n    } else if (id === 'kimi') {\n      const managedPlan = await dependencies.createManagedPlan(request);\n      entries = [...entries, {\n        id,\n        channel: 'managed-project',\n        preview: await dependencies.preflightManaged(managedPlan),\n      }];\n    } else {\n      throw new Error(`Unsupported guided harness: ${id}`);\n    }\n  }\n  return { harnesses: entries, request };\n}\n\nasync function applyMultiHarnessPlan(plan, injected = {}, options = {}) {\n  const dependencies = { ...defaultDependencies(options), ...injected };\n  if (plan.request.dryRun) {\n    return { status: 'preview', completed: [], retryHarnesses: [...plan.request.harnesses] };\n  }\n\n  let completed = [];\n  for (let index = 0; index < plan.harnesses.length; index += 1) {\n    const entry = plan.harnesses[index];\n    try {\n      let result;\n      if (entry.id === 'claude') result = await dependencies.applyClaude(plan.request, entry);\n      else if (entry.id === 'codex') result = await dependencies.applyCodex(plan.request, entry);","sourceCodeStart":462,"sourceCodeEnd":498,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/multi-harness-setup.js#L462-L498","documentation":"createMultiHarnessPlan builds a plan for a set of requested harness ids. Each id must map to a known harness (e.g. codex, cursor, kimi via managed-project). An unrecognized id falls into the final else and throws, because there is no code path to generate its operations.","triggerScenarios":"Passing a harness id in the request (e.g. via CLI flag or config) that is not one of the supported guided harnesses — typo'd, deprecated, or newly added upstream id.","commonSituations":"Typo like 'claudecode' vs the supported id; following outdated docs for a renamed harness; user config listing a harness installed outside this tool; forwards-compat configs from a newer version run on older code.","solutions":["Check the id spelling against supported harness ids in scripts/lib/multi-harness-setup.js","Remove or update the unsupported id in your request/config","Upgrade the ECC plugin if the harness is newer than your installed version"],"exampleFix":"// before\nawait createMultiHarnessPlan({ harnesses: ['claudecode', 'cursor'] });\n// after\nawait createMultiHarnessPlan({ harnesses: ['cursor'] }); // use a supported id","handlingStrategy":"validation","validationCode":"const SUPPORTED = ['codex', 'cursor', 'kimi']; // per multi-harness-setup.js\nconst bad = (request.harnesses || []).filter(h => !SUPPORTED.includes(h));\nif (bad.length) throw new Error(`Unsupported harness ids: ${bad.join(', ')}`);","typeGuard":"function isSupportedHarness(id) {\n  return ['codex', 'cursor', 'kimi'].includes(id);\n}","tryCatchPattern":"try {\n  const plan = await createMultiHarnessPlan(request);\n} catch (e) {\n  if (e.message.startsWith('Unsupported guided harness')) {\n    const id = e.message.match(/: (.+)$/)[1];\n    request.harnesses = request.harnesses.filter(h => h !== id);\n    // retry or surface to user\n  } else throw e;\n}","preventionTips":["Validate harness ids against the tool's supported list at config-load time","Keep harness id lists in one constant shared by config and callers","Upgrade the plugin before referencing newly released harness ids"],"tags":["configuration","validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}