{"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-b4d8ce834a7c8ce6", "name": "Stray `console.log` in TS/JS \u2014 quick_start.js:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 quick_start.js:59"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b503e4c835719e70", "name": "Stray `console.log` in TS/JS \u2014 test-validation.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-validation.js:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd1dec1e51c8b054", "name": "Stray `console.log` in TS/JS \u2014 test-sync.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-sync.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5143f4c4ccf399f", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-production.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-production.js:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd948152f7668c24", "name": "Stray `console.log` in TS/JS \u2014 scripts/remove-members-from-org.js:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/remove-members-from-org.js:52"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3a6b79a4fbd68d6", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-subscription-emails.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-subscription-emails.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-400a6d63431a6452", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-account.js:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-account.js:60"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f786b21b5b2de37", "name": "Stray `console.log` in TS/JS \u2014 scripts/add-frontmatter-fields.js:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-frontmatter-fields.js:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8bdb27a477f21850", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-billing-sync.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-billing-sync.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf32ac7a813db312", "name": "Stray `console.log` in TS/JS \u2014 scripts/add-members-to-org.js:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-members-to-org.js:130"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-968a76de18913459", "name": "Stray `console.log` in TS/JS \u2014 scripts/publish-articles.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/publish-articles.js:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-68ddb918cdc2edf7", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.jsx:113", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.jsx:113"}, "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-4bc5697a83548c58", "name": "`truncate` class without `title=` for hover reveal \u2014 app/auth/manage-devices/page.jsx:248", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/auth/manage-devices/page.jsx:248"}, "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-163c6f5e18139c53", "name": "Stray `console.log` in TS/JS \u2014 app/auth/login/loginForm.jsx:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/login/loginForm.jsx:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-760fe60f96ef9a7b", "name": "Stray `console.log` in TS/JS \u2014 app/auth/signup/registerForm.jsx:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/signup/registerForm.jsx:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a19189bbde8fc63", "name": "`truncate` class without `title=` for hover reveal \u2014 app/auth/signup/page.jsx:726", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/auth/signup/page.jsx:726"}, "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-e9442055192325ab", "name": "Stray `console.log` in TS/JS \u2014 app/auth/verify-email/page.jsx:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/verify-email/page.jsx:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-214a0b8d9ad9629e", "name": "Stray `console.log` in TS/JS \u2014 app/auth/verify-2fa/page.jsx:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/verify-2fa/page.jsx:70"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9b0178daa595cf47", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/kanban/section/KanbanBoard.jsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/kanban/section/KanbanBoard.jsx:69"}, "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-beda40047c39f631", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/facturation-electronique/section/FactElecGovernanceSec", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/facturation-electronique/section/FactElecGovernanceSection.jsx:198"}, "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-264ef4bd5313c769", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/gestion-des-achats/section/AchatsGovernanceSection.jsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/gestion-des-achats/section/AchatsGovernanceSection.jsx: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-2e84ab036e93e624", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/HowItWorksSection.jsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/HowItWorksSection.jsx:153"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1dfb4f4a1608eeb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/ShareTrackingAnimation.jsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/ShareTrackingAnimation.jsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5a4518af8204e26", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/DragDropAnimation.jsx:393", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/DragDropAnimation.jsx:393"}, "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-58ec03e21e820a45", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/MiniUploadAnimation.jsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/MiniUploadAnimation.jsx:164"}, "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-ce0814d8b8cb319b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/MobileDragDropAnimation.jsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/MobileDragDropAnimation.jsx:115"}, "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-8d3461114f1de0dd", "name": "Stray `console.log` in TS/JS \u2014 app/test-animation-pro/page.jsx:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/test-animation-pro/page.jsx:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-867208b5796fa459", "name": "Stray `console.log` in TS/JS \u2014 app/api/invitations/[id]/route.js:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/invitations/[id]/route.js:60"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46d65020476f1cd0", "name": "Stray `console.log` in TS/JS \u2014 app/api/auth/verify-email/route.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/auth/verify-email/route.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-128c3bc2ce4df673", "name": "TODO/FIXME marker in shipping code \u2014 app/api/leads/notify/route.js:8", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/leads/notify/route.js:8"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2a1210e56fc74f81", "name": "Stray `console.log` in TS/JS \u2014 app/api/sync-subscription-status/route.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/sync-subscription-status/route.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bcd59f7130fbc521", "name": "Stray `console.log` in TS/JS \u2014 app/api/generate-facturx/route.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/generate-facturx/route.js:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d30d67f5d7bb2f5d", "name": "Stray `console.log` in TS/JS \u2014 app/api/verify-checkout-session/route.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/verify-checkout-session/route.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c74fa8c3e32422fa", "name": "Stray `console.log` in TS/JS \u2014 app/api/billing/check-user-limit/route.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/billing/check-user-limit/route.js:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-35ee94d612098ea7", "name": "Stray `console.log` in TS/JS \u2014 app/api/billing/sync-seats/route.js:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/billing/sync-seats/route.js:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc8a1284875f0a17", "name": "Stray `console.log` in TS/JS \u2014 app/api/billing/check-role-change/route.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/billing/check-role-change/route.js:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f82e29f9a44fbcbb", "name": "Stray `console.log` in TS/JS \u2014 app/api/admin/delete-test-users/route.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/delete-test-users/route.js:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de5864eb51ba0405", "name": "Stray `console.log` in TS/JS \u2014 app/api/admin/create-test-users/route.js:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/create-test-users/route.js:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d206b9f27f434d24", "name": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/delete-icons/route.js:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/delete-icons/route.js:72"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45862dd1c6ae085a", "name": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/cleanup-temp/route.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/cleanup-temp/route.js:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b905278e817f2edc", "name": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/upload-icon/route.js:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/upload-icon/route.js:88"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5bd0d854892c049b", "name": "Stray `console.log` in TS/JS \u2014 app/api/credit-notes/generate-pdf/route.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/credit-notes/generate-pdf/route.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-706e5b1c6ce2bdb9", "name": "Stray `console.log` in TS/JS \u2014 app/api/organization/reorder/route.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/organization/reorder/route.js:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf065ef76a25a88f", "name": "Stray `console.log` in TS/JS \u2014 app/api/revoke-session/route.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/revoke-session/route.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e24f50ba300510e", "name": "Stray `console.log` in TS/JS \u2014 app/api/onboarding/step/route.js:157", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/onboarding/step/route.js:157"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7835e17ef5e82f74", "name": "Stray `console.log` in TS/JS \u2014 app/api/check-siret/route.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/check-siret/route.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c1ccebb30cea232", "name": "TODO/FIXME marker in shipping code \u2014 app/api/change-subscription-plan/route.js:517", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/change-subscription-plan/route.js:517"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa852b45d1052d2c", "name": "Stray `console.log` in TS/JS \u2014 app/api/change-subscription-plan/route.js:158", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/change-subscription-plan/route.js:158"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a53f178661e9d7aa", "name": "Stray `console.log` in TS/JS \u2014 app/api/stripe/connect/status/route.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/stripe/connect/status/route.js:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a98ee8df9209fc6", "name": "Stray `console.log` in TS/JS \u2014 app/api/purchase-orders/generate-pdf/route.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/purchase-orders/generate-pdf/route.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48845b2151ef05a8", "name": "Stray `console.log` in TS/JS \u2014 app/api/signatures/auto-save/route.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/signatures/auto-save/route.js:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c42e9f8a9b9ec36a", "name": "TODO/FIXME marker in shipping code \u2014 app/api/documents/download/route.js:14", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/documents/download/route.js:14"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91b43e818fb774c3", "name": "Stray `console.log` in TS/JS \u2014 app/api/quotes/generate-pdf/route.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/quotes/generate-pdf/route.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fce110363549c7a0", "name": "Stray `console.log` in TS/JS \u2014 app/api/create-org-subscription/route.js:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/create-org-subscription/route.js:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-91f18af48e62d56f", "name": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/generate/route.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/generate/route.js:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b720115797dedbf4", "name": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/delete/route.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/delete/route.js:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6db1106e56849e8", "name": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/update/route.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/update/route.js:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c26c5af96ebfe50", "name": "Stray `console.log` in TS/JS \u2014 app/api/invoices/generate-pdf/route.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/invoices/generate-pdf/route.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af674e0d91af4751", "name": "Stray `console.log` in TS/JS \u2014 app/api/invoices/preview-pdf/route.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/invoices/preview-pdf/route.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c6a9e0418982447", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/layout.jsx:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/layout.jsx:81"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-de4050da28fc3ca8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/page.jsx:428", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/page.jsx:428"}, "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-270cb77383855465", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/week-calendar-card.jsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/week-calendar-card.jsx:257"}, "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-b582c5f194d63e68", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/top-clients-card.jsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/top-clients-card.jsx:128"}, "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-b710bd221f432972", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/income-category-chart.jsx:565", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/income-category-chart.jsx:565"}, "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-ca3f20a3008461a2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/blocked/page.jsx:362", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/blocked/page.jsx:362"}, "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-4d202efd4e6dda16", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/assign-members-dialog.jsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/assign-members-dialog.jsx:210"}, "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-f485bc710b9eddee", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/client-lists-view.jsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/client-lists-view.jsx:158"}, "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-f79d4ad60ce8e9d1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-popover.jsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-popover.jsx: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-d8a1b4f5f63ed99d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-panel.jsx:339", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-panel.jsx:339"}, "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-29ae238096560554", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-manager.jsx:335", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-manager.jsx:335"}, "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-5e5898cc3a6c5d0c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/email-automation-form.jsx:522", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/email-automation-form.jsx:522"}, "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-2832a20696199a88", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/add-clients-to-list-dialog.jsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/add-clients-to-list-dialog.jsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c522070d66fbfdf", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/automations-popover.jsx:373", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/automations-popover.jsx:373"}, "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-76d594ca9dee84af", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/clients-modal.jsx:888", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/clients-modal.jsx:888"}, "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-b3a9653fbd2cc76e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/import-steps/import-step-mapping.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/import-steps/import-step-mapping.jsx:85"}, "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-71fd3ac81f87ee62", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/import-steps/import-step-upload.js", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/import-steps/import-step-upload.jsx:222"}, "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-ff887cbd0dec64c2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/assign-members-dialog.jsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/assign-members-dialog.jsx:141"}, "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-396ce944a2aefe19", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/clients/[id]/components/client-activity-tab.jsx:415", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/clients/[id]/components/client-activity-tab.jsx:415"}, "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-4f20b6f408edd246", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-overview-tab.jsx:235", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-overview-tab.jsx:235"}, "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-7ba8d6791ebbf05d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-notes-tab.jsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-notes-tab.jsx:160"}, "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-56887886f1a43d8c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/clients/[id]/components/client-notes-tab.jsx:688", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/clients/[id]/components/client-notes-tab.jsx:688"}, "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-beb89900d5dc1fb2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-detail-header.jsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-detail-header.jsx:116"}, "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-5baeaeff262e1417", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-detail-sidebar.jsx:328", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-detail-sidebar.jsx:328"}, "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-24371500b52815e5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/segments/page.jsx:631", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/segments/page.jsx:631"}, "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-d1ffc67ca404aab2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/import-quote-modal.jsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/import-quote-modal.jsx:254"}, "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-7debdf9367390904", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/modern-quote-editor.jsx:575", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/modern-quote-editor.jsx:575"}, "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-d7ed83e6057c9546", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/imported-quote-sidebar.jsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/imported-quote-sidebar.jsx:477"}, "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-30654fe3369d41e2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/quote-form-sections/QuoteInfo", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/quote-form-sections/QuoteInfoSection.jsx:756"}, "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-5565ab7fb3629cc4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/quote-form-sections/client-se", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/quote-form-sections/client-selector.jsx:773"}, "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-385e976cea023c90", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/hooks/use-quote-table.js:339", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/hooks/use-quote-table.js:339"}, "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-5c49fe512b4eafe3", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/page.jsx:531", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/page.jsx:531"}, "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-b7a14e929954534a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transaction-detail-dra", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx:309"}, "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-0de39ae9f32948da", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/merchant-logo.jsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/merchant-logo.jsx:110"}, "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-b9f5c1eae24b70dc", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/expense-category-chart", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/expense-category-chart.jsx:565"}, "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-f37ae3653236d584", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/add-transaction-drawer", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/add-transaction-drawer.jsx:477"}, "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-2b732e713233cc13", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transactions/components/add-transaction-drawer.jsx:143", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transactions/components/add-transaction-drawer.jsx:143"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee434ab8dd8e66c3", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transactions/components/receipt-upload-drawer.jsx:211", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transactions/components/receipt-upload-drawer.jsx:211"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fb5d46f7b3be6fa", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/pcg-select-dialog.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/pcg-select-dialog.jsx:104"}, "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-373ea6433bbf1eb8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transactions/columns/t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transactions/columns/transactionColumns.jsx:136"}, "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-c1d8494a2b93a8a6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transactions/component", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transactions/components/DesktopFilters.jsx:177"}, "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-9c1ce51835a72315", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/new/page.jsx:1965", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/new/page.jsx:1965"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b94ec84300066b31", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/standalone-signature-generator.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/standalone-signature-generator.js:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-400ba1e6e074beaa", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/template-presets.js:443", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/template-presets.js:443"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f2ba1036f605a77", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/imageOptimizer.js:87", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/imageOptimizer.js:87"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc27d78c753db9b4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/modals/TemplateSele", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/modals/TemplateSelector.jsx: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-f3bb8519e2f2978d", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/modals/SaveSignatureModal.jsx:642", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/modals/SaveSignatureModal.jsx:642"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ceef97bc103b2054", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/table/signature-tab", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/table/signature-table.jsx:396"}, "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-f4d0799472aa1229", "name": "TODO/FIXME marker in shipping code \u2014 app/dashboard/outils/signatures-mail/components/widgets/WidgetCanvas.jsx:180", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/outils/signatures-mail/components/widgets/WidgetCanvas.jsx:180"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-07e3a14cfb64db2d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/widgets/WidgetPalet", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/widgets/WidgetPalette.jsx:60"}, "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-2e43ae652a6d9660", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/signatures-mail/components/preview/signature-", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx:585"}, "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-069d0f8c9db3828f", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/SignatureTemplate.jsx:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/SignatureTemplate.jsx:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-31702c2c6ae75f3b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/preview/TabSignatur", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/preview/TabSignature.jsx:254"}, "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-c1d656962f242473", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/TabSignature.jsx:428", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/TabSignature.jsx:428"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-619f140ab216ef05", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/SignatureEditor.jsx:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/SignatureEditor.jsx:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55a0db52738643ad", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/layout/secti", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/layout/sections/SocialNetworksSection.jsx:355"}, "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-1450c14b606591a2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/layout/secti", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/layout/sections/ElementsOrderSection.jsx:112"}, "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-837d8afa7994a229", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/typography/s", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/typography/sections/TypographySection.jsx:224"}, "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-e866bc03236ed096", "name": "TODO/FIXME marker in shipping code \u2014 app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:133", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:133"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b5550a2d3f0681e", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:124"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6519f2cce034588", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/blocks/BlockSetting", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/blocks/BlockSettings.jsx:1575"}, "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-801b08a91930cf1c", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/hooks/useSignatureGenerator.js:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/hooks/useSignatureGenerator.js:57"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c29a8b6a22d208c6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/page.jsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/page.jsx: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-eca692f46442697d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/month-details-drawer.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/month-details-drawer.jsx:95"}, "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-cf09b7bf7062d4af", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/scenario-selector.jsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/scenario-selector.jsx: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-2c73af64857742a7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/forecast-payments-card.js", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/forecast-payments-card.jsx:991"}, "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-76e3b5ccb1a49dce", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/manual-entries-list.jsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/manual-entries-list.jsx:102"}, "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-ad4a00c75edf5bf0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/detected-recurrences-list", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/detected-recurrences-list.jsx:122"}, "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-bac063c2f601a18e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/page.jsx:502", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/page.jsx:502"}, "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-92c6044bccd6c8d1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/components/BoardMembersPopover.jsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/components/BoardMembersPopover.jsx:304"}, "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-d8d51b510c45c39d", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/page-old-backup.jsx:303", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/page-old-backup.jsx:303"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd464ce78607f9cb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/page.jsx:374", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/page.jsx:374"}, "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-8f47382cfcaa51e6", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/page.jsx:1405", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/page.jsx:1405"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e6c2e32e7fda4a1", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/components/TaskActivity.jsx:317", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/components/TaskActivity.jsx:317"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04cd54fca0cada03", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/components/ShareBoardDialog.jsx:239", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/components/ShareBoardDialog.jsx:239"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06b11608dc173a39", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskModal.jsx:1517", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskModal.jsx:1517"}, "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-a0def0c99f94cc34", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:690", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:690"}, "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-d2f821102eb5140c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:90", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:90"}, "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-410d3d1a0dd08197", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskImageUpload.jsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskImageUpload.jsx:117"}, "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-9456798ad955d056", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumn.jsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumn.jsx:75"}, "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-4150129f6f92f156", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:317"}, "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-6d50ab51872de89c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:461"}, "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-3264b4f1b25e7ec1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/ConvertToInvoiceModal.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/ConvertToInvoiceModal.jsx:222"}, "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-2b0e51d188cc64a2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:273"}, "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-4f722c883743b8ee", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:111", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:111"}, "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-e898728c398af6c2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:969", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:969"}, "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-2d939bbf82df25a9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:99", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:996"}, "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-477600837fd06a29", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/task-modal/TaskModalHea", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/task-modal/TaskModalHeader.jsx:54"}, "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-688eb4ef7503a24f", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/hooks/useKanbanBoard.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/hooks/useKanbanBoard.js:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be6983d569cd52c9", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/hooks/useKanbanDnDSimple.js:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/hooks/useKanbanDnDSimple.js:94"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-832a936815757d79", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/hooks/useKanbanBoardsTable.js:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/hooks/useKanbanBoardsTable.js:195"}, "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-90d6699a3ad3a80d", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/hooks/useKanbanBoards.js:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/hooks/useKanbanBoards.js:50"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-409a6d2a93da2e83", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/auto-reminder-clients.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/auto-reminder-clients.jsx:144"}, "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-bd86db9ba69fa2aa", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/credit-note-mobile-fullscr", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/credit-note-mobile-fullscreen.jsx:64"}, "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-8245613ee59b43e6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/send-document-email-previe", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/send-document-email-preview.jsx:150"}, "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-98d6f927d9a83a4c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/enhanced-invoice-form.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/enhanced-invoice-form.jsx:191"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa0b5707d1e18c65", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/enhanced-invoice-form.jsx:321", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/enhanced-invoice-form.jsx:321"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7d75e9df0aa94dc9", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoice-sidebar.jsx:742", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoice-sidebar.jsx:742"}, "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-0256a436fe4e7630", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/imported-invoice-sidebar.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/imported-invoice-sidebar.jsx:643"}, "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-05a9d7c6bd715703", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/modern-invoice-editor.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/modern-invoice-editor.jsx:657"}, "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-f27279e69372b3b8", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/auto-reminder-preview.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/auto-reminder-preview.jsx:112"}, "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-8752bea619284ee0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoice-export-button.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoice-export-button.jsx:328"}, "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-a739d81978845adc", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/send-document-email-form.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/send-document-email-form.jsx: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-7a7301ce96255844", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/credit-notes-table.jsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/credit-notes-table.jsx:297"}, "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-4acdccebd0ffcf4f", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/__tests__/invoice-export.test.js:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/__tests__/invoice-export.test.js:47"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-20cd678f509185e7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoices-form-sections/cli", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoices-form-sections/client-selector.jsx:773"}, "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-f6d5da7addc743cb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoices-form-sections/Inv", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx:1136"}, "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-5594b3d9e39e8568", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx:152"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-120adb91c4ce1c68", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/hooks/use-invoice-table.js:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/hooks/use-invoice-table.js:348"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2b685ff3fcb02f0", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-revenue-pie-c", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-revenue-pie-chart.jsx:304"}, "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-6de26f7f47926004", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-status-chart.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-status-chart.jsx:195"}, "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-9b68b8ce72ae5cb6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-pcg-mapping.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-pcg-mapping.jsx:409"}, "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-598e804c60c65f57", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-date-filter.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-date-filter.jsx:97"}, "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-db4a944ceb6ead79", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-expense-chart", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-expense-chart.jsx:342"}, "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-bf654e95ca9aa9f6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/page.jsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/page.jsx:285"}, "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-bd5d3026414dbcbb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/document-automat", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/document-automations-modal.jsx:268"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-776ce16770f42178", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/tag-selector.jsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/tag-selector.jsx:115"}, "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-a18a51bbd8a4c89f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/DraggableTree.js", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/DraggableTree.jsx:859"}, "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-7f960132aab434de", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/transfer-from-do", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/transfer-from-docs-modal.jsx:223"}, "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-345c9bddbe901489", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/tag-manager.jsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/tag-manager.jsx:114"}, "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-354fd9bcf2bee0c7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/gmail-status-banner.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/gmail-status-banner.jsx:48"}, "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-79c1ac7dc9c96fd6", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/gmail-connection.jsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/gmail-connection.jsx:161"}, "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-458a86061eb4c5d4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/table.jsx:963", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/table.jsx:963"}, "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-6c8799f9d17d91eb", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/columns.jsx:384", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/columns.jsx:384"}, "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-658eb8692e20611d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/detail-drawer.jsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/detail-drawer.jsx:491"}, "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-9aca0d035ccede29", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/upload-drawer.jsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/upload-drawer.jsx:581"}, "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-1a5cd98798706768", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/import-purchase-order", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/import-purchase-order-modal.jsx:261"}, "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-ff45f9569aad84b2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/modern-purchase-order", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/modern-purchase-order-editor.jsx:573"}, "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-c068abddea25943f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/imported-purchase-ord", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/imported-purchase-order-sidebar.jsx: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-792697127416129f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/hooks/use-purchase-order-table.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/hooks/use-purchase-order-table.js:269"}, "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-66e670a2edb8403d", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/utils/watermark.js:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/utils/watermark.js:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd52adbba3c37868", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/transfer-detail", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/transfer-detail-drawer.jsx:374"}, "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-8ed955d43b14c332", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-new.jsx:328", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-new.jsx:328"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-61c1d7844b899fc2", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-ite", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-item.jsx:105"}, "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-e032f54dab05cb1b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/transfer-table.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/transfer-table.jsx:237"}, "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-5aa1e1af24b2f5e3", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2Direct.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2Direct.js:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-efa5836b5ddd919b", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2.js:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a7c89339aa0b711c", "name": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2Multipart.js:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2Multipart.js:103"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-682dfbffdfdb041e", "name": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/AddPasskeyModal.jsx:54", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/AddPasskeyModal.jsx:54"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-deb356c0dc98ffcf", "name": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/ChangePasswordModal.jsx:44", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/ChangePasswordModal.jsx:44"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-acb27ac2c207e618", "name": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/ChangeEmailModal.jsx:40", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/ChangeEmailModal.jsx:40"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bdf8306a0300016a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/table-product.jsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/table-product.jsx:223"}, "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-ca9b92da2d76bfa9", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/product-custom-fields-manager.j", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/product-custom-fields-manager.jsx:339"}, "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-d17323fa4fa35df7", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/import-steps/import-step-mappin", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/import-steps/import-step-mapping.jsx:85"}, "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-3d6b063571cf0f23", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/import-steps/import-step-upload", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/import-steps/import-step-upload.jsx:95"}, "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-61c63f5ec16c7b82", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/event-item.jsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/event-item.jsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3041bab364ae8a90", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/color-legend.jsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/color-legend.jsx:142"}, "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-ac2dbacbf648c100", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/event-dialog.jsx:739", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/event-dialog.jsx:739"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-807e7b3359511587", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/calendar-connection-card.jsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/calendar-connection-card.jsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d7b522e6f082e07e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/page.jsx:1117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/page.jsx:1117"}, "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-8c2c141360f51b3e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/components/preview-modal.jsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/components/preview-modal.jsx:55"}, "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-98efc7bb21a45769", "name": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/components/file-preview-drawer.jsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/components/file-preview-drawer.jsx:283"}, "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-dba89ef54c935296", "name": "`truncate` class without `title=` for hover reveal \u2014 app/onboarding/success/page.jsx:343", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/onboarding/success/page.jsx:343"}, "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-ea61c59d1e917acc", "name": "Stray `console.log` in TS/JS \u2014 app/accept-invitation/[invitationId]/page.jsx:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/accept-invitation/[invitationId]/page.jsx:64"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a71fdc86f1f5dfd", "name": "`truncate` class without `title=` for hover reveal \u2014 app/public/kanban/[token]/page.jsx:1104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/public/kanban/[token]/page.jsx:1104"}, "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-b42fe6c92570ae63", "name": "Stray `console.log` in TS/JS \u2014 app/public/kanban/[token]/page.jsx:600", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/public/kanban/[token]/page.jsx:600"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78593cc9f0b0b707", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/public/kanban/[token]/page.jsx:979", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/public/kanban/[token]/page.jsx:979"}, "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-5cd46cd305b331d1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/page.jsx:57", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/page.jsx:57"}, "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-3f8ffb37916f3889", "name": "Stray `console.log` in TS/JS \u2014 app/(main)/guide-facturation-electronique/guide-content.jsx:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/(main)/guide-facturation-electronique/guide-content.jsx:85"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-69bf10b6f6378125", "name": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/quote/[id]/page.jsx:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/quote/[id]/page.jsx:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bdbc8c63456a61c8", "name": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/purchase-order/[id]/page.jsx:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/purchase-order/[id]/page.jsx:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5d9afadde15cbdd2", "name": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/invoice/[id]/page.jsx:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/invoice/[id]/page.jsx:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bdc0558e429ea821", "name": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/invoice/preview/page.jsx:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/invoice/preview/page.jsx:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c75c9817b7617097", "name": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/credit-note/[id]/page.jsx:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/credit-note/[id]/page.jsx:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3f3532617c7ec74", "name": "Stray `console.log` in TS/JS \u2014 src/middleware/subscription.js:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/middleware/subscription.js:83"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8772691fe38fc06", "name": "Stray `console.log` in TS/JS \u2014 src/utils/generatePDF.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/generatePDF.js:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f6c7f340c6ff7a0", "name": "Stray `console.log` in TS/JS \u2014 src/utils/facturx-generator.js:525", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/facturx-generator.js:525"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ec1e841a7ea0618", "name": "Stray `console.log` in TS/JS \u2014 src/utils/kanbanPerf.js:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/kanbanPerf.js:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0963daab22f5ec5", "name": "Stray `console.log` in TS/JS \u2014 src/utils/clearApolloCache.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/clearApolloCache.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa882514b1ea4722", "name": "Stray `console.log` in TS/JS \u2014 src/utils/metaCapiServer.js:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/metaCapiServer.js:64"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f79b8956fbc46aa8", "name": "Stray `console.log` in TS/JS \u2014 src/utils/toastDebouncer.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/toastDebouncer.js:29"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b27e4c46775a783", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/team-switcher.jsx:310", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/team-switcher.jsx:310"}, "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-efd1bff47434a9bf", "name": "TODO/FIXME marker in shipping code \u2014 src/components/team-switcher.jsx:908", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/team-switcher.jsx:908"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c6f68f5fba477c9c", "name": "Stray `console.log` in TS/JS \u2014 src/components/team-switcher.jsx:236", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/team-switcher.jsx:236"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d45781ffa8c152b2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization-switcher-header.jsx:298", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization-switcher-header.jsx:298"}, "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-835182da137a0d53", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/nav-user.jsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/nav-user.jsx:132"}, "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-8680cf56ae987cf5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/nav-main.jsx:626", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/nav-main.jsx:626"}, "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-b6a55d40c2922c1a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/search-command.jsx:435", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/search-command.jsx: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-b26e17274cc0b084", "name": "Stray `console.log` in TS/JS \u2014 src/components/stripe-connect-url-handler.jsx:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/stripe-connect-url-handler.jsx:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f940147c166f6645", "name": "Stray `console.log` in TS/JS \u2014 src/components/pro-subscription-overlay-handler.jsx:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pro-subscription-overlay-handler.jsx:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bf6cb8d042d0ff71", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/FloatingTimer.jsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FloatingTimer.jsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b20e0031c24f20c8", "name": "Stray `console.log` in TS/JS \u2014 src/components/org-activation-handler.jsx:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/org-activation-handler.jsx:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5d207f69297293b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/data-table.jsx:269", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/data-table.jsx:269"}, "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-33726a42ab487bfe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/bottom-nav-bar.jsx:509", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bottom-nav-bar.jsx:509"}, "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-de545c20debd8a6c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TagsInput.jsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TagsInput.jsx:259"}, "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-143188361f61ed17", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/invite-member-modal.jsx:437", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invite-member-modal.jsx:437"}, "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-9e265f697c827f7a", "name": "Stray `console.log` in TS/JS \u2014 src/components/resource-not-found.jsx:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/resource-not-found.jsx:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45c529bad9030aa1", "name": "Stray `console.log` in TS/JS \u2014 src/components/comp-333.jsx:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/comp-333.jsx:43"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-666c2cacb704ce5f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/create-workspace/workspace-preview.jsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/create-workspace/workspace-preview.jsx:120"}, "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-59cd1073639e421d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/create-workspace/workspace-form.jsx:407", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/create-workspace/workspace-form.jsx:407"}, "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-3680acf8b6a65306", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/espaces-section.jsx:775", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/espaces-section.jsx:775"}, "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-27b5bfecbdcc4473", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/espaces-section.jsx:404", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/espaces-section.jsx:404"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-acbc347aea2d03d4", "name": "TODO/FIXME marker in shipping code \u2014 src/components/settings/security-section.jsx:254", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/settings/security-section.jsx:254"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbfd1097a7edfe87", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/security-section.jsx:112", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/security-section.jsx:112"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ee466ee8f301afe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/applications-section.jsx:354", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/applications-section.jsx:354"}, "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-e4ce640dc1a12652", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/notifications-section.jsx:602", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/notifications-section.jsx:602"}, "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-2e6c39bbcc736951", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/notifications-section.jsx:249", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/notifications-section.jsx:249"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05c6dadcf4017536", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/bank-accounts-section.jsx:586", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/bank-accounts-section.jsx:586"}, "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-086e88cbafee1407", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/facturation-section.jsx:676", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/facturation-section.jsx:676"}, "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-c657173f22b8a578", "name": "TODO/FIXME marker in shipping code \u2014 src/components/settings/facturation-section.jsx:73", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/settings/facturation-section.jsx:73"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b393f1489494d24b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/mobile/mobile-settings-navigation.jsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/mobile/mobile-settings-navigation.jsx:105"}, "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-d1069e2e1b665345", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/blog/blog-article-layout.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/blog/blog-article-layout.tsx:129"}, "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-b14199e218b137ca", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.jsx:100", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.jsx:100"}, "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-a76743a098ad0869", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/country-search-select.jsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/country-search-select.jsx:61"}, "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-caa6165af51d5c40", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/mention-input.jsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/mention-input.jsx:117"}, "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-5cb5b5b75946c39a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/mention-input.jsx:443", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/mention-input.jsx:443"}, "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-7b87be5aeabf0e90", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/banking/BankBalanceCard.jsx:571", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/banking/BankBalanceCard.jsx:571"}, "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-10e7b0df2b6266e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/banking/RecentTransactionsCard.jsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/banking/RecentTransactionsCard.jsx:150"}, "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-9d75a06ffef235c3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/cookies/MarketingPixels.jsx:53", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/cookies/MarketingPixels.jsx:53"}, "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-7d049323d953c558", "name": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPDFDownloaderWithFacturX.jsx:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPDFDownloaderWithFacturX.jsx:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8c84214c0dee80eb", "name": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPreviewPDF.jsx:150", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPreviewPDF.jsx:150"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e8db68c4c397f19", "name": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPDFDownloader.jsx:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPDFDownloader.jsx:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6b4abfcde3966cba", "name": "Stray `console.log` in TS/JS \u2014 src/components/stripe/StripeConnectOnboarding.jsx:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/stripe/StripeConnectOnboarding.jsx:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94ac64abb8e40d5c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/seo-metadata.jsx:91", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/seo-metadata.jsx:91"}, "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-b8fdb367c6c129df", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/seo-head.jsx:119", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/seo-head.jsx:119"}, "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-71fa2675421ec6ab", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth-plugins.js:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-plugins.js:43"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1c5204d1cb4b50d", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/auth-utils.js:30", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/auth-utils.js:30"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f32af65ca8fba73", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth-utils.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-utils.js:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb224e7e40dc5d7a", "name": "Stray `console.log` in TS/JS \u2014 src/lib/apolloClient.js:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/apolloClient.js:133"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6a9ef0d183abb23", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth.js:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth.js:99"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cdfb689157588c77", "name": "Stray `console.log` in TS/JS \u2014 src/lib/org-creation.js:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/org-creation.js:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ffa7ecc134276aa9", "name": "Stray `console.log` in TS/JS \u2014 src/lib/organization-client.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/organization-client.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9159fc6f54d7987c", "name": "Stray `console.log` in TS/JS \u2014 src/lib/cache-utils.js:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cache-utils.js:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e721d8966b42a05", "name": "Stray `console.log` in TS/JS \u2014 src/lib/mongodb.js:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/mongodb.js:94"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45bb7a011f5a2db2", "name": "Stray `console.log` in TS/JS \u2014 src/lib/cache-validation.js:256", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cache-validation.js:256"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7b8d115ea5581342", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth-hooks.js:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-hooks.js:74"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0fffc2394ca75973", "name": "Stray `console.log` in TS/JS \u2014 src/lib/upload/cloudflare-r2-upload.js:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/upload/cloudflare-r2-upload.js:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f8e4eb6e0a23ee1", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth/user-sync.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth/user-sync.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5858dc03c252d3dc", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth/api.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth/api.js:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0432ae83cc129921", "name": "Stray `console.log` in TS/JS \u2014 src/graphql/purchaseOrderQueries.js:840", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/graphql/purchaseOrderQueries.js:840"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f1b8868494aa105", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/use-signature-data.jsx:747", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/use-signature-data.jsx:747"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eeb95aae4998a8c6", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useSeatBilling.js:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useSeatBilling.js:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a83c69a0a0a4ee4a", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useDashboardLayoutSimple.js:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useDashboardLayoutSimple.js:121"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-303fb2268bc0fde9", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useOrganizationChange.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useOrganizationChange.js:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4e036bc356b7edc", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useStripeConnect.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useStripeConnect.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15a10ee921815611", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useExpenses.js:293", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useExpenses.js:293"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee2d749527560ac4", "name": "Stray `console.log` in TS/JS \u2014 src/hooks/useOrganizationInvitations.js:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useOrganizationInvitations.js:89"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-944fad804f7b1669", "name": "Stray `console.log` in TS/JS \u2014 src/services/cloudflareIconUploadService.js:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/cloudflareIconUploadService.js:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-08e948dd20d24a19", "name": "Stray `console.log` in TS/JS \u2014 src/services/seatSyncService.js:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/seatSyncService.js:101"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2af13e0886fa90f", "name": "Stray `console.log` in TS/JS \u2014 e2e/global-teardown.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/global-teardown.ts:73"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a83a9d8fff6c2334", "name": "Stray `console.log` in TS/JS \u2014 e2e/auth.setup.js:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/auth.setup.js:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7fbb235666e6c7d8", "name": "Stray `console.log` in TS/JS \u2014 e2e/global-setup.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/global-setup.ts:77"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1e61b78269ede0db", "name": "Stray `console.log` in TS/JS \u2014 e2e/a11y/public-a11y.spec.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/a11y/public-a11y.spec.js:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f9696cd439414bd4", "name": "Stray `console.log` in TS/JS \u2014 e2e/a11y/dashboard-a11y.spec.js:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/a11y/dashboard-a11y.spec.js:46"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-df4c302599c92ce0", "name": "Insecure pattern 'eval_used' in __tests__/lib/validation.test.js:188", "shortDescription": {"text": "Insecure pattern 'eval_used' in __tests__/lib/validation.test.js:188"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-faeada54dad287ad", "name": "Insecure pattern 'new_function_used' in __tests__/lib/validation.test.js:190", "shortDescription": {"text": "Insecure pattern 'new_function_used' in __tests__/lib/validation.test.js:190"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-839e4f59232baeae", "name": "Insecure pattern 'node_child_process' in scripts/publish-articles.js:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/publish-articles.js:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dba2792be47d9de6", "name": "Insecure pattern 'dangerous_innerhtml' in app/layout.jsx:113", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.jsx:113"}, "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-75ac40b214dd6d13", "name": "Possible secret in app/api/test-email/route.js", "shortDescription": {"text": "Possible secret in app/api/test-email/route.js"}, "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-4a21c651e5d50e77", "name": "Insecure pattern 'local_storage_auth_token' in app/dashboard/dashboard-client-layout.jsx:124", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in app/dashboard/dashboard-client-layout.jsx:124"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-419d4b3222ab1783", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/clients/[id]/components/client-activity-tab.jsx:415", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/clients/[id]/components/client-activity-tab.jsx:415"}, "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-5bb6e5e12dc72258", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/clients/[id]/components/client-notes-tab.jsx:688", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/clients/[id]/components/client-notes-tab.jsx:688"}, "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-db4f3279b99e9cf2", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/clients/[id]/components/client-notes-tab.jsx:234", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/clients/[id]/components/client-notes-tab.jsx:234"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-31618b07b651caa1", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/transactions/components/transaction-detail-drawer", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx:1275"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8551f263cb637e5d", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/utils/html-generator.js:350", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/utils/html-generator.js:350"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a0c0d9e520ff4666", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/signatures-mail/components/preview/signature-preview-moda", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx:585"}, "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-8607550b6e98f90c", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/components/preview/signature-prev", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx:459"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce5cb10a2cd234fb", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/hooks/useSignatureGenerator.js:40", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/hooks/useSignatureGenerator.js:40"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0a78dc057f2a26df", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:90", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:90"}, "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-95e65cbffdf6c566", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:461", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:461"}, "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-f2b8f38e4b7a6926", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:111", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:111"}, "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-cb1ada345531ff7b", "name": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:996", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:996"}, "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-2275a4fc546b4017", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/kanban/[id]/components/task-modal/DescriptionEdit", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/kanban/[id]/components/task-modal/DescriptionEditor.jsx:107"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0d1a67f93ada4457", "name": "Insecure pattern 'direct_innerhtml_assignment' in app/transfer/[shareLink]/components/pdf-preview.jsx:38", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/transfer/[shareLink]/components/pdf-preview.jsx:38"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7fcea15099ff157", "name": "Insecure pattern 'dangerous_innerhtml' in app/public/kanban/[token]/page.jsx:979", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/public/kanban/[token]/page.jsx:979"}, "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-d23d1574bab129d1", "name": "Insecure pattern 'dangerous_innerhtml' in app/(main)/page.jsx:57", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/page.jsx:57"}, "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-b5ececa012b960a2", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/utils/kanbanHelpers.jsx:87", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/utils/kanbanHelpers.jsx:87"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef36c210d90468bd", "name": "Insecure pattern 'domparser_html_parse' in src/utils/product-import.js:178", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in src/utils/product-import.js:178"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98fa57f11a1673b6", "name": "Possible secret in src/components/ErrorMessage.jsx", "shortDescription": {"text": "Possible secret in src/components/ErrorMessage.jsx"}, "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-9e9ff1541775a969", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.jsx:100", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.jsx:100"}, "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-9a985b207b146fe5", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/image-drop-zone.jsx:209", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/image-drop-zone.jsx:209"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3215674ef7c818f8", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/mention-input.jsx:443", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/mention-input.jsx:443"}, "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-e9d58152480dad32", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/mention-input.jsx:170", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/mention-input.jsx:170"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4e845a7daf10b91b", "name": "Insecure pattern 'exec_used' in src/components/ui/multiselect.jsx:222", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/components/ui/multiselect.jsx:222"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a6d819e1abe804a7", "name": "Insecure pattern 'exec_used' in src/components/ui/multiple-selector.tsx:329", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/components/ui/multiple-selector.tsx:329"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cbd606f25b51721b", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/cookies/MarketingPixels.jsx:53", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/cookies/MarketingPixels.jsx:53"}, "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-8f277068365facb9", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/seo-metadata.jsx:91", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/seo-metadata.jsx:91"}, "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-a76568dbfc61a031", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/seo-head.jsx:119", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/seo-head.jsx:119"}, "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-b20d3538ae3babe9", "name": "Possible secret in e2e/seed/test-data.ts", "shortDescription": {"text": "Possible secret in e2e/seed/test-data.ts"}, "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-a155558fba0c6e94", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7ada1547d768fea0", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-388c38eab01eaf7c", "name": "Very large file: app/dashboard/page.jsx (1470 lines)", "shortDescription": {"text": "Very large file: app/dashboard/page.jsx (1470 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-4ce159b406371925", "name": "Very large file: app/dashboard/clients/components/table.jsx (1766 lines)", "shortDescription": {"text": "Very large file: app/dashboard/clients/components/table.jsx (1766 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-f4f50f00bd29cfb9", "name": "Very large file: app/dashboard/clients/components/clients-modal.jsx (2380 lines)", "shortDescription": {"text": "Very large file: app/dashboard/clients/components/clients-modal.jsx (2380 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-858ab3e08df78c97", "name": "Very large file: app/dashboard/outils/devis/components/quote-table.jsx (1274 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/devis/components/quote-table.jsx (1274 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-f2c288f18cca771e", "name": "Very large file: app/dashboard/outils/devis/components/quote-form-sections/ItemsSection.jsx (1206 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/devis/components/quote-form-sections/ItemsSection.jsx (1206 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-8d3c9cb69b11230b", "name": "Very large file: app/dashboard/outils/devis/components/quote-form-sections/client-selector.jsx (1789 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/devis/components/quote-form-sections/client-selector.jsx (1789 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-d1eaaed6ea932bea", "name": "Very large file: app/dashboard/outils/devis/hooks/use-quote-editor.js (2977 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/devis/hooks/use-quote-editor.js (2977 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-2309990d4a620290", "name": "Very large file: app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx (1925 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx (1925 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-bb9962c69517b4bd", "name": "Very large file: app/dashboard/outils/transactions/components/transactions/TransactionTable.jsx (1970 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/transactions/components/transactions/TransactionTable.jsx (1970 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-aaced918b09b5e4c", "name": "Very large file: app/dashboard/outils/signatures-mail/new/page.jsx (2022 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/signatures-mail/new/page.jsx (2022 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-e4b15780d2a477d6", "name": "Very large file: app/dashboard/outils/signatures-mail/components/blocks/BlockSettings.jsx (2471 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/signatures-mail/components/blocks/BlockSettings.jsx (2471 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-4515da26fdb771f7", "name": "Very large file: app/dashboard/outils/kanban/page.jsx (1682 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/kanban/page.jsx (1682 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-f4218994542f4eba", "name": "Very large file: app/dashboard/outils/kanban/[id]/page.jsx (2089 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/kanban/[id]/page.jsx (2089 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-57f84650060ce116", "name": "Very large file: app/dashboard/outils/kanban/[id]/components/TaskActivity.jsx (1689 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/TaskActivity.jsx (1689 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-a363807bb026da73", "name": "Very large file: app/dashboard/outils/kanban/[id]/components/TaskModal.jsx (2565 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/TaskModal.jsx (2565 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-9039d2905e2fd5ca", "name": "Very large file: app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx (3707 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx (3707 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-4a6a5909af5f0687", "name": "Very large file: app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx (1434 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx (1434 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-b55fa7575f93ea83", "name": "Very large file: app/dashboard/outils/factures/components/invoice-sidebar.jsx (1583 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures/components/invoice-sidebar.jsx (1583 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-9f54c3c07cb6e8c7", "name": "Very large file: app/dashboard/outils/factures/components/invoice-table.jsx (1448 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures/components/invoice-table.jsx (1448 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-fa1cbc316045880d", "name": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/ItemsSection.jsx (1553 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/ItemsSection.jsx (1553 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-c3cf7dafbcf503e7", "name": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/client-selector.jsx (1789 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/client-selector.jsx (1789 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-b9f2e05f5f57f788", "name": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx (1577 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx (1577 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-c0ff4f05253aeaef", "name": "Very large file: app/dashboard/outils/factures/hooks/use-invoice-editor.js (3152 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures/hooks/use-invoice-editor.js (3152 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-0e49c740614f997e", "name": "Very large file: app/dashboard/outils/documents-partages/page.jsx (5340 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/documents-partages/page.jsx (5340 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-ff9018f7b632d5d7", "name": "Very large file: app/dashboard/outils/factures-achat/components/table.jsx (1334 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures-achat/components/table.jsx (1334 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-6d3cec302020f856", "name": "Very large file: app/dashboard/outils/factures-achat/components/detail-drawer.jsx (1390 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/factures-achat/components/detail-drawer.jsx (1390 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-b6808ee895d14b78", "name": "Very large file: app/dashboard/outils/bons-commande/hooks/use-purchase-order-editor.js (2912 lines)", "shortDescription": {"text": "Very large file: app/dashboard/outils/bons-commande/hooks/use-purchase-order-editor.js (2912 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-9cbe8d58c0fc3ba0", "name": "Very large file: app/public/kanban/[token]/page.jsx (4263 lines)", "shortDescription": {"text": "Very large file: app/public/kanban/[token]/page.jsx (4263 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-d471cf6e82c08115", "name": "Very large file: src/components/nav-main.jsx (1292 lines)", "shortDescription": {"text": "Very large file: src/components/nav-main.jsx (1292 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-be76ba606662a4cb", "name": "Very large file: src/components/icons.jsx (2846 lines)", "shortDescription": {"text": "Very large file: src/components/icons.jsx (2846 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-3a068c59c4c736c4", "name": "Very large file: src/components/settings/applications-section.jsx (1738 lines)", "shortDescription": {"text": "Very large file: src/components/settings/applications-section.jsx (1738 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-453d9d9f3f7152d2", "name": "Very large file: src/components/pdf/UniversalPreviewPDF.jsx (2681 lines)", "shortDescription": {"text": "Very large file: src/components/pdf/UniversalPreviewPDF.jsx (2681 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-85f187ed9b573487", "name": "Very large file: src/lib/auth-plugins.js (1790 lines)", "shortDescription": {"text": "Very large file: src/lib/auth-plugins.js (1790 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-bb7c339716e5f29d", "name": "Very large file: src/hooks/use-signature-data.jsx (2009 lines)", "shortDescription": {"text": "Very large file: src/hooks/use-signature-data.jsx (2009 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": "118 test file(s) for 1331 source file(s) (ratio 0.09). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 1083 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 945 placeholder/mock markers across 229 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-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-862b0525c256f2b5", "name": "Commented-code block (5 lines) in playwright.config.js:158", "shortDescription": {"text": "Commented-code block (5 lines) in playwright.config.js:158"}, "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-8675a8b192bb3da5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 quick_start.js:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 quick_start.js: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-edab539a2e19666d", "name": "Commented-code block (10 lines) in __tests__/setup.js:15", "shortDescription": {"text": "Commented-code block (10 lines) in __tests__/setup.js:15"}, "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-45a9b912984bec08", "name": "Commented-code block (7 lines) in __tests__/lib/authorize-subscription-reference.test.js:3", "shortDescription": {"text": "Commented-code block (7 lines) in __tests__/lib/authorize-subscription-reference.test.js:3"}, "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-2e8ac25fc189ea6c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/remove-members-from-org.js:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/remove-members-from-org.js:63"}, "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-e689fee52b9a80d2", "name": "Commented-code block (6 lines) in scripts/publish-articles.js:109", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/publish-articles.js:109"}, "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-8803e46d37815360", "name": "Commented-code block (18 lines) in app/produits/kanban/section/KanbanComponentsSection.jsx:189", "shortDescription": {"text": "Commented-code block (18 lines) in app/produits/kanban/section/KanbanComponentsSection.jsx:189"}, "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-96e83def799a47a0", "name": "Commented-code block (18 lines) in app/produits/transfers/section/TransfersComponentsSection.jsx:189", "shortDescription": {"text": "Commented-code block (18 lines) in app/produits/transfers/section/TransfersComponentsSection.jsx:189"}, "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-8f18447d25c72db1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/disconnect/route.js:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/disconnect/route.js:30"}, "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-ad3c71dbc6298d38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/authorize/route.js:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/authorize/route.js: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-d31b9490d17ec177", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/status/route.js:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/status/route.js:30"}, "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-3133a495b71bee69", "name": "Commented-code block (6 lines) in app/api/auth/verify-email/route.js:22", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/auth/verify-email/route.js:22"}, "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-7e4bfcae5392f2ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/upload-image/route.js:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/upload-image/route.js:72"}, "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-72e28d3621853c24", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/transfer/download/[fileId]/route.js:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/transfer/download/[fileId]/route.js:95"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e34ee3897b8aea13", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/meta-capi/route.js:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/meta-capi/route.js:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fad8833602aaac5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/gocardless/connect/route.js:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/gocardless/connect/route.js: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-6b7307a16a21ea02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/bridge/connect/route.js:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/bridge/connect/route.js: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-4b78a1b2017bfc4d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/bridge/institutions/route.js:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/bridge/institutions/route.js:20"}, "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-f218a252aa3d54ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cloudflare/cleanup-temp/route.js:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cloudflare/cleanup-temp/route.js: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-96c7be8e724401a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/search-companies/route.js:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/search-companies/route.js:30"}, "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-5b10ddd1a682e09d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/signatures/auto-save/route.js:276", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/signatures/auto-save/route.js:276"}, "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-1c8ee646107122b4", "name": "Commented-code block (6 lines) in app/api/documents/download/route.js:20", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/documents/download/route.js:20"}, "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-64a49be5d2247607", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-sync/accounts/route.js:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-sync/accounts/route.js:38"}, "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-88ca522732bf5e5f", "name": "Commented-code block (5 lines) in app/api/create-org-subscription/route.js:42", "shortDescription": {"text": "Commented-code block (5 lines) in app/api/create-org-subscription/route.js:42"}, "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-0b4f5d81217c86bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/unified-expenses/match/route.js:58", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/unified-expenses/match/route.js:58"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0683fe87e5581a1b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/unified-expenses/auto-reconcile/route.js:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/unified-expenses/auto-reconcile/route.js:96"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d10dea6d76532bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/preview-file/[documentId]/route.js:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/preview-file/[documentId]/route.js:22"}, "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-b16fede2c31567f5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-file/[documentId]/route.js:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-file/[documentId]/route.js:22"}, "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-fb9de2a2ff52415a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/selection-info/route.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/selection-info/route.js: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-edfa9a76c0f4fe79", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-folder/route.js:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-folder/route.js:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a6284b56c9e0266", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-selection/route.js:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-selection/route.js: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-ade5e0289fb286c1", "name": "Commented-code block (5 lines) in app/dashboard/dashboard-client-layout.jsx:255", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/dashboard-client-layout.jsx:255"}, "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-35ad23dca67ff023", "name": "Commented-code block (13 lines) in app/dashboard/outils/loading.jsx:7", "shortDescription": {"text": "Commented-code block (13 lines) in app/dashboard/outils/loading.jsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d33029903155db27", "name": "Commented-code block (6 lines) in app/dashboard/outils/devis/components/quote-form-sections/QuoteInfoSection.jsx:178", "shortDescription": {"text": "Commented-code block (6 lines) in app/dashboard/outils/devis/components/quote-form-sections/QuoteInfoSection.jsx:178"}, "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-b05f784d56cc182d", "name": "Commented-code block (5 lines) in app/dashboard/outils/devis/hooks/use-quote-editor.js:873", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/devis/hooks/use-quote-editor.js:873"}, "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-c59bba7106bf410a", "name": "Commented-code block (7 lines) in app/dashboard/outils/devis/hooks/use-quote-table.js:268", "shortDescription": {"text": "Commented-code block (7 lines) in app/dashboard/outils/devis/hooks/use-quote-table.js:268"}, "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-3aa9aad1b9582944", "name": "Commented-code block (34 lines) in app/dashboard/outils/signatures-mail/new/page.jsx:193", "shortDescription": {"text": "Commented-code block (34 lines) in app/dashboard/outils/signatures-mail/new/page.jsx:193"}, "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-13dc908e804cd3de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/signatures-mail/new/page.jsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/signatures-mail/new/page.jsx: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-f2b174a95fef4cde", "name": "Commented-code block (14 lines) in app/dashboard/outils/signatures-mail/components/editor/layout/LayoutContent.jsx:50", "shortDescription": {"text": "Commented-code block (14 lines) in app/dashboard/outils/signatures-mail/components/editor/layout/LayoutContent.jsx:50"}, "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-3d003b9d77c0f7ad", "name": "Commented-code block (6 lines) in app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:135", "shortDescription": {"text": "Commented-code block (6 lines) in app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:135"}, "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-41b3180228b92a3e", "name": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/page.jsx:1095", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/page.jsx:1095"}, "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-b80a6f4d4060558a", "name": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/components/TaskModal.jsx:597", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/components/TaskModal.jsx:597"}, "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-93156213af4cb4f0", "name": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:1100", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:1100"}, "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-e71eee7dd83979f1", "name": "Commented-code block (7 lines) in app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:344", "shortDescription": {"text": "Commented-code block (7 lines) in app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:344"}, "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-eea63b82c3d09d7d", "name": "Commented-code block (8 lines) in app/dashboard/outils/kanban/[id]/hooks/useKanbanTasks.js:187", "shortDescription": {"text": "Commented-code block (8 lines) in app/dashboard/outils/kanban/[id]/hooks/useKanbanTasks.js:187"}, "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-3bc6bb5a9c1f8b32", "name": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/hooks/useMemberToggle.js:60", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/hooks/useMemberToggle.js:60"}, "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-9713058232b0b9e7", "name": "Commented-code block (5 lines) in app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx:531"}, "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-e2ee4f74a9f834eb", "name": "Commented-code block (6 lines) in app/dashboard/outils/factures/hooks/use-invoice-editor.js:958", "shortDescription": {"text": "Commented-code block (6 lines) in app/dashboard/outils/factures/hooks/use-invoice-editor.js:958"}, "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-b2823fd312ab919c", "name": "Commented-code block (5 lines) in app/dashboard/outils/factures/hooks/use-invoice-table.js:287", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/factures/hooks/use-invoice-table.js:287"}, "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-dad24606884f3863", "name": "Commented-code block (6 lines) in app/dashboard/outils/analytiques/components/analytics-revenue-pie-chart.jsx:107", "shortDescription": {"text": "Commented-code block (6 lines) in app/dashboard/outils/analytiques/components/analytics-revenue-pie-chart.jsx:107"}, "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-e976710ad0ebfa1a", "name": "Commented-code block (5 lines) in app/dashboard/outils/documents-partages/page.jsx:459", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/documents-partages/page.jsx:459"}, "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-0b926c04662df015", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/factures-achat/components/gmail-connection.jsx:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/factures-achat/components/gmail-connection.jsx:86"}, "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-5f2528f9b3f644a9", "name": "Commented-code block (5 lines) in app/dashboard/outils/bons-commande/hooks/use-purchase-order-editor.js:865", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/outils/bons-commande/hooks/use-purchase-order-editor.js:865"}, "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-29c10b429484d1f9", "name": "Commented-code block (6 lines) in app/dashboard/outils/transferts-fichiers/utils/watermark.js:302", "shortDescription": {"text": "Commented-code block (6 lines) in app/dashboard/outils/transferts-fichiers/utils/watermark.js:302"}, "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-d31de53dcda51ae3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-new.jsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-new.jsx:342"}, "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-d6cdc8ef76407ab6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/account/components/Setup2FAModal.jsx:90", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/account/components/Setup2FAModal.jsx:90"}, "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-99e174167ae5a966", "name": "Commented-code block (6 lines) in app/dashboard/calendar/components/calendar-dnd-context.jsx:277", "shortDescription": {"text": "Commented-code block (6 lines) in app/dashboard/calendar/components/calendar-dnd-context.jsx:277"}, "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-6b77c290be53bd78", "name": "Commented-code block (5 lines) in app/dashboard/calendar/components/event-calendar.jsx:130", "shortDescription": {"text": "Commented-code block (5 lines) in app/dashboard/calendar/components/event-calendar.jsx:130"}, "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-b04496c6bca8baf8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/transfer/[shareLink]/page.jsx:200", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/transfer/[shareLink]/page.jsx:200"}, "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-bb0627c057f885d5", "name": "Commented-code block (5 lines) in app/onboarding/success/page.jsx:160", "shortDescription": {"text": "Commented-code block (5 lines) in app/onboarding/success/page.jsx:160"}, "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-41324675ff5815b7", "name": "Commented-code block (5 lines) in app/(main)/new/lp-home/NewHeroNavbar.jsx:68", "shortDescription": {"text": "Commented-code block (5 lines) in app/(main)/new/lp-home/NewHeroNavbar.jsx:68"}, "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-7fe42ea5456ff5b8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/pdf-generator/invoice/[id]/page.jsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/pdf-generator/invoice/[id]/page.jsx: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-86e8651de0d05e72", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/pdf-generator/credit-note/[id]/page.jsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/pdf-generator/credit-note/[id]/page.jsx: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-eb8d5244a15a4684", "name": "Commented-code block (5 lines) in src/utils/errorMessages.js:411", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/errorMessages.js:411"}, "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-d9b7bf2720dfb59d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/archive-invoice-facturx.js:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/archive-invoice-facturx.js:45"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-262f5ab6846b2ba2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/trackEvent.js:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/trackEvent.js:30"}, "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-5f3b1b666365ab13", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/build-document-pdf.js:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/build-document-pdf.js:56"}, "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-08346d1f5b2c9501", "name": "Commented-code block (6 lines) in src/components/section-cards.jsx:187", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/section-cards.jsx:187"}, "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-f27d696e045ac011", "name": "Commented-code block (5 lines) in src/components/settings-modal.jsx:204", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/settings-modal.jsx:204"}, "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-1f71f9b14e00a1a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/pricing-modal.jsx:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/pricing-modal.jsx: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-2c271d953e97f548", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/invite-member-modal.jsx:140", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/invite-member-modal.jsx:140"}, "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-dbfd3a42036e7932", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/subscription-section.jsx:210", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/subscription-section.jsx:210"}, "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-7b1e3636b6200022", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/espaces-section.jsx:261", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/espaces-section.jsx:261"}, "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-573c84ec3df4d3aa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/security-section.jsx:264", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/security-section.jsx:264"}, "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-1f70cdd83edffd0a", "name": "Commented-code block (10 lines) in src/components/settings/facturation-section.jsx:96", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/settings/facturation-section.jsx:96"}, "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-0f49a564f1e768a0", "name": "Commented-code block (5 lines) in src/components/ui/tabs-new.jsx:40", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ui/tabs-new.jsx:40"}, "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-ee0f4d9a37f2523f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/banking/BankBalanceCard.jsx:129", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/banking/BankBalanceCard.jsx:129"}, "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-6d1b9d5ea315e1a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/create-workspace-modal/hooks/useCreateWorkspace.js:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/create-workspace-modal/hooks/useCreateWorkspace.js:45"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-afb0e049bfb18363", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/pdf/UniversalPDFDownloaderWithFacturX.jsx:1260", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/pdf/UniversalPDFDownloaderWithFacturX.jsx:1260"}, "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-59f87f304001fa12", "name": "Commented-code block (7 lines) in src/lib/auth-plugins.js:262", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/auth-plugins.js:262"}, "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-afbc36d25d0b086d", "name": "Commented-code block (9 lines) in src/lib/auth-utils.js:30", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/auth-utils.js:30"}, "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-c4ca2803b5c2a22f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/auth-utils.js:326", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/auth-utils.js:326"}, "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-80504d2b9d09cb8b", "name": "Commented-code block (5 lines) in src/lib/apolloClient.js:48", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/apolloClient.js:48"}, "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-0f3c748cfba6b0f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/apolloClient.js:449", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/apolloClient.js:449"}, "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-af58ca24a06011d7", "name": "Commented-code block (6 lines) in src/lib/setup-otp-store.js:3", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/setup-otp-store.js:3"}, "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-fbe880d7ceacc865", "name": "Commented-code block (6 lines) in src/lib/org-creation.js:240", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/org-creation.js:240"}, "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-d217b4a8f78bf7c5", "name": "Commented-code block (6 lines) in src/lib/auth/api.js:186", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/auth/api.js:186"}, "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-0daa24c1b61bcd7f", "name": "Commented-code block (5 lines) in src/hooks/useDashboardLayoutSimple.js:16", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useDashboardLayoutSimple.js:16"}, "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-4cece43701347905", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useDashboardLayoutSimple.js:171", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useDashboardLayoutSimple.js:171"}, "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-7d4039010b55f785", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAutoReconcile.js:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAutoReconcile.js:96"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e70aaac8560ac8c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useBetterAuthJWT.js:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useBetterAuthJWT.js:22"}, "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-238635deaee8e170", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useZipPreview.js:140", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useZipPreview.js:140"}, "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-8284db9140b78a70", "name": "Commented-code block (18 lines) in src/hooks/useOrganizationInvitations.js:20", "shortDescription": {"text": "Commented-code block (18 lines) in src/hooks/useOrganizationInvitations.js:20"}, "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-03ce1256c27cfd7c", "name": "Commented-code block (5 lines) in src/hooks/useSubscriptionAccess.js:59", "shortDescription": {"text": "Commented-code block (5 lines) in src/hooks/useSubscriptionAccess.js:59"}, "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-5a27138299305a92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/cloudflareIconUploadService.js:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/cloudflareIconUploadService.js:66"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbfafbe0a1540fbb", "name": "Commented-code block (8 lines) in e2e/auth.setup.js:50", "shortDescription": {"text": "Commented-code block (8 lines) in e2e/auth.setup.js:50"}, "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-c0646002a27a2265", "name": "Commented-code block (6 lines) in e2e/global-setup.ts:126", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/global-setup.ts:126"}, "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-ea7e32ed58371ecb", "name": "Commented-code block (12 lines) in e2e/fixtures/auth.fixture.js:30", "shortDescription": {"text": "Commented-code block (12 lines) in e2e/fixtures/auth.fixture.js:30"}, "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-8c4ce945390e7771", "name": "Commented-code block (5 lines) in e2e/email-signatures/signatures-crud.spec.js:73", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/email-signatures/signatures-crud.spec.js:73"}, "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-167ecca7c0c834e0", "name": "Commented-code block (6 lines) in e2e/factures/issue-date-default.spec.js:125", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/factures/issue-date-default.spec.js:125"}, "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-dbc986c5f8c9196b", "name": "Commented-code block (5 lines) in e2e/factures/numbering-free-mode.spec.js:120", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/factures/numbering-free-mode.spec.js:120"}, "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-f1b1aa4eefa34af1", "name": "Commented-code block (7 lines) in e2e/factures/numbering-settings-isolation.spec.js:146", "shortDescription": {"text": "Commented-code block (7 lines) in e2e/factures/numbering-settings-isolation.spec.js:146"}, "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-77c9c82461d87a7b", "name": "Commented-code block (9 lines) in e2e/factures/situations-conversion.spec.js:101", "shortDescription": {"text": "Commented-code block (9 lines) in e2e/factures/situations-conversion.spec.js:101"}, "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-1e73759963403447", "name": "Commented-code block (5 lines) in e2e/factures/invariants-business.spec.js:237", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/factures/invariants-business.spec.js:237"}, "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-49c149d23ca1bef0", "name": "Commented-code block (5 lines) in e2e/factures/due-date-recalc.spec.js:245", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/factures/due-date-recalc.spec.js:245"}, "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-19c6f716e4a47a39", "name": "Commented-code block (5 lines) in e2e/factures/numbering-format.spec.js:27", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/factures/numbering-format.spec.js:27"}, "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-aea61e7248c1025c", "name": "Commented-code block (6 lines) in e2e/factures/avoirs.spec.js:40", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/factures/avoirs.spec.js:40"}, "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-c3382c72e95c55bd", "name": "Commented-code block (7 lines) in e2e/factures/numbering-sequential.spec.js:192", "shortDescription": {"text": "Commented-code block (7 lines) in e2e/factures/numbering-sequential.spec.js:192"}, "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-875b8190f5112653", "name": "Commented-code block (9 lines) in e2e/factures/pieges-critiques.spec.js:107", "shortDescription": {"text": "Commented-code block (9 lines) in e2e/factures/pieges-critiques.spec.js:107"}, "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-3b1649d2cba256af", "name": "Commented-code block (6 lines) in e2e/factures/crud-mutations.spec.js:128", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/factures/crud-mutations.spec.js:128"}, "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-70fe45abbb7677d9", "name": "Commented-code block (6 lines) in e2e/factures/crud-ui.spec.js:109", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/factures/crud-ui.spec.js:109"}, "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-24ba23df0dd4e9fb", "name": "Commented-code block (5 lines) in e2e/factures/helpers/ui-helpers.js:46", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/factures/helpers/ui-helpers.js:46"}, "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-86c0fd5ffeb38c1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/factures/helpers/invoice-mutations.js:231", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/factures/helpers/invoice-mutations.js:231"}, "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-192cb5f0d7124c96", "name": "Commented-code block (6 lines) in e2e/clients/client-crud.spec.js:9", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/clients/client-crud.spec.js: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-e86f88d61c0328fc", "name": "Commented-code block (5 lines) in e2e/treasury/treasury-forecast.spec.js:60", "shortDescription": {"text": "Commented-code block (5 lines) in e2e/treasury/treasury-forecast.spec.js:60"}, "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-e5fb535b4387f779", "name": "Commented-code block (6 lines) in e2e/quotes/quote-p0.spec.js:115", "shortDescription": {"text": "Commented-code block (6 lines) in e2e/quotes/quote-p0.spec.js:115"}, "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-bddda3d5a14c7401", "name": "29 env vars used in code but missing from .env.example", "shortDescription": {"text": "29 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APPLE_APP_BUNDLE_IDENTIFIER`, `APPLE_CLIENT_ID`, `APPLE_CLIENT_SECRET`, `CI`, `CLEANUP_URI`, `CONFIRM_CLEANUP`, `ENABLE_APP_TRIAL`, `GRAPHQL_URL` + 21 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20632"}, "properties": {"repository": "Sweily-fr/NewbiV2", "repoUrl": "https://github.com/Sweily-fr/NewbiV2", "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-b4d8ce834a7c8ce6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 quick_start.js:59"}, "properties": {"repobilityId": "0cdf2cff8391c8a9", "scanner": "scanner-primary", "fingerprint": "b4d8ce834a7c8ce6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b503e4c835719e70", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-validation.js:4"}, "properties": {"repobilityId": "e2692e950f71ab0d", "scanner": "scanner-primary", "fingerprint": "b503e4c835719e70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd1dec1e51c8b054", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-sync.js:13"}, "properties": {"repobilityId": "3f285dee654864d1", "scanner": "scanner-primary", "fingerprint": "fd1dec1e51c8b054", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5143f4c4ccf399f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-production.js:37"}, "properties": {"repobilityId": "9fe3a8dc72a8078e", "scanner": "scanner-primary", "fingerprint": "b5143f4c4ccf399f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd948152f7668c24", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/remove-members-from-org.js:52"}, "properties": {"repobilityId": "14863579e4dfffef", "scanner": "scanner-primary", "fingerprint": "fd948152f7668c24", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3a6b79a4fbd68d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-subscription-emails.js:41"}, "properties": {"repobilityId": "42bde3479b301bbd", "scanner": "scanner-primary", "fingerprint": "e3a6b79a4fbd68d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-400a6d63431a6452", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnose-account.js:60"}, "properties": {"repobilityId": "3d75d6c3fb1760b8", "scanner": "scanner-primary", "fingerprint": "400a6d63431a6452", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f786b21b5b2de37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-frontmatter-fields.js:30"}, "properties": {"repobilityId": "b893f4e7e92fa079", "scanner": "scanner-primary", "fingerprint": "6f786b21b5b2de37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8bdb27a477f21850", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-billing-sync.js:13"}, "properties": {"repobilityId": "d5dd982d1e95ada6", "scanner": "scanner-primary", "fingerprint": "8bdb27a477f21850", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf32ac7a813db312", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/add-members-to-org.js:130"}, "properties": {"repobilityId": "c895ad54e45cf278", "scanner": "scanner-primary", "fingerprint": "bf32ac7a813db312", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-968a76de18913459", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/publish-articles.js:37"}, "properties": {"repobilityId": "b707f57d6b24f009", "scanner": "scanner-primary", "fingerprint": "968a76de18913459", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-68ddb918cdc2edf7", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/layout.jsx:113"}, "properties": {"repobilityId": "368095564d93efd0", "scanner": "scanner-primary", "fingerprint": "68ddb918cdc2edf7", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4bc5697a83548c58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/auth/manage-devices/page.jsx:248"}, "properties": {"repobilityId": "b6755a39a881ddb2", "scanner": "scanner-primary", "fingerprint": "4bc5697a83548c58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-163c6f5e18139c53", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/login/loginForm.jsx:23"}, "properties": {"repobilityId": "c7902316b33f8eca", "scanner": "scanner-primary", "fingerprint": "163c6f5e18139c53", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-760fe60f96ef9a7b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/signup/registerForm.jsx:50"}, "properties": {"repobilityId": "eff8daeee045508f", "scanner": "scanner-primary", "fingerprint": "760fe60f96ef9a7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a19189bbde8fc63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/auth/signup/page.jsx:726"}, "properties": {"repobilityId": "d16f2f10f3ae29ee", "scanner": "scanner-primary", "fingerprint": "0a19189bbde8fc63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9442055192325ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/verify-email/page.jsx:24"}, "properties": {"repobilityId": "3055340968cea750", "scanner": "scanner-primary", "fingerprint": "e9442055192325ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-214a0b8d9ad9629e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/auth/verify-2fa/page.jsx:70"}, "properties": {"repobilityId": "5c1abf54279ae207", "scanner": "scanner-primary", "fingerprint": "214a0b8d9ad9629e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b0178daa595cf47", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/kanban/section/KanbanBoard.jsx:69"}, "properties": {"repobilityId": "8081ac5722661de2", "scanner": "scanner-primary", "fingerprint": "9b0178daa595cf47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-beda40047c39f631", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/facturation-electronique/section/FactElecGovernanceSection.jsx:198"}, "properties": {"repobilityId": "7633fdd163a0b364", "scanner": "scanner-primary", "fingerprint": "beda40047c39f631", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-264ef4bd5313c769", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/gestion-des-achats/section/AchatsGovernanceSection.jsx:89"}, "properties": {"repobilityId": "81f37d7abe268263", "scanner": "scanner-primary", "fingerprint": "264ef4bd5313c769", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e84ab036e93e624", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/HowItWorksSection.jsx:153"}, "properties": {"repobilityId": "7a75ef7a1542b326", "scanner": "scanner-primary", "fingerprint": "2e84ab036e93e624", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1dfb4f4a1608eeb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/ShareTrackingAnimation.jsx:170"}, "properties": {"repobilityId": "b811bac8f7255a2c", "scanner": "scanner-primary", "fingerprint": "e1dfb4f4a1608eeb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5a4518af8204e26", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/DragDropAnimation.jsx:393"}, "properties": {"repobilityId": "8c8004f28569d1bd", "scanner": "scanner-primary", "fingerprint": "b5a4518af8204e26", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-58ec03e21e820a45", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/MiniUploadAnimation.jsx:164"}, "properties": {"repobilityId": "8f9c025a0d5fefd3", "scanner": "scanner-primary", "fingerprint": "58ec03e21e820a45", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce0814d8b8cb319b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/produits/transfers/section/MobileDragDropAnimation.jsx:115"}, "properties": {"repobilityId": "10f3a5d94e5bad1e", "scanner": "scanner-primary", "fingerprint": "ce0814d8b8cb319b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d3461114f1de0dd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/test-animation-pro/page.jsx:26"}, "properties": {"repobilityId": "3b720f517b610899", "scanner": "scanner-primary", "fingerprint": "8d3461114f1de0dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-867208b5796fa459", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/invitations/[id]/route.js:60"}, "properties": {"repobilityId": "859bae9c2b024596", "scanner": "scanner-primary", "fingerprint": "867208b5796fa459", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46d65020476f1cd0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/auth/verify-email/route.js:12"}, "properties": {"repobilityId": "b1926439e63d2a97", "scanner": "scanner-primary", "fingerprint": "46d65020476f1cd0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-128c3bc2ce4df673", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/leads/notify/route.js:8"}, "properties": {"repobilityId": "da0a6bcd2b1a9a7b", "scanner": "scanner-primary", "fingerprint": "128c3bc2ce4df673", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2a1210e56fc74f81", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/sync-subscription-status/route.js:32"}, "properties": {"repobilityId": "7ef9bb999e0a60cb", "scanner": "scanner-primary", "fingerprint": "2a1210e56fc74f81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bcd59f7130fbc521", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/generate-facturx/route.js:15"}, "properties": {"repobilityId": "cae517d23ec0dddc", "scanner": "scanner-primary", "fingerprint": "bcd59f7130fbc521", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d30d67f5d7bb2f5d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/verify-checkout-session/route.js:32"}, "properties": {"repobilityId": "9812d96d08163cdf", "scanner": "scanner-primary", "fingerprint": "d30d67f5d7bb2f5d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c74fa8c3e32422fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/billing/check-user-limit/route.js:20"}, "properties": {"repobilityId": "c11badf6359360c1", "scanner": "scanner-primary", "fingerprint": "c74fa8c3e32422fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35ee94d612098ea7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/billing/sync-seats/route.js:24"}, "properties": {"repobilityId": "49a97cc1e8cc4475", "scanner": "scanner-primary", "fingerprint": "35ee94d612098ea7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc8a1284875f0a17", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/billing/check-role-change/route.js:15"}, "properties": {"repobilityId": "d88902c9247a67c1", "scanner": "scanner-primary", "fingerprint": "fc8a1284875f0a17", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f82e29f9a44fbcbb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/delete-test-users/route.js:67"}, "properties": {"repobilityId": "7c5ff7f85e9d3139", "scanner": "scanner-primary", "fingerprint": "f82e29f9a44fbcbb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de5864eb51ba0405", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/admin/create-test-users/route.js:67"}, "properties": {"repobilityId": "2cc1954e9ba1059b", "scanner": "scanner-primary", "fingerprint": "de5864eb51ba0405", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d206b9f27f434d24", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/delete-icons/route.js:72"}, "properties": {"repobilityId": "ffe76cd0d6ea9f5a", "scanner": "scanner-primary", "fingerprint": "d206b9f27f434d24", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45862dd1c6ae085a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/cleanup-temp/route.js:26"}, "properties": {"repobilityId": "3b735ec56a4122e7", "scanner": "scanner-primary", "fingerprint": "45862dd1c6ae085a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b905278e817f2edc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/cloudflare/upload-icon/route.js:88"}, "properties": {"repobilityId": "16d6ce1c96c8c899", "scanner": "scanner-primary", "fingerprint": "b905278e817f2edc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5bd0d854892c049b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/credit-notes/generate-pdf/route.js:44"}, "properties": {"repobilityId": "06062cb2195e6747", "scanner": "scanner-primary", "fingerprint": "5bd0d854892c049b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-706e5b1c6ce2bdb9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/organization/reorder/route.js:27"}, "properties": {"repobilityId": "ff1874e690f15ee8", "scanner": "scanner-primary", "fingerprint": "706e5b1c6ce2bdb9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf065ef76a25a88f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/revoke-session/route.js:8"}, "properties": {"repobilityId": "56792a42e440f2b8", "scanner": "scanner-primary", "fingerprint": "cf065ef76a25a88f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e24f50ba300510e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/onboarding/step/route.js:157"}, "properties": {"repobilityId": "dd752621b259a754", "scanner": "scanner-primary", "fingerprint": "3e24f50ba300510e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7835e17ef5e82f74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/check-siret/route.js:41"}, "properties": {"repobilityId": "04577afca3ed9ae0", "scanner": "scanner-primary", "fingerprint": "7835e17ef5e82f74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5c1ccebb30cea232", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/change-subscription-plan/route.js:517"}, "properties": {"repobilityId": "afbf89a74befd47e", "scanner": "scanner-primary", "fingerprint": "5c1ccebb30cea232", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fa852b45d1052d2c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/change-subscription-plan/route.js:158"}, "properties": {"repobilityId": "9bab60c5242a2bef", "scanner": "scanner-primary", "fingerprint": "fa852b45d1052d2c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a53f178661e9d7aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/stripe/connect/status/route.js:20"}, "properties": {"repobilityId": "6fd952ac5608cea7", "scanner": "scanner-primary", "fingerprint": "a53f178661e9d7aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a98ee8df9209fc6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/purchase-orders/generate-pdf/route.js:44"}, "properties": {"repobilityId": "0d40e46e95fb095e", "scanner": "scanner-primary", "fingerprint": "0a98ee8df9209fc6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48845b2151ef05a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/signatures/auto-save/route.js:26"}, "properties": {"repobilityId": "13a50a25b1803f1c", "scanner": "scanner-primary", "fingerprint": "48845b2151ef05a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c42e9f8a9b9ec36a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/api/documents/download/route.js:14"}, "properties": {"repobilityId": "b22fc0e35eca4174", "scanner": "scanner-primary", "fingerprint": "c42e9f8a9b9ec36a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-91b43e818fb774c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/quotes/generate-pdf/route.js:44"}, "properties": {"repobilityId": "c06397be0cab05a3", "scanner": "scanner-primary", "fingerprint": "91b43e818fb774c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fce110363549c7a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/create-org-subscription/route.js:55"}, "properties": {"repobilityId": "832d8840ee4cd7de", "scanner": "scanner-primary", "fingerprint": "fce110363549c7a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-91f18af48e62d56f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/generate/route.js:37"}, "properties": {"repobilityId": "a019d35fa2eddf40", "scanner": "scanner-primary", "fingerprint": "91f18af48e62d56f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b720115797dedbf4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/delete/route.js:37"}, "properties": {"repobilityId": "d81204890e52382b", "scanner": "scanner-primary", "fingerprint": "b720115797dedbf4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6db1106e56849e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/custom-social-icons/update/route.js:37"}, "properties": {"repobilityId": "42f90ff6a79e60b5", "scanner": "scanner-primary", "fingerprint": "e6db1106e56849e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5c26c5af96ebfe50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/invoices/generate-pdf/route.js:44"}, "properties": {"repobilityId": "0c58008f7e612207", "scanner": "scanner-primary", "fingerprint": "5c26c5af96ebfe50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-af674e0d91af4751", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/invoices/preview-pdf/route.js:44"}, "properties": {"repobilityId": "1d08fa29994a0029", "scanner": "scanner-primary", "fingerprint": "af674e0d91af4751", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c6a9e0418982447", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/layout.jsx:81"}, "properties": {"repobilityId": "327eec4920605b70", "scanner": "scanner-primary", "fingerprint": "2c6a9e0418982447", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de4050da28fc3ca8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/page.jsx:428"}, "properties": {"repobilityId": "de82942a3ccc02ab", "scanner": "scanner-primary", "fingerprint": "de4050da28fc3ca8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-270cb77383855465", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/week-calendar-card.jsx:257"}, "properties": {"repobilityId": "b7d6f54ec7bcefdc", "scanner": "scanner-primary", "fingerprint": "270cb77383855465", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b582c5f194d63e68", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/top-clients-card.jsx:128"}, "properties": {"repobilityId": "8878773e55074c51", "scanner": "scanner-primary", "fingerprint": "b582c5f194d63e68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b710bd221f432972", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/components/income-category-chart.jsx:565"}, "properties": {"repobilityId": "136e6014a7f26941", "scanner": "scanner-primary", "fingerprint": "b710bd221f432972", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca3f20a3008461a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/blocked/page.jsx:362"}, "properties": {"repobilityId": "a5dc1091b2ed5247", "scanner": "scanner-primary", "fingerprint": "ca3f20a3008461a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4d202efd4e6dda16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/assign-members-dialog.jsx:210"}, "properties": {"repobilityId": "367d959dc99764e3", "scanner": "scanner-primary", "fingerprint": "4d202efd4e6dda16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f485bc710b9eddee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/client-lists-view.jsx:158"}, "properties": {"repobilityId": "2e6ad67a84499e24", "scanner": "scanner-primary", "fingerprint": "f485bc710b9eddee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f79d4ad60ce8e9d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-popover.jsx:89"}, "properties": {"repobilityId": "e129421489d6e129", "scanner": "scanner-primary", "fingerprint": "f79d4ad60ce8e9d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8a1b4f5f63ed99d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-panel.jsx:339"}, "properties": {"repobilityId": "ad013cf58b3c2f1a", "scanner": "scanner-primary", "fingerprint": "d8a1b4f5f63ed99d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29ae238096560554", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/custom-fields-manager.jsx:335"}, "properties": {"repobilityId": "e6a6b9711510e636", "scanner": "scanner-primary", "fingerprint": "29ae238096560554", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5e5898cc3a6c5d0c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/email-automation-form.jsx:522"}, "properties": {"repobilityId": "d9e235a14f1640b4", "scanner": "scanner-primary", "fingerprint": "5e5898cc3a6c5d0c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2832a20696199a88", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/add-clients-to-list-dialog.jsx:225"}, "properties": {"repobilityId": "82d8bf98e0a2dfab", "scanner": "scanner-primary", "fingerprint": "2832a20696199a88", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c522070d66fbfdf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/automations-popover.jsx:373"}, "properties": {"repobilityId": "b7c9647d58c9cb8b", "scanner": "scanner-primary", "fingerprint": "4c522070d66fbfdf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76d594ca9dee84af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/clients-modal.jsx:888"}, "properties": {"repobilityId": "e5b98773ae81f9b7", "scanner": "scanner-primary", "fingerprint": "76d594ca9dee84af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b3a9653fbd2cc76e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/import-steps/import-step-mapping.jsx:85"}, "properties": {"repobilityId": "f09b81cffca09594", "scanner": "scanner-primary", "fingerprint": "b3a9653fbd2cc76e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71fd3ac81f87ee62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/components/import-steps/import-step-upload.jsx:222"}, "properties": {"repobilityId": "136deda9955ec2f9", "scanner": "scanner-primary", "fingerprint": "71fd3ac81f87ee62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff887cbd0dec64c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/assign-members-dialog.jsx:141"}, "properties": {"repobilityId": "404c64353505b70c", "scanner": "scanner-primary", "fingerprint": "ff887cbd0dec64c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-396ce944a2aefe19", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/clients/[id]/components/client-activity-tab.jsx:415"}, "properties": {"repobilityId": "e57c37dd53e8f784", "scanner": "scanner-primary", "fingerprint": "396ce944a2aefe19", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4f20b6f408edd246", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-overview-tab.jsx:235"}, "properties": {"repobilityId": "bbe609956e3bbbaf", "scanner": "scanner-primary", "fingerprint": "4f20b6f408edd246", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ba8d6791ebbf05d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-notes-tab.jsx:160"}, "properties": {"repobilityId": "6f1648ea2048c95e", "scanner": "scanner-primary", "fingerprint": "7ba8d6791ebbf05d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56887886f1a43d8c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/clients/[id]/components/client-notes-tab.jsx:688"}, "properties": {"repobilityId": "8e95dc40aa3c9b86", "scanner": "scanner-primary", "fingerprint": "56887886f1a43d8c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-beb89900d5dc1fb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-detail-header.jsx:116"}, "properties": {"repobilityId": "f900e9c58c1d1c66", "scanner": "scanner-primary", "fingerprint": "beb89900d5dc1fb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5baeaeff262e1417", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/[id]/components/client-detail-sidebar.jsx:328"}, "properties": {"repobilityId": "982b9ddb0efd2e04", "scanner": "scanner-primary", "fingerprint": "5baeaeff262e1417", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24371500b52815e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/clients/segments/page.jsx:631"}, "properties": {"repobilityId": "c0dfd98513567abe", "scanner": "scanner-primary", "fingerprint": "24371500b52815e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1ffc67ca404aab2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/import-quote-modal.jsx:254"}, "properties": {"repobilityId": "195c699a8e3021f1", "scanner": "scanner-primary", "fingerprint": "d1ffc67ca404aab2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7debdf9367390904", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/modern-quote-editor.jsx:575"}, "properties": {"repobilityId": "3b2cc61ce9c591af", "scanner": "scanner-primary", "fingerprint": "7debdf9367390904", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7ed83e6057c9546", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/imported-quote-sidebar.jsx:477"}, "properties": {"repobilityId": "8cea964f0a81c358", "scanner": "scanner-primary", "fingerprint": "d7ed83e6057c9546", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30654fe3369d41e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/quote-form-sections/QuoteInfoSection.jsx:756"}, "properties": {"repobilityId": "49ac4c6c1431d718", "scanner": "scanner-primary", "fingerprint": "30654fe3369d41e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5565ab7fb3629cc4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/components/quote-form-sections/client-selector.jsx:773"}, "properties": {"repobilityId": "9f99299fc411e662", "scanner": "scanner-primary", "fingerprint": "5565ab7fb3629cc4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-385e976cea023c90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/devis/hooks/use-quote-table.js:339"}, "properties": {"repobilityId": "92b1f2608eaf7c30", "scanner": "scanner-primary", "fingerprint": "385e976cea023c90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c49fe512b4eafe3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/page.jsx:531"}, "properties": {"repobilityId": "ebace5198b6adb64", "scanner": "scanner-primary", "fingerprint": "5c49fe512b4eafe3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b7a14e929954534a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx:309"}, "properties": {"repobilityId": "7fc70f4a801b4c9e", "scanner": "scanner-primary", "fingerprint": "b7a14e929954534a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0de39ae9f32948da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/merchant-logo.jsx:110"}, "properties": {"repobilityId": "4df8d2507d793db7", "scanner": "scanner-primary", "fingerprint": "0de39ae9f32948da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9f5c1eae24b70dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/expense-category-chart.jsx:565"}, "properties": {"repobilityId": "3e3c40a86fe99de3", "scanner": "scanner-primary", "fingerprint": "b9f5c1eae24b70dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f37ae3653236d584", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/add-transaction-drawer.jsx:477"}, "properties": {"repobilityId": "133f600f499d1193", "scanner": "scanner-primary", "fingerprint": "f37ae3653236d584", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b732e713233cc13", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transactions/components/add-transaction-drawer.jsx:143"}, "properties": {"repobilityId": "5afd5db4c5c4df80", "scanner": "scanner-primary", "fingerprint": "2b732e713233cc13", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee434ab8dd8e66c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transactions/components/receipt-upload-drawer.jsx:211"}, "properties": {"repobilityId": "0c102e628c13b40b", "scanner": "scanner-primary", "fingerprint": "ee434ab8dd8e66c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0fb5d46f7b3be6fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/pcg-select-dialog.jsx:104"}, "properties": {"repobilityId": "c594ad889149364a", "scanner": "scanner-primary", "fingerprint": "0fb5d46f7b3be6fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-373ea6433bbf1eb8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transactions/columns/transactionColumns.jsx:136"}, "properties": {"repobilityId": "0226aa8a9a04f77d", "scanner": "scanner-primary", "fingerprint": "373ea6433bbf1eb8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1d8494a2b93a8a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transactions/components/transactions/components/DesktopFilters.jsx:177"}, "properties": {"repobilityId": "9dd52a9d78b91de6", "scanner": "scanner-primary", "fingerprint": "c1d8494a2b93a8a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c1ce51835a72315", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/new/page.jsx:1965"}, "properties": {"repobilityId": "a855600166b85a0d", "scanner": "scanner-primary", "fingerprint": "9c1ce51835a72315", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b94ec84300066b31", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/standalone-signature-generator.js:7"}, "properties": {"repobilityId": "34b1a01045b5a441", "scanner": "scanner-primary", "fingerprint": "b94ec84300066b31", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-400ba1e6e074beaa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/template-presets.js:443"}, "properties": {"repobilityId": "23dd52841a483bc8", "scanner": "scanner-primary", "fingerprint": "400ba1e6e074beaa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f2ba1036f605a77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/utils/imageOptimizer.js:87"}, "properties": {"repobilityId": "b1dc1bee7bfe16c9", "scanner": "scanner-primary", "fingerprint": "1f2ba1036f605a77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc27d78c753db9b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/modals/TemplateSelector.jsx:84"}, "properties": {"repobilityId": "8ac606a93f63ec5d", "scanner": "scanner-primary", "fingerprint": "dc27d78c753db9b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3bb8519e2f2978d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/modals/SaveSignatureModal.jsx:642"}, "properties": {"repobilityId": "be96ee258ba819e4", "scanner": "scanner-primary", "fingerprint": "f3bb8519e2f2978d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ceef97bc103b2054", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/table/signature-table.jsx:396"}, "properties": {"repobilityId": "e8121652dd8f9dbd", "scanner": "scanner-primary", "fingerprint": "ceef97bc103b2054", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4d0799472aa1229", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/outils/signatures-mail/components/widgets/WidgetCanvas.jsx:180"}, "properties": {"repobilityId": "8b945d3b733e2a87", "scanner": "scanner-primary", "fingerprint": "f4d0799472aa1229", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-07e3a14cfb64db2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/widgets/WidgetPalette.jsx:60"}, "properties": {"repobilityId": "b3f8ee49c8886462", "scanner": "scanner-primary", "fingerprint": "07e3a14cfb64db2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e43ae652a6d9660", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx:585"}, "properties": {"repobilityId": "296621b172d775c3", "scanner": "scanner-primary", "fingerprint": "2e43ae652a6d9660", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-069d0f8c9db3828f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/SignatureTemplate.jsx:39"}, "properties": {"repobilityId": "d62e2e24e6f8664b", "scanner": "scanner-primary", "fingerprint": "069d0f8c9db3828f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31702c2c6ae75f3b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/preview/TabSignature.jsx:254"}, "properties": {"repobilityId": "c8ffe4c91b30ed54", "scanner": "scanner-primary", "fingerprint": "31702c2c6ae75f3b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1d656962f242473", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/TabSignature.jsx:428"}, "properties": {"repobilityId": "18357bc0a90907d8", "scanner": "scanner-primary", "fingerprint": "c1d656962f242473", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-619f140ab216ef05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/preview/SignatureEditor.jsx:55"}, "properties": {"repobilityId": "00bfa8f329efb982", "scanner": "scanner-primary", "fingerprint": "619f140ab216ef05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55a0db52738643ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/layout/sections/SocialNetworksSection.jsx:355"}, "properties": {"repobilityId": "4d6a80b9b4530bfc", "scanner": "scanner-primary", "fingerprint": "55a0db52738643ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1450c14b606591a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/layout/sections/ElementsOrderSection.jsx:112"}, "properties": {"repobilityId": "dbae4955b72cbe2f", "scanner": "scanner-primary", "fingerprint": "1450c14b606591a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-837d8afa7994a229", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/editor/typography/sections/TypographySection.jsx:224"}, "properties": {"repobilityId": "ec2424c1556bcb6c", "scanner": "scanner-primary", "fingerprint": "837d8afa7994a229", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e866bc03236ed096", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:133"}, "properties": {"repobilityId": "0dc0036e18d7c256", "scanner": "scanner-primary", "fingerprint": "e866bc03236ed096", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2b5550a2d3f0681e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:124"}, "properties": {"repobilityId": "66a03476ab0493f4", "scanner": "scanner-primary", "fingerprint": "2b5550a2d3f0681e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6519f2cce034588", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/signatures-mail/components/blocks/BlockSettings.jsx:1575"}, "properties": {"repobilityId": "51803320e1e7e73f", "scanner": "scanner-primary", "fingerprint": "c6519f2cce034588", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-801b08a91930cf1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/signatures-mail/hooks/useSignatureGenerator.js:57"}, "properties": {"repobilityId": "60c160e5a7b99911", "scanner": "scanner-primary", "fingerprint": "801b08a91930cf1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c29a8b6a22d208c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/page.jsx:215"}, "properties": {"repobilityId": "521b885d0b723f63", "scanner": "scanner-primary", "fingerprint": "c29a8b6a22d208c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eca692f46442697d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/month-details-drawer.jsx:95"}, "properties": {"repobilityId": "7f36592f2fd4183f", "scanner": "scanner-primary", "fingerprint": "eca692f46442697d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf09b7bf7062d4af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/scenario-selector.jsx:139"}, "properties": {"repobilityId": "2c513e48b6e7e1f8", "scanner": "scanner-primary", "fingerprint": "cf09b7bf7062d4af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c73af64857742a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/forecast-payments-card.jsx:991"}, "properties": {"repobilityId": "081147e9fa02de07", "scanner": "scanner-primary", "fingerprint": "2c73af64857742a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76e3b5ccb1a49dce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/manual-entries-list.jsx:102"}, "properties": {"repobilityId": "71e3f1ba49da1eda", "scanner": "scanner-primary", "fingerprint": "76e3b5ccb1a49dce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad4a00c75edf5bf0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/prevision/components/detected-recurrences-list.jsx:122"}, "properties": {"repobilityId": "9dad055eae0abfef", "scanner": "scanner-primary", "fingerprint": "ad4a00c75edf5bf0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bac063c2f601a18e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/page.jsx:502"}, "properties": {"repobilityId": "937ec4ba473bb400", "scanner": "scanner-primary", "fingerprint": "bac063c2f601a18e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92c6044bccd6c8d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/components/BoardMembersPopover.jsx:304"}, "properties": {"repobilityId": "3c887f3120990454", "scanner": "scanner-primary", "fingerprint": "92c6044bccd6c8d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8d51b510c45c39d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/page-old-backup.jsx:303"}, "properties": {"repobilityId": "f6b72396207bfab0", "scanner": "scanner-primary", "fingerprint": "d8d51b510c45c39d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd464ce78607f9cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/page.jsx:374"}, "properties": {"repobilityId": "ef326767113134c7", "scanner": "scanner-primary", "fingerprint": "bd464ce78607f9cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f47382cfcaa51e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/page.jsx:1405"}, "properties": {"repobilityId": "bb5bb2aa5f627cce", "scanner": "scanner-primary", "fingerprint": "8f47382cfcaa51e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e6c2e32e7fda4a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/components/TaskActivity.jsx:317"}, "properties": {"repobilityId": "aea31237538a8dce", "scanner": "scanner-primary", "fingerprint": "3e6c2e32e7fda4a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04cd54fca0cada03", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/components/ShareBoardDialog.jsx:239"}, "properties": {"repobilityId": "2b4ffebdbd6207b2", "scanner": "scanner-primary", "fingerprint": "04cd54fca0cada03", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06b11608dc173a39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskModal.jsx:1517"}, "properties": {"repobilityId": "87df7786668a2c13", "scanner": "scanner-primary", "fingerprint": "06b11608dc173a39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a0def0c99f94cc34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:690"}, "properties": {"repobilityId": "662be7ef77d95424", "scanner": "scanner-primary", "fingerprint": "a0def0c99f94cc34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2f821102eb5140c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:90"}, "properties": {"repobilityId": "6457f7de3d35801a", "scanner": "scanner-primary", "fingerprint": "d2f821102eb5140c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-410d3d1a0dd08197", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/TaskImageUpload.jsx:117"}, "properties": {"repobilityId": "cd3dc2d863c90f30", "scanner": "scanner-primary", "fingerprint": "410d3d1a0dd08197", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9456798ad955d056", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumn.jsx:75"}, "properties": {"repobilityId": "b1b064242b74b2eb", "scanner": "scanner-primary", "fingerprint": "9456798ad955d056", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4150129f6f92f156", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:317"}, "properties": {"repobilityId": "92e572f541678889", "scanner": "scanner-primary", "fingerprint": "4150129f6f92f156", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d50ab51872de89c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:461"}, "properties": {"repobilityId": "0c629201307c01d8", "scanner": "scanner-primary", "fingerprint": "6d50ab51872de89c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3264b4f1b25e7ec1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/ConvertToInvoiceModal.jsx:222"}, "properties": {"repobilityId": "46dc6a507be63b11", "scanner": "scanner-primary", "fingerprint": "3264b4f1b25e7ec1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b0e51d188cc64a2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:273"}, "properties": {"repobilityId": "ea5a0e7ed7d18bcc", "scanner": "scanner-primary", "fingerprint": "2b0e51d188cc64a2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4f722c883743b8ee", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:111"}, "properties": {"repobilityId": "669f12141669e1e4", "scanner": "scanner-primary", "fingerprint": "4f722c883743b8ee", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e898728c398af6c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:969"}, "properties": {"repobilityId": "6781f01bda5854fe", "scanner": "scanner-primary", "fingerprint": "e898728c398af6c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d939bbf82df25a9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:996"}, "properties": {"repobilityId": "a9e615afd7f24518", "scanner": "scanner-primary", "fingerprint": "2d939bbf82df25a9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-477600837fd06a29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/[id]/components/task-modal/TaskModalHeader.jsx:54"}, "properties": {"repobilityId": "9f8172cfcf8e1d2b", "scanner": "scanner-primary", "fingerprint": "477600837fd06a29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-688eb4ef7503a24f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/hooks/useKanbanBoard.js:20"}, "properties": {"repobilityId": "0b8dd25a0049f98b", "scanner": "scanner-primary", "fingerprint": "688eb4ef7503a24f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be6983d569cd52c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/[id]/hooks/useKanbanDnDSimple.js:94"}, "properties": {"repobilityId": "c172ae3db25469e3", "scanner": "scanner-primary", "fingerprint": "be6983d569cd52c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-832a936815757d79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/kanban/hooks/useKanbanBoardsTable.js:195"}, "properties": {"repobilityId": "4976445274658556", "scanner": "scanner-primary", "fingerprint": "832a936815757d79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90d6699a3ad3a80d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/kanban/hooks/useKanbanBoards.js:50"}, "properties": {"repobilityId": "ab8549c9509397bb", "scanner": "scanner-primary", "fingerprint": "90d6699a3ad3a80d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-409a6d2a93da2e83", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/auto-reminder-clients.jsx:144"}, "properties": {"repobilityId": "8f209cfe7bc6cbcb", "scanner": "scanner-primary", "fingerprint": "409a6d2a93da2e83", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd86db9ba69fa2aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/credit-note-mobile-fullscreen.jsx:64"}, "properties": {"repobilityId": "3051c6188a71bb29", "scanner": "scanner-primary", "fingerprint": "bd86db9ba69fa2aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8245613ee59b43e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/send-document-email-preview.jsx:150"}, "properties": {"repobilityId": "682f7be789b59da8", "scanner": "scanner-primary", "fingerprint": "8245613ee59b43e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98d6f927d9a83a4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/enhanced-invoice-form.jsx:191"}, "properties": {"repobilityId": "c877af8ced0f22fe", "scanner": "scanner-primary", "fingerprint": "98d6f927d9a83a4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa0b5707d1e18c65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/enhanced-invoice-form.jsx:321"}, "properties": {"repobilityId": "08a3b7d558fbb5bf", "scanner": "scanner-primary", "fingerprint": "aa0b5707d1e18c65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7d75e9df0aa94dc9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoice-sidebar.jsx:742"}, "properties": {"repobilityId": "747573b5415ef582", "scanner": "scanner-primary", "fingerprint": "7d75e9df0aa94dc9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0256a436fe4e7630", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/imported-invoice-sidebar.jsx:643"}, "properties": {"repobilityId": "4e1cc290a76d7d1d", "scanner": "scanner-primary", "fingerprint": "0256a436fe4e7630", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-05a9d7c6bd715703", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/modern-invoice-editor.jsx:657"}, "properties": {"repobilityId": "cfdc6a744ef7ac46", "scanner": "scanner-primary", "fingerprint": "05a9d7c6bd715703", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f27279e69372b3b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/auto-reminder-preview.jsx:112"}, "properties": {"repobilityId": "0e50bb59c218c12b", "scanner": "scanner-primary", "fingerprint": "f27279e69372b3b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8752bea619284ee0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoice-export-button.jsx:328"}, "properties": {"repobilityId": "9c41f34d89b14838", "scanner": "scanner-primary", "fingerprint": "8752bea619284ee0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a739d81978845adc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/send-document-email-form.jsx:152"}, "properties": {"repobilityId": "ffbe47c5df65c8ca", "scanner": "scanner-primary", "fingerprint": "a739d81978845adc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a7301ce96255844", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/credit-notes-table.jsx:297"}, "properties": {"repobilityId": "f7bfa149db9ba653", "scanner": "scanner-primary", "fingerprint": "7a7301ce96255844", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4acdccebd0ffcf4f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/__tests__/invoice-export.test.js:47"}, "properties": {"repobilityId": "b1b19c6093cddf7e", "scanner": "scanner-primary", "fingerprint": "4acdccebd0ffcf4f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20cd678f509185e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoices-form-sections/client-selector.jsx:773"}, "properties": {"repobilityId": "949263e83f0ffa86", "scanner": "scanner-primary", "fingerprint": "20cd678f509185e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6d5da7addc743cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx:1136"}, "properties": {"repobilityId": "aa5439f30589b0e0", "scanner": "scanner-primary", "fingerprint": "f6d5da7addc743cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5594b3d9e39e8568", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx:152"}, "properties": {"repobilityId": "15cbf8b652a837c2", "scanner": "scanner-primary", "fingerprint": "5594b3d9e39e8568", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-120adb91c4ce1c68", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures/hooks/use-invoice-table.js:348"}, "properties": {"repobilityId": "2bd32d0c49ccbf9c", "scanner": "scanner-primary", "fingerprint": "120adb91c4ce1c68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2b685ff3fcb02f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-revenue-pie-chart.jsx:304"}, "properties": {"repobilityId": "9198d03edd64a722", "scanner": "scanner-primary", "fingerprint": "c2b685ff3fcb02f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6de26f7f47926004", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-status-chart.jsx:195"}, "properties": {"repobilityId": "9ae0c7bb1c4a111e", "scanner": "scanner-primary", "fingerprint": "6de26f7f47926004", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b68b8ce72ae5cb6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-pcg-mapping.jsx:409"}, "properties": {"repobilityId": "b937847745391324", "scanner": "scanner-primary", "fingerprint": "9b68b8ce72ae5cb6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-598e804c60c65f57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-date-filter.jsx:97"}, "properties": {"repobilityId": "81ae269627d3aa3e", "scanner": "scanner-primary", "fingerprint": "598e804c60c65f57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db4a944ceb6ead79", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/analytiques/components/analytics-expense-chart.jsx:342"}, "properties": {"repobilityId": "6a77d47b067d9913", "scanner": "scanner-primary", "fingerprint": "db4a944ceb6ead79", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bf654e95ca9aa9f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/page.jsx:285"}, "properties": {"repobilityId": "d006388bb7aa84fd", "scanner": "scanner-primary", "fingerprint": "bf654e95ca9aa9f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd5d3026414dbcbb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/document-automations-modal.jsx:268"}, "properties": {"repobilityId": "aca99d6d7e267c5e", "scanner": "scanner-primary", "fingerprint": "bd5d3026414dbcbb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-776ce16770f42178", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/tag-selector.jsx:115"}, "properties": {"repobilityId": "2ee7b307c2ed15ca", "scanner": "scanner-primary", "fingerprint": "776ce16770f42178", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a18a51bbd8a4c89f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/DraggableTree.jsx:859"}, "properties": {"repobilityId": "37995e758ed76786", "scanner": "scanner-primary", "fingerprint": "a18a51bbd8a4c89f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f960132aab434de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/transfer-from-docs-modal.jsx:223"}, "properties": {"repobilityId": "7c00d500e3d4c6e4", "scanner": "scanner-primary", "fingerprint": "7f960132aab434de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-345c9bddbe901489", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/documents-partages/components/tag-manager.jsx:114"}, "properties": {"repobilityId": "823fdc5e8c9ed66c", "scanner": "scanner-primary", "fingerprint": "345c9bddbe901489", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-354fd9bcf2bee0c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/gmail-status-banner.jsx:48"}, "properties": {"repobilityId": "dd33a58ee6c393a2", "scanner": "scanner-primary", "fingerprint": "354fd9bcf2bee0c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79c1ac7dc9c96fd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/gmail-connection.jsx:161"}, "properties": {"repobilityId": "e380d6924ea38364", "scanner": "scanner-primary", "fingerprint": "79c1ac7dc9c96fd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-458a86061eb4c5d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/table.jsx:963"}, "properties": {"repobilityId": "e8d1811a338f2514", "scanner": "scanner-primary", "fingerprint": "458a86061eb4c5d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c8799f9d17d91eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/columns.jsx:384"}, "properties": {"repobilityId": "e267143875fabcc1", "scanner": "scanner-primary", "fingerprint": "6c8799f9d17d91eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-658eb8692e20611d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/detail-drawer.jsx:491"}, "properties": {"repobilityId": "df78012bc96b66d0", "scanner": "scanner-primary", "fingerprint": "658eb8692e20611d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9aca0d035ccede29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/factures-achat/components/upload-drawer.jsx:581"}, "properties": {"repobilityId": "fa31cb7d53daad7a", "scanner": "scanner-primary", "fingerprint": "9aca0d035ccede29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a5cd98798706768", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/import-purchase-order-modal.jsx:261"}, "properties": {"repobilityId": "0dd133a55c1da149", "scanner": "scanner-primary", "fingerprint": "1a5cd98798706768", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ff45f9569aad84b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/modern-purchase-order-editor.jsx:573"}, "properties": {"repobilityId": "3134491cb9a6d7b9", "scanner": "scanner-primary", "fingerprint": "ff45f9569aad84b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c068abddea25943f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/components/imported-purchase-order-sidebar.jsx:500"}, "properties": {"repobilityId": "77389b652d769599", "scanner": "scanner-primary", "fingerprint": "c068abddea25943f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-792697127416129f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/bons-commande/hooks/use-purchase-order-table.js:269"}, "properties": {"repobilityId": "83e99f2bd5eb0b3e", "scanner": "scanner-primary", "fingerprint": "792697127416129f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-66e670a2edb8403d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/utils/watermark.js:86"}, "properties": {"repobilityId": "a8de248491f45c32", "scanner": "scanner-primary", "fingerprint": "66e670a2edb8403d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd52adbba3c37868", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/transfer-detail-drawer.jsx:374"}, "properties": {"repobilityId": "1c6007b7859508d9", "scanner": "scanner-primary", "fingerprint": "cd52adbba3c37868", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ed955d43b14c332", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-new.jsx:328"}, "properties": {"repobilityId": "558edcfc43aa7dcb", "scanner": "scanner-primary", "fingerprint": "8ed955d43b14c332", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-61c1d7844b899fc2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-item.jsx:105"}, "properties": {"repobilityId": "ca0311e1e568a242", "scanner": "scanner-primary", "fingerprint": "61c1d7844b899fc2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e032f54dab05cb1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/outils/transferts-fichiers/components/transfer-table.jsx:237"}, "properties": {"repobilityId": "4897cdf4676cedbd", "scanner": "scanner-primary", "fingerprint": "e032f54dab05cb1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5aa1e1af24b2f5e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2Direct.js:51"}, "properties": {"repobilityId": "0253f388a9ecc288", "scanner": "scanner-primary", "fingerprint": "5aa1e1af24b2f5e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-efa5836b5ddd919b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2.js:51"}, "properties": {"repobilityId": "b0231b4fdcb8d97f", "scanner": "scanner-primary", "fingerprint": "efa5836b5ddd919b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a7c89339aa0b711c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/dashboard/outils/transferts-fichiers/hooks/useFileTransferR2Multipart.js:103"}, "properties": {"repobilityId": "b491d670446c7102", "scanner": "scanner-primary", "fingerprint": "a7c89339aa0b711c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-682dfbffdfdb041e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/AddPasskeyModal.jsx:54"}, "properties": {"repobilityId": "5343fd1ab6ef5105", "scanner": "scanner-primary", "fingerprint": "682dfbffdfdb041e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-deb356c0dc98ffcf", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/ChangePasswordModal.jsx:44"}, "properties": {"repobilityId": "6e9c99f90591960b", "scanner": "scanner-primary", "fingerprint": "deb356c0dc98ffcf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-acb27ac2c207e618", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/dashboard/account/components/ChangeEmailModal.jsx:40"}, "properties": {"repobilityId": "18c1491e8df0563a", "scanner": "scanner-primary", "fingerprint": "acb27ac2c207e618", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bdf8306a0300016a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/table-product.jsx:223"}, "properties": {"repobilityId": "ca985a950360d7fa", "scanner": "scanner-primary", "fingerprint": "bdf8306a0300016a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca9b92da2d76bfa9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/product-custom-fields-manager.jsx:339"}, "properties": {"repobilityId": "2cbea10d541b06ce", "scanner": "scanner-primary", "fingerprint": "ca9b92da2d76bfa9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d17323fa4fa35df7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/import-steps/import-step-mapping.jsx:85"}, "properties": {"repobilityId": "ee75879aab41cca4", "scanner": "scanner-primary", "fingerprint": "d17323fa4fa35df7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d6b063571cf0f23", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/catalogues/components/import-steps/import-step-upload.jsx:95"}, "properties": {"repobilityId": "5046fdbdcbf9ba75", "scanner": "scanner-primary", "fingerprint": "3d6b063571cf0f23", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61c63f5ec16c7b82", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/event-item.jsx:169"}, "properties": {"repobilityId": "150b29afe195c703", "scanner": "scanner-primary", "fingerprint": "61c63f5ec16c7b82", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3041bab364ae8a90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/color-legend.jsx:142"}, "properties": {"repobilityId": "37af682d21559741", "scanner": "scanner-primary", "fingerprint": "3041bab364ae8a90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ac2dbacbf648c100", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/event-dialog.jsx:739"}, "properties": {"repobilityId": "b21842252ca2994c", "scanner": "scanner-primary", "fingerprint": "ac2dbacbf648c100", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-807e7b3359511587", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard/calendar/components/calendar-connection-card.jsx:196"}, "properties": {"repobilityId": "91e8b2630080ecef", "scanner": "scanner-primary", "fingerprint": "807e7b3359511587", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7b522e6f082e07e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/page.jsx:1117"}, "properties": {"repobilityId": "4dec5878eadf44d4", "scanner": "scanner-primary", "fingerprint": "d7b522e6f082e07e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c2c141360f51b3e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/components/preview-modal.jsx:55"}, "properties": {"repobilityId": "dcadb61975d2fed9", "scanner": "scanner-primary", "fingerprint": "8c2c141360f51b3e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98efc7bb21a45769", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/transfer/[shareLink]/components/file-preview-drawer.jsx:283"}, "properties": {"repobilityId": "589232b27bce4843", "scanner": "scanner-primary", "fingerprint": "98efc7bb21a45769", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dba89ef54c935296", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/onboarding/success/page.jsx:343"}, "properties": {"repobilityId": "6cf195646b766d74", "scanner": "scanner-primary", "fingerprint": "dba89ef54c935296", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea61c59d1e917acc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/accept-invitation/[invitationId]/page.jsx:64"}, "properties": {"repobilityId": "88da27163d3ea889", "scanner": "scanner-primary", "fingerprint": "ea61c59d1e917acc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a71fdc86f1f5dfd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/public/kanban/[token]/page.jsx:1104"}, "properties": {"repobilityId": "487027f0abce8751", "scanner": "scanner-primary", "fingerprint": "6a71fdc86f1f5dfd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b42fe6c92570ae63", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/public/kanban/[token]/page.jsx:600"}, "properties": {"repobilityId": "2039d1c556a41d82", "scanner": "scanner-primary", "fingerprint": "b42fe6c92570ae63", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78593cc9f0b0b707", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/public/kanban/[token]/page.jsx:979"}, "properties": {"repobilityId": "f44c7edbbc0cb825", "scanner": "scanner-primary", "fingerprint": "78593cc9f0b0b707", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-5cd46cd305b331d1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/(main)/page.jsx:57"}, "properties": {"repobilityId": "932a84a90b218e91", "scanner": "scanner-primary", "fingerprint": "5cd46cd305b331d1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3f8ffb37916f3889", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/(main)/guide-facturation-electronique/guide-content.jsx:85"}, "properties": {"repobilityId": "3ea08e81e1847dd8", "scanner": "scanner-primary", "fingerprint": "3f8ffb37916f3889", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69bf10b6f6378125", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/quote/[id]/page.jsx:18"}, "properties": {"repobilityId": "94d54a8f42c49c5a", "scanner": "scanner-primary", "fingerprint": "69bf10b6f6378125", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bdbc8c63456a61c8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/purchase-order/[id]/page.jsx:18"}, "properties": {"repobilityId": "06de12ab1b864e37", "scanner": "scanner-primary", "fingerprint": "bdbc8c63456a61c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d9afadde15cbdd2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/invoice/[id]/page.jsx:19"}, "properties": {"repobilityId": "db0851adeceaf681", "scanner": "scanner-primary", "fingerprint": "5d9afadde15cbdd2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bdc0558e429ea821", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/invoice/preview/page.jsx:34"}, "properties": {"repobilityId": "ead06182d089fe80", "scanner": "scanner-primary", "fingerprint": "bdc0558e429ea821", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c75c9817b7617097", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/pdf-generator/credit-note/[id]/page.jsx:19"}, "properties": {"repobilityId": "cedc5855d5fb95ee", "scanner": "scanner-primary", "fingerprint": "c75c9817b7617097", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3f3532617c7ec74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/middleware/subscription.js:83"}, "properties": {"repobilityId": "6f159198344806d8", "scanner": "scanner-primary", "fingerprint": "a3f3532617c7ec74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d8772691fe38fc06", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/generatePDF.js:15"}, "properties": {"repobilityId": "08a5742c86d311f9", "scanner": "scanner-primary", "fingerprint": "d8772691fe38fc06", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f6c7f340c6ff7a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/facturx-generator.js:525"}, "properties": {"repobilityId": "02f1a881b4cc1eae", "scanner": "scanner-primary", "fingerprint": "1f6c7f340c6ff7a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ec1e841a7ea0618", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/kanbanPerf.js:39"}, "properties": {"repobilityId": "ed5abd902764a2be", "scanner": "scanner-primary", "fingerprint": "7ec1e841a7ea0618", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0963daab22f5ec5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/clearApolloCache.js:11"}, "properties": {"repobilityId": "2c8405e503cdb603", "scanner": "scanner-primary", "fingerprint": "f0963daab22f5ec5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa882514b1ea4722", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/metaCapiServer.js:64"}, "properties": {"repobilityId": "5903d4b14137a2cb", "scanner": "scanner-primary", "fingerprint": "aa882514b1ea4722", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f79b8956fbc46aa8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/toastDebouncer.js:29"}, "properties": {"repobilityId": "78337bf472e35665", "scanner": "scanner-primary", "fingerprint": "f79b8956fbc46aa8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b27e4c46775a783", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/team-switcher.jsx:310"}, "properties": {"repobilityId": "90a2575a065ef14e", "scanner": "scanner-primary", "fingerprint": "1b27e4c46775a783", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-efd1bff47434a9bf", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/team-switcher.jsx:908"}, "properties": {"repobilityId": "5a5dc430b7bc93fc", "scanner": "scanner-primary", "fingerprint": "efd1bff47434a9bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c6f68f5fba477c9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/team-switcher.jsx:236"}, "properties": {"repobilityId": "c6202ff97219767c", "scanner": "scanner-primary", "fingerprint": "c6f68f5fba477c9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d45781ffa8c152b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/organization-switcher-header.jsx:298"}, "properties": {"repobilityId": "0efb6e16c58379f8", "scanner": "scanner-primary", "fingerprint": "d45781ffa8c152b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-835182da137a0d53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/nav-user.jsx:132"}, "properties": {"repobilityId": "fbe744ebd7501b83", "scanner": "scanner-primary", "fingerprint": "835182da137a0d53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8680cf56ae987cf5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/nav-main.jsx:626"}, "properties": {"repobilityId": "d7d238f12c5ea726", "scanner": "scanner-primary", "fingerprint": "8680cf56ae987cf5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6a55d40c2922c1a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/search-command.jsx:435"}, "properties": {"repobilityId": "3752fd8175eef59f", "scanner": "scanner-primary", "fingerprint": "b6a55d40c2922c1a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b26e17274cc0b084", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/stripe-connect-url-handler.jsx:28"}, "properties": {"repobilityId": "3fd4251178e4764d", "scanner": "scanner-primary", "fingerprint": "b26e17274cc0b084", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f940147c166f6645", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pro-subscription-overlay-handler.jsx:18"}, "properties": {"repobilityId": "47a531ed080f380a", "scanner": "scanner-primary", "fingerprint": "f940147c166f6645", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bf6cb8d042d0ff71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/FloatingTimer.jsx:151"}, "properties": {"repobilityId": "d056bca88d2df984", "scanner": "scanner-primary", "fingerprint": "bf6cb8d042d0ff71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b20e0031c24f20c8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/org-activation-handler.jsx:28"}, "properties": {"repobilityId": "1efe6976f0dffd06", "scanner": "scanner-primary", "fingerprint": "b20e0031c24f20c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d207f69297293b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/data-table.jsx:269"}, "properties": {"repobilityId": "7236e98bd506b0f2", "scanner": "scanner-primary", "fingerprint": "5d207f69297293b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33726a42ab487bfe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/bottom-nav-bar.jsx:509"}, "properties": {"repobilityId": "7f6e2e080efe1354", "scanner": "scanner-primary", "fingerprint": "33726a42ab487bfe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de545c20debd8a6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TagsInput.jsx:259"}, "properties": {"repobilityId": "64c0bc139e321deb", "scanner": "scanner-primary", "fingerprint": "de545c20debd8a6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-143188361f61ed17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/invite-member-modal.jsx:437"}, "properties": {"repobilityId": "70dfe21031fcfc9c", "scanner": "scanner-primary", "fingerprint": "143188361f61ed17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e265f697c827f7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/resource-not-found.jsx:23"}, "properties": {"repobilityId": "bce9214a41c91d4e", "scanner": "scanner-primary", "fingerprint": "9e265f697c827f7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45c529bad9030aa1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/comp-333.jsx:43"}, "properties": {"repobilityId": "481d65277e7a6381", "scanner": "scanner-primary", "fingerprint": "45c529bad9030aa1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-666c2cacb704ce5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/create-workspace/workspace-preview.jsx:120"}, "properties": {"repobilityId": "ccfa2e526147e932", "scanner": "scanner-primary", "fingerprint": "666c2cacb704ce5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59cd1073639e421d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/create-workspace/workspace-form.jsx:407"}, "properties": {"repobilityId": "3236c9d941e5ec18", "scanner": "scanner-primary", "fingerprint": "59cd1073639e421d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3680acf8b6a65306", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/espaces-section.jsx:775"}, "properties": {"repobilityId": "410cb02119b2336f", "scanner": "scanner-primary", "fingerprint": "3680acf8b6a65306", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27b5bfecbdcc4473", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/espaces-section.jsx:404"}, "properties": {"repobilityId": "318578f38c0b9245", "scanner": "scanner-primary", "fingerprint": "27b5bfecbdcc4473", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-acbc347aea2d03d4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/settings/security-section.jsx:254"}, "properties": {"repobilityId": "44f81e43d78e4b49", "scanner": "scanner-primary", "fingerprint": "acbc347aea2d03d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dbfd1097a7edfe87", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/security-section.jsx:112"}, "properties": {"repobilityId": "2018ba128e6e2509", "scanner": "scanner-primary", "fingerprint": "dbfd1097a7edfe87", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ee466ee8f301afe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/applications-section.jsx:354"}, "properties": {"repobilityId": "b450824eebdc4104", "scanner": "scanner-primary", "fingerprint": "0ee466ee8f301afe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4ce640dc1a12652", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/notifications-section.jsx:602"}, "properties": {"repobilityId": "274385cb7f255b2f", "scanner": "scanner-primary", "fingerprint": "e4ce640dc1a12652", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e6c39bbcc736951", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/notifications-section.jsx:249"}, "properties": {"repobilityId": "cd39ccdee12e1ca5", "scanner": "scanner-primary", "fingerprint": "2e6c39bbcc736951", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-05c6dadcf4017536", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/bank-accounts-section.jsx:586"}, "properties": {"repobilityId": "2d764fefaf88adf1", "scanner": "scanner-primary", "fingerprint": "05c6dadcf4017536", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-086e88cbafee1407", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/facturation-section.jsx:676"}, "properties": {"repobilityId": "6a9b3ffc633a940a", "scanner": "scanner-primary", "fingerprint": "086e88cbafee1407", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c657173f22b8a578", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/settings/facturation-section.jsx:73"}, "properties": {"repobilityId": "3a2edc6116dcd4a5", "scanner": "scanner-primary", "fingerprint": "c657173f22b8a578", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b393f1489494d24b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/mobile/mobile-settings-navigation.jsx:105"}, "properties": {"repobilityId": "a6b7ee1889a050da", "scanner": "scanner-primary", "fingerprint": "b393f1489494d24b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1069e2e1b665345", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/blog/blog-article-layout.tsx:129"}, "properties": {"repobilityId": "63b615e22bcf5381", "scanner": "scanner-primary", "fingerprint": "d1069e2e1b665345", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b14199e218b137ca", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.jsx:100"}, "properties": {"repobilityId": "06741639d6020e8c", "scanner": "scanner-primary", "fingerprint": "b14199e218b137ca", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a76743a098ad0869", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/country-search-select.jsx:61"}, "properties": {"repobilityId": "e16b4d16eb8479b0", "scanner": "scanner-primary", "fingerprint": "a76743a098ad0869", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-caa6165af51d5c40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/mention-input.jsx:117"}, "properties": {"repobilityId": "ee46597b7cbe18d3", "scanner": "scanner-primary", "fingerprint": "caa6165af51d5c40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5cb5b5b75946c39a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/mention-input.jsx:443"}, "properties": {"repobilityId": "827f50af73463b9f", "scanner": "scanner-primary", "fingerprint": "5cb5b5b75946c39a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7b87be5aeabf0e90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/banking/BankBalanceCard.jsx:571"}, "properties": {"repobilityId": "2d9174a4f49d7174", "scanner": "scanner-primary", "fingerprint": "7b87be5aeabf0e90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-10e7b0df2b6266e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/banking/RecentTransactionsCard.jsx:150"}, "properties": {"repobilityId": "157ceb5899fc81c0", "scanner": "scanner-primary", "fingerprint": "10e7b0df2b6266e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d75a06ffef235c3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/cookies/MarketingPixels.jsx:53"}, "properties": {"repobilityId": "3ad43b4044a98b4e", "scanner": "scanner-primary", "fingerprint": "9d75a06ffef235c3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7d049323d953c558", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPDFDownloaderWithFacturX.jsx:53"}, "properties": {"repobilityId": "c3d4647e1cce8ed8", "scanner": "scanner-primary", "fingerprint": "7d049323d953c558", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c84214c0dee80eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPreviewPDF.jsx:150"}, "properties": {"repobilityId": "c76d6a40aa8c8659", "scanner": "scanner-primary", "fingerprint": "8c84214c0dee80eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e8db68c4c397f19", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/pdf/UniversalPDFDownloader.jsx:30"}, "properties": {"repobilityId": "917cff8cbe645daf", "scanner": "scanner-primary", "fingerprint": "5e8db68c4c397f19", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b4abfcde3966cba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/stripe/StripeConnectOnboarding.jsx:42"}, "properties": {"repobilityId": "3be95b6c9921ee73", "scanner": "scanner-primary", "fingerprint": "6b4abfcde3966cba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-94ac64abb8e40d5c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/seo-metadata.jsx:91"}, "properties": {"repobilityId": "24aa0379509dfd46", "scanner": "scanner-primary", "fingerprint": "94ac64abb8e40d5c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-b8fdb367c6c129df", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/seo/seo-head.jsx:119"}, "properties": {"repobilityId": "58f0596e0271893d", "scanner": "scanner-primary", "fingerprint": "b8fdb367c6c129df", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-71fa2675421ec6ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-plugins.js:43"}, "properties": {"repobilityId": "af5a7feb7bdf627b", "scanner": "scanner-primary", "fingerprint": "71fa2675421ec6ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1c5204d1cb4b50d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/auth-utils.js:30"}, "properties": {"repobilityId": "ce9d89c5df842c8c", "scanner": "scanner-primary", "fingerprint": "c1c5204d1cb4b50d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8f32af65ca8fba73", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-utils.js:26"}, "properties": {"repobilityId": "e3617b079824b1cc", "scanner": "scanner-primary", "fingerprint": "8f32af65ca8fba73", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb224e7e40dc5d7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/apolloClient.js:133"}, "properties": {"repobilityId": "6f6923a4f8c98a8b", "scanner": "scanner-primary", "fingerprint": "fb224e7e40dc5d7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6a9ef0d183abb23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth.js:99"}, "properties": {"repobilityId": "11032c1c1ae3d1cf", "scanner": "scanner-primary", "fingerprint": "c6a9ef0d183abb23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cdfb689157588c77", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/org-creation.js:91"}, "properties": {"repobilityId": "d73bacf88639c540", "scanner": "scanner-primary", "fingerprint": "cdfb689157588c77", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ffa7ecc134276aa9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/organization-client.js:22"}, "properties": {"repobilityId": "a6cbfd3b34207ae1", "scanner": "scanner-primary", "fingerprint": "ffa7ecc134276aa9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9159fc6f54d7987c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cache-utils.js:78"}, "properties": {"repobilityId": "c8b7abd60b778a8c", "scanner": "scanner-primary", "fingerprint": "9159fc6f54d7987c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e721d8966b42a05", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/mongodb.js:94"}, "properties": {"repobilityId": "c55227fc47d9eb20", "scanner": "scanner-primary", "fingerprint": "7e721d8966b42a05", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45bb7a011f5a2db2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cache-validation.js:256"}, "properties": {"repobilityId": "fd5faae29639710e", "scanner": "scanner-primary", "fingerprint": "45bb7a011f5a2db2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b8d115ea5581342", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth-hooks.js:74"}, "properties": {"repobilityId": "f2d04af6cd3c6453", "scanner": "scanner-primary", "fingerprint": "7b8d115ea5581342", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0fffc2394ca75973", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/upload/cloudflare-r2-upload.js:92"}, "properties": {"repobilityId": "bae647d70c68f9bf", "scanner": "scanner-primary", "fingerprint": "0fffc2394ca75973", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f8e4eb6e0a23ee1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth/user-sync.js:19"}, "properties": {"repobilityId": "eaad8c526a4934c7", "scanner": "scanner-primary", "fingerprint": "7f8e4eb6e0a23ee1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5858dc03c252d3dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth/api.js:14"}, "properties": {"repobilityId": "9033ea28e4ddfd22", "scanner": "scanner-primary", "fingerprint": "5858dc03c252d3dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0432ae83cc129921", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/graphql/purchaseOrderQueries.js:840"}, "properties": {"repobilityId": "8e27d647158acafe", "scanner": "scanner-primary", "fingerprint": "0432ae83cc129921", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f1b8868494aa105", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/use-signature-data.jsx:747"}, "properties": {"repobilityId": "a11a5b9e1c3b76e5", "scanner": "scanner-primary", "fingerprint": "0f1b8868494aa105", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eeb95aae4998a8c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useSeatBilling.js:62"}, "properties": {"repobilityId": "624b4288beabee42", "scanner": "scanner-primary", "fingerprint": "eeb95aae4998a8c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a83c69a0a0a4ee4a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useDashboardLayoutSimple.js:121"}, "properties": {"repobilityId": "cb5ddbec6df44a40", "scanner": "scanner-primary", "fingerprint": "a83c69a0a0a4ee4a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-303fb2268bc0fde9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useOrganizationChange.js:31"}, "properties": {"repobilityId": "c0077ddccc3fe2de", "scanner": "scanner-primary", "fingerprint": "303fb2268bc0fde9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4e036bc356b7edc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useStripeConnect.js:41"}, "properties": {"repobilityId": "417aec78b56b41f6", "scanner": "scanner-primary", "fingerprint": "e4e036bc356b7edc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15a10ee921815611", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useExpenses.js:293"}, "properties": {"repobilityId": "44ca23661a0ca78e", "scanner": "scanner-primary", "fingerprint": "15a10ee921815611", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee2d749527560ac4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/hooks/useOrganizationInvitations.js:89"}, "properties": {"repobilityId": "dbc839a842d07eff", "scanner": "scanner-primary", "fingerprint": "ee2d749527560ac4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-944fad804f7b1669", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/cloudflareIconUploadService.js:51"}, "properties": {"repobilityId": "e5de7d1acc855e87", "scanner": "scanner-primary", "fingerprint": "944fad804f7b1669", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-08e948dd20d24a19", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/seatSyncService.js:101"}, "properties": {"repobilityId": "46b85966aed0baa5", "scanner": "scanner-primary", "fingerprint": "08e948dd20d24a19", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2af13e0886fa90f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/global-teardown.ts:73"}, "properties": {"repobilityId": "dd8d374e880f9ae4", "scanner": "scanner-primary", "fingerprint": "b2af13e0886fa90f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a83a9d8fff6c2334", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/auth.setup.js:48"}, "properties": {"repobilityId": "e8f109aabbd0cc5d", "scanner": "scanner-primary", "fingerprint": "a83a9d8fff6c2334", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7fbb235666e6c7d8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/global-setup.ts:77"}, "properties": {"repobilityId": "47b4f7ec079f9271", "scanner": "scanner-primary", "fingerprint": "7fbb235666e6c7d8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1e61b78269ede0db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/a11y/public-a11y.spec.js:42"}, "properties": {"repobilityId": "20aaad1d04fbb18c", "scanner": "scanner-primary", "fingerprint": "1e61b78269ede0db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9696cd439414bd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/a11y/dashboard-a11y.spec.js:46"}, "properties": {"repobilityId": "8c9c82200a9f19e9", "scanner": "scanner-primary", "fingerprint": "f9696cd439414bd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-df4c302599c92ce0", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in __tests__/lib/validation.test.js:188"}, "properties": {"repobilityId": "0404874b3d323bf1", "scanner": "scanner-primary", "fingerprint": "df4c302599c92ce0", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "__tests__/lib/validation.test.js"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-faeada54dad287ad", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in __tests__/lib/validation.test.js:190"}, "properties": {"repobilityId": "cb62ba9b7946b8dd", "scanner": "scanner-primary", "fingerprint": "faeada54dad287ad", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "__tests__/lib/validation.test.js"}, "region": {"startLine": 190}}}]}, {"ruleId": "scanner-839e4f59232baeae", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/publish-articles.js:4"}, "properties": {"repobilityId": "e5b45f22d728d317", "scanner": "scanner-primary", "fingerprint": "839e4f59232baeae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/publish-articles.js"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-dba2792be47d9de6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/layout.jsx:113"}, "properties": {"repobilityId": "06c4772371dd7985", "scanner": "scanner-primary", "fingerprint": "dba2792be47d9de6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/layout.jsx"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-75ac40b214dd6d13", "level": "error", "message": {"text": "Possible secret in app/api/test-email/route.js"}, "properties": {"repobilityId": "dd435ed4b36c7742", "scanner": "scanner-primary", "fingerprint": "75ac40b214dd6d13", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/api/test-email/route.js"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-4a21c651e5d50e77", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in app/dashboard/dashboard-client-layout.jsx:124"}, "properties": {"repobilityId": "45c6e92b50fcfdb9", "scanner": "scanner-primary", "fingerprint": "4a21c651e5d50e77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/dashboard-client-layout.jsx"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-419d4b3222ab1783", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/clients/[id]/components/client-activity-tab.jsx:415"}, "properties": {"repobilityId": "7f07b0a94d9bef70", "scanner": "scanner-primary", "fingerprint": "419d4b3222ab1783", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/clients/[id]/components/client-activity-tab.jsx"}, "region": {"startLine": 415}}}]}, {"ruleId": "scanner-5bb6e5e12dc72258", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/clients/[id]/components/client-notes-tab.jsx:688"}, "properties": {"repobilityId": "e45bd8e5c52247f1", "scanner": "scanner-primary", "fingerprint": "5bb6e5e12dc72258", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/clients/[id]/components/client-notes-tab.jsx"}, "region": {"startLine": 688}}}]}, {"ruleId": "scanner-db4f3279b99e9cf2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/clients/[id]/components/client-notes-tab.jsx:234"}, "properties": {"repobilityId": "905443d4fbbdc5e1", "scanner": "scanner-primary", "fingerprint": "db4f3279b99e9cf2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/clients/[id]/components/client-notes-tab.jsx"}, "region": {"startLine": 234}}}]}, {"ruleId": "scanner-31618b07b651caa1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx:1275"}, "properties": {"repobilityId": "042d21221fd2cca3", "scanner": "scanner-primary", "fingerprint": "31618b07b651caa1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx"}, "region": {"startLine": 1275}}}]}, {"ruleId": "scanner-8551f263cb637e5d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/utils/html-generator.js:350"}, "properties": {"repobilityId": "00a676b959b5bcb7", "scanner": "scanner-primary", "fingerprint": "8551f263cb637e5d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/signatures-mail/utils/html-generator.js"}, "region": {"startLine": 350}}}]}, {"ruleId": "scanner-a0c0d9e520ff4666", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx:585"}, "properties": {"repobilityId": "f57fb29131c33a15", "scanner": "scanner-primary", "fingerprint": "a0c0d9e520ff4666", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx"}, "region": {"startLine": 585}}}]}, {"ruleId": "scanner-8607550b6e98f90c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx:459"}, "properties": {"repobilityId": "293e9aeb7e14f311", "scanner": "scanner-primary", "fingerprint": "8607550b6e98f90c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/signatures-mail/components/preview/signature-preview-modal.jsx"}, "region": {"startLine": 459}}}]}, {"ruleId": "scanner-ce5cb10a2cd234fb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/signatures-mail/hooks/useSignatureGenerator.js:40"}, "properties": {"repobilityId": "ad4d3f3ce8252dcb", "scanner": "scanner-primary", "fingerprint": "ce5cb10a2cd234fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/signatures-mail/hooks/useSignatureGenerator.js"}, "region": {"startLine": 40}}}]}, {"ruleId": "scanner-0a78dc057f2a26df", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:90"}, "properties": {"repobilityId": "6046a31913dbe7d7", "scanner": "scanner-primary", "fingerprint": "0a78dc057f2a26df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/kanban/[id]/components/TaskCard.jsx"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-95e65cbffdf6c566", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx:461"}, "properties": {"repobilityId": "b49a0b625ae44762", "scanner": "scanner-primary", "fingerprint": "95e65cbffdf6c566", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/kanban/[id]/components/KanbanColumnSimple.jsx"}, "region": {"startLine": 461}}}]}, {"ruleId": "scanner-f2b8f38e4b7a6926", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:111"}, "properties": {"repobilityId": "57e17e92be251edb", "scanner": "scanner-primary", "fingerprint": "f2b8f38e4b7a6926", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-cb1ada345531ff7b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx:996"}, "properties": {"repobilityId": "6b53213224e79ac1", "scanner": "scanner-primary", "fingerprint": "cb1ada345531ff7b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx"}, "region": {"startLine": 996}}}]}, {"ruleId": "scanner-2275a4fc546b4017", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/dashboard/outils/kanban/[id]/components/task-modal/DescriptionEditor.jsx:107"}, "properties": {"repobilityId": "f7e62a9e8c53462a", "scanner": "scanner-primary", "fingerprint": "2275a4fc546b4017", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/dashboard/outils/kanban/[id]/components/task-modal/DescriptionEditor.jsx"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-0d1a67f93ada4457", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app/transfer/[shareLink]/components/pdf-preview.jsx:38"}, "properties": {"repobilityId": "134482fee39ef91c", "scanner": "scanner-primary", "fingerprint": "0d1a67f93ada4457", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/transfer/[shareLink]/components/pdf-preview.jsx"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-b7fcea15099ff157", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/public/kanban/[token]/page.jsx:979"}, "properties": {"repobilityId": "aab663bad6fc49ee", "scanner": "scanner-primary", "fingerprint": "b7fcea15099ff157", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/public/kanban/[token]/page.jsx"}, "region": {"startLine": 979}}}]}, {"ruleId": "scanner-d23d1574bab129d1", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/(main)/page.jsx:57"}, "properties": {"repobilityId": "8cee05e3721a8967", "scanner": "scanner-primary", "fingerprint": "d23d1574bab129d1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/(main)/page.jsx"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-b5ececa012b960a2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/utils/kanbanHelpers.jsx:87"}, "properties": {"repobilityId": "3421893b1db89c3b", "scanner": "scanner-primary", "fingerprint": "b5ececa012b960a2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/kanbanHelpers.jsx"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-ef36c210d90468bd", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in src/utils/product-import.js:178"}, "properties": {"repobilityId": "37767eb0ace750cc", "scanner": "scanner-primary", "fingerprint": "ef36c210d90468bd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/product-import.js"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-98fa57f11a1673b6", "level": "error", "message": {"text": "Possible secret in src/components/ErrorMessage.jsx"}, "properties": {"repobilityId": "81e1b600fd91f739", "scanner": "scanner-primary", "fingerprint": "98fa57f11a1673b6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ErrorMessage.jsx"}, "region": {"startLine": 231}}}]}, {"ruleId": "scanner-98fa57f11a1673b6", "level": "error", "message": {"text": "Possible secret in src/components/ErrorMessage.jsx"}, "properties": {"repobilityId": "81e1b600fd91f739", "scanner": "scanner-primary", "fingerprint": "98fa57f11a1673b6", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ErrorMessage.jsx"}, "region": {"startLine": 232}}}]}, {"ruleId": "scanner-9e9ff1541775a969", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.jsx:100"}, "properties": {"repobilityId": "b0b8211549be2e15", "scanner": "scanner-primary", "fingerprint": "9e9ff1541775a969", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.jsx"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-9a985b207b146fe5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/image-drop-zone.jsx:209"}, "properties": {"repobilityId": "d67a28e4a5852697", "scanner": "scanner-primary", "fingerprint": "9a985b207b146fe5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/image-drop-zone.jsx"}, "region": {"startLine": 209}}}]}, {"ruleId": "scanner-3215674ef7c818f8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/mention-input.jsx:443"}, "properties": {"repobilityId": "22e6615391ef2b0e", "scanner": "scanner-primary", "fingerprint": "3215674ef7c818f8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/mention-input.jsx"}, "region": {"startLine": 443}}}]}, {"ruleId": "scanner-e9d58152480dad32", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/mention-input.jsx:170"}, "properties": {"repobilityId": "af91889f1492e172", "scanner": "scanner-primary", "fingerprint": "e9d58152480dad32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/mention-input.jsx"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-4e845a7daf10b91b", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/components/ui/multiselect.jsx:222"}, "properties": {"repobilityId": "07a5c7242c3afb9c", "scanner": "scanner-primary", "fingerprint": "4e845a7daf10b91b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/multiselect.jsx"}, "region": {"startLine": 222}}}]}, {"ruleId": "scanner-a6d819e1abe804a7", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/components/ui/multiple-selector.tsx:329"}, "properties": {"repobilityId": "39ad46cb04d58b30", "scanner": "scanner-primary", "fingerprint": "a6d819e1abe804a7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/multiple-selector.tsx"}, "region": {"startLine": 329}}}]}, {"ruleId": "scanner-cbd606f25b51721b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/cookies/MarketingPixels.jsx:53"}, "properties": {"repobilityId": "f5dc5d44ccfdd964", "scanner": "scanner-primary", "fingerprint": "cbd606f25b51721b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/cookies/MarketingPixels.jsx"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-8f277068365facb9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/seo-metadata.jsx:91"}, "properties": {"repobilityId": "beca9b2452d09824", "scanner": "scanner-primary", "fingerprint": "8f277068365facb9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/seo/seo-metadata.jsx"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-a76568dbfc61a031", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/seo/seo-head.jsx:119"}, "properties": {"repobilityId": "23601f1a3594eb15", "scanner": "scanner-primary", "fingerprint": "a76568dbfc61a031", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/seo/seo-head.jsx"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-b20d3538ae3babe9", "level": "error", "message": {"text": "Possible secret in e2e/seed/test-data.ts"}, "properties": {"repobilityId": "909dc1ea90f96191", "scanner": "scanner-primary", "fingerprint": "b20d3538ae3babe9", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "e2e/seed/test-data.ts"}, "region": {"startLine": 28}}}]}, {"ruleId": "scanner-a155558fba0c6e94", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "1844c62e0fa5ebda", "scanner": "scanner-primary", "fingerprint": "a155558fba0c6e94", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/publish-blog-articles.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-a155558fba0c6e94", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "44bfad8a43bfe454", "scanner": "scanner-primary", "fingerprint": "a155558fba0c6e94", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/publish-blog-articles.yml"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-a155558fba0c6e94", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e3e7cc28e367a013", "scanner": "scanner-primary", "fingerprint": "a155558fba0c6e94", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/publish-blog-articles.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-7ada1547d768fea0", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "6cf456f431587e25", "scanner": "scanner-primary", "fingerprint": "7ada1547d768fea0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/publish-blog-articles.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "b86179956da3a4a8", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-388c38eab01eaf7c", "level": "note", "message": {"text": "Very large file: app/dashboard/page.jsx (1470 lines)"}, "properties": {"repobilityId": "5197be16ec67c432", "scanner": "scanner-primary", "fingerprint": "388c38eab01eaf7c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ce159b406371925", "level": "note", "message": {"text": "Very large file: app/dashboard/clients/components/table.jsx (1766 lines)"}, "properties": {"repobilityId": "020d59306bd3f5f1", "scanner": "scanner-primary", "fingerprint": "4ce159b406371925", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f4f50f00bd29cfb9", "level": "note", "message": {"text": "Very large file: app/dashboard/clients/components/clients-modal.jsx (2380 lines)"}, "properties": {"repobilityId": "cfa58e079179f491", "scanner": "scanner-primary", "fingerprint": "f4f50f00bd29cfb9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-858ab3e08df78c97", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/devis/components/quote-table.jsx (1274 lines)"}, "properties": {"repobilityId": "21fef1bdaa77014f", "scanner": "scanner-primary", "fingerprint": "858ab3e08df78c97", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f2c288f18cca771e", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/devis/components/quote-form-sections/ItemsSection.jsx (1206 lines)"}, "properties": {"repobilityId": "d09acea6b9669096", "scanner": "scanner-primary", "fingerprint": "f2c288f18cca771e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8d3c9cb69b11230b", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/devis/components/quote-form-sections/client-selector.jsx (1789 lines)"}, "properties": {"repobilityId": "9da67c779e64f750", "scanner": "scanner-primary", "fingerprint": "8d3c9cb69b11230b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d1eaaed6ea932bea", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/devis/hooks/use-quote-editor.js (2977 lines)"}, "properties": {"repobilityId": "6879582e408cc122", "scanner": "scanner-primary", "fingerprint": "d1eaaed6ea932bea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2309990d4a620290", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/transactions/components/transaction-detail-drawer.jsx (1925 lines)"}, "properties": {"repobilityId": "a6ce4cbef86b8982", "scanner": "scanner-primary", "fingerprint": "2309990d4a620290", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bb9962c69517b4bd", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/transactions/components/transactions/TransactionTable.jsx (1970 lines)"}, "properties": {"repobilityId": "d172ed52fe52fee8", "scanner": "scanner-primary", "fingerprint": "bb9962c69517b4bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aaced918b09b5e4c", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/signatures-mail/new/page.jsx (2022 lines)"}, "properties": {"repobilityId": "8e76d499d168bfea", "scanner": "scanner-primary", "fingerprint": "aaced918b09b5e4c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e4b15780d2a477d6", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/signatures-mail/components/blocks/BlockSettings.jsx (2471 lines)"}, "properties": {"repobilityId": "0da2808a536dc93e", "scanner": "scanner-primary", "fingerprint": "e4b15780d2a477d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4515da26fdb771f7", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/kanban/page.jsx (1682 lines)"}, "properties": {"repobilityId": "8f55ed9045019bb2", "scanner": "scanner-primary", "fingerprint": "4515da26fdb771f7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f4218994542f4eba", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/kanban/[id]/page.jsx (2089 lines)"}, "properties": {"repobilityId": "a0f18edd9781c36a", "scanner": "scanner-primary", "fingerprint": "f4218994542f4eba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-57f84650060ce116", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/TaskActivity.jsx (1689 lines)"}, "properties": {"repobilityId": "f91c164d87a70fcd", "scanner": "scanner-primary", "fingerprint": "57f84650060ce116", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a363807bb026da73", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/TaskModal.jsx (2565 lines)"}, "properties": {"repobilityId": "8d8a1c73000c7b18", "scanner": "scanner-primary", "fingerprint": "a363807bb026da73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9039d2905e2fd5ca", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx (3707 lines)"}, "properties": {"repobilityId": "835a60a1988072be", "scanner": "scanner-primary", "fingerprint": "9039d2905e2fd5ca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4a6a5909af5f0687", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/kanban/[id]/components/KanbanGanttView.jsx (1434 lines)"}, "properties": {"repobilityId": "d3da30666043870b", "scanner": "scanner-primary", "fingerprint": "4a6a5909af5f0687", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b55fa7575f93ea83", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures/components/invoice-sidebar.jsx (1583 lines)"}, "properties": {"repobilityId": "d7493a690e9a1670", "scanner": "scanner-primary", "fingerprint": "b55fa7575f93ea83", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9f54c3c07cb6e8c7", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures/components/invoice-table.jsx (1448 lines)"}, "properties": {"repobilityId": "f70ad21d075b9ac9", "scanner": "scanner-primary", "fingerprint": "9f54c3c07cb6e8c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fa1cbc316045880d", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/ItemsSection.jsx (1553 lines)"}, "properties": {"repobilityId": "972a01ef254708a6", "scanner": "scanner-primary", "fingerprint": "fa1cbc316045880d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c3cf7dafbcf503e7", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/client-selector.jsx (1789 lines)"}, "properties": {"repobilityId": "e59f182dcf96823d", "scanner": "scanner-primary", "fingerprint": "c3cf7dafbcf503e7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b9f2e05f5f57f788", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx (1577 lines)"}, "properties": {"repobilityId": "3cb1db98e47562a4", "scanner": "scanner-primary", "fingerprint": "b9f2e05f5f57f788", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c0ff4f05253aeaef", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures/hooks/use-invoice-editor.js (3152 lines)"}, "properties": {"repobilityId": "f54eea7d10835df9", "scanner": "scanner-primary", "fingerprint": "c0ff4f05253aeaef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0e49c740614f997e", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/documents-partages/page.jsx (5340 lines)"}, "properties": {"repobilityId": "6dd0b2b208d7788a", "scanner": "scanner-primary", "fingerprint": "0e49c740614f997e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ff9018f7b632d5d7", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures-achat/components/table.jsx (1334 lines)"}, "properties": {"repobilityId": "b377aa5db3411d1e", "scanner": "scanner-primary", "fingerprint": "ff9018f7b632d5d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6d3cec302020f856", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/factures-achat/components/detail-drawer.jsx (1390 lines)"}, "properties": {"repobilityId": "514070e176dfee36", "scanner": "scanner-primary", "fingerprint": "6d3cec302020f856", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b6808ee895d14b78", "level": "note", "message": {"text": "Very large file: app/dashboard/outils/bons-commande/hooks/use-purchase-order-editor.js (2912 lines)"}, "properties": {"repobilityId": "1a6f109b9a82ea3b", "scanner": "scanner-primary", "fingerprint": "b6808ee895d14b78", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9cbe8d58c0fc3ba0", "level": "note", "message": {"text": "Very large file: app/public/kanban/[token]/page.jsx (4263 lines)"}, "properties": {"repobilityId": "de0a5649d0fe0d38", "scanner": "scanner-primary", "fingerprint": "9cbe8d58c0fc3ba0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d471cf6e82c08115", "level": "note", "message": {"text": "Very large file: src/components/nav-main.jsx (1292 lines)"}, "properties": {"repobilityId": "a375fbd47abe9969", "scanner": "scanner-primary", "fingerprint": "d471cf6e82c08115", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-be76ba606662a4cb", "level": "note", "message": {"text": "Very large file: src/components/icons.jsx (2846 lines)"}, "properties": {"repobilityId": "18b147ff41667dbf", "scanner": "scanner-primary", "fingerprint": "be76ba606662a4cb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3a068c59c4c736c4", "level": "note", "message": {"text": "Very large file: src/components/settings/applications-section.jsx (1738 lines)"}, "properties": {"repobilityId": "76419714b980cd64", "scanner": "scanner-primary", "fingerprint": "3a068c59c4c736c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-453d9d9f3f7152d2", "level": "note", "message": {"text": "Very large file: src/components/pdf/UniversalPreviewPDF.jsx (2681 lines)"}, "properties": {"repobilityId": "d33b4d3909e3708a", "scanner": "scanner-primary", "fingerprint": "453d9d9f3f7152d2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-85f187ed9b573487", "level": "note", "message": {"text": "Very large file: src/lib/auth-plugins.js (1790 lines)"}, "properties": {"repobilityId": "5e3ad1bea67594e6", "scanner": "scanner-primary", "fingerprint": "85f187ed9b573487", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bb7c339716e5f29d", "level": "note", "message": {"text": "Very large file: src/hooks/use-signature-data.jsx (2009 lines)"}, "properties": {"repobilityId": "b45b1688b57620dc", "scanner": "scanner-primary", "fingerprint": "bb7c339716e5f29d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "b6348f1a03b3efea", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "51d6181501b1b292", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "56533d5130c2f00e", "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": "cf263568e395b02c", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "6ce85672dbf198ab", "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": "8067f6be077cef1c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-862b0525c256f2b5", "level": "none", "message": {"text": "Commented-code block (5 lines) in playwright.config.js:158"}, "properties": {"repobilityId": "d478314b9508b38a", "scanner": "scanner-primary", "fingerprint": "862b0525c256f2b5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8675a8b192bb3da5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 quick_start.js:35"}, "properties": {"repobilityId": "9a2711d99cd5fdc1", "scanner": "scanner-primary", "fingerprint": "8675a8b192bb3da5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-edab539a2e19666d", "level": "none", "message": {"text": "Commented-code block (10 lines) in __tests__/setup.js:15"}, "properties": {"repobilityId": "67fa5a890fa509c5", "scanner": "scanner-primary", "fingerprint": "edab539a2e19666d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-45a9b912984bec08", "level": "none", "message": {"text": "Commented-code block (7 lines) in __tests__/lib/authorize-subscription-reference.test.js:3"}, "properties": {"repobilityId": "1dc526d8c558c163", "scanner": "scanner-primary", "fingerprint": "45a9b912984bec08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e8ac25fc189ea6c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/remove-members-from-org.js:63"}, "properties": {"repobilityId": "e5cb33af36bf5581", "scanner": "scanner-primary", "fingerprint": "2e8ac25fc189ea6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e689fee52b9a80d2", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/publish-articles.js:109"}, "properties": {"repobilityId": "c92a5b722e965de4", "scanner": "scanner-primary", "fingerprint": "e689fee52b9a80d2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8803e46d37815360", "level": "none", "message": {"text": "Commented-code block (18 lines) in app/produits/kanban/section/KanbanComponentsSection.jsx:189"}, "properties": {"repobilityId": "e980f3f6f37e0d3d", "scanner": "scanner-primary", "fingerprint": "8803e46d37815360", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96e83def799a47a0", "level": "none", "message": {"text": "Commented-code block (18 lines) in app/produits/transfers/section/TransfersComponentsSection.jsx:189"}, "properties": {"repobilityId": "a5ebe2c71fdf163b", "scanner": "scanner-primary", "fingerprint": "96e83def799a47a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f18447d25c72db1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/disconnect/route.js:30"}, "properties": {"repobilityId": "85d833ab07d13de6", "scanner": "scanner-primary", "fingerprint": "8f18447d25c72db1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ad3c71dbc6298d38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/authorize/route.js:37"}, "properties": {"repobilityId": "5b716bc519ff4502", "scanner": "scanner-primary", "fingerprint": "ad3c71dbc6298d38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d31b9490d17ec177", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/superpdp/status/route.js:30"}, "properties": {"repobilityId": "b72bc612f3c111ac", "scanner": "scanner-primary", "fingerprint": "d31b9490d17ec177", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3133a495b71bee69", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/auth/verify-email/route.js:22"}, "properties": {"repobilityId": "d7bd512aa0141f6b", "scanner": "scanner-primary", "fingerprint": "3133a495b71bee69", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e4bfcae5392f2ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/upload-image/route.js:72"}, "properties": {"repobilityId": "6efe2d6f41387000", "scanner": "scanner-primary", "fingerprint": "7e4bfcae5392f2ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-72e28d3621853c24", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/transfer/download/[fileId]/route.js:95"}, "properties": {"repobilityId": "4f296255c41ebf63", "scanner": "scanner-primary", "fingerprint": "72e28d3621853c24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e34ee3897b8aea13", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/meta-capi/route.js:44"}, "properties": {"repobilityId": "0da42b2773da52c0", "scanner": "scanner-primary", "fingerprint": "e34ee3897b8aea13", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fad8833602aaac5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/gocardless/connect/route.js:39"}, "properties": {"repobilityId": "20da9cbf174225de", "scanner": "scanner-primary", "fingerprint": "3fad8833602aaac5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6b7307a16a21ea02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/bridge/connect/route.js:39"}, "properties": {"repobilityId": "3fa89466a89fea52", "scanner": "scanner-primary", "fingerprint": "6b7307a16a21ea02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4b78a1b2017bfc4d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-connect/bridge/institutions/route.js:20"}, "properties": {"repobilityId": "94216f9d57707b8c", "scanner": "scanner-primary", "fingerprint": "4b78a1b2017bfc4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f218a252aa3d54ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/cloudflare/cleanup-temp/route.js:46"}, "properties": {"repobilityId": "355e3717b5acb629", "scanner": "scanner-primary", "fingerprint": "f218a252aa3d54ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96c7be8e724401a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/search-companies/route.js:30"}, "properties": {"repobilityId": "9d572428fb256bf8", "scanner": "scanner-primary", "fingerprint": "96c7be8e724401a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5b10ddd1a682e09d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/signatures/auto-save/route.js:276"}, "properties": {"repobilityId": "018d8b53b2e53cb0", "scanner": "scanner-primary", "fingerprint": "5b10ddd1a682e09d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1c8ee646107122b4", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/documents/download/route.js:20"}, "properties": {"repobilityId": "efce25e5d497d32b", "scanner": "scanner-primary", "fingerprint": "1c8ee646107122b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64a49be5d2247607", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/banking-sync/accounts/route.js:38"}, "properties": {"repobilityId": "3e8eeb01af9a8f67", "scanner": "scanner-primary", "fingerprint": "64a49be5d2247607", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88ca522732bf5e5f", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/api/create-org-subscription/route.js:42"}, "properties": {"repobilityId": "097b9009089ce939", "scanner": "scanner-primary", "fingerprint": "88ca522732bf5e5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b4f5d81217c86bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/unified-expenses/match/route.js:58"}, "properties": {"repobilityId": "d2214f2e0d8141e1", "scanner": "scanner-primary", "fingerprint": "0b4f5d81217c86bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0683fe87e5581a1b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/unified-expenses/auto-reconcile/route.js:96"}, "properties": {"repobilityId": "19f6cc8255acbc64", "scanner": "scanner-primary", "fingerprint": "0683fe87e5581a1b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d10dea6d76532bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/preview-file/[documentId]/route.js:22"}, "properties": {"repobilityId": "134d6d173e9ce70c", "scanner": "scanner-primary", "fingerprint": "2d10dea6d76532bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b16fede2c31567f5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-file/[documentId]/route.js:22"}, "properties": {"repobilityId": "c6e08e684cde6100", "scanner": "scanner-primary", "fingerprint": "b16fede2c31567f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fb9de2a2ff52415a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/selection-info/route.js:21"}, "properties": {"repobilityId": "7137d543e447a638", "scanner": "scanner-primary", "fingerprint": "fb9de2a2ff52415a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-edfa9a76c0f4fe79", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-folder/route.js:23"}, "properties": {"repobilityId": "166a509d3a47352a", "scanner": "scanner-primary", "fingerprint": "edfa9a76c0f4fe79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a6284b56c9e0266", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/shared-documents/download-selection/route.js:21"}, "properties": {"repobilityId": "42a1435ad5f2972c", "scanner": "scanner-primary", "fingerprint": "2a6284b56c9e0266", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ade5e0289fb286c1", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/dashboard-client-layout.jsx:255"}, "properties": {"repobilityId": "4bed330dabf870bc", "scanner": "scanner-primary", "fingerprint": "ade5e0289fb286c1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35ad23dca67ff023", "level": "none", "message": {"text": "Commented-code block (13 lines) in app/dashboard/outils/loading.jsx:7"}, "properties": {"repobilityId": "d72e9ca9b15fd609", "scanner": "scanner-primary", "fingerprint": "35ad23dca67ff023", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d33029903155db27", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/dashboard/outils/devis/components/quote-form-sections/QuoteInfoSection.jsx:178"}, "properties": {"repobilityId": "9d1a42753cfbff7d", "scanner": "scanner-primary", "fingerprint": "d33029903155db27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b05f784d56cc182d", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/devis/hooks/use-quote-editor.js:873"}, "properties": {"repobilityId": "e337d4280a54df17", "scanner": "scanner-primary", "fingerprint": "b05f784d56cc182d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c59bba7106bf410a", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/dashboard/outils/devis/hooks/use-quote-table.js:268"}, "properties": {"repobilityId": "600df2494524a1a0", "scanner": "scanner-primary", "fingerprint": "c59bba7106bf410a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3aa9aad1b9582944", "level": "none", "message": {"text": "Commented-code block (34 lines) in app/dashboard/outils/signatures-mail/new/page.jsx:193"}, "properties": {"repobilityId": "776a22a8b5514dda", "scanner": "scanner-primary", "fingerprint": "3aa9aad1b9582944", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13dc908e804cd3de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/signatures-mail/new/page.jsx:81"}, "properties": {"repobilityId": "0031c7382501ccbe", "scanner": "scanner-primary", "fingerprint": "13dc908e804cd3de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2b174a95fef4cde", "level": "none", "message": {"text": "Commented-code block (14 lines) in app/dashboard/outils/signatures-mail/components/editor/layout/LayoutContent.jsx:50"}, "properties": {"repobilityId": "f17762688a8b92e1", "scanner": "scanner-primary", "fingerprint": "f2b174a95fef4cde", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d003b9d77c0f7ad", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/dashboard/outils/signatures-mail/components/blocks/ContainerNode.jsx:135"}, "properties": {"repobilityId": "3b2008217b531554", "scanner": "scanner-primary", "fingerprint": "3d003b9d77c0f7ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41b3180228b92a3e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/page.jsx:1095"}, "properties": {"repobilityId": "2ba026544f48af24", "scanner": "scanner-primary", "fingerprint": "41b3180228b92a3e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b80a6f4d4060558a", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/components/TaskModal.jsx:597"}, "properties": {"repobilityId": "a7839aa4c64c372b", "scanner": "scanner-primary", "fingerprint": "b80a6f4d4060558a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93156213af4cb4f0", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/components/TaskCard.jsx:1100"}, "properties": {"repobilityId": "ffeb92697b34a997", "scanner": "scanner-primary", "fingerprint": "93156213af4cb4f0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e71eee7dd83979f1", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/dashboard/outils/kanban/[id]/components/KanbanListView.jsx:344"}, "properties": {"repobilityId": "01686d8b1379538d", "scanner": "scanner-primary", "fingerprint": "e71eee7dd83979f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eea63b82c3d09d7d", "level": "none", "message": {"text": "Commented-code block (8 lines) in app/dashboard/outils/kanban/[id]/hooks/useKanbanTasks.js:187"}, "properties": {"repobilityId": "bde3933c589951c4", "scanner": "scanner-primary", "fingerprint": "eea63b82c3d09d7d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3bc6bb5a9c1f8b32", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/kanban/[id]/hooks/useMemberToggle.js:60"}, "properties": {"repobilityId": "eb4774a658c14f7c", "scanner": "scanner-primary", "fingerprint": "3bc6bb5a9c1f8b32", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9713058232b0b9e7", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/factures/components/invoices-form-sections/InvoiceInfoSection.jsx:531"}, "properties": {"repobilityId": "3a1da400826f3fbe", "scanner": "scanner-primary", "fingerprint": "9713058232b0b9e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2ee4f74a9f834eb", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/dashboard/outils/factures/hooks/use-invoice-editor.js:958"}, "properties": {"repobilityId": "df94dbb631bcf9a7", "scanner": "scanner-primary", "fingerprint": "e2ee4f74a9f834eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2823fd312ab919c", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/factures/hooks/use-invoice-table.js:287"}, "properties": {"repobilityId": "0365cee8e0ae8da0", "scanner": "scanner-primary", "fingerprint": "b2823fd312ab919c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dad24606884f3863", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/dashboard/outils/analytiques/components/analytics-revenue-pie-chart.jsx:107"}, "properties": {"repobilityId": "00ab8dc88efa6367", "scanner": "scanner-primary", "fingerprint": "dad24606884f3863", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e976710ad0ebfa1a", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/documents-partages/page.jsx:459"}, "properties": {"repobilityId": "326320ff6e29453b", "scanner": "scanner-primary", "fingerprint": "e976710ad0ebfa1a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0b926c04662df015", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/factures-achat/components/gmail-connection.jsx:86"}, "properties": {"repobilityId": "a067ff707dfe3b72", "scanner": "scanner-primary", "fingerprint": "0b926c04662df015", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f2528f9b3f644a9", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/outils/bons-commande/hooks/use-purchase-order-editor.js:865"}, "properties": {"repobilityId": "2d4d19f6125dd6bb", "scanner": "scanner-primary", "fingerprint": "5f2528f9b3f644a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-29c10b429484d1f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/dashboard/outils/transferts-fichiers/utils/watermark.js:302"}, "properties": {"repobilityId": "aed243fce7a2c773", "scanner": "scanner-primary", "fingerprint": "29c10b429484d1f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d31de53dcda51ae3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/outils/transferts-fichiers/components/file-upload-new.jsx:342"}, "properties": {"repobilityId": "9e6e13642ad4f6c5", "scanner": "scanner-primary", "fingerprint": "d31de53dcda51ae3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d6cdc8ef76407ab6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/dashboard/account/components/Setup2FAModal.jsx:90"}, "properties": {"repobilityId": "a002ad8d7a92065f", "scanner": "scanner-primary", "fingerprint": "d6cdc8ef76407ab6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-99e174167ae5a966", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/dashboard/calendar/components/calendar-dnd-context.jsx:277"}, "properties": {"repobilityId": "3072deecdcb5e0aa", "scanner": "scanner-primary", "fingerprint": "99e174167ae5a966", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6b77c290be53bd78", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/dashboard/calendar/components/event-calendar.jsx:130"}, "properties": {"repobilityId": "7d1f9a69e6b7c221", "scanner": "scanner-primary", "fingerprint": "6b77c290be53bd78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b04496c6bca8baf8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/transfer/[shareLink]/page.jsx:200"}, "properties": {"repobilityId": "5933df54afd26a6a", "scanner": "scanner-primary", "fingerprint": "b04496c6bca8baf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb0627c057f885d5", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/onboarding/success/page.jsx:160"}, "properties": {"repobilityId": "be1a7421f399484f", "scanner": "scanner-primary", "fingerprint": "bb0627c057f885d5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-41324675ff5815b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/(main)/new/lp-home/NewHeroNavbar.jsx:68"}, "properties": {"repobilityId": "349162ad22b5ec2d", "scanner": "scanner-primary", "fingerprint": "41324675ff5815b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fe42ea5456ff5b8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/pdf-generator/invoice/[id]/page.jsx:27"}, "properties": {"repobilityId": "007700fe19b934c0", "scanner": "scanner-primary", "fingerprint": "7fe42ea5456ff5b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-86e8651de0d05e72", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/pdf-generator/credit-note/[id]/page.jsx:27"}, "properties": {"repobilityId": "0b37961d77bc9cbc", "scanner": "scanner-primary", "fingerprint": "86e8651de0d05e72", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb8d5244a15a4684", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/errorMessages.js:411"}, "properties": {"repobilityId": "8388a79be406c380", "scanner": "scanner-primary", "fingerprint": "eb8d5244a15a4684", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9b7bf2720dfb59d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/archive-invoice-facturx.js:45"}, "properties": {"repobilityId": "37b01ce95242cce4", "scanner": "scanner-primary", "fingerprint": "d9b7bf2720dfb59d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-262f5ab6846b2ba2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/trackEvent.js:30"}, "properties": {"repobilityId": "4e529c54150227da", "scanner": "scanner-primary", "fingerprint": "262f5ab6846b2ba2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f3b1b666365ab13", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/build-document-pdf.js:56"}, "properties": {"repobilityId": "68a8fac750f9617b", "scanner": "scanner-primary", "fingerprint": "5f3b1b666365ab13", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08346d1f5b2c9501", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/section-cards.jsx:187"}, "properties": {"repobilityId": "ef978c1000b3293a", "scanner": "scanner-primary", "fingerprint": "08346d1f5b2c9501", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f27d696e045ac011", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/settings-modal.jsx:204"}, "properties": {"repobilityId": "f8df8ab350b40bad", "scanner": "scanner-primary", "fingerprint": "f27d696e045ac011", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f71f9b14e00a1a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/pricing-modal.jsx:37"}, "properties": {"repobilityId": "37228b07ff0be254", "scanner": "scanner-primary", "fingerprint": "1f71f9b14e00a1a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c271d953e97f548", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/invite-member-modal.jsx:140"}, "properties": {"repobilityId": "a52b292d20cda236", "scanner": "scanner-primary", "fingerprint": "2c271d953e97f548", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dbfd3a42036e7932", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/subscription-section.jsx:210"}, "properties": {"repobilityId": "24243cb16380fef6", "scanner": "scanner-primary", "fingerprint": "dbfd3a42036e7932", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b1e3636b6200022", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/espaces-section.jsx:261"}, "properties": {"repobilityId": "cf0d79b1f3e87791", "scanner": "scanner-primary", "fingerprint": "7b1e3636b6200022", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-573c84ec3df4d3aa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/settings/security-section.jsx:264"}, "properties": {"repobilityId": "e498761095f2ada2", "scanner": "scanner-primary", "fingerprint": "573c84ec3df4d3aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1f70cdd83edffd0a", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/settings/facturation-section.jsx:96"}, "properties": {"repobilityId": "6a8d86583d88ad3a", "scanner": "scanner-primary", "fingerprint": "1f70cdd83edffd0a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f49a564f1e768a0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ui/tabs-new.jsx:40"}, "properties": {"repobilityId": "80672862cddd067e", "scanner": "scanner-primary", "fingerprint": "0f49a564f1e768a0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ee0f4d9a37f2523f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/banking/BankBalanceCard.jsx:129"}, "properties": {"repobilityId": "4d5332c9e04e060e", "scanner": "scanner-primary", "fingerprint": "ee0f4d9a37f2523f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6d1b9d5ea315e1a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/create-workspace-modal/hooks/useCreateWorkspace.js:45"}, "properties": {"repobilityId": "d319892feea5a2e4", "scanner": "scanner-primary", "fingerprint": "6d1b9d5ea315e1a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-afb0e049bfb18363", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/pdf/UniversalPDFDownloaderWithFacturX.jsx:1260"}, "properties": {"repobilityId": "833ef43464856535", "scanner": "scanner-primary", "fingerprint": "afb0e049bfb18363", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-59f87f304001fa12", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/auth-plugins.js:262"}, "properties": {"repobilityId": "71dcfb9db32be268", "scanner": "scanner-primary", "fingerprint": "59f87f304001fa12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-afbc36d25d0b086d", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/auth-utils.js:30"}, "properties": {"repobilityId": "762617bbf72231cc", "scanner": "scanner-primary", "fingerprint": "afbc36d25d0b086d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c4ca2803b5c2a22f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/auth-utils.js:326"}, "properties": {"repobilityId": "c7fe734d5cb375cb", "scanner": "scanner-primary", "fingerprint": "c4ca2803b5c2a22f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80504d2b9d09cb8b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/apolloClient.js:48"}, "properties": {"repobilityId": "97870ebd16bb5610", "scanner": "scanner-primary", "fingerprint": "80504d2b9d09cb8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f3c748cfba6b0f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/apolloClient.js:449"}, "properties": {"repobilityId": "2b413bd0dd707de9", "scanner": "scanner-primary", "fingerprint": "0f3c748cfba6b0f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-af58ca24a06011d7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/setup-otp-store.js:3"}, "properties": {"repobilityId": "1c75a786c9394afc", "scanner": "scanner-primary", "fingerprint": "af58ca24a06011d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fbe880d7ceacc865", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/org-creation.js:240"}, "properties": {"repobilityId": "2ebaea0cd7845a3b", "scanner": "scanner-primary", "fingerprint": "fbe880d7ceacc865", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d217b4a8f78bf7c5", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/auth/api.js:186"}, "properties": {"repobilityId": "edc154c44a2c51f4", "scanner": "scanner-primary", "fingerprint": "d217b4a8f78bf7c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0daa24c1b61bcd7f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useDashboardLayoutSimple.js:16"}, "properties": {"repobilityId": "76a0cb34516c7df4", "scanner": "scanner-primary", "fingerprint": "0daa24c1b61bcd7f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4cece43701347905", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useDashboardLayoutSimple.js:171"}, "properties": {"repobilityId": "05bfe9bfed1f8c17", "scanner": "scanner-primary", "fingerprint": "4cece43701347905", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7d4039010b55f785", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useAutoReconcile.js:96"}, "properties": {"repobilityId": "c46b9c91f09cf8e4", "scanner": "scanner-primary", "fingerprint": "7d4039010b55f785", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e70aaac8560ac8c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useBetterAuthJWT.js:22"}, "properties": {"repobilityId": "7c8e10c3ae3125ec", "scanner": "scanner-primary", "fingerprint": "1e70aaac8560ac8c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-238635deaee8e170", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useZipPreview.js:140"}, "properties": {"repobilityId": "26a92a1baba4166e", "scanner": "scanner-primary", "fingerprint": "238635deaee8e170", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8284db9140b78a70", "level": "none", "message": {"text": "Commented-code block (18 lines) in src/hooks/useOrganizationInvitations.js:20"}, "properties": {"repobilityId": "5ff8c2c1f093ebbb", "scanner": "scanner-primary", "fingerprint": "8284db9140b78a70", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-03ce1256c27cfd7c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/hooks/useSubscriptionAccess.js:59"}, "properties": {"repobilityId": "354013c803424297", "scanner": "scanner-primary", "fingerprint": "03ce1256c27cfd7c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a27138299305a92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/cloudflareIconUploadService.js:66"}, "properties": {"repobilityId": "f885b1667f7a0556", "scanner": "scanner-primary", "fingerprint": "5a27138299305a92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cbfafbe0a1540fbb", "level": "none", "message": {"text": "Commented-code block (8 lines) in e2e/auth.setup.js:50"}, "properties": {"repobilityId": "b1b3d796c1d839ce", "scanner": "scanner-primary", "fingerprint": "cbfafbe0a1540fbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0646002a27a2265", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/global-setup.ts:126"}, "properties": {"repobilityId": "2c4f39ade7ceaca6", "scanner": "scanner-primary", "fingerprint": "c0646002a27a2265", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea7e32ed58371ecb", "level": "none", "message": {"text": "Commented-code block (12 lines) in e2e/fixtures/auth.fixture.js:30"}, "properties": {"repobilityId": "df9a9020c175223f", "scanner": "scanner-primary", "fingerprint": "ea7e32ed58371ecb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8c4ce945390e7771", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/email-signatures/signatures-crud.spec.js:73"}, "properties": {"repobilityId": "7f71b2290985977b", "scanner": "scanner-primary", "fingerprint": "8c4ce945390e7771", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-167ecca7c0c834e0", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/factures/issue-date-default.spec.js:125"}, "properties": {"repobilityId": "64fceeba8b7f3165", "scanner": "scanner-primary", "fingerprint": "167ecca7c0c834e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbc986c5f8c9196b", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/factures/numbering-free-mode.spec.js:120"}, "properties": {"repobilityId": "709b55632d564953", "scanner": "scanner-primary", "fingerprint": "dbc986c5f8c9196b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f1b1aa4eefa34af1", "level": "none", "message": {"text": "Commented-code block (7 lines) in e2e/factures/numbering-settings-isolation.spec.js:146"}, "properties": {"repobilityId": "30dd704194d0fa2a", "scanner": "scanner-primary", "fingerprint": "f1b1aa4eefa34af1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77c9c82461d87a7b", "level": "none", "message": {"text": "Commented-code block (9 lines) in e2e/factures/situations-conversion.spec.js:101"}, "properties": {"repobilityId": "423eafbecd7b4725", "scanner": "scanner-primary", "fingerprint": "77c9c82461d87a7b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e73759963403447", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/factures/invariants-business.spec.js:237"}, "properties": {"repobilityId": "3e21b259f4dff941", "scanner": "scanner-primary", "fingerprint": "1e73759963403447", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-49c149d23ca1bef0", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/factures/due-date-recalc.spec.js:245"}, "properties": {"repobilityId": "45e264fe27499e61", "scanner": "scanner-primary", "fingerprint": "49c149d23ca1bef0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19c6f716e4a47a39", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/factures/numbering-format.spec.js:27"}, "properties": {"repobilityId": "6881705d47c07b06", "scanner": "scanner-primary", "fingerprint": "19c6f716e4a47a39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aea61e7248c1025c", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/factures/avoirs.spec.js:40"}, "properties": {"repobilityId": "15236d10a236f893", "scanner": "scanner-primary", "fingerprint": "aea61e7248c1025c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3382c72e95c55bd", "level": "none", "message": {"text": "Commented-code block (7 lines) in e2e/factures/numbering-sequential.spec.js:192"}, "properties": {"repobilityId": "57bed57756f008a3", "scanner": "scanner-primary", "fingerprint": "c3382c72e95c55bd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-875b8190f5112653", "level": "none", "message": {"text": "Commented-code block (9 lines) in e2e/factures/pieges-critiques.spec.js:107"}, "properties": {"repobilityId": "23845a08bd8a8420", "scanner": "scanner-primary", "fingerprint": "875b8190f5112653", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b1649d2cba256af", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/factures/crud-mutations.spec.js:128"}, "properties": {"repobilityId": "b5f2cc1051cb62cf", "scanner": "scanner-primary", "fingerprint": "3b1649d2cba256af", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70fe45abbb7677d9", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/factures/crud-ui.spec.js:109"}, "properties": {"repobilityId": "89106166d03bc0d6", "scanner": "scanner-primary", "fingerprint": "70fe45abbb7677d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-24ba23df0dd4e9fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/factures/helpers/ui-helpers.js:46"}, "properties": {"repobilityId": "f021f942cd319819", "scanner": "scanner-primary", "fingerprint": "24ba23df0dd4e9fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86c0fd5ffeb38c1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/factures/helpers/invoice-mutations.js:231"}, "properties": {"repobilityId": "df800729f10bc9a6", "scanner": "scanner-primary", "fingerprint": "86c0fd5ffeb38c1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-192cb5f0d7124c96", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/clients/client-crud.spec.js:9"}, "properties": {"repobilityId": "3798e87f3a04351f", "scanner": "scanner-primary", "fingerprint": "192cb5f0d7124c96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e86f88d61c0328fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in e2e/treasury/treasury-forecast.spec.js:60"}, "properties": {"repobilityId": "0d47a1f09362d8a8", "scanner": "scanner-primary", "fingerprint": "e86f88d61c0328fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5fb535b4387f779", "level": "none", "message": {"text": "Commented-code block (6 lines) in e2e/quotes/quote-p0.spec.js:115"}, "properties": {"repobilityId": "8818b8e9915b9251", "scanner": "scanner-primary", "fingerprint": "e5fb535b4387f779", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bddda3d5a14c7401", "level": "note", "message": {"text": "29 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "3519a6b4ac1d4f19", "scanner": "scanner-primary", "fingerprint": "bddda3d5a14c7401", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}