"""FastAPI app (spec M3). FROZEN after foundation — lanes never edit routes or shapes. Serves the synthetic project fully so lane C can treat this API as finished: GET /api/manifest -> {videos:[{id,filename,url,duration_s,fps,width,height, offset_ms,drift_ppm}], t_global_max, has_poses} GET /api/videos/{id}/poses -> [{frame_idx,t_video_s,q:[w,x,y,z],t:[x,y,z], intrinsics:{fx,fy,cx,cy},registered}] GET /api/pointcloud -> points.ply (binary; Range-capable) GET /api/anchors -> [...] POST /api/anchors GET /api/events -> [...] POST /api/events/detect {t_global_s?, window_s?} -> runs M7 detection POST /api/annotations {video_id, t_video_s, bbox:[x0,y0,x1,y1]} -> {anchor_id?, point?} Source videos in ``data/raw`` are mounted at ``/media`` via Starlette ``StaticFiles``, which supports HTTP Range (required for ``