{"record":{"id":"c2c7a2ca34b1c5f2","repo":"lima-vm/lima","slug":"field-provision-d-overwrite-can-only-be-set-wh","errorCode":null,"errorMessage":"field `provision[%d].overwrite` can only be set when mode is %#q","messagePattern":"field `provision\\[(.+?)\\]\\.overwrite` can only be set when mode is %#q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/limayaml/validate.go","lineNumber":243,"sourceCode":"\t\t\tif p.Mode == limatype.ProvisionModeData && p.Content == nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].content` must not be empty when mode is %#q\", i, p.Mode))\n\t\t\t}\n\t\t\tif p.Mode == limatype.ProvisionModeYQ && p.Expression == nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].expression` must not be empty when mode is %#q\", i, p.Mode))\n\t\t\t}\n\t\t\t// FillDefaults makes sure that p.Permissions is not nil\n\t\t\tif _, err := strconv.ParseInt(*p.Permissions, 8, 64); err != nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].permissions` must be an octal number: %w\", i, err))\n\t\t\t}\n\t\tdefault:\n\t\t\tif (p.Script == nil || *p.Script == \"\") && p.Mode != limatype.ProvisionModeAnsible {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].script` must not be empty\", i))\n\t\t\t}\n\t\t\tif p.Content != nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].content` can only be set when mode is %#q\", i, limatype.ProvisionModeData))\n\t\t\t}\n\t\t\tif p.Overwrite != nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].overwrite` can only be set when mode is %#q\", i, limatype.ProvisionModeData))\n\t\t\t}\n\t\t\tif p.Owner != nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].owner` can only be set when mode is %#q\", i, limatype.ProvisionModeData))\n\t\t\t}\n\t\t\tif p.Path != nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].path` can only be set when mode is %#q, or %#q\", i, limatype.ProvisionModeData, limatype.ProvisionModeYQ))\n\t\t\t}\n\t\t\tif p.Permissions != nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].permissions` can only be set when mode is %#q, or %#q\", i, limatype.ProvisionModeData, limatype.ProvisionModeYQ))\n\t\t\t}\n\t\t\tif p.Format != nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].format` can only be set when mode is %#q\", i, limatype.ProvisionModeYQ))\n\t\t\t}\n\t\t}\n\t\tif p.Playbook != \"\" {\n\t\t\tif p.Mode != limatype.ProvisionModeAnsible {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].playbook can only be set when mode is %#q\", i, limatype.ProvisionModeAnsible))\n\t\t\t}","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/lima-vm/lima/blob/dd909d0973cd84fa35f9e1693181b4585ea616c1/pkg/limayaml/validate.go#L225-L261","documentation":"`overwrite` controls whether a data-mode file write replaces an existing file, so it is only valid when `mode` is \"data\". Setting it on script, boot, dependency, ansible, or yq entries is rejected by Validate() to keep per-mode field usage strict. The rendered message names `\"data\"` as the only allowed mode.","triggerScenarios":"A provision entry with any mode other than data that sets `overwrite: true/false`, during create/start/restart/edit/apply/template validation.","commonSituations":"Adding overwrite to a yq entry expecting it to control in-place editing; bulk-copied data-entry keys applied to script entries; template tools emitting overwrite for all provision entries.","solutions":["Add `mode: data` (with `path` and `content`) if overwrite semantics are needed","Delete the `overwrite` field from non-data entries","Split into two entries: one data entry for file writing, one script entry for commands"],"exampleFix":"# before\nprovision:\n  - mode: yq\n    path: /etc/foo.yaml\n    overwrite: true\n    expression: .x = 1\n# after\nprovision:\n  - mode: yq\n    path: /etc/foo.yaml\n    expression: .x = 1","handlingStrategy":"validation","validationCode":"// Go: overwrite is data-mode only\nfor i, p := range cfg.Provision {\n    mode := limatype.ProvisionModeSystem\n    if p.Mode != nil { mode = *p.Mode }\n    if p.Overwrite != nil && mode != limatype.ProvisionModeData {\n        return fmt.Errorf(\"provision[%d]: overwrite requires mode data\", i)\n    }\n}","typeGuard":"func overwriteAllowed(p limatype.Provision) bool {\n    return p.Overwrite == nil || (p.Mode != nil && *p.Mode == limatype.ProvisionModeData)\n}","tryCatchPattern":null,"preventionTips":["Only add overwrite to entries that also have `content` and `path`","Do not assume yq entries overwrite in-place control via `overwrite`","Run `limactl validate` before limactl create/edit"],"tags":["lima","config-validation","provision","mode-mismatch"],"backgroundTag":"invalid-field-combination","analyzedSha":"dd909d0973cd84fa35f9e1693181b4585ea616c1","analyzedAt":"2026-09-01T14:24:59.842Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}