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
- Check span.CallDigest != "" before calling CallID()
- Skip non-call spans when building call-centric views
- Use span.Call() and handle nil to distinguish call-backed spans
- 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
- Filter to call-backed spans (non-empty CallDigest) before requesting IDs
- Expect this error when iterating all spans; skip rather than fail
- Use isCallSpan guards in view-building code
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.