{"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-d9f52b9e2f81087b", "name": "Stray `console.log` in TS/JS \u2014 src/App.tsx:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/App.tsx:117"}, "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-f3f46ade7160bd55", "name": "Stray `console.log` in TS/JS \u2014 src/lib/api.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api.ts: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-7ce35803a1c12f06", "name": "Stray `console.log` in TS/JS \u2014 src/pages/global/GlobalPage.tsx:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/global/GlobalPage.tsx: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-97804b6df0161526", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/global/ErrorLogsPage.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/global/ErrorLogsPage.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16673445f723b10c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/global/noona/components/masters/CategoryRow.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/global/noona/components/masters/CategoryRow.tsx:51"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a3470aa020deab8", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/global/components/shiftClose/CommentPopover.tsx:42", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/global/components/shiftClose/CommentPopover.tsx:42"}, "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-d5f53df86fc33538", "name": "Insecure pattern 'local_storage_auth_token' in src/pages/Login.tsx:30", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/Login.tsx:30"}, "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-a5207e4f6eff6d81", "name": "Insecure pattern 'dangerous_innerhtml' in src/pages/global/components/shiftClose/CommentPopover.tsx:42", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/pages/global/components/shiftClose/CommentPopover.tsx:42"}, "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-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 150 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 15 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 30 placeholder/mock markers across 8 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "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, 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": "low", "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-49f7f9dfca18e19e", "name": "Commented-code block (5 lines) in src/pages/dashboard/fetch/teamSplit.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/dashboard/fetch/teamSplit.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f299152a7d03cbc", "name": "Commented-code block (5 lines) in src/pages/dashboard/fetch/allAdminsHours.ts:129", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/dashboard/fetch/allAdminsHours.ts:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4fb34fdc98ffe722", "name": "Commented-code block (39 lines) in src/pages/dashboard/fetch/costs.ts:137", "shortDescription": {"text": "Commented-code block (39 lines) in src/pages/dashboard/fetch/costs.ts:137"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9db370fc13b7482f", "name": "Commented-code block (5 lines) in src/pages/dashboard/fetch/getEvents.ts:167", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/dashboard/fetch/getEvents.ts:167"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-af15a761ef821129", "name": "Commented-code block (7 lines) in src/pages/global/noona/fetch/manageServices.ts:133", "shortDescription": {"text": "Commented-code block (7 lines) in src/pages/global/noona/fetch/manageServices.ts:133"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91acdd0c62727a5b", "name": "Commented-code block (6 lines) in src/pages/global/noona/fetch/masterServices.ts:19", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/global/noona/fetch/masterServices.ts:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c045e018a5dccb19", "name": "Commented-code block (6 lines) in src/pages/global/analytics/fetch/retention.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/global/analytics/fetch/retention.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1fde60f2dd58620", "name": "Commented-code block (5 lines) in src/pages/global/analytics/fetch/emailCampaign.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/global/analytics/fetch/emailCampaign.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9c31d07ac5258f6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/global/analytics/fetch/emailCampaign.ts:188", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/global/analytics/fetch/emailCampaign.ts:188"}, "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-2b1bf28e4763189a", "name": "Commented-code block (6 lines) in src/pages/global/team/fetch/masterLoad.ts:4", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/global/team/fetch/masterLoad.ts:4"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a0af05ddb244fe9e", "name": "Commented-code block (5 lines) in src/pages/global/fetch/shiftClose.ts:84", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/global/fetch/shiftClose.ts:84"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ecbb2b7005697a1", "name": "Commented-code block (6 lines) in src/pages/global/fetch/noonaServices.ts:173", "shortDescription": {"text": "Commented-code block (6 lines) in src/pages/global/fetch/noonaServices.ts:173"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-736268df5c6ae183", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/global/fetch/reviewSync.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/global/fetch/reviewSync.ts:23"}, "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-41f715462c0742eb", "name": "Commented-code block (5 lines) in src/pages/global/fetch/juniorServices.ts:270", "shortDescription": {"text": "Commented-code block (5 lines) in src/pages/global/fetch/juniorServices.ts:270"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-53a6fe71a8d4c863", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/email-campaign/EmailCampaignPage.tsx:97", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/email-campaign/EmailCampaignPage.tsx:97"}, "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-1f4c5bc8e6627e02", "name": "Frontend route `/global/charts` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/charts` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8a66d89e19ee979", "name": "Frontend route `/global/weekly-overview` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/weekly-overview` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-84a7dd9fc86893b2", "name": "Frontend route `/global/procedures-stats` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/procedures-stats` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-50fb4e7db00669cf", "name": "Frontend route `/global/weekly-charts` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/weekly-charts` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a76ac81991be6270", "name": "Frontend route `/global/salaries` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/salaries` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-17f8d45bfc410753", "name": "Frontend route `/global/master-priority` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/master-priority` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-062e27ad8fa26b34", "name": "Frontend route `/global/noona-services` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/noona-services` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13734bd23bafe500", "name": "Frontend route `/global/noona-activity` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/noona-activity` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0fbe587b3a79aad8", "name": "Frontend route `/global/price-increase` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/price-increase` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5c3df97e44b243ba", "name": "Frontend route `/global/junior-services` has no Link/navigate to it \u2014 src/App.tsx", "shortDescription": {"text": "Frontend route `/global/junior-services` has no Link/navigate to it \u2014 src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d731a7a8cb4126cb", "name": "Unused endpoint: POST /api/email-campaign-logs", "shortDescription": {"text": "Unused endpoint: POST /api/email-campaign-logs"}, "fullDescription": {"text": "`src/pages/global/analytics/fetch/emailCampaign.ts` declares `POST /api/email-campaign-logs` 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-4447a9bd11667b9d", "name": "Unused endpoint: GET /api/personals?fields[0]=name&fields[1]=noonaEmployeeId&fields[2]=bookingPriority&filters[position]", "shortDescription": {"text": "Unused endpoint: GET /api/personals?fields[0]=name&fields[1]=noonaEmployeeId&fields[2]=bookingPriority&filters[position][$eq]=master&filters[isActive][$eq]=true&pagination[pageSize]=100&status=published"}, "fullDescription": {"text": "`src/pages/global/fetch/masterPriority.ts` declares `GET /api/personals?fields[0]=name&fields[1]=noonaEmployeeId&fields[2]=bookingPriority&filters[position][$eq]=master&filters[isActive][$eq]=true&pagination[pageSize]=100&status=published` 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-70573ad31dc12dc6", "name": "Unused endpoint: GET /api/google-reviews?sort=createdAt:desc&pagination[pageSize]=100", "shortDescription": {"text": "Unused endpoint: GET /api/google-reviews?sort=createdAt:desc&pagination[pageSize]=100"}, "fullDescription": {"text": "`src/pages/global/fetch/reviewSync.ts` declares `GET /api/google-reviews?sort=createdAt:desc&pagination[pageSize]=100` 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-ffa0650c83266ed3", "name": "Unused endpoint: GET /api/blog-plans?sort=year:desc,month:desc&populate[topics][populate][blog][fields][0]=title&populat", "shortDescription": {"text": "Unused endpoint: GET /api/blog-plans?sort=year:desc,month:desc&populate[topics][populate][blog][fields][0]=title&populate[topics][populate][blog][fields][1]=slug"}, "fullDescription": {"text": "`src/pages/global/fetch/blogAi.ts` declares `GET /api/blog-plans?sort=year:desc,month:desc&populate[topics][populate][blog][fields][0]=title&populate[topics][populate][blog][fields][1]=slug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-65e1a2d23a1f24fb", "name": "Unused endpoint: POST /api/blog-ai/generate-plan", "shortDescription": {"text": "Unused endpoint: POST /api/blog-ai/generate-plan"}, "fullDescription": {"text": "`src/pages/global/fetch/blogAi.ts` declares `POST /api/blog-ai/generate-plan` 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-5327cd9d4c89f9aa", "name": "Unused endpoint: POST /api/offerings", "shortDescription": {"text": "Unused endpoint: POST /api/offerings"}, "fullDescription": {"text": "`src/pages/global/fetch/strapiOfferings.ts` declares `POST /api/offerings` 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/19671"}, "properties": {"repository": "simon1400/barbitch-admin", "repoUrl": "https://github.com/simon1400/barbitch-admin", "branch": "main"}, "results": [{"ruleId": "scanner-d9f52b9e2f81087b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/App.tsx:117"}, "properties": {"repobilityId": "f3d63003b5dbefbd", "scanner": "scanner-primary", "fingerprint": "d9f52b9e2f81087b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3f46ade7160bd55", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api.ts:33"}, "properties": {"repobilityId": "cfb1d338965176d1", "scanner": "scanner-primary", "fingerprint": "f3f46ade7160bd55", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ce35803a1c12f06", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/global/GlobalPage.tsx:17"}, "properties": {"repobilityId": "db2f11a9e9eda2ae", "scanner": "scanner-primary", "fingerprint": "7ce35803a1c12f06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97804b6df0161526", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/global/ErrorLogsPage.tsx:218"}, "properties": {"repobilityId": "c8ba3044c0f80e1f", "scanner": "scanner-primary", "fingerprint": "97804b6df0161526", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16673445f723b10c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/global/noona/components/masters/CategoryRow.tsx:51"}, "properties": {"repobilityId": "9552f4457c0ab89c", "scanner": "scanner-primary", "fingerprint": "16673445f723b10c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a3470aa020deab8", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/pages/global/components/shiftClose/CommentPopover.tsx:42"}, "properties": {"repobilityId": "494d4cc83b4553b6", "scanner": "scanner-primary", "fingerprint": "3a3470aa020deab8", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d5f53df86fc33538", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in src/pages/Login.tsx:30"}, "properties": {"repobilityId": "383b280e02ef1faf", "scanner": "scanner-primary", "fingerprint": "d5f53df86fc33538", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/Login.tsx"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-a5207e4f6eff6d81", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/pages/global/components/shiftClose/CommentPopover.tsx:42"}, "properties": {"repobilityId": "9bba2a69efe3142a", "scanner": "scanner-primary", "fingerprint": "a5207e4f6eff6d81", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/global/components/shiftClose/CommentPopover.tsx"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2aee2e2d969c7c6b", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "30dc547e5dfa0d7e", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 18}}}]}, {"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": "ce6b7a8192d3eddb", "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": "581c9d91a3aefab1", "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": "0fba0107146fe9e4", "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": "14bf7eed9787603b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "e94237c927c2ceb0", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "858a3019c9f079b0", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "e1bb3aec84010e9f", "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": "570fc7f78ec413dd", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-49f7f9dfca18e19e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/dashboard/fetch/teamSplit.ts:4"}, "properties": {"repobilityId": "f11677137206c79c", "scanner": "scanner-primary", "fingerprint": "49f7f9dfca18e19e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7f299152a7d03cbc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/dashboard/fetch/allAdminsHours.ts:129"}, "properties": {"repobilityId": "615ab18bcdffff57", "scanner": "scanner-primary", "fingerprint": "7f299152a7d03cbc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4fb34fdc98ffe722", "level": "none", "message": {"text": "Commented-code block (39 lines) in src/pages/dashboard/fetch/costs.ts:137"}, "properties": {"repobilityId": "d6c2dc50f8908673", "scanner": "scanner-primary", "fingerprint": "4fb34fdc98ffe722", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9db370fc13b7482f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/dashboard/fetch/getEvents.ts:167"}, "properties": {"repobilityId": "c07e5f3b8eef9c88", "scanner": "scanner-primary", "fingerprint": "9db370fc13b7482f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af15a761ef821129", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/pages/global/noona/fetch/manageServices.ts:133"}, "properties": {"repobilityId": "a44fc3208cf1a7d2", "scanner": "scanner-primary", "fingerprint": "af15a761ef821129", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91acdd0c62727a5b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/global/noona/fetch/masterServices.ts:19"}, "properties": {"repobilityId": "172fa87c4cf0f31f", "scanner": "scanner-primary", "fingerprint": "91acdd0c62727a5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c045e018a5dccb19", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/global/analytics/fetch/retention.ts:4"}, "properties": {"repobilityId": "70d3adc759efcd17", "scanner": "scanner-primary", "fingerprint": "c045e018a5dccb19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1fde60f2dd58620", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/global/analytics/fetch/emailCampaign.ts:5"}, "properties": {"repobilityId": "87e7f8b41021422a", "scanner": "scanner-primary", "fingerprint": "c1fde60f2dd58620", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9c31d07ac5258f6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/global/analytics/fetch/emailCampaign.ts:188"}, "properties": {"repobilityId": "61c458be4f6df069", "scanner": "scanner-primary", "fingerprint": "b9c31d07ac5258f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b1bf28e4763189a", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/global/team/fetch/masterLoad.ts:4"}, "properties": {"repobilityId": "a73aed0e25bdee9f", "scanner": "scanner-primary", "fingerprint": "2b1bf28e4763189a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a0af05ddb244fe9e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/global/fetch/shiftClose.ts:84"}, "properties": {"repobilityId": "17908ac3825ef507", "scanner": "scanner-primary", "fingerprint": "a0af05ddb244fe9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ecbb2b7005697a1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/pages/global/fetch/noonaServices.ts:173"}, "properties": {"repobilityId": "ad079366c667214f", "scanner": "scanner-primary", "fingerprint": "3ecbb2b7005697a1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-736268df5c6ae183", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/global/fetch/reviewSync.ts:23"}, "properties": {"repobilityId": "a8d02134eeb2d4d7", "scanner": "scanner-primary", "fingerprint": "736268df5c6ae183", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-41f715462c0742eb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/pages/global/fetch/juniorServices.ts:270"}, "properties": {"repobilityId": "4597abbab590841e", "scanner": "scanner-primary", "fingerprint": "41f715462c0742eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-53a6fe71a8d4c863", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/pages/email-campaign/EmailCampaignPage.tsx:97"}, "properties": {"repobilityId": "7abe1ad805e061d7", "scanner": "scanner-primary", "fingerprint": "53a6fe71a8d4c863", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1f4c5bc8e6627e02", "level": "warning", "message": {"text": "Frontend route `/global/charts` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "befa7e54270f240b", "scanner": "scanner-primary", "fingerprint": "1f4c5bc8e6627e02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a8a66d89e19ee979", "level": "warning", "message": {"text": "Frontend route `/global/weekly-overview` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5495057aee80ff77", "scanner": "scanner-primary", "fingerprint": "a8a66d89e19ee979", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-84a7dd9fc86893b2", "level": "warning", "message": {"text": "Frontend route `/global/procedures-stats` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "2d4af822fd2629b1", "scanner": "scanner-primary", "fingerprint": "84a7dd9fc86893b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-50fb4e7db00669cf", "level": "warning", "message": {"text": "Frontend route `/global/weekly-charts` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "d92fb562c8dccb56", "scanner": "scanner-primary", "fingerprint": "50fb4e7db00669cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a76ac81991be6270", "level": "warning", "message": {"text": "Frontend route `/global/salaries` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "76e0fbf5f7a0d4c7", "scanner": "scanner-primary", "fingerprint": "a76ac81991be6270", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-17f8d45bfc410753", "level": "warning", "message": {"text": "Frontend route `/global/master-priority` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "de793db0e9e6d29a", "scanner": "scanner-primary", "fingerprint": "17f8d45bfc410753", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-062e27ad8fa26b34", "level": "warning", "message": {"text": "Frontend route `/global/noona-services` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "5feefa14a77bee34", "scanner": "scanner-primary", "fingerprint": "062e27ad8fa26b34", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-13734bd23bafe500", "level": "warning", "message": {"text": "Frontend route `/global/noona-activity` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "00e8659171c1c8bc", "scanner": "scanner-primary", "fingerprint": "13734bd23bafe500", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0fbe587b3a79aad8", "level": "warning", "message": {"text": "Frontend route `/global/price-increase` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "c10a6eafa4cd3956", "scanner": "scanner-primary", "fingerprint": "0fbe587b3a79aad8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5c3df97e44b243ba", "level": "warning", "message": {"text": "Frontend route `/global/junior-services` has no Link/navigate to it \u2014 src/App.tsx"}, "properties": {"repobilityId": "4c2f840902fb9ad7", "scanner": "scanner-primary", "fingerprint": "5c3df97e44b243ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d731a7a8cb4126cb", "level": "note", "message": {"text": "Unused endpoint: POST /api/email-campaign-logs"}, "properties": {"repobilityId": "1d94e96d507471db", "scanner": "scanner-primary", "fingerprint": "d731a7a8cb4126cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4447a9bd11667b9d", "level": "note", "message": {"text": "Unused endpoint: GET /api/personals?fields[0]=name&fields[1]=noonaEmployeeId&fields[2]=bookingPriority&filters[position][$eq]=master&filters[isActive][$eq]=true&pagination[pageSize]=100&status=published"}, "properties": {"repobilityId": "2d5765c55ef47fa6", "scanner": "scanner-primary", "fingerprint": "4447a9bd11667b9d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-70573ad31dc12dc6", "level": "note", "message": {"text": "Unused endpoint: GET /api/google-reviews?sort=createdAt:desc&pagination[pageSize]=100"}, "properties": {"repobilityId": "e19a6fb279951808", "scanner": "scanner-primary", "fingerprint": "70573ad31dc12dc6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffa0650c83266ed3", "level": "note", "message": {"text": "Unused endpoint: GET /api/blog-plans?sort=year:desc,month:desc&populate[topics][populate][blog][fields][0]=title&populate[topics][populate][blog][fields][1]=slug"}, "properties": {"repobilityId": "6e81fdeda80ad434", "scanner": "scanner-primary", "fingerprint": "ffa0650c83266ed3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-65e1a2d23a1f24fb", "level": "note", "message": {"text": "Unused endpoint: POST /api/blog-ai/generate-plan"}, "properties": {"repobilityId": "aba337bc608fc0bc", "scanner": "scanner-primary", "fingerprint": "65e1a2d23a1f24fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5327cd9d4c89f9aa", "level": "note", "message": {"text": "Unused endpoint: POST /api/offerings"}, "properties": {"repobilityId": "7d8e74aed3ad55a9", "scanner": "scanner-primary", "fingerprint": "5327cd9d4c89f9aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}