{"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-ee0b0f23d38fce93", "name": "Stray `console.log` in TS/JS \u2014 backend/app.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/app.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83c076fa7255d68c", "name": "Insecure pattern 'cors_wildcard' in backend/app.js:11", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in backend/app.js:11"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 55 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-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "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 5 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-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-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-e30baf8fed8d399e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:28"}, "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-648a65c42f4556ac", "name": "Frontend route `/nav/:navId/*` has no Link/navigate to it \u2014 frontend/src/App.jsx", "shortDescription": {"text": "Frontend route `/nav/:navId/*` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-999e2ebf66c7d353", "name": "Dangling fetch: POST /api/auth/send-code (frontend/src/api.js:44)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/send-code (frontend/src/api.js:44)"}, "fullDescription": {"text": "`frontend/src/api.js:44` calls `POST /api/auth/send-code` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/send-code`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5e25d0dbc04e195a", "name": "Dangling fetch: POST /api/auth/register (frontend/src/api.js:51)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/register (frontend/src/api.js:51)"}, "fullDescription": {"text": "`frontend/src/api.js:51` calls `POST /api/auth/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/register`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94f6c997cf108721", "name": "Dangling fetch: POST /api/auth/login (frontend/src/api.js:58)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (frontend/src/api.js:58)"}, "fullDescription": {"text": "`frontend/src/api.js:58` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bde8614d1891ba96", "name": "Dangling fetch: POST /api/auth/reset-password (frontend/src/api.js:65)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/reset-password (frontend/src/api.js:65)"}, "fullDescription": {"text": "`frontend/src/api.js:65` calls `POST /api/auth/reset-password` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/reset-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-23537574bb166fe2", "name": "Dangling fetch: GET /api/auth/me (frontend/src/api.js:72)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/me (frontend/src/api.js:72)"}, "fullDescription": {"text": "`frontend/src/api.js:72` calls `GET /api/auth/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b12b86116d5c1ca2", "name": "Dangling fetch: PUT /api/auth/profile (frontend/src/api.js:76)", "shortDescription": {"text": "Dangling fetch: PUT /api/auth/profile (frontend/src/api.js:76)"}, "fullDescription": {"text": "`frontend/src/api.js:76` calls `PUT /api/auth/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/profile`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04d13e05020f1f13", "name": "Dangling fetch: GET /api/nav-items (frontend/src/api.js:86)", "shortDescription": {"text": "Dangling fetch: GET /api/nav-items (frontend/src/api.js:86)"}, "fullDescription": {"text": "`frontend/src/api.js:86` calls `GET /api/nav-items` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-items`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-adf48d9b994d9c6c", "name": "Dangling fetch: POST /api/nav-items (frontend/src/api.js:90)", "shortDescription": {"text": "Dangling fetch: POST /api/nav-items (frontend/src/api.js:90)"}, "fullDescription": {"text": "`frontend/src/api.js:90` calls `POST /api/nav-items` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-items`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c19ef9e1dc9253ac", "name": "Dangling fetch: DELETE /api/nav-items/${id} (frontend/src/api.js:97)", "shortDescription": {"text": "Dangling fetch: DELETE /api/nav-items/${id} (frontend/src/api.js:97)"}, "fullDescription": {"text": "`frontend/src/api.js:97` calls `DELETE /api/nav-items/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-items/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-100d3966a9a3e032", "name": "Dangling fetch: PUT /api/nav-items/${id} (frontend/src/api.js:103)", "shortDescription": {"text": "Dangling fetch: PUT /api/nav-items/${id} (frontend/src/api.js:103)"}, "fullDescription": {"text": "`frontend/src/api.js:103` calls `PUT /api/nav-items/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-items/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a11c662b54fdc7cb", "name": "Dangling fetch: PUT /api/nav-items/reorder (frontend/src/api.js:110)", "shortDescription": {"text": "Dangling fetch: PUT /api/nav-items/reorder (frontend/src/api.js:110)"}, "fullDescription": {"text": "`frontend/src/api.js:110` calls `PUT /api/nav-items/reorder` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-items/reorder`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2ac530c7aa32f5dd", "name": "Dangling fetch: POST /api/upload/image (frontend/src/api.js:122)", "shortDescription": {"text": "Dangling fetch: POST /api/upload/image (frontend/src/api.js:122)"}, "fullDescription": {"text": "`frontend/src/api.js:122` calls `POST /api/upload/image` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/upload/image`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2762862ac01464d0", "name": "Dangling fetch: GET /api/admin/members (frontend/src/api.js:132)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/members (frontend/src/api.js:132)"}, "fullDescription": {"text": "`frontend/src/api.js:132` calls `GET /api/admin/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/members`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d5387ff64e2e6791", "name": "Dangling fetch: GET /api/admin/members/${id} (frontend/src/api.js:135)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/members/${id} (frontend/src/api.js:135)"}, "fullDescription": {"text": "`frontend/src/api.js:135` calls `GET /api/admin/members/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/members/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e9555661ad30801", "name": "Dangling fetch: PUT /api/admin/members/${id} (frontend/src/api.js:138)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/members/${id} (frontend/src/api.js:138)"}, "fullDescription": {"text": "`frontend/src/api.js:138` calls `PUT /api/admin/members/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/members/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8de388abccf8d243", "name": "Dangling fetch: DELETE /api/admin/members/${id} (frontend/src/api.js:144)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/members/${id} (frontend/src/api.js:144)"}, "fullDescription": {"text": "`frontend/src/api.js:144` calls `DELETE /api/admin/members/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/members/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f95bee5383815e2d", "name": "Dangling fetch: GET /api/admin/groups (frontend/src/api.js:147)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/groups (frontend/src/api.js:147)"}, "fullDescription": {"text": "`frontend/src/api.js:147` calls `GET /api/admin/groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4a89860f9f75b144", "name": "Dangling fetch: POST /api/admin/groups (frontend/src/api.js:150)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/groups (frontend/src/api.js:150)"}, "fullDescription": {"text": "`frontend/src/api.js:150` calls `POST /api/admin/groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-450a0386e4f700ea", "name": "Dangling fetch: PUT /api/admin/groups/${id} (frontend/src/api.js:156)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/groups/${id} (frontend/src/api.js:156)"}, "fullDescription": {"text": "`frontend/src/api.js:156` calls `PUT /api/admin/groups/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/groups/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-278796fe2bab7114", "name": "Dangling fetch: DELETE /api/admin/groups/${id} (frontend/src/api.js:162)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/groups/${id} (frontend/src/api.js:162)"}, "fullDescription": {"text": "`frontend/src/api.js:162` calls `DELETE /api/admin/groups/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/groups/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a5b19706f9198809", "name": "Dangling fetch: GET /api/admin/users/${userId}/groups (frontend/src/api.js:165)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users/${userId}/groups (frontend/src/api.js:165)"}, "fullDescription": {"text": "`frontend/src/api.js:165` calls `GET /api/admin/users/${userId}/groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users/<p>/groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bd26ce2a55bfa6bc", "name": "Dangling fetch: PUT /api/admin/users/${userId}/groups (frontend/src/api.js:168)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/users/${userId}/groups (frontend/src/api.js:168)"}, "fullDescription": {"text": "`frontend/src/api.js:168` calls `PUT /api/admin/users/${userId}/groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/admin/users/<p>/groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cfd5f715b90a64bd", "name": "Dangling fetch: GET /api/settings/theme (frontend/src/api.js:178)", "shortDescription": {"text": "Dangling fetch: GET /api/settings/theme (frontend/src/api.js:178)"}, "fullDescription": {"text": "`frontend/src/api.js:178` calls `GET /api/settings/theme` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/settings/theme`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-257c381d658ed415", "name": "Dangling fetch: PUT /api/settings/theme (frontend/src/api.js:181)", "shortDescription": {"text": "Dangling fetch: PUT /api/settings/theme (frontend/src/api.js:181)"}, "fullDescription": {"text": "`frontend/src/api.js:181` calls `PUT /api/settings/theme` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/settings/theme`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d9327dae3e2c5721", "name": "Dangling fetch: GET /api/nav-groups (frontend/src/api.js:190)", "shortDescription": {"text": "Dangling fetch: GET /api/nav-groups (frontend/src/api.js:190)"}, "fullDescription": {"text": "`frontend/src/api.js:190` calls `GET /api/nav-groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ba3acd63d2741654", "name": "Dangling fetch: POST /api/nav-groups (frontend/src/api.js:191)", "shortDescription": {"text": "Dangling fetch: POST /api/nav-groups (frontend/src/api.js:191)"}, "fullDescription": {"text": "`frontend/src/api.js:191` calls `POST /api/nav-groups` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-groups`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-93b3edd8c9576e3b", "name": "Dangling fetch: PUT /api/nav-groups/${id} (frontend/src/api.js:192)", "shortDescription": {"text": "Dangling fetch: PUT /api/nav-groups/${id} (frontend/src/api.js:192)"}, "fullDescription": {"text": "`frontend/src/api.js:192` calls `PUT /api/nav-groups/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-groups/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b08d0680818a165", "name": "Dangling fetch: DELETE /api/nav-groups/${id} (frontend/src/api.js:193)", "shortDescription": {"text": "Dangling fetch: DELETE /api/nav-groups/${id} (frontend/src/api.js:193)"}, "fullDescription": {"text": "`frontend/src/api.js:193` calls `DELETE /api/nav-groups/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-groups/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8432c07b26f4fdea", "name": "Dangling fetch: PUT /api/nav-groups/reorder (frontend/src/api.js:194)", "shortDescription": {"text": "Dangling fetch: PUT /api/nav-groups/reorder (frontend/src/api.js:194)"}, "fullDescription": {"text": "`frontend/src/api.js:194` calls `PUT /api/nav-groups/reorder` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-groups/reorder`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-00eca3bcd7b64fa7", "name": "Dangling fetch: PUT /api/nav-items/${itemId}/group (frontend/src/api.js:195)", "shortDescription": {"text": "Dangling fetch: PUT /api/nav-items/${itemId}/group (frontend/src/api.js:195)"}, "fullDescription": {"text": "`frontend/src/api.js:195` calls `PUT /api/nav-items/${itemId}/group` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/nav-items/<p>/group`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4006f18ec4db10cf", "name": "Unused endpoint: USE /images", "shortDescription": {"text": "Unused endpoint: USE /images"}, "fullDescription": {"text": "`backend/app.js` declares `USE /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-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/auth` 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-60b6c44e879db57b", "name": "Unused endpoint: USE /api/nav-items", "shortDescription": {"text": "Unused endpoint: USE /api/nav-items"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/nav-items` 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-6f643fbf10ab5803", "name": "Unused endpoint: USE /api/upload", "shortDescription": {"text": "Unused endpoint: USE /api/upload"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/upload` 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-8ca4664c9cda1cd6", "name": "Unused endpoint: USE /api/settings", "shortDescription": {"text": "Unused endpoint: USE /api/settings"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/settings` 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-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49b24a943513cdf1", "name": "Unused endpoint: USE /api/download", "shortDescription": {"text": "Unused endpoint: USE /api/download"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/download` 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-32b973867a594e13", "name": "Unused endpoint: USE /api/nav-groups", "shortDescription": {"text": "Unused endpoint: USE /api/nav-groups"}, "fullDescription": {"text": "`backend/app.js` declares `USE /api/nav-groups` 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/routes/navItem.js` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`backend/routes/navItem.js` 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-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`backend/routes/navItem.js` declares `DELETE /: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-365510c67c130be0", "name": "Unused endpoint: PUT /reorder", "shortDescription": {"text": "Unused endpoint: PUT /reorder"}, "fullDescription": {"text": "`backend/routes/navItem.js` declares `PUT /reorder` 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-8d5b2b188d08ca82", "name": "Unused endpoint: PUT /:id", "shortDescription": {"text": "Unused endpoint: PUT /:id"}, "fullDescription": {"text": "`backend/routes/navItem.js` declares `PUT /: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-13a7aad6b4c49210", "name": "Unused endpoint: PUT /:id/group", "shortDescription": {"text": "Unused endpoint: PUT /:id/group"}, "fullDescription": {"text": "`backend/routes/navItem.js` declares `PUT /:id/group` 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-1b5c4ab81a27a260", "name": "Unused endpoint: GET /theme", "shortDescription": {"text": "Unused endpoint: GET /theme"}, "fullDescription": {"text": "`backend/routes/siteSetting.js` declares `GET /theme` 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-c4c08ab8672faa4f", "name": "Unused endpoint: PUT /theme", "shortDescription": {"text": "Unused endpoint: PUT /theme"}, "fullDescription": {"text": "`backend/routes/siteSetting.js` declares `PUT /theme` 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-3e8a0a7b406443bc", "name": "Unused endpoint: GET /members", "shortDescription": {"text": "Unused endpoint: GET /members"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /members` 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-d7ea8c744ffc1ac3", "name": "Unused endpoint: GET /members/:id", "shortDescription": {"text": "Unused endpoint: GET /members/:id"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /members/: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-48dc184a50d8461b", "name": "Unused endpoint: PUT /members/:id", "shortDescription": {"text": "Unused endpoint: PUT /members/:id"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `PUT /members/: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-fa8097acf61363a6", "name": "Unused endpoint: DELETE /members/:id", "shortDescription": {"text": "Unused endpoint: DELETE /members/:id"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `DELETE /members/: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-e3e7e5fea4199d0c", "name": "Unused endpoint: GET /groups", "shortDescription": {"text": "Unused endpoint: GET /groups"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /groups` 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-3dfaaa08dd3fb680", "name": "Unused endpoint: POST /groups", "shortDescription": {"text": "Unused endpoint: POST /groups"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `POST /groups` 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-087cb9538004e96d", "name": "Unused endpoint: PUT /groups/:id", "shortDescription": {"text": "Unused endpoint: PUT /groups/:id"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `PUT /groups/: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-3d1feb620ea32b3f", "name": "Unused endpoint: DELETE /groups/:id", "shortDescription": {"text": "Unused endpoint: DELETE /groups/:id"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `DELETE /groups/: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-cf100a1d52393d18", "name": "Unused endpoint: GET /users/:userId/groups", "shortDescription": {"text": "Unused endpoint: GET /users/:userId/groups"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `GET /users/:userId/groups` 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-46c7e23356ac7cef", "name": "Unused endpoint: PUT /users/:userId/groups", "shortDescription": {"text": "Unused endpoint: PUT /users/:userId/groups"}, "fullDescription": {"text": "`backend/routes/admin.js` declares `PUT /users/:userId/groups` 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-cb8cdd3f4d307d6c", "name": "Unused endpoint: POST /send-code", "shortDescription": {"text": "Unused endpoint: POST /send-code"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `POST /send-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-304b6f2b403d93f7", "name": "Unused endpoint: POST /register", "shortDescription": {"text": "Unused endpoint: POST /register"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `POST /register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/routes/auth.js` 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-68a5d356c0cac9e3", "name": "Unused endpoint: POST /reset-password", "shortDescription": {"text": "Unused endpoint: POST /reset-password"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `POST /reset-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dc91abf32142d", "name": "Unused endpoint: GET /me", "shortDescription": {"text": "Unused endpoint: GET /me"}, "fullDescription": {"text": "`backend/routes/auth.js` 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-911492554a68d0c1", "name": "Unused endpoint: PUT /profile", "shortDescription": {"text": "Unused endpoint: PUT /profile"}, "fullDescription": {"text": "`backend/routes/auth.js` declares `PUT /profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b2b1a88ba946959", "name": "Unused endpoint: GET /latest-apk", "shortDescription": {"text": "Unused endpoint: GET /latest-apk"}, "fullDescription": {"text": "`backend/routes/download.js` declares `GET /latest-apk` 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-5494c43bc167deb0", "name": "Unused endpoint: GET /latest-ipa", "shortDescription": {"text": "Unused endpoint: GET /latest-ipa"}, "fullDescription": {"text": "`backend/routes/download.js` declares `GET /latest-ipa` 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-c86d1ea9990a3ffe", "name": "Unused endpoint: POST /image", "shortDescription": {"text": "Unused endpoint: POST /image"}, "fullDescription": {"text": "`backend/routes/upload.js` declares `POST /image` 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/21109"}, "properties": {"repository": "theisness/lotus-navigation", "repoUrl": "https://github.com/theisness/lotus-navigation", "branch": "main"}, "results": [{"ruleId": "scanner-ee0b0f23d38fce93", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/app.js:19"}, "properties": {"repobilityId": "601108128008caa0", "scanner": "scanner-primary", "fingerprint": "ee0b0f23d38fce93", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83c076fa7255d68c", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in backend/app.js:11"}, "properties": {"repobilityId": "429f9a9c6cbcb09b", "scanner": "scanner-primary", "fingerprint": "83c076fa7255d68c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/app.js"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "2d6f6bef2edbda52", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "f3b4d880c8f1bd69", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "690e6a59f70a2857", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "3685866e8000218b", "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": "d0c167270de3641e", "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": "9ca8d92add74172a", "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": "b4cb061c8fd0823d", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e30baf8fed8d399e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api.js:28"}, "properties": {"repobilityId": "832070bd5d413fd3", "scanner": "scanner-primary", "fingerprint": "e30baf8fed8d399e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-648a65c42f4556ac", "level": "warning", "message": {"text": "Frontend route `/nav/:navId/*` has no Link/navigate to it \u2014 frontend/src/App.jsx"}, "properties": {"repobilityId": "89a252a99e692a20", "scanner": "scanner-primary", "fingerprint": "648a65c42f4556ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-999e2ebf66c7d353", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/send-code (frontend/src/api.js:44)"}, "properties": {"repobilityId": "358a1fd5f4de71b1", "scanner": "scanner-primary", "fingerprint": "999e2ebf66c7d353", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-5e25d0dbc04e195a", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/register (frontend/src/api.js:51)"}, "properties": {"repobilityId": "952d03a92663fabd", "scanner": "scanner-primary", "fingerprint": "5e25d0dbc04e195a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-94f6c997cf108721", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (frontend/src/api.js:58)"}, "properties": {"repobilityId": "d02bd50e7555baae", "scanner": "scanner-primary", "fingerprint": "94f6c997cf108721", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bde8614d1891ba96", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/reset-password (frontend/src/api.js:65)"}, "properties": {"repobilityId": "40ac110bf4eb4230", "scanner": "scanner-primary", "fingerprint": "bde8614d1891ba96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-23537574bb166fe2", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/me (frontend/src/api.js:72)"}, "properties": {"repobilityId": "e1f11f11eee74ab2", "scanner": "scanner-primary", "fingerprint": "23537574bb166fe2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b12b86116d5c1ca2", "level": "error", "message": {"text": "Dangling fetch: PUT /api/auth/profile (frontend/src/api.js:76)"}, "properties": {"repobilityId": "c429b72be6274f91", "scanner": "scanner-primary", "fingerprint": "b12b86116d5c1ca2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-04d13e05020f1f13", "level": "error", "message": {"text": "Dangling fetch: GET /api/nav-items (frontend/src/api.js:86)"}, "properties": {"repobilityId": "5d713b1bff82d8f9", "scanner": "scanner-primary", "fingerprint": "04d13e05020f1f13", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-adf48d9b994d9c6c", "level": "error", "message": {"text": "Dangling fetch: POST /api/nav-items (frontend/src/api.js:90)"}, "properties": {"repobilityId": "670a8549d9f794c8", "scanner": "scanner-primary", "fingerprint": "adf48d9b994d9c6c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c19ef9e1dc9253ac", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/nav-items/${id} (frontend/src/api.js:97)"}, "properties": {"repobilityId": "bd6e18a05baeac42", "scanner": "scanner-primary", "fingerprint": "c19ef9e1dc9253ac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-100d3966a9a3e032", "level": "error", "message": {"text": "Dangling fetch: PUT /api/nav-items/${id} (frontend/src/api.js:103)"}, "properties": {"repobilityId": "68a94e2103398661", "scanner": "scanner-primary", "fingerprint": "100d3966a9a3e032", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a11c662b54fdc7cb", "level": "error", "message": {"text": "Dangling fetch: PUT /api/nav-items/reorder (frontend/src/api.js:110)"}, "properties": {"repobilityId": "f5049425282d36c7", "scanner": "scanner-primary", "fingerprint": "a11c662b54fdc7cb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2ac530c7aa32f5dd", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload/image (frontend/src/api.js:122)"}, "properties": {"repobilityId": "9b8b36b836d45541", "scanner": "scanner-primary", "fingerprint": "2ac530c7aa32f5dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2762862ac01464d0", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/members (frontend/src/api.js:132)"}, "properties": {"repobilityId": "2cb5ea2985deb4f4", "scanner": "scanner-primary", "fingerprint": "2762862ac01464d0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d5387ff64e2e6791", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/members/${id} (frontend/src/api.js:135)"}, "properties": {"repobilityId": "6932afbff144a1c8", "scanner": "scanner-primary", "fingerprint": "d5387ff64e2e6791", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2e9555661ad30801", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/members/${id} (frontend/src/api.js:138)"}, "properties": {"repobilityId": "363e7d1240c2fa20", "scanner": "scanner-primary", "fingerprint": "2e9555661ad30801", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8de388abccf8d243", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/members/${id} (frontend/src/api.js:144)"}, "properties": {"repobilityId": "483758fafcf9f6ab", "scanner": "scanner-primary", "fingerprint": "8de388abccf8d243", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-f95bee5383815e2d", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/groups (frontend/src/api.js:147)"}, "properties": {"repobilityId": "8802101af8ba0368", "scanner": "scanner-primary", "fingerprint": "f95bee5383815e2d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4a89860f9f75b144", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/groups (frontend/src/api.js:150)"}, "properties": {"repobilityId": "8eb9b233dfb6126f", "scanner": "scanner-primary", "fingerprint": "4a89860f9f75b144", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-450a0386e4f700ea", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/groups/${id} (frontend/src/api.js:156)"}, "properties": {"repobilityId": "ad1ca1a2f6189034", "scanner": "scanner-primary", "fingerprint": "450a0386e4f700ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-278796fe2bab7114", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/groups/${id} (frontend/src/api.js:162)"}, "properties": {"repobilityId": "2e7f7934d6339ed5", "scanner": "scanner-primary", "fingerprint": "278796fe2bab7114", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a5b19706f9198809", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users/${userId}/groups (frontend/src/api.js:165)"}, "properties": {"repobilityId": "f383e5aa6aca22a6", "scanner": "scanner-primary", "fingerprint": "a5b19706f9198809", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-bd26ce2a55bfa6bc", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/users/${userId}/groups (frontend/src/api.js:168)"}, "properties": {"repobilityId": "61367cac9bfbaa9b", "scanner": "scanner-primary", "fingerprint": "bd26ce2a55bfa6bc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-cfd5f715b90a64bd", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings/theme (frontend/src/api.js:178)"}, "properties": {"repobilityId": "1e46bed125a4e865", "scanner": "scanner-primary", "fingerprint": "cfd5f715b90a64bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-257c381d658ed415", "level": "error", "message": {"text": "Dangling fetch: PUT /api/settings/theme (frontend/src/api.js:181)"}, "properties": {"repobilityId": "db3b99501b947c65", "scanner": "scanner-primary", "fingerprint": "257c381d658ed415", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d9327dae3e2c5721", "level": "error", "message": {"text": "Dangling fetch: GET /api/nav-groups (frontend/src/api.js:190)"}, "properties": {"repobilityId": "d397bca2cc5b1ddf", "scanner": "scanner-primary", "fingerprint": "d9327dae3e2c5721", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-ba3acd63d2741654", "level": "error", "message": {"text": "Dangling fetch: POST /api/nav-groups (frontend/src/api.js:191)"}, "properties": {"repobilityId": "e0d2c3fafbdbf4cb", "scanner": "scanner-primary", "fingerprint": "ba3acd63d2741654", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-93b3edd8c9576e3b", "level": "error", "message": {"text": "Dangling fetch: PUT /api/nav-groups/${id} (frontend/src/api.js:192)"}, "properties": {"repobilityId": "0e1e0b9daa287361", "scanner": "scanner-primary", "fingerprint": "93b3edd8c9576e3b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-9b08d0680818a165", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/nav-groups/${id} (frontend/src/api.js:193)"}, "properties": {"repobilityId": "17fb580b204a2225", "scanner": "scanner-primary", "fingerprint": "9b08d0680818a165", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8432c07b26f4fdea", "level": "error", "message": {"text": "Dangling fetch: PUT /api/nav-groups/reorder (frontend/src/api.js:194)"}, "properties": {"repobilityId": "d3612222fdb8b3aa", "scanner": "scanner-primary", "fingerprint": "8432c07b26f4fdea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-00eca3bcd7b64fa7", "level": "error", "message": {"text": "Dangling fetch: PUT /api/nav-items/${itemId}/group (frontend/src/api.js:195)"}, "properties": {"repobilityId": "91bb4dfe654436fc", "scanner": "scanner-primary", "fingerprint": "00eca3bcd7b64fa7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4006f18ec4db10cf", "level": "note", "message": {"text": "Unused endpoint: USE /images"}, "properties": {"repobilityId": "a6c4a66707fee641", "scanner": "scanner-primary", "fingerprint": "4006f18ec4db10cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "8a1d83061af201c3", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-60b6c44e879db57b", "level": "note", "message": {"text": "Unused endpoint: USE /api/nav-items"}, "properties": {"repobilityId": "92a15b06da4d7bb3", "scanner": "scanner-primary", "fingerprint": "60b6c44e879db57b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f643fbf10ab5803", "level": "note", "message": {"text": "Unused endpoint: USE /api/upload"}, "properties": {"repobilityId": "3791f3d46c2864c0", "scanner": "scanner-primary", "fingerprint": "6f643fbf10ab5803", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ca4664c9cda1cd6", "level": "note", "message": {"text": "Unused endpoint: USE /api/settings"}, "properties": {"repobilityId": "e7643f895d26ca63", "scanner": "scanner-primary", "fingerprint": "8ca4664c9cda1cd6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "0509cf4ab88993e3", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-49b24a943513cdf1", "level": "note", "message": {"text": "Unused endpoint: USE /api/download"}, "properties": {"repobilityId": "443e5ac3fb95e75b", "scanner": "scanner-primary", "fingerprint": "49b24a943513cdf1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-32b973867a594e13", "level": "note", "message": {"text": "Unused endpoint: USE /api/nav-groups"}, "properties": {"repobilityId": "cb0d1b110f9a7bab", "scanner": "scanner-primary", "fingerprint": "32b973867a594e13", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "0ca6cece8622628a", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "e163b8531c92c531", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "a3e09774f37d30c6", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-365510c67c130be0", "level": "note", "message": {"text": "Unused endpoint: PUT /reorder"}, "properties": {"repobilityId": "56dc879bf9514c25", "scanner": "scanner-primary", "fingerprint": "365510c67c130be0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d5b2b188d08ca82", "level": "note", "message": {"text": "Unused endpoint: PUT /:id"}, "properties": {"repobilityId": "a770ebffcc8fdf1e", "scanner": "scanner-primary", "fingerprint": "8d5b2b188d08ca82", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-13a7aad6b4c49210", "level": "note", "message": {"text": "Unused endpoint: PUT /:id/group"}, "properties": {"repobilityId": "eac31a9ff93d8e41", "scanner": "scanner-primary", "fingerprint": "13a7aad6b4c49210", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1b5c4ab81a27a260", "level": "note", "message": {"text": "Unused endpoint: GET /theme"}, "properties": {"repobilityId": "dcaf9d72caafb672", "scanner": "scanner-primary", "fingerprint": "1b5c4ab81a27a260", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c4c08ab8672faa4f", "level": "note", "message": {"text": "Unused endpoint: PUT /theme"}, "properties": {"repobilityId": "3a9da5c40c79e119", "scanner": "scanner-primary", "fingerprint": "c4c08ab8672faa4f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e8a0a7b406443bc", "level": "note", "message": {"text": "Unused endpoint: GET /members"}, "properties": {"repobilityId": "d27dda3174a69846", "scanner": "scanner-primary", "fingerprint": "3e8a0a7b406443bc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d7ea8c744ffc1ac3", "level": "note", "message": {"text": "Unused endpoint: GET /members/:id"}, "properties": {"repobilityId": "930ba1c92c4b6af0", "scanner": "scanner-primary", "fingerprint": "d7ea8c744ffc1ac3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48dc184a50d8461b", "level": "note", "message": {"text": "Unused endpoint: PUT /members/:id"}, "properties": {"repobilityId": "28cf38074e11a282", "scanner": "scanner-primary", "fingerprint": "48dc184a50d8461b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fa8097acf61363a6", "level": "note", "message": {"text": "Unused endpoint: DELETE /members/:id"}, "properties": {"repobilityId": "52eeee3d561d16d0", "scanner": "scanner-primary", "fingerprint": "fa8097acf61363a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3e7e5fea4199d0c", "level": "note", "message": {"text": "Unused endpoint: GET /groups"}, "properties": {"repobilityId": "0550cd3c351a0f12", "scanner": "scanner-primary", "fingerprint": "e3e7e5fea4199d0c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3dfaaa08dd3fb680", "level": "note", "message": {"text": "Unused endpoint: POST /groups"}, "properties": {"repobilityId": "d098b37e63e4af69", "scanner": "scanner-primary", "fingerprint": "3dfaaa08dd3fb680", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-087cb9538004e96d", "level": "note", "message": {"text": "Unused endpoint: PUT /groups/:id"}, "properties": {"repobilityId": "fd15614adb6ae733", "scanner": "scanner-primary", "fingerprint": "087cb9538004e96d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d1feb620ea32b3f", "level": "note", "message": {"text": "Unused endpoint: DELETE /groups/:id"}, "properties": {"repobilityId": "45888b653efa9647", "scanner": "scanner-primary", "fingerprint": "3d1feb620ea32b3f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cf100a1d52393d18", "level": "note", "message": {"text": "Unused endpoint: GET /users/:userId/groups"}, "properties": {"repobilityId": "2eb2f3d7240e1e45", "scanner": "scanner-primary", "fingerprint": "cf100a1d52393d18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46c7e23356ac7cef", "level": "note", "message": {"text": "Unused endpoint: PUT /users/:userId/groups"}, "properties": {"repobilityId": "f75df55ae358aeb3", "scanner": "scanner-primary", "fingerprint": "46c7e23356ac7cef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cb8cdd3f4d307d6c", "level": "note", "message": {"text": "Unused endpoint: POST /send-code"}, "properties": {"repobilityId": "b649a51564cfbbc7", "scanner": "scanner-primary", "fingerprint": "cb8cdd3f4d307d6c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "75111c8cb20116c6", "scanner": "scanner-primary", "fingerprint": "304b6f2b403d93f7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "0739200902492336", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68a5d356c0cac9e3", "level": "note", "message": {"text": "Unused endpoint: POST /reset-password"}, "properties": {"repobilityId": "91c20811987986d1", "scanner": "scanner-primary", "fingerprint": "68a5d356c0cac9e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "e4a6fbd9b6ee5f8b", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-911492554a68d0c1", "level": "note", "message": {"text": "Unused endpoint: PUT /profile"}, "properties": {"repobilityId": "ece36e785ef6d6cf", "scanner": "scanner-primary", "fingerprint": "911492554a68d0c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b2b1a88ba946959", "level": "note", "message": {"text": "Unused endpoint: GET /latest-apk"}, "properties": {"repobilityId": "dbc29f6064700679", "scanner": "scanner-primary", "fingerprint": "4b2b1a88ba946959", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5494c43bc167deb0", "level": "note", "message": {"text": "Unused endpoint: GET /latest-ipa"}, "properties": {"repobilityId": "53dabdf4c4af0df5", "scanner": "scanner-primary", "fingerprint": "5494c43bc167deb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c86d1ea9990a3ffe", "level": "note", "message": {"text": "Unused endpoint: POST /image"}, "properties": {"repobilityId": "c8b4c06fdbce117a", "scanner": "scanner-primary", "fingerprint": "c86d1ea9990a3ffe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}