{"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-e6c2117c5b8dfb38", "name": "Possibly dead Python function: init_db", "shortDescription": {"text": "Possibly dead Python function: init_db"}, "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-680b46665db0da60", "name": "Possibly dead Python function: verify_firebase_user", "shortDescription": {"text": "Possibly dead Python function: verify_firebase_user"}, "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-d4a8c8791dabed05", "name": "Possibly dead Python function: require_admin", "shortDescription": {"text": "Possibly dead Python function: require_admin"}, "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-f3c5140012534ea7", "name": "Possibly dead Python function: require_founder_admin", "shortDescription": {"text": "Possibly dead Python function: require_founder_admin"}, "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-c0ae4eced851d650", "name": "Possibly dead Python function: persist_event_from_bus", "shortDescription": {"text": "Possibly dead Python function: persist_event_from_bus"}, "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-35e881fce2590b4e", "name": "Possibly dead Python function: persist_many_events", "shortDescription": {"text": "Possibly dead Python function: persist_many_events"}, "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-188aab6e51fe565e", "name": "Possibly dead Python function: retrieve", "shortDescription": {"text": "Possibly dead Python function: retrieve"}, "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-04177a876e16a7a2", "name": "Possibly dead Python function: build_memory_summary", "shortDescription": {"text": "Possibly dead Python function: build_memory_summary"}, "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-a6b98a36e9038a7f", "name": "Possibly dead Python function: replace_element_number", "shortDescription": {"text": "Possibly dead Python function: replace_element_number"}, "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-63cf2f2503fd2eea", "name": "Possibly dead Python function: replace_charge", "shortDescription": {"text": "Possibly dead Python function: replace_charge"}, "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-f5ef656b6182d32d", "name": "Possibly dead Python function: privacy_safe_display_name", "shortDescription": {"text": "Possibly dead Python function: privacy_safe_display_name"}, "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-c7af72dc2f6bcb7b", "name": "Possibly dead Python function: active_versions", "shortDescription": {"text": "Possibly dead Python function: active_versions"}, "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-5464552cc784ce30", "name": "Possibly dead Python function: build_mcq_prompt", "shortDescription": {"text": "Possibly dead Python function: build_mcq_prompt"}, "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-67ca11610de45364", "name": "Possibly dead Python function: build_probable_questions_prompt", "shortDescription": {"text": "Possibly dead Python function: build_probable_questions_prompt"}, "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-2511d17e91e23bb9", "name": "Possibly dead Python function: build_agent_system_prompt", "shortDescription": {"text": "Possibly dead Python function: build_agent_system_prompt"}, "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-8c1e6be5861e2174", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.10-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.10-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-713f93892da7d396", "name": "Very large file: tests/test_coach_architecture.py (1551 lines)", "shortDescription": {"text": "Very large file: tests/test_coach_architecture.py (1551 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ca80592673204231", "name": "Very large file: Logic/agents/coach_agent.py (3273 lines)", "shortDescription": {"text": "Very large file: Logic/agents/coach_agent.py (3273 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0b96b6fa30204f09", "name": "Very large file: services/admin_intelligence.py (1360 lines)", "shortDescription": {"text": "Very large file: services/admin_intelligence.py (1360 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "13 tests / 103 src (ratio 0.13)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "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-2f152fc9fca3e35c", "name": "Legacy-named symbol `agent_runtime_v1` in Logic/agents/coach_agent.py:3036", "shortDescription": {"text": "Legacy-named symbol `agent_runtime_v1` in Logic/agents/coach_agent.py:3036"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eab8b6346c2579e8", "name": "57 env vars used in code but missing from .env.example", "shortDescription": {"text": "57 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AGENT_WORKFLOW_VERSION`, `ALLOW_CLIENT_PROGRESS_OVERWRITE`, `AUTO_CREATE_TABLES`, `COACH_BUDGET_ROUTING`, `COACH_DAILY_BUDGET_USD`, `COACH_DEFAULT_INPUT_USD_PER_1M`, `COACH_DEFAULT_OUTPUT_USD_PER_1M`, `COACH_INTERACTION_LIMIT` + 49 more. 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:\nmodels.py:accuracy, models.py:accuracy\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nLogic/section_doubt.py:normalize_mcq_questions, Logic/section_doubt.py:normalize_probable_questions, Logic/agents/exam_agent.py:normalize_structured_mcqs, Logic/agents/exam_agent.py:normalize_probable_questions\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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nLogic/coach/multimodal_learning.py:to_dict, Logic/coach/multimodal_learning.py:to_dict, Logic/coach/multimodal_learning.py:to_dict\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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nrouters/coach.py:coach_dashboard, routers/coach.py:coach_daily_learning, routers/progress.py:get_progress, routers/progress.py:analytics\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-45705f11ad5b73be", "name": "Unused endpoint: POST /coach/bootstrap", "shortDescription": {"text": "Unused endpoint: POST /coach/bootstrap"}, "fullDescription": {"text": "`routers/coach.py` declares `POST /coach/bootstrap` 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-36f5b1cd2a3c7bf0", "name": "Unused endpoint: GET /coach/conversations/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /coach/conversations/{user_id}"}, "fullDescription": {"text": "`routers/coach.py` declares `GET /coach/conversations/{user_id}` 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-b8f6bbfe52e6923d", "name": "Unused endpoint: GET /coach/conversations/{user_id}/{conversation_id}", "shortDescription": {"text": "Unused endpoint: GET /coach/conversations/{user_id}/{conversation_id}"}, "fullDescription": {"text": "`routers/coach.py` declares `GET /coach/conversations/{user_id}/{conversation_id}` 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-52cc54d092d6400f", "name": "Unused endpoint: PATCH /coach/conversations/{user_id}/{conversation_id}", "shortDescription": {"text": "Unused endpoint: PATCH /coach/conversations/{user_id}/{conversation_id}"}, "fullDescription": {"text": "`routers/coach.py` declares `PATCH /coach/conversations/{user_id}/{conversation_id}` 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-106151b8a7f93395", "name": "Unused endpoint: DELETE /coach/conversations/{user_id}/{conversation_id}", "shortDescription": {"text": "Unused endpoint: DELETE /coach/conversations/{user_id}/{conversation_id}"}, "fullDescription": {"text": "`routers/coach.py` declares `DELETE /coach/conversations/{user_id}/{conversation_id}` 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-5fad80a870b85d32", "name": "Unused endpoint: GET /coach/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /coach/{user_id}"}, "fullDescription": {"text": "`routers/coach.py` declares `GET /coach/{user_id}` 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-b1052b1b59ca371b", "name": "Unused endpoint: POST /coach/chat", "shortDescription": {"text": "Unused endpoint: POST /coach/chat"}, "fullDescription": {"text": "`routers/coach.py` declares `POST /coach/chat` 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-603ecab1d2c38274", "name": "Unused endpoint: POST /coach/chat/stream", "shortDescription": {"text": "Unused endpoint: POST /coach/chat/stream"}, "fullDescription": {"text": "`routers/coach.py` declares `POST /coach/chat/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-9da6cb6fc10d8998", "name": "Unused endpoint: POST /coach/daily-learning/{user_id}", "shortDescription": {"text": "Unused endpoint: POST /coach/daily-learning/{user_id}"}, "fullDescription": {"text": "`routers/coach.py` declares `POST /coach/daily-learning/{user_id}` 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-62a70059d1f41333", "name": "Unused endpoint: POST /coach/autonomous-study/{user_id}", "shortDescription": {"text": "Unused endpoint: POST /coach/autonomous-study/{user_id}"}, "fullDescription": {"text": "`routers/coach.py` declares `POST /coach/autonomous-study/{user_id}` 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-37cbf8d1e149a42d", "name": "Unused endpoint: GET /admin/me", "shortDescription": {"text": "Unused endpoint: GET /admin/me"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/me` 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-f415698e56f66a5a", "name": "Unused endpoint: GET /admin/console", "shortDescription": {"text": "Unused endpoint: GET /admin/console"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/console` 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-6c9282666b199ce9", "name": "Unused endpoint: GET /admin/audit", "shortDescription": {"text": "Unused endpoint: GET /admin/audit"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/audit` 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-583362f72fd4296a", "name": "Unused endpoint: POST /admin/audit", "shortDescription": {"text": "Unused endpoint: POST /admin/audit"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/audit` 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-86f491fa14a9843a", "name": "Unused endpoint: GET /admin/content/folder-contract", "shortDescription": {"text": "Unused endpoint: GET /admin/content/folder-contract"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/content/folder-contract` 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-a8fd267941f741e3", "name": "Unused endpoint: POST /admin/content/ingest-folder", "shortDescription": {"text": "Unused endpoint: POST /admin/content/ingest-folder"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/content/ingest-folder` 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-3083bd9590ee8332", "name": "Unused endpoint: GET /admin/content/chapters", "shortDescription": {"text": "Unused endpoint: GET /admin/content/chapters"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/content/chapters` 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-211e70f54861c8bb", "name": "Unused endpoint: GET /admin/content/report/{chapter_id}", "shortDescription": {"text": "Unused endpoint: GET /admin/content/report/{chapter_id}"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/content/report/{chapter_id}` 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-b68709b73f2fde1b", "name": "Unused endpoint: POST /admin/content/import-concepts/{chapter_id}", "shortDescription": {"text": "Unused endpoint: POST /admin/content/import-concepts/{chapter_id}"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/content/import-concepts/{chapter_id}` 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-23fbf0f08a704e69", "name": "Unused endpoint: POST /admin/content/generate-json/{chapter_id}", "shortDescription": {"text": "Unused endpoint: POST /admin/content/generate-json/{chapter_id}"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/content/generate-json/{chapter_id}` 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-cc41e37c50f8ae6b", "name": "Unused endpoint: POST /admin/content/embed", "shortDescription": {"text": "Unused endpoint: POST /admin/content/embed"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/content/embed` 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-6b43dd48536a7c58", "name": "Unused endpoint: GET /admin/content/jobs", "shortDescription": {"text": "Unused endpoint: GET /admin/content/jobs"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/content/jobs` 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-bc2ac0b303226552", "name": "Unused endpoint: GET /admin/content/jobs/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /admin/content/jobs/{job_id}"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/content/jobs/{job_id}` 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-ae1856147bb13f36", "name": "Unused endpoint: POST /admin/content/approve/{chapter_id}", "shortDescription": {"text": "Unused endpoint: POST /admin/content/approve/{chapter_id}"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/content/approve/{chapter_id}` 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-11a69eef4da268da", "name": "Unused endpoint: POST /admin/content/publish/{chapter_id}", "shortDescription": {"text": "Unused endpoint: POST /admin/content/publish/{chapter_id}"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/content/publish/{chapter_id}` 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-d1fbb0594d5f8434", "name": "Unused endpoint: GET /admin/overview", "shortDescription": {"text": "Unused endpoint: GET /admin/overview"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/overview` 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-30b0488d02fa8e43", "name": "Unused endpoint: GET /admin/agents", "shortDescription": {"text": "Unused endpoint: GET /admin/agents"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/agents` 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-b4df8d9ddc1ce2d9", "name": "Unused endpoint: GET /admin/agent-registry", "shortDescription": {"text": "Unused endpoint: GET /admin/agent-registry"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/agent-registry` 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-9c2023edaae9fd58", "name": "Unused endpoint: GET /admin/agents/{agent_id}", "shortDescription": {"text": "Unused endpoint: GET /admin/agents/{agent_id}"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/agents/{agent_id}` 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-b0133ea4e4230e00", "name": "Unused endpoint: GET /admin/traces", "shortDescription": {"text": "Unused endpoint: GET /admin/traces"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/traces` 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-11e720257aab89db", "name": "Unused endpoint: GET /admin/data-registry", "shortDescription": {"text": "Unused endpoint: GET /admin/data-registry"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/data-registry` 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-1a22ab4f207c887b", "name": "Unused endpoint: GET /admin/prompts", "shortDescription": {"text": "Unused endpoint: GET /admin/prompts"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/prompts` 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-48c97564acb2c070", "name": "Unused endpoint: GET /admin/model-registry", "shortDescription": {"text": "Unused endpoint: GET /admin/model-registry"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/model-registry` 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-dbd3e317ae851394", "name": "Unused endpoint: GET /admin/students", "shortDescription": {"text": "Unused endpoint: GET /admin/students"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/students` 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-f011c9d08da70335", "name": "Unused endpoint: GET /admin/system-health", "shortDescription": {"text": "Unused endpoint: GET /admin/system-health"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/system-health` 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-52106b43a72b4141", "name": "Unused endpoint: GET /admin/audit-logs", "shortDescription": {"text": "Unused endpoint: GET /admin/audit-logs"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/audit-logs` 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-ef4630cdaf3f9142", "name": "Unused endpoint: POST /admin/action", "shortDescription": {"text": "Unused endpoint: POST /admin/action"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/action` 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-08e554817dd7a768", "name": "Unused endpoint: GET /admin/events", "shortDescription": {"text": "Unused endpoint: GET /admin/events"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/events` 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-1e6838f3c542a5b0", "name": "Unused endpoint: GET /admin/poll", "shortDescription": {"text": "Unused endpoint: GET /admin/poll"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/poll` 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-dd159bd05997c05c", "name": "Unused endpoint: GET /admin/stats", "shortDescription": {"text": "Unused endpoint: GET /admin/stats"}, "fullDescription": {"text": "`routers/admin.py` declares `GET /admin/stats` 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-806a4cd8001f5a0b", "name": "Unused endpoint: POST /admin/command", "shortDescription": {"text": "Unused endpoint: POST /admin/command"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/command` 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-6d995e3102182872", "name": "Unused endpoint: POST /admin/message", "shortDescription": {"text": "Unused endpoint: POST /admin/message"}, "fullDescription": {"text": "`routers/admin.py` declares `POST /admin/message` 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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`routers/profile.py` declares `GET /me` 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-ea575b61c121b733", "name": "Unused endpoint: PATCH /me", "shortDescription": {"text": "Unused endpoint: PATCH /me"}, "fullDescription": {"text": "`routers/profile.py` declares `PATCH /me` 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-b819ed8bb9dadbb9", "name": "Unused endpoint: POST /agent", "shortDescription": {"text": "Unused endpoint: POST /agent"}, "fullDescription": {"text": "`routers/agent.py` declares `POST /agent` 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-54d47ca16304ec7e", "name": "Unused endpoint: POST /reset-chat", "shortDescription": {"text": "Unused endpoint: POST /reset-chat"}, "fullDescription": {"text": "`routers/agent.py` declares `POST /reset-chat` 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-62ebf6bcc4e1e526", "name": "Unused endpoint: POST /update-progress", "shortDescription": {"text": "Unused endpoint: POST /update-progress"}, "fullDescription": {"text": "`routers/progress.py` declares `POST /update-progress` 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-79828bcaf458131d", "name": "Unused endpoint: GET /get-progress/{user_id}", "shortDescription": {"text": "Unused endpoint: GET /get-progress/{user_id}"}, "fullDescription": {"text": "`routers/progress.py` declares `GET /get-progress/{user_id}` 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-3e59915dde55c557", "name": "Unused endpoint: POST /submit-session", "shortDescription": {"text": "Unused endpoint: POST /submit-session"}, "fullDescription": {"text": "`routers/progress.py` declares `POST /submit-session` 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-3be509ef647f147e", "name": "Unused endpoint: POST /save-test", "shortDescription": {"text": "Unused endpoint: POST /save-test"}, "fullDescription": {"text": "`routers/progress.py` declares `POST /save-test` 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/18396"}, "properties": {"repository": "rohansinghdeo123-sys/ai-educator-backend", "repoUrl": "https://github.com/rohansinghdeo123-sys/ai-educator-backend", "branch": "main"}, "results": [{"ruleId": "scanner-e6c2117c5b8dfb38", "level": "note", "message": {"text": "Possibly dead Python function: init_db"}, "properties": {"repobilityId": "a776a5dfbdf65853", "scanner": "scanner-primary", "fingerprint": "e6c2117c5b8dfb38", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "database.py:128"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-680b46665db0da60", "level": "note", "message": {"text": "Possibly dead Python function: verify_firebase_user"}, "properties": {"repobilityId": "325d080d53c66c12", "scanner": "scanner-primary", "fingerprint": "680b46665db0da60", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/security.py:112"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4a8c8791dabed05", "level": "note", "message": {"text": "Possibly dead Python function: require_admin"}, "properties": {"repobilityId": "3c06db2e25566bf7", "scanner": "scanner-primary", "fingerprint": "d4a8c8791dabed05", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/security.py:159"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f3c5140012534ea7", "level": "note", "message": {"text": "Possibly dead Python function: require_founder_admin"}, "properties": {"repobilityId": "a9e9f83ac500dbb3", "scanner": "scanner-primary", "fingerprint": "f3c5140012534ea7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/security.py:176"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c0ae4eced851d650", "level": "note", "message": {"text": "Possibly dead Python function: persist_event_from_bus"}, "properties": {"repobilityId": "218da0ee582871d4", "scanner": "scanner-primary", "fingerprint": "c0ae4eced851d650", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Logic/observability_store.py:100"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-35e881fce2590b4e", "level": "note", "message": {"text": "Possibly dead Python function: persist_many_events"}, "properties": {"repobilityId": "0b14bca49520aebb", "scanner": "scanner-primary", "fingerprint": "35e881fce2590b4e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Logic/observability_store.py:404"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-188aab6e51fe565e", "level": "note", "message": {"text": "Possibly dead Python function: retrieve"}, "properties": {"repobilityId": "c349ec42611056dc", "scanner": "scanner-primary", "fingerprint": "188aab6e51fe565e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Logic/coach/retriever.py:133"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-04177a876e16a7a2", "level": "note", "message": {"text": "Possibly dead Python function: build_memory_summary"}, "properties": {"repobilityId": "f7a52fd60c77055f", "scanner": "scanner-primary", "fingerprint": "04177a876e16a7a2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Logic/coach/memory_store.py:6"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a6b98a36e9038a7f", "level": "note", "message": {"text": "Possibly dead Python function: replace_element_number"}, "properties": {"repobilityId": "b8e887d736bd33d8", "scanner": "scanner-primary", "fingerprint": "a6b98a36e9038a7f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Logic/tools/chemistry_formatter.py:79"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-63cf2f2503fd2eea", "level": "note", "message": {"text": "Possibly dead Python function: replace_charge"}, "properties": {"repobilityId": "d96fdcdd03b475a8", "scanner": "scanner-primary", "fingerprint": "63cf2f2503fd2eea", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Logic/tools/chemistry_formatter.py:99"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f5ef656b6182d32d", "level": "note", "message": {"text": "Possibly dead Python function: privacy_safe_display_name"}, "properties": {"repobilityId": "75bff0d0205d6a19", "scanner": "scanner-primary", "fingerprint": "f5ef656b6182d32d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/profile_service.py:105"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c7af72dc2f6bcb7b", "level": "note", "message": {"text": "Possibly dead Python function: active_versions"}, "properties": {"repobilityId": "c489adf517ac4a6a", "scanner": "scanner-primary", "fingerprint": "c7af72dc2f6bcb7b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prompts/registry.py:119"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5464552cc784ce30", "level": "note", "message": {"text": "Possibly dead Python function: build_mcq_prompt"}, "properties": {"repobilityId": "7ab5ec79e7a69b29", "scanner": "scanner-primary", "fingerprint": "5464552cc784ce30", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prompts/prompt_builder.py:76"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-67ca11610de45364", "level": "note", "message": {"text": "Possibly dead Python function: build_probable_questions_prompt"}, "properties": {"repobilityId": "34682d74db9a3848", "scanner": "scanner-primary", "fingerprint": "67ca11610de45364", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prompts/prompt_builder.py:158"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2511d17e91e23bb9", "level": "note", "message": {"text": "Possibly dead Python function: build_agent_system_prompt"}, "properties": {"repobilityId": "edde29acc31674a3", "scanner": "scanner-primary", "fingerprint": "2511d17e91e23bb9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "prompts/prompt_builder.py:217"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8c1e6be5861e2174", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.10-slim"}, "properties": {"repobilityId": "a262bab56fd5bcb4", "scanner": "scanner-primary", "fingerprint": "8c1e6be5861e2174", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-8c1e6be5861e2174", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.10-slim"}, "properties": {"repobilityId": "3bf0d6881e27eec4", "scanner": "scanner-primary", "fingerprint": "8c1e6be5861e2174", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-713f93892da7d396", "level": "note", "message": {"text": "Very large file: tests/test_coach_architecture.py (1551 lines)"}, "properties": {"repobilityId": "be0c577dcfb532a9", "scanner": "scanner-primary", "fingerprint": "713f93892da7d396", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ca80592673204231", "level": "note", "message": {"text": "Very large file: Logic/agents/coach_agent.py (3273 lines)"}, "properties": {"repobilityId": "dc08ccab1c0273fc", "scanner": "scanner-primary", "fingerprint": "ca80592673204231", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0b96b6fa30204f09", "level": "note", "message": {"text": "Very large file: services/admin_intelligence.py (1360 lines)"}, "properties": {"repobilityId": "282a0a1a96b98a17", "scanner": "scanner-primary", "fingerprint": "0b96b6fa30204f09", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "181dd728214e7802", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "094d2642982edda0", "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": "e78c01226400610a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2f152fc9fca3e35c", "level": "note", "message": {"text": "Legacy-named symbol `agent_runtime_v1` in Logic/agents/coach_agent.py:3036"}, "properties": {"repobilityId": "888c6431ce7cfada", "scanner": "scanner-primary", "fingerprint": "2f152fc9fca3e35c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eab8b6346c2579e8", "level": "note", "message": {"text": "57 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "87503ae5fa8c7c7d", "scanner": "scanner-primary", "fingerprint": "eab8b6346c2579e8", "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": "521308207ba8612e", "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": "b98acb786f1149a6", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "da2b07880ddb5757", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "22786c5274642f35", "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": "0abbeefbbecb879b", "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": "4fe068c376871fea", "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": "39b7a757419a9024", "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": "498442105841d6b7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a95e482a661aa9c6", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "35ff6686d3b55506", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "3a32409db225faa4", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "98b4dc497d53a9d0", "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": "e0d0c147c9e942df", "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": "39495dc98932fed1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "41408d70ad28cd3b", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "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": "9439a7d2a16ecc84", "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": "f1e09a79da465a63", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-45705f11ad5b73be", "level": "note", "message": {"text": "Unused endpoint: POST /coach/bootstrap"}, "properties": {"repobilityId": "90099a53167c2162", "scanner": "scanner-primary", "fingerprint": "45705f11ad5b73be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-36f5b1cd2a3c7bf0", "level": "note", "message": {"text": "Unused endpoint: GET /coach/conversations/{user_id}"}, "properties": {"repobilityId": "e32abf063cccc2f9", "scanner": "scanner-primary", "fingerprint": "36f5b1cd2a3c7bf0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b8f6bbfe52e6923d", "level": "note", "message": {"text": "Unused endpoint: GET /coach/conversations/{user_id}/{conversation_id}"}, "properties": {"repobilityId": "9f224d672793db1e", "scanner": "scanner-primary", "fingerprint": "b8f6bbfe52e6923d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52cc54d092d6400f", "level": "note", "message": {"text": "Unused endpoint: PATCH /coach/conversations/{user_id}/{conversation_id}"}, "properties": {"repobilityId": "4cb3c5d4fe6246fb", "scanner": "scanner-primary", "fingerprint": "52cc54d092d6400f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-106151b8a7f93395", "level": "note", "message": {"text": "Unused endpoint: DELETE /coach/conversations/{user_id}/{conversation_id}"}, "properties": {"repobilityId": "859ea8cb6ae4d36b", "scanner": "scanner-primary", "fingerprint": "106151b8a7f93395", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fad80a870b85d32", "level": "note", "message": {"text": "Unused endpoint: GET /coach/{user_id}"}, "properties": {"repobilityId": "59386423dfee4474", "scanner": "scanner-primary", "fingerprint": "5fad80a870b85d32", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b1052b1b59ca371b", "level": "note", "message": {"text": "Unused endpoint: POST /coach/chat"}, "properties": {"repobilityId": "079c3b8e16479f81", "scanner": "scanner-primary", "fingerprint": "b1052b1b59ca371b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-603ecab1d2c38274", "level": "note", "message": {"text": "Unused endpoint: POST /coach/chat/stream"}, "properties": {"repobilityId": "3ce5bc3410ce9fdd", "scanner": "scanner-primary", "fingerprint": "603ecab1d2c38274", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9da6cb6fc10d8998", "level": "note", "message": {"text": "Unused endpoint: POST /coach/daily-learning/{user_id}"}, "properties": {"repobilityId": "e1730968661dce60", "scanner": "scanner-primary", "fingerprint": "9da6cb6fc10d8998", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62a70059d1f41333", "level": "note", "message": {"text": "Unused endpoint: POST /coach/autonomous-study/{user_id}"}, "properties": {"repobilityId": "944a818a2e682b7d", "scanner": "scanner-primary", "fingerprint": "62a70059d1f41333", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37cbf8d1e149a42d", "level": "note", "message": {"text": "Unused endpoint: GET /admin/me"}, "properties": {"repobilityId": "cb6f92b19b911321", "scanner": "scanner-primary", "fingerprint": "37cbf8d1e149a42d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f415698e56f66a5a", "level": "note", "message": {"text": "Unused endpoint: GET /admin/console"}, "properties": {"repobilityId": "cc7d2353ebe9f1b8", "scanner": "scanner-primary", "fingerprint": "f415698e56f66a5a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c9282666b199ce9", "level": "note", "message": {"text": "Unused endpoint: GET /admin/audit"}, "properties": {"repobilityId": "51e4b654f58c70e2", "scanner": "scanner-primary", "fingerprint": "6c9282666b199ce9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-583362f72fd4296a", "level": "note", "message": {"text": "Unused endpoint: POST /admin/audit"}, "properties": {"repobilityId": "7aba5d2d05df2dc4", "scanner": "scanner-primary", "fingerprint": "583362f72fd4296a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86f491fa14a9843a", "level": "note", "message": {"text": "Unused endpoint: GET /admin/content/folder-contract"}, "properties": {"repobilityId": "b255c8a66d7446ac", "scanner": "scanner-primary", "fingerprint": "86f491fa14a9843a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8fd267941f741e3", "level": "note", "message": {"text": "Unused endpoint: POST /admin/content/ingest-folder"}, "properties": {"repobilityId": "15f60beadc419303", "scanner": "scanner-primary", "fingerprint": "a8fd267941f741e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3083bd9590ee8332", "level": "note", "message": {"text": "Unused endpoint: GET /admin/content/chapters"}, "properties": {"repobilityId": "34c4c00097a4a253", "scanner": "scanner-primary", "fingerprint": "3083bd9590ee8332", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-211e70f54861c8bb", "level": "note", "message": {"text": "Unused endpoint: GET /admin/content/report/{chapter_id}"}, "properties": {"repobilityId": "f1534e6300cb9a57", "scanner": "scanner-primary", "fingerprint": "211e70f54861c8bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b68709b73f2fde1b", "level": "note", "message": {"text": "Unused endpoint: POST /admin/content/import-concepts/{chapter_id}"}, "properties": {"repobilityId": "fcbccd2f3054a34d", "scanner": "scanner-primary", "fingerprint": "b68709b73f2fde1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23fbf0f08a704e69", "level": "note", "message": {"text": "Unused endpoint: POST /admin/content/generate-json/{chapter_id}"}, "properties": {"repobilityId": "84f6c3675f9ca9ec", "scanner": "scanner-primary", "fingerprint": "23fbf0f08a704e69", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc41e37c50f8ae6b", "level": "note", "message": {"text": "Unused endpoint: POST /admin/content/embed"}, "properties": {"repobilityId": "4e3f8b02e3c4b8f5", "scanner": "scanner-primary", "fingerprint": "cc41e37c50f8ae6b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b43dd48536a7c58", "level": "note", "message": {"text": "Unused endpoint: GET /admin/content/jobs"}, "properties": {"repobilityId": "747b207ea8b8cc90", "scanner": "scanner-primary", "fingerprint": "6b43dd48536a7c58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc2ac0b303226552", "level": "note", "message": {"text": "Unused endpoint: GET /admin/content/jobs/{job_id}"}, "properties": {"repobilityId": "859b05ce7ba6da84", "scanner": "scanner-primary", "fingerprint": "bc2ac0b303226552", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae1856147bb13f36", "level": "note", "message": {"text": "Unused endpoint: POST /admin/content/approve/{chapter_id}"}, "properties": {"repobilityId": "76b7a657ee7cc00b", "scanner": "scanner-primary", "fingerprint": "ae1856147bb13f36", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11a69eef4da268da", "level": "note", "message": {"text": "Unused endpoint: POST /admin/content/publish/{chapter_id}"}, "properties": {"repobilityId": "a16a145a8de8199f", "scanner": "scanner-primary", "fingerprint": "11a69eef4da268da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1fbb0594d5f8434", "level": "note", "message": {"text": "Unused endpoint: GET /admin/overview"}, "properties": {"repobilityId": "325cbd76180a4156", "scanner": "scanner-primary", "fingerprint": "d1fbb0594d5f8434", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-30b0488d02fa8e43", "level": "note", "message": {"text": "Unused endpoint: GET /admin/agents"}, "properties": {"repobilityId": "0acd5a2f6584bfee", "scanner": "scanner-primary", "fingerprint": "30b0488d02fa8e43", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4df8d9ddc1ce2d9", "level": "note", "message": {"text": "Unused endpoint: GET /admin/agent-registry"}, "properties": {"repobilityId": "a8b9d3af973aa5d2", "scanner": "scanner-primary", "fingerprint": "b4df8d9ddc1ce2d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c2023edaae9fd58", "level": "note", "message": {"text": "Unused endpoint: GET /admin/agents/{agent_id}"}, "properties": {"repobilityId": "bb0185125c8e04ed", "scanner": "scanner-primary", "fingerprint": "9c2023edaae9fd58", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0133ea4e4230e00", "level": "note", "message": {"text": "Unused endpoint: GET /admin/traces"}, "properties": {"repobilityId": "4afb06077f46a196", "scanner": "scanner-primary", "fingerprint": "b0133ea4e4230e00", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-11e720257aab89db", "level": "note", "message": {"text": "Unused endpoint: GET /admin/data-registry"}, "properties": {"repobilityId": "2e06bd387a9310cd", "scanner": "scanner-primary", "fingerprint": "11e720257aab89db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a22ab4f207c887b", "level": "note", "message": {"text": "Unused endpoint: GET /admin/prompts"}, "properties": {"repobilityId": "33883d06d65d3326", "scanner": "scanner-primary", "fingerprint": "1a22ab4f207c887b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48c97564acb2c070", "level": "note", "message": {"text": "Unused endpoint: GET /admin/model-registry"}, "properties": {"repobilityId": "56d95ec94557ded3", "scanner": "scanner-primary", "fingerprint": "48c97564acb2c070", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dbd3e317ae851394", "level": "note", "message": {"text": "Unused endpoint: GET /admin/students"}, "properties": {"repobilityId": "eb224172c91de55d", "scanner": "scanner-primary", "fingerprint": "dbd3e317ae851394", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f011c9d08da70335", "level": "note", "message": {"text": "Unused endpoint: GET /admin/system-health"}, "properties": {"repobilityId": "e2bef8b718b62236", "scanner": "scanner-primary", "fingerprint": "f011c9d08da70335", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52106b43a72b4141", "level": "note", "message": {"text": "Unused endpoint: GET /admin/audit-logs"}, "properties": {"repobilityId": "76f1b2b33cf384e1", "scanner": "scanner-primary", "fingerprint": "52106b43a72b4141", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef4630cdaf3f9142", "level": "note", "message": {"text": "Unused endpoint: POST /admin/action"}, "properties": {"repobilityId": "76e675396160a4b2", "scanner": "scanner-primary", "fingerprint": "ef4630cdaf3f9142", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08e554817dd7a768", "level": "note", "message": {"text": "Unused endpoint: GET /admin/events"}, "properties": {"repobilityId": "10a5bcd9543529d7", "scanner": "scanner-primary", "fingerprint": "08e554817dd7a768", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1e6838f3c542a5b0", "level": "note", "message": {"text": "Unused endpoint: GET /admin/poll"}, "properties": {"repobilityId": "7c3a8e9930d19295", "scanner": "scanner-primary", "fingerprint": "1e6838f3c542a5b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd159bd05997c05c", "level": "note", "message": {"text": "Unused endpoint: GET /admin/stats"}, "properties": {"repobilityId": "ce2b361eab8377a2", "scanner": "scanner-primary", "fingerprint": "dd159bd05997c05c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-806a4cd8001f5a0b", "level": "note", "message": {"text": "Unused endpoint: POST /admin/command"}, "properties": {"repobilityId": "4f4c33e61a993cd1", "scanner": "scanner-primary", "fingerprint": "806a4cd8001f5a0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d995e3102182872", "level": "note", "message": {"text": "Unused endpoint: POST /admin/message"}, "properties": {"repobilityId": "56b3d1afe7beab82", "scanner": "scanner-primary", "fingerprint": "6d995e3102182872", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "49fc4896b26f8c07", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea575b61c121b733", "level": "note", "message": {"text": "Unused endpoint: PATCH /me"}, "properties": {"repobilityId": "b5e315654a696844", "scanner": "scanner-primary", "fingerprint": "ea575b61c121b733", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b819ed8bb9dadbb9", "level": "note", "message": {"text": "Unused endpoint: POST /agent"}, "properties": {"repobilityId": "993868aded1717db", "scanner": "scanner-primary", "fingerprint": "b819ed8bb9dadbb9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-54d47ca16304ec7e", "level": "note", "message": {"text": "Unused endpoint: POST /reset-chat"}, "properties": {"repobilityId": "0d5b409277e83623", "scanner": "scanner-primary", "fingerprint": "54d47ca16304ec7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62ebf6bcc4e1e526", "level": "note", "message": {"text": "Unused endpoint: POST /update-progress"}, "properties": {"repobilityId": "d9758f6be695db6c", "scanner": "scanner-primary", "fingerprint": "62ebf6bcc4e1e526", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-79828bcaf458131d", "level": "note", "message": {"text": "Unused endpoint: GET /get-progress/{user_id}"}, "properties": {"repobilityId": "bbfe7af3aa96f988", "scanner": "scanner-primary", "fingerprint": "79828bcaf458131d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e59915dde55c557", "level": "note", "message": {"text": "Unused endpoint: POST /submit-session"}, "properties": {"repobilityId": "e4eb6a58eccdc1ed", "scanner": "scanner-primary", "fingerprint": "3e59915dde55c557", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3be509ef647f147e", "level": "note", "message": {"text": "Unused endpoint: POST /save-test"}, "properties": {"repobilityId": "f2a1ac126cf92d26", "scanner": "scanner-primary", "fingerprint": "3be509ef647f147e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}