{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-4be7aad2b53565cb", "name": "Possibly dead Python function: voice_runner", "shortDescription": {"text": "Possibly dead Python function: voice_runner"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3c112e6df85efc0", "name": "Possibly dead Python function: callback", "shortDescription": {"text": "Possibly dead Python function: callback"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf6007401bf3c846", "name": "Possibly dead Python function: is_active", "shortDescription": {"text": "Possibly dead Python function: is_active"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94baebab246829bb", "name": "Possibly dead Python function: chat_text", "shortDescription": {"text": "Possibly dead Python function: chat_text"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-054f874a7db71362", "name": "Possibly dead Python function: audio_callback", "shortDescription": {"text": "Possibly dead Python function: audio_callback"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c44032fc5f35deb", "name": "Insecure pattern 'local_storage_auth_token' in Family_Robot_Web_PC/src/stores/authStore.ts:18", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in Family_Robot_Web_PC/src/stores/authStore.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00a9c372381a87f3", "name": "Insecure pattern 'cors_wildcard' in Family_Robot_pi/backend/app.py:27", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in Family_Robot_pi/backend/app.py:27"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "3 test file(s) for 67 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 82 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d0fa51418ae692bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 Family_Robot_Web_PC/src/services/api.ts:122", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 Family_Robot_Web_PC/src/services/api.ts:122"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2de52f1720464b0b", "name": "Network/subprocess call without timeout or try/except \u2014 Family_Robot_pi/audio/stt_engine.py:127", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 Family_Robot_pi/audio/stt_engine.py:127"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5fef730403f80cae", "name": "Network/subprocess call without timeout or try/except \u2014 Family_Robot_pi/audio/tts_engine.py:142", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 Family_Robot_pi/audio/tts_engine.py:142"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEEPSEEK_API_KEY`, `JAVA_API_URL`, `VITE_BACKEND_HTTP_URL`, `VITE_JAVA_API_URL`, `VITE_PI_HTTP_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nFamily_Robot_pi/interaction/webrtc_call.py:stop, Family_Robot_pi/interaction/webrtc_call.py:stop\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e3181eaecf6a7da", "name": "FastAPI POST `handle_voice_reminder` without auth dependency \u2014 Family_Robot_pi/backend/internal/voice_reminder.py:33", "shortDescription": {"text": "FastAPI POST `handle_voice_reminder` without auth dependency \u2014 Family_Robot_pi/backend/internal/voice_reminder.py:33"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-817e553bb5c20a7f", "name": "FastAPI POST `handle_fall_alert` without auth dependency \u2014 Family_Robot_pi/backend/emergency/handler.py:34", "shortDescription": {"text": "FastAPI POST `handle_fall_alert` without auth dependency \u2014 Family_Robot_pi/backend/emergency/handler.py:34"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f7491419613d1713", "name": "Dangling fetch: POST /api/auth/login (Family_Robot_Web_PC/src/services/api.ts:54)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (Family_Robot_Web_PC/src/services/api.ts:54)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:54` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca472224db342dee", "name": "Dangling fetch: POST /api/auth/register (Family_Robot_Web_PC/src/services/api.ts:61)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/register (Family_Robot_Web_PC/src/services/api.ts:61)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:61` calls `POST /api/auth/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/register`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fafecf4f344708db", "name": "Dangling fetch: POST /api/auth/verify (Family_Robot_Web_PC/src/services/api.ts:67)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/verify (Family_Robot_Web_PC/src/services/api.ts:67)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:67` calls `POST /api/auth/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/verify`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cf6b84108d29af46", "name": "Dangling fetch: POST /api/auth/login-code/send (Family_Robot_Web_PC/src/services/api.ts:73)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login-code/send (Family_Robot_Web_PC/src/services/api.ts:73)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:73` calls `POST /api/auth/login-code/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/login-code/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b0bd9fdb993b8a87", "name": "Dangling fetch: POST /api/auth/login-code/verify (Family_Robot_Web_PC/src/services/api.ts:79)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login-code/verify (Family_Robot_Web_PC/src/services/api.ts:79)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:79` calls `POST /api/auth/login-code/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/login-code/verify`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b6f801c9a510212d", "name": "Dangling fetch: POST /api/auth/reset-password/send (Family_Robot_Web_PC/src/services/api.ts:85)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/reset-password/send (Family_Robot_Web_PC/src/services/api.ts:85)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:85` calls `POST /api/auth/reset-password/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/reset-password/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-105fa16e268a11a6", "name": "Dangling fetch: POST /api/auth/reset-password/verify (Family_Robot_Web_PC/src/services/api.ts:91)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/reset-password/verify (Family_Robot_Web_PC/src/services/api.ts:91)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:91` calls `POST /api/auth/reset-password/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/reset-password/verify`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c008c68cc36fbba7", "name": "Dangling fetch: GET /api/albums (Family_Robot_Web_PC/src/services/api.ts:98)", "shortDescription": {"text": "Dangling fetch: GET /api/albums (Family_Robot_Web_PC/src/services/api.ts:98)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:98` calls `GET /api/albums` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/albums`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-68c6248a73ab4c8f", "name": "Dangling fetch: DELETE /api/albums/${id} (Family_Robot_Web_PC/src/services/api.ts:101)", "shortDescription": {"text": "Dangling fetch: DELETE /api/albums/${id} (Family_Robot_Web_PC/src/services/api.ts:101)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:101` calls `DELETE /api/albums/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/albums/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9dfc07af8b036ee0", "name": "Dangling fetch: POST /api/albums (Family_Robot_Web_PC/src/services/api.ts:104)", "shortDescription": {"text": "Dangling fetch: POST /api/albums (Family_Robot_Web_PC/src/services/api.ts:104)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:104` calls `POST /api/albums` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/albums`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e5b7ba449dc932dc", "name": "Dangling fetch: GET /api/settings (Family_Robot_Web_PC/src/services/api.ts:111)", "shortDescription": {"text": "Dangling fetch: GET /api/settings (Family_Robot_Web_PC/src/services/api.ts:111)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:111` calls `GET /api/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/settings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-92d916f0dd48c35d", "name": "Dangling fetch: PUT /api/settings/emergency-contact (Family_Robot_Web_PC/src/services/api.ts:114)", "shortDescription": {"text": "Dangling fetch: PUT /api/settings/emergency-contact (Family_Robot_Web_PC/src/services/api.ts:114)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:114` calls `PUT /api/settings/emergency-contact` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/settings/emergency-contact`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c94a0cb2d131befb", "name": "Dangling fetch: GET /api/users/profile (Family_Robot_Web_PC/src/services/api.ts:133)", "shortDescription": {"text": "Dangling fetch: GET /api/users/profile (Family_Robot_Web_PC/src/services/api.ts:133)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:133` calls `GET /api/users/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/users/profile`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c83db7feeb4e35c8", "name": "Dangling fetch: GET /api/reminders?userId=${userId} (Family_Robot_Web_PC/src/services/api.ts:137)", "shortDescription": {"text": "Dangling fetch: GET /api/reminders?userId=${userId} (Family_Robot_Web_PC/src/services/api.ts:137)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:137` calls `GET /api/reminders?userId=${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/reminders`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-abf3f7fee04937ba", "name": "Dangling fetch: POST /api/reminders (Family_Robot_Web_PC/src/services/api.ts:140)", "shortDescription": {"text": "Dangling fetch: POST /api/reminders (Family_Robot_Web_PC/src/services/api.ts:140)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:140` calls `POST /api/reminders` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/reminders`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1ac43e469b7abafd", "name": "Dangling fetch: PUT /api/reminders/${id} (Family_Robot_Web_PC/src/services/api.ts:146)", "shortDescription": {"text": "Dangling fetch: PUT /api/reminders/${id} (Family_Robot_Web_PC/src/services/api.ts:146)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:146` calls `PUT /api/reminders/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/reminders/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96a9ddebe0017621", "name": "Dangling fetch: DELETE /api/reminders/${id} (Family_Robot_Web_PC/src/services/api.ts:152)", "shortDescription": {"text": "Dangling fetch: DELETE /api/reminders/${id} (Family_Robot_Web_PC/src/services/api.ts:152)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:152` calls `DELETE /api/reminders/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/reminders/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c7bd57df2f0dec8a", "name": "Dangling fetch: GET /api/admin/users/${userId}/password (Family_Robot_Web_PC/src/services/api.ts:163)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users/${userId}/password (Family_Robot_Web_PC/src/services/api.ts:163)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:163` calls `GET /api/admin/users/${userId}/password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users/<p>/password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1bcb3bb58aac5cf0", "name": "Dangling fetch: POST /api/admin/robots (Family_Robot_Web_PC/src/services/api.ts:176)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/robots (Family_Robot_Web_PC/src/services/api.ts:176)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:176` calls `POST /api/admin/robots` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/robots`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13e54b3d1b22adb2", "name": "Dangling fetch: DELETE /api/admin/users/${userId} (Family_Robot_Web_PC/src/services/api.ts:182)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/users/${userId} (Family_Robot_Web_PC/src/services/api.ts:182)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:182` calls `DELETE /api/admin/users/${userId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0070a0edd82a0965", "name": "Dangling fetch: DELETE /api/admin/robots/${robotId} (Family_Robot_Web_PC/src/services/api.ts:185)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/robots/${robotId} (Family_Robot_Web_PC/src/services/api.ts:185)"}, "fullDescription": {"text": "`Family_Robot_Web_PC/src/services/api.ts:185` calls `DELETE /api/admin/robots/${robotId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/robots/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-69f9e36258093d91", "name": "Unused endpoint: GET /video/frame", "shortDescription": {"text": "Unused endpoint: GET /video/frame"}, "fullDescription": {"text": "`Family_Robot_pi/backend/app.py` declares `GET /video/frame` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fe6ad45a4479bec", "name": "Unused endpoint: GET /video/stream", "shortDescription": {"text": "Unused endpoint: GET /video/stream"}, "fullDescription": {"text": "`Family_Robot_pi/backend/app.py` declares `GET /video/stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-31e08c96b8aa0d3d", "name": "Unused endpoint: GET /api/photos", "shortDescription": {"text": "Unused endpoint: GET /api/photos"}, "fullDescription": {"text": "`Family_Robot_pi/backend/app.py` declares `GET /api/photos` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`Family_Robot_pi/backend/app.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b33ff55d1addd5d", "name": "Unused endpoint: POST /voice-reminder", "shortDescription": {"text": "Unused endpoint: POST /voice-reminder"}, "fullDescription": {"text": "`Family_Robot_pi/backend/internal/voice_reminder.py` declares `POST /voice-reminder` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-977f73d2271008bc", "name": "Unused endpoint: POST /fall", "shortDescription": {"text": "Unused endpoint: POST /fall"}, "fullDescription": {"text": "`Family_Robot_pi/backend/emergency/handler.py` declares `POST /fall` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23157"}, "properties": {"repository": "yangyanhao2004/Family_Robot", "repoUrl": "https://github.com/yangyanhao2004/Family_Robot", "branch": "main"}, "results": [{"ruleId": "scanner-4be7aad2b53565cb", "level": "note", "message": {"text": "Possibly dead Python function: voice_runner"}, "properties": {"repobilityId": "cb50c8a2b998a126", "scanner": "scanner-primary", "fingerprint": "4be7aad2b53565cb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/main.py:149"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a3c112e6df85efc0", "level": "note", "message": {"text": "Possibly dead Python function: callback"}, "properties": {"repobilityId": "d86912f8937c65c2", "scanner": "scanner-primary", "fingerprint": "a3c112e6df85efc0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/audio/audio_manager.py:153"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cf6007401bf3c846", "level": "note", "message": {"text": "Possibly dead Python function: is_active"}, "properties": {"repobilityId": "fbba80e3cc3a079e", "scanner": "scanner-primary", "fingerprint": "cf6007401bf3c846", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/brain/session_manager.py:61"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-94baebab246829bb", "level": "note", "message": {"text": "Possibly dead Python function: chat_text"}, "properties": {"repobilityId": "e8011af81cffbadb", "scanner": "scanner-primary", "fingerprint": "94baebab246829bb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/brain/web_ai_client.py:183"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-054f874a7db71362", "level": "note", "message": {"text": "Possibly dead Python function: audio_callback"}, "properties": {"repobilityId": "a489309f6ed41a23", "scanner": "scanner-primary", "fingerprint": "054f874a7db71362", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/senses/wake_word_detector.py:175"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8c44032fc5f35deb", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in Family_Robot_Web_PC/src/stores/authStore.ts:18"}, "properties": {"repobilityId": "4d7c78a4a6c78e87", "scanner": "scanner-primary", "fingerprint": "8c44032fc5f35deb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_Web_PC/src/stores/authStore.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-00a9c372381a87f3", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in Family_Robot_pi/backend/app.py:27"}, "properties": {"repobilityId": "8931ac748aa07356", "scanner": "scanner-primary", "fingerprint": "00a9c372381a87f3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/backend/app.py"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "917a338713deeb94", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "71918b5d2f1f578b", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "8d9cbb2954dcde42", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-d0fa51418ae692bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 Family_Robot_Web_PC/src/services/api.ts:122"}, "properties": {"repobilityId": "9bd51ca7a4a1b6a0", "scanner": "scanner-primary", "fingerprint": "d0fa51418ae692bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2de52f1720464b0b", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 Family_Robot_pi/audio/stt_engine.py:127"}, "properties": {"repobilityId": "4e712eeff6015b8a", "scanner": "scanner-primary", "fingerprint": "2de52f1720464b0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5fef730403f80cae", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 Family_Robot_pi/audio/tts_engine.py:142"}, "properties": {"repobilityId": "7367c19ce7e837ac", "scanner": "scanner-primary", "fingerprint": "5fef730403f80cae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "b83b12752748403e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "942c9275e791db9c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "297643f23428e89f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "0e4d6140eeaf587e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2e3181eaecf6a7da", "level": "error", "message": {"text": "FastAPI POST `handle_voice_reminder` without auth dependency \u2014 Family_Robot_pi/backend/internal/voice_reminder.py:33"}, "properties": {"repobilityId": "99834052f7766aef", "scanner": "scanner-primary", "fingerprint": "2e3181eaecf6a7da", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/backend/internal/voice_reminder.py"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-817e553bb5c20a7f", "level": "error", "message": {"text": "FastAPI POST `handle_fall_alert` without auth dependency \u2014 Family_Robot_pi/backend/emergency/handler.py:34"}, "properties": {"repobilityId": "60d6c69b2f19234c", "scanner": "scanner-primary", "fingerprint": "817e553bb5c20a7f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Family_Robot_pi/backend/emergency/handler.py"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-f7491419613d1713", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (Family_Robot_Web_PC/src/services/api.ts:54)"}, "properties": {"repobilityId": "a658f0627ddd090c", "scanner": "scanner-primary", "fingerprint": "f7491419613d1713", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ca472224db342dee", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/register (Family_Robot_Web_PC/src/services/api.ts:61)"}, "properties": {"repobilityId": "01a61fda64e68f2e", "scanner": "scanner-primary", "fingerprint": "ca472224db342dee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-fafecf4f344708db", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/verify (Family_Robot_Web_PC/src/services/api.ts:67)"}, "properties": {"repobilityId": "204748717fb6eb40", "scanner": "scanner-primary", "fingerprint": "fafecf4f344708db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-cf6b84108d29af46", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login-code/send (Family_Robot_Web_PC/src/services/api.ts:73)"}, "properties": {"repobilityId": "ec9ece6dcb44a710", "scanner": "scanner-primary", "fingerprint": "cf6b84108d29af46", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b0bd9fdb993b8a87", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login-code/verify (Family_Robot_Web_PC/src/services/api.ts:79)"}, "properties": {"repobilityId": "8137466b700af6b1", "scanner": "scanner-primary", "fingerprint": "b0bd9fdb993b8a87", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b6f801c9a510212d", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/reset-password/send (Family_Robot_Web_PC/src/services/api.ts:85)"}, "properties": {"repobilityId": "8b324f546139388c", "scanner": "scanner-primary", "fingerprint": "b6f801c9a510212d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-105fa16e268a11a6", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/reset-password/verify (Family_Robot_Web_PC/src/services/api.ts:91)"}, "properties": {"repobilityId": "8493dc13b8090d68", "scanner": "scanner-primary", "fingerprint": "105fa16e268a11a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c008c68cc36fbba7", "level": "error", "message": {"text": "Dangling fetch: GET /api/albums (Family_Robot_Web_PC/src/services/api.ts:98)"}, "properties": {"repobilityId": "7e550695dcf40a74", "scanner": "scanner-primary", "fingerprint": "c008c68cc36fbba7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-68c6248a73ab4c8f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/albums/${id} (Family_Robot_Web_PC/src/services/api.ts:101)"}, "properties": {"repobilityId": "d07eb1cf8c3d88f9", "scanner": "scanner-primary", "fingerprint": "68c6248a73ab4c8f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9dfc07af8b036ee0", "level": "error", "message": {"text": "Dangling fetch: POST /api/albums (Family_Robot_Web_PC/src/services/api.ts:104)"}, "properties": {"repobilityId": "657029ffa68478c0", "scanner": "scanner-primary", "fingerprint": "9dfc07af8b036ee0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e5b7ba449dc932dc", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings (Family_Robot_Web_PC/src/services/api.ts:111)"}, "properties": {"repobilityId": "3ea9d446f6eef8f1", "scanner": "scanner-primary", "fingerprint": "e5b7ba449dc932dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-92d916f0dd48c35d", "level": "error", "message": {"text": "Dangling fetch: PUT /api/settings/emergency-contact (Family_Robot_Web_PC/src/services/api.ts:114)"}, "properties": {"repobilityId": "e768f6250ecff67b", "scanner": "scanner-primary", "fingerprint": "92d916f0dd48c35d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c94a0cb2d131befb", "level": "error", "message": {"text": "Dangling fetch: GET /api/users/profile (Family_Robot_Web_PC/src/services/api.ts:133)"}, "properties": {"repobilityId": "2829796a983f772e", "scanner": "scanner-primary", "fingerprint": "c94a0cb2d131befb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c83db7feeb4e35c8", "level": "error", "message": {"text": "Dangling fetch: GET /api/reminders?userId=${userId} (Family_Robot_Web_PC/src/services/api.ts:137)"}, "properties": {"repobilityId": "95d3340a5fd3d64b", "scanner": "scanner-primary", "fingerprint": "c83db7feeb4e35c8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-abf3f7fee04937ba", "level": "error", "message": {"text": "Dangling fetch: POST /api/reminders (Family_Robot_Web_PC/src/services/api.ts:140)"}, "properties": {"repobilityId": "1c89499d9bd72f41", "scanner": "scanner-primary", "fingerprint": "abf3f7fee04937ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1ac43e469b7abafd", "level": "error", "message": {"text": "Dangling fetch: PUT /api/reminders/${id} (Family_Robot_Web_PC/src/services/api.ts:146)"}, "properties": {"repobilityId": "64e09e6ca8359a6e", "scanner": "scanner-primary", "fingerprint": "1ac43e469b7abafd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-96a9ddebe0017621", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/reminders/${id} (Family_Robot_Web_PC/src/services/api.ts:152)"}, "properties": {"repobilityId": "10dc26cb23491742", "scanner": "scanner-primary", "fingerprint": "96a9ddebe0017621", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c7bd57df2f0dec8a", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users/${userId}/password (Family_Robot_Web_PC/src/services/api.ts:163)"}, "properties": {"repobilityId": "2d733d4bfcb400ae", "scanner": "scanner-primary", "fingerprint": "c7bd57df2f0dec8a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1bcb3bb58aac5cf0", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/robots (Family_Robot_Web_PC/src/services/api.ts:176)"}, "properties": {"repobilityId": "3bad4ac51f95aed0", "scanner": "scanner-primary", "fingerprint": "1bcb3bb58aac5cf0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-13e54b3d1b22adb2", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/users/${userId} (Family_Robot_Web_PC/src/services/api.ts:182)"}, "properties": {"repobilityId": "88bb6055b99080e9", "scanner": "scanner-primary", "fingerprint": "13e54b3d1b22adb2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-0070a0edd82a0965", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/robots/${robotId} (Family_Robot_Web_PC/src/services/api.ts:185)"}, "properties": {"repobilityId": "79cce94e65a497d5", "scanner": "scanner-primary", "fingerprint": "0070a0edd82a0965", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-69f9e36258093d91", "level": "note", "message": {"text": "Unused endpoint: GET /video/frame"}, "properties": {"repobilityId": "f84e3e84307c123b", "scanner": "scanner-primary", "fingerprint": "69f9e36258093d91", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0fe6ad45a4479bec", "level": "note", "message": {"text": "Unused endpoint: GET /video/stream"}, "properties": {"repobilityId": "8b53739745d6fa28", "scanner": "scanner-primary", "fingerprint": "0fe6ad45a4479bec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-31e08c96b8aa0d3d", "level": "note", "message": {"text": "Unused endpoint: GET /api/photos"}, "properties": {"repobilityId": "9c2b3b6b816aee1b", "scanner": "scanner-primary", "fingerprint": "31e08c96b8aa0d3d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "d855239ad71a7fc3", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b33ff55d1addd5d", "level": "note", "message": {"text": "Unused endpoint: POST /voice-reminder"}, "properties": {"repobilityId": "5fa7b007a517c4c4", "scanner": "scanner-primary", "fingerprint": "0b33ff55d1addd5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-977f73d2271008bc", "level": "note", "message": {"text": "Unused endpoint: POST /fall"}, "properties": {"repobilityId": "8ce8dcfd8ed03b29", "scanner": "scanner-primary", "fingerprint": "977f73d2271008bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}