{"record":{"id":"ba171f1a05122c9b","repo":"chenhg5/cc-connect","slug":"session-file-not-found-for-s","errorCode":null,"errorMessage":"session file not found for %s","messagePattern":"session file not found for (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agent/codex/context_usage.go","lineNumber":126,"sourceCode":"\treturn &cloned\n}\n\nfunc loadContextUsageFromRollout(extraEnv []string, sessionID, cachedPath string) (*core.ContextUsage, string, error) {\n\tpath := strings.TrimSpace(cachedPath)\n\tif path != \"\" {\n\t\tusage, err := readContextUsageFromRollout(path)\n\t\tif err == nil && usage != nil {\n\t\t\treturn usage, path, nil\n\t\t}\n\t}\n\n\tcodexHome, err := resolveCodexHome(extraEnv)\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\tpath = findSessionFileInCodexHome(codexHome, sessionID)\n\tif path == \"\" {\n\t\treturn nil, \"\", fmt.Errorf(\"session file not found for %s\", sessionID)\n\t}\n\tusage, err := readContextUsageFromRollout(path)\n\tif err != nil {\n\t\treturn nil, path, err\n\t}\n\tif usage == nil {\n\t\treturn nil, path, fmt.Errorf(\"context usage not found in rollout\")\n\t}\n\treturn usage, path, nil\n}\n\nfunc resolveCodexHome(extraEnv []string) (string, error) {\n\tif value := getenvFromList(extraEnv, \"CODEX_HOME\"); value != \"\" {\n\t\treturn strings.TrimSpace(value), nil\n\t}\n\tif value := strings.TrimSpace(os.Getenv(\"CODEX_HOME\")); value != \"\" {\n\t\treturn value, nil\n\t}","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/agent/codex/context_usage.go#L108-L144","documentation":"loadContextUsageFromRollout locates the rollout JSONL file for a session under the resolved CODEX_HOME using findSessionFileInCodexHome. When no file matches the session ID it cannot read context usage and returns this error to refreshContextUsageFromRollout. It means the on-disk transcript for the session is missing.","triggerScenarios":"refreshContextUsageFromRollout invoked for a sessionID whose rollout file does not exist under CODEX_HOME — e.g. session started before any rollout was flushed, wrong CODEX_HOME resolved from extraEnv, or the file was deleted/pruned.","commonSituations":"Context-usage polling racing session startup (rollout not yet created); CODEX_HOME set differently in the session env vs the polling process; codex upgraded and rollout layout changed; user manually cleaned ~/.codex/sessions.","solutions":["Confirm CODEX_HOME (explicit env, else ~/.codex) contains sessions/<id> rollout files.","Retry after the session has produced at least one turn so the rollout file exists.","If polling, treat this as transient and skip until the file appears instead of failing hard.","Check the codex CLI version still writes rollouts under the expected directory layout."],"exampleFix":"// before\nusage, err := refreshContextUsageFromRollout(sessionID)\nif err != nil { return err }\n// after\nusage, err := refreshContextUsageFromRollout(sessionID)\nif err != nil {\n    if strings.Contains(err.Error(), \"session file not found\") {\n        return nil, nil // rollout not created yet; retry later\n    }\n    return nil, err\n}","handlingStrategy":"retry","validationCode":"codexHome := os.Getenv(\"CODEX_HOME\")\nif codexHome == \"\" { h, _ := os.UserHomeDir(); codexHome = filepath.Join(h, \".codex\") }\nif _, err := os.Stat(filepath.Join(codexHome, \"sessions\")); os.IsNotExist(err) {\n    // rollout dir not ready; skip polling this round\n}","typeGuard":null,"tryCatchPattern":"usage, err := refreshContextUsageFromRollout(sessionID)\nif err != nil {\n    if strings.Contains(err.Error(), \"session file not found\") {\n        time.Sleep(pollInterval) // rollout may not exist yet\n        return retryOnce(sessionID)\n    }\n    return err\n}","preventionTips":["Start context-usage polling only after the first model turn completes.","Ensure CODEX_HOME in the polling process matches the session's environment.","Skip-not-fail: treat missing rollout as 'no data yet' in UI polling loops.","Watch codex CLI release notes for rollout layout changes."],"tags":["session","file-not-found","context-usage"],"backgroundTag":"file-not-found","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}