{"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-cad0c15322ce5de6", "name": "Stray `console.log` in TS/JS \u2014 server/index.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/index.ts:51"}, "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-e21736b790986492", "name": "Stray `console.log` in TS/JS \u2014 server/prisma/seed.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/prisma/seed.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-52d5fb0f45adbaa8", "name": "Stray `console.log` in TS/JS \u2014 server/workers/publish.worker.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/workers/publish.worker.ts:105"}, "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-3ef84b49da62ac39", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:70"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fda1239d3af6ac18", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Topbar.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Topbar.tsx:96"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bdea1499300d66a3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/posts/NetworkPreview.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/posts/NetworkPreview.tsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9ddab9e1e9f81289", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/posts/PostCreator.tsx:430", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/posts/PostCreator.tsx:430"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8714ba9240202f06", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/spotlight-card.tsx:92", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/spotlight-card.tsx:92"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8616c6abeddf3dcf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/music-player.tsx:739", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/music-player.tsx:739"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbaa8d1bdf596f81", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SchedulingPage.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SchedulingPage.tsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e69ca2cacdc6719d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/LibraryPage.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/LibraryPage.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d604442e9efde8e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CopyDeskPage.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CopyDeskPage.tsx:148"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11ea582c3c2b3b99", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:268", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:268"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76d46b65dd1d2580", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9ed6d43254be8df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e2ae75c86aedcf6", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/spotlight-card.tsx:92", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/spotlight-card.tsx:92"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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 92 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 7 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 61 placeholder/mock markers across 25 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, tests, operator-readme. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-799125e286103673", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/social.routes.ts:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/social.routes.ts:182"}, "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-96f014636a109a8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/music.routes.ts:293", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/music.routes.ts:293"}, "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-c74883d697bb8599", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/layout/NotificationBell.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/layout/NotificationBell.tsx:26"}, "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-50d89f3b2878de8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:43"}, "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-c09fb41c4d04ce2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useCopyDesk.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useCopyDesk.ts:34"}, "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-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BACKEND_URL`, `NODE_ENV`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59c4381a038aaa56", "name": "Frontend route `/gravar/:token` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/gravar/:token` has no Link/navigate to it \u2014 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-e293ba636aa6f3b5", "name": "Frontend route `/aprovar/:token` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/aprovar/:token` has no Link/navigate to it \u2014 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-cef386312d50c26d", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 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-7be36735c436327f", "name": "Frontend route `projects` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `projects` has no Link/navigate to it \u2014 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-94a3f3179d6ac3c0", "name": "Frontend route `projects/:id` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `projects/:id` has no Link/navigate to it \u2014 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-c8e4000b565c4f77", "name": "Frontend route `calendar` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `calendar` has no Link/navigate to it \u2014 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-3179589837f8f615", "name": "Frontend route `videos` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `videos` has no Link/navigate to it \u2014 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-e7127c97c9e60c5c", "name": "Frontend route `approvals` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `approvals` has no Link/navigate to it \u2014 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-e161498aee03299b", "name": "Frontend route `scheduling` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `scheduling` has no Link/navigate to it \u2014 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-27d90135de1aed8a", "name": "Frontend route `copydesk` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `copydesk` has no Link/navigate to it \u2014 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-aa73de4379656718", "name": "Frontend route `trenddesk` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `trenddesk` has no Link/navigate to it \u2014 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-ec3a5c701e606131", "name": "Frontend route `searchdesk` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `searchdesk` has no Link/navigate to it \u2014 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-2399057a857c1a2a", "name": "Frontend route `designdesk` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `designdesk` has no Link/navigate to it \u2014 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-3036bbe422669f69", "name": "Frontend route `library` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `library` has no Link/navigate to it \u2014 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-d2153e1710f15466", "name": "Frontend route `reports` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `reports` has no Link/navigate to it \u2014 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-0626b4c2e4efcb82", "name": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 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-989e27a4d87d10ef", "name": "Dangling fetch: POST https://api.canva.com/rest/v1/oauth/token (server/routes/canva.routes.ts:26)", "shortDescription": {"text": "Dangling fetch: POST https://api.canva.com/rest/v1/oauth/token (server/routes/canva.routes.ts:26)"}, "fullDescription": {"text": "`server/routes/canva.routes.ts:26` calls `POST https://api.canva.com/rest/v1/oauth/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.canva.com/rest/v1/oauth/token`\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-8882ac446e83a145", "name": "Dangling fetch: POST https://api.canva.com/rest/v1/oauth/token (server/routes/canva.routes.ts:82)", "shortDescription": {"text": "Dangling fetch: POST https://api.canva.com/rest/v1/oauth/token (server/routes/canva.routes.ts:82)"}, "fullDescription": {"text": "`server/routes/canva.routes.ts:82` calls `POST https://api.canva.com/rest/v1/oauth/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.canva.com/rest/v1/oauth/token`\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-9e402ad615224de2", "name": "Dangling fetch: GET https://api.canva.com/rest/v1/users/me/profile (server/routes/canva.routes.ts:100)", "shortDescription": {"text": "Dangling fetch: GET https://api.canva.com/rest/v1/users/me/profile (server/routes/canva.routes.ts:100)"}, "fullDescription": {"text": "`server/routes/canva.routes.ts:100` calls `GET https://api.canva.com/rest/v1/users/me/profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.canva.com/rest/v1/users/me/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-93466f3da00d5abb", "name": "Dangling fetch: POST https://api.canva.com/rest/v1/designs (server/routes/canva.routes.ts:145)", "shortDescription": {"text": "Dangling fetch: POST https://api.canva.com/rest/v1/designs (server/routes/canva.routes.ts:145)"}, "fullDescription": {"text": "`server/routes/canva.routes.ts:145` calls `POST https://api.canva.com/rest/v1/designs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.canva.com/rest/v1/designs`\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-a42643d59622c0c7", "name": "Dangling fetch: POST https://www.linkedin.com/oauth/v2/accessToken (server/routes/social.routes.ts:168)", "shortDescription": {"text": "Dangling fetch: POST https://www.linkedin.com/oauth/v2/accessToken (server/routes/social.routes.ts:168)"}, "fullDescription": {"text": "`server/routes/social.routes.ts:168` calls `POST https://www.linkedin.com/oauth/v2/accessToken` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.linkedin.com/oauth/v2/accesstoken`\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-dc83110d6dd7f3d2", "name": "Dangling fetch: GET https://api.linkedin.com/v2/userinfo (server/routes/social.routes.ts:182)", "shortDescription": {"text": "Dangling fetch: GET https://api.linkedin.com/v2/userinfo (server/routes/social.routes.ts:182)"}, "fullDescription": {"text": "`server/routes/social.routes.ts:182` calls `GET https://api.linkedin.com/v2/userinfo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.linkedin.com/v2/userinfo`\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-f0848ef63a336a9f", "name": "Dangling fetch: POST https://open.tiktokapis.com/v2/oauth/token/ (server/routes/social.routes.ts:295)", "shortDescription": {"text": "Dangling fetch: POST https://open.tiktokapis.com/v2/oauth/token/ (server/routes/social.routes.ts:295)"}, "fullDescription": {"text": "`server/routes/social.routes.ts:295` calls `POST https://open.tiktokapis.com/v2/oauth/token/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/open.tiktokapis.com/v2/oauth/token`\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-c6d4907a61c8a07c", "name": "Dangling fetch: GET https://open.tiktokapis.com/v2/user/info/?fields=open_id,display_name,avatar_url (server/routes/soci", "shortDescription": {"text": "Dangling fetch: GET https://open.tiktokapis.com/v2/user/info/?fields=open_id,display_name,avatar_url (server/routes/social.routes.ts:309)"}, "fullDescription": {"text": "`server/routes/social.routes.ts:309` calls `GET https://open.tiktokapis.com/v2/user/info/?fields=open_id,display_name,avatar_url` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/open.tiktokapis.com/v2/user/info`\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-57762d8b45166194", "name": "Dangling fetch: POST https://accounts.spotify.com/api/token (server/routes/music.routes.ts:26)", "shortDescription": {"text": "Dangling fetch: POST https://accounts.spotify.com/api/token (server/routes/music.routes.ts:26)"}, "fullDescription": {"text": "`server/routes/music.routes.ts:26` calls `POST https://accounts.spotify.com/api/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/accounts.spotify.com/api/token`\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-64fb3c0a6e410085", "name": "Dangling fetch: POST https://accounts.spotify.com/api/token (server/routes/music.routes.ts:76)", "shortDescription": {"text": "Dangling fetch: POST https://accounts.spotify.com/api/token (server/routes/music.routes.ts:76)"}, "fullDescription": {"text": "`server/routes/music.routes.ts:76` calls `POST https://accounts.spotify.com/api/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/accounts.spotify.com/api/token`\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-5434799e213bf22c", "name": "Dangling fetch: GET https://api.spotify.com/v1/me (server/routes/music.routes.ts:92)", "shortDescription": {"text": "Dangling fetch: GET https://api.spotify.com/v1/me (server/routes/music.routes.ts:92)"}, "fullDescription": {"text": "`server/routes/music.routes.ts:92` calls `GET https://api.spotify.com/v1/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.spotify.com/v1/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-f3b56b87483b675e", "name": "Dangling fetch: GET https://api.spotify.com/v1/me/player (server/routes/music.routes.ts:293)", "shortDescription": {"text": "Dangling fetch: GET https://api.spotify.com/v1/me/player (server/routes/music.routes.ts:293)"}, "fullDescription": {"text": "`server/routes/music.routes.ts:293` calls `GET https://api.spotify.com/v1/me/player` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.spotify.com/v1/me/player`\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-10a6852f61ee8303", "name": "Dangling fetch: GET https://api.spotify.com/v1${path} (server/routes/music.routes.ts:358)", "shortDescription": {"text": "Dangling fetch: GET https://api.spotify.com/v1${path} (server/routes/music.routes.ts:358)"}, "fullDescription": {"text": "`server/routes/music.routes.ts:358` calls `GET https://api.spotify.com/v1${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.spotify.com/v1/<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-6dd51ad06457a099", "name": "Dangling fetch: POST /api/copydesk/generate (src/hooks/useCopyDesk.ts:34)", "shortDescription": {"text": "Dangling fetch: POST /api/copydesk/generate (src/hooks/useCopyDesk.ts:34)"}, "fullDescription": {"text": "`src/hooks/useCopyDesk.ts:34` calls `POST /api/copydesk/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/copydesk/generate`\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-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`server/index.ts` 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-728e92394c568abf", "name": "Unused endpoint: USE /api/projects", "shortDescription": {"text": "Unused endpoint: USE /api/projects"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/projects` 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-1be44d2cc9b65154", "name": "Unused endpoint: USE /api/posts", "shortDescription": {"text": "Unused endpoint: USE /api/posts"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/posts` 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-241fd5d78ee6021b", "name": "Unused endpoint: USE /api/approvals", "shortDescription": {"text": "Unused endpoint: USE /api/approvals"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/approvals` 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-07959a16254f0ef0", "name": "Unused endpoint: USE /api/professionals", "shortDescription": {"text": "Unused endpoint: USE /api/professionals"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/professionals` 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-f996aaabf32fbc50", "name": "Unused endpoint: USE /api/copydesk", "shortDescription": {"text": "Unused endpoint: USE /api/copydesk"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/copydesk` 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-c3a8b7932f72b92f", "name": "Unused endpoint: USE /api/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/notifications"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/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-5bda8f793f014b40", "name": "Unused endpoint: USE /api/video-tasks", "shortDescription": {"text": "Unused endpoint: USE /api/video-tasks"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/video-tasks` 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-33a167a4af819d31", "name": "Unused endpoint: USE /api/scheduling", "shortDescription": {"text": "Unused endpoint: USE /api/scheduling"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/scheduling` 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-758beedf52b76fb9", "name": "Unused endpoint: USE /api/trenddesk", "shortDescription": {"text": "Unused endpoint: USE /api/trenddesk"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/trenddesk` 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-2bf485d42198d7b3", "name": "Unused endpoint: USE /api/searchdesk", "shortDescription": {"text": "Unused endpoint: USE /api/searchdesk"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/searchdesk` 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": "`server/index.ts` 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-ec940d1f587fece3", "name": "Unused endpoint: USE /api/social", "shortDescription": {"text": "Unused endpoint: USE /api/social"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/social` 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-7c18e12167939aa3", "name": "Unused endpoint: USE /api/music", "shortDescription": {"text": "Unused endpoint: USE /api/music"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/music` 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-b0da4a79d6adbcf3", "name": "Unused endpoint: USE /api/canva", "shortDescription": {"text": "Unused endpoint: USE /api/canva"}, "fullDescription": {"text": "`server/index.ts` declares `USE /api/canva` 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": "`server/index.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-ca6aab7a934627bf", "name": "Unused endpoint: GET /auth-url", "shortDescription": {"text": "Unused endpoint: GET /auth-url"}, "fullDescription": {"text": "`server/routes/canva.routes.ts` declares `GET /auth-url` 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-cdfb578618cf2542", "name": "Unused endpoint: GET /callback", "shortDescription": {"text": "Unused endpoint: GET /callback"}, "fullDescription": {"text": "`server/routes/canva.routes.ts` declares `GET /callback` 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-a3215998554bbee8", "name": "Unused endpoint: POST /create-design", "shortDescription": {"text": "Unused endpoint: POST /create-design"}, "fullDescription": {"text": "`server/routes/canva.routes.ts` declares `POST /create-design` 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-3b30f4c0994a30b4", "name": "Unused endpoint: DELETE /", "shortDescription": {"text": "Unused endpoint: DELETE /"}, "fullDescription": {"text": "`server/routes/canva.routes.ts` declares `DELETE /` 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": "`server/routes/projects.routes.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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`server/routes/projects.routes.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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`server/routes/projects.routes.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": "`server/routes/projects.routes.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": "`server/routes/projects.routes.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-ed4d2d73b6897c8d", "name": "Unused endpoint: PATCH /read-all", "shortDescription": {"text": "Unused endpoint: PATCH /read-all"}, "fullDescription": {"text": "`server/routes/notifications.routes.ts` declares `PATCH /read-all` 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-afd4ed162f8ab9b0", "name": "Unused endpoint: PATCH /:id/read", "shortDescription": {"text": "Unused endpoint: PATCH /:id/read"}, "fullDescription": {"text": "`server/routes/notifications.routes.ts` declares `PATCH /:id/read` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb9222c6f85dd10c", "name": "Unused endpoint: GET /public/:token", "shortDescription": {"text": "Unused endpoint: GET /public/:token"}, "fullDescription": {"text": "`server/routes/approvals.routes.ts` declares `GET /public/:token` 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-c90d5da7969fc5df", "name": "Unused endpoint: POST /public/:token/action", "shortDescription": {"text": "Unused endpoint: POST /public/:token/action"}, "fullDescription": {"text": "`server/routes/approvals.routes.ts` declares `POST /public/:token/action` 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-eef74b9d4c5ad4a4", "name": "Unused endpoint: POST /:postId/publish", "shortDescription": {"text": "Unused endpoint: POST /:postId/publish"}, "fullDescription": {"text": "`server/routes/scheduling.routes.ts` declares `POST /:postId/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-748d94027e0682a7", "name": "Unused endpoint: DELETE /:postId", "shortDescription": {"text": "Unused endpoint: DELETE /:postId"}, "fullDescription": {"text": "`server/routes/scheduling.routes.ts` declares `DELETE /:postId` 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": "`server/routes/auth.routes.ts` 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": "`server/routes/auth.routes.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-ea575b61c121b733", "name": "Unused endpoint: PATCH /me", "shortDescription": {"text": "Unused endpoint: PATCH /me"}, "fullDescription": {"text": "`server/routes/auth.routes.ts` declares `PATCH /me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3a46a6c7e4b112b", "name": "Unused endpoint: GET /google/auth-url", "shortDescription": {"text": "Unused endpoint: GET /google/auth-url"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /google/auth-url` 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-424854ab10436e86", "name": "Unused endpoint: GET /google/callback", "shortDescription": {"text": "Unused endpoint: GET /google/callback"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /google/callback` 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-a11e11a08a2c8a12", "name": "Unused endpoint: GET /linkedin/auth-url", "shortDescription": {"text": "Unused endpoint: GET /linkedin/auth-url"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /linkedin/auth-url` 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-822883a6ab6a0060", "name": "Unused endpoint: GET /linkedin/callback", "shortDescription": {"text": "Unused endpoint: GET /linkedin/callback"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /linkedin/callback` 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-f5e200a0508c0125", "name": "Unused endpoint: GET /meta/auth-url", "shortDescription": {"text": "Unused endpoint: GET /meta/auth-url"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /meta/auth-url` 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-23c37b5be4bb4c3a", "name": "Unused endpoint: GET /meta/callback", "shortDescription": {"text": "Unused endpoint: GET /meta/callback"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /meta/callback` 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-daaf15783f6151d0", "name": "Unused endpoint: GET /tiktok/auth-url", "shortDescription": {"text": "Unused endpoint: GET /tiktok/auth-url"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /tiktok/auth-url` 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-b20f46635bce03e7", "name": "Unused endpoint: GET /clip/callback", "shortDescription": {"text": "Unused endpoint: GET /clip/callback"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /clip/callback` 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-21c7ff7b8ef22c44", "name": "Unused endpoint: GET /accounts", "shortDescription": {"text": "Unused endpoint: GET /accounts"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `GET /accounts` 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-d2a37c2e855bff00", "name": "Unused endpoint: DELETE /accounts/:id", "shortDescription": {"text": "Unused endpoint: DELETE /accounts/:id"}, "fullDescription": {"text": "`server/routes/social.routes.ts` declares `DELETE /accounts/: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-970eb92d6ec2bfaa", "name": "Unused endpoint: POST /generate", "shortDescription": {"text": "Unused endpoint: POST /generate"}, "fullDescription": {"text": "`server/routes/copydesk.routes.ts` declares `POST /generate` 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-ecde770fc934cdb0", "name": "Unused endpoint: GET /spotify/auth-url", "shortDescription": {"text": "Unused endpoint: GET /spotify/auth-url"}, "fullDescription": {"text": "`server/routes/music.routes.ts` declares `GET /spotify/auth-url` 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-fe052376cef4c08d", "name": "Unused endpoint: GET /spotify/callback", "shortDescription": {"text": "Unused endpoint: GET /spotify/callback"}, "fullDescription": {"text": "`server/routes/music.routes.ts` declares `GET /spotify/callback` 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-690df3934651dc96", "name": "Unused endpoint: GET /youtube/auth-url", "shortDescription": {"text": "Unused endpoint: GET /youtube/auth-url"}, "fullDescription": {"text": "`server/routes/music.routes.ts` declares `GET /youtube/auth-url` 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-5392dc52b76e2f84", "name": "Unused endpoint: GET /youtube/callback", "shortDescription": {"text": "Unused endpoint: GET /youtube/callback"}, "fullDescription": {"text": "`server/routes/music.routes.ts` declares `GET /youtube/callback` 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-6ed2cbf7388091d0", "name": "Unused endpoint: GET /youtube/playlists", "shortDescription": {"text": "Unused endpoint: GET /youtube/playlists"}, "fullDescription": {"text": "`server/routes/music.routes.ts` declares `GET /youtube/playlists` 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/18017"}, "properties": {"repository": "RenanRMartins/criativa-desk", "repoUrl": "https://github.com/RenanRMartins/criativa-desk", "branch": "main"}, "results": [{"ruleId": "scanner-cad0c15322ce5de6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/index.ts:51"}, "properties": {"repobilityId": "b4961a877930fd2f", "scanner": "scanner-primary", "fingerprint": "cad0c15322ce5de6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e21736b790986492", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/prisma/seed.ts:7"}, "properties": {"repobilityId": "8cf2b82ab7dd8171", "scanner": "scanner-primary", "fingerprint": "e21736b790986492", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52d5fb0f45adbaa8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/workers/publish.worker.ts:105"}, "properties": {"repobilityId": "7853047d7891eb20", "scanner": "scanner-primary", "fingerprint": "52d5fb0f45adbaa8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ef84b49da62ac39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:70"}, "properties": {"repobilityId": "be1152cdf47927a8", "scanner": "scanner-primary", "fingerprint": "3ef84b49da62ac39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fda1239d3af6ac18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Topbar.tsx:96"}, "properties": {"repobilityId": "32c3331e95ce22bf", "scanner": "scanner-primary", "fingerprint": "fda1239d3af6ac18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdea1499300d66a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/posts/NetworkPreview.tsx:134"}, "properties": {"repobilityId": "da976a8a968df51e", "scanner": "scanner-primary", "fingerprint": "bdea1499300d66a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ddab9e1e9f81289", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/posts/PostCreator.tsx:430"}, "properties": {"repobilityId": "7a464deb5c6f5e97", "scanner": "scanner-primary", "fingerprint": "9ddab9e1e9f81289", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8714ba9240202f06", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/spotlight-card.tsx:92"}, "properties": {"repobilityId": "94660410dca52a10", "scanner": "scanner-primary", "fingerprint": "8714ba9240202f06", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8616c6abeddf3dcf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/music-player.tsx:739"}, "properties": {"repobilityId": "dcf6bdaf9be54a09", "scanner": "scanner-primary", "fingerprint": "8616c6abeddf3dcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dbaa8d1bdf596f81", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SchedulingPage.tsx:196"}, "properties": {"repobilityId": "4ed49793084498d7", "scanner": "scanner-primary", "fingerprint": "dbaa8d1bdf596f81", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e69ca2cacdc6719d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/LibraryPage.tsx:187"}, "properties": {"repobilityId": "af58b372be906408", "scanner": "scanner-primary", "fingerprint": "e69ca2cacdc6719d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d604442e9efde8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/CopyDeskPage.tsx:148"}, "properties": {"repobilityId": "ef610a2d494ab238", "scanner": "scanner-primary", "fingerprint": "9d604442e9efde8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-11ea582c3c2b3b99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/SettingsPage.tsx:268"}, "properties": {"repobilityId": "add0522bc3d8f17c", "scanner": "scanner-primary", "fingerprint": "11ea582c3c2b3b99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76d46b65dd1d2580", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ReportsPage.tsx:225"}, "properties": {"repobilityId": "69686394452cbf79", "scanner": "scanner-primary", "fingerprint": "76d46b65dd1d2580", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9ed6d43254be8df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DashboardPage.tsx:82"}, "properties": {"repobilityId": "5248edf1e73ab3b6", "scanner": "scanner-primary", "fingerprint": "f9ed6d43254be8df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-1e2ae75c86aedcf6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/spotlight-card.tsx:92"}, "properties": {"repobilityId": "4fb19d50e0131d1d", "scanner": "scanner-primary", "fingerprint": "1e2ae75c86aedcf6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/spotlight-card.tsx"}, "region": {"startLine": 92}}}]}, {"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": "0c9c81785e2b7403", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "da63ba4e24dcc4f3", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "a0f804f0a2607a7b", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "0c415bca52bd518b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "9b030c10b3a54417", "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": "46f670edd1a21ceb", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "a10b00680c3c9ce4", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "05d4aa4dae5662c2", "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": "f3f9a732c0edddb2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-799125e286103673", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/social.routes.ts:182"}, "properties": {"repobilityId": "f3fa43fa94dd53ab", "scanner": "scanner-primary", "fingerprint": "799125e286103673", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96f014636a109a8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/routes/music.routes.ts:293"}, "properties": {"repobilityId": "5fbb43b1ec7ff361", "scanner": "scanner-primary", "fingerprint": "96f014636a109a8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c74883d697bb8599", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/layout/NotificationBell.tsx:26"}, "properties": {"repobilityId": "05023a9dde7d22fb", "scanner": "scanner-primary", "fingerprint": "c74883d697bb8599", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50d89f3b2878de8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api.ts:43"}, "properties": {"repobilityId": "25683a7b0e77ff24", "scanner": "scanner-primary", "fingerprint": "50d89f3b2878de8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c09fb41c4d04ce2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useCopyDesk.ts:34"}, "properties": {"repobilityId": "efa5931b50e234e6", "scanner": "scanner-primary", "fingerprint": "c09fb41c4d04ce2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-59c4381a038aaa56", "level": "warning", "message": {"text": "Frontend route `/gravar/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "da007971f90c0806", "scanner": "scanner-primary", "fingerprint": "59c4381a038aaa56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e293ba636aa6f3b5", "level": "warning", "message": {"text": "Frontend route `/aprovar/:token` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "34078a6d080c29e5", "scanner": "scanner-primary", "fingerprint": "e293ba636aa6f3b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cef386312d50c26d", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "7176b9e63e301c9b", "scanner": "scanner-primary", "fingerprint": "cef386312d50c26d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7be36735c436327f", "level": "warning", "message": {"text": "Frontend route `projects` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "72edb6d1e2f77246", "scanner": "scanner-primary", "fingerprint": "7be36735c436327f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-94a3f3179d6ac3c0", "level": "warning", "message": {"text": "Frontend route `projects/:id` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "913fb4c0758987a8", "scanner": "scanner-primary", "fingerprint": "94a3f3179d6ac3c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c8e4000b565c4f77", "level": "warning", "message": {"text": "Frontend route `calendar` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "24fc59df23dca5be", "scanner": "scanner-primary", "fingerprint": "c8e4000b565c4f77", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3179589837f8f615", "level": "warning", "message": {"text": "Frontend route `videos` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "831de38ba1721527", "scanner": "scanner-primary", "fingerprint": "3179589837f8f615", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e7127c97c9e60c5c", "level": "warning", "message": {"text": "Frontend route `approvals` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "27d97d173067b8fa", "scanner": "scanner-primary", "fingerprint": "e7127c97c9e60c5c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e161498aee03299b", "level": "warning", "message": {"text": "Frontend route `scheduling` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "eabbfd478d6c46ae", "scanner": "scanner-primary", "fingerprint": "e161498aee03299b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-27d90135de1aed8a", "level": "warning", "message": {"text": "Frontend route `copydesk` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "0dcde8984c893634", "scanner": "scanner-primary", "fingerprint": "27d90135de1aed8a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aa73de4379656718", "level": "warning", "message": {"text": "Frontend route `trenddesk` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6f811f2058fc9f31", "scanner": "scanner-primary", "fingerprint": "aa73de4379656718", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ec3a5c701e606131", "level": "warning", "message": {"text": "Frontend route `searchdesk` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "10c7d84134a2bf87", "scanner": "scanner-primary", "fingerprint": "ec3a5c701e606131", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2399057a857c1a2a", "level": "warning", "message": {"text": "Frontend route `designdesk` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "57bc833a76632b61", "scanner": "scanner-primary", "fingerprint": "2399057a857c1a2a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3036bbe422669f69", "level": "warning", "message": {"text": "Frontend route `library` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "47ab91ef3466d69f", "scanner": "scanner-primary", "fingerprint": "3036bbe422669f69", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d2153e1710f15466", "level": "warning", "message": {"text": "Frontend route `reports` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "6004b8edc6b1aba1", "scanner": "scanner-primary", "fingerprint": "d2153e1710f15466", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0626b4c2e4efcb82", "level": "warning", "message": {"text": "Frontend route `settings` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "9badda3b3a471962", "scanner": "scanner-primary", "fingerprint": "0626b4c2e4efcb82", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-989e27a4d87d10ef", "level": "error", "message": {"text": "Dangling fetch: POST https://api.canva.com/rest/v1/oauth/token (server/routes/canva.routes.ts:26)"}, "properties": {"repobilityId": "0259df2b5c52bde7", "scanner": "scanner-primary", "fingerprint": "989e27a4d87d10ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8882ac446e83a145", "level": "error", "message": {"text": "Dangling fetch: POST https://api.canva.com/rest/v1/oauth/token (server/routes/canva.routes.ts:82)"}, "properties": {"repobilityId": "0722cf5e4453b6d5", "scanner": "scanner-primary", "fingerprint": "8882ac446e83a145", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e402ad615224de2", "level": "error", "message": {"text": "Dangling fetch: GET https://api.canva.com/rest/v1/users/me/profile (server/routes/canva.routes.ts:100)"}, "properties": {"repobilityId": "7a6cc15b5239c465", "scanner": "scanner-primary", "fingerprint": "9e402ad615224de2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-93466f3da00d5abb", "level": "error", "message": {"text": "Dangling fetch: POST https://api.canva.com/rest/v1/designs (server/routes/canva.routes.ts:145)"}, "properties": {"repobilityId": "50839f3a126a07f7", "scanner": "scanner-primary", "fingerprint": "93466f3da00d5abb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a42643d59622c0c7", "level": "error", "message": {"text": "Dangling fetch: POST https://www.linkedin.com/oauth/v2/accessToken (server/routes/social.routes.ts:168)"}, "properties": {"repobilityId": "58d4e34eab22b923", "scanner": "scanner-primary", "fingerprint": "a42643d59622c0c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc83110d6dd7f3d2", "level": "error", "message": {"text": "Dangling fetch: GET https://api.linkedin.com/v2/userinfo (server/routes/social.routes.ts:182)"}, "properties": {"repobilityId": "926edea95681beb5", "scanner": "scanner-primary", "fingerprint": "dc83110d6dd7f3d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f0848ef63a336a9f", "level": "error", "message": {"text": "Dangling fetch: POST https://open.tiktokapis.com/v2/oauth/token/ (server/routes/social.routes.ts:295)"}, "properties": {"repobilityId": "0547d57d36ea97bc", "scanner": "scanner-primary", "fingerprint": "f0848ef63a336a9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c6d4907a61c8a07c", "level": "error", "message": {"text": "Dangling fetch: GET https://open.tiktokapis.com/v2/user/info/?fields=open_id,display_name,avatar_url (server/routes/social.routes.ts:309)"}, "properties": {"repobilityId": "94a60a23ccb9fe2d", "scanner": "scanner-primary", "fingerprint": "c6d4907a61c8a07c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-57762d8b45166194", "level": "error", "message": {"text": "Dangling fetch: POST https://accounts.spotify.com/api/token (server/routes/music.routes.ts:26)"}, "properties": {"repobilityId": "48b36badc1faddd5", "scanner": "scanner-primary", "fingerprint": "57762d8b45166194", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-64fb3c0a6e410085", "level": "error", "message": {"text": "Dangling fetch: POST https://accounts.spotify.com/api/token (server/routes/music.routes.ts:76)"}, "properties": {"repobilityId": "f420455d3b72ea78", "scanner": "scanner-primary", "fingerprint": "64fb3c0a6e410085", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5434799e213bf22c", "level": "error", "message": {"text": "Dangling fetch: GET https://api.spotify.com/v1/me (server/routes/music.routes.ts:92)"}, "properties": {"repobilityId": "7fe5d4180d4c33bf", "scanner": "scanner-primary", "fingerprint": "5434799e213bf22c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f3b56b87483b675e", "level": "error", "message": {"text": "Dangling fetch: GET https://api.spotify.com/v1/me/player (server/routes/music.routes.ts:293)"}, "properties": {"repobilityId": "f8b4725682673030", "scanner": "scanner-primary", "fingerprint": "f3b56b87483b675e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10a6852f61ee8303", "level": "error", "message": {"text": "Dangling fetch: GET https://api.spotify.com/v1${path} (server/routes/music.routes.ts:358)"}, "properties": {"repobilityId": "28101792f054ffae", "scanner": "scanner-primary", "fingerprint": "10a6852f61ee8303", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6dd51ad06457a099", "level": "error", "message": {"text": "Dangling fetch: POST /api/copydesk/generate (src/hooks/useCopyDesk.ts:34)"}, "properties": {"repobilityId": "861f2675f5b5692a", "scanner": "scanner-primary", "fingerprint": "6dd51ad06457a099", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "d8e558fba67fb75c", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-728e92394c568abf", "level": "note", "message": {"text": "Unused endpoint: USE /api/projects"}, "properties": {"repobilityId": "7c906a78a933ff82", "scanner": "scanner-primary", "fingerprint": "728e92394c568abf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1be44d2cc9b65154", "level": "note", "message": {"text": "Unused endpoint: USE /api/posts"}, "properties": {"repobilityId": "bfa402d97645c466", "scanner": "scanner-primary", "fingerprint": "1be44d2cc9b65154", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-241fd5d78ee6021b", "level": "note", "message": {"text": "Unused endpoint: USE /api/approvals"}, "properties": {"repobilityId": "3743b6bb8db2c5ac", "scanner": "scanner-primary", "fingerprint": "241fd5d78ee6021b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-07959a16254f0ef0", "level": "note", "message": {"text": "Unused endpoint: USE /api/professionals"}, "properties": {"repobilityId": "cfeef37e181c7863", "scanner": "scanner-primary", "fingerprint": "07959a16254f0ef0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f996aaabf32fbc50", "level": "note", "message": {"text": "Unused endpoint: USE /api/copydesk"}, "properties": {"repobilityId": "4e6238d2a3def96f", "scanner": "scanner-primary", "fingerprint": "f996aaabf32fbc50", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a8b7932f72b92f", "level": "note", "message": {"text": "Unused endpoint: USE /api/notifications"}, "properties": {"repobilityId": "6e3bdd9d468a1fca", "scanner": "scanner-primary", "fingerprint": "c3a8b7932f72b92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5bda8f793f014b40", "level": "note", "message": {"text": "Unused endpoint: USE /api/video-tasks"}, "properties": {"repobilityId": "f39d09d76edae169", "scanner": "scanner-primary", "fingerprint": "5bda8f793f014b40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33a167a4af819d31", "level": "note", "message": {"text": "Unused endpoint: USE /api/scheduling"}, "properties": {"repobilityId": "b5cd15d995909b75", "scanner": "scanner-primary", "fingerprint": "33a167a4af819d31", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-758beedf52b76fb9", "level": "note", "message": {"text": "Unused endpoint: USE /api/trenddesk"}, "properties": {"repobilityId": "ddce01ed556a9c4a", "scanner": "scanner-primary", "fingerprint": "758beedf52b76fb9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2bf485d42198d7b3", "level": "note", "message": {"text": "Unused endpoint: USE /api/searchdesk"}, "properties": {"repobilityId": "b0e90c56eaf32058", "scanner": "scanner-primary", "fingerprint": "2bf485d42198d7b3", "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": "57233dd5e2516181", "scanner": "scanner-primary", "fingerprint": "6f643fbf10ab5803", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec940d1f587fece3", "level": "note", "message": {"text": "Unused endpoint: USE /api/social"}, "properties": {"repobilityId": "4bdcd77d59c5c0f0", "scanner": "scanner-primary", "fingerprint": "ec940d1f587fece3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c18e12167939aa3", "level": "note", "message": {"text": "Unused endpoint: USE /api/music"}, "properties": {"repobilityId": "08c0ef2937a9894d", "scanner": "scanner-primary", "fingerprint": "7c18e12167939aa3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b0da4a79d6adbcf3", "level": "note", "message": {"text": "Unused endpoint: USE /api/canva"}, "properties": {"repobilityId": "20a09ec300a2b677", "scanner": "scanner-primary", "fingerprint": "b0da4a79d6adbcf3", "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": "779ee59986e3e7ae", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca6aab7a934627bf", "level": "note", "message": {"text": "Unused endpoint: GET /auth-url"}, "properties": {"repobilityId": "2c3e8c4ef59d271b", "scanner": "scanner-primary", "fingerprint": "ca6aab7a934627bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdfb578618cf2542", "level": "note", "message": {"text": "Unused endpoint: GET /callback"}, "properties": {"repobilityId": "9780867f96108aa7", "scanner": "scanner-primary", "fingerprint": "cdfb578618cf2542", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a3215998554bbee8", "level": "note", "message": {"text": "Unused endpoint: POST /create-design"}, "properties": {"repobilityId": "2b660207da42d85d", "scanner": "scanner-primary", "fingerprint": "a3215998554bbee8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b30f4c0994a30b4", "level": "note", "message": {"text": "Unused endpoint: DELETE /"}, "properties": {"repobilityId": "584ac5e05f770f98", "scanner": "scanner-primary", "fingerprint": "3b30f4c0994a30b4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "26181f9659d351c8", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "c4c4942b7996e2cf", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "5ca2dbe36fe86ec5", "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": "4a7b2ea3d78ab5fa", "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": "2dfcfbf667d73a5d", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed4d2d73b6897c8d", "level": "note", "message": {"text": "Unused endpoint: PATCH /read-all"}, "properties": {"repobilityId": "4286ed3872a72ec7", "scanner": "scanner-primary", "fingerprint": "ed4d2d73b6897c8d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afd4ed162f8ab9b0", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id/read"}, "properties": {"repobilityId": "2f8c7445aaeac032", "scanner": "scanner-primary", "fingerprint": "afd4ed162f8ab9b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eb9222c6f85dd10c", "level": "note", "message": {"text": "Unused endpoint: GET /public/:token"}, "properties": {"repobilityId": "fe62084424071a7f", "scanner": "scanner-primary", "fingerprint": "eb9222c6f85dd10c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c90d5da7969fc5df", "level": "note", "message": {"text": "Unused endpoint: POST /public/:token/action"}, "properties": {"repobilityId": "ffea41d526603cec", "scanner": "scanner-primary", "fingerprint": "c90d5da7969fc5df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eef74b9d4c5ad4a4", "level": "note", "message": {"text": "Unused endpoint: POST /:postId/publish"}, "properties": {"repobilityId": "ec1ac454627efae8", "scanner": "scanner-primary", "fingerprint": "eef74b9d4c5ad4a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-748d94027e0682a7", "level": "note", "message": {"text": "Unused endpoint: DELETE /:postId"}, "properties": {"repobilityId": "3283cfb56c954d58", "scanner": "scanner-primary", "fingerprint": "748d94027e0682a7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-304b6f2b403d93f7", "level": "note", "message": {"text": "Unused endpoint: POST /register"}, "properties": {"repobilityId": "ee5558f751695c11", "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": "33becdabcd50c17f", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea575b61c121b733", "level": "note", "message": {"text": "Unused endpoint: PATCH /me"}, "properties": {"repobilityId": "3a0906798ebd8bd9", "scanner": "scanner-primary", "fingerprint": "ea575b61c121b733", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a3a46a6c7e4b112b", "level": "note", "message": {"text": "Unused endpoint: GET /google/auth-url"}, "properties": {"repobilityId": "cc9835abe0ff7444", "scanner": "scanner-primary", "fingerprint": "a3a46a6c7e4b112b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-424854ab10436e86", "level": "note", "message": {"text": "Unused endpoint: GET /google/callback"}, "properties": {"repobilityId": "4dd8141887c02017", "scanner": "scanner-primary", "fingerprint": "424854ab10436e86", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a11e11a08a2c8a12", "level": "note", "message": {"text": "Unused endpoint: GET /linkedin/auth-url"}, "properties": {"repobilityId": "ea8df9d85abc6841", "scanner": "scanner-primary", "fingerprint": "a11e11a08a2c8a12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-822883a6ab6a0060", "level": "note", "message": {"text": "Unused endpoint: GET /linkedin/callback"}, "properties": {"repobilityId": "67930dcb40eb4e67", "scanner": "scanner-primary", "fingerprint": "822883a6ab6a0060", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f5e200a0508c0125", "level": "note", "message": {"text": "Unused endpoint: GET /meta/auth-url"}, "properties": {"repobilityId": "c2953d87e66eb508", "scanner": "scanner-primary", "fingerprint": "f5e200a0508c0125", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23c37b5be4bb4c3a", "level": "note", "message": {"text": "Unused endpoint: GET /meta/callback"}, "properties": {"repobilityId": "ed127d5ff8a9c8de", "scanner": "scanner-primary", "fingerprint": "23c37b5be4bb4c3a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-daaf15783f6151d0", "level": "note", "message": {"text": "Unused endpoint: GET /tiktok/auth-url"}, "properties": {"repobilityId": "f80280649b1251a0", "scanner": "scanner-primary", "fingerprint": "daaf15783f6151d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b20f46635bce03e7", "level": "note", "message": {"text": "Unused endpoint: GET /clip/callback"}, "properties": {"repobilityId": "a02c1de2fb9f17d0", "scanner": "scanner-primary", "fingerprint": "b20f46635bce03e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-21c7ff7b8ef22c44", "level": "note", "message": {"text": "Unused endpoint: GET /accounts"}, "properties": {"repobilityId": "b412dfc087427976", "scanner": "scanner-primary", "fingerprint": "21c7ff7b8ef22c44", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d2a37c2e855bff00", "level": "note", "message": {"text": "Unused endpoint: DELETE /accounts/:id"}, "properties": {"repobilityId": "91c811ee06487167", "scanner": "scanner-primary", "fingerprint": "d2a37c2e855bff00", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-970eb92d6ec2bfaa", "level": "note", "message": {"text": "Unused endpoint: POST /generate"}, "properties": {"repobilityId": "3c05b69c8c48b69a", "scanner": "scanner-primary", "fingerprint": "970eb92d6ec2bfaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ecde770fc934cdb0", "level": "note", "message": {"text": "Unused endpoint: GET /spotify/auth-url"}, "properties": {"repobilityId": "5a34339e120d94b4", "scanner": "scanner-primary", "fingerprint": "ecde770fc934cdb0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe052376cef4c08d", "level": "note", "message": {"text": "Unused endpoint: GET /spotify/callback"}, "properties": {"repobilityId": "10c892f314f35b72", "scanner": "scanner-primary", "fingerprint": "fe052376cef4c08d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-690df3934651dc96", "level": "note", "message": {"text": "Unused endpoint: GET /youtube/auth-url"}, "properties": {"repobilityId": "ffcf306507908141", "scanner": "scanner-primary", "fingerprint": "690df3934651dc96", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5392dc52b76e2f84", "level": "note", "message": {"text": "Unused endpoint: GET /youtube/callback"}, "properties": {"repobilityId": "ef1f94ab476fa81f", "scanner": "scanner-primary", "fingerprint": "5392dc52b76e2f84", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ed2cbf7388091d0", "level": "note", "message": {"text": "Unused endpoint: GET /youtube/playlists"}, "properties": {"repobilityId": "f98777053407def2", "scanner": "scanner-primary", "fingerprint": "6ed2cbf7388091d0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}