{"record":{"id":"5d3b5dd56d60faa5","repo":"odysseus-dev/odysseus","slug":"session-manager-not-configured","errorCode":null,"errorMessage":"session_manager not configured","messagePattern":"session_manager not configured","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"routes/research/research_routes.py","lineNumber":653,"sourceCode":"    @router.post(\"/api/research/spinoff/{session_id}\")\n    async def research_spinoff(session_id: str, request: Request):\n        \"\"\"Create a new chat session pre-seeded with this research as context.\n\n        Reads the persisted research result + sources for `session_id`, creates\n        a fresh session (inheriting endpoint/model/headers from the source\n        session if available, otherwise from the resolved chat endpoint), and\n        injects a single system message containing the report and sources so\n        the user can ask follow-up questions in a clean conversation.\n        \"\"\"\n        user = _require_user(request)\n        _validate_session_id(session_id)\n        # SECURITY: gate on ownership before reading the persisted research —\n        # otherwise any authenticated user could spin off (and thereby read)\n        # another user's report by guessing its session ID. Mirrors every other\n        # endpoint in this file (see result_peek above).\n        owned_disk_path = _require_owned_or_active_research_path(session_id, user)\n        if session_manager is None:\n            raise HTTPException(500, \"session_manager not configured\")\n\n        # Load research data — prefer in-memory result, fall back to disk\n        result = research_handler.get_result(session_id)\n        sources = research_handler.get_sources(session_id) or []\n        query = \"\"\n\n        path = owned_disk_path\n        if path is not None:\n            try:\n                disk = json.loads(path.read_text(encoding=\"utf-8\"))\n                if not result:\n                    result = disk.get(\"result\")\n                if not sources:\n                    sources = disk.get(\"sources\", []) or []\n                query = disk.get(\"query\", \"\") or \"\"\n            except Exception as e:\n                logger.warning(f\"Could not read research JSON for spinoff: {e}\")\n","sourceCodeStart":635,"sourceCodeEnd":671,"githubUrl":"https://github.com/odysseus-dev/odysseus/blob/f9235ebbf13f693a6fd29ce70b097f6ec83705bf/routes/research/research_routes.py#L635-L671","documentation":"Error \"session_manager not configured\" thrown in odysseus-dev/odysseus.","triggerScenarios":"Triggered when the corresponding server-side validation or runtime check at the recorded location rejects the request or operation and returns this error message to the caller.","commonSituations":"See trigger scenarios.","solutions":["Restart the server; the session manager failed to initialize.","Check server startup logs for session manager errors."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f9235ebbf13f693a6fd29ce70b097f6ec83705bf","analyzedAt":"2026-08-14T21:47:48.359Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}