{"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-80174e83b075b2b1", "name": "Stray `console.log` in TS/JS \u2014 backend/src/seed.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/seed.ts:34"}, "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-163f7af5d23ea6d3", "name": "Stray `console.log` in TS/JS \u2014 backend/src/index.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/index.ts:9"}, "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-d33f7b36aa10a7a2", "name": "Stray `console.log` in TS/JS \u2014 backend/src/config/db.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/config/db.ts:7"}, "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-e49d9c1ed49d8a8d", "name": "Stray `console.log` in TS/JS \u2014 backend/src/services/email.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/email.ts:39"}, "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-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": "1 test file(s) for 91 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 10 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. 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-8592fdb29679aeaa", "name": "Frontend route `login` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `login` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-3812f1b43c340ead", "name": "Frontend route `reset-password` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `reset-password` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-3770f695d1c577a4", "name": "Frontend route `portfolio` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `portfolio` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "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-7f838d36de1b36af", "name": "Frontend route `portfolio/new` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `portfolio/new` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-950a7439705ab95d", "name": "Frontend route `portfolio/:id` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `portfolio/:id` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-f3e3098301618109", "name": "Frontend route `categories` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `categories` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-4dbcee02f6d267b6", "name": "Frontend route `messages` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-a1f3807caa437400", "name": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-7620601fa230cd7f", "name": "Frontend route `roles` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `roles` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-3a492764e09a1117", "name": "Frontend route `profile` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-7cdc288826d7616b", "name": "Frontend route `preferences` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `preferences` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-bc87cbd2b2367d85", "name": "Frontend route `security` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx", "shortDescription": {"text": "Frontend route `security` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "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-c18becdbd6061e4d", "name": "Frontend route `portfolio/:slug` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `portfolio/:slug` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "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-67099c8b3c745019", "name": "Frontend route `privacy` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `privacy` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "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-be29e4950307e1ba", "name": "Frontend route `terms` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `terms` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "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-8c71d19fdb84b975", "name": "Frontend route `admin/*` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `admin/*` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "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-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api` 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-1bc898b3b7565990", "name": "Unused endpoint: USE /uploads", "shortDescription": {"text": "Unused endpoint: USE /uploads"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /uploads` 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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`backend/src/app.ts` declares `GET /api/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-446fe4b6ad1a4ff9", "name": "Unused endpoint: USE /api/public", "shortDescription": {"text": "Unused endpoint: USE /api/public"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/public` 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-fb249c271605d179", "name": "Unused endpoint: USE /api/admin/auth", "shortDescription": {"text": "Unused endpoint: USE /api/admin/auth"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/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-611dfc7420e22507", "name": "Unused endpoint: USE /api/admin/portfolio", "shortDescription": {"text": "Unused endpoint: USE /api/admin/portfolio"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/portfolio` 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-5779637b243d50d8", "name": "Unused endpoint: USE /api/admin/categories", "shortDescription": {"text": "Unused endpoint: USE /api/admin/categories"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/categories` 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-ff40727e23a169b3", "name": "Unused endpoint: USE /api/admin/contact-messages", "shortDescription": {"text": "Unused endpoint: USE /api/admin/contact-messages"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/contact-messages` 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-a29e3c48f16dc456", "name": "Unused endpoint: USE /api/admin/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/admin/notifications"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/notifications` 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-0fbe6a353f8ebd1a", "name": "Unused endpoint: USE /api/admin/stats", "shortDescription": {"text": "Unused endpoint: USE /api/admin/stats"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0cdfc54d1b370bd", "name": "Unused endpoint: USE /api/admin/users", "shortDescription": {"text": "Unused endpoint: USE /api/admin/users"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/users` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0909bff9dad95976", "name": "Unused endpoint: USE /api/admin/roles", "shortDescription": {"text": "Unused endpoint: USE /api/admin/roles"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/roles` 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-75cfa7ef920d9d81", "name": "Unused endpoint: USE /api/admin/uploads", "shortDescription": {"text": "Unused endpoint: USE /api/admin/uploads"}, "fullDescription": {"text": "`backend/src/app.ts` declares `USE /api/admin/uploads` 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/src/routes/adminNotifications.ts` 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/src/routes/adminRoles.ts` 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-5fbc954f63526821", "name": "Unused endpoint: PATCH /:id", "shortDescription": {"text": "Unused endpoint: PATCH /:id"}, "fullDescription": {"text": "`backend/src/routes/adminRoles.ts` declares `PATCH /: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-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`backend/src/routes/adminRoles.ts` 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-3f8670f2a29e2a18", "name": "Unused endpoint: GET /portfolio", "shortDescription": {"text": "Unused endpoint: GET /portfolio"}, "fullDescription": {"text": "`backend/src/routes/public.ts` declares `GET /portfolio` 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-6d868bd57ca01451", "name": "Unused endpoint: GET /portfolio/featured", "shortDescription": {"text": "Unused endpoint: GET /portfolio/featured"}, "fullDescription": {"text": "`backend/src/routes/public.ts` declares `GET /portfolio/featured` 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-3d13a0cab85a437c", "name": "Unused endpoint: GET /portfolio/:slug", "shortDescription": {"text": "Unused endpoint: GET /portfolio/:slug"}, "fullDescription": {"text": "`backend/src/routes/public.ts` declares `GET /portfolio/:slug` 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-9260174de75b32ba", "name": "Unused endpoint: GET /categories", "shortDescription": {"text": "Unused endpoint: GET /categories"}, "fullDescription": {"text": "`backend/src/routes/public.ts` declares `GET /categories` 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-f8e3b1ec38031f42", "name": "Unused endpoint: POST /contact", "shortDescription": {"text": "Unused endpoint: POST /contact"}, "fullDescription": {"text": "`backend/src/routes/public.ts` declares `POST /contact` 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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`backend/src/routes/adminMessages.ts` declares `GET /: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-f39249a345a19765", "name": "Unused endpoint: PATCH /:id/status", "shortDescription": {"text": "Unused endpoint: PATCH /:id/status"}, "fullDescription": {"text": "`backend/src/routes/adminMessages.ts` declares `PATCH /:id/status` 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-6d589fc537557405", "name": "Unused endpoint: PATCH /:id/publish", "shortDescription": {"text": "Unused endpoint: PATCH /:id/publish"}, "fullDescription": {"text": "`backend/src/routes/adminPortfolio.ts` declares `PATCH /:id/publish` 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-4d8497f218bb8b40", "name": "Unused endpoint: PATCH /:id/feature", "shortDescription": {"text": "Unused endpoint: PATCH /:id/feature"}, "fullDescription": {"text": "`backend/src/routes/adminPortfolio.ts` declares `PATCH /:id/feature` 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-7ed70d3538abe9ef", "name": "Unused endpoint: POST /:id/images", "shortDescription": {"text": "Unused endpoint: POST /:id/images"}, "fullDescription": {"text": "`backend/src/routes/adminPortfolio.ts` declares `POST /: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-809f989b6b3fcc46", "name": "Unused endpoint: PATCH /:id/images/reorder", "shortDescription": {"text": "Unused endpoint: PATCH /:id/images/reorder"}, "fullDescription": {"text": "`backend/src/routes/adminPortfolio.ts` declares `PATCH /:id/images/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-c97485a750e8c12c", "name": "Unused endpoint: PATCH /images/:imageId", "shortDescription": {"text": "Unused endpoint: PATCH /images/:imageId"}, "fullDescription": {"text": "`backend/src/routes/adminPortfolio.ts` declares `PATCH /images/:imageId` 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-51bd1ebf027a738b", "name": "Unused endpoint: DELETE /images/:imageId", "shortDescription": {"text": "Unused endpoint: DELETE /images/:imageId"}, "fullDescription": {"text": "`backend/src/routes/adminPortfolio.ts` declares `DELETE /images/:imageId` 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-dd63a4e9f7db655a", "name": "Unused endpoint: POST /uploads/image", "shortDescription": {"text": "Unused endpoint: POST /uploads/image"}, "fullDescription": {"text": "`backend/src/routes/adminPortfolio.ts` declares `POST /uploads/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}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/src/routes/adminAuth.ts` 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-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`backend/src/routes/adminAuth.ts` declares `POST /logout` 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/src/routes/adminAuth.ts` 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-59a1cc885f47e39f", "name": "Unused endpoint: PATCH /profile", "shortDescription": {"text": "Unused endpoint: PATCH /profile"}, "fullDescription": {"text": "`backend/src/routes/adminAuth.ts` declares `PATCH /profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc801485b7842a46", "name": "Unused endpoint: PATCH /password", "shortDescription": {"text": "Unused endpoint: PATCH /password"}, "fullDescription": {"text": "`backend/src/routes/adminAuth.ts` declares `PATCH /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-4257ec01219aa99a", "name": "Unused endpoint: POST /forgot-password", "shortDescription": {"text": "Unused endpoint: POST /forgot-password"}, "fullDescription": {"text": "`backend/src/routes/adminAuth.ts` declares `POST /forgot-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68a5d356c0cac9e3", "name": "Unused endpoint: POST /reset-password", "shortDescription": {"text": "Unused endpoint: POST /reset-password"}, "fullDescription": {"text": "`backend/src/routes/adminAuth.ts` 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-d63f7e88f2401c27", "name": "Unused endpoint: PATCH /preferences", "shortDescription": {"text": "Unused endpoint: PATCH /preferences"}, "fullDescription": {"text": "`backend/src/routes/adminAuth.ts` declares `PATCH /preferences` 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-04e1a917b08c1376", "name": "Unused endpoint: PATCH /:id/password", "shortDescription": {"text": "Unused endpoint: PATCH /:id/password"}, "fullDescription": {"text": "`backend/src/routes/adminUsers.ts` declares `PATCH /:id/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}}]}}, "automationDetails": {"id": "repobility/20232"}, "properties": {"repository": "stanleyHayes/obkmedia", "repoUrl": "https://github.com/stanleyHayes/obkmedia", "branch": "main"}, "results": [{"ruleId": "scanner-80174e83b075b2b1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/seed.ts:34"}, "properties": {"repobilityId": "0f25998c0552983b", "scanner": "scanner-primary", "fingerprint": "80174e83b075b2b1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-163f7af5d23ea6d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/index.ts:9"}, "properties": {"repobilityId": "db2171a39601fa41", "scanner": "scanner-primary", "fingerprint": "163f7af5d23ea6d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d33f7b36aa10a7a2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/config/db.ts:7"}, "properties": {"repobilityId": "8ec20c9eaf6020a3", "scanner": "scanner-primary", "fingerprint": "d33f7b36aa10a7a2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e49d9c1ed49d8a8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/services/email.ts:39"}, "properties": {"repobilityId": "149f7117f3d67ca8", "scanner": "scanner-primary", "fingerprint": "e49d9c1ed49d8a8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"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": "5364b24ace1a0711", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "6571af108bfb6a3e", "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": "6f3e07ebd6584cd6", "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": "f65d18214131c3b6", "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": "14b30e28e800a958", "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": "2290dd2c6825a0d6", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8592fdb29679aeaa", "level": "warning", "message": {"text": "Frontend route `login` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "10aab7e95a837237", "scanner": "scanner-primary", "fingerprint": "8592fdb29679aeaa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3812f1b43c340ead", "level": "warning", "message": {"text": "Frontend route `reset-password` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "a96a9c11b98092d6", "scanner": "scanner-primary", "fingerprint": "3812f1b43c340ead", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3770f695d1c577a4", "level": "warning", "message": {"text": "Frontend route `portfolio` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "cdb50e49a2d51110", "scanner": "scanner-primary", "fingerprint": "3770f695d1c577a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7f838d36de1b36af", "level": "warning", "message": {"text": "Frontend route `portfolio/new` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "d6a67700d8443a2c", "scanner": "scanner-primary", "fingerprint": "7f838d36de1b36af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-950a7439705ab95d", "level": "warning", "message": {"text": "Frontend route `portfolio/:id` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "bb9fc754ce000495", "scanner": "scanner-primary", "fingerprint": "950a7439705ab95d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f3e3098301618109", "level": "warning", "message": {"text": "Frontend route `categories` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "3bd2becced57f608", "scanner": "scanner-primary", "fingerprint": "f3e3098301618109", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4dbcee02f6d267b6", "level": "warning", "message": {"text": "Frontend route `messages` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "f1445a0b76c9fbb6", "scanner": "scanner-primary", "fingerprint": "4dbcee02f6d267b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a1f3807caa437400", "level": "warning", "message": {"text": "Frontend route `users` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "825415aa838500b3", "scanner": "scanner-primary", "fingerprint": "a1f3807caa437400", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7620601fa230cd7f", "level": "warning", "message": {"text": "Frontend route `roles` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "4a627dc1d1457842", "scanner": "scanner-primary", "fingerprint": "7620601fa230cd7f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3a492764e09a1117", "level": "warning", "message": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "a934ec769f2c472c", "scanner": "scanner-primary", "fingerprint": "3a492764e09a1117", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7cdc288826d7616b", "level": "warning", "message": {"text": "Frontend route `preferences` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "090b204ac91d75c8", "scanner": "scanner-primary", "fingerprint": "7cdc288826d7616b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bc87cbd2b2367d85", "level": "warning", "message": {"text": "Frontend route `security` has no Link/navigate to it \u2014 frontend/src/AdminApp.tsx"}, "properties": {"repobilityId": "f3a9d1839b4d08ee", "scanner": "scanner-primary", "fingerprint": "bc87cbd2b2367d85", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c18becdbd6061e4d", "level": "warning", "message": {"text": "Frontend route `portfolio/:slug` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "9808a313df49fb7b", "scanner": "scanner-primary", "fingerprint": "c18becdbd6061e4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-67099c8b3c745019", "level": "warning", "message": {"text": "Frontend route `privacy` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "b6f4e58cb77a7498", "scanner": "scanner-primary", "fingerprint": "67099c8b3c745019", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-be29e4950307e1ba", "level": "warning", "message": {"text": "Frontend route `terms` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "947f5963b807e675", "scanner": "scanner-primary", "fingerprint": "be29e4950307e1ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8c71d19fdb84b975", "level": "warning", "message": {"text": "Frontend route `admin/*` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "30e751ace8701aa1", "scanner": "scanner-primary", "fingerprint": "8c71d19fdb84b975", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "3c5ef0fb4fad728c", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bc898b3b7565990", "level": "note", "message": {"text": "Unused endpoint: USE /uploads"}, "properties": {"repobilityId": "0f91b95fbb4a0979", "scanner": "scanner-primary", "fingerprint": "1bc898b3b7565990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "f5c83c0ba7c17645", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-446fe4b6ad1a4ff9", "level": "note", "message": {"text": "Unused endpoint: USE /api/public"}, "properties": {"repobilityId": "69a573d200a0ec91", "scanner": "scanner-primary", "fingerprint": "446fe4b6ad1a4ff9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb249c271605d179", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/auth"}, "properties": {"repobilityId": "66838555d0bc9e1c", "scanner": "scanner-primary", "fingerprint": "fb249c271605d179", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-611dfc7420e22507", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/portfolio"}, "properties": {"repobilityId": "87672298fceaf3c2", "scanner": "scanner-primary", "fingerprint": "611dfc7420e22507", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5779637b243d50d8", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/categories"}, "properties": {"repobilityId": "b0c6335adbeae49f", "scanner": "scanner-primary", "fingerprint": "5779637b243d50d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff40727e23a169b3", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/contact-messages"}, "properties": {"repobilityId": "6caf0e54b7c4e686", "scanner": "scanner-primary", "fingerprint": "ff40727e23a169b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a29e3c48f16dc456", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/notifications"}, "properties": {"repobilityId": "ad9cb80213442581", "scanner": "scanner-primary", "fingerprint": "a29e3c48f16dc456", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0fbe6a353f8ebd1a", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/stats"}, "properties": {"repobilityId": "9d45ea394965016f", "scanner": "scanner-primary", "fingerprint": "0fbe6a353f8ebd1a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0cdfc54d1b370bd", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/users"}, "properties": {"repobilityId": "a65336a9ca35cc87", "scanner": "scanner-primary", "fingerprint": "e0cdfc54d1b370bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0909bff9dad95976", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/roles"}, "properties": {"repobilityId": "41d5202e1c9ba176", "scanner": "scanner-primary", "fingerprint": "0909bff9dad95976", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-75cfa7ef920d9d81", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/uploads"}, "properties": {"repobilityId": "80752b19af9e7630", "scanner": "scanner-primary", "fingerprint": "75cfa7ef920d9d81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "3ca9526c264461ce", "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": "ebedf3be973a62bd", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fbc954f63526821", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id"}, "properties": {"repobilityId": "98ca2e43b4f1799d", "scanner": "scanner-primary", "fingerprint": "5fbc954f63526821", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "059b07e1763b5fda", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3f8670f2a29e2a18", "level": "note", "message": {"text": "Unused endpoint: GET /portfolio"}, "properties": {"repobilityId": "32f2ac17f0baa6f3", "scanner": "scanner-primary", "fingerprint": "3f8670f2a29e2a18", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d868bd57ca01451", "level": "note", "message": {"text": "Unused endpoint: GET /portfolio/featured"}, "properties": {"repobilityId": "cd7d54383222c756", "scanner": "scanner-primary", "fingerprint": "6d868bd57ca01451", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d13a0cab85a437c", "level": "note", "message": {"text": "Unused endpoint: GET /portfolio/:slug"}, "properties": {"repobilityId": "fa4426f37600a8b9", "scanner": "scanner-primary", "fingerprint": "3d13a0cab85a437c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9260174de75b32ba", "level": "note", "message": {"text": "Unused endpoint: GET /categories"}, "properties": {"repobilityId": "ad517a10883f30f7", "scanner": "scanner-primary", "fingerprint": "9260174de75b32ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8e3b1ec38031f42", "level": "note", "message": {"text": "Unused endpoint: POST /contact"}, "properties": {"repobilityId": "d04416022a5f5986", "scanner": "scanner-primary", "fingerprint": "f8e3b1ec38031f42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "8787d8dacd778425", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f39249a345a19765", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/status"}, "properties": {"repobilityId": "43dcfbfd82855fee", "scanner": "scanner-primary", "fingerprint": "f39249a345a19765", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d589fc537557405", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/publish"}, "properties": {"repobilityId": "27962dbfefcd0805", "scanner": "scanner-primary", "fingerprint": "6d589fc537557405", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4d8497f218bb8b40", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/feature"}, "properties": {"repobilityId": "468179e6b77a2a40", "scanner": "scanner-primary", "fingerprint": "4d8497f218bb8b40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7ed70d3538abe9ef", "level": "note", "message": {"text": "Unused endpoint: POST /:id/images"}, "properties": {"repobilityId": "95452640e307575c", "scanner": "scanner-primary", "fingerprint": "7ed70d3538abe9ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-809f989b6b3fcc46", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/images/reorder"}, "properties": {"repobilityId": "d2bca28697b6a78b", "scanner": "scanner-primary", "fingerprint": "809f989b6b3fcc46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c97485a750e8c12c", "level": "note", "message": {"text": "Unused endpoint: PATCH /images/:imageId"}, "properties": {"repobilityId": "cca216e937827ca8", "scanner": "scanner-primary", "fingerprint": "c97485a750e8c12c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-51bd1ebf027a738b", "level": "note", "message": {"text": "Unused endpoint: DELETE /images/:imageId"}, "properties": {"repobilityId": "3f7b0cba0df55075", "scanner": "scanner-primary", "fingerprint": "51bd1ebf027a738b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd63a4e9f7db655a", "level": "note", "message": {"text": "Unused endpoint: POST /uploads/image"}, "properties": {"repobilityId": "69ca2d83e2580411", "scanner": "scanner-primary", "fingerprint": "dd63a4e9f7db655a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "2dc63dd2187958c5", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "854f9c4bc159785e", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fd1dc91abf32142d", "level": "note", "message": {"text": "Unused endpoint: GET /me"}, "properties": {"repobilityId": "282de72a700930a8", "scanner": "scanner-primary", "fingerprint": "fd1dc91abf32142d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-59a1cc885f47e39f", "level": "note", "message": {"text": "Unused endpoint: PATCH /profile"}, "properties": {"repobilityId": "fd95a0fa0672bfa6", "scanner": "scanner-primary", "fingerprint": "59a1cc885f47e39f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc801485b7842a46", "level": "note", "message": {"text": "Unused endpoint: PATCH /password"}, "properties": {"repobilityId": "43ad73ee6ee7b9d6", "scanner": "scanner-primary", "fingerprint": "bc801485b7842a46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4257ec01219aa99a", "level": "note", "message": {"text": "Unused endpoint: POST /forgot-password"}, "properties": {"repobilityId": "5703bbcabe30c4d9", "scanner": "scanner-primary", "fingerprint": "4257ec01219aa99a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-68a5d356c0cac9e3", "level": "note", "message": {"text": "Unused endpoint: POST /reset-password"}, "properties": {"repobilityId": "bdf33c84af73f5f9", "scanner": "scanner-primary", "fingerprint": "68a5d356c0cac9e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d63f7e88f2401c27", "level": "note", "message": {"text": "Unused endpoint: PATCH /preferences"}, "properties": {"repobilityId": "c16efeec1b8eb800", "scanner": "scanner-primary", "fingerprint": "d63f7e88f2401c27", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-04e1a917b08c1376", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/password"}, "properties": {"repobilityId": "7e9f53cb912faaaa", "scanner": "scanner-primary", "fingerprint": "04e1a917b08c1376", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}