dagger/dagger · error
parse rendered as-sdk for %q: %w
Error message
parse rendered as-sdk for %q: %w
What it means
After stripping existing as-sdk sections, rewriteModuleAsSDKSections renders each module's as-sdk block into fresh TOML text and parses it back with tomledit before merging. If the internally-rendered TOML cannot be parsed, the error is wrapped as "parse rendered as-sdk for %q". This indicates generated TOML (from ModuleEntry.AsSDK) is invalid — usually a bug or corrupted module metadata, not user TOML.
Source
Thrown at core/workspace/config_document.go:417
names := make([]string, 0, len(modules))
for name, entry := range modules {
// Preserve the marker even when empty: presence of AsSDK = "this
// install is an SDK," whether or not anything is authored yet.
if entry.AsSDK != nil {
names = append(names, name)
}
}
sort.Strings(names)
for _, name := range names {
var rendered strings.Builder
writeModuleAsSDK(&rendered, "modules."+formatConfigPathSegment(name), modules[name].AsSDK)
if rendered.Len() == 0 {
continue
}
asSDKDoc, parseErr := tomledit.Parse(strings.NewReader(rendered.String()))
if parseErr != nil {
return nil, fmt.Errorf("parse rendered as-sdk for %q: %w", name, parseErr)
}
doc.Sections = append(doc.Sections, asSDKDoc.Sections...)
}
var buf bytes.Buffer
var formatter tomledit.Formatter
if err := formatter.Format(&buf, doc); err != nil {
return nil, fmt.Errorf("format config after as-sdk rewrite: %w", err)
}
return buf.Bytes(), nil
}
// isModuleAsSDKHeading reports whether a section heading targets a module's
// as-sdk sub-block (e.g. [modules.go-sdk.as-sdk], [[modules.go-sdk.as-sdk.modules]]).
func isModuleAsSDKHeading(key []string) bool {
if len(key) < 3 || key[0] != "modules" {
return false
}View on GitHub (pinned to 82ba2681db)
Solutions
- Check the module name in dagger.json for characters needing quoting and rename it to a bare-safe name.
- Clear the corrupted as-sdk state: remove the module entry and re-add it via `dagger mod use` / CLI so as-sdk is regenerated.
- Update the Dagger CLI to the latest version — a renderer bug producing invalid TOML may already be fixed.
Example fix
// before: unescaped quote in rendered key makes generated TOML invalid [modules.bad] [modules.bad.as-sdk] "ke"y = true // after: safe names render valid TOML [modules.bad.as-sdk] key = true
Defensive patterns
Strategy: validation
Validate before calling
rendered := renderAsSDKTOML(entry) // replicate what writeModuleAsSDK emits
if _, err := toml.Parse([]byte(rendered)); err != nil {
return fmt.Errorf("module %q as-sdk state renders invalid TOML: %w", name, err)
} Try / catch
if err := UpdateConfigBytes(...); err != nil {
if strings.Contains(err.Error(), "parse rendered as-sdk") {
// drop the offending module's as-sdk block from dagger.json and re-add via CLI
}
} Prevention
- Rename modules whose names contain quotes or dots; unsafe names break generated TOML.
- Keep the Dagger CLI and stored dagger.json as-sdk state from the same version generation.
- After upgrading Dagger, re-run `dagger mod sync` so as-sdk state is regenerated cleanly.
When it happens
Trigger: UpdateConfigBytes where writeModuleAsSDK renders an as-sdk block for a module and tomledit.Parse(strings.NewReader(rendered.String())) fails — e.g. a module name or nested as-sdk key/value that renders into invalid TOML (unescaped quotes or dots in segment names).
Common situations: A module whose name or as-sdk content contains characters requiring quoting that the renderer did not escape; Dagger CLI version mismatch where stored as-sdk state no longer renders validly.
Related errors
- format config after as-sdk rewrite: %w
- generateModule is called but module config is missing
- update workspace config: %w
- install SDK modules at %s: %w
- install SDK for discovered module %q: %w
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/4edc17a801cec879.
Report an issue: GitHub.