dagger/dagger · error
no call digest
Error message
no call digest
What it means
Returned by DB.CallIDForDigest when called with an empty digest string. The function rebuilds a dagql call ID from ingested call payloads, so an empty digest is a programmer/API-misuse error caught by this validation guard before any map lookup.
Source
Thrown at dagql/dagui/db.go:1245
for _, creator := range creators.Order {
if seen[creator.CallDigest] {
continue
}
if creatorCall := db.call(creator.CallDigest, seen); creatorCall != nil {
return creatorCall
}
}
}
// No call found
return nil
}
// CallIDForDigest rebuilds the ID of the dagql call with the given digest
// from the call payloads this client has ingested.
func (db *DB) CallIDForDigest(digest string) (*call.ID, error) {
if digest == "" {
return nil, fmt.Errorf("no call digest")
}
rootCall := db.Call(digest)
if rootCall == nil {
return nil, fmt.Errorf("cannot rebuild ID: %s", missingCall{digest: digest})
}
recipe := &callpbv1.RecipeDAG{
RootDigest: rootCall.Digest,
CallsByDigest: map[string]*callpbv1.Call{},
}
if missing := extractIntoDAG(recipe, db, rootCall.Digest); len(missing) > 0 {
return nil, fmt.Errorf("cannot rebuild ID for %s: %s", frameLabel(rootCall), missing[0])
}
dag := &callpbv1.DAG{
Value: &callpbv1.DAG_Recipe{Recipe: recipe},
}
var id call.IDView on GitHub (pinned to 82ba2681db)
Solutions
- Ensure the digest is computed and set before calling CallIDForDigest (check the span/record that supplied it)
- Guard the caller: skip or log entries with empty digests instead of passing them through
- Verify the telemetry pipeline isn't dropping the digest field during export/import
Example fix
// before
id, err := db.CallIDForDigest(spanDigest)
// after
if spanDigest == "" {
return nil // skip spans without digests
}
id, err := db.CallIDForDigest(spanDigest) Defensive patterns
Strategy: validation
Validate before calling
if digest == "" {
return nil, ErrNoDigest // skip before calling
}
id, err := db.CallIDForDigest(digest) Type guard
func hasDigest(s string) bool { return s != "" } Try / catch
id, err := db.CallIDForDigest(digest)
if err != nil {
if err.Error() == "no call digest" {
return nil // skip telemetry entries lacking digests
}
return err
} Prevention
- Validate digest non-empty at the telemetry ingestion boundary
- Ensure span exporters preserve the digest attribute
- Log and skip digest-less records instead of passing them through
When it happens
Trigger: Calling CallIDForDigest("") — typically when the digest was never populated in a telemetry span or record, or the field was lost during serialization.
Common situations: Processing telemetry traces where a span lacks the call digest attribute; a caller passing an unset variable instead of a computed digest.
Related errors
- acquire cache volume snapshot: empty snapshot ID
- encode persisted client filesync mirror: stable client id is
- path %s is a file, not a directory
- no command has been set
- no service command has been set
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/0f4cde7e696ed779.
Report an issue: GitHub.