{"record":{"id":"8f0365a2372634be","repo":"hashicorp/terraform","slug":"default-state-is-not-allowed-to-be-deleted","errorCode":null,"errorMessage":"default state is not allowed to be deleted","messagePattern":"default state is not allowed to be deleted","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/backend/remote-state/cos/backend_state.go","lineNumber":71,"sourceCode":"\t\tparts := strings.Split(strings.TrimPrefix(vv.Key, prefix), \"/\")\n\t\tif len(parts) > 0 && parts[0] != \"\" {\n\t\t\tws = append(ws, parts[0])\n\t\t}\n\t}\n\n\tsort.Strings(ws[1:])\n\tlog.Printf(\"[DEBUG] list all workspaces, workspaces: %v\", ws)\n\n\treturn ws, diags\n}\n\n// DeleteWorkspace deletes the named workspaces. The \"default\" state cannot be deleted.\nfunc (b *Backend) DeleteWorkspace(name string, _ bool) tfdiags.Diagnostics {\n\tvar diags tfdiags.Diagnostics\n\tlog.Printf(\"[DEBUG] delete workspace, workspace: %v\", name)\n\n\tif name == backend.DefaultStateName || name == \"\" {\n\t\treturn tfdiags.Diagnostics{}.Append(fmt.Errorf(\"default state is not allowed to be deleted\"))\n\t}\n\n\tc, err := b.client(name)\n\tif err != nil {\n\t\treturn diags.Append(err)\n\t}\n\n\treturn diags.Append(c.Delete())\n}\n\n// StateMgr manage the state, if the named state not exists, a new file will created\nfunc (b *Backend) StateMgr(name string) (statemgr.Full, tfdiags.Diagnostics) {\n\tvar diags tfdiags.Diagnostics\n\tlog.Printf(\"[DEBUG] state manager, current workspace: %v\", name)\n\n\tc, err := b.client(name)\n\tif err != nil {\n\t\treturn nil, diags.Append(err)","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/backend/remote-state/cos/backend_state.go#L53-L89","documentation":"Raised by Backend.DeleteWorkspace() (cos/backend_state.go:71) when asked to delete the 'default' workspace or an empty name. The default workspace's state is permanent and cannot be removed through the backend API.","triggerScenarios":"Calling DeleteWorkspace(backend.DefaultStateName) or DeleteWorkspace(\"\"); e.g. `terraform workspace delete default` or an automation script iterating all workspaces including default.","commonSituations":"A cleanup script that lists workspaces and deletes each one without skipping 'default'; misconfigured workspace name resolving to empty.","solutions":["Skip the 'default' workspace in any deletion loop.","To remove a non-default workspace, delete it by its explicit name.","Treat the default state as immutable for deletion purposes."],"exampleFix":"// before: deletes every workspace, including default\nfor ws in $(terraform workspace list); do terraform workspace delete $ws; done\n// after: skip default\nfor ws in $(terraform workspace list | sed 's/* //'); do\n  [ \"$ws\" = \"default\" ] && continue\n  terraform workspace delete \"$ws\"\ndone","handlingStrategy":"validation","validationCode":"// Guard deletion loops against the default workspace\nfunc safeDelete(b *Backend, name string) error {\n    if name == backend.DefaultStateName || strings.TrimSpace(name) == \"\" {\n        return fmt.Errorf(\"default state is not allowed to be deleted\")\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always skip 'default' in workspace cleanup scripts.","Validate workspace names are non-empty before deletion.","Treat the default state as permanent."],"tags":["cos","tencentcloud","workspace","default","validation","state"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}