dagger/dagger · error

failed to apply generated code: %w

Error message

failed to apply generated code: %w

What it means

After building the decode resolver, dagql extracts the underlying *Server (dagql server) from it via resolverServer to decode the result. If the resolver implementation does not expose a dagql server, decoding cannot proceed and this error names the concrete resolver Go type.

Source

Thrown at cmd/codegen/codegen.go:68

		introspectionSchemaVersion = resp.SchemaVersion
	} else {
		introspectionSchema, introspectionSchemaVersion, err = introspection.Introspect(ctx, cfg.Dag)
		if err != nil {
			return err
		}
	}

	// Set the parent schema
	generator.SetSchemaParents(introspectionSchema)

	for ctx.Err() == nil {
		generated, err := genFunc(ctx, introspectionSchema, introspectionSchemaVersion)
		if err != nil {
			return err
		}

		if err := generator.Apply(ctx, generated, cfg.OutputDir); err != nil {
			return fmt.Errorf("failed to apply generated code: %w", err)
		}

		for _, cmd := range generated.PostCommands {
			// Only set cmd.Dir if the command hasn't already specified one.
			// This allows generators to target a specific sub-directory (e.g.
			// the client module directory) without being overridden here.
			if cmd.Dir == "" {
				cmd.Dir = cfg.OutputDir
				if cfg.ModuleConfig != nil && cfg.ModuleConfig.ModuleName != "" {
					cmd.Dir = filepath.Join(cfg.OutputDir, cfg.ModuleConfig.ModuleSourcePath)
				}
			}
			cmd.Stdout = os.Stdout
			cmd.Stderr = os.Stderr
			slog.Info("running post-command:", "args", strings.Join(cmd.Args, " "))
			err := cmd.Run()
			if err != nil {
				slog.Error("post-command failed", "error", err)

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Pass the actual dagql *Server (or a resolver whose Server() method returns one) when loading persisted results.
  2. Implement the server-extraction interface on the custom TypeResolver, returning the underlying *Server.
  3. Check for nil-Server embedding — make sure the Server field is initialized before LoadResultByResultID is called.
  4. Audit code paths that substitute a test resolver into import/attach paths.

Example fix

// before
cache.LoadResultByResultID(ctx, session, testResolver, id)
// after
cache.LoadResultByResultID(ctx, session, dag, id) // dag is the initialized *dagql.Server
Defensive patterns

Strategy: validation

Validate before calling

if dag == nil || dag.Server() == nil { return errors.New("resolver must expose a dagql server") }

Type guard

func providesServer(r dagql.TypeResolver) bool {
  s, ok := r.(interface{ Server() *dagql.Server })
  return ok && s.Server() != nil
}

Try / catch

res, err := cache.LoadResultByResultID(ctx, session, dag, id)
if err != nil && strings.Contains(err.Error(), "does not provide dagql server") {
  return fmt.Errorf("configure real *dagql.Server: %w", err)
}

Prevention

When it happens

Trigger: resolverServer(decodeResolver) returns nil in ensurePersistedHitValueLoaded — the TypeResolver handed in (from e.g. loadResultByResultID's dag *Server or a wrapping resolver) does not implement the server-providing interface.

Common situations: Embedding dagql in a custom host with a minimal TypeResolver implementation; calling LoadResultByResultID with a resolver that is not backed by a *Server; test doubles used in production import paths.

Related errors


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