{"record":{"id":"0f4cde7e696ed779","repo":"dagger/dagger","slug":"no-call-digest","errorCode":null,"errorMessage":"no call digest","messagePattern":"no call digest","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"dagql/dagui/db.go","lineNumber":1245,"sourceCode":"\t\tfor _, creator := range creators.Order {\n\t\t\tif seen[creator.CallDigest] {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif creatorCall := db.call(creator.CallDigest, seen); creatorCall != nil {\n\t\t\t\treturn creatorCall\n\t\t\t}\n\t\t}\n\t}\n\n\t// No call found\n\treturn nil\n}\n\n// CallIDForDigest rebuilds the ID of the dagql call with the given digest\n// from the call payloads this client has ingested.\nfunc (db *DB) CallIDForDigest(digest string) (*call.ID, error) {\n\tif digest == \"\" {\n\t\treturn nil, fmt.Errorf(\"no call digest\")\n\t}\n\trootCall := db.Call(digest)\n\tif rootCall == nil {\n\t\treturn nil, fmt.Errorf(\"cannot rebuild ID: %s\", missingCall{digest: digest})\n\t}\n\n\trecipe := &callpbv1.RecipeDAG{\n\t\tRootDigest:    rootCall.Digest,\n\t\tCallsByDigest: map[string]*callpbv1.Call{},\n\t}\n\tif missing := extractIntoDAG(recipe, db, rootCall.Digest); len(missing) > 0 {\n\t\treturn nil, fmt.Errorf(\"cannot rebuild ID for %s: %s\", frameLabel(rootCall), missing[0])\n\t}\n\tdag := &callpbv1.DAG{\n\t\tValue: &callpbv1.DAG_Recipe{Recipe: recipe},\n\t}\n\n\tvar id call.ID","sourceCodeStart":1227,"sourceCodeEnd":1263,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/dagql/dagui/db.go#L1227-L1263","documentation":"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.","triggerScenarios":"Calling CallIDForDigest(\"\") — typically when the digest was never populated in a telemetry span or record, or the field was lost during serialization.","commonSituations":"Processing telemetry traces where a span lacks the call digest attribute; a caller passing an unset variable instead of a computed digest.","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"],"exampleFix":"// before\nid, err := db.CallIDForDigest(spanDigest)\n// after\nif spanDigest == \"\" {\n    return nil // skip spans without digests\n}\nid, err := db.CallIDForDigest(spanDigest)","handlingStrategy":"validation","validationCode":"if digest == \"\" {\n    return nil, ErrNoDigest // skip before calling\n}\nid, err := db.CallIDForDigest(digest)","typeGuard":"func hasDigest(s string) bool { return s != \"\" }","tryCatchPattern":"id, err := db.CallIDForDigest(digest)\nif err != nil {\n    if err.Error() == \"no call digest\" {\n        return nil // skip telemetry entries lacking digests\n    }\n    return err\n}","preventionTips":["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"],"tags":["dagui","call-digest","validation"],"backgroundTag":"missing-call-digest","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}