{"record":{"id":"2be5a277ec1cd244","repo":"derailed/k9s","slug":"failed-to-process-label-selector-template-w","errorCode":null,"errorMessage":"failed to process label selector template: %w","messagePattern":"failed to process label selector template: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/view/custom_jump.go","lineNumber":60,"sourceCode":"\tif mv, ok := customViewers[targetGVR]; ok {\n\t\tif mv.viewerFn != nil {\n\t\t\tv = mv.viewerFn(targetGVR)\n\t\t} else {\n\t\t\tv = NewBrowser(targetGVR)\n\t\t\tif mv.enterFn != nil {\n\t\t\t\tv.GetTable().SetEnterFn(mv.enterFn)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tv = NewScaleExtender(NewOwnerExtender(NewBrowser(targetGVR)))\n\t}\n\n\t// Build label selector if specified\n\tvar labelSel labels.Selector\n\tif rule.LabelSelector != \"\" {\n\t\tlabelStr, labelErr := applyTemplate(rule.LabelSelector, sourceObj)\n\t\tif labelErr != nil {\n\t\t\treturn fmt.Errorf(\"failed to process label selector template: %w\", labelErr)\n\t\t}\n\t\tlabelSel, labelErr = labels.Parse(labelStr)\n\t\tif labelErr != nil {\n\t\t\treturn fmt.Errorf(\"invalid label selector: %w\", labelErr)\n\t\t}\n\t}\n\n\t// Set label selector if we have one\n\tif labelSel != nil {\n\t\tv.SetLabelSelector(labelSel, true)\n\t}\n\n\t// Build field selector if specified\n\tvar fieldSel string\n\tif rule.FieldSelector != \"\" {\n\t\tvar fieldErr error\n\t\tfieldSel, fieldErr = applyTemplate(rule.FieldSelector, sourceObj)\n\t\tif fieldErr != nil {","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/derailed/k9s/blob/2d3ccc6ba2ce98c3781bfc441bb3e884f072774f/internal/view/custom_jump.go#L42-L78","documentation":"The jump rule's labelSelector field is rendered through applyTemplate(rule.LabelSelector, sourceObj) against the source object's unstructured map. Rendering failed — typically the template references a field that does not exist on the object (map lookup miss) or uses syntax the mini-template engine rejects. The %w carries the template error detail.","triggerScenarios":"A jump rule like labelSelector: \"app={{ .metadata.labels.app }}\" used on a source object that has no metadata.labels.app key; referencing nested paths absent from the fetched object; template placeholders with unsupported functions.","commonSituations":"Rules authored against one resource kind (Deployments with tier labels) reused on kinds lacking those labels; CRDs with different metadata shapes; quoting mistakes in k9s config YAML that mangle the {{ }} placeholders.","solutions":["Inspect the actual object (kubectl get <gvr> <name> -o yaml) and confirm every referenced field exists","Point the template at fields guaranteed present, e.g. {{ .metadata.name }} or {{ .metadata.namespace }}","If you do not need substitution, use a static selector string with no {{ }} at all"],"exampleFix":"// before (k9s config, jumps rule)\nlabelSelector: \"app={{ .metadata.labels.app }},tier={{ .spec.tier }}\"\n// after — only reference fields that exist on every source object\nlabelSelector: \"app={{ .metadata.labels.app }}\"","handlingStrategy":"validation","validationCode":"// dry-run the template against a live object before configuring the rule\nobj, _ := fetchResourceObject(app, sourceGVR, sourcePath)\nif _, err := applyTemplate(rule.LabelSelector, obj); err != nil {\n    return fmt.Errorf(\"labelSelector template invalid: %w\", err)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Reference only fields present on every object of the source kind (check kubectl get -o yaml)","Prefer .metadata.name/.metadata.namespace in templates — they always exist","Keep templates trivial (single-level lookups); complex logic belongs in admission/webhooks, not jump configs"],"tags":["kubernetes","k9s","template","label-selector","config"],"backgroundTag":null,"analyzedSha":"2d3ccc6ba2ce98c3781bfc441bb3e884f072774f","analyzedAt":"2026-08-15T16:09:14.432Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}