{"record":{"id":"70abc370c4727806","repo":"ruvnet/RuView","slug":"unknown-stream-stream-id","errorCode":null,"errorMessage":"Unknown stream: {stream_id}","messagePattern":"Unknown stream: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"plans/phase2-architecture/api-architecture.md","lineNumber":1418,"sourceCode":"                    stream_data = await response.json()\n                    stream_id = stream_data['id']\n                    rtmp_url = stream_data['ingests']['rtmp']['url']\n                    stream_key = stream_data['ingests']['rtmp']['stream_key']\n                    \n                    self.active_streams[stream_id] = {\n                        'rtmp_url': rtmp_url,\n                        'stream_key': stream_key,\n                        'status': 'created'\n                    }\n                    \n                    return stream_id, f\"{rtmp_url}/{stream_key}\"\n                else:\n                    raise Exception(f\"Failed to create stream: {response.status}\")\n    \n    async def start_pose_visualization_stream(self, stream_id: str):\n        \"\"\"Start streaming pose visualization\"\"\"\n        if stream_id not in self.active_streams:\n            raise ValueError(f\"Unknown stream: {stream_id}\")\n        \n        stream_info = self.active_streams[stream_id]\n        rtmp_endpoint = f\"{stream_info['rtmp_url']}/{stream_info['stream_key']}\"\n        \n        # Start FFmpeg process for streaming\n        ffmpeg_cmd = [\n            'ffmpeg',\n            '-f', 'rawvideo',\n            '-pixel_format', 'bgr24',\n            '-video_size', '1280x720',\n            '-framerate', '30',\n            '-i', '-',  # Input from stdin\n            '-c:v', 'libx264',\n            '-preset', 'veryfast',\n            '-maxrate', '3000k',\n            '-bufsize', '6000k',\n            '-pix_fmt', 'yuv420p',\n            '-g', '60',","sourceCodeStart":1400,"sourceCodeEnd":1436,"githubUrl":"https://github.com/ruvnet/RuView/blob/4685618388a5e49fad5b3005806f3bdd6a7c25c3/plans/phase2-architecture/api-architecture.md#L1400-L1436","documentation":"ValueError raised by start_pose_visualization_stream when the given stream_id is not a key in the manager's in-memory active_streams dict. Only streams created through the create-stream flow (which stores rtmp_url, stream_key, status='created') are known, and the registry lives only in process memory. Any ID that was never created, was created elsewhere, or was lost to a restart is 'unknown'.","triggerScenarios":"Calling start_pose_visualization_stream(stream_id) with an ID that (a) was never returned by create_stream, (b) came from a different server instance/worker (dict is process-local), (c) existed before a server restart wiped active_streams, or (d) was already removed by cleanup/stop logic.","commonSituations":"Load-balanced deployments where create hits worker A and start hits worker B; dev/test scripts passing hardcoded or fabricated stream IDs; server restarted between create and start; typo or truncated ID copied from logs.","solutions":["Create the stream first via the create endpoint and pass the returned stream_id to start_pose_visualization_stream unchanged","If the server restarted, re-create the stream to get a fresh ID before starting it","For multi-worker deployments, use sticky sessions or back active_streams with shared storage (e.g. Redis) instead of a plain dict","Catch the ValueError at the API layer and map it to a 404 with the offending stream_id so clients can recover"],"exampleFix":"# before\nawait stream_manager.start_pose_visualization_stream(requested_stream_id)  # ValueError if unknown\n\n# after\nif requested_stream_id not in stream_manager.active_streams:\n    requested_stream_id, url = await stream_manager.create_pose_visualization_stream()\nawait stream_manager.start_pose_visualization_stream(requested_stream_id)","handlingStrategy":"validation","validationCode":"if stream_id not in stream_manager.active_streams:\n    raise KeyError(f'refusing to start: {stream_id} not in active_streams; create it first')\nawait stream_manager.start_pose_visualization_stream(stream_id)","typeGuard":"def is_known_stream(manager, stream_id: str) -> bool:\n    return stream_id in manager.active_streams","tryCatchPattern":"try:\n    await manager.start_pose_visualization_stream(stream_id)\nexcept ValueError as e:\n    if 'Unknown stream' in str(e):\n        stream_id, _ = await manager.create_pose_visualization_stream()\n        await manager.start_pose_visualization_stream(stream_id)\n    else:\n        raise","preventionTips":["Treat the stream_id from create_stream as opaque and pass it back verbatim","Back active_streams with shared storage or pin sessions when running multiple workers","After any server restart, assume all stream IDs are invalid and re-create streams","Map this ValueError to HTTP 404 at the API boundary so clients can distinguish it from server errors"],"tags":["python","streaming","rtmp","state-management","validation"],"backgroundTag":null,"analyzedSha":"4685618388a5e49fad5b3005806f3bdd6a7c25c3","analyzedAt":"2026-08-16T06:09:40.886Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}