{"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-cf9b349e9941e894", "name": "Possibly dead Python function: format_pillar", "shortDescription": {"text": "Possibly dead Python function: format_pillar"}, "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-87c51f93bcd83c26", "name": "Possibly dead Python function: start_command", "shortDescription": {"text": "Possibly dead Python function: start_command"}, "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-8548353680a236cc", "name": "Possibly dead Python function: help_command", "shortDescription": {"text": "Possibly dead Python function: help_command"}, "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-9e5f625084e147dc", "name": "Possibly dead Python function: term_command", "shortDescription": {"text": "Possibly dead Python function: term_command"}, "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-d97701b8074bb6d9", "name": "Possibly dead Python function: saju_start", "shortDescription": {"text": "Possibly dead Python function: saju_start"}, "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-2f95992a1dee5420", "name": "Possibly dead Python function: name_received", "shortDescription": {"text": "Possibly dead Python function: name_received"}, "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-dc0626d4df42399d", "name": "Possibly dead Python function: gender_received", "shortDescription": {"text": "Possibly dead Python function: gender_received"}, "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-817fa9d8ad36b88b", "name": "Possibly dead Python function: calendar_received", "shortDescription": {"text": "Possibly dead Python function: calendar_received"}, "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-e97d1c84a6e54bc3", "name": "Possibly dead Python function: year_received", "shortDescription": {"text": "Possibly dead Python function: year_received"}, "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-343d10581e9a8409", "name": "Possibly dead Python function: month_received", "shortDescription": {"text": "Possibly dead Python function: month_received"}, "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-a8a4924c2be0d3a8", "name": "Possibly dead Python function: day_received", "shortDescription": {"text": "Possibly dead Python function: day_received"}, "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-40e51598e3b0c3da", "name": "Possibly dead Python function: hour_received", "shortDescription": {"text": "Possibly dead Python function: hour_received"}, "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-77cae0cea2bf267e", "name": "Possibly dead Python function: minute_received", "shortDescription": {"text": "Possibly dead Python function: minute_received"}, "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-2be35ccc21500f39", "name": "Possibly dead Python function: analysis_callback", "shortDescription": {"text": "Possibly dead Python function: analysis_callback"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd6b9c420c24d08d", "name": "Possibly dead Python function: gunghap_start_callback", "shortDescription": {"text": "Possibly dead Python function: gunghap_start_callback"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d57fa724ca33eb6e", "name": "Possibly dead Python function: gunghap_start", "shortDescription": {"text": "Possibly dead Python function: gunghap_start"}, "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-876ab2fb9fa90530", "name": "Possibly dead Python function: gh_gender_received", "shortDescription": {"text": "Possibly dead Python function: gh_gender_received"}, "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-7521118c79b16e13", "name": "Possibly dead Python function: gh_calendar_received", "shortDescription": {"text": "Possibly dead Python function: gh_calendar_received"}, "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-a2a181bc578f0ea9", "name": "Possibly dead Python function: gh_year_received", "shortDescription": {"text": "Possibly dead Python function: gh_year_received"}, "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-011989932d84fa02", "name": "Possibly dead Python function: gh_month_received", "shortDescription": {"text": "Possibly dead Python function: gh_month_received"}, "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-e745bb37bcbb01f2", "name": "Possibly dead Python function: gh_day_received", "shortDescription": {"text": "Possibly dead Python function: gh_day_received"}, "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-71a633d282319ab0", "name": "Possibly dead Python function: gh_hour_received", "shortDescription": {"text": "Possibly dead Python function: gh_hour_received"}, "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-625ce9df495d34c0", "name": "Possibly dead Python function: gh_minute_received", "shortDescription": {"text": "Possibly dead Python function: gh_minute_received"}, "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-6d6ae5314a91db56", "name": "Possibly dead Python function: gh_cancel", "shortDescription": {"text": "Possibly dead Python function: gh_cancel"}, "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-5bba2658a10945c8", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/components/LuckCard.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/components/LuckCard.tsx:42"}, "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-1abbe8a93d8109c7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/components/SavedProfilesModal.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/components/SavedProfilesModal.tsx:101"}, "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-68354e8c53b0cc46", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/page.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/page.tsx:71"}, "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-4d929b61b1b597f2", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/learn/page.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/learn/page.tsx:183"}, "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-e7d4036b09b6f21a", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/saved/page.tsx:94", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/saved/page.tsx:94"}, "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-2a7e24ab694a647e", "name": "Dockerfile runs as root: backend-fastapi/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend-fastapi/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf7df1dac21fbb2b", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-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-402a0626b3748a9a", "name": "Insecure pattern 'cors_wildcard' in backend-fastapi/main.py:88", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in backend-fastapi/main.py:88"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-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-c8ccdceaec82ca16", "name": "Very large file: backend-fastapi/telegram_bot.py (1535 lines)", "shortDescription": {"text": "Very large file: backend-fastapi/telegram_bot.py (1535 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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 68 source file(s) (ratio 0.00). 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 24 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 17 placeholder/mock markers across 10 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, tests. 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-a13090c42ee27341", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/components/DailyFortune.tsx:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/components/DailyFortune.tsx:89"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-017548db1f4293ac", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/lib/analyzeStream.ts:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/lib/analyzeStream.ts:65"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b4ddbbb1cdf9bbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/lib/learn.ts:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/lib/learn.ts:89"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5419e7f8a31a1056", "name": "Legacy-named symbol `learn_backup` in backend-fastapi/main.py:454", "shortDescription": {"text": "Legacy-named symbol `learn_backup` in backend-fastapi/main.py:454"}, "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-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:\nbackend-fastapi/saju_utils.py:calculate_daeun_number, backend-fastapi/saju_utils.py:calculate_daeun\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-c8f7785e0d9f018f", "name": "FastAPI POST `calculate` without auth dependency \u2014 backend-fastapi/main.py:117", "shortDescription": {"text": "FastAPI POST `calculate` without auth dependency \u2014 backend-fastapi/main.py:117"}, "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-a460959778e46c82", "name": "FastAPI POST `seyun` without auth dependency \u2014 backend-fastapi/main.py:177", "shortDescription": {"text": "FastAPI POST `seyun` without auth dependency \u2014 backend-fastapi/main.py:177"}, "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-a02e763bded685e6", "name": "FastAPI POST `wolun` without auth dependency \u2014 backend-fastapi/main.py:199", "shortDescription": {"text": "FastAPI POST `wolun` without auth dependency \u2014 backend-fastapi/main.py:199"}, "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-f60169d8f26c4e6d", "name": "FastAPI POST `ilun` without auth dependency \u2014 backend-fastapi/main.py:224", "shortDescription": {"text": "FastAPI POST `ilun` without auth dependency \u2014 backend-fastapi/main.py:224"}, "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-0f549cb1c134d18d", "name": "FastAPI POST `compatibility` without auth dependency \u2014 backend-fastapi/main.py:244", "shortDescription": {"text": "FastAPI POST `compatibility` without auth dependency \u2014 backend-fastapi/main.py:244"}, "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-c801b1ed2c5d5dfd", "name": "FastAPI POST `newyear` without auth dependency \u2014 backend-fastapi/main.py:288", "shortDescription": {"text": "FastAPI POST `newyear` without auth dependency \u2014 backend-fastapi/main.py:288"}, "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-c18d0536a1ba22ce", "name": "FastAPI POST `create_share` without auth dependency \u2014 backend-fastapi/main.py:317", "shortDescription": {"text": "FastAPI POST `create_share` without auth dependency \u2014 backend-fastapi/main.py:317"}, "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-74dbca3dcb9daf99", "name": "FastAPI POST `image_prompt` without auth dependency \u2014 backend-fastapi/main.py:358", "shortDescription": {"text": "FastAPI POST `image_prompt` without auth dependency \u2014 backend-fastapi/main.py:358"}, "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-70c20c2a05ffa0e9", "name": "FastAPI POST `analyze` without auth dependency \u2014 backend-fastapi/main.py:373", "shortDescription": {"text": "FastAPI POST `analyze` without auth dependency \u2014 backend-fastapi/main.py:373"}, "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-66ec49b988c865b8", "name": "FastAPI POST `analyze_stream` without auth dependency \u2014 backend-fastapi/main.py:385", "shortDescription": {"text": "FastAPI POST `analyze_stream` without auth dependency \u2014 backend-fastapi/main.py:385"}, "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-f5b714d4a422ef34", "name": "FastAPI POST `learn_personal_quiz` without auth dependency \u2014 backend-fastapi/main.py:429", "shortDescription": {"text": "FastAPI POST `learn_personal_quiz` without auth dependency \u2014 backend-fastapi/main.py:429"}, "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-e4df106ab3fcc784", "name": "FastAPI POST `learn_backup` without auth dependency \u2014 backend-fastapi/main.py:453", "shortDescription": {"text": "FastAPI POST `learn_backup` without auth dependency \u2014 backend-fastapi/main.py:453"}, "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-4d0510bce8e44ea1", "name": "FastAPI POST `learn_grade` without auth dependency \u2014 backend-fastapi/main.py:502", "shortDescription": {"text": "FastAPI POST `learn_grade` without auth dependency \u2014 backend-fastapi/main.py:502"}, "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-31b7bd6c17a1aa74", "name": "FastAPI POST `learn_tutor` without auth dependency \u2014 backend-fastapi/main.py:542", "shortDescription": {"text": "FastAPI POST `learn_tutor` without auth dependency \u2014 backend-fastapi/main.py:542"}, "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-dd159bd05997c05c", "name": "Unused endpoint: GET /admin/stats", "shortDescription": {"text": "Unused endpoint: GET /admin/stats"}, "fullDescription": {"text": "`backend-fastapi/main.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-98bf724e39396970", "name": "Unused endpoint: GET /admin/dashboard", "shortDescription": {"text": "Unused endpoint: GET /admin/dashboard"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /admin/dashboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`backend-fastapi/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-89a4e16b15df5f19", "name": "Unused endpoint: POST /calculate", "shortDescription": {"text": "Unused endpoint: POST /calculate"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /calculate` 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-ebe3481a27b770a5", "name": "Unused endpoint: GET /terms", "shortDescription": {"text": "Unused endpoint: GET /terms"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /terms` 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-443cc90d4e906a44", "name": "Unused endpoint: POST /seyun", "shortDescription": {"text": "Unused endpoint: POST /seyun"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /seyun` 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-28ab0e5dd60408b2", "name": "Unused endpoint: POST /wolun", "shortDescription": {"text": "Unused endpoint: POST /wolun"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /wolun` 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-381a0426b82f7976", "name": "Unused endpoint: POST /ilun", "shortDescription": {"text": "Unused endpoint: POST /ilun"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /ilun` 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-8542caa88db69d74", "name": "Unused endpoint: POST /compatibility", "shortDescription": {"text": "Unused endpoint: POST /compatibility"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /compatibility` 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-c0b3f09311dc8fa6", "name": "Unused endpoint: POST /newyear", "shortDescription": {"text": "Unused endpoint: POST /newyear"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /newyear` 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-cbf4cb6ac97db368", "name": "Unused endpoint: POST /share", "shortDescription": {"text": "Unused endpoint: POST /share"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /share` 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-f189fff1cc6793e5", "name": "Unused endpoint: GET /share/{code}", "shortDescription": {"text": "Unused endpoint: GET /share/{code}"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /share/{code}` 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-882b97963f1f1356", "name": "Unused endpoint: POST /image-prompt", "shortDescription": {"text": "Unused endpoint: POST /image-prompt"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /image-prompt` 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-fastapi/main.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-1647a6533f8d9bb3", "name": "Unused endpoint: POST /analyze/stream", "shortDescription": {"text": "Unused endpoint: POST /analyze/stream"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /analyze/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-6ef03a860c235fe9", "name": "Unused endpoint: GET /learn/curriculum", "shortDescription": {"text": "Unused endpoint: GET /learn/curriculum"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /learn/curriculum` 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-163d85c7c472b24d", "name": "Unused endpoint: GET /learn/chapter/{chapter_id}", "shortDescription": {"text": "Unused endpoint: GET /learn/chapter/{chapter_id}"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /learn/chapter/{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-6cf3b1ad1d9373af", "name": "Unused endpoint: GET /learn/quiz/{chapter_id}", "shortDescription": {"text": "Unused endpoint: GET /learn/quiz/{chapter_id}"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /learn/quiz/{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-35d6c345d29b1598", "name": "Unused endpoint: POST /learn/quiz/personal", "shortDescription": {"text": "Unused endpoint: POST /learn/quiz/personal"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /learn/quiz/personal` 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-5baca79d34d33689", "name": "Unused endpoint: GET /learn/placement", "shortDescription": {"text": "Unused endpoint: GET /learn/placement"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /learn/placement` 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-28daae802fdd83d4", "name": "Unused endpoint: POST /learn/backup", "shortDescription": {"text": "Unused endpoint: POST /learn/backup"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /learn/backup` 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-e0ef2f60b608d26e", "name": "Unused endpoint: GET /learn/backup/{code}", "shortDescription": {"text": "Unused endpoint: GET /learn/backup/{code}"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `GET /learn/backup/{code}` 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-9c8c41b58d4a2259", "name": "Unused endpoint: POST /learn/grade", "shortDescription": {"text": "Unused endpoint: POST /learn/grade"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /learn/grade` 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-ad20af20e0d63809", "name": "Unused endpoint: POST /learn/tutor", "shortDescription": {"text": "Unused endpoint: POST /learn/tutor"}, "fullDescription": {"text": "`backend-fastapi/main.py` declares `POST /learn/tutor` 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/20864"}, "properties": {"repository": "tbfl76z/saju-app", "repoUrl": "https://github.com/tbfl76z/saju-app", "branch": "main"}, "results": [{"ruleId": "scanner-cf9b349e9941e894", "level": "note", "message": {"text": "Possibly dead Python function: format_pillar"}, "properties": {"repobilityId": "82dbb3b30679a16b", "scanner": "scanner-primary", "fingerprint": "cf9b349e9941e894", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:67"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-87c51f93bcd83c26", "level": "note", "message": {"text": "Possibly dead Python function: start_command"}, "properties": {"repobilityId": "0aed036aeead5043", "scanner": "scanner-primary", "fingerprint": "87c51f93bcd83c26", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:574"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8548353680a236cc", "level": "note", "message": {"text": "Possibly dead Python function: help_command"}, "properties": {"repobilityId": "f5f479a71bdcf045", "scanner": "scanner-primary", "fingerprint": "8548353680a236cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:591"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9e5f625084e147dc", "level": "note", "message": {"text": "Possibly dead Python function: term_command"}, "properties": {"repobilityId": "46f0220886a8fca5", "scanner": "scanner-primary", "fingerprint": "9e5f625084e147dc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:612"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d97701b8074bb6d9", "level": "note", "message": {"text": "Possibly dead Python function: saju_start"}, "properties": {"repobilityId": "425c156e4db90670", "scanner": "scanner-primary", "fingerprint": "d97701b8074bb6d9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:643"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2f95992a1dee5420", "level": "note", "message": {"text": "Possibly dead Python function: name_received"}, "properties": {"repobilityId": "d712a681b87852a5", "scanner": "scanner-primary", "fingerprint": "2f95992a1dee5420", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:654"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dc0626d4df42399d", "level": "note", "message": {"text": "Possibly dead Python function: gender_received"}, "properties": {"repobilityId": "9514083754e4185f", "scanner": "scanner-primary", "fingerprint": "dc0626d4df42399d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:666"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-817fa9d8ad36b88b", "level": "note", "message": {"text": "Possibly dead Python function: calendar_received"}, "properties": {"repobilityId": "3c73334f8e8fad7a", "scanner": "scanner-primary", "fingerprint": "817fa9d8ad36b88b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:681"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e97d1c84a6e54bc3", "level": "note", "message": {"text": "Possibly dead Python function: year_received"}, "properties": {"repobilityId": "a061969666e7cde7", "scanner": "scanner-primary", "fingerprint": "e97d1c84a6e54bc3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:696"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-343d10581e9a8409", "level": "note", "message": {"text": "Possibly dead Python function: month_received"}, "properties": {"repobilityId": "0ac86df904509fff", "scanner": "scanner-primary", "fingerprint": "343d10581e9a8409", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:712"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a8a4924c2be0d3a8", "level": "note", "message": {"text": "Possibly dead Python function: day_received"}, "properties": {"repobilityId": "e2a25e87aaac3cd7", "scanner": "scanner-primary", "fingerprint": "a8a4924c2be0d3a8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:728"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-40e51598e3b0c3da", "level": "note", "message": {"text": "Possibly dead Python function: hour_received"}, "properties": {"repobilityId": "d5a6a00efe3bc9a7", "scanner": "scanner-primary", "fingerprint": "40e51598e3b0c3da", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:748"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-77cae0cea2bf267e", "level": "note", "message": {"text": "Possibly dead Python function: minute_received"}, "properties": {"repobilityId": "d0dd3e6d906b1779", "scanner": "scanner-primary", "fingerprint": "77cae0cea2bf267e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:768"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2be35ccc21500f39", "level": "note", "message": {"text": "Possibly dead Python function: analysis_callback"}, "properties": {"repobilityId": "83526ed735e37afc", "scanner": "scanner-primary", "fingerprint": "2be35ccc21500f39", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:920"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fd6b9c420c24d08d", "level": "note", "message": {"text": "Possibly dead Python function: gunghap_start_callback"}, "properties": {"repobilityId": "fd6c3f3908e48f73", "scanner": "scanner-primary", "fingerprint": "fd6b9c420c24d08d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1174"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d57fa724ca33eb6e", "level": "note", "message": {"text": "Possibly dead Python function: gunghap_start"}, "properties": {"repobilityId": "cedb2ed34812bb07", "scanner": "scanner-primary", "fingerprint": "d57fa724ca33eb6e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1191"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-876ab2fb9fa90530", "level": "note", "message": {"text": "Possibly dead Python function: gh_gender_received"}, "properties": {"repobilityId": "ceab820d7e7fe2ca", "scanner": "scanner-primary", "fingerprint": "876ab2fb9fa90530", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1210"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7521118c79b16e13", "level": "note", "message": {"text": "Possibly dead Python function: gh_calendar_received"}, "properties": {"repobilityId": "147852db16ce39b2", "scanner": "scanner-primary", "fingerprint": "7521118c79b16e13", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1226"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a2a181bc578f0ea9", "level": "note", "message": {"text": "Possibly dead Python function: gh_year_received"}, "properties": {"repobilityId": "2ced21ac0b8fd600", "scanner": "scanner-primary", "fingerprint": "a2a181bc578f0ea9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1240"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-011989932d84fa02", "level": "note", "message": {"text": "Possibly dead Python function: gh_month_received"}, "properties": {"repobilityId": "823a0fc7bbf5541b", "scanner": "scanner-primary", "fingerprint": "011989932d84fa02", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1254"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e745bb37bcbb01f2", "level": "note", "message": {"text": "Possibly dead Python function: gh_day_received"}, "properties": {"repobilityId": "b588a7fcec227422", "scanner": "scanner-primary", "fingerprint": "e745bb37bcbb01f2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1268"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-71a633d282319ab0", "level": "note", "message": {"text": "Possibly dead Python function: gh_hour_received"}, "properties": {"repobilityId": "2081fdad2a7701d8", "scanner": "scanner-primary", "fingerprint": "71a633d282319ab0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1286"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-625ce9df495d34c0", "level": "note", "message": {"text": "Possibly dead Python function: gh_minute_received"}, "properties": {"repobilityId": "e50749a5a141eb4d", "scanner": "scanner-primary", "fingerprint": "625ce9df495d34c0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1304"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6d6ae5314a91db56", "level": "note", "message": {"text": "Possibly dead Python function: gh_cancel"}, "properties": {"repobilityId": "02f47b8ed9bc6abe", "scanner": "scanner-primary", "fingerprint": "6d6ae5314a91db56", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/telegram_bot.py:1449"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5bba2658a10945c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/components/LuckCard.tsx:42"}, "properties": {"repobilityId": "9f5c03ce31b1c757", "scanner": "scanner-primary", "fingerprint": "5bba2658a10945c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1abbe8a93d8109c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/components/SavedProfilesModal.tsx:101"}, "properties": {"repobilityId": "86c4a30b42d2f203", "scanner": "scanner-primary", "fingerprint": "1abbe8a93d8109c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68354e8c53b0cc46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/page.tsx:71"}, "properties": {"repobilityId": "226be0f012373cfa", "scanner": "scanner-primary", "fingerprint": "68354e8c53b0cc46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d929b61b1b597f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/learn/page.tsx:183"}, "properties": {"repobilityId": "00623b0fb777f26f", "scanner": "scanner-primary", "fingerprint": "4d929b61b1b597f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7d4036b09b6f21a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend-next/src/app/(main)/saved/page.tsx:94"}, "properties": {"repobilityId": "942008def13e1ae2", "scanner": "scanner-primary", "fingerprint": "e7d4036b09b6f21a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a7e24ab694a647e", "level": "warning", "message": {"text": "Dockerfile runs as root: backend-fastapi/Dockerfile"}, "properties": {"repobilityId": "f2c2079f53778cca", "scanner": "scanner-primary", "fingerprint": "2a7e24ab694a647e", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-cf7df1dac21fbb2b", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "f321db7befbabcc4", "scanner": "scanner-primary", "fingerprint": "cf7df1dac21fbb2b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/Dockerfile"}, "region": {"startLine": 1}}}]}, {"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-402a0626b3748a9a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in backend-fastapi/main.py:88"}, "properties": {"repobilityId": "440a2dd65725338c", "scanner": "scanner-primary", "fingerprint": "402a0626b3748a9a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 88}}}]}, {"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-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-c8ccdceaec82ca16", "level": "note", "message": {"text": "Very large file: backend-fastapi/telegram_bot.py (1535 lines)"}, "properties": {"repobilityId": "c9f111bb92339f5f", "scanner": "scanner-primary", "fingerprint": "c8ccdceaec82ca16", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"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": "174cc246d4283aaf", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "ab804389dfb812bd", "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": "2d5d745e3efa4339", "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": "1a11c75c3f7fb151", "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": "c5d8e591c77284b2", "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": "b85596b2bf38fd85", "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": "e067a362a3f2552a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-a13090c42ee27341", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/components/DailyFortune.tsx:89"}, "properties": {"repobilityId": "0eedc5e26a408fd9", "scanner": "scanner-primary", "fingerprint": "a13090c42ee27341", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-017548db1f4293ac", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/lib/analyzeStream.ts:65"}, "properties": {"repobilityId": "3e27fc0831370d32", "scanner": "scanner-primary", "fingerprint": "017548db1f4293ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b4ddbbb1cdf9bbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend-next/src/lib/learn.ts:89"}, "properties": {"repobilityId": "b268aff4040b3a07", "scanner": "scanner-primary", "fingerprint": "1b4ddbbb1cdf9bbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5419e7f8a31a1056", "level": "note", "message": {"text": "Legacy-named symbol `learn_backup` in backend-fastapi/main.py:454"}, "properties": {"repobilityId": "2a3a1d5e10030a3e", "scanner": "scanner-primary", "fingerprint": "5419e7f8a31a1056", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7335e37a1b42a128", "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": "7eccfdb7cce8978d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-c8f7785e0d9f018f", "level": "error", "message": {"text": "FastAPI POST `calculate` without auth dependency \u2014 backend-fastapi/main.py:117"}, "properties": {"repobilityId": "93ab723bd422e7ee", "scanner": "scanner-primary", "fingerprint": "c8f7785e0d9f018f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 117}}}]}, {"ruleId": "scanner-a460959778e46c82", "level": "error", "message": {"text": "FastAPI POST `seyun` without auth dependency \u2014 backend-fastapi/main.py:177"}, "properties": {"repobilityId": "6d9481c32cf85697", "scanner": "scanner-primary", "fingerprint": "a460959778e46c82", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 177}}}]}, {"ruleId": "scanner-a02e763bded685e6", "level": "error", "message": {"text": "FastAPI POST `wolun` without auth dependency \u2014 backend-fastapi/main.py:199"}, "properties": {"repobilityId": "a05efb647f77b37d", "scanner": "scanner-primary", "fingerprint": "a02e763bded685e6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 199}}}]}, {"ruleId": "scanner-f60169d8f26c4e6d", "level": "error", "message": {"text": "FastAPI POST `ilun` without auth dependency \u2014 backend-fastapi/main.py:224"}, "properties": {"repobilityId": "eb3888d1481f4905", "scanner": "scanner-primary", "fingerprint": "f60169d8f26c4e6d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-0f549cb1c134d18d", "level": "error", "message": {"text": "FastAPI POST `compatibility` without auth dependency \u2014 backend-fastapi/main.py:244"}, "properties": {"repobilityId": "9942b99308961983", "scanner": "scanner-primary", "fingerprint": "0f549cb1c134d18d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 244}}}]}, {"ruleId": "scanner-c801b1ed2c5d5dfd", "level": "error", "message": {"text": "FastAPI POST `newyear` without auth dependency \u2014 backend-fastapi/main.py:288"}, "properties": {"repobilityId": "7c224f92a3289e43", "scanner": "scanner-primary", "fingerprint": "c801b1ed2c5d5dfd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 288}}}]}, {"ruleId": "scanner-c18d0536a1ba22ce", "level": "error", "message": {"text": "FastAPI POST `create_share` without auth dependency \u2014 backend-fastapi/main.py:317"}, "properties": {"repobilityId": "d920eac1a424abb6", "scanner": "scanner-primary", "fingerprint": "c18d0536a1ba22ce", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 317}}}]}, {"ruleId": "scanner-74dbca3dcb9daf99", "level": "error", "message": {"text": "FastAPI POST `image_prompt` without auth dependency \u2014 backend-fastapi/main.py:358"}, "properties": {"repobilityId": "e051cadbc7bac9e4", "scanner": "scanner-primary", "fingerprint": "74dbca3dcb9daf99", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 358}}}]}, {"ruleId": "scanner-70c20c2a05ffa0e9", "level": "error", "message": {"text": "FastAPI POST `analyze` without auth dependency \u2014 backend-fastapi/main.py:373"}, "properties": {"repobilityId": "95ca5fa7a7de9aba", "scanner": "scanner-primary", "fingerprint": "70c20c2a05ffa0e9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 373}}}]}, {"ruleId": "scanner-66ec49b988c865b8", "level": "error", "message": {"text": "FastAPI POST `analyze_stream` without auth dependency \u2014 backend-fastapi/main.py:385"}, "properties": {"repobilityId": "36258628d7ec4351", "scanner": "scanner-primary", "fingerprint": "66ec49b988c865b8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 385}}}]}, {"ruleId": "scanner-f5b714d4a422ef34", "level": "error", "message": {"text": "FastAPI POST `learn_personal_quiz` without auth dependency \u2014 backend-fastapi/main.py:429"}, "properties": {"repobilityId": "1604c37393ced025", "scanner": "scanner-primary", "fingerprint": "f5b714d4a422ef34", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 429}}}]}, {"ruleId": "scanner-e4df106ab3fcc784", "level": "error", "message": {"text": "FastAPI POST `learn_backup` without auth dependency \u2014 backend-fastapi/main.py:453"}, "properties": {"repobilityId": "fd5db8319a131728", "scanner": "scanner-primary", "fingerprint": "e4df106ab3fcc784", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 453}}}]}, {"ruleId": "scanner-4d0510bce8e44ea1", "level": "error", "message": {"text": "FastAPI POST `learn_grade` without auth dependency \u2014 backend-fastapi/main.py:502"}, "properties": {"repobilityId": "76f82b8405b9c24c", "scanner": "scanner-primary", "fingerprint": "4d0510bce8e44ea1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 502}}}]}, {"ruleId": "scanner-31b7bd6c17a1aa74", "level": "error", "message": {"text": "FastAPI POST `learn_tutor` without auth dependency \u2014 backend-fastapi/main.py:542"}, "properties": {"repobilityId": "3bc4f1f23b5d95b0", "scanner": "scanner-primary", "fingerprint": "31b7bd6c17a1aa74", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend-fastapi/main.py"}, "region": {"startLine": 542}}}]}, {"ruleId": "scanner-dd159bd05997c05c", "level": "note", "message": {"text": "Unused endpoint: GET /admin/stats"}, "properties": {"repobilityId": "63e8d790b87d6099", "scanner": "scanner-primary", "fingerprint": "dd159bd05997c05c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98bf724e39396970", "level": "note", "message": {"text": "Unused endpoint: GET /admin/dashboard"}, "properties": {"repobilityId": "9f1b47b2d456c1a5", "scanner": "scanner-primary", "fingerprint": "98bf724e39396970", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "2644feeecd325938", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-89a4e16b15df5f19", "level": "note", "message": {"text": "Unused endpoint: POST /calculate"}, "properties": {"repobilityId": "8cf05e9a784123c6", "scanner": "scanner-primary", "fingerprint": "89a4e16b15df5f19", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebe3481a27b770a5", "level": "note", "message": {"text": "Unused endpoint: GET /terms"}, "properties": {"repobilityId": "b0dc6eca44fb5936", "scanner": "scanner-primary", "fingerprint": "ebe3481a27b770a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-443cc90d4e906a44", "level": "note", "message": {"text": "Unused endpoint: POST /seyun"}, "properties": {"repobilityId": "4d4738c889d35dc9", "scanner": "scanner-primary", "fingerprint": "443cc90d4e906a44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28ab0e5dd60408b2", "level": "note", "message": {"text": "Unused endpoint: POST /wolun"}, "properties": {"repobilityId": "3fd6331164b1684c", "scanner": "scanner-primary", "fingerprint": "28ab0e5dd60408b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-381a0426b82f7976", "level": "note", "message": {"text": "Unused endpoint: POST /ilun"}, "properties": {"repobilityId": "d08758ee48fc21f2", "scanner": "scanner-primary", "fingerprint": "381a0426b82f7976", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8542caa88db69d74", "level": "note", "message": {"text": "Unused endpoint: POST /compatibility"}, "properties": {"repobilityId": "a039690e476f2559", "scanner": "scanner-primary", "fingerprint": "8542caa88db69d74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c0b3f09311dc8fa6", "level": "note", "message": {"text": "Unused endpoint: POST /newyear"}, "properties": {"repobilityId": "e1a69ae50a543de0", "scanner": "scanner-primary", "fingerprint": "c0b3f09311dc8fa6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbf4cb6ac97db368", "level": "note", "message": {"text": "Unused endpoint: POST /share"}, "properties": {"repobilityId": "9ea45786bba1b0d1", "scanner": "scanner-primary", "fingerprint": "cbf4cb6ac97db368", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f189fff1cc6793e5", "level": "note", "message": {"text": "Unused endpoint: GET /share/{code}"}, "properties": {"repobilityId": "13d0a481bb5b5fa1", "scanner": "scanner-primary", "fingerprint": "f189fff1cc6793e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-882b97963f1f1356", "level": "note", "message": {"text": "Unused endpoint: POST /image-prompt"}, "properties": {"repobilityId": "5a4f7aecfee02e2a", "scanner": "scanner-primary", "fingerprint": "882b97963f1f1356", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fca11d494725d7c3", "level": "note", "message": {"text": "Unused endpoint: POST /analyze"}, "properties": {"repobilityId": "aaf8c25135781af7", "scanner": "scanner-primary", "fingerprint": "fca11d494725d7c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1647a6533f8d9bb3", "level": "note", "message": {"text": "Unused endpoint: POST /analyze/stream"}, "properties": {"repobilityId": "81c42cbf13b3b452", "scanner": "scanner-primary", "fingerprint": "1647a6533f8d9bb3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ef03a860c235fe9", "level": "note", "message": {"text": "Unused endpoint: GET /learn/curriculum"}, "properties": {"repobilityId": "0de0a4613b194650", "scanner": "scanner-primary", "fingerprint": "6ef03a860c235fe9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-163d85c7c472b24d", "level": "note", "message": {"text": "Unused endpoint: GET /learn/chapter/{chapter_id}"}, "properties": {"repobilityId": "5568cfad2a77caf1", "scanner": "scanner-primary", "fingerprint": "163d85c7c472b24d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6cf3b1ad1d9373af", "level": "note", "message": {"text": "Unused endpoint: GET /learn/quiz/{chapter_id}"}, "properties": {"repobilityId": "450a470c5d5994ec", "scanner": "scanner-primary", "fingerprint": "6cf3b1ad1d9373af", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-35d6c345d29b1598", "level": "note", "message": {"text": "Unused endpoint: POST /learn/quiz/personal"}, "properties": {"repobilityId": "664ac32e8fc6fdd0", "scanner": "scanner-primary", "fingerprint": "35d6c345d29b1598", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baca79d34d33689", "level": "note", "message": {"text": "Unused endpoint: GET /learn/placement"}, "properties": {"repobilityId": "4d82a53d3f8038a6", "scanner": "scanner-primary", "fingerprint": "5baca79d34d33689", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-28daae802fdd83d4", "level": "note", "message": {"text": "Unused endpoint: POST /learn/backup"}, "properties": {"repobilityId": "f4ca20deed70f962", "scanner": "scanner-primary", "fingerprint": "28daae802fdd83d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0ef2f60b608d26e", "level": "note", "message": {"text": "Unused endpoint: GET /learn/backup/{code}"}, "properties": {"repobilityId": "a13afe1fdfe61ab9", "scanner": "scanner-primary", "fingerprint": "e0ef2f60b608d26e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9c8c41b58d4a2259", "level": "note", "message": {"text": "Unused endpoint: POST /learn/grade"}, "properties": {"repobilityId": "7c2fd45cc0a5eb28", "scanner": "scanner-primary", "fingerprint": "9c8c41b58d4a2259", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad20af20e0d63809", "level": "note", "message": {"text": "Unused endpoint: POST /learn/tutor"}, "properties": {"repobilityId": "cd250e428729e326", "scanner": "scanner-primary", "fingerprint": "ad20af20e0d63809", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}