{"record":{"id":"2d549db16a5bc9e4","repo":"derailed/k9s","slug":"unable-to-parse-path-q","errorCode":null,"errorMessage":"unable to parse path: %q","messagePattern":"unable to parse path: %q","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/view/workload.go","lineNumber":82,"sourceCode":"\t\tui.KeyY:      ui.NewKeyAction(yamlAction, w.yamlCmd, true),\n\t\tui.KeyD:      ui.NewKeyAction(\"Describe\", w.describeCmd, true),\n\t})\n}\n\nfunc parsePath(path string) (*client.GVR, string, bool) {\n\ttt := strings.Split(path, \"|\")\n\tif len(tt) != 3 {\n\t\tslog.Error(\"Unable to parse workload path\", slogs.Path, path)\n\t\treturn client.NoGVR, client.FQN(\"\", \"\"), false\n\t}\n\n\treturn client.NewGVR(tt[0]), client.FQN(tt[1], tt[2]), true\n}\n\nfunc (*Workload) showRes(app *App, _ ui.Tabular, _ *client.GVR, path string) {\n\tgvr, fqn, ok := parsePath(path)\n\tif !ok {\n\t\tapp.Flash().Err(fmt.Errorf(\"unable to parse path: %q\", path))\n\t\treturn\n\t}\n\tapp.gotoResource(gvr.String(), fqn, false, true)\n}\n\nfunc (w *Workload) deleteCmd(evt *tcell.EventKey) *tcell.EventKey {\n\tselections := w.GetTable().GetSelectedItems()\n\tif len(selections) == 0 {\n\t\treturn evt\n\t}\n\n\tw.Stop()\n\tdefer w.Start()\n\t{\n\t\tmsg := fmt.Sprintf(\"Delete %s %s?\", w.GVR().R(), selections[0])\n\t\tif len(selections) > 1 {\n\t\t\tmsg = fmt.Sprintf(\"Delete %d marked %s?\", len(selections), w.GVR())\n\t\t}","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/derailed/k9s/blob/2d3ccc6ba2ce98c3781bfc441bb3e884f072774f/internal/view/workload.go#L64-L100","documentation":"The Workload aggregated view composes row paths as 'gvr|namespace|name'; parsePath (internal/view/workload.go:69) splits on '|' and requires exactly 3 tokens. showRes (Enter on a row) calls parsePath and flashes this error when the selected row's path does not have the 3-part shape.","triggerScenarios":"Pressing Enter on a workload row whose path column is not 'gvr|ns|name' — caused by a views.yaml column override for the workload view replacing the composed first column, or an empty namespace/name collapsing the segments.","commonSituations":"Customizing the workload (pulses) view columns and dropping/reordering the path column; cluster-scoped resources rendered in workload with empty namespace producing 'gvr||name' still parses, but a fully mangled cell does not; forks that change the path format.","solutions":["Check ~/.config/k9s/views.yml for a workload view override and remove/repair it so col 1 remains the gvr|ns|name path","Navigate to the concrete resource view directly (:deploy, :po) and open the resource from there","Reproduce what the row contains: k9s logs print 'Unable to parse workload path' with the raw value — use it to see which token is missing","Upgrade k9s if the path format changed between versions (custom fork vs upstream)"],"exampleFix":"// before: path = \"v1/deployments ns1 web\" (spaces, not '|')\n// -> unable to parse path: \"v1/deployments ns1 web\"\n\n// after: canonical 3-token path\n// path = \"apps/v1/deployments|ns1|web\"\n// parsePath -> GVR(apps/v1/deployments), FQN(\"ns1/web\"), true","handlingStrategy":"validation","validationCode":"// guard the composed path before navigation\nfunc validWorkloadPath(p string) bool {\n    tt := strings.Split(p, \"|\")\n    return len(tt) == 3 && tt[0] != \"\" && tt[2] != \"\"\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not override the workload view's first (path) column in views.yml","Add the len==3 guard wherever you synthesize Workload row paths","Log raw paths on failure (k9s already logs 'Unable to parse workload path') to catch bad columns early"],"tags":["k9s","workload-view","path-parsing","views-config"],"backgroundTag":null,"analyzedSha":"2d3ccc6ba2ce98c3781bfc441bb3e884f072774f","analyzedAt":"2026-08-15T16:09:14.432Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}