{"record":{"id":"eeb47813343fa4fd","repo":"mastra-ai/mastra","slug":"previous-object-must-be-a-single-relatednodeinfo-o","errorCode":null,"errorMessage":"Previous object must be a single RelatedNodeInfo object","messagePattern":"Previous object must be a single RelatedNodeInfo object","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/rag/src/document/schema/node.ts","lineNumber":43,"sourceCode":"  abstract getContent(): string;\n\n  abstract getMetadataStr(): string;\n\n  get sourceNode(): RelatedNodeInfo<T> | undefined {\n    const relationship = this.relationships[NodeRelationship.SOURCE];\n\n    if (Array.isArray(relationship)) {\n      throw new Error('Source object must be a single RelatedNodeInfo object');\n    }\n\n    return relationship;\n  }\n\n  get prevNode(): RelatedNodeInfo<T> | undefined {\n    const relationship = this.relationships[NodeRelationship.PREVIOUS];\n\n    if (Array.isArray(relationship)) {\n      throw new Error('Previous object must be a single RelatedNodeInfo object');\n    }\n\n    return relationship;\n  }\n\n  get nextNode(): RelatedNodeInfo<T> | undefined {\n    const relationship = this.relationships[NodeRelationship.NEXT];\n\n    if (Array.isArray(relationship)) {\n      throw new Error('Next object must be a single RelatedNodeInfo object');\n    }\n\n    return relationship;\n  }\n\n  get parentNode(): RelatedNodeInfo<T> | undefined {\n    const relationship = this.relationships[NodeRelationship.PARENT];\n","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/rag/src/document/schema/node.ts#L25-L61","documentation":"The BaseNode.prevNode getter reads the PREVIOUS relationship and expects a single RelatedNodeInfo object. An array in that slot is invalid — a node has at most one previous neighbor in the sequence.","triggerScenarios":"Accessing node.prevNode when relationships[NodeRelationship.PREVIOUS] was set to an array of RelatedNodeInfo.","commonSituations":"Uniformly serializing all relationships as arrays, or code that reuses the CHILD (array) structure for PREVIOUS/NEXT links when re-linking split chunks.","solutions":["Set relationships[NodeRelationship.PREVIOUS] to a single RelatedNodeInfo object, not an array.","Normalize deserialized relationship maps before constructing nodes.","Build prev/next links via the splitter/node linking utilities instead of manual assignment."],"exampleFix":"// before\nnode.relationships[NodeRelationship.PREVIOUS] = [prevInfo];\n// after\nnode.relationships[NodeRelationship.PREVIOUS] = prevInfo;","handlingStrategy":"type-guard","validationCode":"const rel = node.relationships[NodeRelationship.PREVIOUS];\nconst prev = rel !== undefined && !Array.isArray(rel) ? rel : undefined;","typeGuard":"const isSingleRelatedNodeInfo = (v: unknown): v is RelatedNodeInfo =>\n  v !== null && typeof v === 'object' && !Array.isArray(v) && 'nodeId' in v;","tryCatchPattern":"let prev;\ntry {\n  prev = node.prevNode;\n} catch (e) {\n  if (e instanceof Error && e.message.includes('Previous object must be')) {\n    const rel = node.relationships[NodeRelationship.PREVIOUS];\n    prev = Array.isArray(rel) ? rel[0] : undefined;\n  } else throw e;\n}","preventionTips":["Store PREVIOUS/NEXT as single objects, reserving arrays for CHILD only.","Write one shared deserializer that unwraps arrays for scalar relationships.","Test round-trip serialize/parse to catch shape drift."],"tags":["data-structure","rag","relationships"],"backgroundTag":"invalid-relationship-shape","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}