{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-45796a9933c27df9", "name": "`truncate` class without `title=` for hover reveal \u2014 components/global-search.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/global-search.tsx:133"}, "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-8e1e69574ec1c082", "name": "`truncate` class without `title=` for hover reveal \u2014 components/admin-contacts.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin-contacts.tsx:38"}, "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-ba52a209e64b66c9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/chart.tsx:95", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/chart.tsx:95"}, "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-9d48b7b8282ea71e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/page.tsx:464", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/page.tsx:464"}, "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-55107141b322d670", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/layout.tsx:606", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/layout.tsx:606"}, "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-0ccd007693a6e15d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/activity/page.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/activity/page.tsx:194"}, "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-2e1004e5205f7625", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/elections/page.tsx:370", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/elections/page.tsx:370"}, "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-56b98757de6e7aae", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/officials/page.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/officials/page.tsx:153"}, "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-547b33c17e746bdb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/teams/page.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/teams/page.tsx:217"}, "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-d4559a5b54d1236c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/announcements/page.tsx:315", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/announcements/page.tsx:315"}, "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-4e7c2fd79d35a145", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/todos/page.tsx:894", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/todos/page.tsx:894"}, "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-ac7984026257e253", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/payment-status/page.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/payment-status/page.tsx:126"}, "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-e3cc1e5cd5862f0a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/messages/page.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/messages/page.tsx:392"}, "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-f56f524d3036f129", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/polling/page.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/polling/page.tsx:169"}, "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-65383a5068f94b47", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/trainings/page.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/trainings/page.tsx:98"}, "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-eba9b994b0561f62", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/profile/page.tsx:599", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/profile/page.tsx:599"}, "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-061e8b9498d877c2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/members/page.tsx:275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/members/page.tsx:275"}, "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-c6140f81d2ac3af2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/group-chat/page.tsx:1290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/group-chat/page.tsx:1290"}, "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-7b7c7cbc0aa3f337", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/documents/page.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/documents/page.tsx:172"}, "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-6a8b8facbc61c465", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/subscriptions/page.tsx:650", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/subscriptions/page.tsx:650"}, "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-1ea509983500165b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/project-h/page.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/project-h/page.tsx:230"}, "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-c7a3af48faf89121", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/page.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/page.tsx:280"}, "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-bb3f4c942470a63c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/ai-tools/_components/pest-identifier.tsx:323", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/ai-tools/_components/pest-identifier.tsx:323"}, "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-64e041aab0b53711", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/ai-tools/_components/doc-summarizer.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/ai-tools/_components/doc-summarizer.tsx:83"}, "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-7ad5a6d1d60c8fe4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/page.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/page.tsx:191"}, "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-ec621db3fe71f67a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/layout.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/layout.tsx:307"}, "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-7bda05040d6181e4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/photo-review/page.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/photo-review/page.tsx:240"}, "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-8d87a9d5b014e4f7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/contributions/page.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/contributions/page.tsx:168"}, "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-1900f0e5781b80a0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/analytics/page.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/analytics/page.tsx:170"}, "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-991105c61b89c608", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/pest-training/page.tsx:182", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/pest-training/page.tsx:182"}, "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-be4e0b8a8f5845f8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/officials/page.tsx:305", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/officials/page.tsx:305"}, "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-3ff2fb43d912605a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/teams/page.tsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/teams/page.tsx:348"}, "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-a13e08927b7a8510", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/district-dues/page.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/district-dues/page.tsx:172"}, "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-13b0dd4319046f75", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/todos/_components/TodoDetailView.tsx:478", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/todos/_components/TodoDetailView.tsx:478"}, "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-56f5eea2b4afcaee", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/verify-payments/page.tsx:620", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/verify-payments/page.tsx:620"}, "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-4416791ba0d5d69d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/audit-logs/page.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/audit-logs/page.tsx:151"}, "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-fae1b6316df0523f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/trainings/page.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/trainings/page.tsx:366"}, "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-52f43d981c442f3d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/at-risk-members/page.tsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/at-risk-members/page.tsx:282"}, "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-8cfb12c6565d0bfe", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/group-chat/page.tsx:455", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/group-chat/page.tsx:455"}, "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-9d23c7d6777e3564", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/documents/page.tsx:480", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/documents/page.tsx:480"}, "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-b7a1eea50e32905f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/subscriptions/page.tsx:1124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/subscriptions/page.tsx:1124"}, "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-9ee288d5dea6cd5d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/special-documents/page.tsx:289", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/special-documents/page.tsx:289"}, "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-f666fc5a3323456f", "name": "Stray `console.log` in TS/JS \u2014 lib/sms.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/sms.ts:59"}, "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-d9c436d3947cf11b", "name": "TODO/FIXME marker in shipping code \u2014 lib/tn-districts.ts:69", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 lib/tn-districts.ts:69"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8828b526257cfa9", "name": "Insecure pattern 'dangerous_innerhtml' in components/ui/chart.tsx:95", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/chart.tsx:95"}, "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-f83e15ca839c03b7", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/announcements/page.tsx:315", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/announcements/page.tsx:315"}, "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-c210e7fed77faee0", "name": "Insecure pattern 'document_write' in app/admin/roster/page.tsx:265", "shortDescription": {"text": "Insecure pattern 'document_write' in app/admin/roster/page.tsx:265"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20e7c8eed5df03fb", "name": "Very large file: app/dashboard/todos/page.tsx (1645 lines)", "shortDescription": {"text": "Very large file: app/dashboard/todos/page.tsx (1645 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-a38514bf7eee4a3e", "name": "Very large file: app/dashboard/profile/page.tsx (1278 lines)", "shortDescription": {"text": "Very large file: app/dashboard/profile/page.tsx (1278 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-6d1cc1e4220c6d50", "name": "Very large file: app/dashboard/group-chat/page.tsx (1974 lines)", "shortDescription": {"text": "Very large file: app/dashboard/group-chat/page.tsx (1974 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-783d637e2d2de6d5", "name": "Very large file: app/dashboard/subscriptions/page.tsx (1354 lines)", "shortDescription": {"text": "Very large file: app/dashboard/subscriptions/page.tsx (1354 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-eb18d6c642a37bab", "name": "Very large file: app/admin/finance/page.tsx (1278 lines)", "shortDescription": {"text": "Very large file: app/admin/finance/page.tsx (1278 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-ea2b5ac8937d9e26", "name": "Very large file: app/admin/vouchers/page.tsx (1175 lines)", "shortDescription": {"text": "Very large file: app/admin/vouchers/page.tsx (1175 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-6bde7dfd76d0b3f1", "name": "Very large file: app/admin/subscriptions/page.tsx (2572 lines)", "shortDescription": {"text": "Very large file: app/admin/subscriptions/page.tsx (2572 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-3f683d78c070c218", "name": "Very large file: lib/i18n/translations.ts (996 lines)", "shortDescription": {"text": "Very large file: lib/i18n/translations.ts (996 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": "18 test file(s) for 406 source file(s) (ratio 0.04). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-777a13c1a0a37351", "name": "64 TODO/FIXME markers", "shortDescription": {"text": "64 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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 70 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 335 placeholder/mock markers across 79 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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. 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-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. 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-17d866d91a7c451e", "name": "Agent instruction/config may expose a secret: CLAUDE.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-167bc2dbd55dcb0f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/strip-honorific-names.mjs:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/strip-honorific-names.mjs:44"}, "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-80ef7d0689f30b7b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ds-djs-coverage.mjs:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ds-djs-coverage.mjs:35"}, "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-3febd2946f1c22fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/team-leads-audit.mjs:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/team-leads-audit.mjs:104"}, "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-29b6d9d7e86d147c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/assign-team-leads.mjs:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/assign-team-leads.mjs:52"}, "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-ea4f0b11cfc67725", "name": "`fetch()` without try/.catch or AbortSignal \u2014 components/push-manager.tsx:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/push-manager.tsx:47"}, "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-fd902eb11405b5f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/page.tsx:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/page.tsx:58"}, "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-5d5fa3d7d44af9db", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/upload/payment-proof/extract-date/route.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/upload/payment-proof/extract-date/route.ts:42"}, "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-25e3a5fc869e1504", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/google/callback/route.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/google/callback/route.ts:45"}, "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-f583e2167649ef1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/facebook/callback/route.ts:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/facebook/callback/route.ts:58"}, "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-710b03ce0dbf5ee3", "name": "Commented-code block (5 lines) in app/api/admin/teams/notify-leads/route.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/admin/teams/notify-leads/route.ts:6"}, "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-df35935e862cbd40", "name": "Commented-code block (9 lines) in app/api/cron/daily-briefing/route.ts:7", "shortDescription": {"text": "Commented-code block (9 lines) in app/api/cron/daily-briefing/route.ts:7"}, "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-0431293544e17c73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/duplicate-scan/route.ts:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/duplicate-scan/route.ts:107"}, "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-2cf4488428a35b1d", "name": "Commented-code block (6 lines) in app/api/cron/task-reminder/route.ts:6", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/cron/task-reminder/route.ts:6"}, "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-bdccb0bb62dca779", "name": "Commented-code block (5 lines) in app/api/cron/daily-greetings/route.ts:6", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/cron/daily-greetings/route.ts:6"}, "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-64529851b3f06046", "name": "Commented-code block (7 lines) in app/api/cron/stuck-tasks/route.ts:6", "shortDescription": {"text": "Commented-code block (7 lines) in app/api/cron/stuck-tasks/route.ts:6"}, "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-877016b6758028b6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ai-tools/weather-advisory/route.ts:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ai-tools/weather-advisory/route.ts:81"}, "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-6c02d467d150c57c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/page.tsx:113", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/page.tsx:113"}, "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-6e026f2b5a5bfaf6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/layout.tsx:180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/layout.tsx:180"}, "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-59a4f6e9b92b0300", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/events/page.tsx:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/events/page.tsx:96"}, "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-4acd7e49657c0add", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/achievements/page.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/achievements/page.tsx:74"}, "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-45eaaacd73419012", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/activity/page.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/activity/page.tsx:31"}, "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-e54b3920d17c5b4f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/vouchers/page.tsx:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/vouchers/page.tsx:83"}, "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-c23862254e4ed2ad", "name": "Commented-code block (5 lines) in app/dashboard/announcements/page.tsx:86", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/announcements/page.tsx:86"}, "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-8a692a7fe166f1c6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/announcements/page.tsx:169", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/announcements/page.tsx:169"}, "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-6521b7d5a8486edb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/todos/page.tsx:295", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/todos/page.tsx:295"}, "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-b6c8b08d6568edc5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/polls/page.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/polls/page.tsx:66"}, "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-8eea28621143f28d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/wishlist/page.tsx:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/wishlist/page.tsx:79"}, "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-611adbc5403eb293", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/trainings/page.tsx:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/trainings/page.tsx:127"}, "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-f69d2ea8829fe0ce", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/profile/page.tsx:303", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/profile/page.tsx:303"}, "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-af64e47a35c51b5b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/group-chat/page.tsx:831", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/group-chat/page.tsx:831"}, "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-d740f8c841146614", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/documents/page.tsx:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/documents/page.tsx:99"}, "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-e06a683bdf30aded", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/subscriptions/page.tsx:400", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/subscriptions/page.tsx:400"}, "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-fdebfe8e37dcf4cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/project-h/page.tsx:122", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/project-h/page.tsx:122"}, "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-6bcf4fa83cb68491", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/resolutions/page.tsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/resolutions/page.tsx:27"}, "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-cbb7fd8a66ef2eb3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/layout.tsx:121", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/layout.tsx:121"}, "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-8da5b629be63f97e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/settings/page.tsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/settings/page.tsx:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8f5bc9f96269ee7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/page.tsx:256", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/page.tsx:256"}, "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-5e6636e5ce7dead2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/meetings/page.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/meetings/page.tsx:81"}, "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-e9412b5173b3fd0b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/error-logs/page.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/error-logs/page.tsx:80"}, "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-a11bd0a8b2e4bf2c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/contributions/page.tsx:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/contributions/page.tsx:45"}, "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-293b0724bd55ee8a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/analytics/page.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/analytics/page.tsx:78"}, "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-ec13b88d4aebc08a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/events/page.tsx:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/events/page.tsx:41"}, "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-c42881df24247627", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/pest-training/page.tsx:105", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/pest-training/page.tsx:105"}, "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-f29ce44e9a660ec6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/suggestions/page.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/suggestions/page.tsx:74"}, "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-c73e447629bacf7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/teams/page.tsx:166", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/teams/page.tsx:166"}, "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-d8a15d8161972203", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/special-tasks/page.tsx:102", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/special-tasks/page.tsx:102"}, "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-5506fd4964d7cb83", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/finance/page.tsx:381", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/finance/page.tsx:381"}, "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-e008d72cb39bf161", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/service-requests/page.tsx:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/service-requests/page.tsx:74"}, "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-4ac83763b5b7cf57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/vouchers/page.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/vouchers/page.tsx:128"}, "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-36838153bae8ce8a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/announcements/page.tsx:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/announcements/page.tsx:67"}, "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-39c2e98e9a307389", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/todos/page.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/todos/page.tsx:128"}, "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-be6f38405ee4f0e5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/todos/_components/TodoDetailView.tsx:258", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/todos/_components/TodoDetailView.tsx:258"}, "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-0e5c2d81c11cd4bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/polls/page.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/polls/page.tsx:54"}, "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-0ffa04a5cbd4fa9f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/verify-payments/page.tsx:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/verify-payments/page.tsx:95"}, "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-c3ad431032d5b0fc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/wishlist/page.tsx:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/wishlist/page.tsx:51"}, "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-96415d434589ee35", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/audit-logs/page.tsx:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/audit-logs/page.tsx:57"}, "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-75f61a27e630e7f8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/trainings/page.tsx:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/trainings/page.tsx:124"}, "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-9101f40baad37d2a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/engagement/page.tsx:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/engagement/page.tsx:66"}, "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-4627c76b7b6c6111", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/overview-tab.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/overview-tab.tsx:37"}, "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-e354a70e8b3ee70a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/subscriptions-tab.tsx:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/subscriptions-tab.tsx:60"}, "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-c98b4fc09d5b1e65", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/contributions-tab.tsx:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/contributions-tab.tsx:42"}, "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-e84e970de9017a1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/expenses-tab.tsx:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/expenses-tab.tsx:92"}, "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-e865a4e22beebc97", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/performance-tab.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/performance-tab.tsx:116"}, "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-473045a7cf54ca14", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/group-chat/page.tsx:178", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/group-chat/page.tsx:178"}, "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-a47aaefac3bd0658", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/documents/page.tsx:146", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/documents/page.tsx:146"}, "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-f8fa5c499a878037", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/subscriptions/page.tsx:199", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/subscriptions/page.tsx:199"}, "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-d5ae1d94e64e7c40", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/special-documents/page.tsx:168", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/special-documents/page.tsx:168"}, "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-1a31822a4615942c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/faq/page.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/faq/page.tsx:82"}, "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-5011a53ee92a2d9b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/resolutions/page.tsx:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/resolutions/page.tsx:88"}, "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-d3359a8ee39f8073", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/verify/page.tsx:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/verify/page.tsx:95"}, "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-fee7686bb925abbb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/onboarding/page.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/onboarding/page.tsx:59"}, "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-ad8ccffb8e7a8086", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/pending/page.tsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/pending/page.tsx:37"}, "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-37b96a8cb8b4916d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/sms.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/sms.ts:31"}, "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-2320b812eaebb0cb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/razorpay.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/razorpay.ts:40"}, "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-3fe42acaa67bef97", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/subscription-proofs.ts:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/subscription-proofs.ts:2"}, "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-ec5d56ae551ec569", "name": "Commented-code block (9 lines) in lib/tn-districts.ts:61", "shortDescription": {"text": "Commented-code block (9 lines) in lib/tn-districts.ts:61"}, "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-0c21ab06515f5f6b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/telegram.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/telegram.ts:49"}, "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-7e75a35bef9a8e35", "name": "Commented-code block (5 lines) in lib/mail.ts:246", "shortDescription": {"text": "Commented-code block (5 lines) in lib/mail.ts:246"}, "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-b334d875f2339fa1", "name": "5 env vars used in code but missing from .env.example", "shortDescription": {"text": "5 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `NODE_ENV`, `WHATSAPP_ACCESS_TOKEN`, `WHATSAPP_GRAPH_VERSION`, `WHATSAPP_PHONE_NUMBER_ID`, `ZEPTOMAIL_WEBHOOK_SECRET`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19753"}, "properties": {"repository": "sivikoomba-ctrl/tanhowa", "repoUrl": "https://github.com/sivikoomba-ctrl/tanhowa", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-45796a9933c27df9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/global-search.tsx:133"}, "properties": {"repobilityId": "d8430c282885d915", "scanner": "scanner-primary", "fingerprint": "45796a9933c27df9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e1e69574ec1c082", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/admin-contacts.tsx:38"}, "properties": {"repobilityId": "69f4d0b9dffcc533", "scanner": "scanner-primary", "fingerprint": "8e1e69574ec1c082", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba52a209e64b66c9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/ui/chart.tsx:95"}, "properties": {"repobilityId": "dd1e3f2d87b6f488", "scanner": "scanner-primary", "fingerprint": "ba52a209e64b66c9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9d48b7b8282ea71e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/page.tsx:464"}, "properties": {"repobilityId": "49f13da6b8e12b22", "scanner": "scanner-primary", "fingerprint": "9d48b7b8282ea71e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55107141b322d670", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/layout.tsx:606"}, "properties": {"repobilityId": "fee0257ec7be510e", "scanner": "scanner-primary", "fingerprint": "55107141b322d670", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0ccd007693a6e15d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/activity/page.tsx:194"}, "properties": {"repobilityId": "24d80e8ef84be2d4", "scanner": "scanner-primary", "fingerprint": "0ccd007693a6e15d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e1004e5205f7625", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/elections/page.tsx:370"}, "properties": {"repobilityId": "c2da9c961a6c78ef", "scanner": "scanner-primary", "fingerprint": "2e1004e5205f7625", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56b98757de6e7aae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/officials/page.tsx:153"}, "properties": {"repobilityId": "39487be5d3833e1d", "scanner": "scanner-primary", "fingerprint": "56b98757de6e7aae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-547b33c17e746bdb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/teams/page.tsx:217"}, "properties": {"repobilityId": "f37aecd45af42de9", "scanner": "scanner-primary", "fingerprint": "547b33c17e746bdb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4559a5b54d1236c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/announcements/page.tsx:315"}, "properties": {"repobilityId": "8cd3dcc9a1f115a6", "scanner": "scanner-primary", "fingerprint": "d4559a5b54d1236c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4e7c2fd79d35a145", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/todos/page.tsx:894"}, "properties": {"repobilityId": "59fc474284500efb", "scanner": "scanner-primary", "fingerprint": "4e7c2fd79d35a145", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac7984026257e253", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/payment-status/page.tsx:126"}, "properties": {"repobilityId": "88782bdb15d1641d", "scanner": "scanner-primary", "fingerprint": "ac7984026257e253", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3cc1e5cd5862f0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/messages/page.tsx:392"}, "properties": {"repobilityId": "a3a4dbf938d9a11b", "scanner": "scanner-primary", "fingerprint": "e3cc1e5cd5862f0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f56f524d3036f129", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/polling/page.tsx:169"}, "properties": {"repobilityId": "df9123226252f607", "scanner": "scanner-primary", "fingerprint": "f56f524d3036f129", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65383a5068f94b47", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/trainings/page.tsx:98"}, "properties": {"repobilityId": "1940a25055194bb7", "scanner": "scanner-primary", "fingerprint": "65383a5068f94b47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eba9b994b0561f62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/profile/page.tsx:599"}, "properties": {"repobilityId": "8c8940fadca2e1f0", "scanner": "scanner-primary", "fingerprint": "eba9b994b0561f62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-061e8b9498d877c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/members/page.tsx:275"}, "properties": {"repobilityId": "4758aa5af069a57b", "scanner": "scanner-primary", "fingerprint": "061e8b9498d877c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6140f81d2ac3af2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/group-chat/page.tsx:1290"}, "properties": {"repobilityId": "4a5e9df20ec1f8dd", "scanner": "scanner-primary", "fingerprint": "c6140f81d2ac3af2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b7c7cbc0aa3f337", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/documents/page.tsx:172"}, "properties": {"repobilityId": "55d8e95c9a58d2e5", "scanner": "scanner-primary", "fingerprint": "7b7c7cbc0aa3f337", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a8b8facbc61c465", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/subscriptions/page.tsx:650"}, "properties": {"repobilityId": "e8a7275676b3bdc6", "scanner": "scanner-primary", "fingerprint": "6a8b8facbc61c465", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ea509983500165b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/project-h/page.tsx:230"}, "properties": {"repobilityId": "5478be785786305c", "scanner": "scanner-primary", "fingerprint": "1ea509983500165b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7a3af48faf89121", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/page.tsx:280"}, "properties": {"repobilityId": "9ccccb6f7c9bbe1c", "scanner": "scanner-primary", "fingerprint": "c7a3af48faf89121", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb3f4c942470a63c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/ai-tools/_components/pest-identifier.tsx:323"}, "properties": {"repobilityId": "fb29422a71e4c3d7", "scanner": "scanner-primary", "fingerprint": "bb3f4c942470a63c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64e041aab0b53711", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/ai-tools/_components/doc-summarizer.tsx:83"}, "properties": {"repobilityId": "d40e91ab201e9b26", "scanner": "scanner-primary", "fingerprint": "64e041aab0b53711", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ad5a6d1d60c8fe4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/page.tsx:191"}, "properties": {"repobilityId": "9c2c16c32be292da", "scanner": "scanner-primary", "fingerprint": "7ad5a6d1d60c8fe4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec621db3fe71f67a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/layout.tsx:307"}, "properties": {"repobilityId": "66bf36e12b8d9b8c", "scanner": "scanner-primary", "fingerprint": "ec621db3fe71f67a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7bda05040d6181e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/photo-review/page.tsx:240"}, "properties": {"repobilityId": "c650adde096e16f5", "scanner": "scanner-primary", "fingerprint": "7bda05040d6181e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d87a9d5b014e4f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/contributions/page.tsx:168"}, "properties": {"repobilityId": "3f641c7abd4df6bc", "scanner": "scanner-primary", "fingerprint": "8d87a9d5b014e4f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1900f0e5781b80a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/analytics/page.tsx:170"}, "properties": {"repobilityId": "ee85aeaf61cc36ee", "scanner": "scanner-primary", "fingerprint": "1900f0e5781b80a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-991105c61b89c608", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/pest-training/page.tsx:182"}, "properties": {"repobilityId": "48b3956948fd8e44", "scanner": "scanner-primary", "fingerprint": "991105c61b89c608", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be4e0b8a8f5845f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/officials/page.tsx:305"}, "properties": {"repobilityId": "00c7bbbf8a2a7e2d", "scanner": "scanner-primary", "fingerprint": "be4e0b8a8f5845f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ff2fb43d912605a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/teams/page.tsx:348"}, "properties": {"repobilityId": "f8f48b8b5eb000e9", "scanner": "scanner-primary", "fingerprint": "3ff2fb43d912605a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a13e08927b7a8510", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/district-dues/page.tsx:172"}, "properties": {"repobilityId": "8f54d0e6489e8a75", "scanner": "scanner-primary", "fingerprint": "a13e08927b7a8510", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13b0dd4319046f75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/todos/_components/TodoDetailView.tsx:478"}, "properties": {"repobilityId": "3b332fe9e3733035", "scanner": "scanner-primary", "fingerprint": "13b0dd4319046f75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56f5eea2b4afcaee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/verify-payments/page.tsx:620"}, "properties": {"repobilityId": "74da3160b7fab087", "scanner": "scanner-primary", "fingerprint": "56f5eea2b4afcaee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4416791ba0d5d69d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/audit-logs/page.tsx:151"}, "properties": {"repobilityId": "975fd21e9e10e0a6", "scanner": "scanner-primary", "fingerprint": "4416791ba0d5d69d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fae1b6316df0523f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/trainings/page.tsx:366"}, "properties": {"repobilityId": "6a6ddb8c582dc6f0", "scanner": "scanner-primary", "fingerprint": "fae1b6316df0523f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52f43d981c442f3d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/at-risk-members/page.tsx:282"}, "properties": {"repobilityId": "d9efab65bb235037", "scanner": "scanner-primary", "fingerprint": "52f43d981c442f3d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cfb12c6565d0bfe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/group-chat/page.tsx:455"}, "properties": {"repobilityId": "c12d9d3670f4a470", "scanner": "scanner-primary", "fingerprint": "8cfb12c6565d0bfe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d23c7d6777e3564", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/documents/page.tsx:480"}, "properties": {"repobilityId": "37fe8e9be84b1454", "scanner": "scanner-primary", "fingerprint": "9d23c7d6777e3564", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b7a1eea50e32905f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/subscriptions/page.tsx:1124"}, "properties": {"repobilityId": "b41517942cc81309", "scanner": "scanner-primary", "fingerprint": "b7a1eea50e32905f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ee288d5dea6cd5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/special-documents/page.tsx:289"}, "properties": {"repobilityId": "ee2b7f7f8187474a", "scanner": "scanner-primary", "fingerprint": "9ee288d5dea6cd5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f666fc5a3323456f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/sms.ts:59"}, "properties": {"repobilityId": "55c519b2dc676828", "scanner": "scanner-primary", "fingerprint": "f666fc5a3323456f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d9c436d3947cf11b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 lib/tn-districts.ts:69"}, "properties": {"repobilityId": "6e823a1ea0442d8c", "scanner": "scanner-primary", "fingerprint": "d9c436d3947cf11b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c8828b526257cfa9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/ui/chart.tsx:95"}, "properties": {"repobilityId": "c41c7626c87bbabe", "scanner": "scanner-primary", "fingerprint": "c8828b526257cfa9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/ui/chart.tsx"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-f83e15ca839c03b7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/announcements/page.tsx:315"}, "properties": {"repobilityId": "69c85f94a9942688", "scanner": "scanner-primary", "fingerprint": "f83e15ca839c03b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/announcements/page.tsx"}, "region": {"startLine": 315}}}]}, {"ruleId": "scanner-c210e7fed77faee0", "level": "note", "message": {"text": "Insecure pattern 'document_write' in app/admin/roster/page.tsx:265"}, "properties": {"repobilityId": "6861670e18fe332f", "scanner": "scanner-primary", "fingerprint": "c210e7fed77faee0", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/admin/roster/page.tsx"}, "region": {"startLine": 265}}}]}, {"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-20e7c8eed5df03fb", "level": "note", "message": {"text": "Very large file: app/dashboard/todos/page.tsx (1645 lines)"}, "properties": {"repobilityId": "23a04eca9774cfa1", "scanner": "scanner-primary", "fingerprint": "20e7c8eed5df03fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a38514bf7eee4a3e", "level": "note", "message": {"text": "Very large file: app/dashboard/profile/page.tsx (1278 lines)"}, "properties": {"repobilityId": "dc787bf20f826acd", "scanner": "scanner-primary", "fingerprint": "a38514bf7eee4a3e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6d1cc1e4220c6d50", "level": "note", "message": {"text": "Very large file: app/dashboard/group-chat/page.tsx (1974 lines)"}, "properties": {"repobilityId": "211cfef4feeeb7df", "scanner": "scanner-primary", "fingerprint": "6d1cc1e4220c6d50", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-783d637e2d2de6d5", "level": "note", "message": {"text": "Very large file: app/dashboard/subscriptions/page.tsx (1354 lines)"}, "properties": {"repobilityId": "3e670faa2dff7418", "scanner": "scanner-primary", "fingerprint": "783d637e2d2de6d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb18d6c642a37bab", "level": "note", "message": {"text": "Very large file: app/admin/finance/page.tsx (1278 lines)"}, "properties": {"repobilityId": "9872cddf10b82821", "scanner": "scanner-primary", "fingerprint": "eb18d6c642a37bab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea2b5ac8937d9e26", "level": "note", "message": {"text": "Very large file: app/admin/vouchers/page.tsx (1175 lines)"}, "properties": {"repobilityId": "1e64246ebb79cc78", "scanner": "scanner-primary", "fingerprint": "ea2b5ac8937d9e26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6bde7dfd76d0b3f1", "level": "note", "message": {"text": "Very large file: app/admin/subscriptions/page.tsx (2572 lines)"}, "properties": {"repobilityId": "cb01e55a5be42642", "scanner": "scanner-primary", "fingerprint": "6bde7dfd76d0b3f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3f683d78c070c218", "level": "note", "message": {"text": "Very large file: lib/i18n/translations.ts (996 lines)"}, "properties": {"repobilityId": "6fb1549a8d27c122", "scanner": "scanner-primary", "fingerprint": "3f683d78c070c218", "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-777a13c1a0a37351", "level": "note", "message": {"text": "64 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "777a13c1a0a37351", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "b055ba90268807d8", "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": "06e885851593da20", "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": "406830ae82054c2b", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "f84080817e9f38d4", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "a9429f049671c3bb", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "d8ec45170eb24edc", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "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": "43dec91828b3df61", "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": "07c5a7afcb5b783b", "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": "536e6f3ea59457c9", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-17d866d91a7c451e", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: CLAUDE.md"}, "properties": {"repobilityId": "ccce5984e58a48f0", "scanner": "scanner-primary", "fingerprint": "17d866d91a7c451e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-167bc2dbd55dcb0f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/strip-honorific-names.mjs:44"}, "properties": {"repobilityId": "2904121661213055", "scanner": "scanner-primary", "fingerprint": "167bc2dbd55dcb0f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80ef7d0689f30b7b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ds-djs-coverage.mjs:35"}, "properties": {"repobilityId": "1cd08a2d50158066", "scanner": "scanner-primary", "fingerprint": "80ef7d0689f30b7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3febd2946f1c22fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/team-leads-audit.mjs:104"}, "properties": {"repobilityId": "a5fce0649e4e001b", "scanner": "scanner-primary", "fingerprint": "3febd2946f1c22fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-29b6d9d7e86d147c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/assign-team-leads.mjs:52"}, "properties": {"repobilityId": "073dba924157dfe6", "scanner": "scanner-primary", "fingerprint": "29b6d9d7e86d147c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea4f0b11cfc67725", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 components/push-manager.tsx:47"}, "properties": {"repobilityId": "58933cbad7cedd0d", "scanner": "scanner-primary", "fingerprint": "ea4f0b11cfc67725", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fd902eb11405b5f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/page.tsx:58"}, "properties": {"repobilityId": "1804ada6d6995586", "scanner": "scanner-primary", "fingerprint": "fd902eb11405b5f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d5fa3d7d44af9db", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/upload/payment-proof/extract-date/route.ts:42"}, "properties": {"repobilityId": "f2b7e1895b2a559b", "scanner": "scanner-primary", "fingerprint": "5d5fa3d7d44af9db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-25e3a5fc869e1504", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/google/callback/route.ts:45"}, "properties": {"repobilityId": "863e329754849dc1", "scanner": "scanner-primary", "fingerprint": "25e3a5fc869e1504", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f583e2167649ef1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/auth/facebook/callback/route.ts:58"}, "properties": {"repobilityId": "f62dab400bc82bea", "scanner": "scanner-primary", "fingerprint": "f583e2167649ef1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-710b03ce0dbf5ee3", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/admin/teams/notify-leads/route.ts:6"}, "properties": {"repobilityId": "30831a9571b79e2c", "scanner": "scanner-primary", "fingerprint": "710b03ce0dbf5ee3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df35935e862cbd40", "level": "none", "message": {"text": "Commented-code block (9 lines) in app/api/cron/daily-briefing/route.ts:7"}, "properties": {"repobilityId": "68819c32cfee460f", "scanner": "scanner-primary", "fingerprint": "df35935e862cbd40", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0431293544e17c73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cron/duplicate-scan/route.ts:107"}, "properties": {"repobilityId": "95e066d7068c463a", "scanner": "scanner-primary", "fingerprint": "0431293544e17c73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2cf4488428a35b1d", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/cron/task-reminder/route.ts:6"}, "properties": {"repobilityId": "b070ac497b2bafc1", "scanner": "scanner-primary", "fingerprint": "2cf4488428a35b1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bdccb0bb62dca779", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/cron/daily-greetings/route.ts:6"}, "properties": {"repobilityId": "942052203fc76ef1", "scanner": "scanner-primary", "fingerprint": "bdccb0bb62dca779", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64529851b3f06046", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/api/cron/stuck-tasks/route.ts:6"}, "properties": {"repobilityId": "647f6d3610972cea", "scanner": "scanner-primary", "fingerprint": "64529851b3f06046", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-877016b6758028b6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ai-tools/weather-advisory/route.ts:81"}, "properties": {"repobilityId": "55676a8ffb2b5cab", "scanner": "scanner-primary", "fingerprint": "877016b6758028b6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c02d467d150c57c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/page.tsx:113"}, "properties": {"repobilityId": "9c66b3a906e845cb", "scanner": "scanner-primary", "fingerprint": "6c02d467d150c57c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e026f2b5a5bfaf6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/layout.tsx:180"}, "properties": {"repobilityId": "34132ced37e29794", "scanner": "scanner-primary", "fingerprint": "6e026f2b5a5bfaf6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59a4f6e9b92b0300", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/events/page.tsx:96"}, "properties": {"repobilityId": "c286517c1d34cdef", "scanner": "scanner-primary", "fingerprint": "59a4f6e9b92b0300", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4acd7e49657c0add", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/achievements/page.tsx:74"}, "properties": {"repobilityId": "5b3269be35cac7fc", "scanner": "scanner-primary", "fingerprint": "4acd7e49657c0add", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-45eaaacd73419012", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/activity/page.tsx:31"}, "properties": {"repobilityId": "446501a5066d4236", "scanner": "scanner-primary", "fingerprint": "45eaaacd73419012", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e54b3920d17c5b4f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/vouchers/page.tsx:83"}, "properties": {"repobilityId": "ac34d9d64597b4aa", "scanner": "scanner-primary", "fingerprint": "e54b3920d17c5b4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c23862254e4ed2ad", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/announcements/page.tsx:86"}, "properties": {"repobilityId": "d0a57a319de213a8", "scanner": "scanner-primary", "fingerprint": "c23862254e4ed2ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8a692a7fe166f1c6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/announcements/page.tsx:169"}, "properties": {"repobilityId": "9554e008c433dd6f", "scanner": "scanner-primary", "fingerprint": "8a692a7fe166f1c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6521b7d5a8486edb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/todos/page.tsx:295"}, "properties": {"repobilityId": "63a48b2fc8609328", "scanner": "scanner-primary", "fingerprint": "6521b7d5a8486edb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b6c8b08d6568edc5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/polls/page.tsx:66"}, "properties": {"repobilityId": "2ecfb584b9d3cfd9", "scanner": "scanner-primary", "fingerprint": "b6c8b08d6568edc5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8eea28621143f28d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/wishlist/page.tsx:79"}, "properties": {"repobilityId": "7ca3245d117786de", "scanner": "scanner-primary", "fingerprint": "8eea28621143f28d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-611adbc5403eb293", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/trainings/page.tsx:127"}, "properties": {"repobilityId": "4a6208296224fa01", "scanner": "scanner-primary", "fingerprint": "611adbc5403eb293", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f69d2ea8829fe0ce", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/profile/page.tsx:303"}, "properties": {"repobilityId": "cbf01b32cbf319d4", "scanner": "scanner-primary", "fingerprint": "f69d2ea8829fe0ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af64e47a35c51b5b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/group-chat/page.tsx:831"}, "properties": {"repobilityId": "102bf4ca1c6cc881", "scanner": "scanner-primary", "fingerprint": "af64e47a35c51b5b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d740f8c841146614", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/documents/page.tsx:99"}, "properties": {"repobilityId": "ecf4a591964e5e56", "scanner": "scanner-primary", "fingerprint": "d740f8c841146614", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e06a683bdf30aded", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/subscriptions/page.tsx:400"}, "properties": {"repobilityId": "2c36cc8e94f8e838", "scanner": "scanner-primary", "fingerprint": "e06a683bdf30aded", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fdebfe8e37dcf4cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/project-h/page.tsx:122"}, "properties": {"repobilityId": "693ac63b48edaa71", "scanner": "scanner-primary", "fingerprint": "fdebfe8e37dcf4cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6bcf4fa83cb68491", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/resolutions/page.tsx:27"}, "properties": {"repobilityId": "d8015d1d7bf8d947", "scanner": "scanner-primary", "fingerprint": "6bcf4fa83cb68491", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cbb7fd8a66ef2eb3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/layout.tsx:121"}, "properties": {"repobilityId": "e85a69859bed79da", "scanner": "scanner-primary", "fingerprint": "cbb7fd8a66ef2eb3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8da5b629be63f97e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/settings/page.tsx:34"}, "properties": {"repobilityId": "80c348f71eed0f45", "scanner": "scanner-primary", "fingerprint": "8da5b629be63f97e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8f5bc9f96269ee7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/users/page.tsx:256"}, "properties": {"repobilityId": "7900a045b49cc219", "scanner": "scanner-primary", "fingerprint": "a8f5bc9f96269ee7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e6636e5ce7dead2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/meetings/page.tsx:81"}, "properties": {"repobilityId": "94c0ddbda096f309", "scanner": "scanner-primary", "fingerprint": "5e6636e5ce7dead2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9412b5173b3fd0b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/error-logs/page.tsx:80"}, "properties": {"repobilityId": "6bf9ca5c430e6c36", "scanner": "scanner-primary", "fingerprint": "e9412b5173b3fd0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a11bd0a8b2e4bf2c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/contributions/page.tsx:45"}, "properties": {"repobilityId": "b9d220c77af759a0", "scanner": "scanner-primary", "fingerprint": "a11bd0a8b2e4bf2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-293b0724bd55ee8a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/analytics/page.tsx:78"}, "properties": {"repobilityId": "d2c13cd7f318dcf7", "scanner": "scanner-primary", "fingerprint": "293b0724bd55ee8a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec13b88d4aebc08a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/events/page.tsx:41"}, "properties": {"repobilityId": "227b127b999682f1", "scanner": "scanner-primary", "fingerprint": "ec13b88d4aebc08a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c42881df24247627", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/pest-training/page.tsx:105"}, "properties": {"repobilityId": "e60e45a8d2544ec5", "scanner": "scanner-primary", "fingerprint": "c42881df24247627", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f29ce44e9a660ec6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/suggestions/page.tsx:74"}, "properties": {"repobilityId": "7eb2b9c41a0a9cca", "scanner": "scanner-primary", "fingerprint": "f29ce44e9a660ec6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c73e447629bacf7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/teams/page.tsx:166"}, "properties": {"repobilityId": "c0f5b9f522860b29", "scanner": "scanner-primary", "fingerprint": "c73e447629bacf7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8a15d8161972203", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/special-tasks/page.tsx:102"}, "properties": {"repobilityId": "ea39eaeca5ab69c7", "scanner": "scanner-primary", "fingerprint": "d8a15d8161972203", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5506fd4964d7cb83", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/finance/page.tsx:381"}, "properties": {"repobilityId": "bbd50d1749cb265e", "scanner": "scanner-primary", "fingerprint": "5506fd4964d7cb83", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e008d72cb39bf161", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/service-requests/page.tsx:74"}, "properties": {"repobilityId": "3e9573d3c52801a6", "scanner": "scanner-primary", "fingerprint": "e008d72cb39bf161", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ac83763b5b7cf57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/vouchers/page.tsx:128"}, "properties": {"repobilityId": "d55027307a86c0b2", "scanner": "scanner-primary", "fingerprint": "4ac83763b5b7cf57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36838153bae8ce8a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/announcements/page.tsx:67"}, "properties": {"repobilityId": "9818314fd3e68f38", "scanner": "scanner-primary", "fingerprint": "36838153bae8ce8a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-39c2e98e9a307389", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/todos/page.tsx:128"}, "properties": {"repobilityId": "4a8714dab54c6c69", "scanner": "scanner-primary", "fingerprint": "39c2e98e9a307389", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be6f38405ee4f0e5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/todos/_components/TodoDetailView.tsx:258"}, "properties": {"repobilityId": "3faaaba7440dbcb6", "scanner": "scanner-primary", "fingerprint": "be6f38405ee4f0e5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e5c2d81c11cd4bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/polls/page.tsx:54"}, "properties": {"repobilityId": "993493a935cc3d73", "scanner": "scanner-primary", "fingerprint": "0e5c2d81c11cd4bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ffa04a5cbd4fa9f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/verify-payments/page.tsx:95"}, "properties": {"repobilityId": "36dcb8a908229988", "scanner": "scanner-primary", "fingerprint": "0ffa04a5cbd4fa9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c3ad431032d5b0fc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/wishlist/page.tsx:51"}, "properties": {"repobilityId": "1278cceaaf6cbbbd", "scanner": "scanner-primary", "fingerprint": "c3ad431032d5b0fc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96415d434589ee35", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/audit-logs/page.tsx:57"}, "properties": {"repobilityId": "003f89ccf094838b", "scanner": "scanner-primary", "fingerprint": "96415d434589ee35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75f61a27e630e7f8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/trainings/page.tsx:124"}, "properties": {"repobilityId": "aa2fde1acc2c6381", "scanner": "scanner-primary", "fingerprint": "75f61a27e630e7f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9101f40baad37d2a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/engagement/page.tsx:66"}, "properties": {"repobilityId": "2ad153b50d8e7a00", "scanner": "scanner-primary", "fingerprint": "9101f40baad37d2a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4627c76b7b6c6111", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/overview-tab.tsx:37"}, "properties": {"repobilityId": "5842c83ac75e7449", "scanner": "scanner-primary", "fingerprint": "4627c76b7b6c6111", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e354a70e8b3ee70a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/subscriptions-tab.tsx:60"}, "properties": {"repobilityId": "6cb8852d285c34a7", "scanner": "scanner-primary", "fingerprint": "e354a70e8b3ee70a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c98b4fc09d5b1e65", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/contributions-tab.tsx:42"}, "properties": {"repobilityId": "2be565c7fbfda4e6", "scanner": "scanner-primary", "fingerprint": "c98b4fc09d5b1e65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e84e970de9017a1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/expenses-tab.tsx:92"}, "properties": {"repobilityId": "661e835628e9ffb6", "scanner": "scanner-primary", "fingerprint": "e84e970de9017a1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e865a4e22beebc97", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/reports/_components/performance-tab.tsx:116"}, "properties": {"repobilityId": "0ab1b9e0f621a571", "scanner": "scanner-primary", "fingerprint": "e865a4e22beebc97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-473045a7cf54ca14", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/group-chat/page.tsx:178"}, "properties": {"repobilityId": "92fd4df28128cadc", "scanner": "scanner-primary", "fingerprint": "473045a7cf54ca14", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a47aaefac3bd0658", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/documents/page.tsx:146"}, "properties": {"repobilityId": "55e4dadd08989051", "scanner": "scanner-primary", "fingerprint": "a47aaefac3bd0658", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f8fa5c499a878037", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/subscriptions/page.tsx:199"}, "properties": {"repobilityId": "16d6d8421b5dd19d", "scanner": "scanner-primary", "fingerprint": "f8fa5c499a878037", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5ae1d94e64e7c40", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/special-documents/page.tsx:168"}, "properties": {"repobilityId": "a72f3b171f703801", "scanner": "scanner-primary", "fingerprint": "d5ae1d94e64e7c40", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a31822a4615942c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/faq/page.tsx:82"}, "properties": {"repobilityId": "f8bdb33b5b160aea", "scanner": "scanner-primary", "fingerprint": "1a31822a4615942c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5011a53ee92a2d9b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/resolutions/page.tsx:88"}, "properties": {"repobilityId": "cc505d5f37b0be5c", "scanner": "scanner-primary", "fingerprint": "5011a53ee92a2d9b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d3359a8ee39f8073", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/verify/page.tsx:95"}, "properties": {"repobilityId": "090e78973ea569e7", "scanner": "scanner-primary", "fingerprint": "d3359a8ee39f8073", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fee7686bb925abbb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/onboarding/page.tsx:59"}, "properties": {"repobilityId": "aaf09ba10bfdb8a2", "scanner": "scanner-primary", "fingerprint": "fee7686bb925abbb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ad8ccffb8e7a8086", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/pending/page.tsx:37"}, "properties": {"repobilityId": "354c86dc76b02070", "scanner": "scanner-primary", "fingerprint": "ad8ccffb8e7a8086", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37b96a8cb8b4916d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/sms.ts:31"}, "properties": {"repobilityId": "e1a85d76f8bc8eee", "scanner": "scanner-primary", "fingerprint": "37b96a8cb8b4916d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2320b812eaebb0cb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/razorpay.ts:40"}, "properties": {"repobilityId": "abba59b5488f76ce", "scanner": "scanner-primary", "fingerprint": "2320b812eaebb0cb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fe42acaa67bef97", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/subscription-proofs.ts:2"}, "properties": {"repobilityId": "b38e38c0918de1f4", "scanner": "scanner-primary", "fingerprint": "3fe42acaa67bef97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ec5d56ae551ec569", "level": "none", "message": {"text": "Commented-code block (9 lines) in lib/tn-districts.ts:61"}, "properties": {"repobilityId": "39174d7a3e5c514e", "scanner": "scanner-primary", "fingerprint": "ec5d56ae551ec569", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0c21ab06515f5f6b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/telegram.ts:49"}, "properties": {"repobilityId": "5afbf633b150cd7c", "scanner": "scanner-primary", "fingerprint": "0c21ab06515f5f6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e75a35bef9a8e35", "level": "none", "message": {"text": "Commented-code block (5 lines) in lib/mail.ts:246"}, "properties": {"repobilityId": "f512c6405f9e0098", "scanner": "scanner-primary", "fingerprint": "7e75a35bef9a8e35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b334d875f2339fa1", "level": "note", "message": {"text": "5 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "faa38682016f5d53", "scanner": "scanner-primary", "fingerprint": "b334d875f2339fa1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}