{"record":{"id":"489c5020ba7ac405","repo":"gastownhall/beads","slug":"failed-to-parse-gh-output-w","errorCode":null,"errorMessage":"failed to parse gh output: %w","messagePattern":"failed to parse gh output: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/bd/gate.go","lineNumber":1085,"sourceCode":"\t\targs = append(args, \"--repo\", repo)\n\t}\n\tstdout, stderr, runErr := runGH(args...)\n\tif runErr != nil {\n\t\t// Check if gh CLI is not found\n\t\tif strings.Contains(string(stderr), \"command not found\") ||\n\t\t\tstrings.Contains(runErr.Error(), \"executable file not found\") {\n\t\t\treturn false, false, \"\", fmt.Errorf(\"gh CLI not installed\")\n\t\t}\n\t\t// Check if run not found\n\t\tif strings.Contains(string(stderr), \"not found\") {\n\t\t\treturn false, true, \"workflow run not found\", nil\n\t\t}\n\t\treturn false, false, \"\", fmt.Errorf(\"gh run view failed: %s\", string(stderr))\n\t}\n\n\tvar status ghRunStatus\n\tif parseErr := json.Unmarshal(stdout, &status); parseErr != nil {\n\t\treturn false, false, \"\", fmt.Errorf(\"failed to parse gh output: %w\", parseErr)\n\t}\n\n\t// Evaluate status\n\tswitch status.Status {\n\tcase \"completed\":\n\t\tswitch status.Conclusion {\n\t\tcase \"success\":\n\t\t\treturn true, false, fmt.Sprintf(\"workflow '%s' succeeded\", status.Name), nil\n\t\tcase \"failure\":\n\t\t\treturn false, true, fmt.Sprintf(\"workflow '%s' failed\", status.Name), nil\n\t\tcase \"cancelled\", \"canceled\":\n\t\t\treturn false, true, fmt.Sprintf(\"workflow '%s' was canceled\", status.Name), nil\n\t\tcase \"skipped\":\n\t\t\treturn true, false, fmt.Sprintf(\"workflow '%s' was skipped\", status.Name), nil\n\t\tdefault:\n\t\t\treturn false, true, fmt.Sprintf(\"workflow '%s' concluded with %s\", status.Name, status.Conclusion), nil\n\t\t}\n\tcase \"in_progress\", \"queued\", \"pending\", \"waiting\":","sourceCodeStart":1067,"sourceCodeEnd":1103,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/cmd/bd/gate.go#L1067-L1103","documentation":"Wraps a JSON unmarshal failure when parsing `gh run view --json status,conclusion,name` output (cmd/bd/gate.go:1085). gh exited 0 but produced output that doesn't fit the expected ghRunStatus shape.","triggerScenarios":"gh succeeds but stdout is not the expected JSON — empty output, gh CLI version too old lacking --json fields, or gh emitting warnings/human text mixed into stdout.","commonSituations":"Ancient gh version (pre --json support), locale/env causing gh to print non-JSON to stdout, piping where stderr text lands in stdout, truncated output from a broken terminal wrapper.","solutions":["Check the wrapped parse error (%w) for the JSON offset/type mismatch","Upgrade the gh CLI (`gh upgrade` or reinstall) to a version supporting `gh run view --json`","Run `gh run view <id> --json status,conclusion,name` manually to inspect raw output","Confirm gh is not aliased/wrapped by a script polluting stdout"],"exampleFix":"// before\ngh version 0.9 (no --json on run view)\n// after\nbrew upgrade gh && gh --version  # >= 2.x","handlingStrategy":"validation","validationCode":"if out, err := exec.Command(\"gh\", \"--version\").Output(); err != nil || !strings.HasPrefix(string(out), \"gh version 2\") {\n    // upgrade gh: --json output required\n}","typeGuard":null,"tryCatchPattern":"if _, _, _, err := checkGHRunStatus(runID); err != nil && strings.Contains(err.Error(), \"failed to parse gh output\") {\n    // capture raw output for diagnosis; likely gh version or environment issue\n}","preventionTips":["Keep gh CLI current (>= 2.x)","Avoid wrappers/aliases around gh that print to stdout","Set GH_PAGER=cat to suppress pager output"],"tags":["json","gh-cli","parsing"],"backgroundTag":"json-parse-failed","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}