{"record":{"id":"28c53068dfbd5bb6","repo":"lima-vm/lima","slug":"field-provision-d-permissions-must-be-an-octal","errorCode":null,"errorMessage":"field `provision[%d].permissions` must be an octal number: %w","messagePattern":"field `provision\\[(.+?)\\]\\.permissions` must be an octal number: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/limayaml/validate.go","lineNumber":233,"sourceCode":"\t\t// This can lead to fatal Panic if p.Path is nil, better to return an error here\n\t\tswitch p.Mode {\n\t\tcase limatype.ProvisionModeData, limatype.ProvisionModeYQ:\n\t\t\tif p.Path == nil {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].path` must not be empty when mode is %#q\", i, p.Mode))\n\t\t\t\treturn errs\n\t\t\t}\n\t\t\tif !path.IsAbs(*p.Path) {\n\t\t\t\terrs = errors.Join(errs, fmt.Errorf(\"field `provision[%d].path` must be an absolute path\", i))\n\t\t\t}\n\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 {","sourceCodeStart":215,"sourceCodeEnd":251,"githubUrl":"https://github.com/lima-vm/lima/blob/dd909d0973cd84fa35f9e1693181b4585ea616c1/pkg/limayaml/validate.go#L215-L251","documentation":"Provision entries in data/yq modes write files into the guest, and `permissions` must be an octal mode string (e.g. \"0644\"). Validate() parses `permissions` with strconv.ParseInt(..., 8, 64); if it is not valid octal (or not set to a value FillDefaults accepts as octal), validation fails. This catches typos like \"755\" without a base prefix ambiguity or values containing invalid digits such as \"0649\" or \"0o644\" style formats that are not plain octal strings.","triggerScenarios":"`provision[x].permissions` set to a string that fails octal parsing (e.g. \"6448x\", \"099\", contains decimal digits 8/9) in a provision entry with mode data or yq, during create/start/restart/edit/apply/template validation.","commonSituations":"Copy-pasting chmod values with stray characters; using \"0o644\" Go-style prefix; writing decimal permissions like \"644\" actually is valid octal digits but \"684\" is not (8 invalid); template variables interpolating non-numeric permissions.","solutions":["Set permissions to a plain octal string, e.g. `permissions: \"0644\"` (quote it so YAML keeps it a string)","Remove the `permissions` field to accept the FillDefaults default","Check each digit is 0-7 and there are no `0o` prefixes or whitespace","Run `limactl validate <file>` to re-check"],"exampleFix":"# before\nprovision:\n  - mode: data\n    path: /etc/motd\n    permissions: 0o644\n# after\nprovision:\n  - mode: data\n    path: /etc/motd\n    permissions: \"0644\"","handlingStrategy":"validation","validationCode":"// Go: verify permissions is octal before Validate\nfor i, p := range cfg.Provision {\n    if p.Permissions != nil {\n        if _, err := strconv.ParseInt(*p.Permissions, 8, 64); err != nil {\n            return fmt.Errorf(\"provision[%d].permissions %q is not octal\", i, *p.Permissions)\n        }\n    }\n}","typeGuard":"func isOctalPerm(s string) bool {\n    _, err := strconv.ParseInt(s, 8, 64)\n    return err == nil\n}","tryCatchPattern":null,"preventionTips":["Quote permission values in YAML (\"0644\") so they stay strings and keep digits 0-7","Avoid `0o` prefixes; Lima expects plain octal strings","Add a lint rule or schema pattern like ^[0-7]{3,4}$ for permissions"],"tags":["lima","config-validation","provision","permissions"],"backgroundTag":"invalid-field-format","analyzedSha":"dd909d0973cd84fa35f9e1693181b4585ea616c1","analyzedAt":"2026-09-01T14:24:59.842Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}