{"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-20717d2880ef8051", "name": "Icon-only button without accessible name \u2014 client/src/pages/public/VendorDetail.js:161", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/pages/public/VendorDetail.js:161"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-73e5b0971b4236d6", "name": "Icon-only button without accessible name \u2014 client/src/pages/public/TestHome4.js:541", "shortDescription": {"text": "Icon-only button without accessible name \u2014 client/src/pages/public/TestHome4.js:541"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8cbf91616efcc33", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/pages/public/TestHome4.js:813", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/pages/public/TestHome4.js:813"}, "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-9027021026f8f9e2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/pages/public/BlogPost.js:94", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/pages/public/BlogPost.js:94"}, "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-0b77893b5f984fcf", "name": "Stray `console.log` in TS/JS \u2014 server/index.js:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/index.js:54"}, "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-81d8ca450ab65c5e", "name": "Stray `console.log` in TS/JS \u2014 server/models/db.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/models/db.js:17"}, "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-8334a8cb0b126078", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/import-all-vendor-images.js:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/import-all-vendor-images.js:55"}, "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-9051a9b120984172", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/compress-existing-images.js:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/compress-existing-images.js:48"}, "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-78352fc47bcfb173", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/send-vendor-launch-email.js:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/send-vendor-launch-email.js:130"}, "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-adfad1407e8b3f3c", "name": "Stray `console.log` in TS/JS \u2014 server/scripts/import-vendor-images.js:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/import-vendor-images.js:57"}, "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-77bc208feea5cc0c", "name": "Stray `console.log` in TS/JS \u2014 server/services/email.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/services/email.js:33"}, "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-324df21d73158aed", "name": "Insecure pattern 'dangerous_innerhtml' in client/src/pages/public/TestHome4.js:813", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/pages/public/TestHome4.js:813"}, "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-28fb3557e194edee", "name": "Insecure pattern 'dangerous_innerhtml' in client/src/pages/public/BlogPost.js:94", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/pages/public/BlogPost.js:94"}, "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-770356ec44745686", "name": "Insecure pattern 'local_storage_auth_token' in client/src/context/AuthContext.js:42", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/context/AuthContext.js:42"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-95162127dc92435d", "name": "Insecure pattern 'cors_wildcard' in server/index.js:9", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in server/index.js:9"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6663a28defdefc81", "name": "Very large file: client/src/pages/admin/VendorDetail.js (1486 lines)", "shortDescription": {"text": "Very large file: client/src/pages/admin/VendorDetail.js (1486 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "4 test file(s) for 60 source file(s) (ratio 0.07). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 53 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 32 placeholder/mock markers across 11 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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. 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-c7daeece5a286138", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/email.js:679", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/email.js:679"}, "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: `ADMIN_SETUP_KEY`, `RESEND_API_KEY`. 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-060dda09f46f55c8", "name": "Frontend route `vendors` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `vendors` has no Link/navigate to it \u2014 client/src/App.js"}, "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-964af7a96dc3c4ba", "name": "Frontend route `vendors/:id` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `vendors/:id` has no Link/navigate to it \u2014 client/src/App.js"}, "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-cd0588b106ccea23", "name": "Frontend route `map` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `map` has no Link/navigate to it \u2014 client/src/App.js"}, "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-7c6ad276423b030c", "name": "Frontend route `apply` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `apply` has no Link/navigate to it \u2014 client/src/App.js"}, "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-e92e7d26200a70a4", "name": "Frontend route `apply/thank-you` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `apply/thank-you` has no Link/navigate to it \u2014 client/src/App.js"}, "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-d5033816ea4b8c00", "name": "Frontend route `become-vendor` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `become-vendor` has no Link/navigate to it \u2014 client/src/App.js"}, "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-cf8525a433349bff", "name": "Frontend route `find-us` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `find-us` has no Link/navigate to it \u2014 client/src/App.js"}, "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-53aa002e5bd64b4f", "name": "Frontend route `get-involved` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `get-involved` has no Link/navigate to it \u2014 client/src/App.js"}, "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-d7c24c1a079de53a", "name": "Frontend route `contact` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `contact` has no Link/navigate to it \u2014 client/src/App.js"}, "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-b142ea862a3b95e4", "name": "Frontend route `blog` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `blog` has no Link/navigate to it \u2014 client/src/App.js"}, "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-a6baac6b726dc3c4", "name": "Frontend route `blog/:slug` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `blog/:slug` has no Link/navigate to it \u2014 client/src/App.js"}, "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-e7db402f2c437501", "name": "Frontend route `sponsor` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `sponsor` has no Link/navigate to it \u2014 client/src/App.js"}, "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-a9646d03dca00252", "name": "Frontend route `/sponsor/flyer` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `/sponsor/flyer` has no Link/navigate to it \u2014 client/src/App.js"}, "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-81d370dc7f134c1c", "name": "Frontend route `/test-home` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `/test-home` has no Link/navigate to it \u2014 client/src/App.js"}, "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-01e5182b03e99923", "name": "Frontend route `/test-home-2` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `/test-home-2` has no Link/navigate to it \u2014 client/src/App.js"}, "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-33955cfbfa13ee5a", "name": "Frontend route `/test-home-3` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `/test-home-3` has no Link/navigate to it \u2014 client/src/App.js"}, "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-0bbb4b27c67f0ee7", "name": "Frontend route `/setup-password` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `/setup-password` has no Link/navigate to it \u2014 client/src/App.js"}, "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-890486db7638d2a3", "name": "Frontend route `/vendor` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `/vendor` has no Link/navigate to it \u2014 client/src/App.js"}, "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-c64f3f2da3174d80", "name": "Frontend route `dashboard` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 client/src/App.js"}, "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-76fedb3b9fce0a46", "name": "Frontend route `schedule` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `schedule` has no Link/navigate to it \u2014 client/src/App.js"}, "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-ed9979388035bfda", "name": "Frontend route `payments` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `payments` has no Link/navigate to it \u2014 client/src/App.js"}, "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-dbc0fdb2ec74ecb5", "name": "Frontend route `profile` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 client/src/App.js"}, "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-8aad3f751f913ec7", "name": "Frontend route `documents` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `documents` has no Link/navigate to it \u2014 client/src/App.js"}, "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-13f12f0842717dd7", "name": "Frontend route `dates` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `dates` has no Link/navigate to it \u2014 client/src/App.js"}, "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-538bdc2355a62e59", "name": "Frontend route `announcements` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `announcements` has no Link/navigate to it \u2014 client/src/App.js"}, "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-e356727f82d365b2", "name": "Frontend route `maps` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `maps` has no Link/navigate to it \u2014 client/src/App.js"}, "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-94310e61af4ae484", "name": "Frontend route `maps/builder` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `maps/builder` has no Link/navigate to it \u2014 client/src/App.js"}, "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-cf3a7f26af9c257a", "name": "Frontend route `maps/builder/:dateId` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `maps/builder/:dateId` has no Link/navigate to it \u2014 client/src/App.js"}, "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-a027500fb1651f91", "name": "Frontend route `music-applications` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `music-applications` has no Link/navigate to it \u2014 client/src/App.js"}, "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-2698905e62f65345", "name": "Frontend route `music-schedule` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `music-schedule` has no Link/navigate to it \u2014 client/src/App.js"}, "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-80dde7a030454a79", "name": "Frontend route `blog/new` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `blog/new` has no Link/navigate to it \u2014 client/src/App.js"}, "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-ba7af08d7b607d99", "name": "Frontend route `blog/:id/edit` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `blog/:id/edit` has no Link/navigate to it \u2014 client/src/App.js"}, "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-52e66a66c1c44245", "name": "Frontend route `shoutouts` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `shoutouts` has no Link/navigate to it \u2014 client/src/App.js"}, "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-f6dd23ccd4ba8b04", "name": "Frontend route `contact-submissions` has no Link/navigate to it \u2014 client/src/App.js", "shortDescription": {"text": "Frontend route `contact-submissions` has no Link/navigate to it \u2014 client/src/App.js"}, "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-42abbac0b67a7be0", "name": "Dangling fetch: POST https://api.resend.com/audiences/${VENDORS_SEGMENT_ID}/contacts (server/services/email.js:658)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/audiences/${VENDORS_SEGMENT_ID}/contacts (server/services/email.js:658)"}, "fullDescription": {"text": "`server/services/email.js:658` calls `POST https://api.resend.com/audiences/${VENDORS_SEGMENT_ID}/contacts` 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.resend.com/audiences/<p>/contacts`\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-35130118b8ad1438", "name": "Dangling fetch: GET https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts (server/services/email.js:673)", "shortDescription": {"text": "Dangling fetch: GET https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts (server/services/email.js:673)"}, "fullDescription": {"text": "`server/services/email.js:673` calls `GET https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts` 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.resend.com/audiences/<p>/contacts`\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-59379a52d466f40e", "name": "Dangling fetch: DELETE https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts/${contact.id} (server/services/em", "shortDescription": {"text": "Dangling fetch: DELETE https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts/${contact.id} (server/services/email.js:679)"}, "fullDescription": {"text": "`server/services/email.js:679` calls `DELETE https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts/${contact.id}` 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.resend.com/audiences/<p>/contacts/<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-61a64e02e9b19fe0", "name": "Unused endpoint: GET /music/admin/schedule-builder", "shortDescription": {"text": "Unused endpoint: GET /music/admin/schedule-builder"}, "fullDescription": {"text": "`client/src/pages/admin/MusicScheduleBuilder.js` declares `GET /music/admin/schedule-builder` 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-eae64f8b394e407d", "name": "Unused endpoint: POST /music/admin/schedule/assign", "shortDescription": {"text": "Unused endpoint: POST /music/admin/schedule/assign"}, "fullDescription": {"text": "`client/src/pages/admin/MusicScheduleBuilder.js` declares `POST /music/admin/schedule/assign` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ac4f2a71d0a333f", "name": "Unused endpoint: GET /contact/submissions", "shortDescription": {"text": "Unused endpoint: GET /contact/submissions"}, "fullDescription": {"text": "`client/src/pages/admin/ContactSubmissions.js` declares `GET /contact/submissions` 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-80a4ab546dc16e5a", "name": "Unused endpoint: POST /blog/admin", "shortDescription": {"text": "Unused endpoint: POST /blog/admin"}, "fullDescription": {"text": "`client/src/pages/admin/BlogEditor.js` declares `POST /blog/admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b6dfce241343aed", "name": "Unused endpoint: GET /dates", "shortDescription": {"text": "Unused endpoint: GET /dates"}, "fullDescription": {"text": "`client/src/pages/admin/Dates.js` declares `GET /dates` 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-0d3e1fa3770a27c2", "name": "Unused endpoint: GET /music-applications", "shortDescription": {"text": "Unused endpoint: GET /music-applications"}, "fullDescription": {"text": "`client/src/pages/admin/MusicApplications.js` declares `GET /music-applications` 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-53d1aaeabebcbf7c", "name": "Unused endpoint: POST /music-applications", "shortDescription": {"text": "Unused endpoint: POST /music-applications"}, "fullDescription": {"text": "`client/src/pages/admin/MusicApplications.js` declares `POST /music-applications` 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-078706f38d5e59e2", "name": "Unused endpoint: GET /settings/map_config", "shortDescription": {"text": "Unused endpoint: GET /settings/map_config"}, "fullDescription": {"text": "`client/src/pages/admin/MapBuilder.js` declares `GET /settings/map_config` 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-d8fe843c46e9a3b2", "name": "Unused endpoint: GET /maps/builder/dates/list", "shortDescription": {"text": "Unused endpoint: GET /maps/builder/dates/list"}, "fullDescription": {"text": "`client/src/pages/admin/MapBuilder.js` declares `GET /maps/builder/dates/list` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef27697fa2cdb316", "name": "Unused endpoint: GET /admin/vendors", "shortDescription": {"text": "Unused endpoint: GET /admin/vendors"}, "fullDescription": {"text": "`client/src/pages/admin/MapBuilder.js` declares `GET /admin/vendors` 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-335ea7d010dcc960", "name": "Unused endpoint: POST /maps/waitlist", "shortDescription": {"text": "Unused endpoint: POST /maps/waitlist"}, "fullDescription": {"text": "`client/src/pages/admin/MapBuilder.js` declares `POST /maps/waitlist` 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-377124e01e18c1ad", "name": "Unused endpoint: PUT /maps/assign", "shortDescription": {"text": "Unused endpoint: PUT /maps/assign"}, "fullDescription": {"text": "`client/src/pages/admin/MapBuilder.js` declares `PUT /maps/assign` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3deebe326595ed6", "name": "Unused endpoint: GET /maps", "shortDescription": {"text": "Unused endpoint: GET /maps"}, "fullDescription": {"text": "`client/src/pages/admin/Maps.js` declares `GET /maps` 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-9d967c428e80f8fd", "name": "Unused endpoint: POST /maps", "shortDescription": {"text": "Unused endpoint: POST /maps"}, "fullDescription": {"text": "`client/src/pages/admin/Maps.js` declares `POST /maps` 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-01d9f02ef7393912", "name": "Unused endpoint: GET /admin/vendor-shoutouts", "shortDescription": {"text": "Unused endpoint: GET /admin/vendor-shoutouts"}, "fullDescription": {"text": "`client/src/pages/admin/Vendors.js` declares `GET /admin/vendor-shoutouts` 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-a5474dc2dc90c473", "name": "Unused endpoint: POST /admin/vendor-shoutouts", "shortDescription": {"text": "Unused endpoint: POST /admin/vendor-shoutouts"}, "fullDescription": {"text": "`client/src/pages/admin/VendorShoutouts.js` declares `POST /admin/vendor-shoutouts` 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-bdc859f19aa99cb2", "name": "Unused endpoint: GET /dates/", "shortDescription": {"text": "Unused endpoint: GET /dates/"}, "fullDescription": {"text": "`client/src/pages/admin/VendorDetail.js` declares `GET /dates/` 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-bc1bc94bf9c8de41", "name": "Unused endpoint: POST /admin/bookings", "shortDescription": {"text": "Unused endpoint: POST /admin/bookings"}, "fullDescription": {"text": "`client/src/pages/admin/VendorDetail.js` declares `POST /admin/bookings` 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-2ec115d7bc0c8434", "name": "Unused endpoint: POST /admin/bookings/review", "shortDescription": {"text": "Unused endpoint: POST /admin/bookings/review"}, "fullDescription": {"text": "`client/src/pages/admin/VendorDetail.js` declares `POST /admin/bookings/review` 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-e5006457a4f69d46", "name": "Unused endpoint: POST /payments", "shortDescription": {"text": "Unused endpoint: POST /payments"}, "fullDescription": {"text": "`client/src/pages/admin/VendorDetail.js` declares `POST /payments` 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-ec8f7efc8437aca5", "name": "Unused endpoint: GET /payments", "shortDescription": {"text": "Unused endpoint: GET /payments"}, "fullDescription": {"text": "`client/src/pages/admin/Payments.js` declares `GET /payments` 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-e7ba47bcd13e52f6", "name": "Unused endpoint: GET /blog/admin/all", "shortDescription": {"text": "Unused endpoint: GET /blog/admin/all"}, "fullDescription": {"text": "`client/src/pages/admin/Blog.js` declares `GET /blog/admin/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-67399ce5ca80da12", "name": "Unused endpoint: GET /announcements/all", "shortDescription": {"text": "Unused endpoint: GET /announcements/all"}, "fullDescription": {"text": "`client/src/pages/admin/Announcements.js` declares `GET /announcements/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-5e27c360ebee473b", "name": "Unused endpoint: POST /announcements", "shortDescription": {"text": "Unused endpoint: POST /announcements"}, "fullDescription": {"text": "`client/src/pages/admin/Announcements.js` declares `POST /announcements` 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-c988562b1c995602", "name": "Unused endpoint: GET /admin/date-requests", "shortDescription": {"text": "Unused endpoint: GET /admin/date-requests"}, "fullDescription": {"text": "`client/src/pages/admin/Dashboard.js` declares `GET /admin/date-requests` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8e3b1ec38031f42", "name": "Unused endpoint: POST /contact", "shortDescription": {"text": "Unused endpoint: POST /contact"}, "fullDescription": {"text": "`client/src/pages/public/Contact.js` declares `POST /contact` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8571a34a8aa2731", "name": "Unused endpoint: POST /applications/submit", "shortDescription": {"text": "Unused endpoint: POST /applications/submit"}, "fullDescription": {"text": "`client/src/pages/public/Apply.js` declares `POST /applications/submit` 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-04c1ccd33661edd2", "name": "Unused endpoint: GET /vendors/public", "shortDescription": {"text": "Unused endpoint: GET /vendors/public"}, "fullDescription": {"text": "`client/src/pages/public/Vendors.js` declares `GET /vendors/public` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5dc9d4af696cdaa", "name": "Unused endpoint: GET /blog", "shortDescription": {"text": "Unused endpoint: GET /blog"}, "fullDescription": {"text": "`client/src/pages/public/Blog.js` declares `GET /blog` 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-765e97a9c68d00f5", "name": "Unused endpoint: GET /vendors/public?shuffle=true", "shortDescription": {"text": "Unused endpoint: GET /vendors/public?shuffle=true"}, "fullDescription": {"text": "`client/src/pages/public/TestHome4.js` declares `GET /vendors/public?shuffle=true` 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-395c7b4f5b58be00", "name": "Unused endpoint: GET /blog/featured", "shortDescription": {"text": "Unused endpoint: GET /blog/featured"}, "fullDescription": {"text": "`client/src/pages/public/TestHome4.js` declares `GET /blog/featured` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27b3308ee5e8c28f", "name": "Unused endpoint: GET /music/schedule/upcoming?limit=12", "shortDescription": {"text": "Unused endpoint: GET /music/schedule/upcoming?limit=12"}, "fullDescription": {"text": "`client/src/pages/public/TestHome4.js` declares `GET /music/schedule/upcoming?limit=12` 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-ac42422b23e45104", "name": "Unused endpoint: GET /auth/me", "shortDescription": {"text": "Unused endpoint: GET /auth/me"}, "fullDescription": {"text": "`client/src/context/AuthContext.js` declares `GET /auth/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-cd430d8889e2b6b8", "name": "Unused endpoint: USE /api/payments/webhook", "shortDescription": {"text": "Unused endpoint: USE /api/payments/webhook"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/payments/webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bc898b3b7565990", "name": "Unused endpoint: USE /uploads", "shortDescription": {"text": "Unused endpoint: USE /uploads"}, "fullDescription": {"text": "`server/index.js` declares `USE /uploads` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/auth` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cede1ab3aedb7584", "name": "Unused endpoint: USE /api/vendors", "shortDescription": {"text": "Unused endpoint: USE /api/vendors"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/vendors` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-95fe3034b114cb1f", "name": "Unused endpoint: USE /api/dates", "shortDescription": {"text": "Unused endpoint: USE /api/dates"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/dates` 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-7222c1377806c38f", "name": "Unused endpoint: USE /api/announcements", "shortDescription": {"text": "Unused endpoint: USE /api/announcements"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/announcements` 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-f8242ba07247d2f8", "name": "Unused endpoint: USE /api/payments", "shortDescription": {"text": "Unused endpoint: USE /api/payments"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/payments` 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-629e8f357f698e1b", "name": "Unused endpoint: USE /api/maps", "shortDescription": {"text": "Unused endpoint: USE /api/maps"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/maps` 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-8ab4f46cc4c774c3", "name": "Unused endpoint: USE /api/applications", "shortDescription": {"text": "Unused endpoint: USE /api/applications"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/applications` 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-5d76eec8f5cd2df3", "name": "Unused endpoint: USE /api/music-applications", "shortDescription": {"text": "Unused endpoint: USE /api/music-applications"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/music-applications` 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-5ba7770a6ceafb13", "name": "Unused endpoint: USE /api/blog", "shortDescription": {"text": "Unused endpoint: USE /api/blog"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/blog` 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.js` 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-8ca4664c9cda1cd6", "name": "Unused endpoint: USE /api/settings", "shortDescription": {"text": "Unused endpoint: USE /api/settings"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/settings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d3d2df7bfb761887", "name": "Unused endpoint: USE /api/contact", "shortDescription": {"text": "Unused endpoint: USE /api/contact"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/contact` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86bdbae364049539", "name": "Unused endpoint: USE /api/sitemap.xml", "shortDescription": {"text": "Unused endpoint: USE /api/sitemap.xml"}, "fullDescription": {"text": "`server/index.js` declares `USE /api/sitemap.xml` 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.js` 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}}]}}, "automationDetails": {"id": "repobility/19960"}, "properties": {"repository": "social-blip/Market-on-main", "repoUrl": "https://github.com/social-blip/Market-on-main", "branch": "main"}, "results": [{"ruleId": "scanner-20717d2880ef8051", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/pages/public/VendorDetail.js:161"}, "properties": {"repobilityId": "3bc3e19a5bfe0e95", "scanner": "scanner-primary", "fingerprint": "20717d2880ef8051", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-73e5b0971b4236d6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 client/src/pages/public/TestHome4.js:541"}, "properties": {"repobilityId": "3563e3760c5177c9", "scanner": "scanner-primary", "fingerprint": "73e5b0971b4236d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a8cbf91616efcc33", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/pages/public/TestHome4.js:813"}, "properties": {"repobilityId": "0ba5c627948de55e", "scanner": "scanner-primary", "fingerprint": "a8cbf91616efcc33", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9027021026f8f9e2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 client/src/pages/public/BlogPost.js:94"}, "properties": {"repobilityId": "c515b011a961b241", "scanner": "scanner-primary", "fingerprint": "9027021026f8f9e2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-0b77893b5f984fcf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/index.js:54"}, "properties": {"repobilityId": "21e6b3de2b3dd856", "scanner": "scanner-primary", "fingerprint": "0b77893b5f984fcf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81d8ca450ab65c5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/models/db.js:17"}, "properties": {"repobilityId": "da8d3901a468a015", "scanner": "scanner-primary", "fingerprint": "81d8ca450ab65c5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8334a8cb0b126078", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/import-all-vendor-images.js:55"}, "properties": {"repobilityId": "9204fd0fb179a80d", "scanner": "scanner-primary", "fingerprint": "8334a8cb0b126078", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9051a9b120984172", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/compress-existing-images.js:48"}, "properties": {"repobilityId": "509d46b03e69a1eb", "scanner": "scanner-primary", "fingerprint": "9051a9b120984172", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78352fc47bcfb173", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/send-vendor-launch-email.js:130"}, "properties": {"repobilityId": "26f4eab5b6e92e56", "scanner": "scanner-primary", "fingerprint": "78352fc47bcfb173", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-adfad1407e8b3f3c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/scripts/import-vendor-images.js:57"}, "properties": {"repobilityId": "62ccd64a71167556", "scanner": "scanner-primary", "fingerprint": "adfad1407e8b3f3c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77bc208feea5cc0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/services/email.js:33"}, "properties": {"repobilityId": "f8581150beb6b1ff", "scanner": "scanner-primary", "fingerprint": "77bc208feea5cc0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-324df21d73158aed", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/pages/public/TestHome4.js:813"}, "properties": {"repobilityId": "19cb384468b5d1a1", "scanner": "scanner-primary", "fingerprint": "324df21d73158aed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/pages/public/TestHome4.js"}, "region": {"startLine": 813}}}]}, {"ruleId": "scanner-28fb3557e194edee", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in client/src/pages/public/BlogPost.js:94"}, "properties": {"repobilityId": "dd365e9bf253deb4", "scanner": "scanner-primary", "fingerprint": "28fb3557e194edee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/pages/public/BlogPost.js"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-770356ec44745686", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in client/src/context/AuthContext.js:42"}, "properties": {"repobilityId": "2d4bfaadfd7c8c28", "scanner": "scanner-primary", "fingerprint": "770356ec44745686", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "client/src/context/AuthContext.js"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-95162127dc92435d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in server/index.js:9"}, "properties": {"repobilityId": "d9e2487a3e052e8b", "scanner": "scanner-primary", "fingerprint": "95162127dc92435d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server/index.js"}, "region": {"startLine": 9}}}]}, {"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-6663a28defdefc81", "level": "note", "message": {"text": "Very large file: client/src/pages/admin/VendorDetail.js (1486 lines)"}, "properties": {"repobilityId": "9aded15bba6b967e", "scanner": "scanner-primary", "fingerprint": "6663a28defdefc81", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "005aa9806441f7e7", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "9f3130b214bc6eda", "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": "100aa790892fc454", "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": "ec053db4edc89953", "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": "9cee4a8686acda61", "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": "5a202613de3fc18f", "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": "e551d1b06fae0229", "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": "08cac8bdfa6845e1", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-c7daeece5a286138", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server/services/email.js:679"}, "properties": {"repobilityId": "94b52f00f3d6a351", "scanner": "scanner-primary", "fingerprint": "c7daeece5a286138", "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-060dda09f46f55c8", "level": "warning", "message": {"text": "Frontend route `vendors` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "91a968e3f55f925f", "scanner": "scanner-primary", "fingerprint": "060dda09f46f55c8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-964af7a96dc3c4ba", "level": "warning", "message": {"text": "Frontend route `vendors/:id` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "4b86056f5b757c8b", "scanner": "scanner-primary", "fingerprint": "964af7a96dc3c4ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cd0588b106ccea23", "level": "warning", "message": {"text": "Frontend route `map` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "21be3cf710abe439", "scanner": "scanner-primary", "fingerprint": "cd0588b106ccea23", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7c6ad276423b030c", "level": "warning", "message": {"text": "Frontend route `apply` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "4d7e6d2af30864ae", "scanner": "scanner-primary", "fingerprint": "7c6ad276423b030c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e92e7d26200a70a4", "level": "warning", "message": {"text": "Frontend route `apply/thank-you` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "f161306188f9f732", "scanner": "scanner-primary", "fingerprint": "e92e7d26200a70a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d5033816ea4b8c00", "level": "warning", "message": {"text": "Frontend route `become-vendor` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "82933d71c096bb5d", "scanner": "scanner-primary", "fingerprint": "d5033816ea4b8c00", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cf8525a433349bff", "level": "warning", "message": {"text": "Frontend route `find-us` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "ea81fd76c1906295", "scanner": "scanner-primary", "fingerprint": "cf8525a433349bff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-53aa002e5bd64b4f", "level": "warning", "message": {"text": "Frontend route `get-involved` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "d77b6fc4e69b6fab", "scanner": "scanner-primary", "fingerprint": "53aa002e5bd64b4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d7c24c1a079de53a", "level": "warning", "message": {"text": "Frontend route `contact` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "fc35e7321ab9dd90", "scanner": "scanner-primary", "fingerprint": "d7c24c1a079de53a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b142ea862a3b95e4", "level": "warning", "message": {"text": "Frontend route `blog` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "b3b38b091a95d7ff", "scanner": "scanner-primary", "fingerprint": "b142ea862a3b95e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a6baac6b726dc3c4", "level": "warning", "message": {"text": "Frontend route `blog/:slug` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "c0bca91106ba7438", "scanner": "scanner-primary", "fingerprint": "a6baac6b726dc3c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e7db402f2c437501", "level": "warning", "message": {"text": "Frontend route `sponsor` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "d199cced3f46286d", "scanner": "scanner-primary", "fingerprint": "e7db402f2c437501", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a9646d03dca00252", "level": "warning", "message": {"text": "Frontend route `/sponsor/flyer` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "a6605cf903b8e4b1", "scanner": "scanner-primary", "fingerprint": "a9646d03dca00252", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-81d370dc7f134c1c", "level": "warning", "message": {"text": "Frontend route `/test-home` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "823ec38c0b27b504", "scanner": "scanner-primary", "fingerprint": "81d370dc7f134c1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-01e5182b03e99923", "level": "warning", "message": {"text": "Frontend route `/test-home-2` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "7aa52ec43d354e46", "scanner": "scanner-primary", "fingerprint": "01e5182b03e99923", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-33955cfbfa13ee5a", "level": "warning", "message": {"text": "Frontend route `/test-home-3` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "ffe558369bad99b4", "scanner": "scanner-primary", "fingerprint": "33955cfbfa13ee5a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0bbb4b27c67f0ee7", "level": "warning", "message": {"text": "Frontend route `/setup-password` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "ae00b4d7e81f379c", "scanner": "scanner-primary", "fingerprint": "0bbb4b27c67f0ee7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-890486db7638d2a3", "level": "warning", "message": {"text": "Frontend route `/vendor` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "b637714648536927", "scanner": "scanner-primary", "fingerprint": "890486db7638d2a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c64f3f2da3174d80", "level": "warning", "message": {"text": "Frontend route `dashboard` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "76ec9df7d34126ff", "scanner": "scanner-primary", "fingerprint": "c64f3f2da3174d80", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-76fedb3b9fce0a46", "level": "warning", "message": {"text": "Frontend route `schedule` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "7aeea4174f3431a4", "scanner": "scanner-primary", "fingerprint": "76fedb3b9fce0a46", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ed9979388035bfda", "level": "warning", "message": {"text": "Frontend route `payments` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "b8dba4a5fc58a88d", "scanner": "scanner-primary", "fingerprint": "ed9979388035bfda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dbc0fdb2ec74ecb5", "level": "warning", "message": {"text": "Frontend route `profile` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "f2d8038eac880abe", "scanner": "scanner-primary", "fingerprint": "dbc0fdb2ec74ecb5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8aad3f751f913ec7", "level": "warning", "message": {"text": "Frontend route `documents` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "604e6c7d027c2c4d", "scanner": "scanner-primary", "fingerprint": "8aad3f751f913ec7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-13f12f0842717dd7", "level": "warning", "message": {"text": "Frontend route `dates` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "6b55ef12798ae528", "scanner": "scanner-primary", "fingerprint": "13f12f0842717dd7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-538bdc2355a62e59", "level": "warning", "message": {"text": "Frontend route `announcements` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "aa8546a7d5ffa2d7", "scanner": "scanner-primary", "fingerprint": "538bdc2355a62e59", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e356727f82d365b2", "level": "warning", "message": {"text": "Frontend route `maps` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "2a7c2829faa1bad2", "scanner": "scanner-primary", "fingerprint": "e356727f82d365b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-94310e61af4ae484", "level": "warning", "message": {"text": "Frontend route `maps/builder` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "130e2831e045076d", "scanner": "scanner-primary", "fingerprint": "94310e61af4ae484", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cf3a7f26af9c257a", "level": "warning", "message": {"text": "Frontend route `maps/builder/:dateId` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "d9820c76f974a361", "scanner": "scanner-primary", "fingerprint": "cf3a7f26af9c257a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a027500fb1651f91", "level": "warning", "message": {"text": "Frontend route `music-applications` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "096d86b74e4d13c7", "scanner": "scanner-primary", "fingerprint": "a027500fb1651f91", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2698905e62f65345", "level": "warning", "message": {"text": "Frontend route `music-schedule` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "cde5e8b8d21a96d1", "scanner": "scanner-primary", "fingerprint": "2698905e62f65345", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-80dde7a030454a79", "level": "warning", "message": {"text": "Frontend route `blog/new` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "6c23c32a52f0fa0d", "scanner": "scanner-primary", "fingerprint": "80dde7a030454a79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ba7af08d7b607d99", "level": "warning", "message": {"text": "Frontend route `blog/:id/edit` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "032083d7de55ce17", "scanner": "scanner-primary", "fingerprint": "ba7af08d7b607d99", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-52e66a66c1c44245", "level": "warning", "message": {"text": "Frontend route `shoutouts` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "8a4b55bb8c1b87c2", "scanner": "scanner-primary", "fingerprint": "52e66a66c1c44245", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f6dd23ccd4ba8b04", "level": "warning", "message": {"text": "Frontend route `contact-submissions` has no Link/navigate to it \u2014 client/src/App.js"}, "properties": {"repobilityId": "73ab2c8c4b0550e2", "scanner": "scanner-primary", "fingerprint": "f6dd23ccd4ba8b04", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-42abbac0b67a7be0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/audiences/${VENDORS_SEGMENT_ID}/contacts (server/services/email.js:658)"}, "properties": {"repobilityId": "07416f2b455f1568", "scanner": "scanner-primary", "fingerprint": "42abbac0b67a7be0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-35130118b8ad1438", "level": "error", "message": {"text": "Dangling fetch: GET https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts (server/services/email.js:673)"}, "properties": {"repobilityId": "9b76501a58749396", "scanner": "scanner-primary", "fingerprint": "35130118b8ad1438", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59379a52d466f40e", "level": "error", "message": {"text": "Dangling fetch: DELETE https://api.resend.com/audiences/${GENERAL_SEGMENT_ID}/contacts/${contact.id} (server/services/email.js:679)"}, "properties": {"repobilityId": "e4f3b55ad808cefa", "scanner": "scanner-primary", "fingerprint": "59379a52d466f40e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-61a64e02e9b19fe0", "level": "note", "message": {"text": "Unused endpoint: GET /music/admin/schedule-builder"}, "properties": {"repobilityId": "b7522c140df8ff63", "scanner": "scanner-primary", "fingerprint": "61a64e02e9b19fe0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eae64f8b394e407d", "level": "note", "message": {"text": "Unused endpoint: POST /music/admin/schedule/assign"}, "properties": {"repobilityId": "b6e01f3d993c392a", "scanner": "scanner-primary", "fingerprint": "eae64f8b394e407d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6ac4f2a71d0a333f", "level": "note", "message": {"text": "Unused endpoint: GET /contact/submissions"}, "properties": {"repobilityId": "105d184e4fb74658", "scanner": "scanner-primary", "fingerprint": "6ac4f2a71d0a333f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-80a4ab546dc16e5a", "level": "note", "message": {"text": "Unused endpoint: POST /blog/admin"}, "properties": {"repobilityId": "9465b4ee570ae04c", "scanner": "scanner-primary", "fingerprint": "80a4ab546dc16e5a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b6dfce241343aed", "level": "note", "message": {"text": "Unused endpoint: GET /dates"}, "properties": {"repobilityId": "e9dab0458d4b2367", "scanner": "scanner-primary", "fingerprint": "4b6dfce241343aed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d3e1fa3770a27c2", "level": "note", "message": {"text": "Unused endpoint: GET /music-applications"}, "properties": {"repobilityId": "2ebc1cadc750f2a1", "scanner": "scanner-primary", "fingerprint": "0d3e1fa3770a27c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53d1aaeabebcbf7c", "level": "note", "message": {"text": "Unused endpoint: POST /music-applications"}, "properties": {"repobilityId": "62cabd0abe1c4fbf", "scanner": "scanner-primary", "fingerprint": "53d1aaeabebcbf7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-078706f38d5e59e2", "level": "note", "message": {"text": "Unused endpoint: GET /settings/map_config"}, "properties": {"repobilityId": "05e7533fa640f2e4", "scanner": "scanner-primary", "fingerprint": "078706f38d5e59e2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8fe843c46e9a3b2", "level": "note", "message": {"text": "Unused endpoint: GET /maps/builder/dates/list"}, "properties": {"repobilityId": "2fbcade84b179034", "scanner": "scanner-primary", "fingerprint": "d8fe843c46e9a3b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ef27697fa2cdb316", "level": "note", "message": {"text": "Unused endpoint: GET /admin/vendors"}, "properties": {"repobilityId": "d1de36fd2a8c3a52", "scanner": "scanner-primary", "fingerprint": "ef27697fa2cdb316", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-335ea7d010dcc960", "level": "note", "message": {"text": "Unused endpoint: POST /maps/waitlist"}, "properties": {"repobilityId": "29fbaf18a90bc7c7", "scanner": "scanner-primary", "fingerprint": "335ea7d010dcc960", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-377124e01e18c1ad", "level": "note", "message": {"text": "Unused endpoint: PUT /maps/assign"}, "properties": {"repobilityId": "b7f3dc5173d8cb07", "scanner": "scanner-primary", "fingerprint": "377124e01e18c1ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a3deebe326595ed6", "level": "note", "message": {"text": "Unused endpoint: GET /maps"}, "properties": {"repobilityId": "b6821dbfe06607f5", "scanner": "scanner-primary", "fingerprint": "a3deebe326595ed6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d967c428e80f8fd", "level": "note", "message": {"text": "Unused endpoint: POST /maps"}, "properties": {"repobilityId": "a621de5885a1e531", "scanner": "scanner-primary", "fingerprint": "9d967c428e80f8fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01d9f02ef7393912", "level": "note", "message": {"text": "Unused endpoint: GET /admin/vendor-shoutouts"}, "properties": {"repobilityId": "844c94cb0cc24ed4", "scanner": "scanner-primary", "fingerprint": "01d9f02ef7393912", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5474dc2dc90c473", "level": "note", "message": {"text": "Unused endpoint: POST /admin/vendor-shoutouts"}, "properties": {"repobilityId": "695ad1d3eeb309d6", "scanner": "scanner-primary", "fingerprint": "a5474dc2dc90c473", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bdc859f19aa99cb2", "level": "note", "message": {"text": "Unused endpoint: GET /dates/"}, "properties": {"repobilityId": "8d82553a68078b09", "scanner": "scanner-primary", "fingerprint": "bdc859f19aa99cb2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc1bc94bf9c8de41", "level": "note", "message": {"text": "Unused endpoint: POST /admin/bookings"}, "properties": {"repobilityId": "ea48c205160243cd", "scanner": "scanner-primary", "fingerprint": "bc1bc94bf9c8de41", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ec115d7bc0c8434", "level": "note", "message": {"text": "Unused endpoint: POST /admin/bookings/review"}, "properties": {"repobilityId": "768f509a2e13371d", "scanner": "scanner-primary", "fingerprint": "2ec115d7bc0c8434", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5006457a4f69d46", "level": "note", "message": {"text": "Unused endpoint: POST /payments"}, "properties": {"repobilityId": "92a79c214349e903", "scanner": "scanner-primary", "fingerprint": "e5006457a4f69d46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ec8f7efc8437aca5", "level": "note", "message": {"text": "Unused endpoint: GET /payments"}, "properties": {"repobilityId": "63021a081ace7ff8", "scanner": "scanner-primary", "fingerprint": "ec8f7efc8437aca5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e7ba47bcd13e52f6", "level": "note", "message": {"text": "Unused endpoint: GET /blog/admin/all"}, "properties": {"repobilityId": "ca609657c007031c", "scanner": "scanner-primary", "fingerprint": "e7ba47bcd13e52f6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-67399ce5ca80da12", "level": "note", "message": {"text": "Unused endpoint: GET /announcements/all"}, "properties": {"repobilityId": "b8b432766086f4c3", "scanner": "scanner-primary", "fingerprint": "67399ce5ca80da12", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e27c360ebee473b", "level": "note", "message": {"text": "Unused endpoint: POST /announcements"}, "properties": {"repobilityId": "183d04a1f601b0ce", "scanner": "scanner-primary", "fingerprint": "5e27c360ebee473b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c988562b1c995602", "level": "note", "message": {"text": "Unused endpoint: GET /admin/date-requests"}, "properties": {"repobilityId": "bb5e562f816de377", "scanner": "scanner-primary", "fingerprint": "c988562b1c995602", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8e3b1ec38031f42", "level": "note", "message": {"text": "Unused endpoint: POST /contact"}, "properties": {"repobilityId": "6b220a92b6d60e0c", "scanner": "scanner-primary", "fingerprint": "f8e3b1ec38031f42", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8571a34a8aa2731", "level": "note", "message": {"text": "Unused endpoint: POST /applications/submit"}, "properties": {"repobilityId": "649acb2a3cf0189e", "scanner": "scanner-primary", "fingerprint": "d8571a34a8aa2731", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-04c1ccd33661edd2", "level": "note", "message": {"text": "Unused endpoint: GET /vendors/public"}, "properties": {"repobilityId": "c8c521c989a3435c", "scanner": "scanner-primary", "fingerprint": "04c1ccd33661edd2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5dc9d4af696cdaa", "level": "note", "message": {"text": "Unused endpoint: GET /blog"}, "properties": {"repobilityId": "d90bfe992aa4ab5f", "scanner": "scanner-primary", "fingerprint": "e5dc9d4af696cdaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-765e97a9c68d00f5", "level": "note", "message": {"text": "Unused endpoint: GET /vendors/public?shuffle=true"}, "properties": {"repobilityId": "a7fb0b4fec699e1b", "scanner": "scanner-primary", "fingerprint": "765e97a9c68d00f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-395c7b4f5b58be00", "level": "note", "message": {"text": "Unused endpoint: GET /blog/featured"}, "properties": {"repobilityId": "09b8196a61ffca65", "scanner": "scanner-primary", "fingerprint": "395c7b4f5b58be00", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27b3308ee5e8c28f", "level": "note", "message": {"text": "Unused endpoint: GET /music/schedule/upcoming?limit=12"}, "properties": {"repobilityId": "107fcd3eeb4cc870", "scanner": "scanner-primary", "fingerprint": "27b3308ee5e8c28f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac42422b23e45104", "level": "note", "message": {"text": "Unused endpoint: GET /auth/me"}, "properties": {"repobilityId": "906e64bfbdf5211e", "scanner": "scanner-primary", "fingerprint": "ac42422b23e45104", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cd430d8889e2b6b8", "level": "note", "message": {"text": "Unused endpoint: USE /api/payments/webhook"}, "properties": {"repobilityId": "bb9a3289d834324d", "scanner": "scanner-primary", "fingerprint": "cd430d8889e2b6b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1bc898b3b7565990", "level": "note", "message": {"text": "Unused endpoint: USE /uploads"}, "properties": {"repobilityId": "cd93f5e718a74b3e", "scanner": "scanner-primary", "fingerprint": "1bc898b3b7565990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "998ca44ee62afef2", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cede1ab3aedb7584", "level": "note", "message": {"text": "Unused endpoint: USE /api/vendors"}, "properties": {"repobilityId": "6a3a36a68bf4e464", "scanner": "scanner-primary", "fingerprint": "cede1ab3aedb7584", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "b0385d6f41c67e22", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-95fe3034b114cb1f", "level": "note", "message": {"text": "Unused endpoint: USE /api/dates"}, "properties": {"repobilityId": "04bce9ade1d87f20", "scanner": "scanner-primary", "fingerprint": "95fe3034b114cb1f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7222c1377806c38f", "level": "note", "message": {"text": "Unused endpoint: USE /api/announcements"}, "properties": {"repobilityId": "df06cdaeaf1797c8", "scanner": "scanner-primary", "fingerprint": "7222c1377806c38f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f8242ba07247d2f8", "level": "note", "message": {"text": "Unused endpoint: USE /api/payments"}, "properties": {"repobilityId": "76678847d211e443", "scanner": "scanner-primary", "fingerprint": "f8242ba07247d2f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-629e8f357f698e1b", "level": "note", "message": {"text": "Unused endpoint: USE /api/maps"}, "properties": {"repobilityId": "d70197f2863fef7d", "scanner": "scanner-primary", "fingerprint": "629e8f357f698e1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ab4f46cc4c774c3", "level": "note", "message": {"text": "Unused endpoint: USE /api/applications"}, "properties": {"repobilityId": "f246a57fed4c0f75", "scanner": "scanner-primary", "fingerprint": "8ab4f46cc4c774c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5d76eec8f5cd2df3", "level": "note", "message": {"text": "Unused endpoint: USE /api/music-applications"}, "properties": {"repobilityId": "4224d33779276d86", "scanner": "scanner-primary", "fingerprint": "5d76eec8f5cd2df3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ba7770a6ceafb13", "level": "note", "message": {"text": "Unused endpoint: USE /api/blog"}, "properties": {"repobilityId": "a6ae8dea0e39759a", "scanner": "scanner-primary", "fingerprint": "5ba7770a6ceafb13", "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": "90e7c8f0d610abdc", "scanner": "scanner-primary", "fingerprint": "7c18e12167939aa3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ca4664c9cda1cd6", "level": "note", "message": {"text": "Unused endpoint: USE /api/settings"}, "properties": {"repobilityId": "de04cc0c686e6aae", "scanner": "scanner-primary", "fingerprint": "8ca4664c9cda1cd6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d3d2df7bfb761887", "level": "note", "message": {"text": "Unused endpoint: USE /api/contact"}, "properties": {"repobilityId": "db42b20b19fe0ac8", "scanner": "scanner-primary", "fingerprint": "d3d2df7bfb761887", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86bdbae364049539", "level": "note", "message": {"text": "Unused endpoint: USE /api/sitemap.xml"}, "properties": {"repobilityId": "0305316256574317", "scanner": "scanner-primary", "fingerprint": "86bdbae364049539", "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": "0d2a6e55cb055de8", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}