{"record":{"id":"2a0dabcf87285928","repo":"dagger/dagger","slug":"receiver-result-is-detached","errorCode":null,"errorMessage":"receiver: result is detached","messagePattern":"receiver: result is detached","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"dagql/cache.go","lineNumber":3286,"sourceCode":"// ObjectType returns the ObjectType of the instance.\nfunc (r ObjectResult[T]) ObjectType() ObjectType {\n\treturn r.class\n}\n\nfunc (r ObjectResult[T]) Receiver(ctx context.Context, srv *Server) (AnyObjectResult, error) {\n\tif srv == nil {\n\t\treturn nil, fmt.Errorf(\"receiver: server is nil\")\n\t}\n\tctx = srvToContext(ctx, srv)\n\tcall, err := r.ResultCall()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif call.Receiver == nil {\n\t\treturn nil, nil\n\t}\n\tif call.Receiver.ResultID == 0 {\n\t\treturn nil, fmt.Errorf(\"receiver: result is detached\")\n\t}\n\tcache, err := EngineCache(srvToContext(ctx, srv))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"receiver: current dagql cache: %w\", err)\n\t}\n\tclientMetadata, err := engine.ClientMetadataFromContext(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"receiver: current client metadata: %w\", err)\n\t}\n\tif clientMetadata.SessionID == \"\" {\n\t\treturn nil, fmt.Errorf(\"receiver: empty session ID\")\n\t}\n\tres, err := cache.loadResultByResultID(ctx, clientMetadata.SessionID, srv, call.Receiver.ResultID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"receiver: load result %d: %w\", call.Receiver.ResultID, err)\n\t}\n\tobj, ok := res.(AnyObjectResult)\n\tif !ok {","sourceCodeStart":3268,"sourceCodeEnd":3304,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/dagql/cache.go#L3268-L3304","documentation":"Thrown by ObjectResult.Receiver (dagql/cache.go:3286) when the call's Receiver metadata exists but its ResultID is 0, meaning the referenced receiver result is detached — it has no registered numeric ID in the engine cache and cannot be reloaded by ID.","triggerScenarios":"Loading a call from serialized/persisted data (cache, telemetry, module call graph) whose receiver result was never cached or was stored without an ID, then calling Receiver to rehydrate it.","commonSituations":"Reading old persisted cache entries written before ResultID tracking, replaying module calls outside their originating session, or constructing Call objects manually without setting ResultID.","solutions":["Re-execute the receiver query in the current session to get a live, cached result instead of deserializing the detached one.","Ensure results are cached (through the server) before their Call metadata is persisted so ResultID is set.","Discard/regenerate stale persisted call data lacking ResultIDs."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"if call.Receiver != nil && call.Receiver.ResultID == 0 { /* re-execute receiver query instead of resolving */ }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Cache results through the server before persisting their Call metadata.","Regenerate old persisted call graphs predating ResultID support.","Treat ResultID==0 records as unresolvable and re-run them."],"tags":["dagql","detached-result","serialization"],"backgroundTag":"detached-result-no-id","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}