{"record":{"id":"9d524ef55a11a06a","repo":"ruvnet/RuView","slug":"zone-zone-id-not-found-9d524e","errorCode":null,"errorMessage":"Zone '{zone_id}' not found","messagePattern":"Zone '(.+?)' not found","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"warning","filePath":"archive/v1/src/api/routers/pose.py","lineNumber":192,"sourceCode":"        logger.error(f\"Error in pose analysis: {e}\")\n        raise HTTPException(\n            status_code=500,\n            detail=\"An internal error occurred. Please try again later.\"\n        )\n\n\n@router.get(\"/zones/{zone_id}/occupancy\")\nasync def get_zone_occupancy(\n    zone_id: str,\n    pose_service: PoseService = Depends(get_pose_service),\n    current_user: Optional[Dict] = Depends(get_current_user)\n):\n    \"\"\"Get current occupancy for a specific zone.\"\"\"\n    try:\n        occupancy = await pose_service.get_zone_occupancy(zone_id)\n        \n        if occupancy is None:\n            raise HTTPException(\n                status_code=404,\n                detail=f\"Zone '{zone_id}' not found\"\n            )\n        \n        return {\n            \"zone_id\": zone_id,\n            \"current_occupancy\": occupancy[\"count\"],\n            \"max_occupancy\": occupancy.get(\"max_occupancy\"),\n            \"persons\": occupancy[\"persons\"],\n            \"timestamp\": occupancy[\"timestamp\"]\n        }\n        \n    except HTTPException:\n        raise\n    except Exception as e:\n        logger.error(f\"Error getting zone occupancy: {e}\")\n        raise HTTPException(\n            status_code=500,","sourceCodeStart":174,"sourceCodeEnd":210,"githubUrl":"https://github.com/ruvnet/RuView/blob/4685618388a5e49fad5b3005806f3bdd6a7c25c3/archive/v1/src/api/routers/pose.py#L174-L210","documentation":"HTTP 404 from GET /pose/zones/{zone_id}/occupancy when pose_service.get_zone_occupancy returns None for that zone id. None means the zone has no occupancy record at all (unknown or not-yet-seen), as opposed to a known zone with zero persons. The zone_id comes straight from the path with no format validation — matching is exact.","triggerScenarios":"GET /pose/zones/kitchen-2/occupancy where 'kitchen-2' was never provisioned or has produced no occupancy data yet — get_zone_occupancy returns None and the handler raises 404.","commonSituations":"Typos or stale ids after zone re-provisioning; querying right after a service restart, before the first estimation pass populates occupancy; a frontend sending display names instead of zone ids.","solutions":["List zones that actually have data via GET /pose/zones/summary and use one of those ids","Check exact id spelling and case — matching is exact","If the zone should exist, trigger or wait for one estimation pass so occupancy is populated, then retry"],"exampleFix":"# before\nzone = 'Kitchen '  # trailing space from UI input\nresp = await client.get(f'/pose/zones/{zone}/occupancy')\n\n# after\nzones = (await client.get('/pose/zones/summary')).json()['zones']\nzone = next(z['zone_id'] for z in zones if z['zone_id'] == 'kitchen')\nresp = await client.get(f'/pose/zones/{zone}/occupancy')","handlingStrategy":"validation","validationCode":"summary = (await client.get('/pose/zones/summary')).json()\nknown = {z['zone_id'] for z in summary.get('zones', [])}\nif zone_id not in known:\n    raise ValueError(f'unknown zone {zone_id!r}; known zones: {sorted(known)}')","typeGuard":"def is_known_zone(zone_id, summary) -> bool:\n    return isinstance(zone_id, str) and zone_id in {z.get('zone_id') for z in summary.get('zones', [])}","tryCatchPattern":"resp = await client.get(f'/pose/zones/{zone_id}/occupancy')\nif resp.status_code == 404:\n    zone_id = await prompt_zone_selection()  # re-fetch valid ids, let the user pick\n    resp = await client.get(f'/pose/zones/{zone_id}/occupancy')\nresp.raise_for_status()","preventionTips":["Populate zone pickers from /zones/summary, never free-text input","Trim and case-normalize ids before sending","Remember a 404 here can also mean a valid zone with no data yet — retry after one estimation pass"],"tags":["python","fastapi","http-404","zones","occupancy"],"backgroundTag":null,"analyzedSha":"4685618388a5e49fad5b3005806f3bdd6a7c25c3","analyzedAt":"2026-08-16T06:09:40.886Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}