dagger/dagger · error
result call frame %q implicit inputs: %w
Error message
result call frame %q implicit inputs: %w
What it means
Thrown by structuralSelfDigestAndInputRefs in dagql/result_call_frame.go:963 (only when includeImplicitInputs is true). While hashing frame.ImplicitInputs via appendResultCallArgSelfRefs, an implicit input failed to resolve/validate; the error is wrapped as 'result call frame %q implicit inputs: %w' and aborts the self digest and its structural input refs.
Source
Thrown at dagql/result_call_frame.go:963
}
h = nextH
inputRefs = nextInputRefs
h = h.WithDelim()
}
h = h.WithDelim()
if includeImplicitInputs {
for _, input := range frame.ImplicitInputs {
input = redactedCallArgForDigest(input)
if input == nil {
continue
}
nextH, nextInputRefs, err := appendResultCallArgSelfRefs(c, input, h, inputRefs)
if err != nil {
if h != nil {
h.Close()
}
return "", nil, fmt.Errorf("result call frame %q implicit inputs: %w", field, err)
}
h = nextH
inputRefs = nextInputRefs
h = h.WithDelim()
}
}
if frame.Module != nil {
if frame.Module.ResultRef == nil {
if h != nil {
h.Close()
}
return "", nil, fmt.Errorf("result call frame %q module: missing result ref", field)
}
inputRefs = append(inputRefs, ResultCallStructuralInputRef{
Result: frame.Module.ResultRef,
})
}View on GitHub (pinned to 82ba2681db)
Solutions
- Follow the wrapped error to the failing implicit input and fix or remove it from the frame.
- Ensure all implicit-input results are present in the session cache before computing the self digest.
- Validate implicit input refs (ref.Validate()) beforehand.
- Rebuild the frame via a live engine call instead of deserializing stale frames.
Example fix
// before
dig, refs, err := frame.SelfDigestAndInputRefs(ctx) // "container.withEnvVariable" implicit inputs: ...
// after
for _, in := range frame.ImplicitInputs {
if in.Value.Ref != nil && in.Value.Ref.Validate() != nil {
return fmt.Errorf("implicit input %q unresolvable; re-run the call", in.Name)
}
}
dig, refs, err := frame.SelfDigestAndInputRefs(ctx) Defensive patterns
Strategy: validation
Validate before calling
for _, in := range frame.ImplicitInputs {
if in.Value != nil && in.Value.Ref != nil {
if err := in.Value.Ref.Validate(); err != nil {
return fmt.Errorf("implicit input %q unresolvable: %w", in.Name, err)
}
}
} Type guard
func implicitInputsSelfRefSafe(frame *dagql.ResultCall) bool {
for _, in := range frame.ImplicitInputs {
if in.Value != nil && in.Value.Ref != nil && in.Value.Ref.Validate() != nil {
return false
}
}
return true
} Try / catch
dig, refs, err := frame.SelfDigestAndInputRefs(ctx)
if err != nil && strings.Contains(err.Error(), "implicit inputs:") {
// re-run the original call to regenerate implicit inputs, then retry
} Prevention
- Materialize implicit inputs (env, platform, secrets) in-session before digesting.
- Validate implicit input refs before calling SelfDigestAndInputRefs.
- Avoid digesting partially restored frames.
- Prefer freshly produced frames for cache-pairing digests.
When it happens
Trigger: SelfDigestAndInputRefs on a frame whose ImplicitInputs reference results that fail ref validation or are absent from the engine cache.
Common situations: Implicit inputs (env vars, platform, secrets) whose backing frames were never materialized in this session; stale or partially restored serialized sessions; hand-built frames with dangling implicit input refs.
Related errors
- failed to get module source context directory digest: %w
- scope module for sdk operation %q: set content digest: %w
- set content digest on %T: missing shared result
- set content digest on %T: current dagql cache: %w
- set content digest on %T: missing call frame
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/636e2652f38493ee.
Report an issue: GitHub.