{"record":{"id":"6306e39f4a66ff49","repo":"mastra-ai/mastra","slug":"knowledge-update-node-requires-at-least-one-of-na","errorCode":null,"errorMessage":"knowledge_update_node requires at least one of: name, kind.","messagePattern":"knowledge_update_node requires at least one of: name, kind\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/memory/src/processors/observational-memory/subconscious/knowledge-write-tools.ts","lineNumber":123,"sourceCode":"    knowledge_update_node: createTool({\n      id: 'knowledge_update_node',\n      description:\n        'Update a visible node name or kind using optimistic concurrency. Provide at least one of name or kind.',\n      inputSchema: {\n        type: 'object',\n        properties: {\n          node: { type: 'string', minLength: 1 },\n          expectedVersion: { type: 'integer', minimum: 1 },\n          name: { type: 'string', minLength: 1 },\n          kind: { type: 'string', minLength: 1 },\n        },\n        required: ['node', 'expectedVersion'],\n        additionalProperties: false,\n      } satisfies JSONSchema7,\n      execute: async input => {\n        const value = input as { node: string; expectedVersion: number; name?: string; kind?: string };\n        if (value.name === undefined && value.kind === undefined) {\n          throw new Error('knowledge_update_node requires at least one of: name, kind.');\n        }\n        const store = await getStore(memory);\n        const node = await store.getNode(value.node);\n        if (!node || node.mergedInto) throw new Error(`Knowledge node not found: ${value.node}`);\n        requireVisible(node.scope, options, 'Knowledge node');\n        return store.updateNode({\n          id: node.id,\n          version: value.expectedVersion,\n          name: value.name,\n          kind: value.kind,\n        });\n      },\n    }),\n    knowledge_merge_nodes: createTool({\n      id: 'knowledge_merge_nodes',\n      description: 'Merge a visible duplicate node into another visible node using source-version CAS.',\n      inputSchema: {\n        type: 'object',","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/memory/src/processors/observational-memory/subconscious/knowledge-write-tools.ts#L105-L141","documentation":"knowledge_update_node performs an optimistic-concurrency update of a node's name and/or kind. Because both fields are optional in the schema, the execute handler explicitly rejects calls where neither is present — a no-op update — with this error. It guarantees every update call carries at least one field to change.","triggerScenarios":"Agent calls knowledge_update_node passing only node and expectedVersion (both name and kind omitted), e.g. attempting a 'touch' or retrying a failed update without re-including fields.","commonSituations":"LLM retries after a version conflict while dropping the name/kind fields; prompt templates showing only required schema fields; programmatic scripts forwarding partial payloads.","solutions":["Include name and/or kind in the call alongside node and expectedVersion.","If nothing should change, don't call the update tool at all.","Add agent instructions: every knowledge_update_node call must carry at least one of name, kind.","In wrappers, assert (value.name !== undefined || value.kind !== undefined) before execute()."],"exampleFix":"// before\nawait tools.knowledge_update_node.execute({ node: 'node_1', expectedVersion: 3 }, ctx);\n// after\nawait tools.knowledge_update_node.execute({ node: 'node_1', expectedVersion: 3, name: 'Renamed Node' }, ctx);","handlingStrategy":"validation","validationCode":"type UpdateArgs = { node: string; expectedVersion: number; name?: string; kind?: string };\nif (args.name === undefined && args.kind === undefined) {\n  throw new Error('knowledge_update_node needs name or kind');\n}","typeGuard":"function hasUpdateField(a: unknown): a is { node: string; expectedVersion: number } & ({ name: string } | { kind: string }) {\n  const x = a as { name?: unknown; kind?: unknown };\n  return x?.name !== undefined || x?.kind !== undefined;\n}","tryCatchPattern":"try {\n  return await curatorTools.knowledge_update_node.execute(args, {} as any);\n} catch (e) {\n  if (e instanceof Error && e.message === 'knowledge_update_node requires at least one of: name, kind.') {\n    return { updated: false, reason: 'no-op-update' };\n  }\n  throw e;\n}","preventionTips":["Never call knowledge_update_node without an actual field change.","On version-conflict retries, re-include name/kind in the retry payload.","Add a wrapper that rejects no-op updates before execute().","Spell out the requirement in the agent's tool instructions."],"tags":["tool-input-validation","knowledge-update","missing-argument","llm-tool-call"],"backgroundTag":"missing-required-argument","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}