{"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-167e6adb1c0b5fd9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:89"}, "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-666580a40ae62376", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/rse/OrganisationsSidebar.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/rse/OrganisationsSidebar.tsx:193"}, "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-01ad6ecfe990f191", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/RapportIntegre.tsx:372", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/RapportIntegre.tsx:372"}, "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-6e6987885f7d34bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GpsrDiagnosticApp.tsx:456", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GpsrDiagnosticApp.tsx:456"}, "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-6273c492495f4fab", "name": "Icon-only button without accessible name \u2014 src/components/apps/GuidedAnnexesModal.tsx:255", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/GuidedAnnexesModal.tsx:255"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0f7ecb1c1abc4a0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedAnnexesModal.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedAnnexesModal.tsx:296"}, "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-759b06756a832875", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedDiagnostic.tsx:1074", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedDiagnostic.tsx:1074"}, "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-4d423164bd364a6c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ODDExplorerApp.tsx:812", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ODDExplorerApp.tsx:812"}, "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-9e6721f0b8edfcce", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/EcoVadisDiagnosticApp.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/EcoVadisDiagnosticApp.tsx:294"}, "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-1ecaa2a7b8b59ff5", "name": "Icon-only button without accessible name \u2014 src/components/apps/ISO26000DiagApp.tsx:318", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/ISO26000DiagApp.tsx:318"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e093379cbf82f5c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ISO26000DiagApp.tsx:620", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ISO26000DiagApp.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-0a7649f1ded5799b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BilanGesCalculateur.tsx:394", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BilanGesCalculateur.tsx:394"}, "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-50a2eb2fefbc1f46", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ActionNotePanel.tsx:501", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ActionNotePanel.tsx:501"}, "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-7656bbbcb8f85391", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/apps/ActionNotePanel.tsx:787", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/apps/ActionNotePanel.tsx:787"}, "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-f35de137f3cceaa2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GestionTempsApp.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GestionTempsApp.tsx:215"}, "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-61584a5df152645a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BcorpDiagnosticApp.tsx:450", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BcorpDiagnosticApp.tsx:450"}, "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-4234ce3e70e57ed3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/EudrDiagnosticApp.tsx:433", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/EudrDiagnosticApp.tsx:433"}, "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-75b67edbf21c996c", "name": "Icon-only button without accessible name \u2014 src/components/apps/ShareBoardModal.tsx:151", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/ShareBoardModal.tsx:151"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b14a7d3ad55d3193", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ShareBoardModal.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ShareBoardModal.tsx:149"}, "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-773fe56b6ed7f53e", "name": "Icon-only button without accessible name \u2014 src/components/apps/VsmeEfragApp.tsx:680", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/VsmeEfragApp.tsx:680"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-039f7eb419ac6173", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/VsmeEfragApp.tsx:615", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/VsmeEfragApp.tsx:615"}, "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-7402964e75b728a6", "name": "Icon-only button without accessible name \u2014 src/components/apps/GreenClaimsApp.tsx:507", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/GreenClaimsApp.tsx:507"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5cd6d817e480a510", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GreenClaimsApp.tsx:552", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GreenClaimsApp.tsx:552"}, "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-9a53f181829b3bb0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ActCarboneDiagnosticApp.tsx:435", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ActCarboneDiagnosticApp.tsx:435"}, "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-42abfb156f5622ef", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Iso50001DiagnosticApp.tsx:449", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Iso50001DiagnosticApp.tsx:449"}, "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-2f7c037a5a568716", "name": "Icon-only button without accessible name \u2014 src/components/apps/ISO26000AnnexesModal.tsx:349", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/ISO26000AnnexesModal.tsx:349"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a79f903a1ddae31d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ISO26000AnnexesModal.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ISO26000AnnexesModal.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-2c156774d91ea5b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/LabelNrDiagnosticApp.tsx:442", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/LabelNrDiagnosticApp.tsx:442"}, "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-bca6fff868b0111a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedActionNotePanel.tsx:500", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedActionNotePanel.tsx:500"}, "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-3fd3c18cfda39ac2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/apps/GuidedActionNotePanel.tsx:726", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/apps/GuidedActionNotePanel.tsx:726"}, "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-c15debe92e27e80e", "name": "Icon-only button without accessible name \u2014 src/components/apps/GestionOrganisationsApp.tsx:147", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/GestionOrganisationsApp.tsx:147"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17fa2536b955e78d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GestionOrganisationsApp.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GestionOrganisationsApp.tsx:119"}, "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-607d046d5286e260", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Sapin2DiagnosticApp.tsx:417", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Sapin2DiagnosticApp.tsx:417"}, "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-e196ac8ba93fef3c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Afaq26000DiagnosticApp.tsx:459", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Afaq26000DiagnosticApp.tsx:459"}, "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-91d6459fc8b81612", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Iso45001DiagnosticApp.tsx:450", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Iso45001DiagnosticApp.tsx:450"}, "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-20fbebdb3bc7f21a", "name": "Icon-only button without accessible name \u2014 src/components/apps/BoardsApp.tsx:337", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/BoardsApp.tsx:337"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53b05bd77ff5c02e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BoardsApp.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BoardsApp.tsx:294"}, "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-e296c43987313026", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BilanGesDiagnosticApp.tsx:468", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BilanGesDiagnosticApp.tsx:468"}, "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-079787c14e2c014b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/VigilanceDiagnosticApp.tsx:416", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/VigilanceDiagnosticApp.tsx:416"}, "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-345fe85fdc717a27", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AfnorRseDiagnosticApp.tsx:449", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AfnorRseDiagnosticApp.tsx:449"}, "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-2241c821ea536f6c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/PartiesPrenantesApp.tsx:741", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/PartiesPrenantesApp.tsx:741"}, "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-a576f977d0cab261", "name": "Icon-only button without accessible name \u2014 src/components/apps/AgriTracker/index.tsx:376", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/apps/AgriTracker/index.tsx:376"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b9591ab5ed8dc8c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AgriTracker/index.tsx:1122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AgriTracker/index.tsx:1122"}, "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-061f21f49e0e441e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AgriTracker/CRM.tsx:140", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AgriTracker/CRM.tsx:140"}, "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-a68dd09d0559a8d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/FileUpload.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/FileUpload.tsx:139"}, "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-641312df043d4b29", "name": "Icon-only button without accessible name \u2014 src/components/ui/FileViewerModal.tsx:44", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/ui/FileViewerModal.tsx:44"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-47d1c2ef6ff9c796", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/FileViewerModal.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/FileViewerModal.tsx:35"}, "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-1778647ed31fa96c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/SharePointBrowser.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/SharePointBrowser.tsx:137"}, "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-8d24789739c277ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/FavoritesBoard.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/FavoritesBoard.tsx:84"}, "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-8036d6d54b5bf77f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/PermissionsManager.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/PermissionsManager.tsx:175"}, "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-12063bbd8da31b39", "name": "Icon-only button without accessible name \u2014 src/components/admin/UsersManager.tsx:122", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/admin/UsersManager.tsx:122"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d34cd67955a025f5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/UsersManager.tsx:444", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/UsersManager.tsx:444"}, "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-6890afd641c8d1ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/CategoriesManager.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/CategoriesManager.tsx:96"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ba4e9523876c0164", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AgriRolesManager.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AgriRolesManager.tsx:181"}, "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-fb3e70cc3d7c89bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/VenteManager.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/VenteManager.tsx:152"}, "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-99d4adb1f764db0a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/SharepointAdmin.tsx:389", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/SharepointAdmin.tsx:389"}, "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-9f0a36d52d8e0e0e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:22", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:22"}, "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-e0473427f100a6e4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/logs/page.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/logs/page.tsx:253"}, "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-ecf97f0caea82aed", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/apps/ActionNotePanel.tsx:787", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/apps/ActionNotePanel.tsx:787"}, "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-2bc29e02aa88aa27", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/apps/GuidedActionNotePanel.tsx:726", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/apps/GuidedActionNotePanel.tsx:726"}, "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-f20eba0493cb9fe0", "name": "Possible secret in src/components/admin/TicketsManager.tsx", "shortDescription": {"text": "Possible secret in src/components/admin/TicketsManager.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-0754d52c214f5cac", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:22", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:22"}, "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-3a006adf3b60255e", "name": "Very large file: src/components/apps/RapportIntegre.tsx (863 lines)", "shortDescription": {"text": "Very large file: src/components/apps/RapportIntegre.tsx (863 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-c315392911d390ba", "name": "Very large file: src/components/apps/GpsrDiagnosticApp.tsx (1578 lines)", "shortDescription": {"text": "Very large file: src/components/apps/GpsrDiagnosticApp.tsx (1578 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-3259608d68e76d40", "name": "Very large file: src/components/apps/GuidedDiagnostic.tsx (1712 lines)", "shortDescription": {"text": "Very large file: src/components/apps/GuidedDiagnostic.tsx (1712 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-0a1ae929803f9f18", "name": "Very large file: src/components/apps/ODDExplorerApp.tsx (1416 lines)", "shortDescription": {"text": "Very large file: src/components/apps/ODDExplorerApp.tsx (1416 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-5a69728d74265628", "name": "Very large file: src/components/apps/EcoVadisDiagnosticApp.tsx (1584 lines)", "shortDescription": {"text": "Very large file: src/components/apps/EcoVadisDiagnosticApp.tsx (1584 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-802e7db09c4be3fe", "name": "Very large file: src/components/apps/ISO26000DiagApp.tsx (1496 lines)", "shortDescription": {"text": "Very large file: src/components/apps/ISO26000DiagApp.tsx (1496 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-b03b82696c2a9fd9", "name": "Very large file: src/components/apps/BilanGesCalculateur.tsx (3101 lines)", "shortDescription": {"text": "Very large file: src/components/apps/BilanGesCalculateur.tsx (3101 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-af6637f8cde97f3d", "name": "Very large file: src/components/apps/GestionTempsApp.tsx (1536 lines)", "shortDescription": {"text": "Very large file: src/components/apps/GestionTempsApp.tsx (1536 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-c512b651226934e4", "name": "Very large file: src/components/apps/BcorpDiagnosticApp.tsx (1584 lines)", "shortDescription": {"text": "Very large file: src/components/apps/BcorpDiagnosticApp.tsx (1584 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-e93d52b5f2fffa33", "name": "Very large file: src/components/apps/EudrDiagnosticApp.tsx (1545 lines)", "shortDescription": {"text": "Very large file: src/components/apps/EudrDiagnosticApp.tsx (1545 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-1a0b012c631f3fd2", "name": "Very large file: src/components/apps/VsmeEfragApp.tsx (1281 lines)", "shortDescription": {"text": "Very large file: src/components/apps/VsmeEfragApp.tsx (1281 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-9c31adc9f70d1753", "name": "Very large file: src/components/apps/ActCarboneDiagnosticApp.tsx (1528 lines)", "shortDescription": {"text": "Very large file: src/components/apps/ActCarboneDiagnosticApp.tsx (1528 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-2fa78185d4583c28", "name": "Very large file: src/components/apps/Iso50001DiagnosticApp.tsx (1582 lines)", "shortDescription": {"text": "Very large file: src/components/apps/Iso50001DiagnosticApp.tsx (1582 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-82d7ef9d1fe4fd2b", "name": "Very large file: src/components/apps/LabelNrDiagnosticApp.tsx (1573 lines)", "shortDescription": {"text": "Very large file: src/components/apps/LabelNrDiagnosticApp.tsx (1573 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-a5cbff7887b3a822", "name": "Very large file: src/components/apps/Sapin2DiagnosticApp.tsx (1469 lines)", "shortDescription": {"text": "Very large file: src/components/apps/Sapin2DiagnosticApp.tsx (1469 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-7c497832a9cff2d8", "name": "Very large file: src/components/apps/Afaq26000DiagnosticApp.tsx (1578 lines)", "shortDescription": {"text": "Very large file: src/components/apps/Afaq26000DiagnosticApp.tsx (1578 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-eb9238dbfb89ff50", "name": "Very large file: src/components/apps/Iso45001DiagnosticApp.tsx (1579 lines)", "shortDescription": {"text": "Very large file: src/components/apps/Iso45001DiagnosticApp.tsx (1579 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-07e1a92ca03554c2", "name": "Very large file: src/components/apps/BilanGesDiagnosticApp.tsx (1601 lines)", "shortDescription": {"text": "Very large file: src/components/apps/BilanGesDiagnosticApp.tsx (1601 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-3db9b0fd83fe123e", "name": "Very large file: src/components/apps/VigilanceDiagnosticApp.tsx (1520 lines)", "shortDescription": {"text": "Very large file: src/components/apps/VigilanceDiagnosticApp.tsx (1520 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-9f43e001ce60a02a", "name": "Very large file: src/components/apps/AfnorRseDiagnosticApp.tsx (1571 lines)", "shortDescription": {"text": "Very large file: src/components/apps/AfnorRseDiagnosticApp.tsx (1571 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-66957cf34997627e", "name": "Very large file: src/components/apps/PartiesPrenantesApp.tsx (2174 lines)", "shortDescription": {"text": "Very large file: src/components/apps/PartiesPrenantesApp.tsx (2174 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-67daf7b39638e426", "name": "Very large file: src/components/apps/AgriTracker/index.tsx (3887 lines)", "shortDescription": {"text": "Very large file: src/components/apps/AgriTracker/index.tsx (3887 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-83fb8a2050f878be", "name": "Very large file: src/components/apps/AgriTracker/CRM.tsx (1166 lines)", "shortDescription": {"text": "Very large file: src/components/apps/AgriTracker/CRM.tsx (1166 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-ec5bbfb0a2635532", "name": "Very large file: src/components/apps/SecureScoreM365/index.tsx (1559 lines)", "shortDescription": {"text": "Very large file: src/components/apps/SecureScoreM365/index.tsx (1559 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": "2 test file(s) for 430 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e8e6d4015425285", "name": "49 TODO/FIXME markers", "shortDescription": {"text": "49 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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 269 placeholder/mock markers across 52 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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. 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-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d8f1ef02c0d843f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/layout/Footer.tsx:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/layout/Footer.tsx:17"}, "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-6985c35932ffeef0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/RapportIntegre.tsx:691", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/RapportIntegre.tsx:691"}, "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-902b364ceb972606", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GpsrDiagnosticApp.tsx:764", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GpsrDiagnosticApp.tsx:764"}, "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-f8ece619570ac003", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedAnnexesModal.tsx:165", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedAnnexesModal.tsx:165"}, "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-7bf79fa599f366c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedDiagnostic.tsx:469", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedDiagnostic.tsx:469"}, "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-2e8b7491343517b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ODDExplorerApp.tsx:554", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ODDExplorerApp.tsx:554"}, "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-623283753c070df9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/EcoVadisDiagnosticApp.tsx:640", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/EcoVadisDiagnosticApp.tsx:640"}, "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-f9511c30c410047e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ISO26000DiagApp.tsx:309", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ISO26000DiagApp.tsx:309"}, "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-87a7dc96a3007929", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BilanGesCalculateur.tsx:508", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BilanGesCalculateur.tsx:508"}, "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-9f1e2737861a830e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ActionNotePanel.tsx:216", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ActionNotePanel.tsx:216"}, "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-5c4d57ac6ad20210", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GestionTempsApp.tsx:325", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GestionTempsApp.tsx:325"}, "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-121387cf4e846441", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BcorpDiagnosticApp.tsx:770", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BcorpDiagnosticApp.tsx:770"}, "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-1a672a34a94ff6b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/EudrDiagnosticApp.tsx:731", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/EudrDiagnosticApp.tsx:731"}, "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-41952e1a96a2cca7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ShareBoardModal.tsx:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ShareBoardModal.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-248f2e9cf0fb168e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GreenClaimsApp.tsx:691", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GreenClaimsApp.tsx:691"}, "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-aadfeb7cd4d01f6e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ActCarboneDiagnosticApp.tsx:714", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ActCarboneDiagnosticApp.tsx:714"}, "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-907d6f960eb2cda6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Iso50001DiagnosticApp.tsx:768", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Iso50001DiagnosticApp.tsx:768"}, "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-34ba7b2adef1582c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ISO26000AnnexesModal.tsx:250", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ISO26000AnnexesModal.tsx:250"}, "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-4292abb0d6e9af26", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/LabelNrDiagnosticApp.tsx:759", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/LabelNrDiagnosticApp.tsx:759"}, "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-7e10e74610917f57", "name": "Commented-code block (5 lines) in src/components/apps/GuidedActionNotePanel.tsx:935", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/apps/GuidedActionNotePanel.tsx:935"}, "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-ce1c526c45ca95a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedActionNotePanel.tsx:222", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedActionNotePanel.tsx:222"}, "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-aecf3878951ab60e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BoardEditor.tsx:234", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BoardEditor.tsx:234"}, "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-b6c8f9a004ec7b48", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Sapin2DiagnosticApp.tsx:704", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Sapin2DiagnosticApp.tsx:704"}, "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-61f0ce87fd1cbd3c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Afaq26000DiagnosticApp.tsx:764", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Afaq26000DiagnosticApp.tsx:764"}, "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-378b43f321673895", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Iso45001DiagnosticApp.tsx:765", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Iso45001DiagnosticApp.tsx:765"}, "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-c6a4f215c78bcaf2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BoardsApp.tsx:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BoardsApp.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-a9463ac5ab421001", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BilanGesDiagnosticApp.tsx:785", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BilanGesDiagnosticApp.tsx:785"}, "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-dde54bd239d57d10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/VigilanceDiagnosticApp.tsx:705", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/VigilanceDiagnosticApp.tsx:705"}, "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-7581b0a5511c84f0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AfnorRseDiagnosticApp.tsx:752", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AfnorRseDiagnosticApp.tsx:752"}, "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-9a3abc28dbd9f585", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AgriTracker/index.tsx:343", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AgriTracker/index.tsx:343"}, "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-efc5ac0023ba6f7c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AgriTracker/CRM.tsx:301", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AgriTracker/CRM.tsx:301"}, "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-5bbf96f9de0ce851", "name": "Legacy-named symbol `daysOld` in src/components/apps/SecureScoreM365/index.tsx:33", "shortDescription": {"text": "Legacy-named symbol `daysOld` in src/components/apps/SecureScoreM365/index.tsx:33"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-16edb7279b1fc86b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/SecureScoreM365/index.tsx:1303", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/SecureScoreM365/index.tsx:1303"}, "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-afc438a452b0bd06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ui/FileUpload.tsx:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ui/FileUpload.tsx:33"}, "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-726189044ce91d1a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/PermissionsManager.tsx:106", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/PermissionsManager.tsx:106"}, "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-478eb486891e8337", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/SubscriptionsManager.tsx:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/SubscriptionsManager.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-7550990f7ab0527a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/SharepointAdmin.tsx:299", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/SharepointAdmin.tsx:299"}, "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-3727ce9137cf5226", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/account/AccountSettings.tsx:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/account/AccountSettings.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-9cb2d8462acc3065", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/auth/login/page.tsx:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/auth/login/page.tsx:46"}, "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-f12843a53f938287", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/auth/register/route.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/auth/register/route.ts:75"}, "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-7ea0502025ad2c58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sharepoint/image/route.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sharepoint/image/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-a84867bf933876cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sharepoint/download/route.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sharepoint/download/route.ts:19"}, "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-c514feecfe87f0ff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/supabase-migrator/transfer/route.ts:248", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/supabase-migrator/transfer/route.ts:248"}, "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-fdaaca9e8df36dd6", "name": "Legacy-named symbol `daysOld` in src/app/api/secure-score/score/route.ts:75", "shortDescription": {"text": "Legacy-named symbol `daysOld` in src/app/api/secure-score/score/route.ts:75"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e66b91bb85a993a1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/score/route.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/score/route.ts:7"}, "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-93394118dc76df38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/unlock/route.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/unlock/route.ts:6"}, "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-49372b5a963b9cdb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/device-auth/route.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/device-auth/route.ts:21"}, "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-18791dcf84bab529", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/optimize/route.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/optimize/route.ts:6"}, "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-77da607c6e9c53d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/setup-rbac/route.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/setup-rbac/route.ts:6"}, "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-3af8042343e9aa44", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/weather/route.ts:122", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/weather/route.ts: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-77ac2922f49a03bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/weather/sync/route.ts:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/weather/sync/route.ts:155"}, "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-7c1cf2a4b93129e8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/faostat/route.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/faostat/route.ts:159"}, "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-fad499720c004f24", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/observations/[id]/action-notes/[key]/upload/route.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/observations/[id]/action-notes/[key]/upload/route.ts:43"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8500174c4355def", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/observations/[id]/action-notes/[key]/upload-session/route", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/observations/[id]/action-notes/[key]/upload-session/route.ts:76"}, "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-befade2a306c8935", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/marches/route.ts:124", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/marches/route.ts: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-ac21903ed4ccad65", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/upload/route.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/upload/route.ts:39"}, "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-75b13588131f7069", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/[id]/action-notes/[key]/upload/route.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/[id]/action-notes/[key]/upload/route.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-a203816a97be3e76", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/[id]/action-notes/[key]/upload-session/route.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/[id]/action-notes/[key]/upload-session/route.ts:33"}, "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-14eb90876d487584", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/upload-session/route.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/upload-session/route.ts: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-5fdd6e1a57d0405a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/crm/upload-session/route.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/crm/upload-session/route.ts: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-bf62c5c9adaa1c15", "name": "Commented-code block (5 lines) in src/app/api/public/survey/[token]/route.ts:70", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/public/survey/[token]/route.ts:70"}, "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-30cfd9dacdbe75e7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/quotes/route.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/quotes/route.ts: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-cea180df91b57a07", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/logs/page.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/logs/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-2a4bba8f44d0c9c5", "name": "Commented-code block (7 lines) in src/lib/sharepointSecurity.ts:8", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sharepointSecurity.ts:8"}, "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-ce2e4babcedc85d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepoint.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepoint.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-d406ceaec0097226", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointUploadSession.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointUploadSession.ts:24"}, "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-8236833a8ba64b66", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointGraph.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointGraph.ts:53"}, "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-8f1aba1a0caba3a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/msGraph.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/msGraph.ts:28"}, "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-a87829f3cde84fa6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointMulti.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointMulti.ts: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-d9474b3c5160b104", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSharePointFolder.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSharePointFolder.ts: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-f3ffa508b64f5e5e", "name": "Commented-code block (5 lines) in src/hooks/useApps.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useApps.ts:9"}, "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-1190b9c49f2bf173", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAgriCrmUnread.ts:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAgriCrmUnread.ts:16"}, "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-d4bf7492e2a78d22", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSharePointBrowser.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSharePointBrowser.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}}]}}, "automationDetails": {"id": "repobility/19248"}, "properties": {"repository": "SensethO/sensetho-apps2", "repoUrl": "https://github.com/SensethO/sensetho-apps2", "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-167e6adb1c0b5fd9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/layout/Sidebar.tsx:89"}, "properties": {"repobilityId": "be1152cdf47927a8", "scanner": "scanner-primary", "fingerprint": "167e6adb1c0b5fd9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-666580a40ae62376", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/rse/OrganisationsSidebar.tsx:193"}, "properties": {"repobilityId": "550963be022238d6", "scanner": "scanner-primary", "fingerprint": "666580a40ae62376", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01ad6ecfe990f191", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/RapportIntegre.tsx:372"}, "properties": {"repobilityId": "91a6fe37406fc967", "scanner": "scanner-primary", "fingerprint": "01ad6ecfe990f191", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e6987885f7d34bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GpsrDiagnosticApp.tsx:456"}, "properties": {"repobilityId": "7e80e8befaeff67c", "scanner": "scanner-primary", "fingerprint": "6e6987885f7d34bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6273c492495f4fab", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/GuidedAnnexesModal.tsx:255"}, "properties": {"repobilityId": "3c31fbf5ae6e5577", "scanner": "scanner-primary", "fingerprint": "6273c492495f4fab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f0f7ecb1c1abc4a0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedAnnexesModal.tsx:296"}, "properties": {"repobilityId": "1c47883b80979f3b", "scanner": "scanner-primary", "fingerprint": "f0f7ecb1c1abc4a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-759b06756a832875", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedDiagnostic.tsx:1074"}, "properties": {"repobilityId": "fba7a2a7a36eaba5", "scanner": "scanner-primary", "fingerprint": "759b06756a832875", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d423164bd364a6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ODDExplorerApp.tsx:812"}, "properties": {"repobilityId": "a195bb14bd81b9dd", "scanner": "scanner-primary", "fingerprint": "4d423164bd364a6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e6721f0b8edfcce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/EcoVadisDiagnosticApp.tsx:294"}, "properties": {"repobilityId": "3e5659a2788faf6a", "scanner": "scanner-primary", "fingerprint": "9e6721f0b8edfcce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ecaa2a7b8b59ff5", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/ISO26000DiagApp.tsx:318"}, "properties": {"repobilityId": "79c4a6412602320a", "scanner": "scanner-primary", "fingerprint": "1ecaa2a7b8b59ff5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e093379cbf82f5c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ISO26000DiagApp.tsx:620"}, "properties": {"repobilityId": "8fda642a7c335eb1", "scanner": "scanner-primary", "fingerprint": "e093379cbf82f5c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a7649f1ded5799b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BilanGesCalculateur.tsx:394"}, "properties": {"repobilityId": "fdf952de109e193e", "scanner": "scanner-primary", "fingerprint": "0a7649f1ded5799b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50a2eb2fefbc1f46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ActionNotePanel.tsx:501"}, "properties": {"repobilityId": "575b6a3589cc6b85", "scanner": "scanner-primary", "fingerprint": "50a2eb2fefbc1f46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7656bbbcb8f85391", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/apps/ActionNotePanel.tsx:787"}, "properties": {"repobilityId": "037bea6308945dfd", "scanner": "scanner-primary", "fingerprint": "7656bbbcb8f85391", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f35de137f3cceaa2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GestionTempsApp.tsx:215"}, "properties": {"repobilityId": "fdaad0192d731ba9", "scanner": "scanner-primary", "fingerprint": "f35de137f3cceaa2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61584a5df152645a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BcorpDiagnosticApp.tsx:450"}, "properties": {"repobilityId": "ada4a7818b8c8e03", "scanner": "scanner-primary", "fingerprint": "61584a5df152645a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4234ce3e70e57ed3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/EudrDiagnosticApp.tsx:433"}, "properties": {"repobilityId": "d0684dfe9786c623", "scanner": "scanner-primary", "fingerprint": "4234ce3e70e57ed3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75b67edbf21c996c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/ShareBoardModal.tsx:151"}, "properties": {"repobilityId": "daf47141ec42ee51", "scanner": "scanner-primary", "fingerprint": "75b67edbf21c996c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-b14a7d3ad55d3193", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ShareBoardModal.tsx:149"}, "properties": {"repobilityId": "81ebbe9cc3bdc82e", "scanner": "scanner-primary", "fingerprint": "b14a7d3ad55d3193", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-773fe56b6ed7f53e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/VsmeEfragApp.tsx:680"}, "properties": {"repobilityId": "9db061fd9d73ac4d", "scanner": "scanner-primary", "fingerprint": "773fe56b6ed7f53e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-039f7eb419ac6173", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/VsmeEfragApp.tsx:615"}, "properties": {"repobilityId": "db78e5374519b174", "scanner": "scanner-primary", "fingerprint": "039f7eb419ac6173", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7402964e75b728a6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/GreenClaimsApp.tsx:507"}, "properties": {"repobilityId": "28f33c93deb3acb3", "scanner": "scanner-primary", "fingerprint": "7402964e75b728a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-5cd6d817e480a510", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GreenClaimsApp.tsx:552"}, "properties": {"repobilityId": "6aae87a883fa9bfc", "scanner": "scanner-primary", "fingerprint": "5cd6d817e480a510", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a53f181829b3bb0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ActCarboneDiagnosticApp.tsx:435"}, "properties": {"repobilityId": "1b7aa1c9d6b9960a", "scanner": "scanner-primary", "fingerprint": "9a53f181829b3bb0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42abfb156f5622ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Iso50001DiagnosticApp.tsx:449"}, "properties": {"repobilityId": "27e436bc74ba8d31", "scanner": "scanner-primary", "fingerprint": "42abfb156f5622ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f7c037a5a568716", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/ISO26000AnnexesModal.tsx:349"}, "properties": {"repobilityId": "c2f85e21fb25e12d", "scanner": "scanner-primary", "fingerprint": "2f7c037a5a568716", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a79f903a1ddae31d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/ISO26000AnnexesModal.tsx:392"}, "properties": {"repobilityId": "621a7421d7e007e7", "scanner": "scanner-primary", "fingerprint": "a79f903a1ddae31d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c156774d91ea5b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/LabelNrDiagnosticApp.tsx:442"}, "properties": {"repobilityId": "ecfdd63470c1739d", "scanner": "scanner-primary", "fingerprint": "2c156774d91ea5b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bca6fff868b0111a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GuidedActionNotePanel.tsx:500"}, "properties": {"repobilityId": "ec29d01c841c329f", "scanner": "scanner-primary", "fingerprint": "bca6fff868b0111a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fd3c18cfda39ac2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/apps/GuidedActionNotePanel.tsx:726"}, "properties": {"repobilityId": "e29e96c6b893057b", "scanner": "scanner-primary", "fingerprint": "3fd3c18cfda39ac2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c15debe92e27e80e", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/GestionOrganisationsApp.tsx:147"}, "properties": {"repobilityId": "e5aa5d29251c3041", "scanner": "scanner-primary", "fingerprint": "c15debe92e27e80e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-17fa2536b955e78d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/GestionOrganisationsApp.tsx:119"}, "properties": {"repobilityId": "c296819e666c4b62", "scanner": "scanner-primary", "fingerprint": "17fa2536b955e78d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-607d046d5286e260", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Sapin2DiagnosticApp.tsx:417"}, "properties": {"repobilityId": "fb7008fddca2c58d", "scanner": "scanner-primary", "fingerprint": "607d046d5286e260", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e196ac8ba93fef3c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Afaq26000DiagnosticApp.tsx:459"}, "properties": {"repobilityId": "2b7dee71b09f9662", "scanner": "scanner-primary", "fingerprint": "e196ac8ba93fef3c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91d6459fc8b81612", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/Iso45001DiagnosticApp.tsx:450"}, "properties": {"repobilityId": "c4ff369b93a9eb4c", "scanner": "scanner-primary", "fingerprint": "91d6459fc8b81612", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20fbebdb3bc7f21a", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/BoardsApp.tsx:337"}, "properties": {"repobilityId": "fecf52969b860f07", "scanner": "scanner-primary", "fingerprint": "20fbebdb3bc7f21a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-53b05bd77ff5c02e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BoardsApp.tsx:294"}, "properties": {"repobilityId": "256946cb30b9ef34", "scanner": "scanner-primary", "fingerprint": "53b05bd77ff5c02e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e296c43987313026", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/BilanGesDiagnosticApp.tsx:468"}, "properties": {"repobilityId": "73b8b49d8b3d71a5", "scanner": "scanner-primary", "fingerprint": "e296c43987313026", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-079787c14e2c014b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/VigilanceDiagnosticApp.tsx:416"}, "properties": {"repobilityId": "146b311798ec1da1", "scanner": "scanner-primary", "fingerprint": "079787c14e2c014b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-345fe85fdc717a27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AfnorRseDiagnosticApp.tsx:449"}, "properties": {"repobilityId": "57f6dcafb33257af", "scanner": "scanner-primary", "fingerprint": "345fe85fdc717a27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2241c821ea536f6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/PartiesPrenantesApp.tsx:741"}, "properties": {"repobilityId": "58ea9db099e5defd", "scanner": "scanner-primary", "fingerprint": "2241c821ea536f6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a576f977d0cab261", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/apps/AgriTracker/index.tsx:376"}, "properties": {"repobilityId": "beb3e4cac2eb4ed1", "scanner": "scanner-primary", "fingerprint": "a576f977d0cab261", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7b9591ab5ed8dc8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AgriTracker/index.tsx:1122"}, "properties": {"repobilityId": "1b8edc825adbd1f0", "scanner": "scanner-primary", "fingerprint": "7b9591ab5ed8dc8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-061f21f49e0e441e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/apps/AgriTracker/CRM.tsx:140"}, "properties": {"repobilityId": "e75ee51599cd05bd", "scanner": "scanner-primary", "fingerprint": "061f21f49e0e441e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a68dd09d0559a8d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/FileUpload.tsx:139"}, "properties": {"repobilityId": "2d221e5b71fd7d83", "scanner": "scanner-primary", "fingerprint": "a68dd09d0559a8d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-641312df043d4b29", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/ui/FileViewerModal.tsx:44"}, "properties": {"repobilityId": "4fa2ba4ad310e6ea", "scanner": "scanner-primary", "fingerprint": "641312df043d4b29", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-47d1c2ef6ff9c796", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/FileViewerModal.tsx:35"}, "properties": {"repobilityId": "8ba7a7ccc69cc8a5", "scanner": "scanner-primary", "fingerprint": "47d1c2ef6ff9c796", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1778647ed31fa96c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/SharePointBrowser.tsx:137"}, "properties": {"repobilityId": "6f0dac58e1fc2f52", "scanner": "scanner-primary", "fingerprint": "1778647ed31fa96c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d24789739c277ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/dashboard/FavoritesBoard.tsx:84"}, "properties": {"repobilityId": "f308e476ee6b243a", "scanner": "scanner-primary", "fingerprint": "8d24789739c277ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8036d6d54b5bf77f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/PermissionsManager.tsx:175"}, "properties": {"repobilityId": "1accc044b25ca6e4", "scanner": "scanner-primary", "fingerprint": "8036d6d54b5bf77f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12063bbd8da31b39", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/admin/UsersManager.tsx:122"}, "properties": {"repobilityId": "8a0fbb9dc4e665b3", "scanner": "scanner-primary", "fingerprint": "12063bbd8da31b39", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-d34cd67955a025f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/UsersManager.tsx:444"}, "properties": {"repobilityId": "f891f6cfe43e4b32", "scanner": "scanner-primary", "fingerprint": "d34cd67955a025f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6890afd641c8d1ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/CategoriesManager.tsx:96"}, "properties": {"repobilityId": "122f287fe26ce2ec", "scanner": "scanner-primary", "fingerprint": "6890afd641c8d1ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba4e9523876c0164", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AgriRolesManager.tsx:181"}, "properties": {"repobilityId": "206c64aad2ade938", "scanner": "scanner-primary", "fingerprint": "ba4e9523876c0164", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb3e70cc3d7c89bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/VenteManager.tsx:152"}, "properties": {"repobilityId": "2959a365becb069c", "scanner": "scanner-primary", "fingerprint": "fb3e70cc3d7c89bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99d4adb1f764db0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/SharepointAdmin.tsx:389"}, "properties": {"repobilityId": "82c23e85240ecd6f", "scanner": "scanner-primary", "fingerprint": "99d4adb1f764db0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f0a36d52d8e0e0e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:22"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "9f0a36d52d8e0e0e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e0473427f100a6e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/logs/page.tsx:253"}, "properties": {"repobilityId": "1594cc5033418775", "scanner": "scanner-primary", "fingerprint": "e0473427f100a6e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ecf97f0caea82aed", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/apps/ActionNotePanel.tsx:787"}, "properties": {"repobilityId": "822cf0cb5f9f6b13", "scanner": "scanner-primary", "fingerprint": "ecf97f0caea82aed", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/apps/ActionNotePanel.tsx"}, "region": {"startLine": 787}}}]}, {"ruleId": "scanner-2bc29e02aa88aa27", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/apps/GuidedActionNotePanel.tsx:726"}, "properties": {"repobilityId": "dbac5fc942d00c99", "scanner": "scanner-primary", "fingerprint": "2bc29e02aa88aa27", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/apps/GuidedActionNotePanel.tsx"}, "region": {"startLine": 726}}}]}, {"ruleId": "scanner-f20eba0493cb9fe0", "level": "error", "message": {"text": "Possible secret in src/components/admin/TicketsManager.tsx"}, "properties": {"repobilityId": "04656b4e18b0a87a", "scanner": "scanner-primary", "fingerprint": "f20eba0493cb9fe0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/admin/TicketsManager.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-f20eba0493cb9fe0", "level": "error", "message": {"text": "Possible secret in src/components/admin/TicketsManager.tsx"}, "properties": {"repobilityId": "04656b4e18b0a87a", "scanner": "scanner-primary", "fingerprint": "f20eba0493cb9fe0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/admin/TicketsManager.tsx"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-0754d52c214f5cac", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:22"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "0754d52c214f5cac", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-3a006adf3b60255e", "level": "note", "message": {"text": "Very large file: src/components/apps/RapportIntegre.tsx (863 lines)"}, "properties": {"repobilityId": "71e3cfe489ed0141", "scanner": "scanner-primary", "fingerprint": "3a006adf3b60255e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c315392911d390ba", "level": "note", "message": {"text": "Very large file: src/components/apps/GpsrDiagnosticApp.tsx (1578 lines)"}, "properties": {"repobilityId": "a373df08d75bbe38", "scanner": "scanner-primary", "fingerprint": "c315392911d390ba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3259608d68e76d40", "level": "note", "message": {"text": "Very large file: src/components/apps/GuidedDiagnostic.tsx (1712 lines)"}, "properties": {"repobilityId": "9472b187edaa89f8", "scanner": "scanner-primary", "fingerprint": "3259608d68e76d40", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0a1ae929803f9f18", "level": "note", "message": {"text": "Very large file: src/components/apps/ODDExplorerApp.tsx (1416 lines)"}, "properties": {"repobilityId": "e657aa438af2f616", "scanner": "scanner-primary", "fingerprint": "0a1ae929803f9f18", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5a69728d74265628", "level": "note", "message": {"text": "Very large file: src/components/apps/EcoVadisDiagnosticApp.tsx (1584 lines)"}, "properties": {"repobilityId": "fa206c2984cb7be4", "scanner": "scanner-primary", "fingerprint": "5a69728d74265628", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-802e7db09c4be3fe", "level": "note", "message": {"text": "Very large file: src/components/apps/ISO26000DiagApp.tsx (1496 lines)"}, "properties": {"repobilityId": "05859a0cd8bdfee0", "scanner": "scanner-primary", "fingerprint": "802e7db09c4be3fe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b03b82696c2a9fd9", "level": "note", "message": {"text": "Very large file: src/components/apps/BilanGesCalculateur.tsx (3101 lines)"}, "properties": {"repobilityId": "14c7d8f34cd2b721", "scanner": "scanner-primary", "fingerprint": "b03b82696c2a9fd9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-af6637f8cde97f3d", "level": "note", "message": {"text": "Very large file: src/components/apps/GestionTempsApp.tsx (1536 lines)"}, "properties": {"repobilityId": "3b63086f25d88469", "scanner": "scanner-primary", "fingerprint": "af6637f8cde97f3d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c512b651226934e4", "level": "note", "message": {"text": "Very large file: src/components/apps/BcorpDiagnosticApp.tsx (1584 lines)"}, "properties": {"repobilityId": "c93def454ec34aa2", "scanner": "scanner-primary", "fingerprint": "c512b651226934e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e93d52b5f2fffa33", "level": "note", "message": {"text": "Very large file: src/components/apps/EudrDiagnosticApp.tsx (1545 lines)"}, "properties": {"repobilityId": "d661b98caf297166", "scanner": "scanner-primary", "fingerprint": "e93d52b5f2fffa33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1a0b012c631f3fd2", "level": "note", "message": {"text": "Very large file: src/components/apps/VsmeEfragApp.tsx (1281 lines)"}, "properties": {"repobilityId": "1e192503fdd4e002", "scanner": "scanner-primary", "fingerprint": "1a0b012c631f3fd2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9c31adc9f70d1753", "level": "note", "message": {"text": "Very large file: src/components/apps/ActCarboneDiagnosticApp.tsx (1528 lines)"}, "properties": {"repobilityId": "fc2ce600fbd48813", "scanner": "scanner-primary", "fingerprint": "9c31adc9f70d1753", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2fa78185d4583c28", "level": "note", "message": {"text": "Very large file: src/components/apps/Iso50001DiagnosticApp.tsx (1582 lines)"}, "properties": {"repobilityId": "6f10c8715441b017", "scanner": "scanner-primary", "fingerprint": "2fa78185d4583c28", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-82d7ef9d1fe4fd2b", "level": "note", "message": {"text": "Very large file: src/components/apps/LabelNrDiagnosticApp.tsx (1573 lines)"}, "properties": {"repobilityId": "99314099b2d1af98", "scanner": "scanner-primary", "fingerprint": "82d7ef9d1fe4fd2b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a5cbff7887b3a822", "level": "note", "message": {"text": "Very large file: src/components/apps/Sapin2DiagnosticApp.tsx (1469 lines)"}, "properties": {"repobilityId": "784a75d609c7f4b7", "scanner": "scanner-primary", "fingerprint": "a5cbff7887b3a822", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7c497832a9cff2d8", "level": "note", "message": {"text": "Very large file: src/components/apps/Afaq26000DiagnosticApp.tsx (1578 lines)"}, "properties": {"repobilityId": "6d2fb17f00b32363", "scanner": "scanner-primary", "fingerprint": "7c497832a9cff2d8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eb9238dbfb89ff50", "level": "note", "message": {"text": "Very large file: src/components/apps/Iso45001DiagnosticApp.tsx (1579 lines)"}, "properties": {"repobilityId": "f71ef2d1d0690889", "scanner": "scanner-primary", "fingerprint": "eb9238dbfb89ff50", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-07e1a92ca03554c2", "level": "note", "message": {"text": "Very large file: src/components/apps/BilanGesDiagnosticApp.tsx (1601 lines)"}, "properties": {"repobilityId": "4dd3ef222ae32400", "scanner": "scanner-primary", "fingerprint": "07e1a92ca03554c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3db9b0fd83fe123e", "level": "note", "message": {"text": "Very large file: src/components/apps/VigilanceDiagnosticApp.tsx (1520 lines)"}, "properties": {"repobilityId": "224ef51b99fd724b", "scanner": "scanner-primary", "fingerprint": "3db9b0fd83fe123e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9f43e001ce60a02a", "level": "note", "message": {"text": "Very large file: src/components/apps/AfnorRseDiagnosticApp.tsx (1571 lines)"}, "properties": {"repobilityId": "16ea3e9662e6b4d5", "scanner": "scanner-primary", "fingerprint": "9f43e001ce60a02a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-66957cf34997627e", "level": "note", "message": {"text": "Very large file: src/components/apps/PartiesPrenantesApp.tsx (2174 lines)"}, "properties": {"repobilityId": "558236e7483c5033", "scanner": "scanner-primary", "fingerprint": "66957cf34997627e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-67daf7b39638e426", "level": "note", "message": {"text": "Very large file: src/components/apps/AgriTracker/index.tsx (3887 lines)"}, "properties": {"repobilityId": "02e523af0177db56", "scanner": "scanner-primary", "fingerprint": "67daf7b39638e426", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-83fb8a2050f878be", "level": "note", "message": {"text": "Very large file: src/components/apps/AgriTracker/CRM.tsx (1166 lines)"}, "properties": {"repobilityId": "a62178f41ad12140", "scanner": "scanner-primary", "fingerprint": "83fb8a2050f878be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ec5bbfb0a2635532", "level": "note", "message": {"text": "Very large file: src/components/apps/SecureScoreM365/index.tsx (1559 lines)"}, "properties": {"repobilityId": "fc5f96573c25dcd6", "scanner": "scanner-primary", "fingerprint": "ec5bbfb0a2635532", "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-0e8e6d4015425285", "level": "note", "message": {"text": "49 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "0e8e6d4015425285", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "69033bd80b314e0b", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "319b36038fb32cd2", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "3cc52a2de1214be0", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "96e7e6d64ef63a64", "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": "69ae7caa4c51bbcf", "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": "6270a900f692dae4", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d8f1ef02c0d843f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/layout/Footer.tsx:17"}, "properties": {"repobilityId": "6cbbb860454b188d", "scanner": "scanner-primary", "fingerprint": "d8f1ef02c0d843f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6985c35932ffeef0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/RapportIntegre.tsx:691"}, "properties": {"repobilityId": "60c64fb2ac08d692", "scanner": "scanner-primary", "fingerprint": "6985c35932ffeef0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-902b364ceb972606", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GpsrDiagnosticApp.tsx:764"}, "properties": {"repobilityId": "e429041b69b84675", "scanner": "scanner-primary", "fingerprint": "902b364ceb972606", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f8ece619570ac003", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedAnnexesModal.tsx:165"}, "properties": {"repobilityId": "94f6110f075467fc", "scanner": "scanner-primary", "fingerprint": "f8ece619570ac003", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7bf79fa599f366c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedDiagnostic.tsx:469"}, "properties": {"repobilityId": "c0fe36af474336e1", "scanner": "scanner-primary", "fingerprint": "7bf79fa599f366c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e8b7491343517b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ODDExplorerApp.tsx:554"}, "properties": {"repobilityId": "0bd81ce3154f3ca6", "scanner": "scanner-primary", "fingerprint": "2e8b7491343517b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-623283753c070df9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/EcoVadisDiagnosticApp.tsx:640"}, "properties": {"repobilityId": "f27403769d44d162", "scanner": "scanner-primary", "fingerprint": "623283753c070df9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f9511c30c410047e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ISO26000DiagApp.tsx:309"}, "properties": {"repobilityId": "38724bc9deb3d244", "scanner": "scanner-primary", "fingerprint": "f9511c30c410047e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-87a7dc96a3007929", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BilanGesCalculateur.tsx:508"}, "properties": {"repobilityId": "bede23b0e93b447e", "scanner": "scanner-primary", "fingerprint": "87a7dc96a3007929", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f1e2737861a830e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ActionNotePanel.tsx:216"}, "properties": {"repobilityId": "cc0805ed89181f06", "scanner": "scanner-primary", "fingerprint": "9f1e2737861a830e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c4d57ac6ad20210", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GestionTempsApp.tsx:325"}, "properties": {"repobilityId": "21940760ac994131", "scanner": "scanner-primary", "fingerprint": "5c4d57ac6ad20210", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-121387cf4e846441", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BcorpDiagnosticApp.tsx:770"}, "properties": {"repobilityId": "353fa7dee32602a0", "scanner": "scanner-primary", "fingerprint": "121387cf4e846441", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1a672a34a94ff6b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/EudrDiagnosticApp.tsx:731"}, "properties": {"repobilityId": "53023f913f36954f", "scanner": "scanner-primary", "fingerprint": "1a672a34a94ff6b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-41952e1a96a2cca7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ShareBoardModal.tsx:127"}, "properties": {"repobilityId": "bc28dfb0e0a4e5fe", "scanner": "scanner-primary", "fingerprint": "41952e1a96a2cca7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-248f2e9cf0fb168e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GreenClaimsApp.tsx:691"}, "properties": {"repobilityId": "4ae411f9299fa0e1", "scanner": "scanner-primary", "fingerprint": "248f2e9cf0fb168e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aadfeb7cd4d01f6e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ActCarboneDiagnosticApp.tsx:714"}, "properties": {"repobilityId": "0e79dd9fb81af2b4", "scanner": "scanner-primary", "fingerprint": "aadfeb7cd4d01f6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-907d6f960eb2cda6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Iso50001DiagnosticApp.tsx:768"}, "properties": {"repobilityId": "0193746e0e7800d2", "scanner": "scanner-primary", "fingerprint": "907d6f960eb2cda6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-34ba7b2adef1582c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/ISO26000AnnexesModal.tsx:250"}, "properties": {"repobilityId": "ae4372dc64e8245d", "scanner": "scanner-primary", "fingerprint": "34ba7b2adef1582c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4292abb0d6e9af26", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/LabelNrDiagnosticApp.tsx:759"}, "properties": {"repobilityId": "1809b8411c0cdbd0", "scanner": "scanner-primary", "fingerprint": "4292abb0d6e9af26", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e10e74610917f57", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/apps/GuidedActionNotePanel.tsx:935"}, "properties": {"repobilityId": "bb0fc26d1c3d0153", "scanner": "scanner-primary", "fingerprint": "7e10e74610917f57", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce1c526c45ca95a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/GuidedActionNotePanel.tsx:222"}, "properties": {"repobilityId": "d14bfb524667cd90", "scanner": "scanner-primary", "fingerprint": "ce1c526c45ca95a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aecf3878951ab60e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BoardEditor.tsx:234"}, "properties": {"repobilityId": "67b6bc0d1646e283", "scanner": "scanner-primary", "fingerprint": "aecf3878951ab60e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b6c8f9a004ec7b48", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Sapin2DiagnosticApp.tsx:704"}, "properties": {"repobilityId": "28a5a776d03ef246", "scanner": "scanner-primary", "fingerprint": "b6c8f9a004ec7b48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-61f0ce87fd1cbd3c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Afaq26000DiagnosticApp.tsx:764"}, "properties": {"repobilityId": "568efa6ce002e747", "scanner": "scanner-primary", "fingerprint": "61f0ce87fd1cbd3c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-378b43f321673895", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/Iso45001DiagnosticApp.tsx:765"}, "properties": {"repobilityId": "b5fe16d4e3520320", "scanner": "scanner-primary", "fingerprint": "378b43f321673895", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6a4f215c78bcaf2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BoardsApp.tsx:88"}, "properties": {"repobilityId": "3c90c91a74343dc4", "scanner": "scanner-primary", "fingerprint": "c6a4f215c78bcaf2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a9463ac5ab421001", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/BilanGesDiagnosticApp.tsx:785"}, "properties": {"repobilityId": "69b35e79465add92", "scanner": "scanner-primary", "fingerprint": "a9463ac5ab421001", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dde54bd239d57d10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/VigilanceDiagnosticApp.tsx:705"}, "properties": {"repobilityId": "1094888f2dea90c5", "scanner": "scanner-primary", "fingerprint": "dde54bd239d57d10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7581b0a5511c84f0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AfnorRseDiagnosticApp.tsx:752"}, "properties": {"repobilityId": "38f3de312d963084", "scanner": "scanner-primary", "fingerprint": "7581b0a5511c84f0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a3abc28dbd9f585", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AgriTracker/index.tsx:343"}, "properties": {"repobilityId": "d95afb0a92af0687", "scanner": "scanner-primary", "fingerprint": "9a3abc28dbd9f585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-efc5ac0023ba6f7c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/AgriTracker/CRM.tsx:301"}, "properties": {"repobilityId": "7b73640657d57ba3", "scanner": "scanner-primary", "fingerprint": "efc5ac0023ba6f7c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bbf96f9de0ce851", "level": "note", "message": {"text": "Legacy-named symbol `daysOld` in src/components/apps/SecureScoreM365/index.tsx:33"}, "properties": {"repobilityId": "e61da8ca4b49068e", "scanner": "scanner-primary", "fingerprint": "5bbf96f9de0ce851", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-16edb7279b1fc86b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/apps/SecureScoreM365/index.tsx:1303"}, "properties": {"repobilityId": "f6f8fa26353efa60", "scanner": "scanner-primary", "fingerprint": "16edb7279b1fc86b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-afc438a452b0bd06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/ui/FileUpload.tsx:33"}, "properties": {"repobilityId": "946d1ea1f72847c2", "scanner": "scanner-primary", "fingerprint": "afc438a452b0bd06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-726189044ce91d1a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/PermissionsManager.tsx:106"}, "properties": {"repobilityId": "108a20d12f0dd433", "scanner": "scanner-primary", "fingerprint": "726189044ce91d1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-478eb486891e8337", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/SubscriptionsManager.tsx:60"}, "properties": {"repobilityId": "dc318f9d14f049fd", "scanner": "scanner-primary", "fingerprint": "478eb486891e8337", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7550990f7ab0527a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/admin/SharepointAdmin.tsx:299"}, "properties": {"repobilityId": "fe7657f42b59da52", "scanner": "scanner-primary", "fingerprint": "7550990f7ab0527a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3727ce9137cf5226", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/account/AccountSettings.tsx:42"}, "properties": {"repobilityId": "06a1e1e929de5f2a", "scanner": "scanner-primary", "fingerprint": "3727ce9137cf5226", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9cb2d8462acc3065", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/auth/login/page.tsx:46"}, "properties": {"repobilityId": "78234dea228ffb4c", "scanner": "scanner-primary", "fingerprint": "9cb2d8462acc3065", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f12843a53f938287", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/auth/register/route.ts:75"}, "properties": {"repobilityId": "b379631d72ee06a1", "scanner": "scanner-primary", "fingerprint": "f12843a53f938287", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ea0502025ad2c58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sharepoint/image/route.ts:42"}, "properties": {"repobilityId": "42c968476e1aa9be", "scanner": "scanner-primary", "fingerprint": "7ea0502025ad2c58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a84867bf933876cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sharepoint/download/route.ts:19"}, "properties": {"repobilityId": "e1fb270a4996a585", "scanner": "scanner-primary", "fingerprint": "a84867bf933876cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c514feecfe87f0ff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/supabase-migrator/transfer/route.ts:248"}, "properties": {"repobilityId": "b55bf3ad2b38bf43", "scanner": "scanner-primary", "fingerprint": "c514feecfe87f0ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fdaaca9e8df36dd6", "level": "note", "message": {"text": "Legacy-named symbol `daysOld` in src/app/api/secure-score/score/route.ts:75"}, "properties": {"repobilityId": "469c505135f0f4cd", "scanner": "scanner-primary", "fingerprint": "fdaaca9e8df36dd6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e66b91bb85a993a1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/score/route.ts:7"}, "properties": {"repobilityId": "3f4b836c87b4cfa1", "scanner": "scanner-primary", "fingerprint": "e66b91bb85a993a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-93394118dc76df38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/unlock/route.ts:6"}, "properties": {"repobilityId": "904d5a5aaa67dbc5", "scanner": "scanner-primary", "fingerprint": "93394118dc76df38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49372b5a963b9cdb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/device-auth/route.ts:21"}, "properties": {"repobilityId": "71df9a81f667769b", "scanner": "scanner-primary", "fingerprint": "49372b5a963b9cdb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-18791dcf84bab529", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/optimize/route.ts:6"}, "properties": {"repobilityId": "3014d1dafb833fcc", "scanner": "scanner-primary", "fingerprint": "18791dcf84bab529", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77da607c6e9c53d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/secure-score/setup-rbac/route.ts:6"}, "properties": {"repobilityId": "c0820f57e38c9638", "scanner": "scanner-primary", "fingerprint": "77da607c6e9c53d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3af8042343e9aa44", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/weather/route.ts:122"}, "properties": {"repobilityId": "779acccc63811473", "scanner": "scanner-primary", "fingerprint": "3af8042343e9aa44", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77ac2922f49a03bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/weather/sync/route.ts:155"}, "properties": {"repobilityId": "58e058deeb0f9f80", "scanner": "scanner-primary", "fingerprint": "77ac2922f49a03bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7c1cf2a4b93129e8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/faostat/route.ts:159"}, "properties": {"repobilityId": "33bf79dfe776d1de", "scanner": "scanner-primary", "fingerprint": "7c1cf2a4b93129e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fad499720c004f24", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/observations/[id]/action-notes/[key]/upload/route.ts:43"}, "properties": {"repobilityId": "112adc551ac21f8e", "scanner": "scanner-primary", "fingerprint": "fad499720c004f24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8500174c4355def", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/observations/[id]/action-notes/[key]/upload-session/route.ts:76"}, "properties": {"repobilityId": "4ba7d5323c35771b", "scanner": "scanner-primary", "fingerprint": "a8500174c4355def", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-befade2a306c8935", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/marches/route.ts:124"}, "properties": {"repobilityId": "e4e13f6fc8ed95d6", "scanner": "scanner-primary", "fingerprint": "befade2a306c8935", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ac21903ed4ccad65", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/upload/route.ts:39"}, "properties": {"repobilityId": "76bd72fab95a90d2", "scanner": "scanner-primary", "fingerprint": "ac21903ed4ccad65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75b13588131f7069", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/[id]/action-notes/[key]/upload/route.ts:31"}, "properties": {"repobilityId": "9de035260e710d05", "scanner": "scanner-primary", "fingerprint": "75b13588131f7069", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a203816a97be3e76", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/[id]/action-notes/[key]/upload-session/route.ts:33"}, "properties": {"repobilityId": "8143aa8be6fc1a80", "scanner": "scanner-primary", "fingerprint": "a203816a97be3e76", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14eb90876d487584", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/photos/upload-session/route.ts:37"}, "properties": {"repobilityId": "5667c4f955d1cd69", "scanner": "scanner-primary", "fingerprint": "14eb90876d487584", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5fdd6e1a57d0405a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/agri/crm/upload-session/route.ts:35"}, "properties": {"repobilityId": "ad9253db67f2fe3a", "scanner": "scanner-primary", "fingerprint": "5fdd6e1a57d0405a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bf62c5c9adaa1c15", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/public/survey/[token]/route.ts:70"}, "properties": {"repobilityId": "26eb3a60d85e431b", "scanner": "scanner-primary", "fingerprint": "bf62c5c9adaa1c15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30cfd9dacdbe75e7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/quotes/route.ts:78"}, "properties": {"repobilityId": "e83cfe4d74ef3cbe", "scanner": "scanner-primary", "fingerprint": "30cfd9dacdbe75e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cea180df91b57a07", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/admin/logs/page.tsx:81"}, "properties": {"repobilityId": "7f509e1f62f63cd0", "scanner": "scanner-primary", "fingerprint": "cea180df91b57a07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a4bba8f44d0c9c5", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sharepointSecurity.ts:8"}, "properties": {"repobilityId": "7da46d950965e46e", "scanner": "scanner-primary", "fingerprint": "2a4bba8f44d0c9c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce2e4babcedc85d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepoint.ts:31"}, "properties": {"repobilityId": "8d3cbb026b66dc58", "scanner": "scanner-primary", "fingerprint": "ce2e4babcedc85d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d406ceaec0097226", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointUploadSession.ts:24"}, "properties": {"repobilityId": "3daaae21e5955db9", "scanner": "scanner-primary", "fingerprint": "d406ceaec0097226", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8236833a8ba64b66", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointGraph.ts:53"}, "properties": {"repobilityId": "71bc74a9ebeed4c8", "scanner": "scanner-primary", "fingerprint": "8236833a8ba64b66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f1aba1a0caba3a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/msGraph.ts:28"}, "properties": {"repobilityId": "a53890535a2082df", "scanner": "scanner-primary", "fingerprint": "8f1aba1a0caba3a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a87829f3cde84fa6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sharepointMulti.ts:92"}, "properties": {"repobilityId": "2b0e78239e39306d", "scanner": "scanner-primary", "fingerprint": "a87829f3cde84fa6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9474b3c5160b104", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSharePointFolder.ts:27"}, "properties": {"repobilityId": "13df91de63f29b4c", "scanner": "scanner-primary", "fingerprint": "d9474b3c5160b104", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f3ffa508b64f5e5e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useApps.ts:9"}, "properties": {"repobilityId": "98a04fcb4dcdadf4", "scanner": "scanner-primary", "fingerprint": "f3ffa508b64f5e5e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1190b9c49f2bf173", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAgriCrmUnread.ts:16"}, "properties": {"repobilityId": "0a6249c76f4f2bec", "scanner": "scanner-primary", "fingerprint": "1190b9c49f2bf173", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d4bf7492e2a78d22", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useSharePointBrowser.ts:45"}, "properties": {"repobilityId": "c4269bb29320fa1d", "scanner": "scanner-primary", "fingerprint": "d4bf7492e2a78d22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}