{"record":{"id":"dd18283d55379087","repo":"chenhg5/cc-connect","slug":"context-usage-not-found-in-rollout","errorCode":null,"errorMessage":"context usage not found in rollout","messagePattern":"context usage not found in rollout","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"agent/codex/context_usage.go","lineNumber":133,"sourceCode":"\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}\n\thomeDir, err := os.UserHomeDir()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"resolve home directory: %w\", err)\n\t}\n\treturn filepath.Join(homeDir, \".codex\"), nil\n}\n","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/agent/codex/context_usage.go#L115-L151","documentation":"After successfully reading the rollout JSONL, loadContextUsageFromRollout calls readContextUsageFromRollout; if it parses fine but returns nil, no token/context-usage record was present in the transcript, so the function returns this error. The file exists but carries no usable usage data.","triggerScenarios":"readContextUsageFromRollout(path) returns (nil, nil) — the rollout JSONL for the session contains no context-usage/token_count entries, typically because the session has no completed model turns yet or the rollout predates the usage-record format.","commonSituations":"Querying context usage immediately after starting a session (only user input recorded); old codex rollout files lacking token_count fields; sessions aborted before the first assistant response.","solutions":["Wait until at least one model turn completes, then re-read the usage.","Inspect the rollout JSONL to confirm it contains token_count/context usage records.","Return a zero/default usage instead of an error when the file has no usage records yet.","Upgrade the codex CLI if rollouts consistently lack usage data."],"exampleFix":"// before\nif usage == nil {\n    return nil, path, fmt.Errorf(\"context usage not found in rollout\")\n}\n// after\nif usage == nil {\n    return &ContextUsage{}, path, nil // no turns yet; report empty usage\n}","handlingStrategy":"fallback","validationCode":"// Pre-check: does the rollout contain a usage line?\ndata, _ := os.ReadFile(path)\nif !bytes.Contains(data, []byte(\"token_count\")) {\n    return defaultUsage // nothing recorded yet\n}","typeGuard":null,"tryCatchPattern":"usage, path, err := loadContextUsageFromRollout(sessionID, extraEnv)\nif err != nil && strings.Contains(err.Error(), \"context usage not found\") {\n    usage = &ContextUsage{} // fall back to zero usage\n}","preventionTips":["Only query usage after an assistant response exists in the rollout.","Default the UI to 'unknown/0 usage' when records are absent.","Upgrade codex CLI if new rollouts consistently lack token_count records.","Log at debug instead of error for this expected-during-startup case."],"tags":["context-usage","empty-data","rollout"],"backgroundTag":"empty-result-set","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"}