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.ID

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Ensure the digest is computed and set before calling CallIDForDigest (check the span/record that supplied it)
  2. Guard the caller: skip or log entries with empty digests instead of passing them through
  3. 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

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


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