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

  1. Re-execute the receiver query in the current session to get a live, cached result instead of deserializing the detached one.
  2. Ensure results are cached (through the server) before their Call metadata is persisted so ResultID is set.
  3. 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

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


AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05). Data as JSON: /api/errors/2a0dabcf87285928. Report an issue: GitHub.