{"record":{"id":"730d724ce9037142","repo":"derailed/k9s","slug":"no-column-index-for-s","errorCode":null,"errorMessage":"no column index for %s","messagePattern":"no column index for (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/view/scale_extender.go","lineNumber":92,"sourceCode":"\t\treturn\n\t}\n\tconfirm := tview.NewModalForm(\"<Scale>\", form)\n\tmsg := fmt.Sprintf(\"Scale %s %s?\", singularize(s.GVR().R()), paths[0])\n\tif len(paths) > 1 {\n\t\tmsg = fmt.Sprintf(\"Scale [%d] %s?\", len(paths), s.GVR().R())\n\t}\n\tconfirm.SetText(msg)\n\tconfirm.SetDoneFunc(func(int, string) {\n\t\ts.dismissDialog()\n\t})\n\ts.App().Content.AddPage(scaleDialogKey, confirm, false, false)\n\ts.App().Content.ShowPage(scaleDialogKey)\n}\n\nfunc (s *ScaleExtender) valueOf(col string) (string, error) {\n\tcolIdx, ok := s.GetTable().HeaderIndex(col)\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"no column index for %s\", col)\n\t}\n\treturn s.GetTable().GetSelectedCell(colIdx), nil\n}\n\nfunc (s *ScaleExtender) replicasFromReady(_ string) (string, error) {\n\treplicas, err := s.valueOf(\"READY\")\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\ttokens := strings.Split(replicas, \"/\")\n\tif len(tokens) < 2 {\n\t\treturn \"\", fmt.Errorf(\"unable to locate replicas from %s\", replicas)\n\t}\n\n\treturn strings.TrimRight(tokens[1], ui.DeltaSign), nil\n}\n","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/derailed/k9s/blob/2d3ccc6ba2ce98c3781bfc441bb3e884f072774f/internal/view/scale_extender.go#L74-L110","documentation":"The ScaleExtender resolves values from the browser table by column header name via HeaderIndex(col) (internal/view/scale_extender.go:92). If the table's header row does not contain the requested column (e.g. 'READY'), the lookup returns false and this error names the missing column.","triggerScenarios":"Pressing the scale keybinding on a resource whose table view lacks a READY column — most often because a custom views.yaml column override for that GVR dropped or renamed READY, or the extender was attached to a GVR whose renderer never emits that header.","commonSituations":"Customizing k9s views.yaml columns for deployments/statefulsets/replicasets and omitting READY; a plugin or fork attaching ScaleExtender to a CRD view with different headers; header case/label drift after a k9s upgrade changed column names.","solutions":["Check ~/.config/k9s/views.yaml for the resource and restore the READY column (remove the columns override to get defaults)","Confirm you are scaling a scalable workload (deploy/rs/sts) which ships a READY column by default","If you control the renderer, ensure the header includes 'READY'","Scale via kubectl as a fallback: 'kubectl scale deploy <name> --replicas=N'"],"exampleFix":"# before: ~/.config/k9s/views.yml drops READY\nviews:\n  v1/deployments:\n    columns:\n      - NAME:.metadata.name\n# -> no column index for READY\n\n# after: include READY or delete the override\nviews:\n  v1/deployments:\n    columns:\n      - NAME:.metadata.name\n      - READY:.status.readyReplicas","handlingStrategy":"validation","validationCode":"// verify the column exists before reading it\nif _, ok := s.GetTable().HeaderIndex(\"READY\"); !ok {\n    return \"\", fmt.Errorf(\"view lacks READY column; check views.yml override for %s\", s.GVR())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep the READY column in any views.yml override for scalable resources","Test custom view configs by opening the view and pressing the scale key once","Prefer the scale-subresource replica source when headers are customized"],"tags":["k9s","scale","views-config","table","yaml-config"],"backgroundTag":null,"analyzedSha":"2d3ccc6ba2ce98c3781bfc441bb3e884f072774f","analyzedAt":"2026-08-15T16:09:14.432Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}