dagger/dagger · error
receiver: result is detached
Error message
receiver: result is detached
What it means
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.
Source
Thrown at dagql/cache.go:3286
// ObjectType returns the ObjectType of the instance.
func (r ObjectResult[T]) ObjectType() ObjectType {
return r.class
}
func (r ObjectResult[T]) Receiver(ctx context.Context, srv *Server) (AnyObjectResult, error) {
if srv == nil {
return nil, fmt.Errorf("receiver: server is nil")
}
ctx = srvToContext(ctx, srv)
call, err := r.ResultCall()
if err != nil {
return nil, err
}
if call.Receiver == nil {
return nil, nil
}
if call.Receiver.ResultID == 0 {
return nil, fmt.Errorf("receiver: result is detached")
}
cache, err := EngineCache(srvToContext(ctx, srv))
if err != nil {
return nil, fmt.Errorf("receiver: current dagql cache: %w", err)
}
clientMetadata, err := engine.ClientMetadataFromContext(ctx)
if err != nil {
return nil, fmt.Errorf("receiver: current client metadata: %w", err)
}
if clientMetadata.SessionID == "" {
return nil, fmt.Errorf("receiver: empty session ID")
}
res, err := cache.loadResultByResultID(ctx, clientMetadata.SessionID, srv, call.Receiver.ResultID)
if err != nil {
return nil, fmt.Errorf("receiver: load result %d: %w", call.Receiver.ResultID, err)
}
obj, ok := res.(AnyObjectResult)
if !ok {View on GitHub (pinned to 82ba2681db)
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.
Defensive patterns
Strategy: fallback
Validate before calling
if call.Receiver != nil && call.Receiver.ResultID == 0 { /* re-execute receiver query instead of resolving */ } Prevention
- 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.
When it happens
Trigger: 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.
Common situations: Reading old persisted cache entries written before ResultID tracking, replaying module calls outside their originating session, or constructing Call objects manually without setting ResultID.
Related errors
- before ID: %w
- after ID: %w
- message %d: %w
- module object SDK input call frame: %w
- encode persisted module object field %q: %w
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/2a0dabcf87285928.
Report an issue: GitHub.