{"record":{"id":"a88ee407e0062cff","repo":"deepseek-ai/deepseek-harness","slug":"tool-provider-returned-reserved-tool-name-tool","errorCode":null,"errorMessage":"tool provider returned reserved tool name \"${TOOL_ORDER_REST}\" (reserved for toolOrder's rest entry)","messagePattern":"tool provider returned reserved tool name \"(.+?)\" \\(reserved for toolOrder's rest entry\\)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/system-prompt/src/index.ts","lineNumber":167,"sourceCode":"  for (const name of toolOrder) {\n    if (seen.has(name)) throw new Error(`toolOrder lists \"${name}\" more than once`)\n    seen.add(name)\n  }\n  if (!seen.has(TOOL_ORDER_REST)) {\n    throw new Error(`toolOrder must contain the \"${TOOL_ORDER_REST}\" rest entry (where unlisted tools are inserted)`)\n  }\n  return toolOrder\n}\n\n/**\n * Apply configured tool order, inserting unlisted tools lexicographically at\n * {@link TOOL_ORDER_REST}. Unknown configured names fail; known but restricted\n * names may be absent.\n */\nfunction orderTools(tools: ToolSchema[], toolOrder: string[] | undefined, knownNames: ReadonlySet<string>): ToolSchema[] {\n  const reserved = tools.find(tool => tool.name === TOOL_ORDER_REST)\n  if (reserved !== undefined) {\n    throw new Error(`tool provider returned reserved tool name \"${TOOL_ORDER_REST}\" (reserved for toolOrder's rest entry)`)\n  }\n  if (toolOrder === undefined) return tools.sort(compareToolNames)\n  const unknown = toolOrder.filter(name => name !== TOOL_ORDER_REST && !knownNames.has(name))\n  if (unknown.length > 0) {\n    throw new Error(`toolOrder lists unregistered tool${unknown.length > 1 ? 's' : ''} ${unknown.map(name => `\"${name}\"`).join(', ')}; known tools: ${[...knownNames].sort().join(', ') || '(none)'}`)\n  }\n  const listed = new Set(toolOrder)\n  const rest = tools.filter(tool => !listed.has(tool.name)).sort(compareToolNames)\n  return toolOrder.flatMap(name =>\n    name === TOOL_ORDER_REST ? rest : tools.filter(tool => tool.name === name))\n}\n\n/** Lexicographic (code-unit) name comparison — locale-independent, so the order is identical on every machine. */\nfunction compareToolNames(a: ToolSchema, b: ToolSchema): number {\n  return a.name < b.name ? -1 : a.name > b.name ? 1 : 0\n}\n\n/** Plugin config: the deployment-authored fragment of the system prompt (see {@link Config.persona} for its contract). */","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/core/system-prompt/src/index.ts#L149-L185","documentation":"Error \"tool provider returned reserved tool name \"${TOOL_ORDER_REST}\" (reserved for toolOrder's rest entry)\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/core/system-prompt/src/index.ts:167 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}