{"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-0788a4c1752587ab", "name": "Possibly dead Python function: generate_title_slide", "shortDescription": {"text": "Possibly dead Python function: generate_title_slide"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c7e9acd90beb5f20", "name": "Possibly dead Python function: generate_problem_slide", "shortDescription": {"text": "Possibly dead Python function: generate_problem_slide"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-757f65175217bbd4", "name": "Possibly dead Python function: generate_solution_slide", "shortDescription": {"text": "Possibly dead Python function: generate_solution_slide"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eee8242c9a3e670d", "name": "Possibly dead Python function: generate_metrics_slide", "shortDescription": {"text": "Possibly dead Python function: generate_metrics_slide"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e13f3797d1c93de", "name": "Possibly dead Python function: generate_chart_slide", "shortDescription": {"text": "Possibly dead Python function: generate_chart_slide"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2be8c868587a8cd1", "name": "Possibly dead Python function: generate_testimonial_slide", "shortDescription": {"text": "Possibly dead Python function: generate_testimonial_slide"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0985f566c6f93168", "name": "Possibly dead Python function: generate_cta_slide", "shortDescription": {"text": "Possibly dead Python function: generate_cta_slide"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"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-eb0dfbbc13e6a242", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/EditorialMasthead.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/EditorialMasthead.tsx: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-22e17d8b629b6024", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/AppShowcase.tsx:734", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/AppShowcase.tsx:734"}, "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-7770f41ffb042a8b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/home/AppShowcase.tsx:420", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/home/AppShowcase.tsx:420"}, "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-8c99039316978257", "name": "TODO/FIXME marker in shipping code \u2014 src/components/home/StatsStrip.tsx:6", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/home/StatsStrip.tsx:6"}, "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-072811bdd2b8aebd", "name": "TODO/FIXME marker in shipping code \u2014 src/components/home/TrustLogos.tsx:6", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/home/TrustLogos.tsx:6"}, "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-70e13999d55adb7a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/pages/FeaturesContent.tsx:1185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pages/FeaturesContent.tsx:1185"}, "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-83f79e169a4236af", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/pages/HoeHetWerktContent.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pages/HoeHetWerktContent.tsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c11a4f15756ba64e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/mockups/ModuleMockups.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mockups/ModuleMockups.tsx:57"}, "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-9ad83a0a7e5dc18f", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/portaal-reactie.ts:245", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/portaal-reactie.ts:245"}, "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-4182f669ea71108f", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/inkoopfactuur-extract.ts:269", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/inkoopfactuur-extract.ts:269"}, "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-5a136ea34bbf9f3a", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/portaal-items-get.ts:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/portaal-items-get.ts:122"}, "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-56726c6792b64175", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/fetch-emails.ts:213", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/fetch-emails.ts:213"}, "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-81f9442085172f9c", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/send-email.ts:230", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/send-email.ts:230"}, "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-4a59d28d7cce6bc8", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/resend-notify.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/resend-notify.ts: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-7178e81434b27e74", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/mollie-webhook.ts:166", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/mollie-webhook.ts:166"}, "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-5209e208242b7122", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/stripe-webhook.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/stripe-webhook.ts:38"}, "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-7246f8426eab844d", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/cron-verzend-geplande-berichten.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/cron-verzend-geplande-berichten.ts:111"}, "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-63cc41b2743f03a3", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/offerte-accepteren.ts:250", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/offerte-accepteren.ts:250"}, "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-389c199cf237ecce", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/test-email-connection.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/test-email-connection.ts: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-864b170415582e9b", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/email-settings.ts:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/email-settings.ts:119"}, "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-a3dcf780635b70aa", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/api/cron-trial-expiration.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/cron-trial-expiration.ts:68"}, "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-b1610f2534a75ff1", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/scripts/cleanup-inkoopfacturen.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/scripts/cleanup-inkoopfacturen.ts: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-3c6eea4cced7f4a6", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/src/utils/logger.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/src/utils/logger.ts:5"}, "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-d768b235ad6c3cc3", "name": "TODO/FIXME marker in shipping code \u2014 forgedesk/src/utils/auditLogger.ts:4", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 forgedesk/src/utils/auditLogger.ts:4"}, "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-6b0fec9a5e419ba3", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/inkoopfacturen/InkoopfacturenLayout.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/inkoopfacturen/InkoopfacturenLayout.tsx:484"}, "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-ba11e90bb95e8cdd", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/OpvolgenBlok.tsx:51", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/OpvolgenBlok.tsx:51"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1fa1485a4b1fe3e2", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/ActiviteitLog.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/ActiviteitLog.tsx:138"}, "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-d6b36c437e8f26c8", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/RightRail.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/RightRail.tsx: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-56c6833c2af4ba39", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/VandaagBlok.tsx:410", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/VandaagBlok.tsx:410"}, "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-b236a9eb30dfe5af", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/clients/KlantAIChat.tsx:665", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/clients/KlantAIChat.tsx:665"}, "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-e74544233da1e9c6", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/AddEditClient.tsx:388", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/AddEditClient.tsx:388"}, "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-ec13dfc589ec91a7", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientProfile.tsx:696", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientProfile.tsx:696"}, "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-63caa039f0224bf5", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientCard.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientCard.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f90293a8955e0fb", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/DealsLayout.tsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/DealsLayout.tsx: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-cddbd036e00f3fa3", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientsLayout.tsx:404", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientsLayout.tsx:404"}, "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-9cf672dc434fba32", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/leveringsbonnen/LeveringsbonnenLayout.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/leveringsbonnen/LeveringsbonnenLayout.tsx:241"}, "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-9066a11b41cd4665", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/leveringsbonnen/PakbonVanProjectDialog.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/leveringsbonnen/PakbonVanProjectDialog.tsx:227"}, "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-6a08414b45ac1916", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/support/SupportInboxPage.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/support/SupportInboxPage.tsx:226"}, "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-5ed728d40370e30d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/Header.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/Header.tsx: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-9d6d811318541b94", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/TopNav.tsx:373", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/TopNav.tsx: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-790b7c6294264e14", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/Sidebar.tsx:510", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/Sidebar.tsx:510"}, "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-2e3ae7096346cc57", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/TabBar.tsx:36", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/TabBar.tsx:36"}, "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-33c5ea2bdee20809", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/website/WebsiteChatTab.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/website/WebsiteChatTab.tsx:203"}, "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-0df66b6dddce439e", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonnenLayout.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonnenLayout.tsx: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-d749f9922cb57eef", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonVanProjectDialog.tsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonVanProjectDialog.tsx: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-821cf20128739c14", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonMonteurView.tsx:354", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonMonteurView.tsx: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-a33b8d7252abe2b4", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonnenLayoutMobile.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonnenLayoutMobile.tsx:230"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3395fe2c125e3514", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonAanmaakDialog.tsx:181", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonAanmaakDialog.tsx:181"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3612f03c9bda7674", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonItemCard.tsx:323", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonItemCard.tsx:323"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f020cfcba96c957c", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/UitgavenLayout.tsx:409", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/UitgavenLayout.tsx: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-da4b069851bd98dc", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/FinancialLayout.tsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/FinancialLayout.tsx:272"}, "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-f1cf65f945aadd61", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/VoorraadLayout.tsx:446", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/VoorraadLayout.tsx:446"}, "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-261b49379fa0b87c", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/DiscountsSettings.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/DiscountsSettings.tsx: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-4409f09cc9661937", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/reports/RapportagesLayout.tsx:1038", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/reports/RapportagesLayout.tsx:1038"}, "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-71348ce36796104f", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/auth/ModuleMockups.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/auth/ModuleMockups.tsx:57"}, "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-25e273e67ec745b7", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailContextSidebar.tsx:474", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailContextSidebar.tsx:474"}, "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-be34526c480062b4", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailProjectKoppelingPanel.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailProjectKoppelingPanel.tsx:167"}, "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-ca2c5687c1d8772d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailCRMSidebar.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailCRMSidebar.tsx:307"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8127c7f160211b58", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailReader.tsx:1110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailReader.tsx:1110"}, "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-cc4ab51b6403864a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/email/EmailReader.tsx:1659", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/email/EmailReader.tsx:1659"}, "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-4e0b16a10b8496f3", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailComposePage.tsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailComposePage.tsx:281"}, "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-f05b94575ff269ca", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailActionsPopover.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailActionsPopover.tsx: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-336d86ea813ab3e4", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailCompose.tsx:705", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailCompose.tsx:705"}, "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-486f75a7284a9f71", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/IngeplandeBerichtenLijst.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/IngeplandeBerichtenLijst.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-a69c100b51b07751", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailListItem.tsx:448", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailListItem.tsx:448"}, "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-1734961aedfa31c0", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailLayout.tsx:1583", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailLayout.tsx:1583"}, "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-a44fc184d0aae528", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailTemplates.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailTemplates.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f50c9fd5e8236080", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/ClientApprovalPage.tsx:546", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/ClientApprovalPage.tsx:546"}, "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-36328d0bf1956e94", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalHeader.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalHeader.tsx: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-f3d64a1aaa7120e8", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortalenOverzicht.tsx:413", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortalenOverzicht.tsx:413"}, "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-858db77190657ecc", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalFeedItemTekening.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalFeedItemTekening.tsx: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-632f9b3943933032", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalSidebar.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalSidebar.tsx:207"}, "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-4e50e75b0755dfe0", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalFeedItemOfferte.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalFeedItemOfferte.tsx: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-6b2485a66ad423a9", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/TeamledenTab.tsx:527", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/TeamledenTab.tsx:527"}, "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-f8c994a62aed8493", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/SettingsLayout.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/SettingsLayout.tsx: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-13709453ecaa27aa", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/EmailTab.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/EmailTab.tsx:205"}, "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-68caf6491f8fb37a", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/KostenplaatsenTab.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/KostenplaatsenTab.tsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-95870fad673f6d5f", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/ProfielTab.tsx:125", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/ProfielTab.tsx:125"}, "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-67962dcc19603e2d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/VisualizerTab.tsx:470", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/VisualizerTab.tsx:470"}, "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-e3d2b0bc5db7325f", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/ForgieTab.tsx:547", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/ForgieTab.tsx:547"}, "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-52ef5f745134bb84", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/TeamLayout.tsx:742", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/TeamLayout.tsx: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-013da72b8a77c9a9", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/KennisbankTab.tsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/KennisbankTab.tsx:411"}, "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-75aea2bd7ae92df7", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/communicatie/OfferteOpvolgingSubT", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/communicatie/OfferteOpvolgingSubTab.tsx:426"}, "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-d9635ea4e27249dc", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/communicatie/TemplatesSubTab.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/communicatie/TemplatesSubTab.tsx:52"}, "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-de09b2d17276e3f1", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/ProjectMaatjesTab.tsx:37", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/ProjectMaatjesTab.tsx:37"}, "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-89a70751f24b648d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeBeheer.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeBeheer.tsx:68"}, "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-426fd1a5c434ff14", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeKladblok.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeKladblok.tsx:70"}, "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-724484af6ac3240c", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeKoppelSheet.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeKoppelSheet.tsx:148"}, "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-e13c4c55b139a4db", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/InkoopOffertePaneel.tsx:505", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/InkoopOffertePaneel.tsx:505"}, "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-a45d0353b29e852d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/InkoopOffertesPage.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/InkoopOffertesPage.tsx:148"}, "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-36ddb602cb8305f0", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteSidebar.tsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteSidebar.tsx: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-2e157314d87b15ad", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/OffertePubliekPagina.tsx:933", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/OffertePubliekPagina.tsx:933"}, "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-fcd8fe3098f1a521", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteHeader.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteHeader.tsx:163"}, "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-c852fe4920637d6e", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/AutofillInput.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/AutofillInput.tsx:185"}, "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-c522b1c97bff3380", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/ForgeQuotePreview.tsx:366", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/ForgeQuotePreview.tsx:366"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d23a16b1a1046de", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/CustomerSelector.tsx:251", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/CustomerSelector.tsx:251"}, "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-47bd805490c2d5d2", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuotesPipeline.tsx:904", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuotesPipeline.tsx:904"}, "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-dc93853f4a9dca8c", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteItemsTable.tsx:342", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteItemsTable.tsx: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-035bd095fbd0d0ab", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/RegelTemplateEditor.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/RegelTemplateEditor.tsx:211"}, "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-83db5122f810e606", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/KlantContactSelector.tsx:310", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/KlantContactSelector.tsx: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-4355e6d95578f2f3", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/CommandPalette.tsx:415", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/CommandPalette.tsx:415"}, "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-6cf1d7041afdd189", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/MedewerkerFilterCombobox.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/MedewerkerFilterCombobox.tsx:65"}, "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-3137343a4de63510", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/MedewerkerSelector.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/MedewerkerSelector.tsx:201"}, "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-26e404a92f1dc2ce", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/GlobalSearch.tsx:551", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/GlobalSearch.tsx:551"}, "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-78cb89cce408789d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/ModuleHeader.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/ModuleHeader.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2bd56b8217072f95", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/notifications/NotificatieCenter.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/notifications/NotificatieCenter.tsx:220"}, "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-6260929077025c8b", "name": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuweKlantModal.tsx:170", "shortDescription": {"text": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuweKlantModal.tsx:170"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c16f247d8106d344", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuweKlantModal.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuweKlantModal.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ceaeb02b09efcb7f", "name": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuweOfferteModal.tsx:476", "shortDescription": {"text": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuweOfferteModal.tsx:476"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c21961c2b434633d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuweOfferteModal.tsx:475", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuweOfferteModal.tsx:475"}, "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-696ff74233bf8f40", "name": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuwProjectModal.tsx:103", "shortDescription": {"text": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuwProjectModal.tsx:103"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f25e32fcaacd08ba", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuwProjectModal.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuwProjectModal.tsx: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-9a58e8931777a3a4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/forgie/FORGEdeskAIChat.tsx:803", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/forgie/FORGEdeskAIChat.tsx:803"}, "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-150147aba0f426c2", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/forgie/ForgieChatWidget.tsx:643", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/forgie/ForgieChatWidget.tsx: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-39aba97e828665d0", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectDetail.tsx:1403", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectDetail.tsx:1403"}, "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-b48e8678813e0dc6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/projects/ProjectDetail.tsx:2284", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/projects/ProjectDetail.tsx:2284"}, "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-a52b1f04269e9157", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TimelineView.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TimelineView.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0d92eaa0bafe933b", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/NacalculatieLayout.tsx:627", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/NacalculatieLayout.tsx:627"}, "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-d1d56076b753ea03", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectPhotoGallery.tsx:314", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectPhotoGallery.tsx:314"}, "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-d0a758b4aabeb98d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TeamAvailability.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TeamAvailability.tsx:66"}, "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-bb1366c959a182a9", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectMailComposer.tsx:804", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectMailComposer.tsx:804"}, "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-1d7deb9923736a6a", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectPortaalTab.tsx:699", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectPortaalTab.tsx:699"}, "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-980aaed2e9b86504", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TijdregistratieLayout.tsx:1074", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TijdregistratieLayout.tsx:1074"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-498e421f8a7d561b", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectsList.tsx:969", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectsList.tsx: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-c32c2b9758714438", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:4", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:468"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1c2a3ac3f147e1f", "name": "TODO/FIXME marker in shipping code \u2014 forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:697", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:697"}, "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-913816e12e0a77e1", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/ProjectKaart.tsx:273", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/ProjectKaart.tsx: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-4e6c3de9941c3c54", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/PortaalPanel.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/PortaalPanel.tsx:84"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-521156fa3468070c", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/MontageSection.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/MontageSection.tsx:67"}, "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-61b99bb1b6490b7a", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/KlantCard.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/KlantCard.tsx:194"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fad75edfc6ec3dd2", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/BestandenSection.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/BestandenSection.tsx:155"}, "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-a2f30bd38dd7f1b3", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/ActiesCard.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/ActiesCard.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-15b39d2012bef51f", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/TakenOfferteGrid.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/TakenOfferteGrid.tsx:176"}, "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-f42d2c1e6d12356b", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/portaal/PortaalSidebarAct", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/portaal/PortaalSidebarActions.tsx:399"}, "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-a7c393a1f8b1d9c1", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/invoices/FacturenLayout.tsx:1547", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/invoices/FacturenLayout.tsx:1547"}, "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-0e9cdd4d5e12e2f9", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/invoices/FactuurEditor.tsx:1841", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/invoices/FactuurEditor.tsx:1841"}, "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-2b7263565e9770f8", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/DayView.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/DayView.tsx: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-7a066bd445315123", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/WeekView.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/WeekView.tsx:173"}, "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-7aaf5b18ac4cd45f", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MontagePlanningLayout.tsx:354", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MontagePlanningLayout.tsx: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-29807919f4d78471", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MontagePlanningLayoutMobile.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MontagePlanningLayoutMobile.tsx:134"}, "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-64f2c6eb81809547", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/BookingBeheer.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/BookingBeheer.tsx:111"}, "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-69fd6dfabfa8cf03", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/AfwezigheidPopover.tsx:305", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/AfwezigheidPopover.tsx:305"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f7dabe6c65d219d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/TakenBulkActionBar.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/TakenBulkActionBar.tsx:192"}, "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-d07743927e45232d", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/TasksLayout.tsx:1713", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/TasksLayout.tsx:1713"}, "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-0feb412c916e57ad", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MonthView.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MonthView.tsx:109"}, "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-1e0a1800554b6463", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/import/DataImportPage.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/import/DataImportPage.tsx:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b587b2d81e573b41", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/import/LosseContacten.tsx:442", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/import/LosseContacten.tsx:442"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7e29751cd48c2af", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentUpload.tsx:212", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentUpload.tsx:212"}, "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-97b6ae23c49078eb", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentFolders.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentFolders.tsx:63"}, "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-d16413719f136406", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentsPipeline.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentsPipeline.tsx:71"}, "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-375ba4ed71ed71af", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentsLayout.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentsLayout.tsx:392"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ad4c735fa3d7d50", "name": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/ui/date-picker.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/ui/date-picker.tsx:134"}, "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-f8e9b15b068f5a71", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/src/services/portaalNotificatieService.ts:320", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/src/services/portaalNotificatieService.ts:320"}, "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-51ebd67ed22d785b", "name": "Stray `console.log` in TS/JS \u2014 forgedesk/src/services/profielService.ts:518", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/src/services/profielService.ts:518"}, "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-0e3054cbc5114781", "name": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/import-woocommerce.ts:71", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/import-woocommerce.ts:71"}, "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-9a0f1b834a30f0b5", "name": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/migrate-images.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/migrate-images.ts:63"}, "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-c7afbaf3b9ef43af", "name": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/migrate-gallery.ts:132", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/migrate-gallery.ts:132"}, "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-43c68262e239f358", "name": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/backfill-sku.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/backfill-sku.ts: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-c7e75d799d10b6fd", "name": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/fix-categorienamen.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/fix-categorienamen.ts:36"}, "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-1ce4f1d5d15e25dc", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 kunstdoekje/src/app/layout.tsx:93", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 kunstdoekje/src/app/layout.tsx:93"}, "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-589bb474027700ff", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 kunstdoekje/src/app/product/[slug]/page.tsx:94", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 kunstdoekje/src/app/product/[slug]/page.tsx:94"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-befa161623a889fb", "name": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/Configurator.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/Configurator.tsx:279"}, "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-15d3f42b5f5df4d8", "name": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/VoorJou.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/VoorJou.tsx:72"}, "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-1207e22d69160871", "name": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/ProductCard.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/ProductCard.tsx:62"}, "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-1fd4a4d315bb870e", "name": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/ShopGrid.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/ShopGrid.tsx: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-612d89d7fafd30ec", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/home/AppShowcase.tsx:420", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/home/AppShowcase.tsx:420"}, "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-92ed9c249a08da99", "name": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/main.tsx:82", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/main.tsx:82"}, "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-64d20f36a7e990c8", "name": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/clients/KlantAIChat.tsx:665", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/clients/KlantAIChat.tsx:665"}, "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-2910a56cc1778593", "name": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/email/EmailReader.tsx:1659", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/email/EmailReader.tsx:1659"}, "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-0fe3706d7912d0af", "name": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailReader.tsx:607", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailReader.tsx:607"}, "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-fd300086c1c8a3a7", "name": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailComposePage.tsx:124", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailComposePage.tsx:124"}, "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-04a6896f8a8e5c57", "name": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailCompose.tsx:217", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailCompose.tsx:217"}, "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-c44a789023f0ac1e", "name": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/forgie/FORGEdeskAIChat.tsx:803", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/forgie/FORGEdeskAIChat.tsx:803"}, "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-485956fb0b4dee7b", "name": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/projects/ProjectDetail.tsx:2284", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/projects/ProjectDetail.tsx:2284"}, "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-34cbddd0db018ed9", "name": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:386", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:386"}, "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-606210a90177d4b4", "name": "Insecure pattern 'document_write' in forgedesk/src/components/planning/MontagePlanningLayout.tsx:1080", "shortDescription": {"text": "Insecure pattern 'document_write' in forgedesk/src/components/planning/MontagePlanningLayout.tsx:1080"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1214ea0d35936731", "name": "Insecure pattern 'dangerous_innerhtml' in kunstdoekje/src/app/layout.tsx:93", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in kunstdoekje/src/app/layout.tsx:93"}, "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-fd9e2d405f70a25f", "name": "Insecure pattern 'dangerous_innerhtml' in kunstdoekje/src/app/product/[slug]/page.tsx:94", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in kunstdoekje/src/app/product/[slug]/page.tsx:94"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6f91e38326d94f18", "name": "Insecure pattern 'node_child_process' in .claude/skills/brand/scripts/sync-brand-to-tokens.cjs:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/brand/scripts/sync-brand-to-tokens.cjs:14"}, "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-5915125e41fb2856", "name": "Very large file: src/components/home/AppShowcase.tsx (2878 lines)", "shortDescription": {"text": "Very large file: src/components/home/AppShowcase.tsx (2878 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-57e624f2042a6ba4", "name": "Very large file: src/components/pages/FeaturesContent.tsx (1999 lines)", "shortDescription": {"text": "Very large file: src/components/pages/FeaturesContent.tsx (1999 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-bd61836b6bf3ac04", "name": "Very large file: src/components/pages/HoeHetWerktContent.tsx (1242 lines)", "shortDescription": {"text": "Very large file: src/components/pages/HoeHetWerktContent.tsx (1242 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-d3a4d4f9318373c5", "name": "Very large file: forgedesk/src/types/index.ts (2348 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/types/index.ts (2348 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-050b95ea9d41a7ce", "name": "Very large file: forgedesk/src/components/clients/ClientProfile.tsx (2002 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/clients/ClientProfile.tsx (2002 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-119e5764eb5b7318", "name": "Very large file: forgedesk/src/components/werkbonnen/WerkbonDetail.tsx (1351 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/werkbonnen/WerkbonDetail.tsx (1351 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-48cfa6cc20deb873", "name": "Very large file: forgedesk/src/components/reports/RapportagesLayout.tsx (1364 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/reports/RapportagesLayout.tsx (1364 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-c90512d8dd18849b", "name": "Very large file: forgedesk/src/components/email/EmailContextSidebar.tsx (1040 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/email/EmailContextSidebar.tsx (1040 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-9ea2d5055495dea2", "name": "Very large file: forgedesk/src/components/email/EmailReader.tsx (1918 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/email/EmailReader.tsx (1918 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-9caa3b6c51cc68f8", "name": "Very large file: forgedesk/src/components/email/EmailCompose.tsx (1158 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/email/EmailCompose.tsx (1158 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-66b3607d7037876e", "name": "Very large file: forgedesk/src/components/email/EmailLayout.tsx (2410 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/email/EmailLayout.tsx (2410 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-f6d1b9bd4531eb41", "name": "Very large file: forgedesk/src/components/settings/EmailTab.tsx (1310 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/settings/EmailTab.tsx (1310 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-794377cd7d251bc0", "name": "Very large file: forgedesk/src/components/settings/IntegratiesTab.tsx (1490 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/settings/IntegratiesTab.tsx (1490 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-1040e2b7afd4aece", "name": "Very large file: forgedesk/src/components/settings/HuisstijlTab.tsx (1415 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/settings/HuisstijlTab.tsx (1415 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-b7d2d5b1433b11f1", "name": "Very large file: forgedesk/src/components/settings/CalculatieTab.tsx (2366 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/settings/CalculatieTab.tsx (2366 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-b9309c59d11758ef", "name": "Very large file: forgedesk/src/components/quotes/OfferteDetail.tsx (1340 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/quotes/OfferteDetail.tsx (1340 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-611822c5c0ea0e5e", "name": "Very large file: forgedesk/src/components/quotes/QuoteCreation.tsx (2553 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/quotes/QuoteCreation.tsx (2553 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-f15af41cb8967bf4", "name": "Very large file: forgedesk/src/components/quotes/QuotesPipeline.tsx (1715 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/quotes/QuotesPipeline.tsx (1715 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-dc08c9d86bef51fd", "name": "Very large file: forgedesk/src/components/quotes/QuoteItemsTable.tsx (1740 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/quotes/QuoteItemsTable.tsx (1740 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-24665420ee6a9bee", "name": "Very large file: forgedesk/src/components/projects/ProjectDetail.tsx (3243 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/projects/ProjectDetail.tsx (3243 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-770361c5c550115e", "name": "Very large file: forgedesk/src/components/projects/TijdregistratieLayout.tsx (1350 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/projects/TijdregistratieLayout.tsx (1350 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-c3acf71f9bb8d687", "name": "Very large file: forgedesk/src/components/projects/ProjectsList.tsx (1880 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/projects/ProjectsList.tsx (1880 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-6e9b0e49f515c078", "name": "Very large file: forgedesk/src/components/invoices/FacturenLayout.tsx (2983 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/invoices/FacturenLayout.tsx (2983 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-bd748943b877f447", "name": "Very large file: forgedesk/src/components/invoices/FactuurEditor.tsx (3091 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/invoices/FactuurEditor.tsx (3091 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-904deb64cedd2ded", "name": "Very large file: forgedesk/src/components/planning/MontagePlanningLayout.tsx (3706 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/planning/MontagePlanningLayout.tsx (3706 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-961984fb13e14a97", "name": "Very large file: forgedesk/src/components/planning/TasksLayout.tsx (3096 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/planning/TasksLayout.tsx (3096 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-7f7f7168d2164462", "name": "Very large file: forgedesk/src/components/visualizer/VisualizerLayout.tsx (1171 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/components/visualizer/VisualizerLayout.tsx (1171 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-7cc649f4c00c1d76", "name": "Very large file: forgedesk/src/services/pdfService.ts (2324 lines)", "shortDescription": {"text": "Very large file: forgedesk/src/services/pdfService.ts (2324 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": "12 test file(s) for 735 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "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 352 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 759 placeholder/mock markers across 158 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-da71c43ceb23850d", "name": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/Planner.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/Planner.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-65882624a6697f18", "name": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/QAA.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/QAA.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1649dae1c90ffd37", "name": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/dev.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/dev.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea7e8f088bd7f68a", "name": "Agent instruction/config may expose a secret: forgedesk/.claude/agents/trigger-dev-task-writer.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: forgedesk/.claude/agents/trigger-dev-task-writer.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a9efd6148b14c4dd", "name": "Agent authority lacks a verifier contract: .claude/skills/design-system/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d60e06b48b7fa56d", "name": "Agent authority lacks a verifier contract: .claude/skills/design-system/references/tailwind-integration.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system/references/tailwind-integration.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08f8f3764ea9cbf2", "name": "Agent authority lacks a verifier contract: .claude/skills/slides/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/slides/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5df68c6f99043d0b", "name": "Agent authority lacks a verifier contract: .claude/skills/slides/references/layout-patterns.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/slides/references/layout-patterns.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-44315c6caebd5a6a", "name": "Agent authority lacks a verifier contract: .claude/skills/slides/references/slide-strategies.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/slides/references/slide-strategies.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-174e2536d1171d35", "name": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/shadcn-components.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/shadcn-components.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9aacdde86114e962", "name": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/shadcn-accessibility.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/shadcn-accessibility.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f1d43b3de4e0dcd", "name": "Agent authority lacks a verifier contract: .claude/skills/design/references/cip-design.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/cip-design.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ec269b993ce6613a", "name": "Agent authority lacks a verifier contract: .claude/skills/design/references/logo-design.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/logo-design.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc31d2bbc9c2d406", "name": "Agent authority lacks a verifier contract: .claude/skills/design/references/banner-sizes-and-styles.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/banner-sizes-and-styles.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-db0739837029be5e", "name": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides-strategies.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides-strategies.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-287d4cf2d33f58ff", "name": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-efd944ff0e1991f3", "name": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides-layout-patterns.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides-layout-patterns.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-297a89e3aaefd34f", "name": "Agent authority lacks a verifier contract: .claude/skills/banner-design/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/banner-design/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7fa5686d97d8e5e8", "name": "Agent authority lacks a verifier contract: .claude/skills/banner-design/references/banner-sizes-and-styles.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/banner-design/references/banner-sizes-and-styles.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f1adf71fa42c354", "name": "Agent authority lacks a verifier contract: .claude/skills/brand/templates/brand-guidelines-starter.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/brand/templates/brand-guidelines-starter.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe4826c8fe2e64d5", "name": "Agent authority lacks a verifier contract: .claude/skills/brand/references/asset-organization.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/brand/references/asset-organization.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f822c0c09b41ab9f", "name": "Agent authority lacks a verifier contract: .claude/skills/nano-banana-pro/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/nano-banana-pro/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ff0c2e8821fc994", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-grootboeken.ts:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-grootboeken.ts:99"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b60708491e9cb0fa", "name": "Commented-code block (5 lines) in forgedesk/api/exact-document-types.ts:149", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-document-types.ts:149"}, "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-f6eb9e439e8b4cbd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-document-types.ts:134", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-document-types.ts:134"}, "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-1aa465f2b4c0c6f2", "name": "Commented-code block (5 lines) in forgedesk/api/mollie-create-payment.ts:259", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/mollie-create-payment.ts:259"}, "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-c66c5fd8d1c44cd3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/mollie-create-payment.ts:230", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/mollie-create-payment.ts:230"}, "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-867ad4da5a8f474b", "name": "Commented-code block (5 lines) in forgedesk/api/exact-grootboeken.ts:147", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-grootboeken.ts:147"}, "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-053474562a8d4cf8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-grootboeken.ts:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-grootboeken.ts:132"}, "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-ff08753cfc0ec028", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-chat.ts:674", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-chat.ts:674"}, "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-5c86275ab76a4b9a", "name": "Commented-code block (6 lines) in forgedesk/api/fetch-emails.ts:222", "shortDescription": {"text": "Commented-code block (6 lines) in forgedesk/api/fetch-emails.ts:222"}, "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-713cbc61f72ff643", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/fetch-emails.ts:274", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/fetch-emails.ts:274"}, "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-d1860823b90439d9", "name": "Commented-code block (6 lines) in forgedesk/api/send-email.ts:300", "shortDescription": {"text": "Commented-code block (6 lines) in forgedesk/api/send-email.ts:300"}, "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-c15fb9f1c756768e", "name": "Commented-code block (5 lines) in forgedesk/api/exact-callback.ts:62", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-callback.ts:62"}, "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-a34653682b9443bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-callback.ts:211", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-callback.ts:211"}, "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-549e6118dabac707", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-rewrite.ts:312", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-rewrite.ts:312"}, "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-e0a313a9be3961eb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/analyze-inkoop-offerte.ts:284", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/analyze-inkoop-offerte.ts:284"}, "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-ab2f827910284b12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/mollie-webhook.ts:155", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/mollie-webhook.ts:155"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-23a4e8e5535085c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/inkoopfactuur-sync.ts:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/inkoopfactuur-sync.ts:119"}, "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-819fcbcd4a1efe9a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/kvk-zoeken.ts:120", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/kvk-zoeken.ts:120"}, "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-a26effc51e49850e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-connect.ts:139", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-connect.ts:139"}, "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-bdef07d673fa8d44", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/kvk-basisprofiel.ts:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/kvk-basisprofiel.ts:119"}, "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-ad7012b0eef5721c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-followup-email.ts:306", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-followup-email.ts:306"}, "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-273cb6fa522f826b", "name": "Commented-code block (5 lines) in forgedesk/api/exact-btw-codes.ts:147", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-btw-codes.ts:147"}, "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-30fa4d08986caf67", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-btw-codes.ts:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-btw-codes.ts:132"}, "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-2ac94eeef6cf2731", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-sync-factuur.ts:201", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-sync-factuur.ts:201"}, "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-2e3b3bc1b3ad66d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/read-email.ts:416", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/read-email.ts:416"}, "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-b5376cdf16d3733d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-email.ts:294", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-email.ts:294"}, "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-32dc7c9fd39a5866", "name": "Commented-code block (9 lines) in forgedesk/api/exact-sync-factuur.ts:163", "shortDescription": {"text": "Commented-code block (9 lines) in forgedesk/api/exact-sync-factuur.ts:163"}, "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-1be9e622fdb1ce79", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-sync-factuur.ts:148", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-sync-factuur.ts:148"}, "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-7b4055c758b1cf57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-sync-factuur.ts:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-sync-factuur.ts:115"}, "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-be2ba33b2fc14321", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-ledger-accounts.ts:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-ledger-accounts.ts:99"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3de89e5ac664c871", "name": "Commented-code block (6 lines) in forgedesk/api/exact-administraties.ts:150", "shortDescription": {"text": "Commented-code block (6 lines) in forgedesk/api/exact-administraties.ts:150"}, "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-ec27bf86dbf5c057", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-administraties.ts:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-administraties.ts:135"}, "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-70e47ae82f3cc1c0", "name": "Commented-code block (5 lines) in forgedesk/api/exact-dagboeken.ts:148", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-dagboeken.ts:148"}, "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-f64ad38f64503014", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-dagboeken.ts:133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-dagboeken.ts:133"}, "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-72914c171a2fcd51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/backfill-emails.ts:159", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/backfill-emails.ts:159"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fbc52fde0de8d5ee", "name": "Commented-code block (5 lines) in forgedesk/api/exact-auth.ts:30", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-auth.ts: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-75f79ce7f4140c28", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-connect.ts:134", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-connect.ts:134"}, "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-a8ae00ec9f2633db", "name": "Commented-code block (5 lines) in forgedesk/api/exact-refresh.ts:167", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-refresh.ts:167"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c80b739cb311336", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-refresh.ts:149", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-refresh.ts:149"}, "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-ea823a724b5350ab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/email-attachment.ts:201", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/email-attachment.ts:201"}, "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-23014863f93495b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-connect.ts:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-connect.ts:135"}, "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-5ba529447b641e1b", "name": "Commented-code block (6 lines) in forgedesk/api/snelstart-sync-factuur.ts:332", "shortDescription": {"text": "Commented-code block (6 lines) in forgedesk/api/snelstart-sync-factuur.ts:332"}, "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-e48300baa2694d4d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-sync-factuur.ts:221", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-sync-factuur.ts:221"}, "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-be2a6a8b955f39f3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai.ts:80"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36623b6a7b8c2a6d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-ledgers.ts:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-ledgers.ts:94"}, "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-5afcc9103548f48e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-tax-rates.ts:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-tax-rates.ts:99"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e2ce5a22a9ff415e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/utils/maatjeAnnotaties.ts:191", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/utils/maatjeAnnotaties.ts:191"}, "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-be0d2a8dff42516e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/trigger/inkoopfactuur-intake.ts:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/trigger/inkoopfactuur-intake.ts:128"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d76e4582a77003ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/trigger/email-opvolging.ts:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/trigger/email-opvolging.ts:104"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0a9e6bf70bbd088a", "name": "Commented-code block (5 lines) in forgedesk/src/contexts/DashboardDataContext.tsx:66", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/contexts/DashboardDataContext.tsx:66"}, "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-51a7031d11ffbd3b", "name": "Commented-code block (5 lines) in forgedesk/src/contexts/TabsContext.tsx:128", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/contexts/TabsContext.tsx: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-a436f4b02606c913", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/hooks/useInkoopAIUsage.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/hooks/useInkoopAIUsage.ts:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-14fe80e642db9f40", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/hooks/useWeather.ts:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/hooks/useWeather.ts:78"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b4123c186266118", "name": "Commented-code block (5 lines) in forgedesk/src/components/dashboard/VandaagBlok.tsx:160", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/components/dashboard/VandaagBlok.tsx: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-7886ae4fe2e8c1f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/clients/AddEditClient.tsx:113", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/clients/AddEditClient.tsx:113"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4249eb13402d35d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/werkbonnen/WerkbonDetail.tsx:965", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/werkbonnen/WerkbonDetail.tsx:965"}, "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-cd24c698f8f3df96", "name": "Legacy-named symbol `doen_email_sales_inbox_banner_v1` in forgedesk/src/components/email/EmailLayout.tsx:207", "shortDescription": {"text": "Legacy-named symbol `doen_email_sales_inbox_banner_v1` in forgedesk/src/components/email/EmailLayout.tsx:207"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7076900d77b8386a", "name": "Commented-code block (5 lines) in forgedesk/src/components/email/EmailLayout.tsx:129", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/components/email/EmailLayout.tsx:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eaf2b1716212f559", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/email/EmailLayout.tsx:1180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/email/EmailLayout.tsx:1180"}, "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-25a287dbbe2d13ff", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/portaal/PortaalReactieFormInline.tsx:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/portaal/PortaalReactieFormInline.tsx:94"}, "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-719cdb40e07a319b", "name": "Commented-code block (7 lines) in forgedesk/src/components/settings/IntegratiesTab.tsx:91", "shortDescription": {"text": "Commented-code block (7 lines) in forgedesk/src/components/settings/IntegratiesTab.tsx:91"}, "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-f507d7f28a3fac9f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/settings/IntegratiesTab.tsx:238", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/settings/IntegratiesTab.tsx:238"}, "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-fe38744da3db714f", "name": "Commented-code block (5 lines) in forgedesk/src/components/settings/WeergaveTab.tsx:60", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/components/settings/WeergaveTab.tsx: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-d1704738028f6784", "name": "Commented-code block (6 lines) in forgedesk/src/components/quotes/CalculatieModal.tsx:52", "shortDescription": {"text": "Commented-code block (6 lines) in forgedesk/src/components/quotes/CalculatieModal.tsx:52"}, "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-045a84571476b11d", "name": "Commented-code block (5 lines) in forgedesk/src/components/quotes/QuoteCreation.tsx:467", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/components/quotes/QuoteCreation.tsx:467"}, "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-de05df94da7f378e", "name": "Commented-code block (5 lines) in forgedesk/src/components/quotes/QuoteItemsTable.tsx:27", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/components/quotes/QuoteItemsTable.tsx: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-e2c8fcaac30e4cad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/quotes/QuoteItemsTable.tsx:211", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/quotes/QuoteItemsTable.tsx:211"}, "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-3a03aeff7a6491d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/projects/cockpit/BestandenSection.tsx:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/projects/cockpit/BestandenSection.tsx:88"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-126b23d63ba1ebaf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/planning/WeatherDayStrip.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/planning/WeatherDayStrip.tsx: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-f32d575840497a61", "name": "Legacy-named symbol `doen_planning_filter_v1` in forgedesk/src/components/planning/MontagePlanningLayout.tsx:105", "shortDescription": {"text": "Legacy-named symbol `doen_planning_filter_v1` in forgedesk/src/components/planning/MontagePlanningLayout.tsx:105"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-023d431caaf8fcb2", "name": "Legacy-named symbol `doen_planning_filter_v1` in forgedesk/src/components/planning/MontagePlanningLayoutMobile.tsx:17", "shortDescription": {"text": "Legacy-named symbol `doen_planning_filter_v1` in forgedesk/src/components/planning/MontagePlanningLayoutMobile.tsx:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9cb53f43cb6aece", "name": "Legacy-named symbol `doen_taken_filter_migration_v2` in forgedesk/src/components/planning/TasksLayout.tsx:80", "shortDescription": {"text": "Legacy-named symbol `doen_taken_filter_migration_v2` in forgedesk/src/components/planning/TasksLayout.tsx:80"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8bf411b76c71402", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/visualizer/SigningVisualizerDialog.tsx:196", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/visualizer/SigningVisualizerDialog.tsx:196"}, "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-840ba7b416309794", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/visualizer/VisualizerLayout.tsx:255", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/visualizer/VisualizerLayout.tsx:255"}, "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-c001c814a283b5e1", "name": "Commented-code block (5 lines) in forgedesk/src/lib/documentTemplates.ts:206", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/lib/documentTemplates.ts:206"}, "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-c637daa99d6bae1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/forgieChatService.ts:40", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/forgieChatService.ts:40"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b586f797b2ccd85c", "name": "Commented-code block (5 lines) in forgedesk/src/services/gmailService.ts:259", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/services/gmailService.ts:259"}, "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-a95ac73e4767f029", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/gmailService.ts:280", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/gmailService.ts:280"}, "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-7c11a9a8e661ca06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/supportChatService.ts:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/supportChatService.ts:93"}, "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-0d3ee9b87959bd41", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/pdfService.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/pdfService.ts:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4bf56080104a83b8", "name": "Commented-code block (5 lines) in forgedesk/src/services/werkbonPdfService.ts:223", "shortDescription": {"text": "Commented-code block (5 lines) in forgedesk/src/services/werkbonPdfService.ts:223"}, "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-f4a12374f29feeea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/forgieService.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/forgieService.ts:68"}, "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-94937e07621bf5a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/inkoopfactuurService.ts:108", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/inkoopfactuurService.ts:108"}, "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-8bbf802941e5c621", "name": "Commented-code block (6 lines) in forgedesk/src/services/profielService.ts:661", "shortDescription": {"text": "Commented-code block (6 lines) in forgedesk/src/services/profielService.ts:661"}, "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-17bdddedd15083fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 kunstdoekje/src/components/admin/AdminNav.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 kunstdoekje/src/components/admin/AdminNav.tsx:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8cb1b14bb4af7eea", "name": "Legacy-named symbol `kunstdoekje_bekeken_v1` in kunstdoekje/src/lib/kijkgedrag.ts:17", "shortDescription": {"text": "Legacy-named symbol `kunstdoekje_bekeken_v1` in kunstdoekje/src/lib/kijkgedrag.ts:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef76c2ac21e0e2a8", "name": "Legacy-named symbol `kunstdoekje_cart_v1` in kunstdoekje/src/lib/cart.tsx:45", "shortDescription": {"text": "Legacy-named symbol `kunstdoekje_cart_v1` in kunstdoekje/src/lib/cart.tsx:45"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a9b318eb3310b1ca", "name": "Network/subprocess call without timeout or try/except \u2014 .claude/skills/design-system/scripts/slide-token-validator.py:30", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/skills/design-system/scripts/slide-token-validator.py:30"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0fd9b28ab927fb2b", "name": "Commented-code block (5 lines) in .claude/skills/nano-banana-pro/scripts/generate_image.py:2", "shortDescription": {"text": "Commented-code block (5 lines) in .claude/skills/nano-banana-pro/scripts/generate_image.py:2"}, "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-65df07ab4020db79", "name": "18 env vars used in code but missing from .env.example", "shortDescription": {"text": "18 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APP_URL`, `DEV`, `GEMINI_API_KEY`, `GOOGLE_API_KEY`, `LIMIT`, `MODE`, `NODE_ENV`, `OFFSET` + 10 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}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\n.claude/skills/design-system/scripts/slide_search_core.py:tokenize, .claude/skills/design/scripts/logo/core.py:tokenize, .claude/skills/design/scripts/cip/core.py:tokenize, .claude/skills/ui-ux-pro-max/scripts/core.py:tokenize\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\n.claude/skills/design/scripts/icon/generate.py:load_env, .claude/skills/design/scripts/logo/generate.py:load_env\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2186b5415c739eb8", "name": "Frontend route `/check-inbox` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/check-inbox` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a8e9660ca0b027b9", "name": "Frontend route `/wachtwoord-resetten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/wachtwoord-resetten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b38b0ebf0826ffd4", "name": "Frontend route `/goedkeuring/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/goedkeuring/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-692ca54ccb171f23", "name": "Frontend route `/boeken/:userId` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/boeken/:userId` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b2b22b6eb8d2fb2b", "name": "Frontend route `/betalen/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/betalen/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-976b4e525f661bf5", "name": "Frontend route `/betaald` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/betaald` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0263aacbb9f2d972", "name": "Frontend route `/offerte-bekijken/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/offerte-bekijken/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb40ebb5957d9bd8", "name": "Frontend route `/formulier/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/formulier/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5d26487e3d0e57", "name": "Frontend route `/portaal/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/portaal/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-851b3a6ec7e24d5a", "name": "Frontend route `/team-welkom` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `/team-welkom` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-97a107a12c693b2f", "name": "Frontend route `projecten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `projecten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0f850b3647c1a0b7", "name": "Frontend route `projecten/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `projecten/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d27ba7dd89db8178", "name": "Frontend route `projecten/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `projecten/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7affd25badb078ec", "name": "Frontend route `maatjes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `maatjes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9195cd72f23a3256", "name": "Frontend route `klanten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `klanten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4273bc0f031b01c2", "name": "Frontend route `klanten/importeren` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `klanten/importeren` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8041a8bb88b766ed", "name": "Frontend route `klanten/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `klanten/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-32cc719ac7a78978", "name": "Frontend route `deals` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `deals` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a65295005115f370", "name": "Frontend route `deals/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `deals/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-604e1f55875e893c", "name": "Frontend route `offertes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `offertes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a0248a01b65387ac", "name": "Frontend route `offertes/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `offertes/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e30a8689dd4c567", "name": "Frontend route `offertes/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `offertes/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fcd2957c55587ca6", "name": "Frontend route `offertes/:id/bewerken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `offertes/:id/bewerken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d2bc7ccddc066df", "name": "Frontend route `offertes/:id/preview` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `offertes/:id/preview` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1eb33d02bad4d767", "name": "Frontend route `offertes/:id/detail` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `offertes/:id/detail` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7037994450e60223", "name": "Frontend route `inkoopoffertes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `inkoopoffertes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75a46bb3496fc207", "name": "Frontend route `documenten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `documenten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2ef54437ee9183e8", "name": "Frontend route `email` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `email` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-943a9f4f4c6b8771", "name": "Frontend route `email/compose` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `email/compose` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aefc8243e8f4f5ce", "name": "Frontend route `planning` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `planning` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f8b3c84561497c5", "name": "Frontend route `kalender` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `kalender` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4b97722936caaff", "name": "Frontend route `montage` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `montage` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35e72e314186d5d9", "name": "Frontend route `inkoopfacturen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `inkoopfacturen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-abcb5cb353a2274c", "name": "Frontend route `inkoopfacturen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `inkoopfacturen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fec24a985610f38a", "name": "Frontend route `financieel` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `financieel` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c15ba01dac9cf76b", "name": "Frontend route `taken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `taken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3833cc5ee8298853", "name": "Frontend route `facturen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `facturen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a06388ac732a03df", "name": "Frontend route `facturen/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `facturen/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-339b1c3c6ddeedd9", "name": "Frontend route `facturen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `facturen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7ced4b448886df4c", "name": "Frontend route `facturen/:id/bewerken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `facturen/:id/bewerken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dba40c4b71bc8639", "name": "Frontend route `rapportages` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `rapportages` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce2721d4d4175b2c", "name": "Frontend route `tijdregistratie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `tijdregistratie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ab1642a3f308c36d", "name": "Frontend route `nacalculatie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `nacalculatie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a222ea5aa9ce1981", "name": "Frontend route `team` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `team` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e795ea61bfe70068", "name": "Frontend route `importeren` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `importeren` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c0dc6c4ce937217", "name": "Frontend route `ai` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `ai` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e618021d44d439c0", "name": "Frontend route `forgie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `forgie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2102fc3c10ba1b98", "name": "Frontend route `support` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `support` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2352a9bc06db4478", "name": "Frontend route `kennisbank` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `kennisbank` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0e7dd25de50f7b73", "name": "Frontend route `changelog` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `changelog` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f8084a85e6e2222f", "name": "Frontend route `werkbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `werkbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-414aaca724f2289e", "name": "Frontend route `werkbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `werkbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a9fb506250e53a84", "name": "Frontend route `bestelbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `bestelbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fb524f942c3142f8", "name": "Frontend route `bestelbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `bestelbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-80af01a680935809", "name": "Frontend route `leveringsbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `leveringsbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-961f203b0302c067", "name": "Frontend route `leveringsbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `leveringsbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-70efbc9dae0645c0", "name": "Frontend route `voorraad` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `voorraad` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68bcd37de8df5a41", "name": "Frontend route `leads` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `leads` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9191e980daf5e76f", "name": "Frontend route `leads/formulieren/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `leads/formulieren/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-87f6697a36df2571", "name": "Frontend route `leads/formulieren/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `leads/formulieren/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-97ce369cdc573e5f", "name": "Frontend route `leads/inzendingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `leads/inzendingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a166ec6ff40eff1f", "name": "Frontend route `aanvragen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `aanvragen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-164fe35f1eef20c0", "name": "Frontend route `forecast` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `forecast` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3484398adc19684c", "name": "Frontend route `booking` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `booking` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-39a308e99cf67231", "name": "Frontend route `visualizer` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `visualizer` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-508fc0ffdffa121c", "name": "Frontend route `portalen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `portalen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a352916f08345dc7", "name": "Frontend route `meldingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `meldingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c71dd59364f0920c", "name": "Frontend route `instellingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx", "shortDescription": {"text": "Frontend route `instellingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24245"}, "properties": {"repository": "antony-jip/sign-company", "repoUrl": "https://github.com/antony-jip/sign-company", "branch": "main"}, "results": [{"ruleId": "scanner-0788a4c1752587ab", "level": "note", "message": {"text": "Possibly dead Python function: generate_title_slide"}, "properties": {"repobilityId": "439a1d40b9214f59", "scanner": "scanner-primary", "fingerprint": "0788a4c1752587ab", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/scripts/generate-slide.py:411"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c7e9acd90beb5f20", "level": "note", "message": {"text": "Possibly dead Python function: generate_problem_slide"}, "properties": {"repobilityId": "a877bda0bfc222bb", "scanner": "scanner-primary", "fingerprint": "c7e9acd90beb5f20", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/scripts/generate-slide.py:430"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-757f65175217bbd4", "level": "note", "message": {"text": "Possibly dead Python function: generate_solution_slide"}, "properties": {"repobilityId": "fe81965771dbe20b", "scanner": "scanner-primary", "fingerprint": "757f65175217bbd4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/scripts/generate-slide.py:461"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eee8242c9a3e670d", "level": "note", "message": {"text": "Possibly dead Python function: generate_metrics_slide"}, "properties": {"repobilityId": "e88ea02a6e9933f3", "scanner": "scanner-primary", "fingerprint": "eee8242c9a3e670d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/scripts/generate-slide.py:506"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7e13f3797d1c93de", "level": "note", "message": {"text": "Possibly dead Python function: generate_chart_slide"}, "properties": {"repobilityId": "86ef10594147f39c", "scanner": "scanner-primary", "fingerprint": "7e13f3797d1c93de", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/scripts/generate-slide.py:537"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2be8c868587a8cd1", "level": "note", "message": {"text": "Possibly dead Python function: generate_testimonial_slide"}, "properties": {"repobilityId": "08c17cff08d7fe52", "scanner": "scanner-primary", "fingerprint": "2be8c868587a8cd1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/scripts/generate-slide.py:571"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0985f566c6f93168", "level": "note", "message": {"text": "Possibly dead Python function: generate_cta_slide"}, "properties": {"repobilityId": "665644074a26bc47", "scanner": "scanner-primary", "fingerprint": "0985f566c6f93168", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/scripts/generate-slide.py:589"}, "region": {"startLine": 1}}}]}, {"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-eb0dfbbc13e6a242", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/EditorialMasthead.tsx:55"}, "properties": {"repobilityId": "d358d799ee5ad137", "scanner": "scanner-primary", "fingerprint": "eb0dfbbc13e6a242", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22e17d8b629b6024", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/home/AppShowcase.tsx:734"}, "properties": {"repobilityId": "eb0e8e14f24a94cb", "scanner": "scanner-primary", "fingerprint": "22e17d8b629b6024", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7770f41ffb042a8b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/home/AppShowcase.tsx:420"}, "properties": {"repobilityId": "646060dfccc21ff3", "scanner": "scanner-primary", "fingerprint": "7770f41ffb042a8b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8c99039316978257", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/home/StatsStrip.tsx:6"}, "properties": {"repobilityId": "2f20834b761a740b", "scanner": "scanner-primary", "fingerprint": "8c99039316978257", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-072811bdd2b8aebd", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/home/TrustLogos.tsx:6"}, "properties": {"repobilityId": "bbd4e1abd171ccdb", "scanner": "scanner-primary", "fingerprint": "072811bdd2b8aebd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-70e13999d55adb7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pages/FeaturesContent.tsx:1185"}, "properties": {"repobilityId": "677f9aca0d1e042b", "scanner": "scanner-primary", "fingerprint": "70e13999d55adb7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83f79e169a4236af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/pages/HoeHetWerktContent.tsx:172"}, "properties": {"repobilityId": "1bc5842fe153a5dd", "scanner": "scanner-primary", "fingerprint": "83f79e169a4236af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c11a4f15756ba64e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/mockups/ModuleMockups.tsx:57"}, "properties": {"repobilityId": "0068c39a2a3fd44f", "scanner": "scanner-primary", "fingerprint": "c11a4f15756ba64e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ad83a0a7e5dc18f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/portaal-reactie.ts:245"}, "properties": {"repobilityId": "b1a2de951920d4d6", "scanner": "scanner-primary", "fingerprint": "9ad83a0a7e5dc18f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4182f669ea71108f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/inkoopfactuur-extract.ts:269"}, "properties": {"repobilityId": "aeb4ee975f0774b1", "scanner": "scanner-primary", "fingerprint": "4182f669ea71108f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a136ea34bbf9f3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/portaal-items-get.ts:122"}, "properties": {"repobilityId": "2a702f3f380a4321", "scanner": "scanner-primary", "fingerprint": "5a136ea34bbf9f3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56726c6792b64175", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/fetch-emails.ts:213"}, "properties": {"repobilityId": "5ee9f8e793720b00", "scanner": "scanner-primary", "fingerprint": "56726c6792b64175", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81f9442085172f9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/send-email.ts:230"}, "properties": {"repobilityId": "eda1a8258549bc62", "scanner": "scanner-primary", "fingerprint": "81f9442085172f9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a59d28d7cce6bc8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/resend-notify.ts:29"}, "properties": {"repobilityId": "38625948dde0b6c9", "scanner": "scanner-primary", "fingerprint": "4a59d28d7cce6bc8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7178e81434b27e74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/mollie-webhook.ts:166"}, "properties": {"repobilityId": "95ea1ebd4fa4afd4", "scanner": "scanner-primary", "fingerprint": "7178e81434b27e74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5209e208242b7122", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/stripe-webhook.ts:38"}, "properties": {"repobilityId": "3efdfa490097b1eb", "scanner": "scanner-primary", "fingerprint": "5209e208242b7122", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7246f8426eab844d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/cron-verzend-geplande-berichten.ts:111"}, "properties": {"repobilityId": "5e6635b59d01fb39", "scanner": "scanner-primary", "fingerprint": "7246f8426eab844d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-63cc41b2743f03a3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/offerte-accepteren.ts:250"}, "properties": {"repobilityId": "96c22c3485242e6f", "scanner": "scanner-primary", "fingerprint": "63cc41b2743f03a3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-389c199cf237ecce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/test-email-connection.ts:50"}, "properties": {"repobilityId": "345c8d19c67f58c4", "scanner": "scanner-primary", "fingerprint": "389c199cf237ecce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-864b170415582e9b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/email-settings.ts:119"}, "properties": {"repobilityId": "d6cf0cb66d11e75a", "scanner": "scanner-primary", "fingerprint": "864b170415582e9b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3dcf780635b70aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/api/cron-trial-expiration.ts:68"}, "properties": {"repobilityId": "ea0d5ced1f82dd65", "scanner": "scanner-primary", "fingerprint": "a3dcf780635b70aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b1610f2534a75ff1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/scripts/cleanup-inkoopfacturen.ts:62"}, "properties": {"repobilityId": "983c8307ecdd4386", "scanner": "scanner-primary", "fingerprint": "b1610f2534a75ff1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c6eea4cced7f4a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/src/utils/logger.ts:5"}, "properties": {"repobilityId": "275f39e3c4dd0f5b", "scanner": "scanner-primary", "fingerprint": "3c6eea4cced7f4a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d768b235ad6c3cc3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 forgedesk/src/utils/auditLogger.ts:4"}, "properties": {"repobilityId": "cabf45e0649194bc", "scanner": "scanner-primary", "fingerprint": "d768b235ad6c3cc3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6b0fec9a5e419ba3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/inkoopfacturen/InkoopfacturenLayout.tsx:484"}, "properties": {"repobilityId": "16e18899c79be37c", "scanner": "scanner-primary", "fingerprint": "6b0fec9a5e419ba3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ba11e90bb95e8cdd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/OpvolgenBlok.tsx:51"}, "properties": {"repobilityId": "d2a8c11718b91db1", "scanner": "scanner-primary", "fingerprint": "ba11e90bb95e8cdd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fa1485a4b1fe3e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/ActiviteitLog.tsx:138"}, "properties": {"repobilityId": "de275bd271a6cf7f", "scanner": "scanner-primary", "fingerprint": "1fa1485a4b1fe3e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6b36c437e8f26c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/RightRail.tsx:161"}, "properties": {"repobilityId": "70952f3d5d1bf8f6", "scanner": "scanner-primary", "fingerprint": "d6b36c437e8f26c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56c6833c2af4ba39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/dashboard/VandaagBlok.tsx:410"}, "properties": {"repobilityId": "d409487449e74eed", "scanner": "scanner-primary", "fingerprint": "56c6833c2af4ba39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b236a9eb30dfe5af", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/clients/KlantAIChat.tsx:665"}, "properties": {"repobilityId": "9cfd09f99bea8fc2", "scanner": "scanner-primary", "fingerprint": "b236a9eb30dfe5af", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e74544233da1e9c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/AddEditClient.tsx:388"}, "properties": {"repobilityId": "2f02330f65b16637", "scanner": "scanner-primary", "fingerprint": "e74544233da1e9c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec13dfc589ec91a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientProfile.tsx:696"}, "properties": {"repobilityId": "009106e715caca8f", "scanner": "scanner-primary", "fingerprint": "ec13dfc589ec91a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63caa039f0224bf5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientCard.tsx:83"}, "properties": {"repobilityId": "597136bf2b0c8a6d", "scanner": "scanner-primary", "fingerprint": "63caa039f0224bf5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f90293a8955e0fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/DealsLayout.tsx:297"}, "properties": {"repobilityId": "24db00d0a9629618", "scanner": "scanner-primary", "fingerprint": "7f90293a8955e0fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cddbd036e00f3fa3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/clients/ClientsLayout.tsx:404"}, "properties": {"repobilityId": "418ba0bba5df964b", "scanner": "scanner-primary", "fingerprint": "cddbd036e00f3fa3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9cf672dc434fba32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/leveringsbonnen/LeveringsbonnenLayout.tsx:241"}, "properties": {"repobilityId": "3e821dd79cb5c8d4", "scanner": "scanner-primary", "fingerprint": "9cf672dc434fba32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9066a11b41cd4665", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/leveringsbonnen/PakbonVanProjectDialog.tsx:227"}, "properties": {"repobilityId": "bfbfdd6afcd268da", "scanner": "scanner-primary", "fingerprint": "9066a11b41cd4665", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a08414b45ac1916", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/support/SupportInboxPage.tsx:226"}, "properties": {"repobilityId": "a7cc1ffd45799ca6", "scanner": "scanner-primary", "fingerprint": "6a08414b45ac1916", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5ed728d40370e30d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/Header.tsx:95"}, "properties": {"repobilityId": "6758062deb6f6dfd", "scanner": "scanner-primary", "fingerprint": "5ed728d40370e30d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d6d811318541b94", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/TopNav.tsx:373"}, "properties": {"repobilityId": "1d3af30138666b88", "scanner": "scanner-primary", "fingerprint": "9d6d811318541b94", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-790b7c6294264e14", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/Sidebar.tsx:510"}, "properties": {"repobilityId": "6b564b5dd7f5e393", "scanner": "scanner-primary", "fingerprint": "790b7c6294264e14", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e3ae7096346cc57", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/layouts/TabBar.tsx:36"}, "properties": {"repobilityId": "5d959162923492c5", "scanner": "scanner-primary", "fingerprint": "2e3ae7096346cc57", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33c5ea2bdee20809", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/website/WebsiteChatTab.tsx:203"}, "properties": {"repobilityId": "68795343453794be", "scanner": "scanner-primary", "fingerprint": "33c5ea2bdee20809", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0df66b6dddce439e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonnenLayout.tsx:355"}, "properties": {"repobilityId": "c6526a37ccb36e62", "scanner": "scanner-primary", "fingerprint": "0df66b6dddce439e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d749f9922cb57eef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonVanProjectDialog.tsx:273"}, "properties": {"repobilityId": "377ec270e3d60682", "scanner": "scanner-primary", "fingerprint": "d749f9922cb57eef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-821cf20128739c14", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonMonteurView.tsx:354"}, "properties": {"repobilityId": "4bb714a86aef0efa", "scanner": "scanner-primary", "fingerprint": "821cf20128739c14", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a33b8d7252abe2b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonnenLayoutMobile.tsx:230"}, "properties": {"repobilityId": "f37a8f7ec75ce2b3", "scanner": "scanner-primary", "fingerprint": "a33b8d7252abe2b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3395fe2c125e3514", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonAanmaakDialog.tsx:181"}, "properties": {"repobilityId": "570fb5f8a009adb1", "scanner": "scanner-primary", "fingerprint": "3395fe2c125e3514", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3612f03c9bda7674", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/werkbonnen/WerkbonItemCard.tsx:323"}, "properties": {"repobilityId": "8f8f5ddf214728c8", "scanner": "scanner-primary", "fingerprint": "3612f03c9bda7674", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f020cfcba96c957c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/UitgavenLayout.tsx:409"}, "properties": {"repobilityId": "10d0dc7faed899e5", "scanner": "scanner-primary", "fingerprint": "f020cfcba96c957c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da4b069851bd98dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/FinancialLayout.tsx:272"}, "properties": {"repobilityId": "de34de07f2dec751", "scanner": "scanner-primary", "fingerprint": "da4b069851bd98dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1cf65f945aadd61", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/VoorraadLayout.tsx:446"}, "properties": {"repobilityId": "186b60227beeba4d", "scanner": "scanner-primary", "fingerprint": "f1cf65f945aadd61", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-261b49379fa0b87c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/financial/DiscountsSettings.tsx:224"}, "properties": {"repobilityId": "5540b3a352bfd938", "scanner": "scanner-primary", "fingerprint": "261b49379fa0b87c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4409f09cc9661937", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/reports/RapportagesLayout.tsx:1038"}, "properties": {"repobilityId": "44d666f339200170", "scanner": "scanner-primary", "fingerprint": "4409f09cc9661937", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71348ce36796104f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/auth/ModuleMockups.tsx:57"}, "properties": {"repobilityId": "b35fef7e9275982d", "scanner": "scanner-primary", "fingerprint": "71348ce36796104f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25e273e67ec745b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailContextSidebar.tsx:474"}, "properties": {"repobilityId": "48642ad696cba463", "scanner": "scanner-primary", "fingerprint": "25e273e67ec745b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be34526c480062b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailProjectKoppelingPanel.tsx:167"}, "properties": {"repobilityId": "a54d11d23e406e71", "scanner": "scanner-primary", "fingerprint": "be34526c480062b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca2c5687c1d8772d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailCRMSidebar.tsx:307"}, "properties": {"repobilityId": "1dc0363cfbaeae04", "scanner": "scanner-primary", "fingerprint": "ca2c5687c1d8772d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8127c7f160211b58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailReader.tsx:1110"}, "properties": {"repobilityId": "a767d492c5340aee", "scanner": "scanner-primary", "fingerprint": "8127c7f160211b58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cc4ab51b6403864a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/email/EmailReader.tsx:1659"}, "properties": {"repobilityId": "9cb0886ad4ab3aac", "scanner": "scanner-primary", "fingerprint": "cc4ab51b6403864a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4e0b16a10b8496f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailComposePage.tsx:281"}, "properties": {"repobilityId": "9e28658b8d418b8a", "scanner": "scanner-primary", "fingerprint": "4e0b16a10b8496f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f05b94575ff269ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailActionsPopover.tsx:304"}, "properties": {"repobilityId": "cd38a71a183c169a", "scanner": "scanner-primary", "fingerprint": "f05b94575ff269ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-336d86ea813ab3e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailCompose.tsx:705"}, "properties": {"repobilityId": "94b85d40e7f16d1c", "scanner": "scanner-primary", "fingerprint": "336d86ea813ab3e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-486f75a7284a9f71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/IngeplandeBerichtenLijst.tsx:129"}, "properties": {"repobilityId": "a0cbfab0ab11988e", "scanner": "scanner-primary", "fingerprint": "486f75a7284a9f71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a69c100b51b07751", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailListItem.tsx:448"}, "properties": {"repobilityId": "326941bbe2055691", "scanner": "scanner-primary", "fingerprint": "a69c100b51b07751", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1734961aedfa31c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailLayout.tsx:1583"}, "properties": {"repobilityId": "8bf6465aa34750c3", "scanner": "scanner-primary", "fingerprint": "1734961aedfa31c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a44fc184d0aae528", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/email/EmailTemplates.tsx:149"}, "properties": {"repobilityId": "78fd2e40de5fca4a", "scanner": "scanner-primary", "fingerprint": "a44fc184d0aae528", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f50c9fd5e8236080", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/ClientApprovalPage.tsx:546"}, "properties": {"repobilityId": "a91d09302a4df933", "scanner": "scanner-primary", "fingerprint": "f50c9fd5e8236080", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36328d0bf1956e94", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalHeader.tsx:64"}, "properties": {"repobilityId": "910c4ca44ab0bb74", "scanner": "scanner-primary", "fingerprint": "36328d0bf1956e94", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3d64a1aaa7120e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortalenOverzicht.tsx:413"}, "properties": {"repobilityId": "e6cadeb6914384e3", "scanner": "scanner-primary", "fingerprint": "f3d64a1aaa7120e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-858db77190657ecc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalFeedItemTekening.tsx:142"}, "properties": {"repobilityId": "0f87080b0b29e2ab", "scanner": "scanner-primary", "fingerprint": "858db77190657ecc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-632f9b3943933032", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalSidebar.tsx:207"}, "properties": {"repobilityId": "26f7326097221bf3", "scanner": "scanner-primary", "fingerprint": "632f9b3943933032", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e50e75b0755dfe0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/portaal/PortaalFeedItemOfferte.tsx:95"}, "properties": {"repobilityId": "1717adb54626fc12", "scanner": "scanner-primary", "fingerprint": "4e50e75b0755dfe0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b2485a66ad423a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/TeamledenTab.tsx:527"}, "properties": {"repobilityId": "8aa047000f7c7676", "scanner": "scanner-primary", "fingerprint": "6b2485a66ad423a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8c994a62aed8493", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/SettingsLayout.tsx:210"}, "properties": {"repobilityId": "0b35c7836be57833", "scanner": "scanner-primary", "fingerprint": "f8c994a62aed8493", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13709453ecaa27aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/EmailTab.tsx:205"}, "properties": {"repobilityId": "6a63f05a0f541d98", "scanner": "scanner-primary", "fingerprint": "13709453ecaa27aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68caf6491f8fb37a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/KostenplaatsenTab.tsx:172"}, "properties": {"repobilityId": "2ef7dfd1ca212159", "scanner": "scanner-primary", "fingerprint": "68caf6491f8fb37a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-95870fad673f6d5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/ProfielTab.tsx:125"}, "properties": {"repobilityId": "04a4e52a1835becb", "scanner": "scanner-primary", "fingerprint": "95870fad673f6d5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67962dcc19603e2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/VisualizerTab.tsx:470"}, "properties": {"repobilityId": "a82ffedffe43e15b", "scanner": "scanner-primary", "fingerprint": "67962dcc19603e2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3d2b0bc5db7325f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/ForgieTab.tsx:547"}, "properties": {"repobilityId": "6c6638625512e2bd", "scanner": "scanner-primary", "fingerprint": "e3d2b0bc5db7325f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52ef5f745134bb84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/TeamLayout.tsx:742"}, "properties": {"repobilityId": "dd3869b2e845037f", "scanner": "scanner-primary", "fingerprint": "52ef5f745134bb84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-013da72b8a77c9a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/KennisbankTab.tsx:411"}, "properties": {"repobilityId": "c9014fa015ac3f25", "scanner": "scanner-primary", "fingerprint": "013da72b8a77c9a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75aea2bd7ae92df7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/communicatie/OfferteOpvolgingSubTab.tsx:426"}, "properties": {"repobilityId": "a0e1152c3cd8f0a6", "scanner": "scanner-primary", "fingerprint": "75aea2bd7ae92df7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d9635ea4e27249dc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/settings/communicatie/TemplatesSubTab.tsx:52"}, "properties": {"repobilityId": "9956e7a3fc5611e5", "scanner": "scanner-primary", "fingerprint": "d9635ea4e27249dc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de09b2d17276e3f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/ProjectMaatjesTab.tsx:37"}, "properties": {"repobilityId": "f2eac60aa5cd3746", "scanner": "scanner-primary", "fingerprint": "de09b2d17276e3f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-89a70751f24b648d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeBeheer.tsx:68"}, "properties": {"repobilityId": "b78da0cc54ee3073", "scanner": "scanner-primary", "fingerprint": "89a70751f24b648d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-426fd1a5c434ff14", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeKladblok.tsx:70"}, "properties": {"repobilityId": "cdf87ecc3c86f0c6", "scanner": "scanner-primary", "fingerprint": "426fd1a5c434ff14", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-724484af6ac3240c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/maatjes/MaatjeKoppelSheet.tsx:148"}, "properties": {"repobilityId": "918ddb70f782369a", "scanner": "scanner-primary", "fingerprint": "724484af6ac3240c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e13c4c55b139a4db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/InkoopOffertePaneel.tsx:505"}, "properties": {"repobilityId": "ee3dc2cb36b01ee9", "scanner": "scanner-primary", "fingerprint": "e13c4c55b139a4db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a45d0353b29e852d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/InkoopOffertesPage.tsx:148"}, "properties": {"repobilityId": "6716e509d9ccefde", "scanner": "scanner-primary", "fingerprint": "a45d0353b29e852d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36ddb602cb8305f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteSidebar.tsx:297"}, "properties": {"repobilityId": "ca01884c97c5bff0", "scanner": "scanner-primary", "fingerprint": "36ddb602cb8305f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e157314d87b15ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/OffertePubliekPagina.tsx:933"}, "properties": {"repobilityId": "509cc0be7632957d", "scanner": "scanner-primary", "fingerprint": "2e157314d87b15ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fcd8fe3098f1a521", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteHeader.tsx:163"}, "properties": {"repobilityId": "1c0ee56c65f354ae", "scanner": "scanner-primary", "fingerprint": "fcd8fe3098f1a521", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c852fe4920637d6e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/AutofillInput.tsx:185"}, "properties": {"repobilityId": "ec45ca74778ec29b", "scanner": "scanner-primary", "fingerprint": "c852fe4920637d6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c522b1c97bff3380", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/ForgeQuotePreview.tsx:366"}, "properties": {"repobilityId": "e366f795351dd9ea", "scanner": "scanner-primary", "fingerprint": "c522b1c97bff3380", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d23a16b1a1046de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/CustomerSelector.tsx:251"}, "properties": {"repobilityId": "b0c757a7fc27731b", "scanner": "scanner-primary", "fingerprint": "6d23a16b1a1046de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47bd805490c2d5d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuotesPipeline.tsx:904"}, "properties": {"repobilityId": "c69a8460ad351a8c", "scanner": "scanner-primary", "fingerprint": "47bd805490c2d5d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc93853f4a9dca8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/QuoteItemsTable.tsx:342"}, "properties": {"repobilityId": "01fcc6ccb08c9a37", "scanner": "scanner-primary", "fingerprint": "dc93853f4a9dca8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-035bd095fbd0d0ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quotes/RegelTemplateEditor.tsx:211"}, "properties": {"repobilityId": "10c04b5532e27b1e", "scanner": "scanner-primary", "fingerprint": "035bd095fbd0d0ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83db5122f810e606", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/KlantContactSelector.tsx:310"}, "properties": {"repobilityId": "6aea3d6f9b706f95", "scanner": "scanner-primary", "fingerprint": "83db5122f810e606", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4355e6d95578f2f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/CommandPalette.tsx:415"}, "properties": {"repobilityId": "9d6fa2b34e9bc014", "scanner": "scanner-primary", "fingerprint": "4355e6d95578f2f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6cf1d7041afdd189", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/MedewerkerFilterCombobox.tsx:65"}, "properties": {"repobilityId": "c5294d091f5b5bab", "scanner": "scanner-primary", "fingerprint": "6cf1d7041afdd189", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3137343a4de63510", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/MedewerkerSelector.tsx:201"}, "properties": {"repobilityId": "3f553e66120cb695", "scanner": "scanner-primary", "fingerprint": "3137343a4de63510", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26e404a92f1dc2ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/GlobalSearch.tsx:551"}, "properties": {"repobilityId": "ecd493a4bcbe5835", "scanner": "scanner-primary", "fingerprint": "26e404a92f1dc2ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78cb89cce408789d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/shared/ModuleHeader.tsx:38"}, "properties": {"repobilityId": "4dff9e11419b4eb6", "scanner": "scanner-primary", "fingerprint": "78cb89cce408789d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bd56b8217072f95", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/notifications/NotificatieCenter.tsx:220"}, "properties": {"repobilityId": "7e0819b1eabc3f6a", "scanner": "scanner-primary", "fingerprint": "2bd56b8217072f95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6260929077025c8b", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuweKlantModal.tsx:170"}, "properties": {"repobilityId": "b641a365ad4cb0e0", "scanner": "scanner-primary", "fingerprint": "6260929077025c8b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c16f247d8106d344", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuweKlantModal.tsx:169"}, "properties": {"repobilityId": "cdac88b4f3278272", "scanner": "scanner-primary", "fingerprint": "c16f247d8106d344", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ceaeb02b09efcb7f", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuweOfferteModal.tsx:476"}, "properties": {"repobilityId": "9df6f1c3bf98f229", "scanner": "scanner-primary", "fingerprint": "ceaeb02b09efcb7f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c21961c2b434633d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuweOfferteModal.tsx:475"}, "properties": {"repobilityId": "b07fc66080c510b1", "scanner": "scanner-primary", "fingerprint": "c21961c2b434633d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-696ff74233bf8f40", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 forgedesk/src/components/quick-actions/NieuwProjectModal.tsx:103"}, "properties": {"repobilityId": "8c0ce78197acf68b", "scanner": "scanner-primary", "fingerprint": "696ff74233bf8f40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f25e32fcaacd08ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/quick-actions/NieuwProjectModal.tsx:102"}, "properties": {"repobilityId": "9e5d0cc24aa21215", "scanner": "scanner-primary", "fingerprint": "f25e32fcaacd08ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a58e8931777a3a4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/forgie/FORGEdeskAIChat.tsx:803"}, "properties": {"repobilityId": "817fec34a6507f77", "scanner": "scanner-primary", "fingerprint": "9a58e8931777a3a4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-150147aba0f426c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/forgie/ForgieChatWidget.tsx:643"}, "properties": {"repobilityId": "e82c8b803a40ab2e", "scanner": "scanner-primary", "fingerprint": "150147aba0f426c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39aba97e828665d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectDetail.tsx:1403"}, "properties": {"repobilityId": "0663c06d3728bf61", "scanner": "scanner-primary", "fingerprint": "39aba97e828665d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b48e8678813e0dc6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 forgedesk/src/components/projects/ProjectDetail.tsx:2284"}, "properties": {"repobilityId": "20fae970095696b9", "scanner": "scanner-primary", "fingerprint": "b48e8678813e0dc6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a52b1f04269e9157", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TimelineView.tsx:149"}, "properties": {"repobilityId": "7c2a2d79881dadd6", "scanner": "scanner-primary", "fingerprint": "a52b1f04269e9157", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d92eaa0bafe933b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/NacalculatieLayout.tsx:627"}, "properties": {"repobilityId": "ab32fd0598feaf30", "scanner": "scanner-primary", "fingerprint": "0d92eaa0bafe933b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d1d56076b753ea03", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectPhotoGallery.tsx:314"}, "properties": {"repobilityId": "2c5a1a3b6a72285c", "scanner": "scanner-primary", "fingerprint": "d1d56076b753ea03", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d0a758b4aabeb98d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TeamAvailability.tsx:66"}, "properties": {"repobilityId": "84e237c8ec51b4d0", "scanner": "scanner-primary", "fingerprint": "d0a758b4aabeb98d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb1366c959a182a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectMailComposer.tsx:804"}, "properties": {"repobilityId": "154a55099ee32e4f", "scanner": "scanner-primary", "fingerprint": "bb1366c959a182a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d7deb9923736a6a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectPortaalTab.tsx:699"}, "properties": {"repobilityId": "eb3528548dc2c7fe", "scanner": "scanner-primary", "fingerprint": "1d7deb9923736a6a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-980aaed2e9b86504", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/TijdregistratieLayout.tsx:1074"}, "properties": {"repobilityId": "d314fe44da8821d1", "scanner": "scanner-primary", "fingerprint": "980aaed2e9b86504", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-498e421f8a7d561b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/ProjectsList.tsx:969"}, "properties": {"repobilityId": "951220c9edd70945", "scanner": "scanner-primary", "fingerprint": "498e421f8a7d561b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c32c2b9758714438", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:468"}, "properties": {"repobilityId": "eb9e13ec36827ff3", "scanner": "scanner-primary", "fingerprint": "c32c2b9758714438", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1c2a3ac3f147e1f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:697"}, "properties": {"repobilityId": "dd0ee925d7e64bde", "scanner": "scanner-primary", "fingerprint": "c1c2a3ac3f147e1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-913816e12e0a77e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/ProjectKaart.tsx:273"}, "properties": {"repobilityId": "43529d5adc3c4331", "scanner": "scanner-primary", "fingerprint": "913816e12e0a77e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e6c3de9941c3c54", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/PortaalPanel.tsx:84"}, "properties": {"repobilityId": "36e49e2e491f4ea8", "scanner": "scanner-primary", "fingerprint": "4e6c3de9941c3c54", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-521156fa3468070c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/MontageSection.tsx:67"}, "properties": {"repobilityId": "2e9592d29b756e29", "scanner": "scanner-primary", "fingerprint": "521156fa3468070c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61b99bb1b6490b7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/KlantCard.tsx:194"}, "properties": {"repobilityId": "5701b34abbc28637", "scanner": "scanner-primary", "fingerprint": "61b99bb1b6490b7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fad75edfc6ec3dd2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/BestandenSection.tsx:155"}, "properties": {"repobilityId": "7104505c836fcb18", "scanner": "scanner-primary", "fingerprint": "fad75edfc6ec3dd2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2f30bd38dd7f1b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/ActiesCard.tsx:83"}, "properties": {"repobilityId": "1cd22434ce04a552", "scanner": "scanner-primary", "fingerprint": "a2f30bd38dd7f1b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15b39d2012bef51f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/TakenOfferteGrid.tsx:176"}, "properties": {"repobilityId": "3ec2f461dd1733d9", "scanner": "scanner-primary", "fingerprint": "15b39d2012bef51f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f42d2c1e6d12356b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/projects/cockpit/portaal/PortaalSidebarActions.tsx:399"}, "properties": {"repobilityId": "0e5ef97e3d395a0f", "scanner": "scanner-primary", "fingerprint": "f42d2c1e6d12356b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7c393a1f8b1d9c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/invoices/FacturenLayout.tsx:1547"}, "properties": {"repobilityId": "472eb862356404c4", "scanner": "scanner-primary", "fingerprint": "a7c393a1f8b1d9c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e9cdd4d5e12e2f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/invoices/FactuurEditor.tsx:1841"}, "properties": {"repobilityId": "f916b39c2cc61ec2", "scanner": "scanner-primary", "fingerprint": "0e9cdd4d5e12e2f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b7263565e9770f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/DayView.tsx:144"}, "properties": {"repobilityId": "374fd98191f294ff", "scanner": "scanner-primary", "fingerprint": "2b7263565e9770f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7a066bd445315123", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/WeekView.tsx:173"}, "properties": {"repobilityId": "caa97bd919288c2c", "scanner": "scanner-primary", "fingerprint": "7a066bd445315123", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7aaf5b18ac4cd45f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MontagePlanningLayout.tsx:354"}, "properties": {"repobilityId": "66256fd42b20911b", "scanner": "scanner-primary", "fingerprint": "7aaf5b18ac4cd45f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29807919f4d78471", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MontagePlanningLayoutMobile.tsx:134"}, "properties": {"repobilityId": "63278efd3add1418", "scanner": "scanner-primary", "fingerprint": "29807919f4d78471", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64f2c6eb81809547", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/BookingBeheer.tsx:111"}, "properties": {"repobilityId": "62e96c92e06d2a4c", "scanner": "scanner-primary", "fingerprint": "64f2c6eb81809547", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69fd6dfabfa8cf03", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/AfwezigheidPopover.tsx:305"}, "properties": {"repobilityId": "de17615df197b4fd", "scanner": "scanner-primary", "fingerprint": "69fd6dfabfa8cf03", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f7dabe6c65d219d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/TakenBulkActionBar.tsx:192"}, "properties": {"repobilityId": "c59eb86b9e6dd539", "scanner": "scanner-primary", "fingerprint": "2f7dabe6c65d219d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d07743927e45232d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/TasksLayout.tsx:1713"}, "properties": {"repobilityId": "d2d5c895a5f5f170", "scanner": "scanner-primary", "fingerprint": "d07743927e45232d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0feb412c916e57ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/planning/MonthView.tsx:109"}, "properties": {"repobilityId": "e0a4a2ac3eafea71", "scanner": "scanner-primary", "fingerprint": "0feb412c916e57ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e0a1800554b6463", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/import/DataImportPage.tsx:193"}, "properties": {"repobilityId": "878420f96c22b1f0", "scanner": "scanner-primary", "fingerprint": "1e0a1800554b6463", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b587b2d81e573b41", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/import/LosseContacten.tsx:442"}, "properties": {"repobilityId": "a354c24ff74dcfef", "scanner": "scanner-primary", "fingerprint": "b587b2d81e573b41", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7e29751cd48c2af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentUpload.tsx:212"}, "properties": {"repobilityId": "cdeaa9c497e61ba5", "scanner": "scanner-primary", "fingerprint": "e7e29751cd48c2af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-97b6ae23c49078eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentFolders.tsx:63"}, "properties": {"repobilityId": "3717ebcca5891d76", "scanner": "scanner-primary", "fingerprint": "97b6ae23c49078eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d16413719f136406", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentsPipeline.tsx:71"}, "properties": {"repobilityId": "4313cec81536bbaa", "scanner": "scanner-primary", "fingerprint": "d16413719f136406", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-375ba4ed71ed71af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/documents/DocumentsLayout.tsx:392"}, "properties": {"repobilityId": "796a916c8f91f51d", "scanner": "scanner-primary", "fingerprint": "375ba4ed71ed71af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ad4c735fa3d7d50", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 forgedesk/src/components/ui/date-picker.tsx:134"}, "properties": {"repobilityId": "36561e1719cf6d5c", "scanner": "scanner-primary", "fingerprint": "6ad4c735fa3d7d50", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8e9b15b068f5a71", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/src/services/portaalNotificatieService.ts:320"}, "properties": {"repobilityId": "8c9bdaa8a2aff8df", "scanner": "scanner-primary", "fingerprint": "f8e9b15b068f5a71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-51ebd67ed22d785b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 forgedesk/src/services/profielService.ts:518"}, "properties": {"repobilityId": "0a7bd88ff335dd72", "scanner": "scanner-primary", "fingerprint": "51ebd67ed22d785b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e3054cbc5114781", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/import-woocommerce.ts:71"}, "properties": {"repobilityId": "ce9e109b52712ff9", "scanner": "scanner-primary", "fingerprint": "0e3054cbc5114781", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a0f1b834a30f0b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/migrate-images.ts:63"}, "properties": {"repobilityId": "49bfed4edf3aeb7b", "scanner": "scanner-primary", "fingerprint": "9a0f1b834a30f0b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7afbaf3b9ef43af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/migrate-gallery.ts:132"}, "properties": {"repobilityId": "7fbc1de2076225d3", "scanner": "scanner-primary", "fingerprint": "c7afbaf3b9ef43af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43c68262e239f358", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/backfill-sku.ts:43"}, "properties": {"repobilityId": "35caa070e2eada53", "scanner": "scanner-primary", "fingerprint": "43c68262e239f358", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7e75d799d10b6fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 kunstdoekje/scripts/fix-categorienamen.ts:36"}, "properties": {"repobilityId": "7922a2f6526745e3", "scanner": "scanner-primary", "fingerprint": "c7e75d799d10b6fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ce4f1d5d15e25dc", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 kunstdoekje/src/app/layout.tsx:93"}, "properties": {"repobilityId": "a75739831c0489f9", "scanner": "scanner-primary", "fingerprint": "1ce4f1d5d15e25dc", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-589bb474027700ff", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 kunstdoekje/src/app/product/[slug]/page.tsx:94"}, "properties": {"repobilityId": "abf847395cef9e2f", "scanner": "scanner-primary", "fingerprint": "589bb474027700ff", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-befa161623a889fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/Configurator.tsx:279"}, "properties": {"repobilityId": "67813446017b0ff8", "scanner": "scanner-primary", "fingerprint": "befa161623a889fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-15d3f42b5f5df4d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/VoorJou.tsx:72"}, "properties": {"repobilityId": "da9edb968507ba81", "scanner": "scanner-primary", "fingerprint": "15d3f42b5f5df4d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1207e22d69160871", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/ProductCard.tsx:62"}, "properties": {"repobilityId": "25f25468fb795ca1", "scanner": "scanner-primary", "fingerprint": "1207e22d69160871", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fd4a4d315bb870e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 kunstdoekje/src/components/ShopGrid.tsx:128"}, "properties": {"repobilityId": "59392de1f03ae998", "scanner": "scanner-primary", "fingerprint": "1fd4a4d315bb870e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-612d89d7fafd30ec", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/home/AppShowcase.tsx:420"}, "properties": {"repobilityId": "cb67d2b15d617161", "scanner": "scanner-primary", "fingerprint": "612d89d7fafd30ec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/home/AppShowcase.tsx"}, "region": {"startLine": 420}}}]}, {"ruleId": "scanner-92ed9c249a08da99", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/main.tsx:82"}, "properties": {"repobilityId": "3683798345618de2", "scanner": "scanner-primary", "fingerprint": "92ed9c249a08da99", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/main.tsx"}, "region": {"startLine": 82}}}]}, {"ruleId": "scanner-64d20f36a7e990c8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/clients/KlantAIChat.tsx:665"}, "properties": {"repobilityId": "257cfc9342aecd56", "scanner": "scanner-primary", "fingerprint": "64d20f36a7e990c8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/clients/KlantAIChat.tsx"}, "region": {"startLine": 665}}}]}, {"ruleId": "scanner-2910a56cc1778593", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/email/EmailReader.tsx:1659"}, "properties": {"repobilityId": "de75896a1048f0fe", "scanner": "scanner-primary", "fingerprint": "2910a56cc1778593", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/email/EmailReader.tsx"}, "region": {"startLine": 1659}}}]}, {"ruleId": "scanner-0fe3706d7912d0af", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailReader.tsx:607"}, "properties": {"repobilityId": "32b80f31f9b49672", "scanner": "scanner-primary", "fingerprint": "0fe3706d7912d0af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/email/EmailReader.tsx"}, "region": {"startLine": 607}}}]}, {"ruleId": "scanner-fd300086c1c8a3a7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailComposePage.tsx:124"}, "properties": {"repobilityId": "10e4e07a5e662a76", "scanner": "scanner-primary", "fingerprint": "fd300086c1c8a3a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/email/EmailComposePage.tsx"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-04a6896f8a8e5c57", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/email/EmailCompose.tsx:217"}, "properties": {"repobilityId": "1a31bc4587538421", "scanner": "scanner-primary", "fingerprint": "04a6896f8a8e5c57", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/email/EmailCompose.tsx"}, "region": {"startLine": 217}}}]}, {"ruleId": "scanner-c44a789023f0ac1e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/forgie/FORGEdeskAIChat.tsx:803"}, "properties": {"repobilityId": "8469a69866ac2a9c", "scanner": "scanner-primary", "fingerprint": "c44a789023f0ac1e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/forgie/FORGEdeskAIChat.tsx"}, "region": {"startLine": 803}}}]}, {"ruleId": "scanner-485956fb0b4dee7b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in forgedesk/src/components/projects/ProjectDetail.tsx:2284"}, "properties": {"repobilityId": "ae746c3a866708a5", "scanner": "scanner-primary", "fingerprint": "485956fb0b4dee7b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/projects/ProjectDetail.tsx"}, "region": {"startLine": 2284}}}]}, {"ruleId": "scanner-34cbddd0db018ed9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx:386"}, "properties": {"repobilityId": "3782b8a97ce6a0c3", "scanner": "scanner-primary", "fingerprint": "34cbddd0db018ed9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/projects/cockpit/PortaalCompactBlock.tsx"}, "region": {"startLine": 386}}}]}, {"ruleId": "scanner-606210a90177d4b4", "level": "note", "message": {"text": "Insecure pattern 'document_write' in forgedesk/src/components/planning/MontagePlanningLayout.tsx:1080"}, "properties": {"repobilityId": "83e49e302b5ff493", "scanner": "scanner-primary", "fingerprint": "606210a90177d4b4", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/src/components/planning/MontagePlanningLayout.tsx"}, "region": {"startLine": 1080}}}]}, {"ruleId": "scanner-1214ea0d35936731", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in kunstdoekje/src/app/layout.tsx:93"}, "properties": {"repobilityId": "d55465f45ee331ee", "scanner": "scanner-primary", "fingerprint": "1214ea0d35936731", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "kunstdoekje/src/app/layout.tsx"}, "region": {"startLine": 93}}}]}, {"ruleId": "scanner-fd9e2d405f70a25f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in kunstdoekje/src/app/product/[slug]/page.tsx:94"}, "properties": {"repobilityId": "10d2a60e32c272ad", "scanner": "scanner-primary", "fingerprint": "fd9e2d405f70a25f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "kunstdoekje/src/app/product/[slug]/page.tsx"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-6f91e38326d94f18", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/brand/scripts/sync-brand-to-tokens.cjs:14"}, "properties": {"repobilityId": "cb789514f1208f11", "scanner": "scanner-primary", "fingerprint": "6f91e38326d94f18", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/brand/scripts/sync-brand-to-tokens.cjs"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-5915125e41fb2856", "level": "note", "message": {"text": "Very large file: src/components/home/AppShowcase.tsx (2878 lines)"}, "properties": {"repobilityId": "d2196df003ba42bb", "scanner": "scanner-primary", "fingerprint": "5915125e41fb2856", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-57e624f2042a6ba4", "level": "note", "message": {"text": "Very large file: src/components/pages/FeaturesContent.tsx (1999 lines)"}, "properties": {"repobilityId": "3ef8a57ee73faa59", "scanner": "scanner-primary", "fingerprint": "57e624f2042a6ba4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bd61836b6bf3ac04", "level": "note", "message": {"text": "Very large file: src/components/pages/HoeHetWerktContent.tsx (1242 lines)"}, "properties": {"repobilityId": "5310f13ac10e4d05", "scanner": "scanner-primary", "fingerprint": "bd61836b6bf3ac04", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d3a4d4f9318373c5", "level": "note", "message": {"text": "Very large file: forgedesk/src/types/index.ts (2348 lines)"}, "properties": {"repobilityId": "09bc6897c6d22c04", "scanner": "scanner-primary", "fingerprint": "d3a4d4f9318373c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-050b95ea9d41a7ce", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/clients/ClientProfile.tsx (2002 lines)"}, "properties": {"repobilityId": "35b94b0e6156f58a", "scanner": "scanner-primary", "fingerprint": "050b95ea9d41a7ce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-119e5764eb5b7318", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/werkbonnen/WerkbonDetail.tsx (1351 lines)"}, "properties": {"repobilityId": "eb9ade8ed54caf56", "scanner": "scanner-primary", "fingerprint": "119e5764eb5b7318", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-48cfa6cc20deb873", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/reports/RapportagesLayout.tsx (1364 lines)"}, "properties": {"repobilityId": "26e514d8269da9b5", "scanner": "scanner-primary", "fingerprint": "48cfa6cc20deb873", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c90512d8dd18849b", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/email/EmailContextSidebar.tsx (1040 lines)"}, "properties": {"repobilityId": "33257eb06e0864e3", "scanner": "scanner-primary", "fingerprint": "c90512d8dd18849b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9ea2d5055495dea2", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/email/EmailReader.tsx (1918 lines)"}, "properties": {"repobilityId": "2ebbedd1065a08d5", "scanner": "scanner-primary", "fingerprint": "9ea2d5055495dea2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9caa3b6c51cc68f8", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/email/EmailCompose.tsx (1158 lines)"}, "properties": {"repobilityId": "ee04a8985acfce91", "scanner": "scanner-primary", "fingerprint": "9caa3b6c51cc68f8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-66b3607d7037876e", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/email/EmailLayout.tsx (2410 lines)"}, "properties": {"repobilityId": "eade4555420d2cd2", "scanner": "scanner-primary", "fingerprint": "66b3607d7037876e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f6d1b9bd4531eb41", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/settings/EmailTab.tsx (1310 lines)"}, "properties": {"repobilityId": "739a7d0936ec4893", "scanner": "scanner-primary", "fingerprint": "f6d1b9bd4531eb41", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-794377cd7d251bc0", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/settings/IntegratiesTab.tsx (1490 lines)"}, "properties": {"repobilityId": "1173fc2db654d447", "scanner": "scanner-primary", "fingerprint": "794377cd7d251bc0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1040e2b7afd4aece", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/settings/HuisstijlTab.tsx (1415 lines)"}, "properties": {"repobilityId": "4736e8e88f7506de", "scanner": "scanner-primary", "fingerprint": "1040e2b7afd4aece", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b7d2d5b1433b11f1", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/settings/CalculatieTab.tsx (2366 lines)"}, "properties": {"repobilityId": "d0b1e2edef73d89b", "scanner": "scanner-primary", "fingerprint": "b7d2d5b1433b11f1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b9309c59d11758ef", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/quotes/OfferteDetail.tsx (1340 lines)"}, "properties": {"repobilityId": "17126ba6e39fdf11", "scanner": "scanner-primary", "fingerprint": "b9309c59d11758ef", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-611822c5c0ea0e5e", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/quotes/QuoteCreation.tsx (2553 lines)"}, "properties": {"repobilityId": "323c12288d68ab31", "scanner": "scanner-primary", "fingerprint": "611822c5c0ea0e5e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f15af41cb8967bf4", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/quotes/QuotesPipeline.tsx (1715 lines)"}, "properties": {"repobilityId": "03c33dcb7c36c9a6", "scanner": "scanner-primary", "fingerprint": "f15af41cb8967bf4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dc08c9d86bef51fd", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/quotes/QuoteItemsTable.tsx (1740 lines)"}, "properties": {"repobilityId": "6bdb83267bf77e7c", "scanner": "scanner-primary", "fingerprint": "dc08c9d86bef51fd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-24665420ee6a9bee", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/projects/ProjectDetail.tsx (3243 lines)"}, "properties": {"repobilityId": "71e79f8352531e9f", "scanner": "scanner-primary", "fingerprint": "24665420ee6a9bee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-770361c5c550115e", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/projects/TijdregistratieLayout.tsx (1350 lines)"}, "properties": {"repobilityId": "efa2e5c244dbad4a", "scanner": "scanner-primary", "fingerprint": "770361c5c550115e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c3acf71f9bb8d687", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/projects/ProjectsList.tsx (1880 lines)"}, "properties": {"repobilityId": "b0a1d5c9b305290c", "scanner": "scanner-primary", "fingerprint": "c3acf71f9bb8d687", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6e9b0e49f515c078", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/invoices/FacturenLayout.tsx (2983 lines)"}, "properties": {"repobilityId": "f9b3c90084604486", "scanner": "scanner-primary", "fingerprint": "6e9b0e49f515c078", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bd748943b877f447", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/invoices/FactuurEditor.tsx (3091 lines)"}, "properties": {"repobilityId": "0b0e6b6a125ef56c", "scanner": "scanner-primary", "fingerprint": "bd748943b877f447", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-904deb64cedd2ded", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/planning/MontagePlanningLayout.tsx (3706 lines)"}, "properties": {"repobilityId": "c4bdab632bd0b592", "scanner": "scanner-primary", "fingerprint": "904deb64cedd2ded", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-961984fb13e14a97", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/planning/TasksLayout.tsx (3096 lines)"}, "properties": {"repobilityId": "b4dbb1fb63c6a4cc", "scanner": "scanner-primary", "fingerprint": "961984fb13e14a97", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7f7f7168d2164462", "level": "note", "message": {"text": "Very large file: forgedesk/src/components/visualizer/VisualizerLayout.tsx (1171 lines)"}, "properties": {"repobilityId": "15917836d19ebdc2", "scanner": "scanner-primary", "fingerprint": "7f7f7168d2164462", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7cc649f4c00c1d76", "level": "note", "message": {"text": "Very large file: forgedesk/src/services/pdfService.ts (2324 lines)"}, "properties": {"repobilityId": "5c6037bb7a3b301e", "scanner": "scanner-primary", "fingerprint": "7cc649f4c00c1d76", "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-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "5ff08eeb3740a923", "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": "17240da0656ca606", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "0063cb71bdbb4757", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "22b7ddeaed0b71fd", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "30567a05ac064b0e", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-da71c43ceb23850d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/Planner.md"}, "properties": {"repobilityId": "880c2dfe44529291", "scanner": "scanner-primary", "fingerprint": "da71c43ceb23850d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/.claude/agents/Planner.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65882624a6697f18", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/QAA.md"}, "properties": {"repobilityId": "00305fdb2f51c529", "scanner": "scanner-primary", "fingerprint": "65882624a6697f18", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/.claude/agents/QAA.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1649dae1c90ffd37", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: forgedesk/.claude/agents/dev.md"}, "properties": {"repobilityId": "2e96d4ffcd3a98fe", "scanner": "scanner-primary", "fingerprint": "1649dae1c90ffd37", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/.claude/agents/dev.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea7e8f088bd7f68a", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: forgedesk/.claude/agents/trigger-dev-task-writer.md"}, "properties": {"repobilityId": "10b8ed485d8edf81", "scanner": "scanner-primary", "fingerprint": "ea7e8f088bd7f68a", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "forgedesk/.claude/agents/trigger-dev-task-writer.md"}, "region": {"startLine": 158}}}]}, {"ruleId": "scanner-a9efd6148b14c4dd", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system/SKILL.md"}, "properties": {"repobilityId": "bf378b1477697d22", "scanner": "scanner-primary", "fingerprint": "a9efd6148b14c4dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d60e06b48b7fa56d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design-system/references/tailwind-integration.md"}, "properties": {"repobilityId": "de09068c62608a74", "scanner": "scanner-primary", "fingerprint": "d60e06b48b7fa56d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design-system/references/tailwind-integration.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-08f8f3764ea9cbf2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/slides/SKILL.md"}, "properties": {"repobilityId": "71c07c438b374cda", "scanner": "scanner-primary", "fingerprint": "08f8f3764ea9cbf2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/slides/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5df68c6f99043d0b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/slides/references/layout-patterns.md"}, "properties": {"repobilityId": "4312123c3cf7ee8b", "scanner": "scanner-primary", "fingerprint": "5df68c6f99043d0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/slides/references/layout-patterns.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44315c6caebd5a6a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/slides/references/slide-strategies.md"}, "properties": {"repobilityId": "f946a1d7b07b6ea9", "scanner": "scanner-primary", "fingerprint": "44315c6caebd5a6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/slides/references/slide-strategies.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-174e2536d1171d35", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/shadcn-components.md"}, "properties": {"repobilityId": "dddda59c0751e768", "scanner": "scanner-primary", "fingerprint": "174e2536d1171d35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ui-styling/references/shadcn-components.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9aacdde86114e962", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/ui-styling/references/shadcn-accessibility.md"}, "properties": {"repobilityId": "ba987a3718652311", "scanner": "scanner-primary", "fingerprint": "9aacdde86114e962", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/ui-styling/references/shadcn-accessibility.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5f1d43b3de4e0dcd", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/cip-design.md"}, "properties": {"repobilityId": "3dbf32d07b2a4ddf", "scanner": "scanner-primary", "fingerprint": "5f1d43b3de4e0dcd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design/references/cip-design.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ec269b993ce6613a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/logo-design.md"}, "properties": {"repobilityId": "de41e62b274f9edb", "scanner": "scanner-primary", "fingerprint": "ec269b993ce6613a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design/references/logo-design.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc31d2bbc9c2d406", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/banner-sizes-and-styles.md"}, "properties": {"repobilityId": "e39d675aeb4642dd", "scanner": "scanner-primary", "fingerprint": "bc31d2bbc9c2d406", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design/references/banner-sizes-and-styles.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-db0739837029be5e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides-strategies.md"}, "properties": {"repobilityId": "42032ed57672ab10", "scanner": "scanner-primary", "fingerprint": "db0739837029be5e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design/references/slides-strategies.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-287d4cf2d33f58ff", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides.md"}, "properties": {"repobilityId": "c0c6a85ec0c49011", "scanner": "scanner-primary", "fingerprint": "287d4cf2d33f58ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design/references/slides.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-efd944ff0e1991f3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/design/references/slides-layout-patterns.md"}, "properties": {"repobilityId": "4a0cf968f56c557c", "scanner": "scanner-primary", "fingerprint": "efd944ff0e1991f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/design/references/slides-layout-patterns.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-297a89e3aaefd34f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/banner-design/SKILL.md"}, "properties": {"repobilityId": "cd18ee13c514a43d", "scanner": "scanner-primary", "fingerprint": "297a89e3aaefd34f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/banner-design/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7fa5686d97d8e5e8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/banner-design/references/banner-sizes-and-styles.md"}, "properties": {"repobilityId": "6990b7dad03aeeb0", "scanner": "scanner-primary", "fingerprint": "7fa5686d97d8e5e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/banner-design/references/banner-sizes-and-styles.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4f1adf71fa42c354", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/brand/templates/brand-guidelines-starter.md"}, "properties": {"repobilityId": "b9489cf003051881", "scanner": "scanner-primary", "fingerprint": "4f1adf71fa42c354", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/brand/templates/brand-guidelines-starter.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fe4826c8fe2e64d5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/brand/references/asset-organization.md"}, "properties": {"repobilityId": "a3ba7cd7932d1b8c", "scanner": "scanner-primary", "fingerprint": "fe4826c8fe2e64d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/brand/references/asset-organization.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f822c0c09b41ab9f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/nano-banana-pro/SKILL.md"}, "properties": {"repobilityId": "0efe8f1556a4d574", "scanner": "scanner-primary", "fingerprint": "f822c0c09b41ab9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/nano-banana-pro/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6ff0c2e8821fc994", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-grootboeken.ts:99"}, "properties": {"repobilityId": "70470e44d4fecd4e", "scanner": "scanner-primary", "fingerprint": "6ff0c2e8821fc994", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b60708491e9cb0fa", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-document-types.ts:149"}, "properties": {"repobilityId": "fe0f67d07bc590b5", "scanner": "scanner-primary", "fingerprint": "b60708491e9cb0fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6eb9e439e8b4cbd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-document-types.ts:134"}, "properties": {"repobilityId": "33cadd422ba62824", "scanner": "scanner-primary", "fingerprint": "f6eb9e439e8b4cbd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1aa465f2b4c0c6f2", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/mollie-create-payment.ts:259"}, "properties": {"repobilityId": "6b48235e715d7e92", "scanner": "scanner-primary", "fingerprint": "1aa465f2b4c0c6f2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c66c5fd8d1c44cd3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/mollie-create-payment.ts:230"}, "properties": {"repobilityId": "51260fd053f1baa7", "scanner": "scanner-primary", "fingerprint": "c66c5fd8d1c44cd3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-867ad4da5a8f474b", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-grootboeken.ts:147"}, "properties": {"repobilityId": "fa22c427c714694f", "scanner": "scanner-primary", "fingerprint": "867ad4da5a8f474b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-053474562a8d4cf8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-grootboeken.ts:132"}, "properties": {"repobilityId": "2c10021436fac1e3", "scanner": "scanner-primary", "fingerprint": "053474562a8d4cf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff08753cfc0ec028", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-chat.ts:674"}, "properties": {"repobilityId": "4c0b61fdea052705", "scanner": "scanner-primary", "fingerprint": "ff08753cfc0ec028", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5c86275ab76a4b9a", "level": "none", "message": {"text": "Commented-code block (6 lines) in forgedesk/api/fetch-emails.ts:222"}, "properties": {"repobilityId": "ce86abdff0b43575", "scanner": "scanner-primary", "fingerprint": "5c86275ab76a4b9a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-713cbc61f72ff643", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/fetch-emails.ts:274"}, "properties": {"repobilityId": "12c34d1523ee7ad6", "scanner": "scanner-primary", "fingerprint": "713cbc61f72ff643", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1860823b90439d9", "level": "none", "message": {"text": "Commented-code block (6 lines) in forgedesk/api/send-email.ts:300"}, "properties": {"repobilityId": "5a934e1c04af62a8", "scanner": "scanner-primary", "fingerprint": "d1860823b90439d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c15fb9f1c756768e", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-callback.ts:62"}, "properties": {"repobilityId": "efb3d38e5c97e6b8", "scanner": "scanner-primary", "fingerprint": "c15fb9f1c756768e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a34653682b9443bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-callback.ts:211"}, "properties": {"repobilityId": "df570472be34d29c", "scanner": "scanner-primary", "fingerprint": "a34653682b9443bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-549e6118dabac707", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-rewrite.ts:312"}, "properties": {"repobilityId": "1e6128a7f96bc318", "scanner": "scanner-primary", "fingerprint": "549e6118dabac707", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0a313a9be3961eb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/analyze-inkoop-offerte.ts:284"}, "properties": {"repobilityId": "d2f166f97070047d", "scanner": "scanner-primary", "fingerprint": "e0a313a9be3961eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab2f827910284b12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/mollie-webhook.ts:155"}, "properties": {"repobilityId": "220d1a73e27b31de", "scanner": "scanner-primary", "fingerprint": "ab2f827910284b12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-23a4e8e5535085c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/inkoopfactuur-sync.ts:119"}, "properties": {"repobilityId": "4ee76f97ba934a2c", "scanner": "scanner-primary", "fingerprint": "23a4e8e5535085c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-819fcbcd4a1efe9a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/kvk-zoeken.ts:120"}, "properties": {"repobilityId": "9574014b5ec127c4", "scanner": "scanner-primary", "fingerprint": "819fcbcd4a1efe9a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a26effc51e49850e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-connect.ts:139"}, "properties": {"repobilityId": "3cec19e62b4003bd", "scanner": "scanner-primary", "fingerprint": "a26effc51e49850e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bdef07d673fa8d44", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/kvk-basisprofiel.ts:119"}, "properties": {"repobilityId": "96cc22156539d635", "scanner": "scanner-primary", "fingerprint": "bdef07d673fa8d44", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ad7012b0eef5721c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-followup-email.ts:306"}, "properties": {"repobilityId": "b1b3f619b7897e23", "scanner": "scanner-primary", "fingerprint": "ad7012b0eef5721c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-273cb6fa522f826b", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-btw-codes.ts:147"}, "properties": {"repobilityId": "81698bbc84295395", "scanner": "scanner-primary", "fingerprint": "273cb6fa522f826b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-30fa4d08986caf67", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-btw-codes.ts:132"}, "properties": {"repobilityId": "547406e9970007dc", "scanner": "scanner-primary", "fingerprint": "30fa4d08986caf67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2ac94eeef6cf2731", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-sync-factuur.ts:201"}, "properties": {"repobilityId": "5886ba598b3f61b0", "scanner": "scanner-primary", "fingerprint": "2ac94eeef6cf2731", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e3b3bc1b3ad66d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/read-email.ts:416"}, "properties": {"repobilityId": "87bdc41a5c0ca12c", "scanner": "scanner-primary", "fingerprint": "2e3b3bc1b3ad66d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5376cdf16d3733d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai-email.ts:294"}, "properties": {"repobilityId": "408bb06eb5f3d179", "scanner": "scanner-primary", "fingerprint": "b5376cdf16d3733d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-32dc7c9fd39a5866", "level": "none", "message": {"text": "Commented-code block (9 lines) in forgedesk/api/exact-sync-factuur.ts:163"}, "properties": {"repobilityId": "036b63d87c96d02c", "scanner": "scanner-primary", "fingerprint": "32dc7c9fd39a5866", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1be9e622fdb1ce79", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-sync-factuur.ts:148"}, "properties": {"repobilityId": "e45b120cf84bbf94", "scanner": "scanner-primary", "fingerprint": "1be9e622fdb1ce79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b4055c758b1cf57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-sync-factuur.ts:115"}, "properties": {"repobilityId": "bab98c057772b014", "scanner": "scanner-primary", "fingerprint": "7b4055c758b1cf57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be2ba33b2fc14321", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-ledger-accounts.ts:99"}, "properties": {"repobilityId": "c46220f50c1896d4", "scanner": "scanner-primary", "fingerprint": "be2ba33b2fc14321", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3de89e5ac664c871", "level": "none", "message": {"text": "Commented-code block (6 lines) in forgedesk/api/exact-administraties.ts:150"}, "properties": {"repobilityId": "f261f118a80826ab", "scanner": "scanner-primary", "fingerprint": "3de89e5ac664c871", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ec27bf86dbf5c057", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-administraties.ts:135"}, "properties": {"repobilityId": "6054c06f733828c2", "scanner": "scanner-primary", "fingerprint": "ec27bf86dbf5c057", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-70e47ae82f3cc1c0", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-dagboeken.ts:148"}, "properties": {"repobilityId": "e0bfd9104550b5c2", "scanner": "scanner-primary", "fingerprint": "70e47ae82f3cc1c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f64ad38f64503014", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-dagboeken.ts:133"}, "properties": {"repobilityId": "e8b53f0c658af930", "scanner": "scanner-primary", "fingerprint": "f64ad38f64503014", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-72914c171a2fcd51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/backfill-emails.ts:159"}, "properties": {"repobilityId": "0c41e419bfd265b7", "scanner": "scanner-primary", "fingerprint": "72914c171a2fcd51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fbc52fde0de8d5ee", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-auth.ts:30"}, "properties": {"repobilityId": "bc2009ca1c2797fa", "scanner": "scanner-primary", "fingerprint": "fbc52fde0de8d5ee", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75f79ce7f4140c28", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-connect.ts:134"}, "properties": {"repobilityId": "b46f093881f75436", "scanner": "scanner-primary", "fingerprint": "75f79ce7f4140c28", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8ae00ec9f2633db", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/api/exact-refresh.ts:167"}, "properties": {"repobilityId": "2c75620bd6dffeda", "scanner": "scanner-primary", "fingerprint": "a8ae00ec9f2633db", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c80b739cb311336", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/exact-refresh.ts:149"}, "properties": {"repobilityId": "eacc939abfb3b9cc", "scanner": "scanner-primary", "fingerprint": "3c80b739cb311336", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea823a724b5350ab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/email-attachment.ts:201"}, "properties": {"repobilityId": "98c3bbdc4941df5c", "scanner": "scanner-primary", "fingerprint": "ea823a724b5350ab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-23014863f93495b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-connect.ts:135"}, "properties": {"repobilityId": "b2885d34af21c692", "scanner": "scanner-primary", "fingerprint": "23014863f93495b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ba529447b641e1b", "level": "none", "message": {"text": "Commented-code block (6 lines) in forgedesk/api/snelstart-sync-factuur.ts:332"}, "properties": {"repobilityId": "d7c679d187febf23", "scanner": "scanner-primary", "fingerprint": "5ba529447b641e1b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e48300baa2694d4d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/snelstart-sync-factuur.ts:221"}, "properties": {"repobilityId": "ec659b66b86e0f6b", "scanner": "scanner-primary", "fingerprint": "e48300baa2694d4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be2a6a8b955f39f3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/ai.ts:80"}, "properties": {"repobilityId": "362c69e59224a1da", "scanner": "scanner-primary", "fingerprint": "be2a6a8b955f39f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36623b6a7b8c2a6d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/eboekhouden-ledgers.ts:94"}, "properties": {"repobilityId": "edb4961e7210f992", "scanner": "scanner-primary", "fingerprint": "36623b6a7b8c2a6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5afcc9103548f48e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/api/moneybird-tax-rates.ts:99"}, "properties": {"repobilityId": "b69725af68338dd5", "scanner": "scanner-primary", "fingerprint": "5afcc9103548f48e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e2ce5a22a9ff415e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/utils/maatjeAnnotaties.ts:191"}, "properties": {"repobilityId": "836bf7fd8be7c60e", "scanner": "scanner-primary", "fingerprint": "e2ce5a22a9ff415e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be0d2a8dff42516e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/trigger/inkoopfactuur-intake.ts:128"}, "properties": {"repobilityId": "f5611a6647e7d0f9", "scanner": "scanner-primary", "fingerprint": "be0d2a8dff42516e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d76e4582a77003ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/trigger/email-opvolging.ts:104"}, "properties": {"repobilityId": "0ed51891343edf23", "scanner": "scanner-primary", "fingerprint": "d76e4582a77003ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0a9e6bf70bbd088a", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/contexts/DashboardDataContext.tsx:66"}, "properties": {"repobilityId": "73dda80897fbe932", "scanner": "scanner-primary", "fingerprint": "0a9e6bf70bbd088a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-51a7031d11ffbd3b", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/contexts/TabsContext.tsx:128"}, "properties": {"repobilityId": "3c5698656e2414b7", "scanner": "scanner-primary", "fingerprint": "51a7031d11ffbd3b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a436f4b02606c913", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/hooks/useInkoopAIUsage.ts:40"}, "properties": {"repobilityId": "0085db983ac24d1c", "scanner": "scanner-primary", "fingerprint": "a436f4b02606c913", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-14fe80e642db9f40", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/hooks/useWeather.ts:78"}, "properties": {"repobilityId": "8f5a144ef844a918", "scanner": "scanner-primary", "fingerprint": "14fe80e642db9f40", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b4123c186266118", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/components/dashboard/VandaagBlok.tsx:160"}, "properties": {"repobilityId": "db907406eed58d1e", "scanner": "scanner-primary", "fingerprint": "0b4123c186266118", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7886ae4fe2e8c1f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/clients/AddEditClient.tsx:113"}, "properties": {"repobilityId": "616efdca4dace536", "scanner": "scanner-primary", "fingerprint": "7886ae4fe2e8c1f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4249eb13402d35d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/werkbonnen/WerkbonDetail.tsx:965"}, "properties": {"repobilityId": "3e4641ac8962688e", "scanner": "scanner-primary", "fingerprint": "4249eb13402d35d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd24c698f8f3df96", "level": "note", "message": {"text": "Legacy-named symbol `doen_email_sales_inbox_banner_v1` in forgedesk/src/components/email/EmailLayout.tsx:207"}, "properties": {"repobilityId": "e0e3e0c1eec8fa96", "scanner": "scanner-primary", "fingerprint": "cd24c698f8f3df96", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7076900d77b8386a", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/components/email/EmailLayout.tsx:129"}, "properties": {"repobilityId": "6561bb2402e5e479", "scanner": "scanner-primary", "fingerprint": "7076900d77b8386a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eaf2b1716212f559", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/email/EmailLayout.tsx:1180"}, "properties": {"repobilityId": "8331a8127f900080", "scanner": "scanner-primary", "fingerprint": "eaf2b1716212f559", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-25a287dbbe2d13ff", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/portaal/PortaalReactieFormInline.tsx:94"}, "properties": {"repobilityId": "32818129128fa193", "scanner": "scanner-primary", "fingerprint": "25a287dbbe2d13ff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-719cdb40e07a319b", "level": "none", "message": {"text": "Commented-code block (7 lines) in forgedesk/src/components/settings/IntegratiesTab.tsx:91"}, "properties": {"repobilityId": "d0d5ea5f485c88b8", "scanner": "scanner-primary", "fingerprint": "719cdb40e07a319b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f507d7f28a3fac9f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/settings/IntegratiesTab.tsx:238"}, "properties": {"repobilityId": "89a65d4f96f69f02", "scanner": "scanner-primary", "fingerprint": "f507d7f28a3fac9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fe38744da3db714f", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/components/settings/WeergaveTab.tsx:60"}, "properties": {"repobilityId": "58319821ba2b2781", "scanner": "scanner-primary", "fingerprint": "fe38744da3db714f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1704738028f6784", "level": "none", "message": {"text": "Commented-code block (6 lines) in forgedesk/src/components/quotes/CalculatieModal.tsx:52"}, "properties": {"repobilityId": "0b06d0741b24d901", "scanner": "scanner-primary", "fingerprint": "d1704738028f6784", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-045a84571476b11d", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/components/quotes/QuoteCreation.tsx:467"}, "properties": {"repobilityId": "e12d7e9c99fd1bac", "scanner": "scanner-primary", "fingerprint": "045a84571476b11d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de05df94da7f378e", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/components/quotes/QuoteItemsTable.tsx:27"}, "properties": {"repobilityId": "656e33e53843bbcb", "scanner": "scanner-primary", "fingerprint": "de05df94da7f378e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2c8fcaac30e4cad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/quotes/QuoteItemsTable.tsx:211"}, "properties": {"repobilityId": "be6bc3a4b742a55a", "scanner": "scanner-primary", "fingerprint": "e2c8fcaac30e4cad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3a03aeff7a6491d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/projects/cockpit/BestandenSection.tsx:88"}, "properties": {"repobilityId": "d2cc65e3a8e7f080", "scanner": "scanner-primary", "fingerprint": "3a03aeff7a6491d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-126b23d63ba1ebaf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/planning/WeatherDayStrip.tsx:44"}, "properties": {"repobilityId": "a6fefd810d8b2d72", "scanner": "scanner-primary", "fingerprint": "126b23d63ba1ebaf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f32d575840497a61", "level": "note", "message": {"text": "Legacy-named symbol `doen_planning_filter_v1` in forgedesk/src/components/planning/MontagePlanningLayout.tsx:105"}, "properties": {"repobilityId": "313228413a0d68be", "scanner": "scanner-primary", "fingerprint": "f32d575840497a61", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-023d431caaf8fcb2", "level": "note", "message": {"text": "Legacy-named symbol `doen_planning_filter_v1` in forgedesk/src/components/planning/MontagePlanningLayoutMobile.tsx:17"}, "properties": {"repobilityId": "8d8540394d5043b3", "scanner": "scanner-primary", "fingerprint": "023d431caaf8fcb2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c9cb53f43cb6aece", "level": "note", "message": {"text": "Legacy-named symbol `doen_taken_filter_migration_v2` in forgedesk/src/components/planning/TasksLayout.tsx:80"}, "properties": {"repobilityId": "9d1e9c7f9ef47625", "scanner": "scanner-primary", "fingerprint": "c9cb53f43cb6aece", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c8bf411b76c71402", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/visualizer/SigningVisualizerDialog.tsx:196"}, "properties": {"repobilityId": "916023bf757ed594", "scanner": "scanner-primary", "fingerprint": "c8bf411b76c71402", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-840ba7b416309794", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/components/visualizer/VisualizerLayout.tsx:255"}, "properties": {"repobilityId": "d084b41d1f6060dd", "scanner": "scanner-primary", "fingerprint": "840ba7b416309794", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c001c814a283b5e1", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/lib/documentTemplates.ts:206"}, "properties": {"repobilityId": "9a19b92bf39cc0fe", "scanner": "scanner-primary", "fingerprint": "c001c814a283b5e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c637daa99d6bae1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/forgieChatService.ts:40"}, "properties": {"repobilityId": "382e58341bee8bee", "scanner": "scanner-primary", "fingerprint": "c637daa99d6bae1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b586f797b2ccd85c", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/services/gmailService.ts:259"}, "properties": {"repobilityId": "597442377ef20ea3", "scanner": "scanner-primary", "fingerprint": "b586f797b2ccd85c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a95ac73e4767f029", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/gmailService.ts:280"}, "properties": {"repobilityId": "e5bcad568971eba3", "scanner": "scanner-primary", "fingerprint": "a95ac73e4767f029", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7c11a9a8e661ca06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/supportChatService.ts:93"}, "properties": {"repobilityId": "5448ec9a7925b8a5", "scanner": "scanner-primary", "fingerprint": "7c11a9a8e661ca06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d3ee9b87959bd41", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/pdfService.ts:39"}, "properties": {"repobilityId": "dfaa6ee8fc36bde4", "scanner": "scanner-primary", "fingerprint": "0d3ee9b87959bd41", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4bf56080104a83b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in forgedesk/src/services/werkbonPdfService.ts:223"}, "properties": {"repobilityId": "0eb95222bcdc279a", "scanner": "scanner-primary", "fingerprint": "4bf56080104a83b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f4a12374f29feeea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/forgieService.ts:68"}, "properties": {"repobilityId": "092aefd559d939cf", "scanner": "scanner-primary", "fingerprint": "f4a12374f29feeea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-94937e07621bf5a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 forgedesk/src/services/inkoopfactuurService.ts:108"}, "properties": {"repobilityId": "17c07e25a4a28d6d", "scanner": "scanner-primary", "fingerprint": "94937e07621bf5a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8bbf802941e5c621", "level": "none", "message": {"text": "Commented-code block (6 lines) in forgedesk/src/services/profielService.ts:661"}, "properties": {"repobilityId": "85660867a179db7f", "scanner": "scanner-primary", "fingerprint": "8bbf802941e5c621", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17bdddedd15083fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 kunstdoekje/src/components/admin/AdminNav.tsx:16"}, "properties": {"repobilityId": "78e96f13cf71e3b9", "scanner": "scanner-primary", "fingerprint": "17bdddedd15083fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8cb1b14bb4af7eea", "level": "note", "message": {"text": "Legacy-named symbol `kunstdoekje_bekeken_v1` in kunstdoekje/src/lib/kijkgedrag.ts:17"}, "properties": {"repobilityId": "3cdb66309322550a", "scanner": "scanner-primary", "fingerprint": "8cb1b14bb4af7eea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ef76c2ac21e0e2a8", "level": "note", "message": {"text": "Legacy-named symbol `kunstdoekje_cart_v1` in kunstdoekje/src/lib/cart.tsx:45"}, "properties": {"repobilityId": "7d2eabb01b4ba7ca", "scanner": "scanner-primary", "fingerprint": "ef76c2ac21e0e2a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a9b318eb3310b1ca", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 .claude/skills/design-system/scripts/slide-token-validator.py:30"}, "properties": {"repobilityId": "cef1d5a436156148", "scanner": "scanner-primary", "fingerprint": "a9b318eb3310b1ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0fd9b28ab927fb2b", "level": "none", "message": {"text": "Commented-code block (5 lines) in .claude/skills/nano-banana-pro/scripts/generate_image.py:2"}, "properties": {"repobilityId": "ab4c41f744706524", "scanner": "scanner-primary", "fingerprint": "0fd9b28ab927fb2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-65df07ab4020db79", "level": "note", "message": {"text": "18 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5e334d56f52c02e1", "scanner": "scanner-primary", "fingerprint": "65df07ab4020db79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "d60e9250b59153e3", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "325785ccf56e3a25", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "87bcf01f297d5dad", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d0b92da7aa67eb21", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e664b5317f8f60ae", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "533df65183dbbe20", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "67b9e8286ad9a1e1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2186b5415c739eb8", "level": "warning", "message": {"text": "Frontend route `/check-inbox` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "668b637a4c93afef", "scanner": "scanner-primary", "fingerprint": "2186b5415c739eb8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a8e9660ca0b027b9", "level": "warning", "message": {"text": "Frontend route `/wachtwoord-resetten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "0b5bac4635bbd252", "scanner": "scanner-primary", "fingerprint": "a8e9660ca0b027b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b38b0ebf0826ffd4", "level": "warning", "message": {"text": "Frontend route `/goedkeuring/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "d83a64bea5de678c", "scanner": "scanner-primary", "fingerprint": "b38b0ebf0826ffd4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-692ca54ccb171f23", "level": "warning", "message": {"text": "Frontend route `/boeken/:userId` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "c50e82c42790aabe", "scanner": "scanner-primary", "fingerprint": "692ca54ccb171f23", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b2b22b6eb8d2fb2b", "level": "warning", "message": {"text": "Frontend route `/betalen/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "105f66a29738c21f", "scanner": "scanner-primary", "fingerprint": "b2b22b6eb8d2fb2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-976b4e525f661bf5", "level": "warning", "message": {"text": "Frontend route `/betaald` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "3bd51a44ba1f7cc2", "scanner": "scanner-primary", "fingerprint": "976b4e525f661bf5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0263aacbb9f2d972", "level": "warning", "message": {"text": "Frontend route `/offerte-bekijken/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "12156f1b3f9b467f", "scanner": "scanner-primary", "fingerprint": "0263aacbb9f2d972", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-eb40ebb5957d9bd8", "level": "warning", "message": {"text": "Frontend route `/formulier/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "6a5f30702c3a8672", "scanner": "scanner-primary", "fingerprint": "eb40ebb5957d9bd8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2c5d26487e3d0e57", "level": "warning", "message": {"text": "Frontend route `/portaal/:token` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "820dc4c53e5fe0bd", "scanner": "scanner-primary", "fingerprint": "2c5d26487e3d0e57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-851b3a6ec7e24d5a", "level": "warning", "message": {"text": "Frontend route `/team-welkom` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "b1ec972b346d8b9f", "scanner": "scanner-primary", "fingerprint": "851b3a6ec7e24d5a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-97a107a12c693b2f", "level": "warning", "message": {"text": "Frontend route `projecten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "f360179f8b1099ea", "scanner": "scanner-primary", "fingerprint": "97a107a12c693b2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0f850b3647c1a0b7", "level": "warning", "message": {"text": "Frontend route `projecten/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "f494306fa2013668", "scanner": "scanner-primary", "fingerprint": "0f850b3647c1a0b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d27ba7dd89db8178", "level": "warning", "message": {"text": "Frontend route `projecten/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "d1160b963a86686a", "scanner": "scanner-primary", "fingerprint": "d27ba7dd89db8178", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7affd25badb078ec", "level": "warning", "message": {"text": "Frontend route `maatjes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "d37c45e7836fba65", "scanner": "scanner-primary", "fingerprint": "7affd25badb078ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9195cd72f23a3256", "level": "warning", "message": {"text": "Frontend route `klanten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "ee80c9a41c50f77e", "scanner": "scanner-primary", "fingerprint": "9195cd72f23a3256", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4273bc0f031b01c2", "level": "warning", "message": {"text": "Frontend route `klanten/importeren` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "aa1b6c5d3e0f0eb7", "scanner": "scanner-primary", "fingerprint": "4273bc0f031b01c2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8041a8bb88b766ed", "level": "warning", "message": {"text": "Frontend route `klanten/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "4dc443c32db7186b", "scanner": "scanner-primary", "fingerprint": "8041a8bb88b766ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-32cc719ac7a78978", "level": "warning", "message": {"text": "Frontend route `deals` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "e9bed62160e80fcc", "scanner": "scanner-primary", "fingerprint": "32cc719ac7a78978", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a65295005115f370", "level": "warning", "message": {"text": "Frontend route `deals/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "72015ff0fc943c5a", "scanner": "scanner-primary", "fingerprint": "a65295005115f370", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-604e1f55875e893c", "level": "warning", "message": {"text": "Frontend route `offertes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "6d55dbde2a2d59b0", "scanner": "scanner-primary", "fingerprint": "604e1f55875e893c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a0248a01b65387ac", "level": "warning", "message": {"text": "Frontend route `offertes/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "e89b61ebf3dd30ca", "scanner": "scanner-primary", "fingerprint": "a0248a01b65387ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1e30a8689dd4c567", "level": "warning", "message": {"text": "Frontend route `offertes/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "0e94e31349ff3647", "scanner": "scanner-primary", "fingerprint": "1e30a8689dd4c567", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fcd2957c55587ca6", "level": "warning", "message": {"text": "Frontend route `offertes/:id/bewerken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "29d48768ec198582", "scanner": "scanner-primary", "fingerprint": "fcd2957c55587ca6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9d2bc7ccddc066df", "level": "warning", "message": {"text": "Frontend route `offertes/:id/preview` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "595119e12e1bead0", "scanner": "scanner-primary", "fingerprint": "9d2bc7ccddc066df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1eb33d02bad4d767", "level": "warning", "message": {"text": "Frontend route `offertes/:id/detail` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "f64902910509a1b3", "scanner": "scanner-primary", "fingerprint": "1eb33d02bad4d767", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7037994450e60223", "level": "warning", "message": {"text": "Frontend route `inkoopoffertes` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "c1eb564411f87d0b", "scanner": "scanner-primary", "fingerprint": "7037994450e60223", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-75a46bb3496fc207", "level": "warning", "message": {"text": "Frontend route `documenten` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "3730cb5f835150f3", "scanner": "scanner-primary", "fingerprint": "75a46bb3496fc207", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2ef54437ee9183e8", "level": "warning", "message": {"text": "Frontend route `email` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "19d3861416d6460f", "scanner": "scanner-primary", "fingerprint": "2ef54437ee9183e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-943a9f4f4c6b8771", "level": "warning", "message": {"text": "Frontend route `email/compose` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "f3c4a69f0337b678", "scanner": "scanner-primary", "fingerprint": "943a9f4f4c6b8771", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-aefc8243e8f4f5ce", "level": "warning", "message": {"text": "Frontend route `planning` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "059406e2e634948a", "scanner": "scanner-primary", "fingerprint": "aefc8243e8f4f5ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-4f8b3c84561497c5", "level": "warning", "message": {"text": "Frontend route `kalender` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "9a5de46cb62fedab", "scanner": "scanner-primary", "fingerprint": "4f8b3c84561497c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a4b97722936caaff", "level": "warning", "message": {"text": "Frontend route `montage` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "d1093187efcb45f3", "scanner": "scanner-primary", "fingerprint": "a4b97722936caaff", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-35e72e314186d5d9", "level": "warning", "message": {"text": "Frontend route `inkoopfacturen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "7f3131bc3b310198", "scanner": "scanner-primary", "fingerprint": "35e72e314186d5d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-abcb5cb353a2274c", "level": "warning", "message": {"text": "Frontend route `inkoopfacturen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "5a8aa314410c0cf6", "scanner": "scanner-primary", "fingerprint": "abcb5cb353a2274c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fec24a985610f38a", "level": "warning", "message": {"text": "Frontend route `financieel` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "9c5c2e2218869318", "scanner": "scanner-primary", "fingerprint": "fec24a985610f38a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c15ba01dac9cf76b", "level": "warning", "message": {"text": "Frontend route `taken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "828d97bc9263b777", "scanner": "scanner-primary", "fingerprint": "c15ba01dac9cf76b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3833cc5ee8298853", "level": "warning", "message": {"text": "Frontend route `facturen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "cc34a85e64ef1631", "scanner": "scanner-primary", "fingerprint": "3833cc5ee8298853", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a06388ac732a03df", "level": "warning", "message": {"text": "Frontend route `facturen/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "9014bb96d5abc16a", "scanner": "scanner-primary", "fingerprint": "a06388ac732a03df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-339b1c3c6ddeedd9", "level": "warning", "message": {"text": "Frontend route `facturen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "e50d1c4e309a7971", "scanner": "scanner-primary", "fingerprint": "339b1c3c6ddeedd9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7ced4b448886df4c", "level": "warning", "message": {"text": "Frontend route `facturen/:id/bewerken` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "e9be6b5be20362ed", "scanner": "scanner-primary", "fingerprint": "7ced4b448886df4c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dba40c4b71bc8639", "level": "warning", "message": {"text": "Frontend route `rapportages` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "73347eb7995cb72d", "scanner": "scanner-primary", "fingerprint": "dba40c4b71bc8639", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ce2721d4d4175b2c", "level": "warning", "message": {"text": "Frontend route `tijdregistratie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "d90571646d49a923", "scanner": "scanner-primary", "fingerprint": "ce2721d4d4175b2c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ab1642a3f308c36d", "level": "warning", "message": {"text": "Frontend route `nacalculatie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "3e7e93282f3bbc5b", "scanner": "scanner-primary", "fingerprint": "ab1642a3f308c36d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a222ea5aa9ce1981", "level": "warning", "message": {"text": "Frontend route `team` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "20d9d270478bdc7b", "scanner": "scanner-primary", "fingerprint": "a222ea5aa9ce1981", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e795ea61bfe70068", "level": "warning", "message": {"text": "Frontend route `importeren` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "2699808a3f4a72ac", "scanner": "scanner-primary", "fingerprint": "e795ea61bfe70068", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8c0dc6c4ce937217", "level": "warning", "message": {"text": "Frontend route `ai` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "033c6f7638d555c6", "scanner": "scanner-primary", "fingerprint": "8c0dc6c4ce937217", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e618021d44d439c0", "level": "warning", "message": {"text": "Frontend route `forgie` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "1a82b245c6862e8f", "scanner": "scanner-primary", "fingerprint": "e618021d44d439c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2102fc3c10ba1b98", "level": "warning", "message": {"text": "Frontend route `support` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "4fe66e49b88bbbc2", "scanner": "scanner-primary", "fingerprint": "2102fc3c10ba1b98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2352a9bc06db4478", "level": "warning", "message": {"text": "Frontend route `kennisbank` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "fac3ec5d9cb0a89a", "scanner": "scanner-primary", "fingerprint": "2352a9bc06db4478", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0e7dd25de50f7b73", "level": "warning", "message": {"text": "Frontend route `changelog` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "0cdc8fb0560c7650", "scanner": "scanner-primary", "fingerprint": "0e7dd25de50f7b73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f8084a85e6e2222f", "level": "warning", "message": {"text": "Frontend route `werkbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "c391602bf0777042", "scanner": "scanner-primary", "fingerprint": "f8084a85e6e2222f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-414aaca724f2289e", "level": "warning", "message": {"text": "Frontend route `werkbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "3d10889a2f0f19bb", "scanner": "scanner-primary", "fingerprint": "414aaca724f2289e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a9fb506250e53a84", "level": "warning", "message": {"text": "Frontend route `bestelbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "9083ad80539e134f", "scanner": "scanner-primary", "fingerprint": "a9fb506250e53a84", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fb524f942c3142f8", "level": "warning", "message": {"text": "Frontend route `bestelbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "1508b2d9f3dbd807", "scanner": "scanner-primary", "fingerprint": "fb524f942c3142f8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-80af01a680935809", "level": "warning", "message": {"text": "Frontend route `leveringsbonnen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "e525f530eed30349", "scanner": "scanner-primary", "fingerprint": "80af01a680935809", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-961f203b0302c067", "level": "warning", "message": {"text": "Frontend route `leveringsbonnen/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "fec8127d06722833", "scanner": "scanner-primary", "fingerprint": "961f203b0302c067", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-70efbc9dae0645c0", "level": "warning", "message": {"text": "Frontend route `voorraad` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "90afa1a08c001949", "scanner": "scanner-primary", "fingerprint": "70efbc9dae0645c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-68bcd37de8df5a41", "level": "warning", "message": {"text": "Frontend route `leads` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "63f4e51cceb17215", "scanner": "scanner-primary", "fingerprint": "68bcd37de8df5a41", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9191e980daf5e76f", "level": "warning", "message": {"text": "Frontend route `leads/formulieren/nieuw` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "addea3a95cac94ea", "scanner": "scanner-primary", "fingerprint": "9191e980daf5e76f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-87f6697a36df2571", "level": "warning", "message": {"text": "Frontend route `leads/formulieren/:id` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "a311304fc585927e", "scanner": "scanner-primary", "fingerprint": "87f6697a36df2571", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-97ce369cdc573e5f", "level": "warning", "message": {"text": "Frontend route `leads/inzendingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "ffb4d9b1b9a07a01", "scanner": "scanner-primary", "fingerprint": "97ce369cdc573e5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a166ec6ff40eff1f", "level": "warning", "message": {"text": "Frontend route `aanvragen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "f613885bca8682af", "scanner": "scanner-primary", "fingerprint": "a166ec6ff40eff1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-164fe35f1eef20c0", "level": "warning", "message": {"text": "Frontend route `forecast` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "91bdc8c40634fc2a", "scanner": "scanner-primary", "fingerprint": "164fe35f1eef20c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3484398adc19684c", "level": "warning", "message": {"text": "Frontend route `booking` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "683bd2cccac44f50", "scanner": "scanner-primary", "fingerprint": "3484398adc19684c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-39a308e99cf67231", "level": "warning", "message": {"text": "Frontend route `visualizer` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "5765bd78ef1ac184", "scanner": "scanner-primary", "fingerprint": "39a308e99cf67231", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-508fc0ffdffa121c", "level": "warning", "message": {"text": "Frontend route `portalen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "45a8c47c7edd0f46", "scanner": "scanner-primary", "fingerprint": "508fc0ffdffa121c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a352916f08345dc7", "level": "warning", "message": {"text": "Frontend route `meldingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "264aa80dda164ded", "scanner": "scanner-primary", "fingerprint": "a352916f08345dc7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c71dd59364f0920c", "level": "warning", "message": {"text": "Frontend route `instellingen` has no Link/navigate to it \u2014 forgedesk/src/App.tsx"}, "properties": {"repobilityId": "a35123fa580a5f26", "scanner": "scanner-primary", "fingerprint": "c71dd59364f0920c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}