{"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-f5bbb6138bdc8832", "name": "Possibly dead Python function: header", "shortDescription": {"text": "Possibly dead Python function: header"}, "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-603c715f2b7b6c09", "name": "Possibly dead Python function: footer", "shortDescription": {"text": "Possibly dead Python function: footer"}, "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-3e6cb7d7b4166663", "name": "Possibly dead Python function: transcript_section", "shortDescription": {"text": "Possibly dead Python function: transcript_section"}, "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-bf8d292ae90b4bd2", "name": "Possibly dead Python function: header", "shortDescription": {"text": "Possibly dead Python function: header"}, "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-4274166b24f1a351", "name": "Possibly dead Python function: footer", "shortDescription": {"text": "Possibly dead Python function: footer"}, "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-ad00d3f5f6340395", "name": "Possibly dead Python function: send_password_reset_email", "shortDescription": {"text": "Possibly dead Python function: send_password_reset_email"}, "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-e39b557a2914e3db", "name": "Possibly dead Python function: send_mentor_approved_email", "shortDescription": {"text": "Possibly dead Python function: send_mentor_approved_email"}, "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-e789d4bc5a528605", "name": "Possibly dead Python function: send_mentor_rejected_email", "shortDescription": {"text": "Possibly dead Python function: send_mentor_rejected_email"}, "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-4eafe726294cab9a", "name": "Possibly dead Python function: delete_expired_sessions", "shortDescription": {"text": "Possibly dead Python function: delete_expired_sessions"}, "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-0cd269eada811393", "name": "Possibly dead Python function: header", "shortDescription": {"text": "Possibly dead Python function: header"}, "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-907241b64d26a84a", "name": "Possibly dead Python function: footer", "shortDescription": {"text": "Possibly dead Python function: footer"}, "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-7a70ab70201967a9", "name": "Possibly dead Python function: transcript_section", "shortDescription": {"text": "Possibly dead Python function: transcript_section"}, "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-b0e4fefbda4a0944", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/layout.tsx:19", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/layout.tsx:19"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6bbcf011acf34dae", "name": "Icon-only button without accessible name \u2014 frontend/app/dashboard/page.tsx:104", "shortDescription": {"text": "Icon-only button without accessible name \u2014 frontend/app/dashboard/page.tsx:104"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c47b6c6c75dcf217", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/report/[id]/page.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/report/[id]/page.tsx:173"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c70b44167742769f", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/app/layout.tsx:19", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/layout.tsx:19"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-77af1f4c65a184e7", "name": "Insecure pattern 'local_storage_auth_token' in frontend/lib/api.ts:11", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/lib/api.ts:11"}, "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-c7309a8a7030c72a", "name": "Possible secret in backend/seed_admin.py", "shortDescription": {"text": "Possible secret in backend/seed_admin.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "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": "2 test file(s) for 62 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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 9 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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 25 placeholder/mock markers across 9 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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-0208e1bcbd872b2f", "name": "Agent authority lacks a verifier contract: SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-581fb1dca549a130", "name": "Stub function `header` (body is just `pass`/`return`) \u2014 modules/reporter.py:87", "shortDescription": {"text": "Stub function `header` (body is just `pass`/`return`) \u2014 modules/reporter.py:87"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-620acde75fd732ae", "name": "Stub function `header` (body is just `pass`/`return`) \u2014 modules/manager_reporter.py:92", "shortDescription": {"text": "Stub function `header` (body is just `pass`/`return`) \u2014 modules/manager_reporter.py:92"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5638f91cafea384d", "name": "Stub function `header` (body is just `pass`/`return`) \u2014 backend/modules/reporter.py:88", "shortDescription": {"text": "Stub function `header` (body is just `pass`/`return`) \u2014 backend/modules/reporter.py:88"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "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:\nmodules/converter.py:convert_to_mp3, backend/modules/converter.py:convert_to_mp3\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:\nmodules/reporter.py:header, modules/manager_reporter.py:header, backend/modules/reporter.py:header\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-f4dd98e671b584f3", "name": "FastAPI POST `stripe_webhook` without auth dependency \u2014 backend/routers/payments.py:147", "shortDescription": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 backend/routers/payments.py:147"}, "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-8b298597e45aa880", "name": "FastAPI POST `forgot_password` without auth dependency \u2014 backend/routers/auth.py:112", "shortDescription": {"text": "FastAPI POST `forgot_password` without auth dependency \u2014 backend/routers/auth.py:112"}, "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-2555afa0bdbe17f3", "name": "FastAPI POST `reset_password` without auth dependency \u2014 backend/routers/auth.py:143", "shortDescription": {"text": "FastAPI POST `reset_password` without auth dependency \u2014 backend/routers/auth.py:143"}, "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-e6887fbd0201f219", "name": "FastAPI POST `analyze_manager_audio` without auth dependency \u2014 backend/routers/manager.py:63", "shortDescription": {"text": "FastAPI POST `analyze_manager_audio` without auth dependency \u2014 backend/routers/manager.py:63"}, "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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend/main.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-6385cd0e163a390f", "name": "Unused endpoint: POST /checkout", "shortDescription": {"text": "Unused endpoint: POST /checkout"}, "fullDescription": {"text": "`backend/routers/payments.py` declares `POST /checkout` 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-0ae38010c60493f1", "name": "Unused endpoint: POST /webhook", "shortDescription": {"text": "Unused endpoint: POST /webhook"}, "fullDescription": {"text": "`backend/routers/payments.py` declares `POST /webhook` 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-5333981b5e5415d1", "name": "Unused endpoint: POST /upload-photo", "shortDescription": {"text": "Unused endpoint: POST /upload-photo"}, "fullDescription": {"text": "`backend/routers/mentors.py` declares `POST /upload-photo` 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-9a88e32ba95dda7c", "name": "Unused endpoint: POST /apply", "shortDescription": {"text": "Unused endpoint: POST /apply"}, "fullDescription": {"text": "`backend/routers/mentors.py` declares `POST /apply` 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": "`backend/routers/mentors.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-d3ef0da5b6adb169", "name": "Unused endpoint: GET /recommend", "shortDescription": {"text": "Unused endpoint: GET /recommend"}, "fullDescription": {"text": "`backend/routers/mentors.py` declares `GET /recommend` 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-ce0028256a164c4a", "name": "Unused endpoint: GET /{mentor_id}", "shortDescription": {"text": "Unused endpoint: GET /{mentor_id}"}, "fullDescription": {"text": "`backend/routers/mentors.py` declares `GET /{mentor_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-59a1cc885f47e39f", "name": "Unused endpoint: PATCH /profile", "shortDescription": {"text": "Unused endpoint: PATCH /profile"}, "fullDescription": {"text": "`backend/routers/mentors.py` declares `PATCH /profile` 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-417189a27da21531", "name": "Unused endpoint: POST /track/view", "shortDescription": {"text": "Unused endpoint: POST /track/view"}, "fullDescription": {"text": "`backend/routers/mentors.py` declares `POST /track/view` 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-69f667a2dbb09337", "name": "Unused endpoint: POST /{mentor_id}/track/click", "shortDescription": {"text": "Unused endpoint: POST /{mentor_id}/track/click"}, "fullDescription": {"text": "`backend/routers/mentors.py` declares `POST /{mentor_id}/track/click` 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-d333170afe1ee92f", "name": "Unused endpoint: POST /feedback/{session_id}", "shortDescription": {"text": "Unused endpoint: POST /feedback/{session_id}"}, "fullDescription": {"text": "`backend/routers/feedback.py` declares `POST /feedback/{session_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-480294fe742e8c74", "name": "Unused endpoint: GET /coupons", "shortDescription": {"text": "Unused endpoint: GET /coupons"}, "fullDescription": {"text": "`backend/routers/feedback.py` declares `GET /coupons` 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-cc04ac68146cb69f", "name": "Unused endpoint: GET /credits", "shortDescription": {"text": "Unused endpoint: GET /credits"}, "fullDescription": {"text": "`backend/routers/feedback.py` declares `GET /credits` 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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`backend/routers/auth.py` declares `POST /register` 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-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/routers/auth.py` declares `POST /login` 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-4257ec01219aa99a", "name": "Unused endpoint: POST /forgot-password", "shortDescription": {"text": "Unused endpoint: POST /forgot-password"}, "fullDescription": {"text": "`backend/routers/auth.py` declares `POST /forgot-password` 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-68a5d356c0cac9e3", "name": "Unused endpoint: POST /reset-password", "shortDescription": {"text": "Unused endpoint: POST /reset-password"}, "fullDescription": {"text": "`backend/routers/auth.py` declares `POST /reset-password` 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": "`backend/routers/auth.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-841e50bf821e4158", "name": "Unused endpoint: GET /users", "shortDescription": {"text": "Unused endpoint: GET /users"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `GET /users` 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-74447db8a077a590", "name": "Unused endpoint: PATCH /users/{user_id}/credits", "shortDescription": {"text": "Unused endpoint: PATCH /users/{user_id}/credits"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `PATCH /users/{user_id}/credits` 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-03d4817b0d34a167", "name": "Unused endpoint: GET /feedbacks", "shortDescription": {"text": "Unused endpoint: GET /feedbacks"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `GET /feedbacks` 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-db5b5837abddb8b5", "name": "Unused endpoint: GET /trends", "shortDescription": {"text": "Unused endpoint: GET /trends"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `GET /trends` 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-e0ac1a90c5914493", "name": "Unused endpoint: PATCH /users/{user_id}/toggle-admin", "shortDescription": {"text": "Unused endpoint: PATCH /users/{user_id}/toggle-admin"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `PATCH /users/{user_id}/toggle-admin` 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-eefc4b5de67ca793", "name": "Unused endpoint: GET /notices", "shortDescription": {"text": "Unused endpoint: GET /notices"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `GET /notices` 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-f133472ba413ff42", "name": "Unused endpoint: POST /notices", "shortDescription": {"text": "Unused endpoint: POST /notices"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `POST /notices` 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-6041f51b024759d4", "name": "Unused endpoint: PUT /notices/{notice_id}", "shortDescription": {"text": "Unused endpoint: PUT /notices/{notice_id}"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `PUT /notices/{notice_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-af161020722d36da", "name": "Unused endpoint: DELETE /notices/{notice_id}", "shortDescription": {"text": "Unused endpoint: DELETE /notices/{notice_id}"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `DELETE /notices/{notice_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-1f641c43450b1751", "name": "Unused endpoint: GET /mentors", "shortDescription": {"text": "Unused endpoint: GET /mentors"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `GET /mentors` 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-252936caf1ba31e1", "name": "Unused endpoint: PATCH /mentors/{user_id}/approve", "shortDescription": {"text": "Unused endpoint: PATCH /mentors/{user_id}/approve"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `PATCH /mentors/{user_id}/approve` 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-56187e655c14f3a7", "name": "Unused endpoint: PATCH /mentors/{user_id}/reject", "shortDescription": {"text": "Unused endpoint: PATCH /mentors/{user_id}/reject"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `PATCH /mentors/{user_id}/reject` 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-cecee4c21e264d14", "name": "Unused endpoint: GET /purchases", "shortDescription": {"text": "Unused endpoint: GET /purchases"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `GET /purchases` 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-dbc57f0e09e86c0b", "name": "Unused endpoint: PATCH /mentors/{user_id}/toggle-active", "shortDescription": {"text": "Unused endpoint: PATCH /mentors/{user_id}/toggle-active"}, "fullDescription": {"text": "`backend/routers/admin.py` declares `PATCH /mentors/{user_id}/toggle-active` 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-fca11d494725d7c3", "name": "Unused endpoint: POST /analyze", "shortDescription": {"text": "Unused endpoint: POST /analyze"}, "fullDescription": {"text": "`backend/routers/analyze.py` declares `POST /analyze` 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-96b8a26b16384097", "name": "Unused endpoint: GET /analyze/status/{job_id}", "shortDescription": {"text": "Unused endpoint: GET /analyze/status/{job_id}"}, "fullDescription": {"text": "`backend/routers/analyze.py` declares `GET /analyze/status/{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-37157900d71c21d3", "name": "Unused endpoint: GET /latest", "shortDescription": {"text": "Unused endpoint: GET /latest"}, "fullDescription": {"text": "`backend/routers/notices.py` declares `GET /latest` 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-589f2ecb270d41a9", "name": "Unused endpoint: GET /{notice_id}", "shortDescription": {"text": "Unused endpoint: GET /{notice_id}"}, "fullDescription": {"text": "`backend/routers/notices.py` declares `GET /{notice_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-9170ede1d3162763", "name": "Unused endpoint: POST /{notice_id}/read", "shortDescription": {"text": "Unused endpoint: POST /{notice_id}/read"}, "fullDescription": {"text": "`backend/routers/notices.py` declares `POST /{notice_id}/read` 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-af24049c13127ae7", "name": "Unused endpoint: GET /{session_id}", "shortDescription": {"text": "Unused endpoint: GET /{session_id}"}, "fullDescription": {"text": "`backend/routers/sessions.py` declares `GET /{session_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-8c36514fd30775d7", "name": "Unused endpoint: GET /{session_id}/pdf", "shortDescription": {"text": "Unused endpoint: GET /{session_id}/pdf"}, "fullDescription": {"text": "`backend/routers/sessions.py` declares `GET /{session_id}/pdf` 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/22873"}, "properties": {"repository": "wrdlisner/coaching-analyzer", "repoUrl": "https://github.com/wrdlisner/coaching-analyzer", "branch": "main"}, "results": [{"ruleId": "scanner-f5bbb6138bdc8832", "level": "note", "message": {"text": "Possibly dead Python function: header"}, "properties": {"repobilityId": "0d3c97e1cc68c808", "scanner": "scanner-primary", "fingerprint": "f5bbb6138bdc8832", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modules/reporter.py:87"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-603c715f2b7b6c09", "level": "note", "message": {"text": "Possibly dead Python function: footer"}, "properties": {"repobilityId": "9f0be3db8aae782f", "scanner": "scanner-primary", "fingerprint": "603c715f2b7b6c09", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modules/reporter.py:90"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3e6cb7d7b4166663", "level": "note", "message": {"text": "Possibly dead Python function: transcript_section"}, "properties": {"repobilityId": "2a13771dd346c3ad", "scanner": "scanner-primary", "fingerprint": "3e6cb7d7b4166663", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modules/reporter.py:379"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bf8d292ae90b4bd2", "level": "note", "message": {"text": "Possibly dead Python function: header"}, "properties": {"repobilityId": "0d3c97e1cc68c808", "scanner": "scanner-primary", "fingerprint": "bf8d292ae90b4bd2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modules/manager_reporter.py:92"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4274166b24f1a351", "level": "note", "message": {"text": "Possibly dead Python function: footer"}, "properties": {"repobilityId": "9f0be3db8aae782f", "scanner": "scanner-primary", "fingerprint": "4274166b24f1a351", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "modules/manager_reporter.py:95"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ad00d3f5f6340395", "level": "note", "message": {"text": "Possibly dead Python function: send_password_reset_email"}, "properties": {"repobilityId": "cb5da10aa56ef088", "scanner": "scanner-primary", "fingerprint": "ad00d3f5f6340395", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/email_utils.py:44"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e39b557a2914e3db", "level": "note", "message": {"text": "Possibly dead Python function: send_mentor_approved_email"}, "properties": {"repobilityId": "bf6a4a3583793cc0", "scanner": "scanner-primary", "fingerprint": "e39b557a2914e3db", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/email_utils.py:87"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e789d4bc5a528605", "level": "note", "message": {"text": "Possibly dead Python function: send_mentor_rejected_email"}, "properties": {"repobilityId": "6714a6b4b41fcb13", "scanner": "scanner-primary", "fingerprint": "e789d4bc5a528605", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/email_utils.py:133"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4eafe726294cab9a", "level": "note", "message": {"text": "Possibly dead Python function: delete_expired_sessions"}, "properties": {"repobilityId": "2a2c2017bde3ea90", "scanner": "scanner-primary", "fingerprint": "4eafe726294cab9a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/main.py:66"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0cd269eada811393", "level": "note", "message": {"text": "Possibly dead Python function: header"}, "properties": {"repobilityId": "0d3c97e1cc68c808", "scanner": "scanner-primary", "fingerprint": "0cd269eada811393", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/modules/reporter.py:88"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-907241b64d26a84a", "level": "note", "message": {"text": "Possibly dead Python function: footer"}, "properties": {"repobilityId": "9f0be3db8aae782f", "scanner": "scanner-primary", "fingerprint": "907241b64d26a84a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/modules/reporter.py:91"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a70ab70201967a9", "level": "note", "message": {"text": "Possibly dead Python function: transcript_section"}, "properties": {"repobilityId": "2a13771dd346c3ad", "scanner": "scanner-primary", "fingerprint": "7a70ab70201967a9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/modules/reporter.py:391"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b0e4fefbda4a0944", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/app/layout.tsx:19"}, "properties": {"repobilityId": "c3711f4722a30929", "scanner": "scanner-primary", "fingerprint": "b0e4fefbda4a0944", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6bbcf011acf34dae", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 frontend/app/dashboard/page.tsx:104"}, "properties": {"repobilityId": "5008a0ec897a3d3e", "scanner": "scanner-primary", "fingerprint": "6bbcf011acf34dae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c47b6c6c75dcf217", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/app/report/[id]/page.tsx:173"}, "properties": {"repobilityId": "308d472873508d1e", "scanner": "scanner-primary", "fingerprint": "c47b6c6c75dcf217", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c70b44167742769f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/app/layout.tsx:19"}, "properties": {"repobilityId": "352266f153f8b038", "scanner": "scanner-primary", "fingerprint": "c70b44167742769f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/app/layout.tsx"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-77af1f4c65a184e7", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/lib/api.ts:11"}, "properties": {"repobilityId": "0dff2e79fbe40699", "scanner": "scanner-primary", "fingerprint": "77af1f4c65a184e7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/lib/api.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-c7309a8a7030c72a", "level": "error", "message": {"text": "Possible secret in backend/seed_admin.py"}, "properties": {"repobilityId": "50c01d411d802e70", "scanner": "scanner-primary", "fingerprint": "c7309a8a7030c72a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/seed_admin.py"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-c7309a8a7030c72a", "level": "error", "message": {"text": "Possible secret in backend/seed_admin.py"}, "properties": {"repobilityId": "50c01d411d802e70", "scanner": "scanner-primary", "fingerprint": "c7309a8a7030c72a", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/seed_admin.py"}, "region": {"startLine": 64}}}]}, {"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-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "c689e8ae036e9478", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "a57df0aeb011fc69", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "90422ff755412363", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "1e7aef8c1da192ea", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "5cf2a8355be50cfd", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "2bb6e4556353f255", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "fe7499d2b22cb6e4", "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": "0c0845c45417bd77", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-0208e1bcbd872b2f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: SKILL.md"}, "properties": {"repobilityId": "42134429a68f4dd4", "scanner": "scanner-primary", "fingerprint": "0208e1bcbd872b2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "skill_file"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-581fb1dca549a130", "level": "note", "message": {"text": "Stub function `header` (body is just `pass`/`return`) \u2014 modules/reporter.py:87"}, "properties": {"repobilityId": "a2edce1e3e21c0b0", "scanner": "scanner-primary", "fingerprint": "581fb1dca549a130", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-620acde75fd732ae", "level": "note", "message": {"text": "Stub function `header` (body is just `pass`/`return`) \u2014 modules/manager_reporter.py:92"}, "properties": {"repobilityId": "734db6917561f53e", "scanner": "scanner-primary", "fingerprint": "620acde75fd732ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-5638f91cafea384d", "level": "note", "message": {"text": "Stub function `header` (body is just `pass`/`return`) \u2014 backend/modules/reporter.py:88"}, "properties": {"repobilityId": "61406ae47b3bd58f", "scanner": "scanner-primary", "fingerprint": "5638f91cafea384d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "74b93a8f47833403", "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": "494345110314b75c", "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": "d1a58fea8fd92fc2", "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": "20de78122b6e9e46", "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": "71dfb54e215cf071", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "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": "635825a45b869da2", "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": "a3581405b822f7db", "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": "6b5710a818855628", "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": "743420ee8a176fcd", "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": "ac101648b0d6eb95", "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": "d4f1998762cf4cbc", "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": "e8cc1106b2de516f", "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": "28a92b53feb76db2", "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": "b5682d1dada5ea4d", "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": "a74602e16501db25", "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": "2bddb95f4ff30067", "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": "9555668e7e71f196", "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": "691a9688800bd639", "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": "8a64e76f63cc5568", "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": "55fa1877e7b54616", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-f4dd98e671b584f3", "level": "error", "message": {"text": "FastAPI POST `stripe_webhook` without auth dependency \u2014 backend/routers/payments.py:147"}, "properties": {"repobilityId": "a49eb6bea7f0f459", "scanner": "scanner-primary", "fingerprint": "f4dd98e671b584f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routers/payments.py"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-8b298597e45aa880", "level": "error", "message": {"text": "FastAPI POST `forgot_password` without auth dependency \u2014 backend/routers/auth.py:112"}, "properties": {"repobilityId": "77be199789e31384", "scanner": "scanner-primary", "fingerprint": "8b298597e45aa880", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routers/auth.py"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-2555afa0bdbe17f3", "level": "error", "message": {"text": "FastAPI POST `reset_password` without auth dependency \u2014 backend/routers/auth.py:143"}, "properties": {"repobilityId": "31771a050d1cabc2", "scanner": "scanner-primary", "fingerprint": "2555afa0bdbe17f3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routers/auth.py"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-e6887fbd0201f219", "level": "error", "message": {"text": "FastAPI POST `analyze_manager_audio` without auth dependency \u2014 backend/routers/manager.py:63"}, "properties": {"repobilityId": "d534a9c066458b1b", "scanner": "scanner-primary", "fingerprint": "e6887fbd0201f219", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/routers/manager.py"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "9266ee3970fba636", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6385cd0e163a390f", "level": "note", "message": {"text": "Unused endpoint: POST /checkout"}, "properties": {"repobilityId": "e9b9f32e53d5c0cd", "scanner": "scanner-primary", "fingerprint": "6385cd0e163a390f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ae38010c60493f1", "level": "note", "message": {"text": "Unused endpoint: POST /webhook"}, "properties": {"repobilityId": "2a09ea84600cdc83", "scanner": "scanner-primary", "fingerprint": "0ae38010c60493f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5333981b5e5415d1", "level": "note", "message": {"text": "Unused endpoint: POST /upload-photo"}, "properties": {"repobilityId": "b639fcda6d7ce598", "scanner": "scanner-primary", "fingerprint": "5333981b5e5415d1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9a88e32ba95dda7c", "level": "note", "message": {"text": "Unused endpoint: POST /apply"}, "properties": {"repobilityId": "3973bc08b51c0da7", "scanner": "scanner-primary", "fingerprint": "9a88e32ba95dda7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "6140fe6323f3e26b", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d3ef0da5b6adb169", "level": "note", "message": {"text": "Unused endpoint: GET /recommend"}, "properties": {"repobilityId": "179427c0a98d9eff", "scanner": "scanner-primary", "fingerprint": "d3ef0da5b6adb169", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce0028256a164c4a", "level": "note", "message": {"text": "Unused endpoint: GET /{mentor_id}"}, "properties": {"repobilityId": "101e3ef10d40a438", "scanner": "scanner-primary", "fingerprint": "ce0028256a164c4a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-59a1cc885f47e39f", "level": "note", "message": {"text": "Unused endpoint: PATCH /profile"}, "properties": {"repobilityId": "707b7f601236e944", "scanner": "scanner-primary", "fingerprint": "59a1cc885f47e39f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-417189a27da21531", "level": "note", "message": {"text": "Unused endpoint: POST /track/view"}, "properties": {"repobilityId": "e666e7fb988c9ac2", "scanner": "scanner-primary", "fingerprint": "417189a27da21531", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-69f667a2dbb09337", "level": "note", "message": {"text": "Unused endpoint: POST /{mentor_id}/track/click"}, "properties": {"repobilityId": "305434ba5c9a6ae2", "scanner": "scanner-primary", "fingerprint": "69f667a2dbb09337", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d333170afe1ee92f", "level": "note", "message": {"text": "Unused endpoint: POST /feedback/{session_id}"}, "properties": {"repobilityId": "97f6abf253da5731", "scanner": "scanner-primary", "fingerprint": "d333170afe1ee92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-480294fe742e8c74", "level": "note", "message": {"text": "Unused endpoint: GET /coupons"}, "properties": {"repobilityId": "e383a83c8c44def5", "scanner": "scanner-primary", "fingerprint": "480294fe742e8c74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc04ac68146cb69f", "level": "note", "message": {"text": "Unused endpoint: GET /credits"}, "properties": {"repobilityId": "171fd3248b3208ee", "scanner": "scanner-primary", "fingerprint": "cc04ac68146cb69f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "3454d1fb07d04ecd", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "8b9d76c682d772e8", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4257ec01219aa99a", "level": "note", "message": {"text": "Unused endpoint: POST /forgot-password"}, "properties": {"repobilityId": "b7cadc3d1b77de95", "scanner": "scanner-primary", "fingerprint": "4257ec01219aa99a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68a5d356c0cac9e3", "level": "note", "message": {"text": "Unused endpoint: POST /reset-password"}, "properties": {"repobilityId": "a287434d346601cd", "scanner": "scanner-primary", "fingerprint": "68a5d356c0cac9e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea575b61c121b733", "level": "note", "message": {"text": "Unused endpoint: PATCH /me"}, "properties": {"repobilityId": "debe35f0d5c7d5a1", "scanner": "scanner-primary", "fingerprint": "ea575b61c121b733", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-841e50bf821e4158", "level": "note", "message": {"text": "Unused endpoint: GET /users"}, "properties": {"repobilityId": "af3400609b258cf9", "scanner": "scanner-primary", "fingerprint": "841e50bf821e4158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74447db8a077a590", "level": "note", "message": {"text": "Unused endpoint: PATCH /users/{user_id}/credits"}, "properties": {"repobilityId": "af00643330254575", "scanner": "scanner-primary", "fingerprint": "74447db8a077a590", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-03d4817b0d34a167", "level": "note", "message": {"text": "Unused endpoint: GET /feedbacks"}, "properties": {"repobilityId": "dd6f555786e061c4", "scanner": "scanner-primary", "fingerprint": "03d4817b0d34a167", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db5b5837abddb8b5", "level": "note", "message": {"text": "Unused endpoint: GET /trends"}, "properties": {"repobilityId": "d639d5468d6a5d23", "scanner": "scanner-primary", "fingerprint": "db5b5837abddb8b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0ac1a90c5914493", "level": "note", "message": {"text": "Unused endpoint: PATCH /users/{user_id}/toggle-admin"}, "properties": {"repobilityId": "5f2981820188f0ad", "scanner": "scanner-primary", "fingerprint": "e0ac1a90c5914493", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eefc4b5de67ca793", "level": "note", "message": {"text": "Unused endpoint: GET /notices"}, "properties": {"repobilityId": "3d314eb8d1914c14", "scanner": "scanner-primary", "fingerprint": "eefc4b5de67ca793", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f133472ba413ff42", "level": "note", "message": {"text": "Unused endpoint: POST /notices"}, "properties": {"repobilityId": "0146965570bf9bb9", "scanner": "scanner-primary", "fingerprint": "f133472ba413ff42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6041f51b024759d4", "level": "note", "message": {"text": "Unused endpoint: PUT /notices/{notice_id}"}, "properties": {"repobilityId": "bf58da9b12ff66fa", "scanner": "scanner-primary", "fingerprint": "6041f51b024759d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af161020722d36da", "level": "note", "message": {"text": "Unused endpoint: DELETE /notices/{notice_id}"}, "properties": {"repobilityId": "a2e7884396ae9c65", "scanner": "scanner-primary", "fingerprint": "af161020722d36da", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f641c43450b1751", "level": "note", "message": {"text": "Unused endpoint: GET /mentors"}, "properties": {"repobilityId": "743c09f3b8cab1fa", "scanner": "scanner-primary", "fingerprint": "1f641c43450b1751", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-252936caf1ba31e1", "level": "note", "message": {"text": "Unused endpoint: PATCH /mentors/{user_id}/approve"}, "properties": {"repobilityId": "c997b7f589b79db7", "scanner": "scanner-primary", "fingerprint": "252936caf1ba31e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-56187e655c14f3a7", "level": "note", "message": {"text": "Unused endpoint: PATCH /mentors/{user_id}/reject"}, "properties": {"repobilityId": "213c79712196e1b2", "scanner": "scanner-primary", "fingerprint": "56187e655c14f3a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cecee4c21e264d14", "level": "note", "message": {"text": "Unused endpoint: GET /purchases"}, "properties": {"repobilityId": "fd299646b9ab2c7c", "scanner": "scanner-primary", "fingerprint": "cecee4c21e264d14", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dbc57f0e09e86c0b", "level": "note", "message": {"text": "Unused endpoint: PATCH /mentors/{user_id}/toggle-active"}, "properties": {"repobilityId": "359ced30f318028c", "scanner": "scanner-primary", "fingerprint": "dbc57f0e09e86c0b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fca11d494725d7c3", "level": "note", "message": {"text": "Unused endpoint: POST /analyze"}, "properties": {"repobilityId": "189cf4211ffa7005", "scanner": "scanner-primary", "fingerprint": "fca11d494725d7c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-96b8a26b16384097", "level": "note", "message": {"text": "Unused endpoint: GET /analyze/status/{job_id}"}, "properties": {"repobilityId": "59f20c6ef03256d9", "scanner": "scanner-primary", "fingerprint": "96b8a26b16384097", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37157900d71c21d3", "level": "note", "message": {"text": "Unused endpoint: GET /latest"}, "properties": {"repobilityId": "3b490dfcbb69c404", "scanner": "scanner-primary", "fingerprint": "37157900d71c21d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-589f2ecb270d41a9", "level": "note", "message": {"text": "Unused endpoint: GET /{notice_id}"}, "properties": {"repobilityId": "4a3f123e15a8f8a2", "scanner": "scanner-primary", "fingerprint": "589f2ecb270d41a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9170ede1d3162763", "level": "note", "message": {"text": "Unused endpoint: POST /{notice_id}/read"}, "properties": {"repobilityId": "647fc19744e73284", "scanner": "scanner-primary", "fingerprint": "9170ede1d3162763", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-af24049c13127ae7", "level": "note", "message": {"text": "Unused endpoint: GET /{session_id}"}, "properties": {"repobilityId": "599f0fe5e81ba581", "scanner": "scanner-primary", "fingerprint": "af24049c13127ae7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8c36514fd30775d7", "level": "note", "message": {"text": "Unused endpoint: GET /{session_id}/pdf"}, "properties": {"repobilityId": "31bd3683bb645129", "scanner": "scanner-primary", "fingerprint": "8c36514fd30775d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}