{"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-d02de91a49041b33", "name": "TODO/FIXME marker in shipping code \u2014 tests/auth.spec.ts:76", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 tests/auth.spec.ts:76"}, "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-f420f38453b595a9", "name": "Stray `console.log` in TS/JS \u2014 tests/ui-crawler.spec.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/ui-crawler.spec.ts:91"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1af9d4037b5c9c02", "name": "Stray `console.log` in TS/JS \u2014 scripts/web-scraper.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/web-scraper.ts:9"}, "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-56ddde40d2a3d93e", "name": "Stray `console.log` in TS/JS \u2014 scripts/coolgroove-complete-test.ts:78", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/coolgroove-complete-test.ts:78"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b561f5446864ef56", "name": "Stray `console.log` in TS/JS \u2014 scripts/interactive-browser.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/interactive-browser.ts:9"}, "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-36b0b847d8e79849", "name": "Stray `console.log` in TS/JS \u2014 scripts/explore-all-pages.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/explore-all-pages.ts:49"}, "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-46535149857095e6", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-own-app.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-own-app.ts:9"}, "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-b7bc558040e7bb95", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-chat-events.ts:97", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-chat-events.ts:97"}, "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-57c210afb83a9ec6", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-mars-tasks.ts:202", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-mars-tasks.ts:202"}, "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-e6fa16a16948ed02", "name": "Stray `console.log` in TS/JS \u2014 scripts/comprehensive-ui-test.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/comprehensive-ui-test.ts:35"}, "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-9c4f88504f3b4793", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_api_gaps.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_api_gaps.js:6"}, "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-c774ff988fa1dbd6", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_data_links.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_data_links.js:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37067a3757e7eca2", "name": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_data_density.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_data_density.js:25"}, "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-c68de4a759dee737", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/test_partnerships.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/test_partnerships.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-443463b38cf747ea", "name": "Stray `console.log` in TS/JS \u2014 backend/scripts/test-integration.ts:69", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/test-integration.ts:69"}, "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-db1b3e062b676347", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-real-login.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-real-login.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb0052c730293931", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-connections.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-connections.ts:6"}, "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-a395d61815b3cea8", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-date-handling.ts:243", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-date-handling.ts:243"}, "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-38989d9e80d01cba", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-whatsapp-qr.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-whatsapp-qr.ts:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d90db2a4963b6ff0", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/count-tasks-standard.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/count-tasks-standard.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1256b3057ab33826", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-voice-note-native.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-voice-note-native.ts:16"}, "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-4da0473f34260989", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-task-627.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-task-627.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3e4c6e3d46268a8", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-custom-sync.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-custom-sync.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae1d2422297f2194", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/investigate-permissions.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/investigate-permissions.ts:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-62ad10f20ea3d5bf", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-inter-api.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-inter-api.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee0cb28072e64693", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-auth.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-auth.ts:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f00f46e90c3200a", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-puppeteer.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-puppeteer.js: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-dcf7a180c2825d3a", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-whatsapp.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-whatsapp.ts:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f1e68b97add2b8d", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-rights.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-rights.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb786b12a2a80f9e", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-whatsapp.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-whatsapp.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a930367063968c32", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-user-fields.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-user-fields.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e253f36796c63420", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-dolibarr.ts:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-dolibarr.ts:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c52bbf1ee9d4c51d", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-vuln.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-vuln.ts:6"}, "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-fb6add8b2c3a3917", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-tasks-raw.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-tasks-raw.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa34072b8f2fd685", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify_params.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify_params.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a0859348e026798", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test_events_mapping.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test_events_mapping.ts:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-753c2e6f10778c85", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-connection.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-connection.ts:6"}, "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-12879c73f255af60", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-dolibarr-proxy.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-dolibarr-proxy.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d348a9ac74fcd41", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify-user-rights.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify-user-rights.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-b8dc1077d73edeec", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/run-taskrunner-canary.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/run-taskrunner-canary.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9c638575812c57f", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-audio-send.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-audio-send.ts:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-408f7d5373cdfa72", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-tasks-raw.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-tasks-raw.ts:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-334d741383f7e97a", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-dolibarr-cookie.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-dolibarr-cookie.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a3cdab1bda5851d", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-delta-sync.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-delta-sync.ts:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7f0c1e9e1ea02b8", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-admin-check.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-admin-check.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e617dc7f4d95a6a3", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify-session-rename.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify-session-rename.ts:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e38961d7e61ee539", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/testEmailConnection.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/testEmailConnection.ts:6"}, "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-736519f46f8093b6", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-user-permissions.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-user-permissions.ts:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-53d8a4b90ae11565", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-signature.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-signature.ts:9"}, "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-799d1eeee9316390", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-client-stripping.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-client-stripping.ts:6"}, "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-98b14321fd50af9b", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test_date_conversion.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test_date_conversion.ts:28"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5069e46524644e4", "name": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/count-tasks.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/count-tasks.ts:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5e47401873f11c9c", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/routes/adminRoutes.ts:357", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/routes/adminRoutes.ts:357"}, "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-b59f62faecbbb3d5", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/services/bankingService.ts:559", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/services/bankingService.ts:559"}, "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-74887d248ddb5271", "name": "TODO/FIXME marker in shipping code \u2014 backend/src/services/approvalService.ts:459", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/services/approvalService.ts:459"}, "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-ca7c39ac6fee1e5b", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/verify_permission_logic.js:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/verify_permission_logic.js:82"}, "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-9ecbc05e92303b3f", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/test_sync.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/test_sync.js:9"}, "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-b4e48c2e15108458", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/debug_tasks_placeholder.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/debug_tasks_placeholder.ts:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce4fb23dd07bfaaa", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/compare_tasks.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/compare_tasks.ts:25"}, "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-2ac87edf226941bc", "name": "Stray `console.log` in TS/JS \u2014 src/scripts/verify_permission_logic.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/verify_permission_logic.ts:103"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3a49948cc7fd9bb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/utils/sanitizeHtml.tsx:42", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/utils/sanitizeHtml.tsx:42"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-16aed5fbc925f159", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PendingPayments.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PendingPayments.tsx:191"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ab47ce4cf14b163b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WhatsAppView.tsx:323", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WhatsAppView.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-68ddc3efa2e37f93", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SupplierInvoiceList.tsx:640", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SupplierInvoiceList.tsx:640"}, "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-155db9ab391dc190", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CategoryList.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CategoryList.tsx:58"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f65be044ce6a844", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ProductList.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ProductList.tsx:88"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb9de6b0971a3a20", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/GlobalSearch.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GlobalSearch.tsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a9c1edb345a52cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CustomerList.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CustomerList.tsx:48"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98efc6641e6ecbd7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AgendaView.tsx:729", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AgendaView.tsx:729"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5199fbe382539c8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Dashboard.tsx:779", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Dashboard.tsx:779"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8967b5dcd0cf4ad", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ProposalList.tsx:789", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ProposalList.tsx:789"}, "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-35c07bd6d9db83af", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierPaymentList.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierPaymentList.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-c6cf3a9d8c1cf18a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/BankAccountList.tsx:630", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BankAccountList.tsx:630"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20e45f56633ba219", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/InterventionList.tsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/InterventionList.tsx:266"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-24df857d70afdd54", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/InterventionList.tsx:360", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/InterventionList.tsx:360"}, "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-48d84717ff6af5a9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/VenueList.tsx:275", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/VenueList.tsx:275"}, "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-8f5616497e6b8b56", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/VirtualAssistant.tsx:406", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/VirtualAssistant.tsx:406"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b58dd40fd5356c6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/WarehouseList.tsx:58", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WarehouseList.tsx:58"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-75bab199a47b6976", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ActivityView.tsx:471", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ActivityView.tsx:471"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c1938af888026c5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PaymentList.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PaymentList.tsx:186"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2db9457a5bbef99a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/InvoiceList.tsx:753", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/InvoiceList.tsx:753"}, "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-9f13f3caa30b3a37", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ChatSessionsView.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ChatSessionsView.tsx:124"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94596335faa88741", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContactList.tsx:220", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContactList.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-d5e23240cd8ed657", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/TicketList.tsx:328", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/TicketList.tsx:328"}, "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-721bba087d448772", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TaskDetail.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TaskDetail.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-e4ad64edc15dad3b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/TaskDetail.tsx:343", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/TaskDetail.tsx:343"}, "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-e75efd16cad76774", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierProposalList.tsx:453", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierProposalList.tsx:453"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b15adf529389821e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SupplierProposalList.tsx:660", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SupplierProposalList.tsx:660"}, "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-106b0331ee89c1a1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ProjectList.tsx:854", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ProjectList.tsx:854"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5f0d23e3a759cbe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierList.tsx:438", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierList.tsx:438"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4626bf1c9605a821", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Reports/FinanceTab.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Reports/FinanceTab.tsx:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e15c09ba2ad774e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Projects/TaskWizard.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Projects/TaskWizard.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-bafb3a8ff69b8ddc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Chat/ChatInterface.tsx:321", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Chat/ChatInterface.tsx:321"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c18c034a3de79210", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Chat/ChatSidebar.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Chat/ChatSidebar.tsx:137"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4aa3c44e52a30235", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/LinkedObjects.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/LinkedObjects.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c7b1034aac78bb6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TasksBoard/TasksBoard.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TasksBoard/TasksBoard.tsx:215"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c16bfedb1b50f32f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/TasksBoard/TaskReviewPanel.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TasksBoard/TaskReviewPanel.tsx:171"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7acc890c8c08183", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HR/modals/ExpenseDetailModal.tsx:299", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HR/modals/ExpenseDetailModal.tsx:299"}, "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-8f3a7f361accd97e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/MonthView.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/MonthView.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-41ead1ae39d93616", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/EventDetailsModal.tsx:159", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/EventDetailsModal.tsx:159"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-074f011687573bb3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/ArtistList.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/ArtistList.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42c5bfc4e9066b96", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/DashboardConfigEditor.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/DashboardConfigEditor.tsx:73"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2cbb801f0d887b8e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/GroupManager.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/GroupManager.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-26df1f29483ff697", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/ScreenPermissionsEditor.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/ScreenPermissionsEditor.tsx:177"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9afb4af1e18fd19f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ChatWindow.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ChatWindow.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51a6e79df5ce9158", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ContactPicker.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ContactPicker.tsx:154"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-08a4d4e52285f02d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ConversationList.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ConversationList.tsx:195"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-55799bb7e7df9c51", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout/Sidebar.tsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout/Sidebar.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-2a099247919af3d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout/Header.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout/Header.tsx:92"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51782659676395d5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/StockCountPanel.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/StockCountPanel.tsx:113"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d2cc9cd1d874eb8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/UserTaskDashboard.tsx:834", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/UserTaskDashboard.tsx:834"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-896e16cf7357ee97", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/TaskAssistantModal.tsx:332", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/TaskAssistantModal.tsx:332"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dffabf80c84d777f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/TimeAnalysisDashboard.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/TimeAnalysisDashboard.tsx:146"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51f5667676ec3598", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Banking/BankStatementImport.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Banking/BankStatementImport.tsx:233"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2483c656657fdbc6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailContextPanel.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailContextPanel.tsx:60"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-da65690ee41ab685", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailTemplateManager.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailTemplateManager.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-fa8fdf553eb02ce3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailView.tsx:512", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailView.tsx:512"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0f11173413bd6b47", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailComposer.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailComposer.tsx:232"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbfd51ccb3fbcc5c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailAccountList.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailAccountList.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-511e9cee109b4b5b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailReadingPane.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailReadingPane.tsx:195"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1aaf4bcb82e1e5e4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/Email/EmailReadingPane.tsx:233", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/Email/EmailReadingPane.tsx:233"}, "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-278b5b634548c022", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/DevelopmentConsole/ConsoleLogsTab.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/DevelopmentConsole/ConsoleLogsTab.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-da098d69888f6a2c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Finance/ExpenseReportPaymentList.tsx:173", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Finance/ExpenseReportPaymentList.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-f4ceed60ad179e2a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Finance/ReceiptWizard.tsx:547", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Finance/ReceiptWizard.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-1084c853724ad15d", "name": "Stray `console.log` in TS/JS \u2014 src/components/Finance/ReceiptWizard.tsx:55", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/Finance/ReceiptWizard.tsx:55"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ed2d64c05678ce2c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Issues/IssuesPage.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Issues/IssuesPage.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f07a207aef1edb7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Simulator/components/steps/Step2Negotiation.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Simulator/components/steps/Step2Negotiation.tsx:188"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de5b60e122e2a9cf", "name": "Stray `console.log` in TS/JS \u2014 src/services/backgroundSyncService.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/services/backgroundSyncService.ts:123"}, "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-1b95421fa00bfcda", "name": "Privileged port 993 in use", "shortDescription": {"text": "Privileged port 993 in use"}, "fullDescription": {"text": "Port 993 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ea02f272fbfb9d6", "name": "Privileged port 587 in use", "shortDescription": {"text": "Privileged port 587 in use"}, "fullDescription": {"text": "Port 587 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-638bfb9410fed9ba", "name": "Insecure pattern 'node_child_process' in vite.config.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in vite.config.ts:2"}, "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-fa53c99bd5c32a27", "name": "Possible secret in scripts/coolgroove-complete-test.ts", "shortDescription": {"text": "Possible secret in scripts/coolgroove-complete-test.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-b1a76e5429eece7d", "name": "Possible secret in scripts/explore-all-pages.ts", "shortDescription": {"text": "Possible secret in scripts/explore-all-pages.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6e5e0b36936af635", "name": "Possible secret in backend/src/scripts/debug-user-fields.ts", "shortDescription": {"text": "Possible secret in backend/src/scripts/debug-user-fields.ts"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-96d473fc00da70fd", "name": "Insecure pattern 'node_child_process' in backend/src/scripts/check-dolibarr-cookie.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/scripts/check-dolibarr-cookie.ts:4"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9ef0fc5dde42efc", "name": "Possible secret in backend/src/scripts/debug-signature.ts", "shortDescription": {"text": "Possible secret in backend/src/scripts/debug-signature.ts"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-cfd7a382e516d15e", "name": "Insecure pattern 'node_child_process' in backend/src/utils/processTree.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/utils/processTree.ts:1"}, "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-0a10948106b21eab", "name": "Insecure pattern 'node_child_process' in backend/src/routes/githubRoutes.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/routes/githubRoutes.ts:2"}, "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-ac38822d2c4cb3a3", "name": "Insecure pattern 'node_child_process' in backend/src/services/taskRunnerService.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/services/taskRunnerService.ts:1"}, "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-df00dee625eb9d6c", "name": "Insecure pattern 'node_child_process' in backend/src/services/tunnelService.ts:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/services/tunnelService.ts:6"}, "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-bd35d414b94a310f", "name": "Insecure pattern 'node_child_process' in backend/src/services/taskPlannerService.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/services/taskPlannerService.ts:1"}, "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-724361aaa743125d", "name": "Insecure pattern 'node_child_process' in backend/src/services/agentTools.ts:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in backend/src/services/agentTools.ts:12"}, "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-91a496e975346647", "name": "Possible secret in src/scripts/compare_tasks.ts", "shortDescription": {"text": "Possible secret in src/scripts/compare_tasks.ts"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-770b018b0297bdae", "name": "Insecure pattern 'dangerous_innerhtml' in src/utils/sanitizeHtml.tsx:42", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/utils/sanitizeHtml.tsx:42"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e635c77d78738b45", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/SupplierInvoiceList.tsx:640", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/SupplierInvoiceList.tsx:640"}, "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-003886b7fc9b1081", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ProposalList.tsx:789", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ProposalList.tsx:789"}, "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-8b9c630f2059b3a9", "name": "Insecure pattern 'document_write' in src/components/ActivityReportModal.tsx:136", "shortDescription": {"text": "Insecure pattern 'document_write' in src/components/ActivityReportModal.tsx:136"}, "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-39dfb2ea7b9f4f3b", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/InterventionList.tsx:360", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/InterventionList.tsx:360"}, "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-99fe0fe75e1fa133", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/VenueList.tsx:275", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/VenueList.tsx:275"}, "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-f5e486dfac483f3c", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/InvoiceList.tsx:753", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/InvoiceList.tsx:753"}, "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-31efa6b23944b9aa", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/TicketList.tsx:328", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/TicketList.tsx:328"}, "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-d4ca2c7861f4cbd6", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/TaskDetail.tsx:343", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/TaskDetail.tsx:343"}, "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-c894e09499d0bb80", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/SupplierProposalList.tsx:660", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/SupplierProposalList.tsx:660"}, "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-657507b5d9fad723", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/common/RichTextEditor.tsx:21", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/common/RichTextEditor.tsx:21"}, "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-2c7f0d8ad6335f05", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/RichTextEditor.tsx:52", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/RichTextEditor.tsx:52"}, "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-226101a3f588c562", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/HR/modals/ExpenseDetailModal.tsx:299", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/HR/modals/ExpenseDetailModal.tsx:299"}, "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-1be6f78aab42df78", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/Email/EmailReadingPane.tsx:233", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/Email/EmailReadingPane.tsx:233"}, "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-c306b3f793c2df27", "name": "Very large file: backend/src/types/dolibarr.actions.d.ts (18144 lines)", "shortDescription": {"text": "Very large file: backend/src/types/dolibarr.actions.d.ts (18144 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-a125b1ad428adff5", "name": "Very large file: backend/src/services/taskRunnerService.ts (2581 lines)", "shortDescription": {"text": "Very large file: backend/src/services/taskRunnerService.ts (2581 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-6e6cc77bde38cf9b", "name": "Very large file: backend/src/services/agentTools.ts (1866 lines)", "shortDescription": {"text": "Very large file: backend/src/services/agentTools.ts (1866 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-aa099ec88ab2a549", "name": "Very large file: backend/src/services/aiService.ts (1531 lines)", "shortDescription": {"text": "Very large file: backend/src/services/aiService.ts (1531 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-8fec47f15a6ead10", "name": "Very large file: src/types/dolibarr.actions.d.ts (18144 lines)", "shortDescription": {"text": "Very large file: src/types/dolibarr.actions.d.ts (18144 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-45ba21b5f34a63db", "name": "Very large file: src/components/SupplierInvoiceList.tsx (1013 lines)", "shortDescription": {"text": "Very large file: src/components/SupplierInvoiceList.tsx (1013 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-c9b699202b8c9db3", "name": "Very large file: src/components/CustomerList.tsx (1080 lines)", "shortDescription": {"text": "Very large file: src/components/CustomerList.tsx (1080 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-739126bc87472735", "name": "Very large file: src/components/ProposalList.tsx (1063 lines)", "shortDescription": {"text": "Very large file: src/components/ProposalList.tsx (1063 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-61aa87bda35537c4", "name": "Very large file: src/components/BankAccountList.tsx (866 lines)", "shortDescription": {"text": "Very large file: src/components/BankAccountList.tsx (866 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-cc4ee3cc2480c69e", "name": "Very large file: src/components/InvoiceList.tsx (1126 lines)", "shortDescription": {"text": "Very large file: src/components/InvoiceList.tsx (1126 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-b86978c60441e8d1", "name": "Very large file: src/components/SchedulerAdmin.tsx (1645 lines)", "shortDescription": {"text": "Very large file: src/components/SchedulerAdmin.tsx (1645 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cdc79eca61997c4e", "name": "Very large file: src/components/SupplierProposalList.tsx (909 lines)", "shortDescription": {"text": "Very large file: src/components/SupplierProposalList.tsx (909 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-be8203cf7ea1a9e2", "name": "Very large file: src/components/TasksBoard/TasksBoard.tsx (892 lines)", "shortDescription": {"text": "Very large file: src/components/TasksBoard/TasksBoard.tsx (892 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-e0bae6c0a946dd5a", "name": "Very large file: src/components/Tasks/UserTaskDashboard.tsx (1076 lines)", "shortDescription": {"text": "Very large file: src/components/Tasks/UserTaskDashboard.tsx (1076 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-b314dcc28afa82fc", "name": "Very large file: src/components/DevelopmentConsole/LlmSettingsTab.tsx (988 lines)", "shortDescription": {"text": "Very large file: src/components/DevelopmentConsole/LlmSettingsTab.tsx (988 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-95fdc144895d0699", "name": "Very large file: src/components/Issues/IssuesPage.tsx (907 lines)", "shortDescription": {"text": "Very large file: src/components/Issues/IssuesPage.tsx (907 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 636 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 302 placeholder/mock markers across 106 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e012cc3ec2e38983", "name": "Commented-code block (6 lines) in scripts/diagnostics/analyze_api_gaps.js:31", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/diagnostics/analyze_api_gaps.js:31"}, "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-127be3b415edc068", "name": "Commented-code block (7 lines) in backend/src/server.ts:28", "shortDescription": {"text": "Commented-code block (7 lines) in backend/src/server.ts:28"}, "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-a6c1a09db1216beb", "name": "Legacy-named symbol `t2a_v2` in backend/src/__tests__/services/minimaxService.test.ts:22", "shortDescription": {"text": "Legacy-named symbol `t2a_v2` in backend/src/__tests__/services/minimaxService.test.ts:22"}, "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-b61f99186e1298ff", "name": "Commented-code block (5 lines) in backend/src/middleware/authMiddleware.ts:101", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/middleware/authMiddleware.ts:101"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ed68786c311ba60", "name": "Commented-code block (5 lines) in backend/src/scripts/test-client-stripping.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/scripts/test-client-stripping.ts:13"}, "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-27ea72f6d920fc50", "name": "Commented-code block (5 lines) in backend/src/utils/processTree.ts:148", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/utils/processTree.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-8fd398edfbd402d6", "name": "Commented-code block (5 lines) in backend/src/routes/adminRoutes.ts:9", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/routes/adminRoutes.ts:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122d7e9d30083f27", "name": "Commented-code block (5 lines) in backend/src/services/bankingService.ts:559", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/services/bankingService.ts:559"}, "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-48a4f74155b952f9", "name": "Commented-code block (6 lines) in backend/src/services/taskRunnerService.ts:679", "shortDescription": {"text": "Commented-code block (6 lines) in backend/src/services/taskRunnerService.ts:679"}, "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-7dd333fb268cc587", "name": "Commented-code block (5 lines) in backend/src/services/tunnelService.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/services/tunnelService.ts:1"}, "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-11e7f74cd13aa927", "name": "Legacy-named symbol `t2a_v2` in backend/src/services/minimaxService.ts:52", "shortDescription": {"text": "Legacy-named symbol `t2a_v2` in backend/src/services/minimaxService.ts:52"}, "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-40d6d10f6307bbfc", "name": "Commented-code block (5 lines) in backend/src/services/aiService.ts:1308", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/services/aiService.ts:1308"}, "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-ed34b51a1578b663", "name": "Commented-code block (5 lines) in backend/src/services/dolibarr/operations.ts:109", "shortDescription": {"text": "Commented-code block (5 lines) in backend/src/services/dolibarr/operations.ts:109"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-caa8cd9865524d0e", "name": "Commented-code block (5 lines) in src/config/dashboardWidgets.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/config/dashboardWidgets.ts:5"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7a2ca636a4def3e8", "name": "Commented-code block (5 lines) in src/config/menuRegistry.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/config/menuRegistry.ts:1"}, "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-342f709c6f4cefc3", "name": "Commented-code block (7 lines) in src/components/WhatsAppView.tsx:131", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/WhatsAppView.tsx:131"}, "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-3ed6f68052c8fa21", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/SchedulerAdmin.tsx:199", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/SchedulerAdmin.tsx:199"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b19a0f09b6438ddd", "name": "Commented-code block (5 lines) in src/components/Tasks/UserTaskDashboard.tsx:79", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/Tasks/UserTaskDashboard.tsx:79"}, "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-f2e0b8bef072cd81", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/Banking/BankingInsightsPanel.tsx:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/Banking/BankingInsightsPanel.tsx:64"}, "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-54ecffe4b9032ece", "name": "Commented-code block (5 lines) in src/components/Modals/SupplierPaymentModal.tsx:46", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/Modals/SupplierPaymentModal.tsx:46"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f6611a1bc089cbc7", "name": "Legacy-named symbol `eventscale_snapshots_v1` in src/pages/Simulator/components/modals/SavedSimulationsModal.tsx:21", "shortDescription": {"text": "Legacy-named symbol `eventscale_snapshots_v1` in src/pages/Simulator/components/modals/SavedSimulationsModal.tsx:21"}, "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-842a0c03e13dc95d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useNotifications.ts:179", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useNotifications.ts:179"}, "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-1449e62f6283cb9d", "name": "Commented-code block (20 lines) in src/hooks/dolibarr/hooks.ts:347", "shortDescription": {"text": "Commented-code block (20 lines) in src/hooks/dolibarr/hooks.ts:347"}, "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-35c132c00eb854e1", "name": "Commented-code block (7 lines) in src/hooks/whatsapp/useConversations.ts:81", "shortDescription": {"text": "Commented-code block (7 lines) in src/hooks/whatsapp/useConversations.ts:81"}, "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-dc0ca5b37a5e23a4", "name": "Commented-code block (9 lines) in src/services/api/core.ts:502", "shortDescription": {"text": "Commented-code block (9 lines) in src/services/api/core.ts:502"}, "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-11e66084e40c85e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/api/core.ts:555", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/api/core.ts:555"}, "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-3dfbc5467048f408", "name": "Commented-code block (6 lines) in src/services/api/operations.ts:32", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/api/operations.ts:32"}, "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-9c1fcfe6458a1695", "name": "Commented-code block (6 lines) in src/services/api/hrAdmin.ts:450", "shortDescription": {"text": "Commented-code block (6 lines) in src/services/api/hrAdmin.ts:450"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bddda3d5a14c7401", "name": "29 env vars used in code but missing from .env.example", "shortDescription": {"text": "29 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `APPROVAL_HISTORY_RETENTION_DAYS`, `APPROVAL_PENDING_TTL_HOURS`, `APP_VERSION`, `CI`, `CLOUDFLARE_TUNNEL_ENABLED`, `CLOUDFLARE_TUNNEL_TARGET`, `DEEPLINK_TOKEN_SECRET`, `DEV` + 21 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ebc058af99148ac", "name": "Frontend route `/customers/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/customers/new` has no Link/navigate to it \u2014 src/components/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-8f48f747b57fcbc5", "name": "Frontend route `/customers/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/customers/:id` has no Link/navigate to it \u2014 src/components/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-d4c38ddb9fd4f95f", "name": "Frontend route `/customers/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/customers/:id/edit` has no Link/navigate to it \u2014 src/components/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-bbad5b4b95720e5f", "name": "Frontend route `/contacts` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/contacts` has no Link/navigate to it \u2014 src/components/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-887d04dbf62f9838", "name": "Frontend route `/contacts/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/contacts/new` has no Link/navigate to it \u2014 src/components/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-af5e40f71bdd5493", "name": "Frontend route `/contacts/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/contacts/:id` has no Link/navigate to it \u2014 src/components/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-451ef7ddbc518520", "name": "Frontend route `/contacts/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/contacts/:id/edit` has no Link/navigate to it \u2014 src/components/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-1a2c7e5fc7c56a6b", "name": "Frontend route `/suppliers/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/suppliers/new` has no Link/navigate to it \u2014 src/components/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-96c9aae9645f150f", "name": "Frontend route `/suppliers/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/suppliers/:id` has no Link/navigate to it \u2014 src/components/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-a60e3628c24869d2", "name": "Frontend route `/suppliers/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/suppliers/:id/edit` has no Link/navigate to it \u2014 src/components/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-dab3970b5dbeb63e", "name": "Frontend route `/venues/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/venues/:id` has no Link/navigate to it \u2014 src/components/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-fcba3dbe043727d8", "name": "Frontend route `/invoices/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/invoices/new` has no Link/navigate to it \u2014 src/components/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-1c0186e2fb51956c", "name": "Frontend route `/invoices/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/invoices/:id/edit` has no Link/navigate to it \u2014 src/components/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-b7a45773b186cc67", "name": "Frontend route `/invoices/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/invoices/:id` has no Link/navigate to it \u2014 src/components/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-5160574a35523cad", "name": "Frontend route `/supplier_invoices/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/supplier_invoices/new` has no Link/navigate to it \u2014 src/components/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-5588222766d2b128", "name": "Frontend route `/supplier_invoices/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/supplier_invoices/:id/edit` has no Link/navigate to it \u2014 src/components/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-7a2888352249ea9f", "name": "Frontend route `/supplier_invoices/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/supplier_invoices/:id` has no Link/navigate to it \u2014 src/components/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-b99192751f05dbb0", "name": "Frontend route `/proposals/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/proposals/new` has no Link/navigate to it \u2014 src/components/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-7de7973d47d0ee9a", "name": "Frontend route `/proposals/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/proposals/:id/edit` has no Link/navigate to it \u2014 src/components/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-41540ef3a11294dc", "name": "Frontend route `/proposals/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/proposals/:id` has no Link/navigate to it \u2014 src/components/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-2391e8e0c7a53e90", "name": "Frontend route `/supplier_proposals/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/supplier_proposals/new` has no Link/navigate to it \u2014 src/components/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-8eeecb8f28b8e326", "name": "Frontend route `/supplier_proposals/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/supplier_proposals/:id/edit` has no Link/navigate to it \u2014 src/components/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-922a2907aca7f041", "name": "Frontend route `/supplier_proposals/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/supplier_proposals/:id` has no Link/navigate to it \u2014 src/components/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-0d83d20e6fd3f101", "name": "Frontend route `/orders/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/orders/new` has no Link/navigate to it \u2014 src/components/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-cebd07ef89ad0045", "name": "Frontend route `/orders/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/orders/:id` has no Link/navigate to it \u2014 src/components/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-8b3e65c3021cff22", "name": "Frontend route `/orders/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/orders/:id/edit` has no Link/navigate to it \u2014 src/components/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-32e6c8f6754d28b5", "name": "Frontend route `/projects/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/projects/new` has no Link/navigate to it \u2014 src/components/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-81619cafec57e3aa", "name": "Frontend route `/projects/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:id` has no Link/navigate to it \u2014 src/components/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-9848e66cce0d6186", "name": "Frontend route `/projects/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/projects/:id/edit` has no Link/navigate to it \u2014 src/components/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-70fd3311dbb22232", "name": "Frontend route `/tasks` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tasks` has no Link/navigate to it \u2014 src/components/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-021df5923a61e486", "name": "Frontend route `/tasks/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tasks/new` has no Link/navigate to it \u2014 src/components/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-fa15388a856eeba7", "name": "Frontend route `/tasks/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tasks/:id` has no Link/navigate to it \u2014 src/components/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-542bb1c4ddee9b2f", "name": "Frontend route `/tasks/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tasks/:id/edit` has no Link/navigate to it \u2014 src/components/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-356dc5979cec8ee2", "name": "Frontend route `/tickets/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tickets/new` has no Link/navigate to it \u2014 src/components/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-5b6287a53e065f17", "name": "Frontend route `/tickets/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tickets/:id/edit` has no Link/navigate to it \u2014 src/components/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-7c9b08bf41dad4eb", "name": "Frontend route `/tickets/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tickets/:id` has no Link/navigate to it \u2014 src/components/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-04ad9341a4188bae", "name": "Frontend route `/products/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/products/new` has no Link/navigate to it \u2014 src/components/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-5c01d29ac971c22c", "name": "Frontend route `/products/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/products/:id/edit` has no Link/navigate to it \u2014 src/components/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-17aedd29d1fae186", "name": "Frontend route `/products/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/products/:id` has no Link/navigate to it \u2014 src/components/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-79da2406a60ee985", "name": "Frontend route `/services` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/services` has no Link/navigate to it \u2014 src/components/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-b67448cb4cf0d345", "name": "Frontend route `/services/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/services/:id` has no Link/navigate to it \u2014 src/components/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-e4567ec854a132e8", "name": "Frontend route `/categories/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/categories/new` has no Link/navigate to it \u2014 src/components/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-cc7aa68cb0364ca4", "name": "Frontend route `/categories/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/categories/:id/edit` has no Link/navigate to it \u2014 src/components/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-c2e317f38df2818a", "name": "Frontend route `/batch/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/batch/new` has no Link/navigate to it \u2014 src/components/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-8baccad05828c3bd", "name": "Frontend route `/manufacturing/mo/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/manufacturing/mo/new` has no Link/navigate to it \u2014 src/components/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-291623da51808eb5", "name": "Frontend route `/manufacturing/mo/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/manufacturing/mo/:id/edit` has no Link/navigate to it \u2014 src/components/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-f3a139b972806ebd", "name": "Frontend route `/manufacturing/bom/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/manufacturing/bom/new` has no Link/navigate to it \u2014 src/components/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-5a1eb9dd5b7e4873", "name": "Frontend route `/manufacturing/bom/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/manufacturing/bom/:id/edit` has no Link/navigate to it \u2014 src/components/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-3a2ed262c89c95c5", "name": "Frontend route `/interventions/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/interventions/new` has no Link/navigate to it \u2014 src/components/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-54964f450dbd9e4d", "name": "Frontend route `/interventions/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/interventions/:id` has no Link/navigate to it \u2014 src/components/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-869a68c70821df09", "name": "Frontend route `/interventions/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/interventions/:id/edit` has no Link/navigate to it \u2014 src/components/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-0cf0f17ca5d327bf", "name": "Frontend route `/contracts/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/contracts/new` has no Link/navigate to it \u2014 src/components/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-915ec2d30ea34dd3", "name": "Frontend route `/contracts/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/contracts/:id/edit` has no Link/navigate to it \u2014 src/components/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-8cc91d0e0011c08b", "name": "Frontend route `/hr/jobs/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/jobs/new` has no Link/navigate to it \u2014 src/components/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-83178fb07669f96a", "name": "Frontend route `/hr/jobs/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/jobs/:id/edit` has no Link/navigate to it \u2014 src/components/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-ccec3a713889676d", "name": "Frontend route `/hr/leaves/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/leaves/new` has no Link/navigate to it \u2014 src/components/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-2ae0d3b1df0e9579", "name": "Frontend route `/hr/leaves/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/leaves/:id/edit` has no Link/navigate to it \u2014 src/components/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-26e7306154508283", "name": "Frontend route `/hr/candidates/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/candidates/new` has no Link/navigate to it \u2014 src/components/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-2df5e026993b4e65", "name": "Frontend route `/hr/candidates/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/candidates/:id/edit` has no Link/navigate to it \u2014 src/components/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-cd9ab4e180ddee23", "name": "Frontend route `/hr/users/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/users/new` has no Link/navigate to it \u2014 src/components/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-01ec32255c706175", "name": "Frontend route `/hr/users/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/users/:id/edit` has no Link/navigate to it \u2014 src/components/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-5e3b58b1fb98410c", "name": "Frontend route `/hr/groups/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/groups/new` has no Link/navigate to it \u2014 src/components/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-5193812d3e34bcfb", "name": "Frontend route `/hr/groups/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/groups/:id/edit` has no Link/navigate to it \u2014 src/components/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-f0a3062837242240", "name": "Frontend route `/hr/expenses/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/expenses/new` has no Link/navigate to it \u2014 src/components/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-304c32f940ae4529", "name": "Frontend route `/hr/expenses/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/expenses/:id/edit` has no Link/navigate to it \u2014 src/components/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-47af6e1d9d895086", "name": "Frontend route `/hr/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/hr/:id` has no Link/navigate to it \u2014 src/components/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-da05c58d2ceb8c35", "name": "Frontend route `/agenda/new` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/agenda/new` has no Link/navigate to it \u2014 src/components/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-9f5484bdc8e32688", "name": "Frontend route `/agenda/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/agenda/:id/edit` has no Link/navigate to it \u2014 src/components/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-23431a1a68b16734", "name": "Frontend route `/agenda/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/agenda/:id` has no Link/navigate to it \u2014 src/components/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-44ff5f070eb65df5", "name": "Frontend route `/payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/payments/:id` has no Link/navigate to it \u2014 src/components/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-89470ab8874b6b6e", "name": "Frontend route `/supplier_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/supplier_payments/:id` has no Link/navigate to it \u2014 src/components/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-020cf6dbc1021761", "name": "Frontend route `/tax_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/tax_payments/:id` has no Link/navigate to it \u2014 src/components/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-15bcbc3ba49d6245", "name": "Frontend route `/salary_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/salary_payments/:id` has no Link/navigate to it \u2014 src/components/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-3444dcee536f2bc5", "name": "Frontend route `/expense_report_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/expense_report_payments/:id` has no Link/navigate to it \u2014 src/components/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-a04ad2338b035697", "name": "Frontend route `/opencode-tasks` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `/opencode-tasks` has no Link/navigate to it \u2014 src/components/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-36f360829fd4b09a", "name": "Frontend route `:type/:id` has no Link/navigate to it \u2014 src/components/App.tsx", "shortDescription": {"text": "Frontend route `:type/:id` has no Link/navigate to it \u2014 src/components/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-134fec92de346256", "name": "Dangling fetch: DELETE http://localhost:${config.port}/api/dolibarr/thirdparties/${res.data} (backend/src/scripts/test-c", "shortDescription": {"text": "Dangling fetch: DELETE http://localhost:${config.port}/api/dolibarr/thirdparties/${res.data} (backend/src/scripts/test-client-stripping.ts:42)"}, "fullDescription": {"text": "`backend/src/scripts/test-client-stripping.ts:42` calls `DELETE http://localhost:${config.port}/api/dolibarr/thirdparties/${res.data}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/http:/localhost:/<p>/api/dolibarr/thirdparties/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3c991203e0997426", "name": "Dangling fetch: POST https://google.serper.dev/search (backend/src/services/scraperService.ts:23)", "shortDescription": {"text": "Dangling fetch: POST https://google.serper.dev/search (backend/src/services/scraperService.ts:23)"}, "fullDescription": {"text": "`backend/src/services/scraperService.ts:23` calls `POST https://google.serper.dev/search` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/google.serper.dev/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f8d31ce6e83c1c95", "name": "Dangling fetch: GET /api/admin/status (src/components/AdminApp.tsx:41)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/status (src/components/AdminApp.tsx:41)"}, "fullDescription": {"text": "`src/components/AdminApp.tsx:41` calls `GET /api/admin/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e8e562757590fa21", "name": "Dangling fetch: POST /api/admin/restart (src/components/AdminApp.tsx:59)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/restart (src/components/AdminApp.tsx:59)"}, "fullDescription": {"text": "`src/components/AdminApp.tsx:59` calls `POST /api/admin/restart` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/restart`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07237142cc91d71c", "name": "Dangling fetch: POST /api/documents/send (src/components/Banking/SendDocumentModal.tsx:62)", "shortDescription": {"text": "Dangling fetch: POST /api/documents/send (src/components/Banking/SendDocumentModal.tsx:62)"}, "fullDescription": {"text": "`src/components/Banking/SendDocumentModal.tsx:62` calls `POST /api/documents/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/documents/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-15d601b6ae51b770", "name": "Dangling fetch: POST /api/banking/insights/cash-flow (src/components/Banking/BankingInsightsPanel.tsx:48)", "shortDescription": {"text": "Dangling fetch: POST /api/banking/insights/cash-flow (src/components/Banking/BankingInsightsPanel.tsx:48)"}, "fullDescription": {"text": "`src/components/Banking/BankingInsightsPanel.tsx:48` calls `POST /api/banking/insights/cash-flow` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/banking/insights/cash-flow`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-85bf397e7fb799af", "name": "Dangling fetch: POST /api/banking/analyze/anomalies (src/components/Banking/BankingInsightsPanel.tsx:64)", "shortDescription": {"text": "Dangling fetch: POST /api/banking/analyze/anomalies (src/components/Banking/BankingInsightsPanel.tsx:64)"}, "fullDescription": {"text": "`src/components/Banking/BankingInsightsPanel.tsx:64` calls `POST /api/banking/analyze/anomalies` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/banking/analyze/anomalies`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-32e1768f36e8ca03", "name": "Dangling fetch: POST /api/banking/import/auto (src/components/Banking/BankStatementImport.tsx:79)", "shortDescription": {"text": "Dangling fetch: POST /api/banking/import/auto (src/components/Banking/BankStatementImport.tsx:79)"}, "fullDescription": {"text": "`src/components/Banking/BankStatementImport.tsx:79` calls `POST /api/banking/import/auto` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/banking/import/auto`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-566355d0217f6555", "name": "Dangling fetch: GET /api/admin/config/llm (src/components/DevelopmentConsole/LlmSettingsTab.tsx:110)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/config/llm (src/components/DevelopmentConsole/LlmSettingsTab.tsx:110)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:110` calls `GET /api/admin/config/llm` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-06c481be417544b0", "name": "Dangling fetch: GET /api/admin/config/llm/modules (src/components/DevelopmentConsole/LlmSettingsTab.tsx:132)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/config/llm/modules (src/components/DevelopmentConsole/LlmSettingsTab.tsx:132)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:132` calls `GET /api/admin/config/llm/modules` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/modules`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0a81263b4f1fdc5e", "name": "Dangling fetch: GET /api/admin/config/llm/prompts (src/components/DevelopmentConsole/LlmSettingsTab.tsx:143)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/config/llm/prompts (src/components/DevelopmentConsole/LlmSettingsTab.tsx:143)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:143` calls `GET /api/admin/config/llm/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/prompts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a45e453ccf0bfa16", "name": "Dangling fetch: GET /api/admin/config/llm/stats (src/components/DevelopmentConsole/LlmSettingsTab.tsx:154)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/config/llm/stats (src/components/DevelopmentConsole/LlmSettingsTab.tsx:154)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:154` calls `GET /api/admin/config/llm/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eab000154b19dba9", "name": "Dangling fetch: GET /api/admin/config/llm/models?provider=${targetProvider} (src/components/DevelopmentConsole/LlmSettin", "shortDescription": {"text": "Dangling fetch: GET /api/admin/config/llm/models?provider=${targetProvider} (src/components/DevelopmentConsole/LlmSettingsTab.tsx:167)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:167` calls `GET /api/admin/config/llm/models?provider=${targetProvider}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/models`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-61fb3dcea16dedd6", "name": "Dangling fetch: POST /api/admin/config/llm (src/components/DevelopmentConsole/LlmSettingsTab.tsx:221)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/config/llm (src/components/DevelopmentConsole/LlmSettingsTab.tsx:221)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:221` calls `POST /api/admin/config/llm` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-255d433fde4f07d5", "name": "Dangling fetch: POST /api/admin/config/llm/modules (src/components/DevelopmentConsole/LlmSettingsTab.tsx:239)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/config/llm/modules (src/components/DevelopmentConsole/LlmSettingsTab.tsx:239)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:239` calls `POST /api/admin/config/llm/modules` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/modules`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec19089e2de2d49f", "name": "Dangling fetch: POST /api/admin/config/llm/prompts (src/components/DevelopmentConsole/LlmSettingsTab.tsx:252)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/config/llm/prompts (src/components/DevelopmentConsole/LlmSettingsTab.tsx:252)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:252` calls `POST /api/admin/config/llm/prompts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/prompts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bae81632e5e0f6c0", "name": "Dangling fetch: POST /api/admin/config/llm/test (src/components/DevelopmentConsole/LlmSettingsTab.tsx:275)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/config/llm/test (src/components/DevelopmentConsole/LlmSettingsTab.tsx:275)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:275` calls `POST /api/admin/config/llm/test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/test`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-08e84223510ad75f", "name": "Dangling fetch: POST /api/admin/config/llm/playground (src/components/DevelopmentConsole/LlmSettingsTab.tsx:305)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/config/llm/playground (src/components/DevelopmentConsole/LlmSettingsTab.tsx:305)"}, "fullDescription": {"text": "`src/components/DevelopmentConsole/LlmSettingsTab.tsx:305` calls `POST /api/admin/config/llm/playground` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/admin/config/llm/playground`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fbb535b900c8ee86", "name": "Dangling fetch: GET /api/itau/status (src/hooks/useItauBank.ts:101)", "shortDescription": {"text": "Dangling fetch: GET /api/itau/status (src/hooks/useItauBank.ts:101)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:101` calls `GET /api/itau/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4afd814dacfbe1dd", "name": "Dangling fetch: POST /api/itau/test (src/hooks/useItauBank.ts:106)", "shortDescription": {"text": "Dangling fetch: POST /api/itau/test (src/hooks/useItauBank.ts:106)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:106` calls `POST /api/itau/test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/test`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fdba8ee76e067529", "name": "Dangling fetch: POST /api/itau/certificates (src/hooks/useItauBank.ts:113)", "shortDescription": {"text": "Dangling fetch: POST /api/itau/certificates (src/hooks/useItauBank.ts:113)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:113` calls `POST /api/itau/certificates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/certificates`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-771c7749e5673f78", "name": "Dangling fetch: GET /api/itau/saldo (src/hooks/useItauBank.ts:121)", "shortDescription": {"text": "Dangling fetch: GET /api/itau/saldo (src/hooks/useItauBank.ts:121)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:121` calls `GET /api/itau/saldo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/saldo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-92d1537955ee886b", "name": "Dangling fetch: GET /api/itau/extrato (src/hooks/useItauBank.ts:126)", "shortDescription": {"text": "Dangling fetch: GET /api/itau/extrato (src/hooks/useItauBank.ts:126)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:126` calls `GET /api/itau/extrato` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/extrato`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-685300160170d13a", "name": "Dangling fetch: POST /api/itau/pix/cobranca (src/hooks/useItauBank.ts:134)", "shortDescription": {"text": "Dangling fetch: POST /api/itau/pix/cobranca (src/hooks/useItauBank.ts:134)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:134` calls `POST /api/itau/pix/cobranca` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/pix/cobranca`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9b7ae2040ff7929a", "name": "Dangling fetch: GET /api/itau/pix/recebidos (src/hooks/useItauBank.ts:139)", "shortDescription": {"text": "Dangling fetch: GET /api/itau/pix/recebidos (src/hooks/useItauBank.ts:139)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:139` calls `GET /api/itau/pix/recebidos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/pix/recebidos`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b976970c1e1fea1e", "name": "Dangling fetch: POST /api/itau/boleto (src/hooks/useItauBank.ts:147)", "shortDescription": {"text": "Dangling fetch: POST /api/itau/boleto (src/hooks/useItauBank.ts:147)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:147` calls `POST /api/itau/boleto` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/boleto`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95ec698e2c465d79", "name": "Dangling fetch: GET /api/itau/boleto (src/hooks/useItauBank.ts:156)", "shortDescription": {"text": "Dangling fetch: GET /api/itau/boleto (src/hooks/useItauBank.ts:156)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:156` calls `GET /api/itau/boleto` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/boleto`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a3d4da22726ada68", "name": "Dangling fetch: GET /api/itau/boleto/${nossoNumero} (src/hooks/useItauBank.ts:161)", "shortDescription": {"text": "Dangling fetch: GET /api/itau/boleto/${nossoNumero} (src/hooks/useItauBank.ts:161)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:161` calls `GET /api/itau/boleto/${nossoNumero}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/boleto/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-881f9c1ff0524d12", "name": "Dangling fetch: GET /api/itau/boleto/${nossoNumero}/pdf (src/hooks/useItauBank.ts:166)", "shortDescription": {"text": "Dangling fetch: GET /api/itau/boleto/${nossoNumero}/pdf (src/hooks/useItauBank.ts:166)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:166` calls `GET /api/itau/boleto/${nossoNumero}/pdf` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/boleto/<p>/pdf`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c0828eb20631afc4", "name": "Dangling fetch: POST /api/itau/boleto/${nossoNumero}/baixar (src/hooks/useItauBank.ts:173)", "shortDescription": {"text": "Dangling fetch: POST /api/itau/boleto/${nossoNumero}/baixar (src/hooks/useItauBank.ts:173)"}, "fullDescription": {"text": "`src/hooks/useItauBank.ts:173` calls `POST /api/itau/boleto/${nossoNumero}/baixar` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/itau/boleto/<p>/baixar`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ae92dc13c3a9fd9b", "name": "Dangling fetch: GET /api/github/issues/stats (src/services/githubService.ts:50)", "shortDescription": {"text": "Dangling fetch: GET /api/github/issues/stats (src/services/githubService.ts:50)"}, "fullDescription": {"text": "`src/services/githubService.ts:50` calls `GET /api/github/issues/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/github/issues/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-64284b868f826506", "name": "Dangling fetch: POST /api/github/issues/${issueNumber}/state (src/services/githubService.ts:61)", "shortDescription": {"text": "Dangling fetch: POST /api/github/issues/${issueNumber}/state (src/services/githubService.ts:61)"}, "fullDescription": {"text": "`src/services/githubService.ts:61` calls `POST /api/github/issues/${issueNumber}/state` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/github/issues/<p>/state`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d59082af340c0228", "name": "Dangling fetch: POST /api/github/issues/${issueNumber}/labels (src/services/githubService.ts:73)", "shortDescription": {"text": "Dangling fetch: POST /api/github/issues/${issueNumber}/labels (src/services/githubService.ts:73)"}, "fullDescription": {"text": "`src/services/githubService.ts:73` calls `POST /api/github/issues/${issueNumber}/labels` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/github/issues/<p>/labels`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-14fec06a8d212e98", "name": "Dangling fetch: POST /api/github/issues (src/services/githubService.ts:85)", "shortDescription": {"text": "Dangling fetch: POST /api/github/issues (src/services/githubService.ts:85)"}, "fullDescription": {"text": "`src/services/githubService.ts:85` calls `POST /api/github/issues` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/github/issues`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43784300a7fca041", "name": "Dangling fetch: GET /api/dashboard/artifacts (src/services/dashboardArtifacts.ts:16)", "shortDescription": {"text": "Dangling fetch: GET /api/dashboard/artifacts (src/services/dashboardArtifacts.ts:16)"}, "fullDescription": {"text": "`src/services/dashboardArtifacts.ts:16` calls `GET /api/dashboard/artifacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/dashboard/artifacts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2cad0201af647809", "name": "Dangling fetch: PUT /api/dashboard/artifacts/financial (src/services/dashboardArtifacts.ts:25)", "shortDescription": {"text": "Dangling fetch: PUT /api/dashboard/artifacts/financial (src/services/dashboardArtifacts.ts:25)"}, "fullDescription": {"text": "`src/services/dashboardArtifacts.ts:25` calls `PUT /api/dashboard/artifacts/financial` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/dashboard/artifacts/financial`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9632d8a4069f3faf", "name": "Dangling fetch: PUT /api/dashboard/artifacts/forecast (src/services/dashboardArtifacts.ts:34)", "shortDescription": {"text": "Dangling fetch: PUT /api/dashboard/artifacts/forecast (src/services/dashboardArtifacts.ts:34)"}, "fullDescription": {"text": "`src/services/dashboardArtifacts.ts:34` calls `PUT /api/dashboard/artifacts/forecast` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/dashboard/artifacts/forecast`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5eb9698bf4b71c9a", "name": "Unused endpoint: USE /api/whatsapp", "shortDescription": {"text": "Unused endpoint: USE /api/whatsapp"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/whatsapp` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-316c43db307befc3", "name": "Unused endpoint: USE /api/ai", "shortDescription": {"text": "Unused endpoint: USE /api/ai"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/ai` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/auth` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbea1ce7cbd02aea", "name": "Unused endpoint: GET /api/tunnel/url", "shortDescription": {"text": "Unused endpoint: GET /api/tunnel/url"}, "fullDescription": {"text": "`backend/src/server.ts` declares `GET /api/tunnel/url` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02f4012114aeaebb", "name": "Unused endpoint: USE /api/dolibarr", "shortDescription": {"text": "Unused endpoint: USE /api/dolibarr"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/dolibarr` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-86385740cb7fe5bf", "name": "Unused endpoint: USE /api/scheduler", "shortDescription": {"text": "Unused endpoint: USE /api/scheduler"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/scheduler` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccd9c54d68b606cd", "name": "Unused endpoint: USE /api/webhook", "shortDescription": {"text": "Unused endpoint: USE /api/webhook"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14dd5ee54e139c2a", "name": "Unused endpoint: USE /api/banking", "shortDescription": {"text": "Unused endpoint: USE /api/banking"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/banking` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c6aca5279edf5ba", "name": "Unused endpoint: USE /api/inter", "shortDescription": {"text": "Unused endpoint: USE /api/inter"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/inter` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2ff5ea57c65cc4b1", "name": "Unused endpoint: USE /api/itau", "shortDescription": {"text": "Unused endpoint: USE /api/itau"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/itau` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-241fd5d78ee6021b", "name": "Unused endpoint: USE /api/approvals", "shortDescription": {"text": "Unused endpoint: USE /api/approvals"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/approvals` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b90a25f6d5f27707", "name": "Unused endpoint: USE /api/documents", "shortDescription": {"text": "Unused endpoint: USE /api/documents"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/documents` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-94ddd00dc84af41d", "name": "Unused endpoint: USE /api/email", "shortDescription": {"text": "Unused endpoint: USE /api/email"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/email` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc24b6647787716b", "name": "Unused endpoint: USE /api/centrovibe", "shortDescription": {"text": "Unused endpoint: USE /api/centrovibe"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/centrovibe` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f808b8be41c9a579", "name": "Unused endpoint: USE /api/integration", "shortDescription": {"text": "Unused endpoint: USE /api/integration"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/integration` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c5bd9c31e900f8c2", "name": "Unused endpoint: USE /api/ui-config", "shortDescription": {"text": "Unused endpoint: USE /api/ui-config"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/ui-config` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dbdbc13210e7149b", "name": "Unused endpoint: USE /api/dashboard", "shortDescription": {"text": "Unused endpoint: USE /api/dashboard"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/dashboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6330b0c4a0a152d3", "name": "Unused endpoint: USE /api/tasks", "shortDescription": {"text": "Unused endpoint: USE /api/tasks"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/tasks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c3a8b7932f72b92f", "name": "Unused endpoint: USE /api/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/notifications"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/notifications` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9cd7e2cd7bbdef7d", "name": "Unused endpoint: USE /api/github", "shortDescription": {"text": "Unused endpoint: USE /api/github"}, "fullDescription": {"text": "`backend/src/server.ts` declares `USE /api/github` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-618721b912bad1c2", "name": "Unused endpoint: POST /login", "shortDescription": {"text": "Unused endpoint: POST /login"}, "fullDescription": {"text": "`backend/src/routes/authRoutes.ts` declares `POST /login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99fc36db98c134ce", "name": "Unused endpoint: POST /logout", "shortDescription": {"text": "Unused endpoint: POST /logout"}, "fullDescription": {"text": "`backend/src/routes/authRoutes.ts` declares `POST /logout` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ae38010c60493f1", "name": "Unused endpoint: POST /webhook", "shortDescription": {"text": "Unused endpoint: POST /webhook"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /webhook` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b15d518d538de57d", "name": "Unused endpoint: GET /sessions", "shortDescription": {"text": "Unused endpoint: GET /sessions"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a13a7e97aeacf55f", "name": "Unused endpoint: POST /start", "shortDescription": {"text": "Unused endpoint: POST /start"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /start` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-05b1ac409816dfd9", "name": "Unused endpoint: DELETE /sessions/:sessionId", "shortDescription": {"text": "Unused endpoint: DELETE /sessions/:sessionId"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `DELETE /sessions/:sessionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f9b362cf2271c88", "name": "Unused endpoint: GET /check-number/:number", "shortDescription": {"text": "Unused endpoint: GET /check-number/:number"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /check-number/:number` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fb9410fdd9c77e05", "name": "Unused endpoint: GET /qrcode", "shortDescription": {"text": "Unused endpoint: GET /qrcode"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /qrcode` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2f222a275ed687b3", "name": "Unused endpoint: POST /send", "shortDescription": {"text": "Unused endpoint: POST /send"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /send` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-caa443327df3e6ad", "name": "Unused endpoint: POST /settings/user", "shortDescription": {"text": "Unused endpoint: POST /settings/user"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /settings/user` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2bc19fab7aa582b", "name": "Unused endpoint: POST /settings/session", "shortDescription": {"text": "Unused endpoint: POST /settings/session"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /settings/session` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-838d143e2de180dd", "name": "Unused endpoint: POST /settings/chat", "shortDescription": {"text": "Unused endpoint: POST /settings/chat"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /settings/chat` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06b962a3a8539806", "name": "Unused endpoint: GET /store", "shortDescription": {"text": "Unused endpoint: GET /store"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /store` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c22b85d40880ed34", "name": "Unused endpoint: GET /settings/session/:sessionId", "shortDescription": {"text": "Unused endpoint: GET /settings/session/:sessionId"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /settings/session/:sessionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ea59e6723b9d3e8", "name": "Unused endpoint: GET /settings/chat/:chatId", "shortDescription": {"text": "Unused endpoint: GET /settings/chat/:chatId"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /settings/chat/:chatId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2595b39638e5c045", "name": "Unused endpoint: GET /profile", "shortDescription": {"text": "Unused endpoint: GET /profile"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /profile` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2b2529d89a8e5ed", "name": "Unused endpoint: POST /profile/picture", "shortDescription": {"text": "Unused endpoint: POST /profile/picture"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /profile/picture` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f4ab2408fe13f457", "name": "Unused endpoint: DELETE /profile/picture", "shortDescription": {"text": "Unused endpoint: DELETE /profile/picture"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `DELETE /profile/picture` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5648f175441967e7", "name": "Unused endpoint: POST /profile/name", "shortDescription": {"text": "Unused endpoint: POST /profile/name"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /profile/name` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd43ba9b593c83f5", "name": "Unused endpoint: POST /profile/status", "shortDescription": {"text": "Unused endpoint: POST /profile/status"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /profile/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eae38ef9349de428", "name": "Unused endpoint: POST /profile/presence", "shortDescription": {"text": "Unused endpoint: POST /profile/presence"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /profile/presence` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3d92828b63824c1", "name": "Unused endpoint: POST /assign", "shortDescription": {"text": "Unused endpoint: POST /assign"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /assign` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f0fc82742855439", "name": "Unused endpoint: GET /conversations", "shortDescription": {"text": "Unused endpoint: GET /conversations"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /conversations` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8697e9ec96c239c0", "name": "Unused endpoint: GET /messages/:chatId", "shortDescription": {"text": "Unused endpoint: GET /messages/:chatId"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /messages/:chatId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dbc4d220b51c3839", "name": "Unused endpoint: GET /messages/:messageId/media", "shortDescription": {"text": "Unused endpoint: GET /messages/:messageId/media"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `GET /messages/:messageId/media` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-723142cb338ff5dc", "name": "Unused endpoint: POST /send-file", "shortDescription": {"text": "Unused endpoint: POST /send-file"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /send-file` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac4bde15380ba034", "name": "Unused endpoint: POST /send-voice", "shortDescription": {"text": "Unused endpoint: POST /send-voice"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /send-voice` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee50d9514329d245", "name": "Unused endpoint: POST /send-voice-native", "shortDescription": {"text": "Unused endpoint: POST /send-voice-native"}, "fullDescription": {"text": "`backend/src/routes/whatsappRoutes.ts` declares `POST /send-voice-native` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5b6eda393c3025c", "name": "Unused endpoint: GET /boleto/:banco/:nossoNumero/preview", "shortDescription": {"text": "Unused endpoint: GET /boleto/:banco/:nossoNumero/preview"}, "fullDescription": {"text": "`backend/src/routes/documentRoutes.ts` declares `GET /boleto/:banco/:nossoNumero/preview` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20884"}, "properties": {"repository": "tcstulio/sistemav2", "repoUrl": "https://github.com/tcstulio/sistemav2", "branch": "main"}, "results": [{"ruleId": "scanner-d02de91a49041b33", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 tests/auth.spec.ts:76"}, "properties": {"repobilityId": "dff6798bac3cd6a3", "scanner": "scanner-primary", "fingerprint": "d02de91a49041b33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f420f38453b595a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/ui-crawler.spec.ts:91"}, "properties": {"repobilityId": "1a85ee6da37c9c17", "scanner": "scanner-primary", "fingerprint": "f420f38453b595a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1af9d4037b5c9c02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/web-scraper.ts:9"}, "properties": {"repobilityId": "4f4792aaaf2c1347", "scanner": "scanner-primary", "fingerprint": "1af9d4037b5c9c02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-56ddde40d2a3d93e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/coolgroove-complete-test.ts:78"}, "properties": {"repobilityId": "fe4f6f4207c4d751", "scanner": "scanner-primary", "fingerprint": "56ddde40d2a3d93e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b561f5446864ef56", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/interactive-browser.ts:9"}, "properties": {"repobilityId": "5320a3829e6129ad", "scanner": "scanner-primary", "fingerprint": "b561f5446864ef56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-36b0b847d8e79849", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/explore-all-pages.ts:49"}, "properties": {"repobilityId": "08dbf1b576868e48", "scanner": "scanner-primary", "fingerprint": "36b0b847d8e79849", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46535149857095e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-own-app.ts:9"}, "properties": {"repobilityId": "377353758eb3b91e", "scanner": "scanner-primary", "fingerprint": "46535149857095e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b7bc558040e7bb95", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-chat-events.ts:97"}, "properties": {"repobilityId": "1d9180cd242a9435", "scanner": "scanner-primary", "fingerprint": "b7bc558040e7bb95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-57c210afb83a9ec6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-mars-tasks.ts:202"}, "properties": {"repobilityId": "84db17a3413e834a", "scanner": "scanner-primary", "fingerprint": "57c210afb83a9ec6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6fa16a16948ed02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/comprehensive-ui-test.ts:35"}, "properties": {"repobilityId": "230c46247b42104f", "scanner": "scanner-primary", "fingerprint": "e6fa16a16948ed02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c4f88504f3b4793", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_api_gaps.js:6"}, "properties": {"repobilityId": "a288ebcb24164ce7", "scanner": "scanner-primary", "fingerprint": "9c4f88504f3b4793", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c774ff988fa1dbd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_data_links.js:11"}, "properties": {"repobilityId": "d5820b5a9da7be0d", "scanner": "scanner-primary", "fingerprint": "c774ff988fa1dbd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37067a3757e7eca2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/diagnostics/analyze_data_density.js:25"}, "properties": {"repobilityId": "ba0d8deabd3415cd", "scanner": "scanner-primary", "fingerprint": "37067a3757e7eca2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c68de4a759dee737", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/test_partnerships.ts:31"}, "properties": {"repobilityId": "1c7f24bc268126a0", "scanner": "scanner-primary", "fingerprint": "c68de4a759dee737", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-443463b38cf747ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/scripts/test-integration.ts:69"}, "properties": {"repobilityId": "e735695470c1744f", "scanner": "scanner-primary", "fingerprint": "443463b38cf747ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db1b3e062b676347", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-real-login.ts:20"}, "properties": {"repobilityId": "4eb44ec7a1f203f9", "scanner": "scanner-primary", "fingerprint": "db1b3e062b676347", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb0052c730293931", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-connections.ts:6"}, "properties": {"repobilityId": "1a1a640e13fa1a43", "scanner": "scanner-primary", "fingerprint": "eb0052c730293931", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a395d61815b3cea8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-date-handling.ts:243"}, "properties": {"repobilityId": "5687a9475153d24a", "scanner": "scanner-primary", "fingerprint": "a395d61815b3cea8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-38989d9e80d01cba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-whatsapp-qr.ts:8"}, "properties": {"repobilityId": "8b2a9b399ecdd1e1", "scanner": "scanner-primary", "fingerprint": "38989d9e80d01cba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d90db2a4963b6ff0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/count-tasks-standard.ts:14"}, "properties": {"repobilityId": "25899e779ad75b25", "scanner": "scanner-primary", "fingerprint": "d90db2a4963b6ff0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1256b3057ab33826", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-voice-note-native.ts:16"}, "properties": {"repobilityId": "63bc9452f046071a", "scanner": "scanner-primary", "fingerprint": "1256b3057ab33826", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4da0473f34260989", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-task-627.js:18"}, "properties": {"repobilityId": "f0bb14a71611db5e", "scanner": "scanner-primary", "fingerprint": "4da0473f34260989", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3e4c6e3d46268a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-custom-sync.ts:13"}, "properties": {"repobilityId": "8b145278cc422aff", "scanner": "scanner-primary", "fingerprint": "a3e4c6e3d46268a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae1d2422297f2194", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/investigate-permissions.ts:37"}, "properties": {"repobilityId": "c69d48a952ffd846", "scanner": "scanner-primary", "fingerprint": "ae1d2422297f2194", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-62ad10f20ea3d5bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-inter-api.ts:11"}, "properties": {"repobilityId": "3772d5524d30fe99", "scanner": "scanner-primary", "fingerprint": "62ad10f20ea3d5bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ee0cb28072e64693", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-auth.ts:7"}, "properties": {"repobilityId": "5b552cb74a0d88d9", "scanner": "scanner-primary", "fingerprint": "ee0cb28072e64693", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f00f46e90c3200a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-puppeteer.js:5"}, "properties": {"repobilityId": "4473f5d0ef420220", "scanner": "scanner-primary", "fingerprint": "4f00f46e90c3200a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dcf7a180c2825d3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-whatsapp.ts:8"}, "properties": {"repobilityId": "12551cf65d7ca0ef", "scanner": "scanner-primary", "fingerprint": "dcf7a180c2825d3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f1e68b97add2b8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-rights.ts:18"}, "properties": {"repobilityId": "5b59a4973ed2a711", "scanner": "scanner-primary", "fingerprint": "1f1e68b97add2b8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb786b12a2a80f9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-whatsapp.ts:13"}, "properties": {"repobilityId": "e3dacd7c8448e3ee", "scanner": "scanner-primary", "fingerprint": "cb786b12a2a80f9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a930367063968c32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-user-fields.ts:11"}, "properties": {"repobilityId": "51fd7cf8e906b16c", "scanner": "scanner-primary", "fingerprint": "a930367063968c32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e253f36796c63420", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-dolibarr.ts:12"}, "properties": {"repobilityId": "c1434329a62aad4a", "scanner": "scanner-primary", "fingerprint": "e253f36796c63420", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c52bbf1ee9d4c51d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-vuln.ts:6"}, "properties": {"repobilityId": "9a90d3481143f23f", "scanner": "scanner-primary", "fingerprint": "c52bbf1ee9d4c51d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb6add8b2c3a3917", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-tasks-raw.js:18"}, "properties": {"repobilityId": "7214a6f77c5d80db", "scanner": "scanner-primary", "fingerprint": "fb6add8b2c3a3917", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa34072b8f2fd685", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify_params.ts:14"}, "properties": {"repobilityId": "e349684b2d786564", "scanner": "scanner-primary", "fingerprint": "aa34072b8f2fd685", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a0859348e026798", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test_events_mapping.ts:44"}, "properties": {"repobilityId": "ce102af7d4a36299", "scanner": "scanner-primary", "fingerprint": "1a0859348e026798", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-753c2e6f10778c85", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-connection.ts:6"}, "properties": {"repobilityId": "00673f182f3990bf", "scanner": "scanner-primary", "fingerprint": "753c2e6f10778c85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-12879c73f255af60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-dolibarr-proxy.ts:13"}, "properties": {"repobilityId": "68067a9822c4e111", "scanner": "scanner-primary", "fingerprint": "12879c73f255af60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d348a9ac74fcd41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify-user-rights.ts:38"}, "properties": {"repobilityId": "3bda540eab6668cd", "scanner": "scanner-primary", "fingerprint": "9d348a9ac74fcd41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b8dc1077d73edeec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/run-taskrunner-canary.ts:13"}, "properties": {"repobilityId": "868737cf2dac32a0", "scanner": "scanner-primary", "fingerprint": "b8dc1077d73edeec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9c638575812c57f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-audio-send.ts:14"}, "properties": {"repobilityId": "5df0f8a28d594d9e", "scanner": "scanner-primary", "fingerprint": "e9c638575812c57f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-408f7d5373cdfa72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-tasks-raw.ts:18"}, "properties": {"repobilityId": "1e9b44b89df2bce7", "scanner": "scanner-primary", "fingerprint": "408f7d5373cdfa72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-334d741383f7e97a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-dolibarr-cookie.ts:11"}, "properties": {"repobilityId": "476537d96f486027", "scanner": "scanner-primary", "fingerprint": "334d741383f7e97a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a3cdab1bda5851d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-delta-sync.ts:37"}, "properties": {"repobilityId": "dbb4bcfb24038180", "scanner": "scanner-primary", "fingerprint": "7a3cdab1bda5851d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f7f0c1e9e1ea02b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-admin-check.ts:15"}, "properties": {"repobilityId": "6c7fbc340dbf746b", "scanner": "scanner-primary", "fingerprint": "f7f0c1e9e1ea02b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e617dc7f4d95a6a3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/verify-session-rename.ts:19"}, "properties": {"repobilityId": "0e1ba987e1c5ceab", "scanner": "scanner-primary", "fingerprint": "e617dc7f4d95a6a3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e38961d7e61ee539", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/testEmailConnection.ts:6"}, "properties": {"repobilityId": "1623cfc872fbf04c", "scanner": "scanner-primary", "fingerprint": "e38961d7e61ee539", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-736519f46f8093b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/check-user-permissions.ts:20"}, "properties": {"repobilityId": "66b798db76dd2797", "scanner": "scanner-primary", "fingerprint": "736519f46f8093b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-53d8a4b90ae11565", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/debug-signature.ts:9"}, "properties": {"repobilityId": "1c53fa8bbcfcddf5", "scanner": "scanner-primary", "fingerprint": "53d8a4b90ae11565", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-799d1eeee9316390", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test-client-stripping.ts:6"}, "properties": {"repobilityId": "74925e0f52ecd77b", "scanner": "scanner-primary", "fingerprint": "799d1eeee9316390", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-98b14321fd50af9b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/test_date_conversion.ts:28"}, "properties": {"repobilityId": "56b23cb3ab9b94e5", "scanner": "scanner-primary", "fingerprint": "98b14321fd50af9b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5069e46524644e4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/src/scripts/count-tasks.ts:15"}, "properties": {"repobilityId": "1cf641531a971fb5", "scanner": "scanner-primary", "fingerprint": "e5069e46524644e4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e47401873f11c9c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/routes/adminRoutes.ts:357"}, "properties": {"repobilityId": "2b6158e3bb62eaed", "scanner": "scanner-primary", "fingerprint": "5e47401873f11c9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b59f62faecbbb3d5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/services/bankingService.ts:559"}, "properties": {"repobilityId": "1e9cae7070e40d3d", "scanner": "scanner-primary", "fingerprint": "b59f62faecbbb3d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-74887d248ddb5271", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 backend/src/services/approvalService.ts:459"}, "properties": {"repobilityId": "146604d1499f958f", "scanner": "scanner-primary", "fingerprint": "74887d248ddb5271", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ca7c39ac6fee1e5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/verify_permission_logic.js:82"}, "properties": {"repobilityId": "5cae759239e00a01", "scanner": "scanner-primary", "fingerprint": "ca7c39ac6fee1e5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ecbc05e92303b3f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/test_sync.js:9"}, "properties": {"repobilityId": "36e4174fb352e62e", "scanner": "scanner-primary", "fingerprint": "9ecbc05e92303b3f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4e48c2e15108458", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/debug_tasks_placeholder.ts:27"}, "properties": {"repobilityId": "60e2bfb52d16980c", "scanner": "scanner-primary", "fingerprint": "b4e48c2e15108458", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce4fb23dd07bfaaa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/compare_tasks.ts:25"}, "properties": {"repobilityId": "fe818f1d5421acd0", "scanner": "scanner-primary", "fingerprint": "ce4fb23dd07bfaaa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ac87edf226941bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/scripts/verify_permission_logic.ts:103"}, "properties": {"repobilityId": "5d5e618e6ac8f745", "scanner": "scanner-primary", "fingerprint": "2ac87edf226941bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c3a49948cc7fd9bb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/utils/sanitizeHtml.tsx:42"}, "properties": {"repobilityId": "b7ebc7e9a776321a", "scanner": "scanner-primary", "fingerprint": "c3a49948cc7fd9bb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-16aed5fbc925f159", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PendingPayments.tsx:191"}, "properties": {"repobilityId": "bde8fb32bca210b6", "scanner": "scanner-primary", "fingerprint": "16aed5fbc925f159", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ab47ce4cf14b163b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WhatsAppView.tsx:323"}, "properties": {"repobilityId": "3cabf1e863118fd1", "scanner": "scanner-primary", "fingerprint": "ab47ce4cf14b163b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68ddc3efa2e37f93", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SupplierInvoiceList.tsx:640"}, "properties": {"repobilityId": "29c6107824186ff3", "scanner": "scanner-primary", "fingerprint": "68ddc3efa2e37f93", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-155db9ab391dc190", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CategoryList.tsx:58"}, "properties": {"repobilityId": "c134de032b04aea4", "scanner": "scanner-primary", "fingerprint": "155db9ab391dc190", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f65be044ce6a844", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ProductList.tsx:88"}, "properties": {"repobilityId": "46c47063feeb4e1c", "scanner": "scanner-primary", "fingerprint": "6f65be044ce6a844", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb9de6b0971a3a20", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GlobalSearch.tsx:186"}, "properties": {"repobilityId": "203bea9ee078cce8", "scanner": "scanner-primary", "fingerprint": "eb9de6b0971a3a20", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a9c1edb345a52cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CustomerList.tsx:48"}, "properties": {"repobilityId": "95efeb1a9cb8bb50", "scanner": "scanner-primary", "fingerprint": "0a9c1edb345a52cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98efc6641e6ecbd7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AgendaView.tsx:729"}, "properties": {"repobilityId": "a5c82de5a49e3520", "scanner": "scanner-primary", "fingerprint": "98efc6641e6ecbd7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5199fbe382539c8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Dashboard.tsx:779"}, "properties": {"repobilityId": "df7f06ca6f5b4797", "scanner": "scanner-primary", "fingerprint": "b5199fbe382539c8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8967b5dcd0cf4ad", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ProposalList.tsx:789"}, "properties": {"repobilityId": "8bc8be1361086937", "scanner": "scanner-primary", "fingerprint": "c8967b5dcd0cf4ad", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-35c07bd6d9db83af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierPaymentList.tsx:194"}, "properties": {"repobilityId": "53e26aba7d67b048", "scanner": "scanner-primary", "fingerprint": "35c07bd6d9db83af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6cf3a9d8c1cf18a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BankAccountList.tsx:630"}, "properties": {"repobilityId": "00e4284c9d114439", "scanner": "scanner-primary", "fingerprint": "c6cf3a9d8c1cf18a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20e45f56633ba219", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/InterventionList.tsx:266"}, "properties": {"repobilityId": "2f1ec16db5f92e63", "scanner": "scanner-primary", "fingerprint": "20e45f56633ba219", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24df857d70afdd54", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/InterventionList.tsx:360"}, "properties": {"repobilityId": "a9b2334c0810afa3", "scanner": "scanner-primary", "fingerprint": "24df857d70afdd54", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-48d84717ff6af5a9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/VenueList.tsx:275"}, "properties": {"repobilityId": "7b2a64b8d2a89828", "scanner": "scanner-primary", "fingerprint": "48d84717ff6af5a9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8f5616497e6b8b56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/VirtualAssistant.tsx:406"}, "properties": {"repobilityId": "588f1ba573cddf6e", "scanner": "scanner-primary", "fingerprint": "8f5616497e6b8b56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b58dd40fd5356c6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/WarehouseList.tsx:58"}, "properties": {"repobilityId": "950ed9cc6aabc5f6", "scanner": "scanner-primary", "fingerprint": "2b58dd40fd5356c6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-75bab199a47b6976", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ActivityView.tsx:471"}, "properties": {"repobilityId": "867e79d6aef06ea6", "scanner": "scanner-primary", "fingerprint": "75bab199a47b6976", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c1938af888026c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PaymentList.tsx:186"}, "properties": {"repobilityId": "ada95d48de67abe2", "scanner": "scanner-primary", "fingerprint": "7c1938af888026c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2db9457a5bbef99a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/InvoiceList.tsx:753"}, "properties": {"repobilityId": "459188ef78607863", "scanner": "scanner-primary", "fingerprint": "2db9457a5bbef99a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-9f13f3caa30b3a37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ChatSessionsView.tsx:124"}, "properties": {"repobilityId": "823789d0786c990b", "scanner": "scanner-primary", "fingerprint": "9f13f3caa30b3a37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94596335faa88741", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContactList.tsx:220"}, "properties": {"repobilityId": "8be11c9779c5262a", "scanner": "scanner-primary", "fingerprint": "94596335faa88741", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d5e23240cd8ed657", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/TicketList.tsx:328"}, "properties": {"repobilityId": "c13f3e3d06c50c4c", "scanner": "scanner-primary", "fingerprint": "d5e23240cd8ed657", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-721bba087d448772", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TaskDetail.tsx:355"}, "properties": {"repobilityId": "62ff05a490790c8c", "scanner": "scanner-primary", "fingerprint": "721bba087d448772", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4ad64edc15dad3b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/TaskDetail.tsx:343"}, "properties": {"repobilityId": "4007d592cd53ed00", "scanner": "scanner-primary", "fingerprint": "e4ad64edc15dad3b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e75efd16cad76774", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierProposalList.tsx:453"}, "properties": {"repobilityId": "37848ef5c2555339", "scanner": "scanner-primary", "fingerprint": "e75efd16cad76774", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b15adf529389821e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/SupplierProposalList.tsx:660"}, "properties": {"repobilityId": "493fe8b8eebe0214", "scanner": "scanner-primary", "fingerprint": "b15adf529389821e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-106b0331ee89c1a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ProjectList.tsx:854"}, "properties": {"repobilityId": "4da9d7904d6e8420", "scanner": "scanner-primary", "fingerprint": "106b0331ee89c1a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5f0d23e3a759cbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SupplierList.tsx:438"}, "properties": {"repobilityId": "12d7690c825c3054", "scanner": "scanner-primary", "fingerprint": "b5f0d23e3a759cbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4626bf1c9605a821", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Reports/FinanceTab.tsx:98"}, "properties": {"repobilityId": "417ff60b0c77e551", "scanner": "scanner-primary", "fingerprint": "4626bf1c9605a821", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e15c09ba2ad774e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Projects/TaskWizard.tsx:65"}, "properties": {"repobilityId": "b6d04d30d6fcca29", "scanner": "scanner-primary", "fingerprint": "6e15c09ba2ad774e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bafb3a8ff69b8ddc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Chat/ChatInterface.tsx:321"}, "properties": {"repobilityId": "9217ccebc91fd884", "scanner": "scanner-primary", "fingerprint": "bafb3a8ff69b8ddc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c18c034a3de79210", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Chat/ChatSidebar.tsx:137"}, "properties": {"repobilityId": "08cf31c19d41ff92", "scanner": "scanner-primary", "fingerprint": "c18c034a3de79210", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4aa3c44e52a30235", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/common/LinkedObjects.tsx:87"}, "properties": {"repobilityId": "0107d605c87e40cd", "scanner": "scanner-primary", "fingerprint": "4aa3c44e52a30235", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9c7b1034aac78bb6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TasksBoard/TasksBoard.tsx:215"}, "properties": {"repobilityId": "7906d85f5ea80a68", "scanner": "scanner-primary", "fingerprint": "9c7b1034aac78bb6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c16bfedb1b50f32f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/TasksBoard/TaskReviewPanel.tsx:171"}, "properties": {"repobilityId": "23862f5613ea9881", "scanner": "scanner-primary", "fingerprint": "c16bfedb1b50f32f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7acc890c8c08183", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HR/modals/ExpenseDetailModal.tsx:299"}, "properties": {"repobilityId": "b5a5a0a0523fd194", "scanner": "scanner-primary", "fingerprint": "f7acc890c8c08183", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8f3a7f361accd97e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/MonthView.tsx:67"}, "properties": {"repobilityId": "c6e80e4c337be32b", "scanner": "scanner-primary", "fingerprint": "8f3a7f361accd97e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41ead1ae39d93616", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/EventDetailsModal.tsx:159"}, "properties": {"repobilityId": "4939affe0fcf8a16", "scanner": "scanner-primary", "fingerprint": "41ead1ae39d93616", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-074f011687573bb3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/CentroVibe/ArtistList.tsx:112"}, "properties": {"repobilityId": "398d7af0395ba45e", "scanner": "scanner-primary", "fingerprint": "074f011687573bb3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42c5bfc4e9066b96", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/DashboardConfigEditor.tsx:73"}, "properties": {"repobilityId": "25fe42a4d109d849", "scanner": "scanner-primary", "fingerprint": "42c5bfc4e9066b96", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2cbb801f0d887b8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/GroupManager.tsx:227"}, "properties": {"repobilityId": "9774f63bed05232c", "scanner": "scanner-primary", "fingerprint": "2cbb801f0d887b8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26df1f29483ff697", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/ScreenPermissionsEditor.tsx:177"}, "properties": {"repobilityId": "a8e3fd05be8c04d6", "scanner": "scanner-primary", "fingerprint": "26df1f29483ff697", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9afb4af1e18fd19f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ChatWindow.tsx:93"}, "properties": {"repobilityId": "a0e979eae29263f9", "scanner": "scanner-primary", "fingerprint": "9afb4af1e18fd19f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51a6e79df5ce9158", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ContactPicker.tsx:154"}, "properties": {"repobilityId": "4d7744d729fd30d1", "scanner": "scanner-primary", "fingerprint": "51a6e79df5ce9158", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-08a4d4e52285f02d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/whatsapp/ConversationList.tsx:195"}, "properties": {"repobilityId": "e5800ba9fd64853a", "scanner": "scanner-primary", "fingerprint": "08a4d4e52285f02d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55799bb7e7df9c51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout/Sidebar.tsx:297"}, "properties": {"repobilityId": "cfbfaf619b6c7536", "scanner": "scanner-primary", "fingerprint": "55799bb7e7df9c51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2a099247919af3d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Layout/Header.tsx:92"}, "properties": {"repobilityId": "a8233f2bf6de2562", "scanner": "scanner-primary", "fingerprint": "2a099247919af3d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51782659676395d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/StockCountPanel.tsx:113"}, "properties": {"repobilityId": "fc798ae06f7a6f6f", "scanner": "scanner-primary", "fingerprint": "51782659676395d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d2cc9cd1d874eb8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/UserTaskDashboard.tsx:834"}, "properties": {"repobilityId": "ec1a41c1e73aecb3", "scanner": "scanner-primary", "fingerprint": "1d2cc9cd1d874eb8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-896e16cf7357ee97", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/TaskAssistantModal.tsx:332"}, "properties": {"repobilityId": "c19aa15ee60c2b49", "scanner": "scanner-primary", "fingerprint": "896e16cf7357ee97", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dffabf80c84d777f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Tasks/TimeAnalysisDashboard.tsx:146"}, "properties": {"repobilityId": "f31c38b04a60210c", "scanner": "scanner-primary", "fingerprint": "dffabf80c84d777f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51f5667676ec3598", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Banking/BankStatementImport.tsx:233"}, "properties": {"repobilityId": "8adf103dad6cbb7e", "scanner": "scanner-primary", "fingerprint": "51f5667676ec3598", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2483c656657fdbc6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailContextPanel.tsx:60"}, "properties": {"repobilityId": "3b489b51d0b2aa55", "scanner": "scanner-primary", "fingerprint": "2483c656657fdbc6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da65690ee41ab685", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailTemplateManager.tsx:155"}, "properties": {"repobilityId": "07e97ed2a0b8514f", "scanner": "scanner-primary", "fingerprint": "da65690ee41ab685", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa8fdf553eb02ce3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailView.tsx:512"}, "properties": {"repobilityId": "7d2d74f266d6aa95", "scanner": "scanner-primary", "fingerprint": "fa8fdf553eb02ce3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0f11173413bd6b47", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailComposer.tsx:232"}, "properties": {"repobilityId": "35f42d91112fcaaf", "scanner": "scanner-primary", "fingerprint": "0f11173413bd6b47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbfd51ccb3fbcc5c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailAccountList.tsx:63"}, "properties": {"repobilityId": "e0950387622f0d43", "scanner": "scanner-primary", "fingerprint": "bbfd51ccb3fbcc5c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-511e9cee109b4b5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Email/EmailReadingPane.tsx:195"}, "properties": {"repobilityId": "5a870cd429eab80a", "scanner": "scanner-primary", "fingerprint": "511e9cee109b4b5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1aaf4bcb82e1e5e4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/Email/EmailReadingPane.tsx:233"}, "properties": {"repobilityId": "b6d492da4b6af66e", "scanner": "scanner-primary", "fingerprint": "1aaf4bcb82e1e5e4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-278b5b634548c022", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/DevelopmentConsole/ConsoleLogsTab.tsx:72"}, "properties": {"repobilityId": "dbbd866037ee3c91", "scanner": "scanner-primary", "fingerprint": "278b5b634548c022", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-da098d69888f6a2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Finance/ExpenseReportPaymentList.tsx:173"}, "properties": {"repobilityId": "d5aa9f33ced87333", "scanner": "scanner-primary", "fingerprint": "da098d69888f6a2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4ceed60ad179e2a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Finance/ReceiptWizard.tsx:547"}, "properties": {"repobilityId": "1b17703d9a6c79c1", "scanner": "scanner-primary", "fingerprint": "f4ceed60ad179e2a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1084c853724ad15d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/Finance/ReceiptWizard.tsx:55"}, "properties": {"repobilityId": "a3cc45b9335bafed", "scanner": "scanner-primary", "fingerprint": "1084c853724ad15d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed2d64c05678ce2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Issues/IssuesPage.tsx:112"}, "properties": {"repobilityId": "5f36c0457b63c7ad", "scanner": "scanner-primary", "fingerprint": "ed2d64c05678ce2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f07a207aef1edb7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/Simulator/components/steps/Step2Negotiation.tsx:188"}, "properties": {"repobilityId": "07f4a9a3390dbe52", "scanner": "scanner-primary", "fingerprint": "2f07a207aef1edb7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de5b60e122e2a9cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/services/backgroundSyncService.ts:123"}, "properties": {"repobilityId": "7b8734cf485eec12", "scanner": "scanner-primary", "fingerprint": "de5b60e122e2a9cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b95421fa00bfcda", "level": "warning", "message": {"text": "Privileged port 993 in use"}, "properties": {"repobilityId": "a36e56a26353e9ee", "scanner": "scanner-primary", "fingerprint": "1b95421fa00bfcda", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/__tests__/services/emailService.test.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0ea02f272fbfb9d6", "level": "warning", "message": {"text": "Privileged port 587 in use"}, "properties": {"repobilityId": "a87a96c3b2e62c08", "scanner": "scanner-primary", "fingerprint": "0ea02f272fbfb9d6", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/__tests__/services/emailService.test.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-638bfb9410fed9ba", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in vite.config.ts:2"}, "properties": {"repobilityId": "b194fcea7803da43", "scanner": "scanner-primary", "fingerprint": "638bfb9410fed9ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vite.config.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-fa53c99bd5c32a27", "level": "error", "message": {"text": "Possible secret in scripts/coolgroove-complete-test.ts"}, "properties": {"repobilityId": "ec726a6b3a330b13", "scanner": "scanner-primary", "fingerprint": "fa53c99bd5c32a27", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/coolgroove-complete-test.ts"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-b1a76e5429eece7d", "level": "error", "message": {"text": "Possible secret in scripts/explore-all-pages.ts"}, "properties": {"repobilityId": "bfc85637463bd306", "scanner": "scanner-primary", "fingerprint": "b1a76e5429eece7d", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/explore-all-pages.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-6e5e0b36936af635", "level": "error", "message": {"text": "Possible secret in backend/src/scripts/debug-user-fields.ts"}, "properties": {"repobilityId": "cc720644740c763f", "scanner": "scanner-primary", "fingerprint": "6e5e0b36936af635", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/scripts/debug-user-fields.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-96d473fc00da70fd", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/scripts/check-dolibarr-cookie.ts:4"}, "properties": {"repobilityId": "fd7e13b01636a1af", "scanner": "scanner-primary", "fingerprint": "96d473fc00da70fd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/scripts/check-dolibarr-cookie.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-b9ef0fc5dde42efc", "level": "error", "message": {"text": "Possible secret in backend/src/scripts/debug-signature.ts"}, "properties": {"repobilityId": "4fdce4a4f60ae8d3", "scanner": "scanner-primary", "fingerprint": "b9ef0fc5dde42efc", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/scripts/debug-signature.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-cfd7a382e516d15e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/utils/processTree.ts:1"}, "properties": {"repobilityId": "a5cfa896310809ea", "scanner": "scanner-primary", "fingerprint": "cfd7a382e516d15e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/utils/processTree.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0a10948106b21eab", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/routes/githubRoutes.ts:2"}, "properties": {"repobilityId": "e2edff7c05352bea", "scanner": "scanner-primary", "fingerprint": "0a10948106b21eab", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/routes/githubRoutes.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-ac38822d2c4cb3a3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/services/taskRunnerService.ts:1"}, "properties": {"repobilityId": "23c3672c9ed0c842", "scanner": "scanner-primary", "fingerprint": "ac38822d2c4cb3a3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/services/taskRunnerService.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-df00dee625eb9d6c", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/services/tunnelService.ts:6"}, "properties": {"repobilityId": "58ef80a3a147b2f5", "scanner": "scanner-primary", "fingerprint": "df00dee625eb9d6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/services/tunnelService.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-bd35d414b94a310f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/services/taskPlannerService.ts:1"}, "properties": {"repobilityId": "c7a4e5eadada16f8", "scanner": "scanner-primary", "fingerprint": "bd35d414b94a310f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/services/taskPlannerService.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-724361aaa743125d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in backend/src/services/agentTools.ts:12"}, "properties": {"repobilityId": "330c8551ff40116b", "scanner": "scanner-primary", "fingerprint": "724361aaa743125d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/src/services/agentTools.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-91a496e975346647", "level": "error", "message": {"text": "Possible secret in src/scripts/compare_tasks.ts"}, "properties": {"repobilityId": "d6aebbac0e81e086", "scanner": "scanner-primary", "fingerprint": "91a496e975346647", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/scripts/compare_tasks.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-770b018b0297bdae", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/utils/sanitizeHtml.tsx:42"}, "properties": {"repobilityId": "c9ed630b9f9fa2ed", "scanner": "scanner-primary", "fingerprint": "770b018b0297bdae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/sanitizeHtml.tsx"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-e635c77d78738b45", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/SupplierInvoiceList.tsx:640"}, "properties": {"repobilityId": "a8106eb1ccfaaa78", "scanner": "scanner-primary", "fingerprint": "e635c77d78738b45", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/SupplierInvoiceList.tsx"}, "region": {"startLine": 640}}}]}, {"ruleId": "scanner-003886b7fc9b1081", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ProposalList.tsx:789"}, "properties": {"repobilityId": "2f2787abb543ebf8", "scanner": "scanner-primary", "fingerprint": "003886b7fc9b1081", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ProposalList.tsx"}, "region": {"startLine": 789}}}]}, {"ruleId": "scanner-8b9c630f2059b3a9", "level": "note", "message": {"text": "Insecure pattern 'document_write' in src/components/ActivityReportModal.tsx:136"}, "properties": {"repobilityId": "4e211115c2b7e2cf", "scanner": "scanner-primary", "fingerprint": "8b9c630f2059b3a9", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ActivityReportModal.tsx"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-39dfb2ea7b9f4f3b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/InterventionList.tsx:360"}, "properties": {"repobilityId": "ecf434138513d0ef", "scanner": "scanner-primary", "fingerprint": "39dfb2ea7b9f4f3b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/InterventionList.tsx"}, "region": {"startLine": 360}}}]}, {"ruleId": "scanner-99fe0fe75e1fa133", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/VenueList.tsx:275"}, "properties": {"repobilityId": "eb93c02508cf2f4b", "scanner": "scanner-primary", "fingerprint": "99fe0fe75e1fa133", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/VenueList.tsx"}, "region": {"startLine": 275}}}]}, {"ruleId": "scanner-f5e486dfac483f3c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/InvoiceList.tsx:753"}, "properties": {"repobilityId": "7f7b5c7fc4751265", "scanner": "scanner-primary", "fingerprint": "f5e486dfac483f3c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/InvoiceList.tsx"}, "region": {"startLine": 753}}}]}, {"ruleId": "scanner-31efa6b23944b9aa", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/TicketList.tsx:328"}, "properties": {"repobilityId": "0f4381296ffebc0a", "scanner": "scanner-primary", "fingerprint": "31efa6b23944b9aa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/TicketList.tsx"}, "region": {"startLine": 328}}}]}, {"ruleId": "scanner-d4ca2c7861f4cbd6", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/TaskDetail.tsx:343"}, "properties": {"repobilityId": "93b6ce2731d331b9", "scanner": "scanner-primary", "fingerprint": "d4ca2c7861f4cbd6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/TaskDetail.tsx"}, "region": {"startLine": 343}}}]}, {"ruleId": "scanner-c894e09499d0bb80", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/SupplierProposalList.tsx:660"}, "properties": {"repobilityId": "7a462119cb65d98d", "scanner": "scanner-primary", "fingerprint": "c894e09499d0bb80", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/SupplierProposalList.tsx"}, "region": {"startLine": 660}}}]}, {"ruleId": "scanner-657507b5d9fad723", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/common/RichTextEditor.tsx:21"}, "properties": {"repobilityId": "ee019482db6fc7a1", "scanner": "scanner-primary", "fingerprint": "657507b5d9fad723", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/common/RichTextEditor.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-2c7f0d8ad6335f05", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ui/RichTextEditor.tsx:52"}, "properties": {"repobilityId": "ef3e0e250109157d", "scanner": "scanner-primary", "fingerprint": "2c7f0d8ad6335f05", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/RichTextEditor.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-226101a3f588c562", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/HR/modals/ExpenseDetailModal.tsx:299"}, "properties": {"repobilityId": "936657fca25dbebb", "scanner": "scanner-primary", "fingerprint": "226101a3f588c562", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/HR/modals/ExpenseDetailModal.tsx"}, "region": {"startLine": 299}}}]}, {"ruleId": "scanner-1be6f78aab42df78", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/Email/EmailReadingPane.tsx:233"}, "properties": {"repobilityId": "585a626c5df82f6e", "scanner": "scanner-primary", "fingerprint": "1be6f78aab42df78", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/Email/EmailReadingPane.tsx"}, "region": {"startLine": 233}}}]}, {"ruleId": "scanner-c306b3f793c2df27", "level": "note", "message": {"text": "Very large file: backend/src/types/dolibarr.actions.d.ts (18144 lines)"}, "properties": {"repobilityId": "cb130c94b5708b85", "scanner": "scanner-primary", "fingerprint": "c306b3f793c2df27", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a125b1ad428adff5", "level": "note", "message": {"text": "Very large file: backend/src/services/taskRunnerService.ts (2581 lines)"}, "properties": {"repobilityId": "01850848f652db81", "scanner": "scanner-primary", "fingerprint": "a125b1ad428adff5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6e6cc77bde38cf9b", "level": "note", "message": {"text": "Very large file: backend/src/services/agentTools.ts (1866 lines)"}, "properties": {"repobilityId": "103df7649d0b6c75", "scanner": "scanner-primary", "fingerprint": "6e6cc77bde38cf9b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aa099ec88ab2a549", "level": "note", "message": {"text": "Very large file: backend/src/services/aiService.ts (1531 lines)"}, "properties": {"repobilityId": "343e6a269b3391a8", "scanner": "scanner-primary", "fingerprint": "aa099ec88ab2a549", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8fec47f15a6ead10", "level": "note", "message": {"text": "Very large file: src/types/dolibarr.actions.d.ts (18144 lines)"}, "properties": {"repobilityId": "c8fed621bc7d55cc", "scanner": "scanner-primary", "fingerprint": "8fec47f15a6ead10", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-45ba21b5f34a63db", "level": "note", "message": {"text": "Very large file: src/components/SupplierInvoiceList.tsx (1013 lines)"}, "properties": {"repobilityId": "6c51e1ea0ed4d124", "scanner": "scanner-primary", "fingerprint": "45ba21b5f34a63db", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c9b699202b8c9db3", "level": "note", "message": {"text": "Very large file: src/components/CustomerList.tsx (1080 lines)"}, "properties": {"repobilityId": "f794f28473af47c4", "scanner": "scanner-primary", "fingerprint": "c9b699202b8c9db3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-739126bc87472735", "level": "note", "message": {"text": "Very large file: src/components/ProposalList.tsx (1063 lines)"}, "properties": {"repobilityId": "bc28658c81f280ec", "scanner": "scanner-primary", "fingerprint": "739126bc87472735", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-61aa87bda35537c4", "level": "note", "message": {"text": "Very large file: src/components/BankAccountList.tsx (866 lines)"}, "properties": {"repobilityId": "ef4471aace80a876", "scanner": "scanner-primary", "fingerprint": "61aa87bda35537c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cc4ee3cc2480c69e", "level": "note", "message": {"text": "Very large file: src/components/InvoiceList.tsx (1126 lines)"}, "properties": {"repobilityId": "5ce82cf60ffb64d9", "scanner": "scanner-primary", "fingerprint": "cc4ee3cc2480c69e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b86978c60441e8d1", "level": "note", "message": {"text": "Very large file: src/components/SchedulerAdmin.tsx (1645 lines)"}, "properties": {"repobilityId": "75e39cf8e211876f", "scanner": "scanner-primary", "fingerprint": "b86978c60441e8d1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cdc79eca61997c4e", "level": "note", "message": {"text": "Very large file: src/components/SupplierProposalList.tsx (909 lines)"}, "properties": {"repobilityId": "5d1ba708fda63284", "scanner": "scanner-primary", "fingerprint": "cdc79eca61997c4e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-be8203cf7ea1a9e2", "level": "note", "message": {"text": "Very large file: src/components/TasksBoard/TasksBoard.tsx (892 lines)"}, "properties": {"repobilityId": "ca6cb1ae339fb382", "scanner": "scanner-primary", "fingerprint": "be8203cf7ea1a9e2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e0bae6c0a946dd5a", "level": "note", "message": {"text": "Very large file: src/components/Tasks/UserTaskDashboard.tsx (1076 lines)"}, "properties": {"repobilityId": "e568cb204fe85210", "scanner": "scanner-primary", "fingerprint": "e0bae6c0a946dd5a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b314dcc28afa82fc", "level": "note", "message": {"text": "Very large file: src/components/DevelopmentConsole/LlmSettingsTab.tsx (988 lines)"}, "properties": {"repobilityId": "03c1e1b6e27be065", "scanner": "scanner-primary", "fingerprint": "b314dcc28afa82fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-95fdc144895d0699", "level": "note", "message": {"text": "Very large file: src/components/Issues/IssuesPage.tsx (907 lines)"}, "properties": {"repobilityId": "fe073157c6c3105c", "scanner": "scanner-primary", "fingerprint": "95fdc144895d0699", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "372a69b6a69eb1ae", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "3d2333311f1a1ce2", "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": "4b076d831bc73ed3", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "5456dd841eb935b6", "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": "f4be5b0c15a03c1b", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "3aaa07d3500adea2", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "52e579379b1550ae", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e012cc3ec2e38983", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/diagnostics/analyze_api_gaps.js:31"}, "properties": {"repobilityId": "189fabe2a6d6932a", "scanner": "scanner-primary", "fingerprint": "e012cc3ec2e38983", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-127be3b415edc068", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/src/server.ts:28"}, "properties": {"repobilityId": "1f0f15857c694e5a", "scanner": "scanner-primary", "fingerprint": "127be3b415edc068", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6c1a09db1216beb", "level": "note", "message": {"text": "Legacy-named symbol `t2a_v2` in backend/src/__tests__/services/minimaxService.test.ts:22"}, "properties": {"repobilityId": "4b9388e8d3a7df23", "scanner": "scanner-primary", "fingerprint": "a6c1a09db1216beb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b61f99186e1298ff", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/middleware/authMiddleware.ts:101"}, "properties": {"repobilityId": "9d7ddcb7cad243c6", "scanner": "scanner-primary", "fingerprint": "b61f99186e1298ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ed68786c311ba60", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/scripts/test-client-stripping.ts:13"}, "properties": {"repobilityId": "63e93d8284849c3e", "scanner": "scanner-primary", "fingerprint": "8ed68786c311ba60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27ea72f6d920fc50", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/utils/processTree.ts:148"}, "properties": {"repobilityId": "dedff388f9813d53", "scanner": "scanner-primary", "fingerprint": "27ea72f6d920fc50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8fd398edfbd402d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/routes/adminRoutes.ts:9"}, "properties": {"repobilityId": "61deebead7d4a814", "scanner": "scanner-primary", "fingerprint": "8fd398edfbd402d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-122d7e9d30083f27", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/services/bankingService.ts:559"}, "properties": {"repobilityId": "5bd8d7de084c4996", "scanner": "scanner-primary", "fingerprint": "122d7e9d30083f27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48a4f74155b952f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/src/services/taskRunnerService.ts:679"}, "properties": {"repobilityId": "01bf9f78b1ac00bd", "scanner": "scanner-primary", "fingerprint": "48a4f74155b952f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7dd333fb268cc587", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/services/tunnelService.ts:1"}, "properties": {"repobilityId": "2f623b1bce138fa2", "scanner": "scanner-primary", "fingerprint": "7dd333fb268cc587", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11e7f74cd13aa927", "level": "note", "message": {"text": "Legacy-named symbol `t2a_v2` in backend/src/services/minimaxService.ts:52"}, "properties": {"repobilityId": "937af58c8d766a7b", "scanner": "scanner-primary", "fingerprint": "11e7f74cd13aa927", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-40d6d10f6307bbfc", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/services/aiService.ts:1308"}, "properties": {"repobilityId": "88d66da03b78ea7c", "scanner": "scanner-primary", "fingerprint": "40d6d10f6307bbfc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed34b51a1578b663", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/src/services/dolibarr/operations.ts:109"}, "properties": {"repobilityId": "6ec7a379d5721418", "scanner": "scanner-primary", "fingerprint": "ed34b51a1578b663", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-caa8cd9865524d0e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/config/dashboardWidgets.ts:5"}, "properties": {"repobilityId": "35803b37ae0c7182", "scanner": "scanner-primary", "fingerprint": "caa8cd9865524d0e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7a2ca636a4def3e8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/config/menuRegistry.ts:1"}, "properties": {"repobilityId": "cc749c17f6fbf22f", "scanner": "scanner-primary", "fingerprint": "7a2ca636a4def3e8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-342f709c6f4cefc3", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/WhatsAppView.tsx:131"}, "properties": {"repobilityId": "62a0359256d3c140", "scanner": "scanner-primary", "fingerprint": "342f709c6f4cefc3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ed6f68052c8fa21", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/SchedulerAdmin.tsx:199"}, "properties": {"repobilityId": "9373f404d2e0c70e", "scanner": "scanner-primary", "fingerprint": "3ed6f68052c8fa21", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b19a0f09b6438ddd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/Tasks/UserTaskDashboard.tsx:79"}, "properties": {"repobilityId": "850fa269f37dc34e", "scanner": "scanner-primary", "fingerprint": "b19a0f09b6438ddd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2e0b8bef072cd81", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/Banking/BankingInsightsPanel.tsx:64"}, "properties": {"repobilityId": "fb6d1eb666e43011", "scanner": "scanner-primary", "fingerprint": "f2e0b8bef072cd81", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54ecffe4b9032ece", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/Modals/SupplierPaymentModal.tsx:46"}, "properties": {"repobilityId": "7f4130d9ba77bc8b", "scanner": "scanner-primary", "fingerprint": "54ecffe4b9032ece", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f6611a1bc089cbc7", "level": "note", "message": {"text": "Legacy-named symbol `eventscale_snapshots_v1` in src/pages/Simulator/components/modals/SavedSimulationsModal.tsx:21"}, "properties": {"repobilityId": "18992c41b8f8d465", "scanner": "scanner-primary", "fingerprint": "f6611a1bc089cbc7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-842a0c03e13dc95d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/hooks/useNotifications.ts:179"}, "properties": {"repobilityId": "612af0125f72467c", "scanner": "scanner-primary", "fingerprint": "842a0c03e13dc95d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1449e62f6283cb9d", "level": "none", "message": {"text": "Commented-code block (20 lines) in src/hooks/dolibarr/hooks.ts:347"}, "properties": {"repobilityId": "3a1012956228d568", "scanner": "scanner-primary", "fingerprint": "1449e62f6283cb9d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-35c132c00eb854e1", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/hooks/whatsapp/useConversations.ts:81"}, "properties": {"repobilityId": "85ae058f1b7758d9", "scanner": "scanner-primary", "fingerprint": "35c132c00eb854e1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dc0ca5b37a5e23a4", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/services/api/core.ts:502"}, "properties": {"repobilityId": "270d7502b1de8b95", "scanner": "scanner-primary", "fingerprint": "dc0ca5b37a5e23a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-11e66084e40c85e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/services/api/core.ts:555"}, "properties": {"repobilityId": "56d2b00853ea2e2b", "scanner": "scanner-primary", "fingerprint": "11e66084e40c85e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3dfbc5467048f408", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/api/operations.ts:32"}, "properties": {"repobilityId": "1b2084abab19b93e", "scanner": "scanner-primary", "fingerprint": "3dfbc5467048f408", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c1fcfe6458a1695", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/services/api/hrAdmin.ts:450"}, "properties": {"repobilityId": "54b03aeb76c42a85", "scanner": "scanner-primary", "fingerprint": "9c1fcfe6458a1695", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bddda3d5a14c7401", "level": "note", "message": {"text": "29 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "3519a6b4ac1d4f19", "scanner": "scanner-primary", "fingerprint": "bddda3d5a14c7401", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-5ebc058af99148ac", "level": "warning", "message": {"text": "Frontend route `/customers/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "201970fbce16aca0", "scanner": "scanner-primary", "fingerprint": "5ebc058af99148ac", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8f48f747b57fcbc5", "level": "warning", "message": {"text": "Frontend route `/customers/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "05962e4a8d3521ec", "scanner": "scanner-primary", "fingerprint": "8f48f747b57fcbc5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d4c38ddb9fd4f95f", "level": "warning", "message": {"text": "Frontend route `/customers/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "e9798317ea527bc6", "scanner": "scanner-primary", "fingerprint": "d4c38ddb9fd4f95f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bbad5b4b95720e5f", "level": "warning", "message": {"text": "Frontend route `/contacts` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "b47a90c8e73c9a84", "scanner": "scanner-primary", "fingerprint": "bbad5b4b95720e5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-887d04dbf62f9838", "level": "warning", "message": {"text": "Frontend route `/contacts/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "eb68a7cc46ed2adb", "scanner": "scanner-primary", "fingerprint": "887d04dbf62f9838", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-af5e40f71bdd5493", "level": "warning", "message": {"text": "Frontend route `/contacts/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "0d15ba8115112d28", "scanner": "scanner-primary", "fingerprint": "af5e40f71bdd5493", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-451ef7ddbc518520", "level": "warning", "message": {"text": "Frontend route `/contacts/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "bf8143f0620de630", "scanner": "scanner-primary", "fingerprint": "451ef7ddbc518520", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1a2c7e5fc7c56a6b", "level": "warning", "message": {"text": "Frontend route `/suppliers/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "75aa040e97168774", "scanner": "scanner-primary", "fingerprint": "1a2c7e5fc7c56a6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-96c9aae9645f150f", "level": "warning", "message": {"text": "Frontend route `/suppliers/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "cab240ef70d3a08d", "scanner": "scanner-primary", "fingerprint": "96c9aae9645f150f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a60e3628c24869d2", "level": "warning", "message": {"text": "Frontend route `/suppliers/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "067b9c1496124db5", "scanner": "scanner-primary", "fingerprint": "a60e3628c24869d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-dab3970b5dbeb63e", "level": "warning", "message": {"text": "Frontend route `/venues/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "6bca0f7a59af1e81", "scanner": "scanner-primary", "fingerprint": "dab3970b5dbeb63e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fcba3dbe043727d8", "level": "warning", "message": {"text": "Frontend route `/invoices/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "266ab3b7cc5a541d", "scanner": "scanner-primary", "fingerprint": "fcba3dbe043727d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-1c0186e2fb51956c", "level": "warning", "message": {"text": "Frontend route `/invoices/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "0a5a0de982385484", "scanner": "scanner-primary", "fingerprint": "1c0186e2fb51956c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b7a45773b186cc67", "level": "warning", "message": {"text": "Frontend route `/invoices/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "dd09bac8baf81b7c", "scanner": "scanner-primary", "fingerprint": "b7a45773b186cc67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5160574a35523cad", "level": "warning", "message": {"text": "Frontend route `/supplier_invoices/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "a1495c99f77b6f9c", "scanner": "scanner-primary", "fingerprint": "5160574a35523cad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5588222766d2b128", "level": "warning", "message": {"text": "Frontend route `/supplier_invoices/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "1efaf44c1cae9135", "scanner": "scanner-primary", "fingerprint": "5588222766d2b128", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7a2888352249ea9f", "level": "warning", "message": {"text": "Frontend route `/supplier_invoices/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "397a05e5d0bd0f09", "scanner": "scanner-primary", "fingerprint": "7a2888352249ea9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b99192751f05dbb0", "level": "warning", "message": {"text": "Frontend route `/proposals/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "b60ff3a7412a66ad", "scanner": "scanner-primary", "fingerprint": "b99192751f05dbb0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7de7973d47d0ee9a", "level": "warning", "message": {"text": "Frontend route `/proposals/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "753b4e62b3249eca", "scanner": "scanner-primary", "fingerprint": "7de7973d47d0ee9a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-41540ef3a11294dc", "level": "warning", "message": {"text": "Frontend route `/proposals/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "77b6a3724c49f133", "scanner": "scanner-primary", "fingerprint": "41540ef3a11294dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2391e8e0c7a53e90", "level": "warning", "message": {"text": "Frontend route `/supplier_proposals/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "e8a9c883184624d0", "scanner": "scanner-primary", "fingerprint": "2391e8e0c7a53e90", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8eeecb8f28b8e326", "level": "warning", "message": {"text": "Frontend route `/supplier_proposals/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "7c242b7d09117db9", "scanner": "scanner-primary", "fingerprint": "8eeecb8f28b8e326", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-922a2907aca7f041", "level": "warning", "message": {"text": "Frontend route `/supplier_proposals/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "80482b961a8ce275", "scanner": "scanner-primary", "fingerprint": "922a2907aca7f041", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0d83d20e6fd3f101", "level": "warning", "message": {"text": "Frontend route `/orders/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "bf3c018502441c7b", "scanner": "scanner-primary", "fingerprint": "0d83d20e6fd3f101", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cebd07ef89ad0045", "level": "warning", "message": {"text": "Frontend route `/orders/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "a9df1c349411e358", "scanner": "scanner-primary", "fingerprint": "cebd07ef89ad0045", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8b3e65c3021cff22", "level": "warning", "message": {"text": "Frontend route `/orders/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "c7a0d8ab2c35d33d", "scanner": "scanner-primary", "fingerprint": "8b3e65c3021cff22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-32e6c8f6754d28b5", "level": "warning", "message": {"text": "Frontend route `/projects/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "a1a5eecc7e18001a", "scanner": "scanner-primary", "fingerprint": "32e6c8f6754d28b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-81619cafec57e3aa", "level": "warning", "message": {"text": "Frontend route `/projects/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "d280778ccfca3193", "scanner": "scanner-primary", "fingerprint": "81619cafec57e3aa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9848e66cce0d6186", "level": "warning", "message": {"text": "Frontend route `/projects/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "daa3b4c4078e9e7b", "scanner": "scanner-primary", "fingerprint": "9848e66cce0d6186", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-70fd3311dbb22232", "level": "warning", "message": {"text": "Frontend route `/tasks` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "e683c2e1a4d19e5f", "scanner": "scanner-primary", "fingerprint": "70fd3311dbb22232", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-021df5923a61e486", "level": "warning", "message": {"text": "Frontend route `/tasks/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "47e2d958f289f9f7", "scanner": "scanner-primary", "fingerprint": "021df5923a61e486", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-fa15388a856eeba7", "level": "warning", "message": {"text": "Frontend route `/tasks/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "30b6306ac8e16060", "scanner": "scanner-primary", "fingerprint": "fa15388a856eeba7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-542bb1c4ddee9b2f", "level": "warning", "message": {"text": "Frontend route `/tasks/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "2293d07503158c73", "scanner": "scanner-primary", "fingerprint": "542bb1c4ddee9b2f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-356dc5979cec8ee2", "level": "warning", "message": {"text": "Frontend route `/tickets/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "6922d286679c19f8", "scanner": "scanner-primary", "fingerprint": "356dc5979cec8ee2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5b6287a53e065f17", "level": "warning", "message": {"text": "Frontend route `/tickets/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "2b6ca85850749e9c", "scanner": "scanner-primary", "fingerprint": "5b6287a53e065f17", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-7c9b08bf41dad4eb", "level": "warning", "message": {"text": "Frontend route `/tickets/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "28d245a313e60009", "scanner": "scanner-primary", "fingerprint": "7c9b08bf41dad4eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-04ad9341a4188bae", "level": "warning", "message": {"text": "Frontend route `/products/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "000392fbe0941f33", "scanner": "scanner-primary", "fingerprint": "04ad9341a4188bae", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5c01d29ac971c22c", "level": "warning", "message": {"text": "Frontend route `/products/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "a8892d2684888773", "scanner": "scanner-primary", "fingerprint": "5c01d29ac971c22c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-17aedd29d1fae186", "level": "warning", "message": {"text": "Frontend route `/products/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "016d2a6875d62145", "scanner": "scanner-primary", "fingerprint": "17aedd29d1fae186", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-79da2406a60ee985", "level": "warning", "message": {"text": "Frontend route `/services` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "edb31b8771f631ae", "scanner": "scanner-primary", "fingerprint": "79da2406a60ee985", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b67448cb4cf0d345", "level": "warning", "message": {"text": "Frontend route `/services/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "db359fe4e837d0f8", "scanner": "scanner-primary", "fingerprint": "b67448cb4cf0d345", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-e4567ec854a132e8", "level": "warning", "message": {"text": "Frontend route `/categories/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "ba47e02808836904", "scanner": "scanner-primary", "fingerprint": "e4567ec854a132e8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cc7aa68cb0364ca4", "level": "warning", "message": {"text": "Frontend route `/categories/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "e3844e85e52e69a3", "scanner": "scanner-primary", "fingerprint": "cc7aa68cb0364ca4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-c2e317f38df2818a", "level": "warning", "message": {"text": "Frontend route `/batch/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "7c73a8da8562cfef", "scanner": "scanner-primary", "fingerprint": "c2e317f38df2818a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8baccad05828c3bd", "level": "warning", "message": {"text": "Frontend route `/manufacturing/mo/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "67983bd8c0fa51e8", "scanner": "scanner-primary", "fingerprint": "8baccad05828c3bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-291623da51808eb5", "level": "warning", "message": {"text": "Frontend route `/manufacturing/mo/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "c5c834a0bb660f04", "scanner": "scanner-primary", "fingerprint": "291623da51808eb5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f3a139b972806ebd", "level": "warning", "message": {"text": "Frontend route `/manufacturing/bom/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "82135247164e86ab", "scanner": "scanner-primary", "fingerprint": "f3a139b972806ebd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5a1eb9dd5b7e4873", "level": "warning", "message": {"text": "Frontend route `/manufacturing/bom/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "daf3a85d78abde07", "scanner": "scanner-primary", "fingerprint": "5a1eb9dd5b7e4873", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3a2ed262c89c95c5", "level": "warning", "message": {"text": "Frontend route `/interventions/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "57463f894cc4341f", "scanner": "scanner-primary", "fingerprint": "3a2ed262c89c95c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-54964f450dbd9e4d", "level": "warning", "message": {"text": "Frontend route `/interventions/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "74fc885e1fae1cb8", "scanner": "scanner-primary", "fingerprint": "54964f450dbd9e4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-869a68c70821df09", "level": "warning", "message": {"text": "Frontend route `/interventions/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "879215a3aed4b333", "scanner": "scanner-primary", "fingerprint": "869a68c70821df09", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-0cf0f17ca5d327bf", "level": "warning", "message": {"text": "Frontend route `/contracts/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "b4781818a9927e0a", "scanner": "scanner-primary", "fingerprint": "0cf0f17ca5d327bf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-915ec2d30ea34dd3", "level": "warning", "message": {"text": "Frontend route `/contracts/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "373749556720c35c", "scanner": "scanner-primary", "fingerprint": "915ec2d30ea34dd3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8cc91d0e0011c08b", "level": "warning", "message": {"text": "Frontend route `/hr/jobs/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "a005c26dba6c9b24", "scanner": "scanner-primary", "fingerprint": "8cc91d0e0011c08b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-83178fb07669f96a", "level": "warning", "message": {"text": "Frontend route `/hr/jobs/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "97017a3985151f29", "scanner": "scanner-primary", "fingerprint": "83178fb07669f96a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ccec3a713889676d", "level": "warning", "message": {"text": "Frontend route `/hr/leaves/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "8863724846236e56", "scanner": "scanner-primary", "fingerprint": "ccec3a713889676d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2ae0d3b1df0e9579", "level": "warning", "message": {"text": "Frontend route `/hr/leaves/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "8a8ffefaf7c1cc7d", "scanner": "scanner-primary", "fingerprint": "2ae0d3b1df0e9579", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-26e7306154508283", "level": "warning", "message": {"text": "Frontend route `/hr/candidates/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "a8b3376722d25657", "scanner": "scanner-primary", "fingerprint": "26e7306154508283", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-2df5e026993b4e65", "level": "warning", "message": {"text": "Frontend route `/hr/candidates/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "d2760fe806667b7b", "scanner": "scanner-primary", "fingerprint": "2df5e026993b4e65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-cd9ab4e180ddee23", "level": "warning", "message": {"text": "Frontend route `/hr/users/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "26ab8977a59d02fe", "scanner": "scanner-primary", "fingerprint": "cd9ab4e180ddee23", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-01ec32255c706175", "level": "warning", "message": {"text": "Frontend route `/hr/users/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "4c44e0d9aba5df06", "scanner": "scanner-primary", "fingerprint": "01ec32255c706175", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5e3b58b1fb98410c", "level": "warning", "message": {"text": "Frontend route `/hr/groups/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "10f484264c8bc207", "scanner": "scanner-primary", "fingerprint": "5e3b58b1fb98410c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5193812d3e34bcfb", "level": "warning", "message": {"text": "Frontend route `/hr/groups/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "7f38fa22df262930", "scanner": "scanner-primary", "fingerprint": "5193812d3e34bcfb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-f0a3062837242240", "level": "warning", "message": {"text": "Frontend route `/hr/expenses/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "67f99c1103bf8437", "scanner": "scanner-primary", "fingerprint": "f0a3062837242240", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-304c32f940ae4529", "level": "warning", "message": {"text": "Frontend route `/hr/expenses/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "338aa4fb8aedf163", "scanner": "scanner-primary", "fingerprint": "304c32f940ae4529", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-47af6e1d9d895086", "level": "warning", "message": {"text": "Frontend route `/hr/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "cfd6b10613c7605f", "scanner": "scanner-primary", "fingerprint": "47af6e1d9d895086", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-da05c58d2ceb8c35", "level": "warning", "message": {"text": "Frontend route `/agenda/new` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "b7c05c974a1634c7", "scanner": "scanner-primary", "fingerprint": "da05c58d2ceb8c35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-9f5484bdc8e32688", "level": "warning", "message": {"text": "Frontend route `/agenda/:id/edit` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "b39c252a939004df", "scanner": "scanner-primary", "fingerprint": "9f5484bdc8e32688", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-23431a1a68b16734", "level": "warning", "message": {"text": "Frontend route `/agenda/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "2acdcf7cc4347ab2", "scanner": "scanner-primary", "fingerprint": "23431a1a68b16734", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-44ff5f070eb65df5", "level": "warning", "message": {"text": "Frontend route `/payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "6f94e603a8c84b78", "scanner": "scanner-primary", "fingerprint": "44ff5f070eb65df5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-89470ab8874b6b6e", "level": "warning", "message": {"text": "Frontend route `/supplier_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "d3539829598ca066", "scanner": "scanner-primary", "fingerprint": "89470ab8874b6b6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-020cf6dbc1021761", "level": "warning", "message": {"text": "Frontend route `/tax_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "697bfb4453863b7b", "scanner": "scanner-primary", "fingerprint": "020cf6dbc1021761", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-15bcbc3ba49d6245", "level": "warning", "message": {"text": "Frontend route `/salary_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "a3934f0dcda50a19", "scanner": "scanner-primary", "fingerprint": "15bcbc3ba49d6245", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3444dcee536f2bc5", "level": "warning", "message": {"text": "Frontend route `/expense_report_payments/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "f9b2b105943409aa", "scanner": "scanner-primary", "fingerprint": "3444dcee536f2bc5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a04ad2338b035697", "level": "warning", "message": {"text": "Frontend route `/opencode-tasks` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "766ddce6c0e4f119", "scanner": "scanner-primary", "fingerprint": "a04ad2338b035697", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-36f360829fd4b09a", "level": "warning", "message": {"text": "Frontend route `:type/:id` has no Link/navigate to it \u2014 src/components/App.tsx"}, "properties": {"repobilityId": "42426d5f1deb679a", "scanner": "scanner-primary", "fingerprint": "36f360829fd4b09a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-134fec92de346256", "level": "error", "message": {"text": "Dangling fetch: DELETE http://localhost:${config.port}/api/dolibarr/thirdparties/${res.data} (backend/src/scripts/test-client-stripping.ts:42)"}, "properties": {"repobilityId": "e1373f68f33ad5b1", "scanner": "scanner-primary", "fingerprint": "134fec92de346256", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-3c991203e0997426", "level": "error", "message": {"text": "Dangling fetch: POST https://google.serper.dev/search (backend/src/services/scraperService.ts:23)"}, "properties": {"repobilityId": "ba23885a85a4f22d", "scanner": "scanner-primary", "fingerprint": "3c991203e0997426", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-f8d31ce6e83c1c95", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/status (src/components/AdminApp.tsx:41)"}, "properties": {"repobilityId": "7c83da05a7fd3d12", "scanner": "scanner-primary", "fingerprint": "f8d31ce6e83c1c95", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e8e562757590fa21", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/restart (src/components/AdminApp.tsx:59)"}, "properties": {"repobilityId": "e4750e471ce84bc1", "scanner": "scanner-primary", "fingerprint": "e8e562757590fa21", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07237142cc91d71c", "level": "error", "message": {"text": "Dangling fetch: POST /api/documents/send (src/components/Banking/SendDocumentModal.tsx:62)"}, "properties": {"repobilityId": "91d98da89596e699", "scanner": "scanner-primary", "fingerprint": "07237142cc91d71c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-15d601b6ae51b770", "level": "error", "message": {"text": "Dangling fetch: POST /api/banking/insights/cash-flow (src/components/Banking/BankingInsightsPanel.tsx:48)"}, "properties": {"repobilityId": "9bc535e7367a04aa", "scanner": "scanner-primary", "fingerprint": "15d601b6ae51b770", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-85bf397e7fb799af", "level": "error", "message": {"text": "Dangling fetch: POST /api/banking/analyze/anomalies (src/components/Banking/BankingInsightsPanel.tsx:64)"}, "properties": {"repobilityId": "ea9e3b9e5552900d", "scanner": "scanner-primary", "fingerprint": "85bf397e7fb799af", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-32e1768f36e8ca03", "level": "error", "message": {"text": "Dangling fetch: POST /api/banking/import/auto (src/components/Banking/BankStatementImport.tsx:79)"}, "properties": {"repobilityId": "09cc68496127e086", "scanner": "scanner-primary", "fingerprint": "32e1768f36e8ca03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-566355d0217f6555", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/config/llm (src/components/DevelopmentConsole/LlmSettingsTab.tsx:110)"}, "properties": {"repobilityId": "ef1921c022e68960", "scanner": "scanner-primary", "fingerprint": "566355d0217f6555", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-06c481be417544b0", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/config/llm/modules (src/components/DevelopmentConsole/LlmSettingsTab.tsx:132)"}, "properties": {"repobilityId": "7dd01a482236b0b2", "scanner": "scanner-primary", "fingerprint": "06c481be417544b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-0a81263b4f1fdc5e", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/config/llm/prompts (src/components/DevelopmentConsole/LlmSettingsTab.tsx:143)"}, "properties": {"repobilityId": "0d33ba8009d72017", "scanner": "scanner-primary", "fingerprint": "0a81263b4f1fdc5e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-a45e453ccf0bfa16", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/config/llm/stats (src/components/DevelopmentConsole/LlmSettingsTab.tsx:154)"}, "properties": {"repobilityId": "68787ee28b45455d", "scanner": "scanner-primary", "fingerprint": "a45e453ccf0bfa16", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-eab000154b19dba9", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/config/llm/models?provider=${targetProvider} (src/components/DevelopmentConsole/LlmSettingsTab.tsx:167)"}, "properties": {"repobilityId": "88990c9fc8ef3e6d", "scanner": "scanner-primary", "fingerprint": "eab000154b19dba9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-61fb3dcea16dedd6", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/config/llm (src/components/DevelopmentConsole/LlmSettingsTab.tsx:221)"}, "properties": {"repobilityId": "a97622153313813d", "scanner": "scanner-primary", "fingerprint": "61fb3dcea16dedd6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-255d433fde4f07d5", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/config/llm/modules (src/components/DevelopmentConsole/LlmSettingsTab.tsx:239)"}, "properties": {"repobilityId": "6afc07f26dd6cbb8", "scanner": "scanner-primary", "fingerprint": "255d433fde4f07d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-ec19089e2de2d49f", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/config/llm/prompts (src/components/DevelopmentConsole/LlmSettingsTab.tsx:252)"}, "properties": {"repobilityId": "d6b8f4330cb26d18", "scanner": "scanner-primary", "fingerprint": "ec19089e2de2d49f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-bae81632e5e0f6c0", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/config/llm/test (src/components/DevelopmentConsole/LlmSettingsTab.tsx:275)"}, "properties": {"repobilityId": "3e7a7d47a2816fad", "scanner": "scanner-primary", "fingerprint": "bae81632e5e0f6c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-08e84223510ad75f", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/config/llm/playground (src/components/DevelopmentConsole/LlmSettingsTab.tsx:305)"}, "properties": {"repobilityId": "a4756571f25b1d4e", "scanner": "scanner-primary", "fingerprint": "08e84223510ad75f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-fbb535b900c8ee86", "level": "error", "message": {"text": "Dangling fetch: GET /api/itau/status (src/hooks/useItauBank.ts:101)"}, "properties": {"repobilityId": "94ea295362b39822", "scanner": "scanner-primary", "fingerprint": "fbb535b900c8ee86", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-4afd814dacfbe1dd", "level": "error", "message": {"text": "Dangling fetch: POST /api/itau/test (src/hooks/useItauBank.ts:106)"}, "properties": {"repobilityId": "8981decd584d7ab0", "scanner": "scanner-primary", "fingerprint": "4afd814dacfbe1dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-fdba8ee76e067529", "level": "error", "message": {"text": "Dangling fetch: POST /api/itau/certificates (src/hooks/useItauBank.ts:113)"}, "properties": {"repobilityId": "543bc43a15ccbe8d", "scanner": "scanner-primary", "fingerprint": "fdba8ee76e067529", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-771c7749e5673f78", "level": "error", "message": {"text": "Dangling fetch: GET /api/itau/saldo (src/hooks/useItauBank.ts:121)"}, "properties": {"repobilityId": "bd518578107b4d66", "scanner": "scanner-primary", "fingerprint": "771c7749e5673f78", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-92d1537955ee886b", "level": "error", "message": {"text": "Dangling fetch: GET /api/itau/extrato (src/hooks/useItauBank.ts:126)"}, "properties": {"repobilityId": "47fa6d15cbb891c7", "scanner": "scanner-primary", "fingerprint": "92d1537955ee886b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-685300160170d13a", "level": "error", "message": {"text": "Dangling fetch: POST /api/itau/pix/cobranca (src/hooks/useItauBank.ts:134)"}, "properties": {"repobilityId": "291d51b75a31a16e", "scanner": "scanner-primary", "fingerprint": "685300160170d13a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-9b7ae2040ff7929a", "level": "error", "message": {"text": "Dangling fetch: GET /api/itau/pix/recebidos (src/hooks/useItauBank.ts:139)"}, "properties": {"repobilityId": "5a4b31ed3fb776df", "scanner": "scanner-primary", "fingerprint": "9b7ae2040ff7929a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-b976970c1e1fea1e", "level": "error", "message": {"text": "Dangling fetch: POST /api/itau/boleto (src/hooks/useItauBank.ts:147)"}, "properties": {"repobilityId": "e44a33ae66251db4", "scanner": "scanner-primary", "fingerprint": "b976970c1e1fea1e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-95ec698e2c465d79", "level": "error", "message": {"text": "Dangling fetch: GET /api/itau/boleto (src/hooks/useItauBank.ts:156)"}, "properties": {"repobilityId": "13a0586dda530e07", "scanner": "scanner-primary", "fingerprint": "95ec698e2c465d79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-a3d4da22726ada68", "level": "error", "message": {"text": "Dangling fetch: GET /api/itau/boleto/${nossoNumero} (src/hooks/useItauBank.ts:161)"}, "properties": {"repobilityId": "c2acd47b52e6d3e8", "scanner": "scanner-primary", "fingerprint": "a3d4da22726ada68", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-881f9c1ff0524d12", "level": "error", "message": {"text": "Dangling fetch: GET /api/itau/boleto/${nossoNumero}/pdf (src/hooks/useItauBank.ts:166)"}, "properties": {"repobilityId": "dbc88dfa552bdb0a", "scanner": "scanner-primary", "fingerprint": "881f9c1ff0524d12", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-c0828eb20631afc4", "level": "error", "message": {"text": "Dangling fetch: POST /api/itau/boleto/${nossoNumero}/baixar (src/hooks/useItauBank.ts:173)"}, "properties": {"repobilityId": "9a300ae25957b753", "scanner": "scanner-primary", "fingerprint": "c0828eb20631afc4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-ae92dc13c3a9fd9b", "level": "error", "message": {"text": "Dangling fetch: GET /api/github/issues/stats (src/services/githubService.ts:50)"}, "properties": {"repobilityId": "2616dec5859d54b7", "scanner": "scanner-primary", "fingerprint": "ae92dc13c3a9fd9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-64284b868f826506", "level": "error", "message": {"text": "Dangling fetch: POST /api/github/issues/${issueNumber}/state (src/services/githubService.ts:61)"}, "properties": {"repobilityId": "6c0de136502b24f6", "scanner": "scanner-primary", "fingerprint": "64284b868f826506", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-d59082af340c0228", "level": "error", "message": {"text": "Dangling fetch: POST /api/github/issues/${issueNumber}/labels (src/services/githubService.ts:73)"}, "properties": {"repobilityId": "18ecabb7c0dfaaf1", "scanner": "scanner-primary", "fingerprint": "d59082af340c0228", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-14fec06a8d212e98", "level": "error", "message": {"text": "Dangling fetch: POST /api/github/issues (src/services/githubService.ts:85)"}, "properties": {"repobilityId": "32fa6eab7097bdf9", "scanner": "scanner-primary", "fingerprint": "14fec06a8d212e98", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-43784300a7fca041", "level": "error", "message": {"text": "Dangling fetch: GET /api/dashboard/artifacts (src/services/dashboardArtifacts.ts:16)"}, "properties": {"repobilityId": "742f8ceff2461796", "scanner": "scanner-primary", "fingerprint": "43784300a7fca041", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2cad0201af647809", "level": "error", "message": {"text": "Dangling fetch: PUT /api/dashboard/artifacts/financial (src/services/dashboardArtifacts.ts:25)"}, "properties": {"repobilityId": "a70f21419e16c750", "scanner": "scanner-primary", "fingerprint": "2cad0201af647809", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-9632d8a4069f3faf", "level": "error", "message": {"text": "Dangling fetch: PUT /api/dashboard/artifacts/forecast (src/services/dashboardArtifacts.ts:34)"}, "properties": {"repobilityId": "6bee486cb15abc2f", "scanner": "scanner-primary", "fingerprint": "9632d8a4069f3faf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-5eb9698bf4b71c9a", "level": "note", "message": {"text": "Unused endpoint: USE /api/whatsapp"}, "properties": {"repobilityId": "536551377d2e263f", "scanner": "scanner-primary", "fingerprint": "5eb9698bf4b71c9a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-316c43db307befc3", "level": "note", "message": {"text": "Unused endpoint: USE /api/ai"}, "properties": {"repobilityId": "bb075c158242a83f", "scanner": "scanner-primary", "fingerprint": "316c43db307befc3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "42d0ba9796e212a4", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "98fd6948d13a0446", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cbea1ce7cbd02aea", "level": "note", "message": {"text": "Unused endpoint: GET /api/tunnel/url"}, "properties": {"repobilityId": "f10b8906ea2bd4d4", "scanner": "scanner-primary", "fingerprint": "cbea1ce7cbd02aea", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02f4012114aeaebb", "level": "note", "message": {"text": "Unused endpoint: USE /api/dolibarr"}, "properties": {"repobilityId": "5f2098465716b09f", "scanner": "scanner-primary", "fingerprint": "02f4012114aeaebb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-86385740cb7fe5bf", "level": "note", "message": {"text": "Unused endpoint: USE /api/scheduler"}, "properties": {"repobilityId": "c9cc19439ab802fc", "scanner": "scanner-primary", "fingerprint": "86385740cb7fe5bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccd9c54d68b606cd", "level": "note", "message": {"text": "Unused endpoint: USE /api/webhook"}, "properties": {"repobilityId": "fd02ec3d24399449", "scanner": "scanner-primary", "fingerprint": "ccd9c54d68b606cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-14dd5ee54e139c2a", "level": "note", "message": {"text": "Unused endpoint: USE /api/banking"}, "properties": {"repobilityId": "3a40dbffaa54ac34", "scanner": "scanner-primary", "fingerprint": "14dd5ee54e139c2a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2c6aca5279edf5ba", "level": "note", "message": {"text": "Unused endpoint: USE /api/inter"}, "properties": {"repobilityId": "3ec9e7d15721dd68", "scanner": "scanner-primary", "fingerprint": "2c6aca5279edf5ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2ff5ea57c65cc4b1", "level": "note", "message": {"text": "Unused endpoint: USE /api/itau"}, "properties": {"repobilityId": "36a3cf46e181a049", "scanner": "scanner-primary", "fingerprint": "2ff5ea57c65cc4b1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-241fd5d78ee6021b", "level": "note", "message": {"text": "Unused endpoint: USE /api/approvals"}, "properties": {"repobilityId": "1ab031438388bcb2", "scanner": "scanner-primary", "fingerprint": "241fd5d78ee6021b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b90a25f6d5f27707", "level": "note", "message": {"text": "Unused endpoint: USE /api/documents"}, "properties": {"repobilityId": "ebfe0f70b560b5af", "scanner": "scanner-primary", "fingerprint": "b90a25f6d5f27707", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-94ddd00dc84af41d", "level": "note", "message": {"text": "Unused endpoint: USE /api/email"}, "properties": {"repobilityId": "42c1ea2e7ca4c586", "scanner": "scanner-primary", "fingerprint": "94ddd00dc84af41d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc24b6647787716b", "level": "note", "message": {"text": "Unused endpoint: USE /api/centrovibe"}, "properties": {"repobilityId": "cb13abba9ab71faa", "scanner": "scanner-primary", "fingerprint": "bc24b6647787716b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f808b8be41c9a579", "level": "note", "message": {"text": "Unused endpoint: USE /api/integration"}, "properties": {"repobilityId": "15a076792e3cdcd4", "scanner": "scanner-primary", "fingerprint": "f808b8be41c9a579", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c5bd9c31e900f8c2", "level": "note", "message": {"text": "Unused endpoint: USE /api/ui-config"}, "properties": {"repobilityId": "52ce370621a7a4b6", "scanner": "scanner-primary", "fingerprint": "c5bd9c31e900f8c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dbdbc13210e7149b", "level": "note", "message": {"text": "Unused endpoint: USE /api/dashboard"}, "properties": {"repobilityId": "2aa5caca3a9f8b29", "scanner": "scanner-primary", "fingerprint": "dbdbc13210e7149b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6330b0c4a0a152d3", "level": "note", "message": {"text": "Unused endpoint: USE /api/tasks"}, "properties": {"repobilityId": "62708b5456ee1325", "scanner": "scanner-primary", "fingerprint": "6330b0c4a0a152d3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c3a8b7932f72b92f", "level": "note", "message": {"text": "Unused endpoint: USE /api/notifications"}, "properties": {"repobilityId": "397c8adc6583ba26", "scanner": "scanner-primary", "fingerprint": "c3a8b7932f72b92f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9cd7e2cd7bbdef7d", "level": "note", "message": {"text": "Unused endpoint: USE /api/github"}, "properties": {"repobilityId": "29b1aeb3dbd87720", "scanner": "scanner-primary", "fingerprint": "9cd7e2cd7bbdef7d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-618721b912bad1c2", "level": "note", "message": {"text": "Unused endpoint: POST /login"}, "properties": {"repobilityId": "3d3a8da80b8d8851", "scanner": "scanner-primary", "fingerprint": "618721b912bad1c2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99fc36db98c134ce", "level": "note", "message": {"text": "Unused endpoint: POST /logout"}, "properties": {"repobilityId": "c3c27731eb24919d", "scanner": "scanner-primary", "fingerprint": "99fc36db98c134ce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ae38010c60493f1", "level": "note", "message": {"text": "Unused endpoint: POST /webhook"}, "properties": {"repobilityId": "bf1c5c614d6aaa99", "scanner": "scanner-primary", "fingerprint": "0ae38010c60493f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b15d518d538de57d", "level": "note", "message": {"text": "Unused endpoint: GET /sessions"}, "properties": {"repobilityId": "7fd5ab83e4b53f41", "scanner": "scanner-primary", "fingerprint": "b15d518d538de57d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a13a7e97aeacf55f", "level": "note", "message": {"text": "Unused endpoint: POST /start"}, "properties": {"repobilityId": "7fcc0aa933930923", "scanner": "scanner-primary", "fingerprint": "a13a7e97aeacf55f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-05b1ac409816dfd9", "level": "note", "message": {"text": "Unused endpoint: DELETE /sessions/:sessionId"}, "properties": {"repobilityId": "4d0ba68e3a93f0f2", "scanner": "scanner-primary", "fingerprint": "05b1ac409816dfd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f9b362cf2271c88", "level": "note", "message": {"text": "Unused endpoint: GET /check-number/:number"}, "properties": {"repobilityId": "f4f906e88f9942cf", "scanner": "scanner-primary", "fingerprint": "4f9b362cf2271c88", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fb9410fdd9c77e05", "level": "note", "message": {"text": "Unused endpoint: GET /qrcode"}, "properties": {"repobilityId": "03a4e7f0822fcbc5", "scanner": "scanner-primary", "fingerprint": "fb9410fdd9c77e05", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2f222a275ed687b3", "level": "note", "message": {"text": "Unused endpoint: POST /send"}, "properties": {"repobilityId": "c469bb3a88148568", "scanner": "scanner-primary", "fingerprint": "2f222a275ed687b3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-caa443327df3e6ad", "level": "note", "message": {"text": "Unused endpoint: POST /settings/user"}, "properties": {"repobilityId": "5cca3ff1bfbb7426", "scanner": "scanner-primary", "fingerprint": "caa443327df3e6ad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c2bc19fab7aa582b", "level": "note", "message": {"text": "Unused endpoint: POST /settings/session"}, "properties": {"repobilityId": "27abf8ccfc65e0e3", "scanner": "scanner-primary", "fingerprint": "c2bc19fab7aa582b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-838d143e2de180dd", "level": "note", "message": {"text": "Unused endpoint: POST /settings/chat"}, "properties": {"repobilityId": "64e62fdc895b409a", "scanner": "scanner-primary", "fingerprint": "838d143e2de180dd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-06b962a3a8539806", "level": "note", "message": {"text": "Unused endpoint: GET /store"}, "properties": {"repobilityId": "cc61a6a2598e3792", "scanner": "scanner-primary", "fingerprint": "06b962a3a8539806", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c22b85d40880ed34", "level": "note", "message": {"text": "Unused endpoint: GET /settings/session/:sessionId"}, "properties": {"repobilityId": "58076d572a360189", "scanner": "scanner-primary", "fingerprint": "c22b85d40880ed34", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ea59e6723b9d3e8", "level": "note", "message": {"text": "Unused endpoint: GET /settings/chat/:chatId"}, "properties": {"repobilityId": "2be48426006ad88d", "scanner": "scanner-primary", "fingerprint": "1ea59e6723b9d3e8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2595b39638e5c045", "level": "note", "message": {"text": "Unused endpoint: GET /profile"}, "properties": {"repobilityId": "7368327574910a4e", "scanner": "scanner-primary", "fingerprint": "2595b39638e5c045", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e2b2529d89a8e5ed", "level": "note", "message": {"text": "Unused endpoint: POST /profile/picture"}, "properties": {"repobilityId": "1a7ad02bce75a5d6", "scanner": "scanner-primary", "fingerprint": "e2b2529d89a8e5ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f4ab2408fe13f457", "level": "note", "message": {"text": "Unused endpoint: DELETE /profile/picture"}, "properties": {"repobilityId": "6a72f368358d3595", "scanner": "scanner-primary", "fingerprint": "f4ab2408fe13f457", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5648f175441967e7", "level": "note", "message": {"text": "Unused endpoint: POST /profile/name"}, "properties": {"repobilityId": "bb7c642b16d02770", "scanner": "scanner-primary", "fingerprint": "5648f175441967e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd43ba9b593c83f5", "level": "note", "message": {"text": "Unused endpoint: POST /profile/status"}, "properties": {"repobilityId": "b93dabface6619c6", "scanner": "scanner-primary", "fingerprint": "dd43ba9b593c83f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eae38ef9349de428", "level": "note", "message": {"text": "Unused endpoint: POST /profile/presence"}, "properties": {"repobilityId": "080b9096d4537e55", "scanner": "scanner-primary", "fingerprint": "eae38ef9349de428", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3d92828b63824c1", "level": "note", "message": {"text": "Unused endpoint: POST /assign"}, "properties": {"repobilityId": "077d54c299410ed9", "scanner": "scanner-primary", "fingerprint": "e3d92828b63824c1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f0fc82742855439", "level": "note", "message": {"text": "Unused endpoint: GET /conversations"}, "properties": {"repobilityId": "691422a0124beb14", "scanner": "scanner-primary", "fingerprint": "6f0fc82742855439", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8697e9ec96c239c0", "level": "note", "message": {"text": "Unused endpoint: GET /messages/:chatId"}, "properties": {"repobilityId": "6919d13ce4514f03", "scanner": "scanner-primary", "fingerprint": "8697e9ec96c239c0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dbc4d220b51c3839", "level": "note", "message": {"text": "Unused endpoint: GET /messages/:messageId/media"}, "properties": {"repobilityId": "fa9333b4dce44a7b", "scanner": "scanner-primary", "fingerprint": "dbc4d220b51c3839", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-723142cb338ff5dc", "level": "note", "message": {"text": "Unused endpoint: POST /send-file"}, "properties": {"repobilityId": "95be225e467f7d17", "scanner": "scanner-primary", "fingerprint": "723142cb338ff5dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac4bde15380ba034", "level": "note", "message": {"text": "Unused endpoint: POST /send-voice"}, "properties": {"repobilityId": "4330d6bfc8439320", "scanner": "scanner-primary", "fingerprint": "ac4bde15380ba034", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ee50d9514329d245", "level": "note", "message": {"text": "Unused endpoint: POST /send-voice-native"}, "properties": {"repobilityId": "4a386c303b60c0e4", "scanner": "scanner-primary", "fingerprint": "ee50d9514329d245", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5b6eda393c3025c", "level": "note", "message": {"text": "Unused endpoint: GET /boleto/:banco/:nossoNumero/preview"}, "properties": {"repobilityId": "e55515dcce1041a4", "scanner": "scanner-primary", "fingerprint": "a5b6eda393c3025c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}