{"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-4a871b01e4a6976f", "name": "Possibly dead Python function: role_checker", "shortDescription": {"text": "Possibly dead Python function: role_checker"}, "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-cadfc869d80c3e3b", "name": "Possibly dead Python function: stop_polling", "shortDescription": {"text": "Possibly dead Python function: stop_polling"}, "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-24c16eac68f03559", "name": "Possibly dead Python function: is_cloudinary_enabled", "shortDescription": {"text": "Possibly dead Python function: is_cloudinary_enabled"}, "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-413b861394b29503", "name": "Possibly dead Python function: upload_image", "shortDescription": {"text": "Possibly dead Python function: upload_image"}, "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-af3fdae0464d04e1", "name": "Possibly dead Python function: create_scheduler", "shortDescription": {"text": "Possibly dead Python function: create_scheduler"}, "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-8d406765c9bf77b3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/assets/index-D-AQZojP.js:33", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/assets/index-D-AQZojP.js:33"}, "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-53a09a5837cad1b8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.jsx:314", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.jsx:314"}, "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-e9e17d604d722399", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OnDutyPage.jsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OnDutyPage.jsx:168"}, "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-9bf3cfdfa5e9eef3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/RequestsPage.jsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/RequestsPage.jsx:90"}, "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-90c028d4875e68a6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.jsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.jsx:165"}, "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-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: 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-3643c99338a4ff7a", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.9-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.9-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-225f4f8a97db07d1", "name": "Runtime dotenv file present in repo: .env.local", "shortDescription": {"text": "Runtime dotenv file present in repo: .env.local"}, "fullDescription": {"text": "`.env.local` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_SUPABASE_ANON_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-a6d96f1eb77a96c3", "name": "Possible secret in frontend/assets/index-D-AQZojP.js", "shortDescription": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "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-466dbb9fa009d5ea", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/assets/index-D-AQZojP.js:37", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/assets/index-D-AQZojP.js:37"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc94f6380082c96c", "name": "Insecure pattern 'local_storage_auth_token' in frontend/assets/index-D-AQZojP.js:243", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/assets/index-D-AQZojP.js:243"}, "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-fab127591a41f912", "name": "Insecure pattern 'cors_wildcard' in backend/main.py:155", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in backend/main.py:155"}, "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-87ca20c015558cd6", "name": "Possible secret in src/locales/en.js", "shortDescription": {"text": "Possible secret in src/locales/en.js"}, "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-ed0bbc1e7a69b6c9", "name": "Possible secret in src/locales/th.js", "shortDescription": {"text": "Possible secret in src/locales/th.js"}, "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-1b54c1452b195100", "name": "Insecure pattern 'local_storage_auth_token' in src/context/AuthContext.jsx:24", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/context/AuthContext.jsx:24"}, "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-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-88e52d3a5fea07fe", "name": "Very large file: src/components/common/JobDrawer.jsx (1282 lines)", "shortDescription": {"text": "Very large file: src/components/common/JobDrawer.jsx (1282 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-838044894621527d", "name": "Very large file: src/pages/RequestDetailPage.jsx (1306 lines)", "shortDescription": {"text": "Very large file: src/pages/RequestDetailPage.jsx (1306 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 48 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-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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 48 placeholder/mock markers across 7 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, 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests, operator-readme. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "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-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "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-befc3a99f841175a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/assets/index-D-AQZojP.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/assets/index-D-AQZojP.js:1"}, "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-250f57e8a1dbd3c5", "name": "4 env vars used in code but missing from .env.example", "shortDescription": {"text": "4 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `PORT`, `RAILWAY_ENVIRONMENT`, `VITE_SUPABASE_ANON_KEY`, `VITE_SUPABASE_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "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:\nbackend/routers/reports.py:get_summary, backend/routers/reports.py:get_technician_report, backend/routers/reports.py:get_staff_kpi\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-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/routers/jobs.py:complete_work, backend/routers/jobs.py:inspect_work\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-a63df97bca45aeb7", "name": "Unused endpoint: GET /api/db-info", "shortDescription": {"text": "Unused endpoint: GET /api/db-info"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/db-info` 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-0b7461e2f7a40232", "name": "Unused endpoint: GET /api/telegram-test", "shortDescription": {"text": "Unused endpoint: GET /api/telegram-test"}, "fullDescription": {"text": "`backend/main.py` declares `GET /api/telegram-test` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b1d5926fda286fa", "name": "Unused endpoint: GET /{full_path:path}", "shortDescription": {"text": "Unused endpoint: GET /{full_path:path}"}, "fullDescription": {"text": "`backend/main.py` declares `GET /{full_path:path}` 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-e1b7bee247ffc801", "name": "Unused endpoint: GET /summary", "shortDescription": {"text": "Unused endpoint: GET /summary"}, "fullDescription": {"text": "`backend/routers/reports.py` declares `GET /summary` 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-d682e1d215955e6a", "name": "Unused endpoint: GET /list", "shortDescription": {"text": "Unused endpoint: GET /list"}, "fullDescription": {"text": "`backend/routers/reports.py` declares `GET /list` 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-62e70d03a988b696", "name": "Unused endpoint: GET /technicians", "shortDescription": {"text": "Unused endpoint: GET /technicians"}, "fullDescription": {"text": "`backend/routers/reports.py` declares `GET /technicians` 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-ca3d58b028ffd644", "name": "Unused endpoint: GET /by-area", "shortDescription": {"text": "Unused endpoint: GET /by-area"}, "fullDescription": {"text": "`backend/routers/reports.py` declares `GET /by-area` 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-47c9d1cdbc4e2a90", "name": "Unused endpoint: GET /top-assets", "shortDescription": {"text": "Unused endpoint: GET /top-assets"}, "fullDescription": {"text": "`backend/routers/reports.py` declares `GET /top-assets` 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-e2cbab45329d0cd1", "name": "Unused endpoint: GET /staff-kpi", "shortDescription": {"text": "Unused endpoint: GET /staff-kpi"}, "fullDescription": {"text": "`backend/routers/reports.py` declares `GET /staff-kpi` 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/routers/onduty.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-a565329de9a05ae5", "name": "Unused endpoint: GET /month", "shortDescription": {"text": "Unused endpoint: GET /month"}, "fullDescription": {"text": "`backend/routers/onduty.py` declares `GET /month` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/routers/onduty.py` declares `POST /` 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-347228e334452f2b", "name": "Unused endpoint: DELETE /{record_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{record_id}"}, "fullDescription": {"text": "`backend/routers/onduty.py` declares `DELETE /{record_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-ce6d77d90f80b054", "name": "Unused endpoint: GET /me/today", "shortDescription": {"text": "Unused endpoint: GET /me/today"}, "fullDescription": {"text": "`backend/routers/onduty.py` declares `GET /me/today` 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-9513a6f8dad65fa9", "name": "Unused endpoint: PUT /{type_id}", "shortDescription": {"text": "Unused endpoint: PUT /{type_id}"}, "fullDescription": {"text": "`backend/routers/issue_types.py` declares `PUT /{type_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-97fcb34fd14cfda0", "name": "Unused endpoint: DELETE /{type_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{type_id}"}, "fullDescription": {"text": "`backend/routers/issue_types.py` declares `DELETE /{type_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-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-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/routers/auth.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-74821038394f75e0", "name": "Unused endpoint: GET /ooo-notify", "shortDescription": {"text": "Unused endpoint: GET /ooo-notify"}, "fullDescription": {"text": "`backend/routers/users.py` declares `GET /ooo-notify` 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-3cdc30f2b9308e3f", "name": "Unused endpoint: PUT /{user_id}", "shortDescription": {"text": "Unused endpoint: PUT /{user_id}"}, "fullDescription": {"text": "`backend/routers/users.py` declares `PUT /{user_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55c93ee7e031a509", "name": "Unused endpoint: DELETE /{user_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{user_id}"}, "fullDescription": {"text": "`backend/routers/users.py` declares `DELETE /{user_id}` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd8644ab589bff5d", "name": "Unused endpoint: GET /location-history", "shortDescription": {"text": "Unused endpoint: GET /location-history"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `GET /location-history` 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-be673e0aa1be827a", "name": "Unused endpoint: GET /{job_id}", "shortDescription": {"text": "Unused endpoint: GET /{job_id}"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `GET /{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-627c008b4a49c1a8", "name": "Unused endpoint: POST /{job_id}/images", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/images"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/images` 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-253d61e0a7bf22cf", "name": "Unused endpoint: POST /{job_id}/assign", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/assign"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/assign` 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-bc0c0e7146dd43db", "name": "Unused endpoint: POST /{job_id}/accept", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/accept"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/accept` 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-9868adc40367a4d7", "name": "Unused endpoint: POST /{job_id}/recall", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/recall"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/recall` 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-ed040155cae0591b", "name": "Unused endpoint: POST /{job_id}/self-assign", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/self-assign"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/self-assign` 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-9af17482e76e4f4a", "name": "Unused endpoint: POST /{job_id}/reject", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/reject"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_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-cd7400544a149ac1", "name": "Unused endpoint: POST /{job_id}/transfer", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/transfer"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/transfer` 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-fd0885da449b0f85", "name": "Unused endpoint: PUT /{job_id}/reassign", "shortDescription": {"text": "Unused endpoint: PUT /{job_id}/reassign"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `PUT /{job_id}/reassign` 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-68a0c7bb63b417bd", "name": "Unused endpoint: POST /{job_id}/co-assign", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/co-assign"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/co-assign` 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-8baa6ae2a2435c17", "name": "Unused endpoint: DELETE /{job_id}/co-assign/{co_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{job_id}/co-assign/{co_id}"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `DELETE /{job_id}/co-assign/{co_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-fc979135f0ba93b8", "name": "Unused endpoint: GET /completed-today", "shortDescription": {"text": "Unused endpoint: GET /completed-today"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `GET /completed-today` 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-db04ae17f95b4c24", "name": "Unused endpoint: PUT /{job_id}/complete", "shortDescription": {"text": "Unused endpoint: PUT /{job_id}/complete"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `PUT /{job_id}/complete` 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-974a6d26a374d3c1", "name": "Unused endpoint: POST /{job_id}/inspect", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/inspect"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/inspect` 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-02d37b35556eec4d", "name": "Unused endpoint: POST /{job_id}/inspect-images", "shortDescription": {"text": "Unused endpoint: POST /{job_id}/inspect-images"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `POST /{job_id}/inspect-images` 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-914de2cb5a2e3bb5", "name": "Unused endpoint: PUT /{job_id}/cancel", "shortDescription": {"text": "Unused endpoint: PUT /{job_id}/cancel"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `PUT /{job_id}/cancel` 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-ea1e329c557abe3b", "name": "Unused endpoint: PUT /{job_id}/edit", "shortDescription": {"text": "Unused endpoint: PUT /{job_id}/edit"}, "fullDescription": {"text": "`backend/routers/jobs.py` declares `PUT /{job_id}/edit` 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-3876754ac97ae852", "name": "Unused endpoint: PUT /{area_id}", "shortDescription": {"text": "Unused endpoint: PUT /{area_id}"}, "fullDescription": {"text": "`backend/routers/areas.py` declares `PUT /{area_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-0613854e904deaae", "name": "Unused endpoint: DELETE /{area_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{area_id}"}, "fullDescription": {"text": "`backend/routers/areas.py` declares `DELETE /{area_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-51062133f2008fdb", "name": "Unused endpoint: POST /sub", "shortDescription": {"text": "Unused endpoint: POST /sub"}, "fullDescription": {"text": "`backend/routers/areas.py` declares `POST /sub` 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-08213fa96b191eec", "name": "Unused endpoint: PUT /sub/{sub_id}", "shortDescription": {"text": "Unused endpoint: PUT /sub/{sub_id}"}, "fullDescription": {"text": "`backend/routers/areas.py` declares `PUT /sub/{sub_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-8d9ad2e7d4b47898", "name": "Unused endpoint: DELETE /sub/{sub_id}", "shortDescription": {"text": "Unused endpoint: DELETE /sub/{sub_id}"}, "fullDescription": {"text": "`backend/routers/areas.py` declares `DELETE /sub/{sub_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-53a8a10eadba140c", "name": "Unused endpoint: PUT /{dept_id}", "shortDescription": {"text": "Unused endpoint: PUT /{dept_id}"}, "fullDescription": {"text": "`backend/routers/departments.py` declares `PUT /{dept_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-aee1d5019b941571", "name": "Unused endpoint: DELETE /{dept_id}", "shortDescription": {"text": "Unused endpoint: DELETE /{dept_id}"}, "fullDescription": {"text": "`backend/routers/departments.py` declares `DELETE /{dept_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}}]}}, "automationDetails": {"id": "repobility/22455"}, "properties": {"repository": "vuregis-tech/hotel-maintenance", "repoUrl": "https://github.com/vuregis-tech/hotel-maintenance", "branch": "main"}, "results": [{"ruleId": "scanner-4a871b01e4a6976f", "level": "note", "message": {"text": "Possibly dead Python function: role_checker"}, "properties": {"repobilityId": "2d0aff3cb1828251", "scanner": "scanner-primary", "fingerprint": "4a871b01e4a6976f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/auth.py:91"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cadfc869d80c3e3b", "level": "note", "message": {"text": "Possibly dead Python function: stop_polling"}, "properties": {"repobilityId": "1015cd169fa939c3", "scanner": "scanner-primary", "fingerprint": "cadfc869d80c3e3b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/bot/bot.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-24c16eac68f03559", "level": "note", "message": {"text": "Possibly dead Python function: is_cloudinary_enabled"}, "properties": {"repobilityId": "904bddc3233f3d80", "scanner": "scanner-primary", "fingerprint": "24c16eac68f03559", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/storage.py:32"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-413b861394b29503", "level": "note", "message": {"text": "Possibly dead Python function: upload_image"}, "properties": {"repobilityId": "972846dc90bf4de0", "scanner": "scanner-primary", "fingerprint": "413b861394b29503", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/storage.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-af3fdae0464d04e1", "level": "note", "message": {"text": "Possibly dead Python function: create_scheduler"}, "properties": {"repobilityId": "2606ab9900ca48cd", "scanner": "scanner-primary", "fingerprint": "af3fdae0464d04e1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/services/scheduler.py:3"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8d406765c9bf77b3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/assets/index-D-AQZojP.js:33"}, "properties": {"repobilityId": "27befd13c89bdfac", "scanner": "scanner-primary", "fingerprint": "8d406765c9bf77b3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-53a09a5837cad1b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.jsx:314"}, "properties": {"repobilityId": "56327c7413bb2d42", "scanner": "scanner-primary", "fingerprint": "53a09a5837cad1b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9e17d604d722399", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/OnDutyPage.jsx:168"}, "properties": {"repobilityId": "153b78ba32d26954", "scanner": "scanner-primary", "fingerprint": "e9e17d604d722399", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9bf3cfdfa5e9eef3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/RequestsPage.jsx:90"}, "properties": {"repobilityId": "39f5330371cd52fd", "scanner": "scanner-primary", "fingerprint": "9bf3cfdfa5e9eef3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90c028d4875e68a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.jsx:165"}, "properties": {"repobilityId": "c1ec453865b8a459", "scanner": "scanner-primary", "fingerprint": "90c028d4875e68a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-3643c99338a4ff7a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.9-slim"}, "properties": {"repobilityId": "e8feb3947ea56dbc", "scanner": "scanner-primary", "fingerprint": "3643c99338a4ff7a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "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-225f4f8a97db07d1", "level": "error", "message": {"text": "Runtime dotenv file present in repo: .env.local"}, "properties": {"repobilityId": "a6b37d8a97ca199c", "scanner": "scanner-primary", "fingerprint": "225f4f8a97db07d1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".env.local"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-a6d96f1eb77a96c3", "level": "error", "message": {"text": "Possible secret in frontend/assets/index-D-AQZojP.js"}, "properties": {"repobilityId": "a545d8dcae932223", "scanner": "scanner-primary", "fingerprint": "a6d96f1eb77a96c3", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-466dbb9fa009d5ea", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/assets/index-D-AQZojP.js:37"}, "properties": {"repobilityId": "75ef1f16f61efdbf", "scanner": "scanner-primary", "fingerprint": "466dbb9fa009d5ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-dc94f6380082c96c", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend/assets/index-D-AQZojP.js:243"}, "properties": {"repobilityId": "8897d5b301d5c4f7", "scanner": "scanner-primary", "fingerprint": "dc94f6380082c96c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/assets/index-D-AQZojP.js"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-fab127591a41f912", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in backend/main.py:155"}, "properties": {"repobilityId": "68276992e65b84f9", "scanner": "scanner-primary", "fingerprint": "fab127591a41f912", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/main.py"}, "region": {"startLine": 155}}}]}, {"ruleId": "scanner-87ca20c015558cd6", "level": "error", "message": {"text": "Possible secret in src/locales/en.js"}, "properties": {"repobilityId": "7b6ee8d95f65187a", "scanner": "scanner-primary", "fingerprint": "87ca20c015558cd6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/en.js"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-87ca20c015558cd6", "level": "error", "message": {"text": "Possible secret in src/locales/en.js"}, "properties": {"repobilityId": "7b6ee8d95f65187a", "scanner": "scanner-primary", "fingerprint": "87ca20c015558cd6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/en.js"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-87ca20c015558cd6", "level": "error", "message": {"text": "Possible secret in src/locales/en.js"}, "properties": {"repobilityId": "7b6ee8d95f65187a", "scanner": "scanner-primary", "fingerprint": "87ca20c015558cd6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/en.js"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-87ca20c015558cd6", "level": "error", "message": {"text": "Possible secret in src/locales/en.js"}, "properties": {"repobilityId": "7b6ee8d95f65187a", "scanner": "scanner-primary", "fingerprint": "87ca20c015558cd6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/en.js"}, "region": {"startLine": 219}}}]}, {"ruleId": "scanner-ed0bbc1e7a69b6c9", "level": "error", "message": {"text": "Possible secret in src/locales/th.js"}, "properties": {"repobilityId": "8382d32e23463f2a", "scanner": "scanner-primary", "fingerprint": "ed0bbc1e7a69b6c9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/th.js"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-ed0bbc1e7a69b6c9", "level": "error", "message": {"text": "Possible secret in src/locales/th.js"}, "properties": {"repobilityId": "8382d32e23463f2a", "scanner": "scanner-primary", "fingerprint": "ed0bbc1e7a69b6c9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/th.js"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-ed0bbc1e7a69b6c9", "level": "error", "message": {"text": "Possible secret in src/locales/th.js"}, "properties": {"repobilityId": "8382d32e23463f2a", "scanner": "scanner-primary", "fingerprint": "ed0bbc1e7a69b6c9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/th.js"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-ed0bbc1e7a69b6c9", "level": "error", "message": {"text": "Possible secret in src/locales/th.js"}, "properties": {"repobilityId": "8382d32e23463f2a", "scanner": "scanner-primary", "fingerprint": "ed0bbc1e7a69b6c9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/locales/th.js"}, "region": {"startLine": 219}}}]}, {"ruleId": "scanner-1b54c1452b195100", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/context/AuthContext.jsx:24"}, "properties": {"repobilityId": "1913921a22a7e88f", "scanner": "scanner-primary", "fingerprint": "1b54c1452b195100", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/context/AuthContext.jsx"}, "region": {"startLine": 24}}}]}, {"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-88e52d3a5fea07fe", "level": "note", "message": {"text": "Very large file: src/components/common/JobDrawer.jsx (1282 lines)"}, "properties": {"repobilityId": "a207e687d7f8b3ab", "scanner": "scanner-primary", "fingerprint": "88e52d3a5fea07fe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-838044894621527d", "level": "note", "message": {"text": "Very large file: src/pages/RequestDetailPage.jsx (1306 lines)"}, "properties": {"repobilityId": "d21df3ca90aca9d8", "scanner": "scanner-primary", "fingerprint": "838044894621527d", "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": "6bf8a6da8e49d6ba", "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": "55e0c8022211e217", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "66a016aa812a2265", "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": "efc5553da5528d9a", "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": "5368cda56cc5837d", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "690004714b7aa248", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "97449db5102a52ac", "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": "7590c596a4b3139c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-befc3a99f841175a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/assets/index-D-AQZojP.js:1"}, "properties": {"repobilityId": "18d034ee79b922be", "scanner": "scanner-primary", "fingerprint": "befc3a99f841175a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-250f57e8a1dbd3c5", "level": "none", "message": {"text": "4 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "57584f22b735b5ee", "scanner": "scanner-primary", "fingerprint": "250f57e8a1dbd3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "e2d1a26a33e46881", "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": "91dfc88aade0df7f", "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": "d70dbc3de29cc1d9", "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": "4b1880fe27c0a74c", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-a63df97bca45aeb7", "level": "note", "message": {"text": "Unused endpoint: GET /api/db-info"}, "properties": {"repobilityId": "faaf7443c91370e3", "scanner": "scanner-primary", "fingerprint": "a63df97bca45aeb7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b7461e2f7a40232", "level": "note", "message": {"text": "Unused endpoint: GET /api/telegram-test"}, "properties": {"repobilityId": "9f50769b78a22790", "scanner": "scanner-primary", "fingerprint": "0b7461e2f7a40232", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b1d5926fda286fa", "level": "note", "message": {"text": "Unused endpoint: GET /{full_path:path}"}, "properties": {"repobilityId": "41531e7c59971d92", "scanner": "scanner-primary", "fingerprint": "1b1d5926fda286fa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e1b7bee247ffc801", "level": "note", "message": {"text": "Unused endpoint: GET /summary"}, "properties": {"repobilityId": "9ce1fc7d76650303", "scanner": "scanner-primary", "fingerprint": "e1b7bee247ffc801", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d682e1d215955e6a", "level": "note", "message": {"text": "Unused endpoint: GET /list"}, "properties": {"repobilityId": "d5b42006f4dabd25", "scanner": "scanner-primary", "fingerprint": "d682e1d215955e6a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-62e70d03a988b696", "level": "note", "message": {"text": "Unused endpoint: GET /technicians"}, "properties": {"repobilityId": "b844b3642429d745", "scanner": "scanner-primary", "fingerprint": "62e70d03a988b696", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca3d58b028ffd644", "level": "note", "message": {"text": "Unused endpoint: GET /by-area"}, "properties": {"repobilityId": "887ddad54b42d26f", "scanner": "scanner-primary", "fingerprint": "ca3d58b028ffd644", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47c9d1cdbc4e2a90", "level": "note", "message": {"text": "Unused endpoint: GET /top-assets"}, "properties": {"repobilityId": "2beaddcbeb104f0b", "scanner": "scanner-primary", "fingerprint": "47c9d1cdbc4e2a90", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2cbab45329d0cd1", "level": "note", "message": {"text": "Unused endpoint: GET /staff-kpi"}, "properties": {"repobilityId": "af2260b46deceb98", "scanner": "scanner-primary", "fingerprint": "e2cbab45329d0cd1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "15995cdbce760fb3", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a565329de9a05ae5", "level": "note", "message": {"text": "Unused endpoint: GET /month"}, "properties": {"repobilityId": "a73aa83442d7887e", "scanner": "scanner-primary", "fingerprint": "a565329de9a05ae5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "129193d556e0d49d", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-347228e334452f2b", "level": "note", "message": {"text": "Unused endpoint: DELETE /{record_id}"}, "properties": {"repobilityId": "ba85d8e1d0b4b68f", "scanner": "scanner-primary", "fingerprint": "347228e334452f2b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce6d77d90f80b054", "level": "note", "message": {"text": "Unused endpoint: GET /me/today"}, "properties": {"repobilityId": "d14a59b568967976", "scanner": "scanner-primary", "fingerprint": "ce6d77d90f80b054", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9513a6f8dad65fa9", "level": "note", "message": {"text": "Unused endpoint: PUT /{type_id}"}, "properties": {"repobilityId": "fd6b2854c67f039e", "scanner": "scanner-primary", "fingerprint": "9513a6f8dad65fa9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-97fcb34fd14cfda0", "level": "note", "message": {"text": "Unused endpoint: DELETE /{type_id}"}, "properties": {"repobilityId": "a1f895425bf4b333", "scanner": "scanner-primary", "fingerprint": "97fcb34fd14cfda0", "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-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "a8a117bad6a0142e", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74821038394f75e0", "level": "note", "message": {"text": "Unused endpoint: GET /ooo-notify"}, "properties": {"repobilityId": "8863ca3f8186c384", "scanner": "scanner-primary", "fingerprint": "74821038394f75e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3cdc30f2b9308e3f", "level": "note", "message": {"text": "Unused endpoint: PUT /{user_id}"}, "properties": {"repobilityId": "a6e746f9fad18eb5", "scanner": "scanner-primary", "fingerprint": "3cdc30f2b9308e3f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55c93ee7e031a509", "level": "note", "message": {"text": "Unused endpoint: DELETE /{user_id}"}, "properties": {"repobilityId": "f5772b28ec33c687", "scanner": "scanner-primary", "fingerprint": "55c93ee7e031a509", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd8644ab589bff5d", "level": "note", "message": {"text": "Unused endpoint: GET /location-history"}, "properties": {"repobilityId": "3ab9f20fefd6cc73", "scanner": "scanner-primary", "fingerprint": "fd8644ab589bff5d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-be673e0aa1be827a", "level": "note", "message": {"text": "Unused endpoint: GET /{job_id}"}, "properties": {"repobilityId": "2ea1b9cdccff7f0a", "scanner": "scanner-primary", "fingerprint": "be673e0aa1be827a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-627c008b4a49c1a8", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/images"}, "properties": {"repobilityId": "692d283fcd84aab6", "scanner": "scanner-primary", "fingerprint": "627c008b4a49c1a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-253d61e0a7bf22cf", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/assign"}, "properties": {"repobilityId": "4f5ccd98635d0957", "scanner": "scanner-primary", "fingerprint": "253d61e0a7bf22cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc0c0e7146dd43db", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/accept"}, "properties": {"repobilityId": "a216889a05fe4916", "scanner": "scanner-primary", "fingerprint": "bc0c0e7146dd43db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9868adc40367a4d7", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/recall"}, "properties": {"repobilityId": "7524f06f53d3eb42", "scanner": "scanner-primary", "fingerprint": "9868adc40367a4d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed040155cae0591b", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/self-assign"}, "properties": {"repobilityId": "3808d595579f34a2", "scanner": "scanner-primary", "fingerprint": "ed040155cae0591b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9af17482e76e4f4a", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/reject"}, "properties": {"repobilityId": "7ce84a5ed0bc3706", "scanner": "scanner-primary", "fingerprint": "9af17482e76e4f4a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd7400544a149ac1", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/transfer"}, "properties": {"repobilityId": "3ac01da9c4672991", "scanner": "scanner-primary", "fingerprint": "cd7400544a149ac1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd0885da449b0f85", "level": "note", "message": {"text": "Unused endpoint: PUT /{job_id}/reassign"}, "properties": {"repobilityId": "55ea81d33fbdf9ce", "scanner": "scanner-primary", "fingerprint": "fd0885da449b0f85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68a0c7bb63b417bd", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/co-assign"}, "properties": {"repobilityId": "6e0a031bf6b674c7", "scanner": "scanner-primary", "fingerprint": "68a0c7bb63b417bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8baa6ae2a2435c17", "level": "note", "message": {"text": "Unused endpoint: DELETE /{job_id}/co-assign/{co_id}"}, "properties": {"repobilityId": "9ffb9bbdc348969d", "scanner": "scanner-primary", "fingerprint": "8baa6ae2a2435c17", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc979135f0ba93b8", "level": "note", "message": {"text": "Unused endpoint: GET /completed-today"}, "properties": {"repobilityId": "20f19ddd3027dea6", "scanner": "scanner-primary", "fingerprint": "fc979135f0ba93b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-db04ae17f95b4c24", "level": "note", "message": {"text": "Unused endpoint: PUT /{job_id}/complete"}, "properties": {"repobilityId": "ee72b51688390878", "scanner": "scanner-primary", "fingerprint": "db04ae17f95b4c24", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-974a6d26a374d3c1", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/inspect"}, "properties": {"repobilityId": "e193d38d6b8b138c", "scanner": "scanner-primary", "fingerprint": "974a6d26a374d3c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02d37b35556eec4d", "level": "note", "message": {"text": "Unused endpoint: POST /{job_id}/inspect-images"}, "properties": {"repobilityId": "25b7b20c7cd54f01", "scanner": "scanner-primary", "fingerprint": "02d37b35556eec4d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-914de2cb5a2e3bb5", "level": "note", "message": {"text": "Unused endpoint: PUT /{job_id}/cancel"}, "properties": {"repobilityId": "547e54f3452d4dc7", "scanner": "scanner-primary", "fingerprint": "914de2cb5a2e3bb5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea1e329c557abe3b", "level": "note", "message": {"text": "Unused endpoint: PUT /{job_id}/edit"}, "properties": {"repobilityId": "55a71720339a302a", "scanner": "scanner-primary", "fingerprint": "ea1e329c557abe3b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3876754ac97ae852", "level": "note", "message": {"text": "Unused endpoint: PUT /{area_id}"}, "properties": {"repobilityId": "0a789afca2a80f9b", "scanner": "scanner-primary", "fingerprint": "3876754ac97ae852", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0613854e904deaae", "level": "note", "message": {"text": "Unused endpoint: DELETE /{area_id}"}, "properties": {"repobilityId": "cf5069d8bc944d04", "scanner": "scanner-primary", "fingerprint": "0613854e904deaae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51062133f2008fdb", "level": "note", "message": {"text": "Unused endpoint: POST /sub"}, "properties": {"repobilityId": "c2f4068675a1f8a1", "scanner": "scanner-primary", "fingerprint": "51062133f2008fdb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-08213fa96b191eec", "level": "note", "message": {"text": "Unused endpoint: PUT /sub/{sub_id}"}, "properties": {"repobilityId": "4c325ff45eb6758c", "scanner": "scanner-primary", "fingerprint": "08213fa96b191eec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d9ad2e7d4b47898", "level": "note", "message": {"text": "Unused endpoint: DELETE /sub/{sub_id}"}, "properties": {"repobilityId": "8198579f82f43a43", "scanner": "scanner-primary", "fingerprint": "8d9ad2e7d4b47898", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53a8a10eadba140c", "level": "note", "message": {"text": "Unused endpoint: PUT /{dept_id}"}, "properties": {"repobilityId": "5f75e5f292101786", "scanner": "scanner-primary", "fingerprint": "53a8a10eadba140c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aee1d5019b941571", "level": "note", "message": {"text": "Unused endpoint: DELETE /{dept_id}"}, "properties": {"repobilityId": "7537f497c573deb1", "scanner": "scanner-primary", "fingerprint": "aee1d5019b941571", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}