{"record":{"id":"814fa8a12ff2a1b0","repo":"plandex-ai/plandex","slug":"error-reading-result-files-v","errorCode":null,"errorMessage":"error reading result files: %v","messagePattern":"error reading result files: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/server/db/result_helpers.go","lineNumber":430,"sourceCode":"\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar result PlanFileResult\n\t\t\terr = json.Unmarshal(bytes, &result)\n\n\t\t\tif err != nil {\n\t\t\t\terrCh <- fmt.Errorf(\"error unmarshalling result file: %v\", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tresultCh <- &result\n\t\t}(file)\n\t}\n\n\tfor i := 0; i < len(files); i++ {\n\t\tselect {\n\t\tcase err := <-errCh:\n\t\t\treturn nil, fmt.Errorf(\"error reading result files: %v\", err)\n\t\tcase result := <-resultCh:\n\t\t\tresults = append(results, result)\n\t\t}\n\t}\n\n\tsort.Slice(results, func(i, j int) bool {\n\t\treturn results[i].CreatedAt.Before(results[j].CreatedAt)\n\t})\n\n\treturn results, nil\n}\n\nfunc GetPlanFileResultById(orgId, planId, resultId string) (*PlanFileResult, error) {\n\tresultsDir := getPlanResultsDir(orgId, planId)\n\n\tbytes, err := os.ReadFile(filepath.Join(resultsDir, resultId+\".json\"))\n\n\tif err != nil {","sourceCodeStart":412,"sourceCodeEnd":448,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/db/result_helpers.go#L412-L448","documentation":"Aggregate error for GetPlanFileResults: when any per-file goroutine reports a read, unmarshal, or panic error on errCh, the collection loop returns immediately with this wrapper, discarding partially collected results.","triggerScenarios":"Any child error [513]/[514]/[515] fires while the main loop is collecting len(files) results.","commonSituations":"A single stale result file breaks plan listing used by RejectPlanFile; flaky disk causes intermittent failures across many files.","solutions":["Fix the root cause named in the wrapped inner error (path/JSON detail is preserved)","Quarantine or delete malformed result files","Harden: collect errors for all files and return partial results with warnings instead of first-error-abort","Add monitoring for recurring corruption to catch partial-write bugs"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"for _, f := range resultFiles(dir) {\n    if !json.Valid(mustRead(f)) {\n        log.Printf(\"pre-check: malformed result file %s — quarantine before calling\", f)\n    }\n}","typeGuard":null,"tryCatchPattern":"results, err := db.GetPlanFileResults(orgId, planId)\nif err != nil {\n    // inner error names the failing file; fix/quarantine then retry once\n    return fmt.Errorf(\"GetPlanFileResults: %w\", err)\n}","preventionTips":["Quarantine bad files instead of deleting (preserve for debugging)","Alert on corruption frequency — usually signals partial writes","Test upgrades against old result file versions"],"tags":["go","error-wrapping","concurrency"],"backgroundTag":"json-unmarshal-failed","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}