dagger/dagger · warning

no call for span

Error message

no call for span

What it means

Span.CallID in dagql/dagui/spans.go returns the reconstructed call.ID for a span, but only if the span recorded a CallDigest. Spans that are not backed by a Dagger function call (UI spans, progress spans) have an empty CallDigest, so this error is returned. It is an expected condition for non-call spans, not data corruption.

Source

Thrown at dagql/dagui/spans.go:157

	snapshot.Final = true // NOTE: applied to copy
	snapshot.Progress = span.Progress.Clone()
	return snapshot
}

func (span *Span) Call() *callpbv1.Call {
	if span.callCache != nil {
		return span.callCache
	}
	if span.CallDigest == "" {
		return nil
	}
	span.callCache = span.db.Call(span.CallDigest)
	return span.callCache
}

func (span *Span) CallID() (*call.ID, error) {
	if span.CallDigest == "" {
		return nil, fmt.Errorf("no call for span")
	}
	return span.db.CallIDForDigest(span.CallDigest)
}

func (span *Span) Base() *callpbv1.Call {
	if span.baseCache != nil {
		return span.baseCache
	}

	call := span.Call()
	if call == nil {
		return nil
	}

	// TODO: respect an already-set base value computed server-side, and client
	// subsequently requests necessary DAG
	if call.ReceiverDigest != "" {
		parentCall := span.db.Call(call.ReceiverDigest)

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Check span.CallDigest != "" before calling CallID()
  2. Skip non-call spans when building call-centric views
  3. Use span.Call() and handle nil to distinguish call-backed spans
  4. Log and continue rather than failing the whole view on non-call spans

Example fix

// before
id, err := span.CallID()
// after
if span.CallDigest == "" {
	continue // non-call span
}
id, err := span.CallID()
Defensive patterns

Strategy: validation

Validate before calling

if span.CallDigest == "" {
	continue // span is not backed by a function call
}
id, err := span.CallID()

Type guard

func isCallSpan(s *dagui.Span) bool {
	return s != nil && s.CallDigest != ""
}

Try / catch

id, err := span.CallID()
if err != nil && strings.Contains(err.Error(), "no call for span") {
	continue // non-call span, expected
}

Prevention

When it happens

Trigger: Calling span.CallID() on a span whose CallDigest is empty — e.g. iterating all spans in a trace view and asking each for its call ID.

Common situations: Walking the full span tree (internal, eval, progress spans) and assuming every span has a call; filtering for call spans after fetching instead of before.

Related errors


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