Engine.Up returns a *Workspace with Config populated from Resolve. Engine.Attach returns a *Workspace whose Config is reconstructed from container labels and inspect output (labels.go::configFromContainerLabels) — only LocalWorkspaceFolder, ContainerWorkspaceFolder, ContainerUser are populated. Other fields (Lifecycle, Mounts, Customizations, etc.) are zero values.
This is enough to drive the substituter (Exec works), but a caller reading ws.Config.Lifecycle after Attach will see empty phases. Document the asymmetry on Workspace.Config and Engine.Attach GoDoc.
Possibly: add a sentinel field like Config.Partial bool so callers can detect they got the minimal form.
Engine.Upreturns a*WorkspacewithConfigpopulated fromResolve.Engine.Attachreturns a*WorkspacewhoseConfigis reconstructed from container labels and inspect output (labels.go::configFromContainerLabels) — onlyLocalWorkspaceFolder,ContainerWorkspaceFolder,ContainerUserare populated. Other fields (Lifecycle,Mounts,Customizations, etc.) are zero values.This is enough to drive the substituter (Exec works), but a caller reading
ws.Config.Lifecycleafter Attach will see empty phases. Document the asymmetry onWorkspace.ConfigandEngine.AttachGoDoc.Possibly: add a sentinel field like
Config.Partial boolso callers can detect they got the minimal form.