{"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-d38e329f92ce9145", "name": "Possibly dead Python function: count_lines", "shortDescription": {"text": "Possibly dead Python function: count_lines"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0cae448ee8d5bb39", "name": "File has no detected symbols: .tmp_sabshop_rename2.py", "shortDescription": {"text": "File has no detected symbols: .tmp_sabshop_rename2.py"}, "fullDescription": {"text": "Source file with no class/function declarations \u2014 possible config, dead code, or scratch file."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-391c801aee58109f", "name": "File has no detected symbols: .tmp_sabshop_rename.py", "shortDescription": {"text": "File has no detected symbols: .tmp_sabshop_rename.py"}, "fullDescription": {"text": "Source file with no class/function declarations \u2014 possible config, dead code, or scratch file."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e631120ec223da9", "name": "Stray `console.log` in TS/JS \u2014 worker.js:231", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 worker.js:231"}, "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-214861965aeff64c", "name": "Stray `console.log` in TS/JS \u2014 process_chunk.js:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 process_chunk.js:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d629e665e5d972b4", "name": "Stray `console.log` in TS/JS \u2014 fix_fmtdate.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fix_fmtdate.js:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5f1dc7447c68994", "name": "Stray `console.log` in TS/JS \u2014 dmp-lines.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dmp-lines.js:15"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f1f5da3eacf22d82", "name": "Stray `console.log` in TS/JS \u2014 scaffold_sabsign_pages.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scaffold_sabsign_pages.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-346877f48401487a", "name": "Stray `console.log` in TS/JS \u2014 ddg_test.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 ddg_test.js: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-e3e05c5c05982b0f", "name": "Stray `console.log` in TS/JS \u2014 patch.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 patch.js:12"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8b31ddd13388d41", "name": "Stray `console.log` in TS/JS \u2014 analyze.js:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 analyze.js:57"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec212bd852afaa66", "name": "Stray `console.log` in TS/JS \u2014 patch_cargo.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 patch_cargo.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-9f90f9f0b8e7f645", "name": "Stray `console.log` in TS/JS \u2014 check_client.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check_client.js: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-902c895c10fd2f3a", "name": "`truncate` class without `title=` for hover reveal \u2014 patch3.js:22", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 patch3.js:22"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-645f843ce2375551", "name": "Stray `console.log` in TS/JS \u2014 patch3.js:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 patch3.js:116"}, "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-2f00ff7188f840c0", "name": "Stray `console.log` in TS/JS \u2014 dmp-sidebyside.js:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dmp-sidebyside.js:60"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e7668fac8cd6792", "name": "Stray `console.log` in TS/JS \u2014 patch_sidebar.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 patch_sidebar.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-d225cbf40c883ee6", "name": "Stray `console.log` in TS/JS \u2014 dmp-align.js:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dmp-align.js:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d01a89286d2c7ff", "name": "Stray `console.log` in TS/JS \u2014 patch-inbox.ts:185", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 patch-inbox.ts:185"}, "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-0b87b866ffc9f83b", "name": "Stray `console.log` in TS/JS \u2014 dmp-ui.js:76", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dmp-ui.js:76"}, "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-50f56a29648a5d1f", "name": "Stray `console.log` in TS/JS \u2014 fix_syntax.js:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fix_syntax.js:105"}, "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-8fac432efc7be45b", "name": "Stray `console.log` in TS/JS \u2014 server.js:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.js:29"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ce263b0edec23b1", "name": "Stray `console.log` in TS/JS \u2014 generate_skeletons.js:84", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 generate_skeletons.js:84"}, "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-861b6f47544c128e", "name": "Stray `console.log` in TS/JS \u2014 patch2.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 patch2.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-bebf96e5a7f089aa", "name": "`truncate` class without `title=` for hover reveal \u2014 write_client.js:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 write_client.js:283"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f58d45107918ec30", "name": "Stray `console.log` in TS/JS \u2014 write_client.js:493", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 write_client.js:493"}, "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-be3996bb832a0837", "name": "Stray `console.log` in TS/JS \u2014 get_stopwords.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 get_stopwords.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-953440e289fc07da", "name": "Stray `console.log` in TS/JS \u2014 patch_router.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 patch_router.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-b4ed9255029b8691", "name": "Stray `console.log` in TS/JS \u2014 dmp-test.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 dmp-test.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-c790efb6fef0d310", "name": "Stray `console.log` in TS/JS \u2014 process.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 process.js:19"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9f43aefb555b324a", "name": "Stray `console.log` in TS/JS \u2014 parse-query.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 parse-query.js:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0606d89627d1a50f", "name": "Stray `console.log` in TS/JS \u2014 check_tools.js:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check_tools.js:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e4efe870b2627b7", "name": "Stray `console.log` in TS/JS \u2014 fix_ssr_false.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fix_ssr_false.js: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-d03ecb73aeab13b9", "name": "Stray `console.log` in TS/JS \u2014 check_ts.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check_ts.js:21"}, "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-6ec8a80f428db19e", "name": "Stray `console.log` in TS/JS \u2014 setup_layouts.js:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 setup_layouts.js:80"}, "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-78b1e87b766c7e34", "name": "`truncate` class without `title=` for hover reveal \u2014 scripts/rewrite_file_manager.js:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 scripts/rewrite_file_manager.js:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b6c0ec32780eb22", "name": "Stray `console.log` in TS/JS \u2014 scripts/gen-rust-client.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen-rust-client.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bde7591e5179b06e", "name": "Stray `console.log` in TS/JS \u2014 scripts/clear-old-broadcasts.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clear-old-broadcasts.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a139b03c210739cc", "name": "Stray `console.log` in TS/JS \u2014 scripts/assign-default-plan.mongo.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/assign-default-plan.mongo.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-fca94226735d1ec1", "name": "Stray `console.log` in TS/JS \u2014 scripts/n8n-extract-full.ts:2608", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/n8n-extract-full.ts:2608"}, "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-cfac4c7ea2cd84cc", "name": "Stray `console.log` in TS/JS \u2014 scripts/wachat-index-and-dedup-migration.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wachat-index-and-dedup-migration.js: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-bd586a2513859730", "name": "Stray `console.log` in TS/JS \u2014 scripts/create-indexes.ts:276", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-indexes.ts:276"}, "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-d509274dd80eb07f", "name": "Stray `console.log` in TS/JS \u2014 scripts/sabflow-catalog-audit.ts:560", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabflow-catalog-audit.ts:560"}, "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-1c8c430415b1bf67", "name": "TODO/FIXME marker in shipping code \u2014 scripts/scaffold-forge-block.ts:77", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/scaffold-forge-block.ts:77"}, "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-dbf0f43a56719968", "name": "Stray `console.log` in TS/JS \u2014 scripts/scaffold-forge-block.ts:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scaffold-forge-block.ts:130"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83ee578228c70e57", "name": "Stray `console.log` in TS/JS \u2014 scripts/set-admin-credentials.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/set-admin-credentials.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6dedc672d7d22a8c", "name": "Stray `console.log` in TS/JS \u2014 scripts/hash-admin-password.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/hash-admin-password.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-497caadf2acb4d00", "name": "Stray `console.log` in TS/JS \u2014 scripts/n8n-to-preset.ts:816", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/n8n-to-preset.ts:816"}, "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-4e47dce677c0f426", "name": "Stray `console.log` in TS/JS \u2014 scripts/assign-default-plan.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/assign-default-plan.ts:10"}, "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-db16ee173665e994", "name": "Stray `console.log` in TS/JS \u2014 scripts/email/migrate-conversations-to-threads.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/email/migrate-conversations-to-threads.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3bca8e8e7c22884", "name": "Stray `console.log` in TS/JS \u2014 scripts/wachat/backfill/canned-messages.ts:115", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wachat/backfill/canned-messages.ts:115"}, "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-4d37e541a9b683d3", "name": "Stray `console.log` in TS/JS \u2014 scripts/sabsheet/function-parity.ts:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabsheet/function-parity.ts:167"}, "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-ffd71f9630dae80b", "name": "Stray `console.log` in TS/JS \u2014 scripts/sabsheet/migrate-v2.ts:257", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabsheet/migrate-v2.ts:257"}, "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-18657b751f310dd5", "name": "Stray `console.log` in TS/JS \u2014 scripts/sabflow/n8n-to-rust.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabflow/n8n-to-rust.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-293d860b59f53104", "name": "Stray `console.log` in TS/JS \u2014 scripts/sabflow/create-indexes.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabflow/create-indexes.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7df6d54ff8868ed9", "name": "Stray `console.log` in TS/JS \u2014 scripts/sabbigin/create-indexes.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabbigin/create-indexes.ts:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a0fb0521d63d99f", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrations/2026-05-18-lift-custom-roles-to-crm-roles.ts:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrations/2026-05-18-lift-custom-roles-to-crm-roles.ts:90"}, "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-351ba3c749055a7d", "name": "Stray `console.log` in TS/JS \u2014 workers/broadcast-worker.js:152", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 workers/broadcast-worker.js:152"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ede27fe01f866ed1", "name": "Stray `console.log` in TS/JS \u2014 packages/sabcall-sdk/src/client.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/sabcall-sdk/src/client.ts:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4c6eaf9bb4c0475", "name": "Stray `console.log` in TS/JS \u2014 services/sabflow-ws/src/index.ts:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 services/sabflow-ws/src/index.ts:64"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8f1e002c65c28fe", "name": "Stray `console.log` in TS/JS \u2014 services/sabflow-task-runner/src/index.ts:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 services/sabflow-task-runner/src/index.ts:94"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f409a405e76c17c", "name": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate-ts-sdk.ts:313", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate-ts-sdk.ts:313"}, "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-cb4c3d3b26bef5cf", "name": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/code-samples.ts:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/code-samples.ts:96"}, "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-c01fad7fd53876cd", "name": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate-openapi-paths.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate-openapi-paths.ts:80"}, "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-701d67b33744c70c", "name": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate.ts:41"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c87a5c30d8174956", "name": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/lint.ts:155", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/lint.ts:155"}, "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-8918db992c5a26b3", "name": "`truncate` class without `title=` for hover reveal \u2014 tools/api-codegen/generate-docs.ts:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 tools/api-codegen/generate-docs.ts:161"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-85d1f5a651024f70", "name": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/__tests__/_count.ts:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/__tests__/_count.ts:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-700cfd8e5f3d1dc7", "name": "Stray `console.log` in TS/JS \u2014 public/sabsign-embed.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/sabsign-embed.js:10"}, "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-bd484b7c789f91d6", "name": "Stray `console.log` in TS/JS \u2014 src/worker.js:192", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/worker.js:192"}, "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-0248bf63a0096311", "name": "Stray `console.log` in TS/JS \u2014 src/server.js:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server.js:33"}, "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-2ac83dd1bd1dc3e2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/api-key-create-dialog.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/api-key-create-dialog.tsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f23094d2bfb7fa70", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/webhook-table.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/webhook-table.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e28825cf9d269594", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/webhook-form.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/webhook-form.tsx:174"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4e48747da796627d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/layout/email-context-bar.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/layout/email-context-bar.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c31910ec3af41c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/layout/email-account-switcher.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/layout/email-account-switcher.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fcd2995ffbeb385c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/journey-list.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/journey-list.tsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1bdf714fcd77952", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/journey-detail-client.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/journey-detail-client.tsx:166"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e016d767eb4d0260", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/canvas/node-types.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/canvas/node-types.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33a53e42faf12542", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/templates/transactional/transactional-template", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/templates/transactional/transactional-templates-client.tsx:166"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df16580cd1b2692d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/audience/list-table.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/audience/list-table.tsx:49"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4293ac682532a847", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/deliverability/dns-record-row.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/deliverability/dns-record-row.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e84a7ab14ba573c5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/campaigns/campaigns-client.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/campaigns/campaigns-client.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-897e973ce91d8f1f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/thread-view.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/thread-view.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0c47c19c409b7f1", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/email/inbox/thread-view.tsx:247", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/email/inbox/thread-view.tsx:247"}, "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-f71cbdb63da0bf75", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/conversation-list.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/conversation-list.tsx:179"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b14564dcaab57f2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/reply-composer.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/reply-composer.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8365ad239bc36621", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/overview/activity-feed.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/overview/activity-feed.tsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1eb54eb15512a247", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/overview/account-list.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/overview/account-list.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e62fb927320cca99", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/sidebar-component.tsx:614", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/sidebar-component.tsx:614"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-78719a1215afd42a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:81", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:81"}, "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-08e44a9545d3cf18", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/page-header.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/page-header.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2a967af4a8af06e", "name": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/whatsapp-embedded-signup.tsx:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/whatsapp-embedded-signup.tsx:122"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-399d91433e048f75", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-features-selector.tsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-features-selector.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-783207903128a899", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/share-permissions-modal.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/share-permissions-modal.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b071c5b579a035a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/url-shortener-sidebar.tsx:266", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/url-shortener-sidebar.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-0250d3b34e8e923e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/form-block-renderer.tsx:187", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/form-block-renderer.tsx:187"}, "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-7998781b4d9bf188", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/crm-product-form.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/crm-product-form.tsx:167"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0204bb1864d82599", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-permissions-matrix.tsx:295", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-permissions-matrix.tsx:295"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0a56e79a336397df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/facebook-conversation-list.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/facebook-conversation-list.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-726fc4b9ba86eace", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-module-tile.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-module-tile.tsx:119"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d5ed851e59152db", "name": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/project.actions.ts:532", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/project.actions.ts:532"}, "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-789240ee3a415f0e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/project-switcher.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/project-switcher.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df070e3bd6df6587", "name": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/create-template-form.tsx:222", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/create-template-form.tsx:222"}, "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-d3c80bfdb5deb5d7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-message-input.tsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-message-input.tsx:311"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cbd2404ae82d2a8f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/new-chat-dialog.tsx:89", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/new-chat-dialog.tsx:89"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ba4bd77b0d46737", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/crm-add-client-dialog.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/crm-add-client-dialog.tsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c290ad2b90201c7b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/referrer-table.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/referrer-table.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-90fdd3011afd4b64", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/crm-form-preview.tsx:165", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/crm-form-preview.tsx:165"}, "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-a746f89e9d3c2954", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/project-card.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/project-card.tsx:121"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40e7e7d04f6de079", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/url-collections-sidebar.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/url-collections-sidebar.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8258c9f41418993c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-contact-list.tsx:218", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-contact-list.tsx:218"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-46e1e601415b2f5f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/canned-messages-settings-tab.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/canned-messages-settings-tab.tsx:143"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e54eafe1cbd67266", "name": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/run-cron-jobs-button.tsx:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/run-cron-jobs-button.tsx:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e7698054e306657", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/properties-panel.tsx:56", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/properties-panel.tsx:56"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d41705c626ddb8e6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/qr-code-generator.tsx:820", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/qr-code-generator.tsx:820"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4c69f64197729c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-notification-card.tsx:69", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-notification-card.tsx:69"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ecc20bf48cd9983b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-dashboard-layout.tsx:2990", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-dashboard-layout.tsx:2990"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc693e0b3e2c290e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/comments-notes-panel.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/comments-notes-panel.tsx:226"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7427066969edea58", "name": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/crm-add-account-dialog.tsx:61", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/crm-add-account-dialog.tsx:61"}, "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-00db053fe69cd18e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/embedded-form.tsx:482", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/embedded-form.tsx:482"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9184f4803bd4e9ee", "name": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/embedded-form.tsx:468", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/embedded-form.tsx:468"}, "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-d1656673128440a0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/embedded-form.tsx:381", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/embedded-form.tsx:381"}, "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-e63d2a3850ac4175", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-feature-groups.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-feature-groups.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b5ec41a480464fc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-project-gate.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-project-gate.tsx:254"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a6a06dbe875435e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-sidebar.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-sidebar.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-45ccd3b67a235b3a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo-project-card.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo-project-card.tsx:119"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-07c84a989244b00c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/admin-sidebar-nav.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/admin-sidebar-nav.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-d69232236ec87446", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-message.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-message.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-bc00083d21909edd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-user-card.tsx:45", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-user-card.tsx:45"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef7d8933f653137a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-section-list.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-section-list.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-2c21773e9b7c5579", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/sabchat-conversation-list.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/sabchat-conversation-list.tsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce2f93c5a25cbafa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/saved-qr-codes.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/saved-qr-codes.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b0b06d4d718ebd1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/add-thumbnail-dialog.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/add-thumbnail-dialog.tsx:85"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b8d91981dd7bfd0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-window.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-window.tsx:200"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a44795faf311a777", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/meta-flow-editor/layout/meta-flow-naviga", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/meta-flow-editor/layout/meta-flow-navigator.tsx:129"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-382944d648aff0fd", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/rich-text-block-rendere", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/rich-text-block-renderer.tsx:84"}, "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-68a89a4ff6559ef4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/form-block-renderer.tsx", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/form-block-renderer.tsx:185"}, "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-88dbbe360f67b025", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/block-renderer.tsx:31", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/block-renderer.tsx:31"}, "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-05df2b4f87b9de65", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/page-manager-panel.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/page-manager-panel.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a99852d30d41387", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/crm-form-builder.tsx:190", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/crm-form-builder.tsx:190"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ed03ac688880f3e3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/surface-switcher.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/surface-switcher.tsx:38"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8d83053e8889aa9a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/templates/CarouselBuilder.tsx:327", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/templates/CarouselBuilder.tsx:327"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f280217bc9eeb68c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/meta-data-table.tsx:205", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/meta-data-table.tsx:205"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de3df61b594b57f6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/ad-manager-shell.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/ad-manager-shell.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-dd6169cefe86c4f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/create-wizard/ad-previews.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/create-wizard/ad-previews.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-490a509326119c64", "name": "Custom React Flow node registered without explicit width/height \u2014 src/components/20ui-domain/flow-builder/page.tsx:394", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 src/components/20ui-domain/flow-builder/page.tsx:394"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aade1c21e3c89682", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/flow-builder/properties/send-template-ed", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/flow-builder/properties/send-template-editor.tsx:174"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5801c67e3e7c2aaf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/audit-table.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/audit-table.tsx:90"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-223617175b2da324", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/audit-diff-viewer.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/audit-diff-viewer.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8b199f7fc93bb5d2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/rankings-table.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/rankings-table.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-d2d040c91569f46e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wachat/preview/index.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wachat/preview/index.tsx:78"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d02bf39796b77e90", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/wachat/contacts/ai-duplicate-finder.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wachat/contacts/ai-duplicate-finder.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a898914beec959da", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/files/file-upload.tsx:482", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/files/file-upload.tsx:482"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f8065fa1c6ece74b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/panels/NodePropertiesPanel.tsx:612", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/panels/NodePropertiesPanel.tsx:612"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e1b45dd46c3812ee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNodesList.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNodesList.tsx:179"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26bde41b35f37601", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNodeProperties.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNodeProperties.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c70cb0b63991b43", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNode.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNode.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-daff774e46db2c30", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/triggers/ScheduleTrigger.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/triggers/ScheduleTrigger.tsx:288"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26ddd2acfc8d0a28", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/triggers/WebhookTrigger.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/triggers/WebhookTrigger.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cbcc01cdc26d029b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/logic/SwitchNode.tsx:208", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/logic/SwitchNode.tsx:208"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-924e41087dee4dee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/SetDataNode.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/SetDataNode.tsx:294"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bd71a2e6b0b97a31", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/WhatsAppSendNode.tsx:390", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/WhatsAppSendNode.tsx:390"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-16fe1b49cb50dc89", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/HttpRequestNode.tsx:512", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/HttpRequestNode.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-5f8e147b9dd0361c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/assignment-control.tsx:288", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/assignment-control.tsx:288"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06cbb224b2707a6e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/record-activity.tsx:315", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/record-activity.tsx:315"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1eb86c46d703626", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/sabcrm/sabcrm-suite-frame.tsx", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/sabcrm/sabcrm-suite-frame.tsx:357"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-852e54571e48c9d4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/object-editor.tsx:873", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/object-editor.tsx:873"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df406860f9729af7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/apikey-manager.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/apikey-manager.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-7bdec2ed3d95c4f1", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/sabcrm/command-menu-data.ts:9", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/sabcrm/command-menu-data.ts:91"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f6f5463e774c890", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/activity-composer.tsx:440", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/activity-composer.tsx:440"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c09e44e855ebd9f5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/relation-input.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/relation-input.tsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-72a704f6d3b0233b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/webhook-manager.tsx:567", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/webhook-manager.tsx:567"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-574afd0b25ab62e0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/related-records-panel.tsx:465", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/related-records-panel.tsx:465"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34adae9a9251ccd4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/sabcrm-command.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/sabcrm-command.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-44de81b392bd68f9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/activity-timeline.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/activity-timeline.tsx:277"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71c96acf8f0058df", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/chart.tsx:129", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/chart.tsx:129"}, "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-8d1ea8a92f20bb30", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/tag-picker.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/tag-picker.tsx:185"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c5badae37dd6e05e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/composites/markdown.tsx:24", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/composites/markdown.tsx:24"}, "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-c8218973250451d3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/chart.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/chart.tsx:90"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a03f7ad2afc9fe40", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/action-search-bar.tsx:129", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/action-search-bar.tsx:129"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a836b646dbb10758", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/launchpad.tsx:258", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/launchpad.tsx:258"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0bb606fbaadd671", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/app-sidebar.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/app-sidebar.tsx:254"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d3f18944e971721", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/desktop-canvas.tsx:344", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/desktop-canvas.tsx:344"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-41d58efb56e02a96", "name": "TODO/FIXME marker in shipping code \u2014 src/components/sabcrm/20ui/composites/editor/rich-text.tsx:190", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/sabcrm/20ui/composites/editor/rich-text.tsx:190"}, "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-8ce950083046fb9e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/composites/editor/rich-text.tsx:276", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/composites/editor/rich-text.tsx:276"}, "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-e0dcd555eeb68884", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/dynamic-selector/selector.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/dynamic-selector/selector.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-6a857406af352cdd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sab-ui/sab-button.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sab-ui/sab-button.tsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-148ad45206512cff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/shell.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/shell.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8114dc30f0bff1ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AuditLogTable.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AuditLogTable.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc3f8612dc77a10d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabmail/surface/list-row.tsx:57", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabmail/surface/list-row.tsx:57"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f1e57dbc666fac0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/landing-header.tsx:801", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/landing-header.tsx:801"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cea3b791e7e561bf", "name": "Stray `console.log` in TS/JS \u2014 src/components/builder/editor-layout.tsx:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/builder/editor-layout.tsx:102"}, "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-c26d764c2dfc1c5b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/category-sections.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/category-sections.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc414fd544990002", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/mega-menu.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/mega-menu.tsx:257"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-28f8a05d89bcb363", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/pricing-page.tsx:585", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/pricing-page.tsx:585"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8895cb27c9a62cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/bespoke-extras.tsx:324", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/bespoke-extras.tsx:324"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f625fe73ae6118c5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/sabcall-showcase.tsx:328", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/sabcall-showcase.tsx:328"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-123011a548c1fbf7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/crm-demo.tsx:141", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/crm-demo.tsx:141"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8e4bb664c3ea0443", "name": "Icon-only button without accessible name \u2014 src/components/landing-v2/sections/sabflow-demo.tsx:205", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/landing-v2/sections/sabflow-demo.tsx:205"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e8f5f3e8d174bc5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/sabflow-demo.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/sabflow-demo.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-94384c8648aebd26", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/hero.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/hero.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-470e30f5988a67d0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/heroes/sabchat-hero.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/heroes/sabchat-hero.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0f39d3d9d7c91d5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/heroes/crm-hero.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/heroes/crm-hero.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-c152bcb1431cfcba", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/mockups/index.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/mockups/index.tsx:217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4afb3b85a111ccd4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/hub-kpi-grid.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/hub-kpi-grid.tsx:135"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc580e3ae4b6acd6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/universal-search.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/universal-search.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-981e0d4bf0b1af89", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-list-shell.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-list-shell.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f8284b4c749b861", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/crm-form-drawer.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/crm-form-drawer.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-475a2a0a020eaad1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/SavedViewsBar.tsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/SavedViewsBar.tsx:311"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b1b61cad9afd488", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/assignment-control.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/assignment-control.tsx:222"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a044943a7e0c78f1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/command-palette.tsx:517", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/command-palette.tsx:517"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e06fa1e5c16b9ab5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/crm-lineage-chart.tsx:80", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/crm-lineage-chart.tsx:80"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea9421abd3514081", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-detail-shell.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-detail-shell.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b0edae5132690e4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/keyboard-shortcuts.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/keyboard-shortcuts.tsx:222"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d29c81cad8afa9bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/mention-textarea.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/mention-textarea.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-3d8380e957e76d51", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/BulkImportWizard.tsx:428", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/BulkImportWizard.tsx:428"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-70831092ce758ff3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-picker.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-picker.tsx:257"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-02277c041d148d95", "name": "TODO/FIXME marker in shipping code \u2014 src/components/crm/enum-filter-field.tsx:12", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/crm/enum-filter-field.tsx:12"}, "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-a1c2e7264a866e8e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/lineage-rail.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/lineage-rail.tsx:244"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec175e705a195884", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/live-editor/live-sidebar.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/live-editor/live-sidebar.tsx:254"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aab03dd308718b0f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/crm/live-editor/live-canvas.tsx:62", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/crm/live-editor/live-canvas.tsx:62"}, "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-93608ea85b88d7d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/telegram-flows/FlowCanvas.tsx:360", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/telegram-flows/FlowCanvas.tsx:360"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a59856a265acb66c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/RecentActivityFeed.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/RecentActivityFeed.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-3e8aaad3a47d5ff0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/UpstreamDataPicker.tsx:413", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/UpstreamDataPicker.tsx:413"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-577ce78bd8547774", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/NodeOutputBadge.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/NodeOutputBadge.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aacc782f90331848", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/NodeOutputRow.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/NodeOutputRow.tsx:55"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2601a9886837318b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/marketplace/TemplateCard.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/marketplace/TemplateCard.tsx:111"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6111fa539029fd6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:507", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:507"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2955a416be20f881", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:237"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc7869392bc5082e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/results/ResultsTable.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/results/ResultsTable.tsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0aacaa99919bb5e3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/results/FlowResultsClient.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/results/FlowResultsClient.tsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4e5007812d0d319", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/variables/VariablesPanel.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/variables/VariablesPanel.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-b6ef5978d9fb324a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/ValidationPanel.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/ValidationPanel.tsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8107448ae05d76a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/TriggerEventSettings.tsx:116", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/TriggerEventSettings.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42f060539f8c0563", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/VersionHistoryPanel.tsx:492", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/VersionHistoryPanel.tsx:492"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00662ebe04ef99fd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/BlockSettingsPanel.tsx:275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/BlockSettingsPanel.tsx:275"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aebe6df95e29e1ec", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/DomainsPanel.tsx:210", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/DomainsPanel.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-521d7db803ccf7b1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/VariablesPanel.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/VariablesPanel.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-33523f71039eb002", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/NotificationsPanel.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/NotificationsPanel.tsx:304"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-28f02d3cb3fc6e15", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/AudioBubbleSettings.tsx:23", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/AudioBubbleSettings.tsx:23"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc98b1e541ed6101", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/forge/AppPresetSettings.tsx:23", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/forge/AppPresetSettings.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-f906334d9e3d9cdb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/ExpressionEditor.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/ExpressionEditor.tsx:683"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b87c793852e55604", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/VariableMentionMenu.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/VariableMentionMenu.tsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-937c59db354b55f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/FileUploadInput.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/FileUploadInput.tsx:126"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c2071ab8b44a6ad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/logic/ScriptSettings.tsx:388", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/logic/ScriptSettings.tsx:388"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e647085bba59b4db", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/playback/PlaybackInspector.tsx:512", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/playback/PlaybackInspector.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-a60651919cc7270e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/playback/PlaybackDiff.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/playback/PlaybackDiff.tsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ee74ceacc13382c4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/BlocksSideBar.tsx:511", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/BlocksSideBar.tsx:511"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-575af8650e713d30", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowSettingsPanel.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowSettingsPanel.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-30bceed482e5bac3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowPreviewPanel.tsx:856", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowPreviewPanel.tsx:856"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f038bad016bdb0d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowEditorHeader.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowEditorHeader.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-b6a732eb9d6a83bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/chrome/PresenceAvatarStack.tsx:311", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/chrome/PresenceAvatarStack.tsx:311"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a2deb923df136b13", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/chrome/PresenceSidebar.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/chrome/PresenceSidebar.tsx:157"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-178ed513d6a675aa", "name": "TODO/FIXME marker in shipping code \u2014 src/components/sabflow/editor/chrome/EditorCollabMount.tsx:224", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/sabflow/editor/chrome/EditorCollabMount.tsx:224"}, "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-2dfefe74a6de1842", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/diff/FlowDiffView.tsx:448", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/diff/FlowDiffView.tsx:448"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d293623adae3e43a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/diff/DiffRow.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/diff/DiffRow.tsx:105"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4108becb3046c74d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/canvas/nodeCreator/NodeCreator.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/canvas/nodeCreator/NodeCreator.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b709d191ff0b629", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/StepTimelineItem.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/StepTimelineItem.tsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-42cf9c27dc4bcee9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/VariableDiffItem.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/VariableDiffItem.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-e4079f10204e4383", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/DebugConsolePanel.tsx:442", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/DebugConsolePanel.tsx:442"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20b9c35e2e8f4e5f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/blocks/panels/BlockPropertiesPanel.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/blocks/panels/BlockPropertiesPanel.tsx:82"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e6c0ba754325eac", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/inspector/NodeDataInspector.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/inspector/NodeDataInspector.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-a9abc1443e0f8b0b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/group/GroupNode.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/group/GroupNode.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-837594ad2c2c059e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/block/BlockNodeOverla", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/block/BlockNodeOverlay.tsx:45"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df4483b4073309d7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/block/BlockNodeConten", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/block/BlockNodeContent.tsx:212"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7ecf2bcd721f28e5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/item/ItemNodeContent.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/item/ItemNodeContent.tsx:14"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d7efe743789969d8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow-builder/CustomNode.tsx:23", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow-builder/CustomNode.tsx:23"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e75d2c5e90e8a205", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow-builder/Sidebar.tsx:160", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow-builder/Sidebar.tsx:160"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-82d38af561f107a5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/comms/file-cabinet-button.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/comms/file-cabinet-button.tsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8098aff600df20e7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/onboarding/onboarding-checklist.tsx:200", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/onboarding/onboarding-checklist.tsx:200"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0f9f98d352eb745", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/deals/deal-board.tsx:193", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/deals/deal-board.tsx:193"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c108a27615429ec5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/sab-file-picker.tsx:594", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/sab-file-picker.tsx:594"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-44d2a195b98c699d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-card-collections.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-card-collections.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-e955e485428a9b47", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-upload-card.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-upload-card.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9deda4ccebf71d77", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-picker/picker.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-picker/picker.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-5d5d616571fb74aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-security-panel.tsx:676", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-security-panel.tsx:676"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b1aeefe49d0bcf3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-table.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-table.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4629d8e7d31de302", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-details-panel.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-details-panel.tsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-578ae60e911a0ece", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-grid-card.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-grid-card.tsx:61"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-37376fb52040bf0f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-folder-card.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-folder-card.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a44a5d70d5289c1c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-share-dialog.tsx:247", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-share-dialog.tsx:247"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6ea48b92b5fd4faa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin-panel/sidebar/app-sidebar.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin-panel/sidebar/app-sidebar.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-38e48b45a7e71885", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin-panel/header/admin-header.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin-panel/header/admin-header.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-794cd0b65157a582", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-3d/ModuleSections.tsx:428", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-3d/ModuleSections.tsx:428"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1e0c6bca1678358a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabsms/page-toolkit/sabsms-saved-views.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabsms/page-toolkit/sabsms-saved-views.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-22df0780c89c4f90", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:107", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:107"}, "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-e212b16848eb547a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/page-client.tsx:568", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/page-client.tsx:568"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00f93a9d85b58e05", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/integrations/client.tsx:199", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/integrations/client.tsx:199"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-218e969fb772159d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/settings/_sections.tsx:232", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/settings/_sections.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-7431fcdd6baa45b5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/journeys/_client.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/journeys/_client.tsx:245"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-77ff8d008963dec3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/projects/_client.tsx:183", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/projects/_client.tsx:183"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a4c40b23f3901932", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/community/_client.tsx:292", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/community/_client.tsx:292"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d250c364e6ae4f6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/admin/_sections.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/admin/_sections.tsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80a4d5647de01045", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/cart-recovery/_client.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/cart-recovery/_client.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-55f3ce4e861de79a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/actions/_client.tsx:178", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/actions/_client.tsx:178"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc6f43a1984acb92", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/widget/_components/widget-studio-client.tsx:408", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/widget/_components/widget-studio-client.tsx:408"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c99b50b8ab26b241", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/inbox/_components/inbox-client.tsx:1202", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/inbox/_components/inbox-client.tsx:1202"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64ff5dab5c1180bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/_components/settings-nav-list.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/_components/settings-nav-list.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b216191b6e2d72b1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/_components/sabchat-shell.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/_components/sabchat-shell.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7c2e704cacd4683", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/knowledge/_client.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/knowledge/_client.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-70718792ef07dba3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dl/[shortCode]/components/RedirectScript.tsx:41", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dl/[shortCode]/components/RedirectScript.tsx:41"}, "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-f9592113c2aee010", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/careers/page.tsx:52", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/careers/page.tsx:52"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1b3ca1bab4b985f", "name": "Stray `console.log` in TS/JS \u2014 src/app/logout/route.ts:51", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/logout/route.ts:51"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81b64f5c797248d4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/p/invoice/[token]/_components/PaymentHistory.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/p/invoice/[token]/_components/PaymentHistory.tsx:31"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27bbcffe0f00bc8e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/p/ticket-form/[formId]/_form.tsx:222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/p/ticket-form/[formId]/_form.tsx:222"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e82ee056d8272056", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/page.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/page.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-a8704b001f389bb9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/settings/_client.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/settings/_client.tsx:192"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c9935c03ce025e9f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/payslips/_client.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/payslips/_client.tsx:111"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26b2b061133a9ad7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/org-chart/page.tsx:25", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/org-chart/page.tsx:25"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4aab85931dd54f62", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/employees/_client.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/employees/_client.tsx:143"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c8e20b421eefefe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/departments/_client.tsx:158", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/departments/_client.tsx:158"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dcddce2060c10944", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/goals/_client.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/goals/_client.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-c01268b9d0a2b654", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/analytics/page.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/analytics/page.tsx:66"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5fc233f524ab929", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/projects/_client.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/projects/_client.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a8bde189d31e19bc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/payroll-runs/_client.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/payroll-runs/_client.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-8c154652d3a8dddc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/shifts/_client.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/shifts/_client.tsx:175"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13123d15765d7dc9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/me/_client.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/me/_client.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-143ecfd31617647e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/_components/sabhrm-shell.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/_components/sabhrm-shell.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-8ecad9582553f6ae", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/invite/[token]/invite-client.tsx:357", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/invite/[token]/invite-client.tsx:357"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-625781dcb4a82a19", "name": "TODO/FIXME marker in shipping code \u2014 src/app/invite/[token]/invite-client.tsx:134", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/invite/[token]/invite-client.tsx:134"}, "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-f9e10c3ec6d4eb25", "name": "TODO/FIXME marker in shipping code \u2014 src/app/webinar/[slug]/replay/page.tsx:49", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/webinar/[slug]/replay/page.tsx:49"}, "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-9ef9ae8675c0ede3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/login/page.tsx:15", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/login/page.tsx:15"}, "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-35ef118e9358f1b5", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/push/outlook/route.ts:144", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/push/outlook/route.ts:144"}, "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-f22755da98638856", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/push/outlook/route.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/push/outlook/route.ts:113"}, "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-3c7565a5e6f68dbb", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/push/gmail/route.ts:55", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/push/gmail/route.ts:55"}, "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-e1c48a5980d0cfb8", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/push/gmail/route.ts:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/push/gmail/route.ts:85"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41eacafd6de1920b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/admin-logout/route.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/admin-logout/route.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-0e53f1cc36e751c0", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/logout/route.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/logout/route.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-5cdefc28da8e334c", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/auth/saml/route.ts:18", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/auth/saml/route.ts:18"}, "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-6eac2bc0d674ff5b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/saml/route.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/saml/route.ts:48"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc7b7f0e75b57d54", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/session/route.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/session/route.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8f793af7fab9f4b6", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/v1/flows/[flowId]/run/route.ts:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/v1/flows/[flowId]/run/route.ts:114"}, "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-0a5e2d8da3ea9d40", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/v1/marketplace/usage/route.ts:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/v1/marketplace/usage/route.ts:131"}, "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-f31eb9b6a92ae48a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/[module]/page.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/[module]/page.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1d207efbb2ff420", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/[module]/[endpoint]/page.tsx:113", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/[module]/[endpoint]/page.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-c0532f0ee1f2d313", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/_components/module-directory-client.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/_components/module-directory-client.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-a568d52b0fcdcb16", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/sabcrm/oauth/[provider]/callback/route.ts:128", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/sabcrm/oauth/[provider]/callback/route.ts:128"}, "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-af3d16081fd0bd6b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/database-backup/download/route.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/database-backup/download/route.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-14477c57a50efb43", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/calls/route/route.ts:10", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/calls/route/route.ts:10"}, "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-8e3c25ec76038ff5", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/crm/automations/test-webhook/route.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/crm/automations/test-webhook/route.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-4db122696583fd90", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/url-health/route.ts:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/url-health/route.ts:80"}, "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-7277d7b7aa58f431", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/delete-failed-templates/route.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/delete-failed-templates/route.ts:21"}, "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-08a14269e169b239", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sabmail-rag/route.ts:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sabmail-rag/route.ts:135"}, "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-3e570fc1d36b7387", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/webhook-dispatcher/route.ts:227", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/webhook-dispatcher/route.ts:227"}, "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-85ecf81e4b5d0099", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/msme-45-day-check/route.ts:262", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/msme-45-day-check/route.ts:262"}, "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-0813b87a3246acd7", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/subscriptions-daily/route.ts:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/subscriptions-daily/route.ts:95"}, "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-45feff8b4702caca", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sabflow-executions-retention/route.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sabflow-executions-retention/route.ts:52"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec15835ea87b1dfe", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/link-scheduler/route.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/link-scheduler/route.ts:46"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7494f9ba4a88f00f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/marketplace/submissions/route.ts:195", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/marketplace/submissions/route.ts:195"}, "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-60f4734f49b668f0", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/marketplace/submissions/[id]/review/route.ts:186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/marketplace/submissions/[id]/review/route.ts:186"}, "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-ef47bdbef916c44e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/pin/route.ts:240", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/pin/route.ts:240"}, "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-fc1267c10fd791f0", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/rerun/route.ts:140", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/rerun/route.ts:140"}, "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-e4c0c5d160e4b473", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/export/route.ts:427", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/export/route.ts:427"}, "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-72b0c382cd965779", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/webhook/[id]/route.ts:815", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/webhook/[id]/route.ts:815"}, "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-f80fae98e6cfd4d6", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/[flowId]/export-n8n/route.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/[flowId]/export-n8n/route.ts:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d659f8566f4e47df", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/oauth/callback/route.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/oauth/callback/route.ts:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01fe464643064c7b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/oauth/authorize/route.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/oauth/authorize/route.ts:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-848ecf78e5422403", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/api-keys/route.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/api-keys/route.ts:53"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d880dd763411a2d4", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/api-keys/[keyId]/route.ts:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/api-keys/[keyId]/route.ts:30"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8554b2e9fd435bb8", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/import-n8n/route.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/import-n8n/route.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-6619fd87e6b53a43", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/import-typebot/route.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/import-typebot/route.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-09b164ab851f4c8e", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/credentials/[id]/scopes/route.ts:183", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/credentials/[id]/scopes/route.ts:183"}, "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-3f888d1219c6fb93", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/credentials/[id]/scopes/[scope]/route.ts:157", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/credentials/[id]/scopes/[scope]/route.ts:157"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9971d6fef76309e7", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/razorpay/route.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/razorpay/route.ts:137"}, "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-c04660c445b03e26", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/meta/route.ts:220", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/meta/route.ts:220"}, "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-828c5d3a81d3ae8d", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/email-inbound/route.ts:134", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/email-inbound/route.ts:134"}, "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-fc28080360ce5545", "name": "TODO/FIXME marker in shipping code \u2014 src/app/api/scim/v2/Users/route.ts:35", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/scim/v2/Users/route.ts:35"}, "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-e8112183dde85cac", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/scim/v2/Users/route.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/scim/v2/Users/route.ts:52"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd4bacc00295c146", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:316", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:316"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9fae49bbeb2d3764", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/page.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/page.tsx:132"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80111e82670d535d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/page.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/page.tsx:256"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8734f6ca6b7011f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/inventory/transfers/page.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/inventory/transfers/page.tsx:217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d99f15f199d90a05", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/orders/[orderId]/page.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/orders/[orderId]/page.tsx:264"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-51c038b78903b8e8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/analytics/live/page.tsx:15", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/analytics/live/page.tsx:153"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c396bbff8b8a350", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/customers/reviews/page.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/customers/reviews/page.tsx:231"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60260aad92752ad1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/collections/page.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/collections/page.tsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-80ecc258a2478125", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/products/page.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/products/page.tsx:224"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-236c317c97ed2c44", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/products/new/page.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/products/new/page.tsx:144"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4bc5166d86ee5e22", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/api-keys/page.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/api-keys/page.tsx:307"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a4fbbfc1ca4754f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/security/page.tsx:1275", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/security/page.tsx:1275"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-471b54edd9dca841", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/playground/page.tsx:411", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/playground/page.tsx:411"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c79d8cfe468004c4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/functions/page.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/functions/page.tsx:156"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d591aebcf39a4d1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/import-export/page.tsx:1122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/import-export/page.tsx:1122"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c2c426c8645999a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/pipelines/page.tsx:763", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/pipelines/page.tsx:763"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2f442b2fc851b7f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/audit/page.tsx:349", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/audit/page.tsx:349"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c7a92507bca20a8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/booking/page.tsx:397", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/booking/page.tsx:397"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b9ea05c235da08a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/roles/page.tsx:451", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/roles/page.tsx:451"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-62b3da7ac7b8ad1d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/automations/page.tsx:1222", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/automations/page.tsx:1222"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6736a8c896af4382", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/members/page.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/members/page.tsx:294"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-432d9a6c50f97a75", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/webhooks/page.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/webhooks/page.tsx:249"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2475db69b55413cc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/data-model/data-model-client.tsx:772", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/data-model/data-model-client.tsx:772"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6db379e51db54c5a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/data-model/page.tsx:1147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/data-model/page.tsx:1147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8f805de1a70b942", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/webhooks/page.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/webhooks/page.tsx:243"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fcf02febb52d63a6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/invoices/page.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/invoices/page.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-1f1654aa3388f118", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/settings/webhooks/page.client.tsx:2", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/settings/webhooks/page.client.tsx:219"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-529e326528cc513e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/components/UrlShortenerForm.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/components/UrlShortenerForm.tsx:91"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a10f3db3bc857f6e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/[id]/components/short-url-header.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/[id]/components/short-url-header.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-877a82b558758b72", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/collections/page.client.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/collections/page.client.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-d878255f3c32e07e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/bio/_components/BioPreview.tsx:75", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/bio/_components/BioPreview.tsx:75"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-adb1e2f129ea9f66", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/page.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/page.tsx:162"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa1eda634e8ce388", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/checks/page.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/checks/page.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-a478581989607cd4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/status-pages/page.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/status-pages/page.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-45acf0424225c8d6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/page.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/page.tsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-412099f6d9175d5e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/[deckId]/present/_present-view.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/[deckId]/present/_present-view.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe3600d469d38dc7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/[deckId]/history/page.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/[deckId]/history/page.tsx:96"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a9dcb6d980930a29", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/locations/[locationId]/_components/cit", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/locations/[locationId]/_components/citations-tab.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-788f840472192d33", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/locations/_components/locations-list-c", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/locations/_components/locations-list-client.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-1f699dae35e4c587", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/_components/overview-client.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/_components/overview-client.tsx:240"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a27cb3974c7a4774", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/page.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/page.tsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f4612289fd73ee46", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/api-keys-tab.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/api-keys-tab.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61699cfc1d743d69", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/domains-tab.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/domains-tab.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7872d2f85b056750", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/functions-tab", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/functions-tab.tsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e33b3d14d3b826f6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/file-store-ta", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/file-store-tab.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3adeeab5aafd744", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/auth-tab.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/auth-tab.tsx:83"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-70d900fde423a684", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/[baseId]/[tableId]/automa", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/[baseId]/[tableId]/automations/_components/automations-builder-client.tsx:210"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3bb8ea34d741fc6e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/[baseId]/[tableId]/_compo", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/[baseId]/[tableId]/_components/table-view-client.tsx:546"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9a3f4ff43eaf2c56", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/_components/bases-list-cl", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/_components/bases-list-client.tsx:156"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-df0c92890265e619", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/_components/workspaces-list-client.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/_components/workspaces-list-client.tsx:149"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-723a2b3e4010a4aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketplace/installed/page.tsx:263", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketplace/installed/page.tsx:263"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc03f0953096295b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/sessions/page.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/sessions/page.tsx:132"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21c26be0d536ecaa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/plans/plans-client.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/plans/plans-client.tsx:217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8f1757ced6532fb1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/_components/sabcheckout-pages-list-cl", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/_components/sabcheckout-pages-list-client.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4db75cc08eec32c2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sablens/devices/page.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sablens/devices/page.tsx:123"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-194462adfb187102", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/api/webhooks/_WebhooksClient.tsx:207", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/api/webhooks/_WebhooksClient.tsx:207"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a340fa80c9b31293", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/page.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/page.tsx:151"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b66e7dcf892b7c56", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/settings/page.tsx:431", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/settings/page.tsx:431"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b7063a0fdd00657", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/page-roles/page.tsx:98", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/page-roles/page.tsx:98"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-714a91e81f0f6f48", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/posts/page.tsx:260", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/posts/page.tsx:260"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a1419a54601ceee", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/media/page.tsx:175", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/media/page.tsx:175"}, "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-05c46a1d4d3502b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/scheduled/page.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/scheduled/page.tsx:236"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-92de05faf3c6f073", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/page.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/page.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-ef630a8d43e4f582", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/orders/", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/orders/page.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-9ccbee67fd16d44b", "name": "Custom React Flow node registered without explicit width/height \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[sh", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/flow-builder/page.tsx:1484"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35bbbf6732db0917", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/appeara", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/appearance/page.tsx:306"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b9cf1f61cee94b2f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/appearance/page.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/appearance/page.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4e774a4c82ce211", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/custom-ecommerce/appearance/page.tsx:84", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/custom-ecommerce/appearance/page.tsx:84"}, "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-878c812c99c64616", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/all/projects/page.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/all/projects/page.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-675c39bdd67abc6a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/live-studio/page.tsx:331", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/live-studio/page.tsx:331"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c8bcf57903ed1898", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/pages/page.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/pages/page.tsx:261"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f91f255f39183d4b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/studio/page.tsx:652", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/studio/page.tsx:652"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-22434a86da0ea419", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/setup/page.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/setup/page.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-6b2beb978a841dad", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/create-post/page.tsx:419", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/create-post/page.tsx:419"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd22ad7add96979c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/inbox/page.tsx:468", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/inbox/page.tsx:468"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4dee8291d7a2a1df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/_components/ui20-facebook-kanban-board.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/_components/ui20-facebook-kanban-board.tsx:183"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c9153b6e4aaf1200", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/_components/ui20-facebook-kanban-board.tsx:257", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/_components/ui20-facebook-kanban-board.tsx:257"}, "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-ab7cdb940db376c7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/_components/ui20-fb-chat-client.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/_components/ui20-fb-chat-client.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-09ebc108abc3e3d1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/calendar/page.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/calendar/page.tsx:147"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bff11f7be1e9cec7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/all-projects/page.tsx:154", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/all-projects/page.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-2db2a793df644864", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/analytics/page.tsx:670", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/analytics/page.tsx:670"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b22bf5839e01e21", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/projects/page.client.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/projects/page.client.tsx:95"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be75955a7d92a357", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/commands/page.tsx:1580", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/commands/page.tsx:1580"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-26b1c02728cfe160", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/business-inbox/page.tsx:771", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/business-inbox/page.tsx:771"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e54a1074b6410dd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/ads/page.tsx:729", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/ads/page.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-64801d961f890f4d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/chat/page.tsx:279", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/chat/page.tsx:279"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b060e50dbd12e40", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/set-detail-drawer.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/set-detail-drawer.tsx:413"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99b6fd041ac59272", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/create-pack-drawer.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/create-pack-drawer.tsx:442"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-29e31fdb2605c608", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/sets-grid.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/sets-grid.tsx:163"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f5eda11ace7d228e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/payments/page.client.tsx:822", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/payments/page.client.tsx:822"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e4a884db1dd829ff", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/payments/_components/payments.tsx:355", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/payments/_components/payments.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-b601981857ad0143", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/contacts/page.tsx:1131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/contacts/page.tsx:1131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b4f4d804166e78ab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/channels/page.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/channels/page.tsx:121"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-094be3a7009c44d0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/channels/[channelId]/page.tsx:1114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/channels/[channelId]/page.tsx:1114"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c43de9bf41134557", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/broadcasts/page.tsx:1576", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/broadcasts/page.tsx:1576"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8ac69c5d5f39fa58", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/bots/page.tsx:115", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/bots/page.tsx:115"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-14bd159a6324febf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/bots/bot-detail-drawer.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/bots/bot-detail-drawer.tsx:138"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a1cad050382f6950", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/connections/page.tsx:330", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/connections/page.tsx:330"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a2f5a871c6017bc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/auto-reply/_components/rule-table-row.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/auto-reply/_components/rule-table-row.tsx:102"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a13f532f33fded43", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/sprints/[sprintId]/plan/_c", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/sprints/[sprintId]/plan/_components/sprint-plan-board.tsx:217"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-62c3bae93f51ff8a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/backlog/_components/backlo", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/backlog/_components/backlog-board.tsx:285"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d347646638df5ccd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/epics/_components/epics-bo", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/epics/_components/epics-board.tsx:249"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ecb9233f862201d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/org-switcher/client.tsx:153", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/org-switcher/client.tsx:153"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9a68fb13a3ec82e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/global-search/global-search-client.tsx:1", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/global-search/global-search-client.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c06d5b9f838168cd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/webhooks/webhooks-client.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/webhooks/webhooks-client.tsx:185"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34ce671157ab12c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/page.tsx:309", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/page.tsx:309"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b40eb984535ccf5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/tasks/page.tsx:503", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/tasks/page.tsx:503"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b8bd6f6662f54bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/page.tsx:511", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/page.tsx:511"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc9035c05b198c92", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/_components/pinned-strip.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/_components/pinned-strip.tsx:46"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-50e5d81d41f4dee7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/_components/composer-extras.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/_components/composer-extras.tsx:86"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4bc8317b80d48a6c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/manage-users/page.tsx:673", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/manage-users/page.tsx:673"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3a4f781e838ecd2c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/invites/page.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/invites/page.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b0a84394bcfda4f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/wachat/page.client.tsx:282", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/wachat/page.client.tsx:282"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8217ecf5494b8673", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/wachat/contacts/page.client.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/wachat/contacts/page.client.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4621659f96cccff8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/finance/page.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/finance/page.tsx:174"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4b468cc08c1df12d", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/budgets/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/budgets/types.ts:5"}, "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-d62d1228df2d232f", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/inventory/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/inventory/types.ts:5"}, "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-b48e4c64c30bd3bd", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/payouts/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/payouts/types.ts:5"}, "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-fad15dda83f9614f", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/po-approvals/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/po-approvals/types.ts:5"}, "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-14ed67a285bbb5bc", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/taxes/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/taxes/types.ts:5"}, "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-0f626fe785baea35", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/assets/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/assets/types.ts:5"}, "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-2c54b2a4c25022b9", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/vendor-portal/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/vendor-portal/types.ts:5"}, "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-35b96c51a7ba61b5", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/gl/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/gl/types.ts:5"}, "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-b2a3679cc0908675", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/bank-reconciliation/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/bank-reconciliation/types.ts:5"}, "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-46683b6fb0ec7f14", "name": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/subscriptions/types.ts:5", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/subscriptions/types.ts:5"}, "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-cf3ec5714604dade", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/sabsheet/[workbookId]/print/_print-view.tsx:141", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/sabsheet/[workbookId]/print/_print-view.tsx:141"}, "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-57f7e9e9817af932", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketing/universal-inbox/_universal-inbox-client", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketing/universal-inbox/_universal-inbox-client.tsx:120"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76c32b544ead9ca8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketing/social-media-scheduler/_social-media-sc", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketing/social-media-scheduler/_social-media-scheduler-client.tsx:382"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9af2c1b43d66bfc7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/pages/[pageId]/_compon", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/pages/[pageId]/_components/page-designer-client.tsx:250"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d3b70381d5ade5c9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/_components/builder-sh", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/_components/builder-shell-client.tsx:327"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-126c77f01ac035f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/forms/[formId]/_compon", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/forms/[formId]/_components/form-designer-client.tsx:267"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c1ef5aecb00c07cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/_components/apps-list-client.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/_components/apps-list-client.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-1142524dbc01b67a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabprep/_components/recipe-list-client.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabprep/_components/recipe-list-client.tsx:162"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b8809e4cb0c0f9b5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmail/crm-email/components/EmailClient.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmail/crm-email/components/EmailClient.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-652c0f147032d178", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/whatsapp/ads/page.client.tsx:602", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/whatsapp/ads/page.client.tsx:602"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d271cf548d73d668", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/page.tsx:312", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/page.tsx:312"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b200c2493ae7feb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/budget-optimizer/page.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/budget-optimizer/page.tsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3ed835c702b3eceb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/ad-previews/page.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/ad-previews/page.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ec7947e33fb8b14f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/creative-library/page.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/creative-library/page.tsx:163"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f57a3810b6c03ae8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/ad-accounts/page.tsx:196", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/ad-accounts/page.tsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a3f97e19486259b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/create/page.tsx:499", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/create/page.tsx:499"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ae805bbb42fcc23a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/lead-forms/lead-forms-client.tsx:475", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/lead-forms/lead-forms-client.tsx:475"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9b5bfba906b1909", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/campaigns/page.tsx:515", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/campaigns/page.tsx:515"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5159b56b6ae99dfa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/audiences/page.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/audiences/page.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0783fb35270fe446", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/pixels/page.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/pixels/page.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-610298856a85ebe6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/compare/page.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/compare/page.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-30f1764d08becfa3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/datasets/_components/new-dataset-panel.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/datasets/_components/new-dataset-panel.tsx:116"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-00e774278bdc539b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/new/error.tsx:31", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/new/error.tsx:31"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e9cfb426548180d8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/[id]/public/error.tsx:29", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/[id]/public/error.tsx:29"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0e234f9c62943dc5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/_components/widget-renderer.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/_components/widget-renderer.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-fd2d647cb4e21b2e", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/sabbi/reports/invoice-aging/page.tsx:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/sabbi/reports/invoice-aging/page.tsx:131"}, "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-2cd39431da0c91df", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/expense/page.tsx:203", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/expense/page.tsx:203"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b1442a47f7708fc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/leave-report/page.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/leave-report/page.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f47f8d15a23344e2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/profit-loss/page.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/profit-loss/page.tsx:189"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fa4f83a1e617d30", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/reports-hub-client.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/reports-hub-client.tsx:256"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dbbce4f84e4dde55", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/report-toolbar.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/report-toolbar.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7e500ba0df51cd78", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/gantt-chart-preview.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/gantt-chart-preview.tsx:51"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-252619db5d65a7c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/xray/[modelId]/xray-view.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/xray/[modelId]/xray-view.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-d4038a505d670f6a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/boards/[id]/board-view.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/boards/[id]/board-view.tsx:104"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d28f97c3ae7ee422", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/usage/_components/usage-client.tsx:342", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/usage/_components/usage-client.tsx:342"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bb5963bdffc815fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/executions/_components/execution-replay-c", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:311"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4380d6db4df9c52c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/executions/_components/executions-list-cl", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/executions/_components/executions-list-client.tsx:223"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cd138b907a039422", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/workspaces/_components/workspaces-client.", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/workspaces/_components/workspaces-client.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-ebdd001241d64365", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/[flowId]/webhooks/_components/webhooks-cl", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/[flowId]/webhooks/_components/webhooks-client.tsx:196"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fc758f44298275a6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/audit/_components/audit-client.tsx:458", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/audit/_components/audit-client.tsx:458"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-56ca00a3b147d898", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:420"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e6bcc5fb2457f836", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/links/page.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/links/page.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-13ea326ba4133400", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/flow-builder/page.tsx:343", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/flow-builder/page.tsx:343"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6f9cbc3c59b75b6c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:252"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-14e1f08ead9b19e1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/_components/templates-sheet.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/_components/templates-sheet.tsx:284"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c7c841bc515ba1f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/connections/_components/connections-clien", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/connections/_components/connections-client.tsx:679"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e45653bcb57722a5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/invites/_components/invites-client.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/invites/_components/invites-client.tsx:309"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fb3d4dc62a2423da", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/page.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/page.tsx:166"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-65decd59b5a84b67", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/settings/page.client.tsx:201", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/settings/page.client.tsx:201"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0d26711c102be4dd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/profile/page.client.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/profile/page.client.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-7cb747ed1fab3f99", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/profile/components/OnboardingDetailsCard.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/profile/components/OnboardingDetailsCard.tsx:18"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a06980644975fa00", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/page.tsx:575", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/page.tsx:575"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54fbeec2e24ee8aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/settings/brand-kit/page.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/settings/brand-kit/page.tsx:237"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc2d4ae9e2c35337", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/campaigns/page.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/campaigns/page.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-a297614f057173f3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabrequests/new/new-request-client.tsx:277", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabrequests/new/new-request-client.tsx:277"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e7c0b29f3813609f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/page.tsx:214", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/page.tsx:214"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ef3bf919f9831c38", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/pipelines/[pipelineId]/page.tsx:192", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/pipelines/[pipelineId]/page.tsx:192"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9f76800590de3d8a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/activities/_components/activities-client", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/activities/_components/activities-client.tsx:461"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d44c480ccbd516ab", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/contacts/page.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/contacts/page.tsx:109"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8751c18ca92a8375", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/contacts/[contactId]/_components/contact", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/contacts/[contactId]/_components/contact-detail-client.tsx:346"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a79a005a98071643", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/products/_components/products-client.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/products/_components/products-client.tsx:148"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c4f59ff551ba61d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/deals/[dealId]/_components/deal-detail-c", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/deals/[dealId]/_components/deal-detail-client.tsx:456"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b861a0b9f0d7a3bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/companies/page.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/companies/page.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68dd98bfec082eee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/companies/[companyId]/_components/compan", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/companies/[companyId]/_components/company-detail-client.tsx:474"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cb2e36396b3b7179", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabfiles/_components/file-manager.tsx:171", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabfiles/_components/file-manager.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-997b8e47b2a8a277", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/messages/page.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/messages/page.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20659b2008db23d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/setup/page.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/setup/page.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa53ea2ef0ce02fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/connections/ConnectionsClient.tsx:305", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/connections/ConnectionsClient.tsx:305"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e16cd4625cc786e9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/page.tsx:162", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/page.tsx:162"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d7382b10f90a155", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/clients/[clientId]/page.tsx:228", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/clients/[clientId]/page.tsx:228"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-311dee5c03c66a00", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/clients/[clientId]/_components/client", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/clients/[clientId]/_components/client-doc-request-binder.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-7444d6f580fc431c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/_components/shared.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/_components/shared.tsx:96"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-54e4918ec3ff4a97", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/_components/SidebarCards.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/_components/SidebarCards.tsx:111"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-309b981ddf11707c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/[projectId]/pseo/_components/pseo-client.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/[projectId]/pseo/_components/pseo-client.tsx:314"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4fea862c6a28d045", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/site-explorer/_components/site-explorer-clien", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/site-explorer/_components/site-explorer-client.tsx:236"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b31294c09fb1ac20", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/meta-tag-generator/page.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/meta-tag-generator/page.tsx:111"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f556e6e785c58dd", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/seo/tools/keyword-trends/test.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/seo/tools/keyword-trends/test.js:8"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bf5c6aadb44bab8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/meta-tag-analyzer/page.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/meta-tag-analyzer/page.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-261937ed365ffd16", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/og-tag-generator/page.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/og-tag-generator/page.tsx:135"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5cb138b8870a2fc2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/markdown-to-html/page.tsx:124", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/markdown-to-html/page.tsx:124"}, "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-89065c5634b05a8c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/hash-generator/page.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/hash-generator/page.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31091befe4089b02", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/twitter-card-generator/page.tsx:269", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/twitter-card-generator/page.tsx:269"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1969508cf2db6a63", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/anchor-text-analyzer/page.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/anchor-text-analyzer/page.tsx:156"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8edb4c2a574378fc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/url-rewriter/page.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/url-rewriter/page.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-c13fc61b5b18c00d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/json-formatter/page.tsx:70", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/json-formatter/page.tsx:70"}, "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-6640373d39609d90", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/open-graph-generator/page.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/open-graph-generator/page.tsx:133"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-280d8d16588c3314", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/page-speed/page.tsx:184", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/page-speed/page.tsx:184"}, "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-235dd9428f4f6cbb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/keyword-rank-checker/page.tsx:101", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/keyword-rank-checker/page.tsx:101"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c24f96e85fd8e64", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/domain-authority/page.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/domain-authority/page.tsx:165"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7703025dc8eca04", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/broken-link-checker/page.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/broken-link-checker/page.tsx:180"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9d7ac4e4739056a7", "name": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/seo/tools/js-minifier/test-terser.js:3", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/seo/tools/js-minifier/test-terser.js:3"}, "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-e7a1b2e0cf20e582", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/s/[shortCode]/page.tsx:170", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/s/[shortCode]/page.tsx:170"}, "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-3200a7fcf4983f4c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/page.tsx:165", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/page.tsx:165"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8cfe339dcb91972b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/settings/canned/page.tsx:588", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/settings/canned/page.tsx:588"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-426895cc188ce83d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/automation/page.tsx:547", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/automation/page.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-683dc8f1d2522729", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/flows/create/page.tsx:623", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/flows/create/page.tsx:623"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-12970707cf5e5fa2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/health/page.tsx:480", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/health/page.tsx:480"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-11790b6ffb54e7b4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/conversation-kanban/page.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/conversation-kanban/page.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4c3dba5a3d97437a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/catalog/page.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/catalog/page.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-22fc680f92c7c249", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/whatsapp-ads/page.tsx:663", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/whatsapp-ads/page.tsx:663"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-46826b4150b2820e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/opt-out/page.tsx:477", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/opt-out/page.tsx:477"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c63f2b749863f2fa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/templates/page.tsx:548", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/templates/page.tsx:548"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8c406177832faa63", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/assignments/page.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/assignments/page.tsx:189"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-40fb7ad4cf11f5c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/response-time-tracker/page.tsx:587", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/response-time-tracker/page.tsx:587"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d912f5d54813c81a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/calls/settings/page.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/calls/settings/page.tsx:211"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9167ee30bd6e9592", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/numbers/page.tsx:349", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/numbers/page.tsx:349"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d943cb6073e4e78a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcast-scheduler/page.tsx:477", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcast-scheduler/page.tsx:477"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-446320080e4be065", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/qr-codes/page.tsx:422", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/qr-codes/page.tsx:422"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34766bbb4a6c233e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/contact-groups/page.tsx:213", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/contact-groups/page.tsx:213"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b5a4ede13da5df08", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/contacts/page.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/contacts/page.tsx:148"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4a09736f283ad15", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/saved-replies/page.tsx:231", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/saved-replies/page.tsx:231"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-19704a2479cec02b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/link-tracking/page.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/link-tracking/page.tsx:206"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2067183ca32b2bbd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcasts/page.tsx:653", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcasts/page.tsx:653"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8afb75ebe2ba55c0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/conversation-summary/page.tsx:252", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/conversation-summary/page.tsx:252"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-859a5543d0d24d3d", "name": "Stray `console.log` in TS/JS \u2014 src/app/wachat/webhooks/page.tsx:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/wachat/webhooks/page.tsx:77"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc6ba3c409eec588", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/ui20-chat-client.tsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/ui20-chat-client.tsx:272"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dd6e9f00e4ceaab5", "name": "TODO/FIXME marker in shipping code \u2014 src/app/wachat/_components/create-template-form.tsx:303", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/wachat/_components/create-template-form.tsx:303"}, "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-3c2abbe4d51e4263", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/scheduler-view.tsx:463", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/scheduler-view.tsx:463"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-888c75a80853a0e1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/ui20-kanban-board.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/ui20-kanban-board.tsx:224"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6b3aca4863e6acf5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/broadcast-form.tsx:693", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/broadcast-form.tsx:693"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-065fbf881ea383d0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-window.tsx:211", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-window.tsx:211"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-defb147ccbafe722", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-message.tsx:172", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-message.tsx:172"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3cc397287b71e722", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-message-input.tsx:358", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-message-input.tsx:358"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fead5375747e0b08", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/overview/page.tsx:595", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/overview/page.tsx:595"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-99225741f07c3376", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcast-cron/page.tsx:515", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcast-cron/page.tsx:515"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be14aca964edd715", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/scheduled-messages/page.tsx:382", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/scheduled-messages/page.tsx:382"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-460b84ed4c7e6917", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabcrm/tasks/page.tsx:680", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabcrm/tasks/page.tsx:680"}, "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-f621bab81bde276c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/leaderboard/leaderboard-client.tsx:307", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/leaderboard/leaderboard-client.tsx:307"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b496f06e5d9e833", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/sabcrm/[objectSlug]/[recordId]/_comments/comments-panel.ts", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/sabcrm/[objectSlug]/[recordId]/_comments/comments-panel.tsx:207"}, "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-a5a6e576585dde7c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/copilot/copilot-client.tsx:73", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/copilot/copilot-client.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-7ff96b576b6cc542", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/inbox/inbox-client.tsx:256", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/inbox/inbox-client.tsx:256"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce4753a29d420808", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/employees/[id]/employee-detail-client.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/employees/[id]/employee-detail-client.tsx:276"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7c6e1adb9cad8570", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/attendance/attendance-client.tsx:318", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/attendance/attendance-client.tsx:318"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-69e2013ba901c6b9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/leave/leave-client.tsx:554", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/leave/leave-client.tsx:554"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f9344db8af5f29aa", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/r/[shortCode]/page.tsx:119", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/r/[shortCode]/page.tsx:119"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5e7da1e210df7bc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/embed/sabbi/board/[token]/public-board.tsx:33", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/embed/sabbi/board/[token]/public-board.tsx:33"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cc5c5127489c6cb5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/dashboard/page.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/dashboard/page.tsx:131"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5c54087bf50ef2fb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/dashboard/marketplace/queue/_components/SubmissionQue", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:387"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e983c748ab73dd98", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/page.tsx:415", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/page.tsx:415"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-79eaeae114a504a3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/relationships/page.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/relationships/page.tsx:176"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b67daa0a96472c16", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/projects/_client.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/projects/_client.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-b8a6a3bc60c30675", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/conversations/page.tsx:134", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/conversations/page.tsx:134"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d72def67a95b6d2f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/ivr/page.tsx:584", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/ivr/page.tsx:584"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fcb8ef16d2b37585", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/secrets/page.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/secrets/page.tsx:156"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-165f646dc7ba64b8", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/agent-dashboard/page.tsx:152", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/agent-dashboard/page.tsx:152"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d6555ae9fab1a6ec", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/contacts/page.tsx:704", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/contacts/page.tsx:704"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-94b071a44752220e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/agent-console/page.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/agent-console/page.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20f8f9a4bac6c0d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/_components/command-palette.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/_components/command-palette.tsx:240"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2d730c968957afd0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/_components/sabcall-shell.tsx:79", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/_components/sabcall-shell.tsx:79"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b2a8f0182f5a243", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/security/_client.tsx:148", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/security/_client.tsx:148"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-abe4cffbf87e03ef", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/ai/_client.tsx:304", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/ai/_client.tsx:304"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bcda3cb0043b8cde", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/rules/_client.tsx:294", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/rules/_client.tsx:294"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1b60e0050d00d0bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/projects/_client.tsx:187", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/projects/_client.tsx:187"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe3ffccd58df0638", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/autopilot/_client.tsx:346", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/autopilot/_client.tsx:346"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-76a4312ac6bd0a2e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/team/_client.tsx:365", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/team/_client.tsx:365"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91a39d9ce1e7bc61", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/templates/_client.tsx:302", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/templates/_client.tsx:302"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d4aa5c0d150f344e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/mailboxes/_client.tsx:500", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/mailboxes/_client.tsx:500"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5d09a7cdf8b813c1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/campaigns/_client.tsx:698", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/campaigns/_client.tsx:698"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-338b724cb2ffd1cb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/contacts/_client.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/contacts/_client.tsx:296"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f1a92fff8f750441", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/_client.tsx:233", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/_client.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-96c12164cd63cd7a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/[id]/_client.tsx:430", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/[id]/_client.tsx:430"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13aa199d49f7ef80", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/[id]/runs/_client.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/[id]/runs/_client.tsx:135"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-134e1171cb851b78", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/setup/_client.tsx:325", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/setup/_client.tsx:325"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98002841db4013ee", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/unified/_components/unified-inbox-client.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/unified/_components/unified-inbox-client.tsx:285"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-544202d89c6a2557", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/segments/_client.tsx:230", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/segments/_client.tsx:230"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03e14e5dd98c5572", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/inbox/_components/inbox-client.tsx:776", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/inbox/_components/inbox-client.tsx:776"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b448bad709f47cca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/inbox/_components/compose-modal.tsx:406", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/inbox/_components/compose-modal.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-b459535fa64ecca3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/recipient-chips.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/recipient-chips.tsx:70"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-91dbe4e003b222aa", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/sabmail-shell.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/sabmail-shell.tsx:110"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f82b6d0c1fa143f7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/default-mailbox-claim.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/default-mailbox-claim.tsx:120"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a1363704031d09d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/forms/_client.tsx:168", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/forms/_client.tsx:168"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fe64258bfeb61462", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/domains/_client.tsx:309", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/domains/_client.tsx:309"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ccaf09b940c16cf5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabadmin/mail-domains/_client.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabadmin/mail-domains/_client.tsx:197"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dab973d1ed51e911", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabpay/onboarding/_client.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabpay/onboarding/_client.tsx:274"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5b30c23f6abe2723", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/page.tsx:416", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/page.tsx:416"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7394a4d7ea62b3d9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/[id]/page.tsx:446", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/[id]/page.tsx:446"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c382b55872413ebe", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/templates/page.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/templates/page.tsx:303"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2605f857b9ea18eb", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/form-builder/page.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/form-builder/page.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-451bc474a3f74473", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/_components/sabsign-shell.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/_components/sabsign-shell.tsx:68"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e0f1e9cab16eeb7f", "name": "TODO/FIXME marker in shipping code \u2014 src/app/lens/[token]/_components/customer-lens-client.tsx:63", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/lens/[token]/_components/customer-lens-client.tsx:63"}, "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-6773b05139d3b854", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/portal/client/knowledge-base/[id]/page.tsx:53", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/portal/client/knowledge-base/[id]/page.tsx:53"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-855fcd8bf09bd89e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/client/_components/ClientOverviewContent.tsx:331", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/client/_components/ClientOverviewContent.tsx:331"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6a1f9fe69097619b", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/present/[publishSlug]/page.tsx:52", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/present/[publishSlug]/page.tsx:52"}, "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-ed628e29a9061599", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/layout.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/layout.tsx:103"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-603cd62b60bb70a3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/gantt/[hash]/_components/public-gantt-chart.tsx:290", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/gantt/[hash]/_components/public-gantt-chart.tsx:290"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a5b9b1af91a68ac2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/share/contract/[hash]/page.tsx:56", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/share/contract/[hash]/page.tsx:56"}, "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-63e8709b8f1440c2", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/taskboard/[hash]/TaskboardClient.tsx:135", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/taskboard/[hash]/TaskboardClient.tsx:135"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-35b1b468950085e2", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/share/proposal/[hash]/page.tsx:72", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/share/proposal/[hash]/page.tsx:72"}, "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-f801264441717287", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/[token]/share-landing.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/[token]/share-landing.tsx:237"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1165e2d03068f878", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabrequests.actions.ts:450", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabrequests.actions.ts:450"}, "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-a120f3e8b4573ebb", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabmeet.actions.ts:119", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabmeet.actions.ts:119"}, "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-2045efb1be567393", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-accounts.actions.ts:805", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-accounts.actions.ts:805"}, "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-8ce7f869e1bd160d", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/whatsapp.actions.ts:100", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/whatsapp.actions.ts:100"}, "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-22df49794ff32624", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/team.actions.ts:300", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/team.actions.ts:300"}, "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-d05be26daae787c3", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/mailbox.actions.ts:162", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/mailbox.actions.ts:162"}, "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-6135d8637138d015", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/onboarding.actions.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/onboarding.actions.ts:58"}, "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-83887e1f1877122e", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/crm-reports.actions.ts:1207", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/crm-reports.actions.ts:1207"}, "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-84b3e938855271af", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/user.actions.ts:258", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/user.actions.ts:258"}, "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-3fa4bf8f0cab4d30", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-lookup.actions.ts:735", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-lookup.actions.ts:735"}, "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-44641ae84546790e", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/seo.actions.ts:511", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/seo.actions.ts:511"}, "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-3d30cf2af25d6aa8", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabsheet.actions.ts:351", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabsheet.actions.ts:351"}, "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-64d4486003f67928", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-portal-auth.actions.ts:161", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-portal-auth.actions.ts:161"}, "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-eeb92a4fd29eb748", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabwriter.actions.ts:338", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabwriter.actions.ts:338"}, "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-0e2d36113630af9a", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-employees.actions.ts:548", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-employees.actions.ts:548"}, "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-1208b37f58755b9e", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/email.actions.ts:630", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/email.actions.ts:630"}, "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-1d47a0989a4f63e6", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/facebook.actions.ts:155", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/facebook.actions.ts:155"}, "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-6b255940b539cf85", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabwebinar.actions.ts:155", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabwebinar.actions.ts:155"}, "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-7890db3c236a45ee", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/client-signup.actions.ts:118", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/client-signup.actions.ts:118"}, "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-6c20166c87b75ac9", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/client-signup.actions.ts:119", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/client-signup.actions.ts:119"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33456b9fcc283fba", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/worksuite/payments.actions.ts:423", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/worksuite/payments.actions.ts:423"}, "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-0380b9f13c05acdf", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/n8n/index.ts:213", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/n8n/index.ts:213"}, "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-06fa04ad7d524b1d", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/n8n/index.ts:215", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/n8n/index.ts:215"}, "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-85c59e316df40fe3", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/payouts.actions.ts:408", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/payouts.actions.ts:408"}, "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-564d7bbf6b01acec", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/bookings.actions.ts:322", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/bookings.actions.ts:322"}, "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-0f5e94790e60aa62", "name": "Stray `console.log` in TS/JS \u2014 src/app/actions/crm/tickets.actions.ts:246", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/crm/tickets.actions.ts:246"}, "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-3569b679e49b7383", "name": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/payment-receipts.actions.ts:474", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/payment-receipts.actions.ts:474"}, "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-e272d2cecc4b6809", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/store/[tenantSlug]/layout.tsx:44", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/store/[tenantSlug]/layout.tsx:44"}, "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-4f209c725098c51f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/features/[slug]/page.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/features/[slug]/page.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e636c51e80fdf25f", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/features/[slug]/page.tsx:107", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/features/[slug]/page.tsx:107"}, "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-26e1d51e59847f46", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/settings/sinks-card.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/settings/sinks-card.tsx:100"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f264a010c78aefc7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/api-docs/api-docs-client.tsx:237", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/api-docs/api-docs-client.tsx:237"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36bdf3dba2b8cda0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/sabsms/api-docs/api-docs-client.tsx:114", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/sabsms/api-docs/api-docs-client.tsx:114"}, "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-700a0c392e8929f5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/routing/page.tsx:668", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/routing/page.tsx:668"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0bd639bdaa062aef", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/analytics/actions.ts:54", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/analytics/actions.ts:54"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3cd9d89e6ca1d7c4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/projects/_client.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/projects/_client.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f74ac90a04ee021b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/health/page.tsx:99", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/health/page.tsx:99"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c0d2586ee74267bf", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/scheduled/client.tsx:326", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/scheduled/client.tsx:326"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6e7819f17cd8b2a5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/send/composer.tsx:850", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/send/composer.tsx:850"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dc830e610f432178", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/sdk-reference/page.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/sdk-reference/page.tsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-caf87653fabedf6d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/providers/providers-client.tsx:124", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/providers/providers-client.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-4fbb400002fe4a9c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/providers/[id]/provider-detail-client.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/providers/[id]/provider-detail-client.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-9a16d3ef8ce8d03a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/templates/page.tsx:91", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/templates/page.tsx:91"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7556d507c9da7fac", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/templates/approvals/actions.ts:166", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/templates/approvals/actions.ts:166"}, "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-94fd6cce4e645ca9", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/logs/page.tsx:298", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/logs/page.tsx:298"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fdc777fee042832f", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/compliance/dlt/dlt-client.tsx:377", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/compliance/dlt/dlt-client.tsx:377"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b46ec6b56b7d306", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/numbers/[id]/actions.ts:335", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/numbers/[id]/actions.ts:335"}, "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-cde0385c7e4fed35", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/api-keys/page.tsx:590", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/api-keys/page.tsx:590"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c336bcdfceb51688", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/imports/actions.ts:411", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/imports/actions.ts:411"}, "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-3fc33ca54d917ca1", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/quick-send/progress-dashboard.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/quick-send/progress-dashboard.tsx:249"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-67a5d5eaef1f9ceb", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/quick-send/actions.ts:25", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/quick-send/actions.ts:25"}, "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-33e5e6c9b94bd633", "name": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/quick-send/actions.ts:228", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/quick-send/actions.ts:228"}, "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-2a88581970ac14d5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/quick-send/quick-send-client.tsx:569", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/quick-send/quick-send-client.tsx:569"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-557df60665e2fa56", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/campaigns/campaigns-table.tsx:301", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/campaigns/campaigns-table.tsx:301"}, "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-bb63c89c53d90014", "name": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/campaigns/new/actions.ts:276", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/campaigns/new/actions.ts:276"}, "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-6a324d34e50ae77c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/campaigns/new/steps/step-review.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/campaigns/new/steps/step-review.tsx:240"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-472bc385cfc30d70", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/campaigns/new/steps/step-schedule.tsx:106", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/campaigns/new/steps/step-schedule.tsx:106"}, "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-9ac9bb7d27578e01", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/campaigns/create/page.tsx:320", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/campaigns/create/page.tsx:320"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-63e5b0ae2c77feba", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/contacts/actions.ts:595", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/contacts/actions.ts:595"}, "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-8041f0293b2e10da", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/ab-tests/actions.ts:411", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/ab-tests/actions.ts:411"}, "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-7237a80c3ff47666", "name": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/segments/actions.ts:829", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/segments/actions.ts:829"}, "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-8823c4ce42227b92", "name": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/segments/new/actions.ts:598", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/segments/new/actions.ts:598"}, "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-469b8cc2fc81a0bd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/webhooks/webhooks-table.tsx:259", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/webhooks/webhooks-table.tsx:259"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce2f9672888506e5", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/webhooks/deliveries-panel.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/webhooks/deliveries-panel.tsx:145"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3fe686c278c4dfe6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/consent/consent-table.tsx:197", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/consent/consent-table.tsx:197"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-220a560f4132e48a", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/inbox/thread-view.tsx:876", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/inbox/thread-view.tsx:876"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-221bd04133d2a832", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/inbox/conversation-list.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/inbox/conversation-list.tsx:204"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8863e1397a93bf6", "name": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/inbox/actions.ts:856", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/inbox/actions.ts:856"}, "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-556d26ec69c718be", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/_components/sabsms-shell.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/_components/sabsms-shell.tsx:76"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9b4c26c206f7c9db", "name": "Stray `console.log` in TS/JS \u2014 src/lib/auth.ts:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth.ts:83"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-df8e9ca62ed7de42", "name": "Stray `console.log` in TS/JS \u2014 src/lib/crm-auth.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/crm-auth.ts:21"}, "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-0d6cc746787bf601", "name": "Stray `console.log` in TS/JS \u2014 src/lib/cron-scheduler.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cron-scheduler.js:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f77fdafedc11163", "name": "Stray `console.log` in TS/JS \u2014 src/lib/call-webhook-processor.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/call-webhook-processor.ts:54"}, "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-1bdb1db7c10bf72f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/broadcast-worker.js:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/broadcast-worker.js:168"}, "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-f85d050331c2ad6d", "name": "Stray `console.log` in TS/JS \u2014 src/lib/calling-webhook-processor.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/calling-webhook-processor.ts:40"}, "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-c2c11eeae7c4365d", "name": "Stray `console.log` in TS/JS \u2014 src/lib/webhook-processor.ts:1357", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/webhook-processor.ts:1357"}, "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-a714a040f7b1a7de", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/integrations/imap-tickets.ts:137", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/integrations/imap-tickets.ts:137"}, "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-246c1cdc9bcb4837", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/india-tax/e-invoice-providers.ts:205", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/india-tax/e-invoice-providers.ts:205"}, "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-58f97ac92424753e", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/india-tax/eway-bill-providers.ts:200", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/india-tax/eway-bill-providers.ts:200"}, "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-738605cc4fd0151b", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/email/send.ts:26", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/email/send.ts:26"}, "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-9fe63614725bd0a0", "name": "Stray `console.log` in TS/JS \u2014 src/lib/email/send.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/send.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-b97504105ab3a2b0", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabcrm/seed.server.ts:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabcrm/seed.server.ts:153"}, "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-d5f5cc25674a22be", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/types/page-layout/PageLayoutWidgetConditionalDisplay.ts:1", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/types/page-layout/PageLayoutWidgetConditionalDisplay.ts:1"}, "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-4ca87460b2c0ae9c", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/constants/ObjectsWithChannelVisibilityConstraints.ts:1", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/constants/ObjectsWithChannelVisibilityConstraints.ts:1"}, "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-f82512da2c06ae42", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/utils/compositeFieldFilterOperandsMap.ts:14", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/utils/compositeFieldFilterOperandsMap.ts:14"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52f486620565a17a", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveRelativeDateFilter.ts:11", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveRelativeDateFilter.ts:11"}, "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-2119d4a93e44e7bd", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveDateTimeFilter.ts:12", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveDateTimeFilter.ts:12"}, "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-75311d08f3467f7b", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveDateFilter.ts:12", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveDateFilter.ts:12"}, "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-e4babfb205a03a85", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/sabcrm/emails/src/utils/email-renderer/email-renderer.tsx:", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/sabcrm/emails/src/utils/email-renderer/email-renderer.tsx:15"}, "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-be60488d827df5fe", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabwriter/transport.ts:167", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabwriter/transport.ts:167"}, "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-aebcf90546fcd090", "name": "Stray `console.log` in TS/JS \u2014 src/lib/cron/utils.ts:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cron/utils.ts:121"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c5233ca2493bd804", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/cron/jobs/visa-passport-expiry-alerts.ts:89", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/cron/jobs/visa-passport-expiry-alerts.ts:89"}, "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-80285161a85ded85", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/cron/jobs/follow-up-reminders.ts:62", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/cron/jobs/follow-up-reminders.ts:62"}, "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-bd0438449cc29b95", "name": "Stray `console.log` in TS/JS \u2014 src/lib/api-platform/handler.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api-platform/handler.ts:105"}, "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-81050a52e2a0984c", "name": "Stray `console.log` in TS/JS \u2014 src/lib/api-platform/sample-builder.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api-platform/sample-builder.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-1ac1d4f412500b64", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/app-presets/runtime/exec.ts:389", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/app-presets/runtime/exec.ts:389"}, "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-e6c49369c9b3902f", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/workflow-data-proxy.ts:62", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/workflow-data-proxy.ts:62"}, "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-943c8d4a0dc75cc2", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/schemas.ts:160", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/schemas.ts:160"}, "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-dfb73954918ad9e4", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/workflow.ts:833", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/workflow.ts:833"}, "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-9ae195bbc58233aa", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/utils.ts:64", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/utils.ts:64"}, "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-5601f8fe0322db09", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/node-helpers.ts:512", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/node-helpers.ts:512"}, "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-64af1ef42236a4df", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/interfaces.ts:911", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/interfaces.ts:911"}, "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-9802bfe161432841", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/internal/backend-common/index.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/internal/backend-common/index.ts:29"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0d5a91470afc0e07", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/date-extensions.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/date-extensions.ts:3"}, "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-9b152bc24c8ea922", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/array-extensions.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/array-extensions.ts:3"}, "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-b729c4c45941fe2e", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/utils.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/utils.ts:3"}, "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-5d04276e84c9da2f", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/boolean-extensions.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/boolean-extensions.ts:3"}, "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-e93c4cd097d1b62c", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/number-extensions.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/number-extensions.ts:3"}, "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-c790063445a31a53", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/object-extensions.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/object-extensions.ts:3"}, "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-4c5c079e454620f7", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/string-extensions.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/string-extensions.ts:3"}, "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-9910cc78edd39702", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/extended-functions.ts:3", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/extended-functions.ts:3"}, "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-8c52f6fb475d9ec7", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/node-execute-functions.ts:16", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/node-execute-functions.ts:16"}, "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-3e1330750571b50e", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts:230", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts:230"}, "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-ae38c68723595ebc", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/requests-response.ts:69", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/requests-response.ts:69"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7dc8fa1c84d44b20", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/supply-data-contex", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/supply-data-context.ts:317"}, "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-3b96864c01325d1f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/supply-data-context.ts:3", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/supply-data-context.ts:377"}, "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-0f577bc143a9becf", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/node-execution-con", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/node-execution-context.ts:415"}, "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-cb93992e556a76d1", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/execute-context.ts:223", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/execute-context.ts:223"}, "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-4019f727cd2fac8b", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/binary-helpe", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/binary-helper-functions.ts:302"}, "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-05a8502d26af91af", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/get-secrets-", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/get-secrets-proxy.ts:34"}, "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-bcb3b1a7728309aa", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-start-nodes.", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-start-nodes.ts:14"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a690e0d441f32ca", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/directed-graph.ts", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/directed-graph.ts:475"}, "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-1bb717bd302594b3", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-trigger-for-", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-trigger-for-partial-execution.ts:77"}, "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-59ee5b62bed9f3a0", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-subgraph.ts:", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-subgraph.ts:47"}, "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-229c3ef624732818", "name": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/lib/sabflow/editor-catalog/useAppCatalog", "shortDescription": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/lib/sabflow/editor-catalog/useAppCatalog.ts:232"}, "fullDescription": {"text": "React Flow edge labels render with a white rectangle behind the text by default, which scatters bright boxes across a dark canvas. Either drop the label, or override `.react-flow__edge-textbg` and `.react-flow__edge-text` in your stylesheet.\n\nWhy: P-H in CHECKLIST.md \u2014 vendor edge labels bleed white through a dark canvas.\nRule id: fq.edge-label.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6862a80ca4075153", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/execution/sandbox/browserSandbox.ts:309", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/execution/sandbox/browserSandbox.ts:309"}, "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-4a4e1a46317db049", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/queue/dlq.ts:500", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/queue/dlq.ts:500"}, "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-80ded9fa09b8ca9c", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/expression/tokenizer.test.ts:133", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/expression/tokenizer.test.ts:133"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2c5803b3ff9c28b", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/expression/coerce.ts:330", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/expression/coerce.ts:330"}, "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-7db03e06348047b9", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/credentials/oauth2-refresh.ts:313", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/credentials/oauth2-refresh.ts:313"}, "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-8d1b3009de2ccf72", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/credentials/crypto.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/credentials/crypto.ts:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-834e2e24e441e3d1", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/persistence/indexes.ts:239", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/persistence/indexes.ts:239"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c56adbfd5e8b6134", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/expressions/__tests__.ts:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/expressions/__tests__.ts:147"}, "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-6c83d6ad4619b3e6", "name": "Stray `console.log` in TS/JS \u2014 src/lib/automations/actions/send-email.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/automations/actions/send-email.ts:40"}, "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-abb42eda3957ed71", "name": "Stray `console.log` in TS/JS \u2014 src/lib/automations/actions/webhook.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/automations/actions/webhook.ts:34"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-162988feb3a50477", "name": "Stray `console.log` in TS/JS \u2014 src/lib/actions/user.actions.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/actions/user.actions.ts:74"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a949fa04115b5169", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/contracts/esign-providers.ts:105", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/contracts/esign-providers.ts:105"}, "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-efb137a17743c4c7", "name": "TODO/FIXME marker in shipping code \u2014 src/lib/contracts/signature-providers.ts:161", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/contracts/signature-providers.ts:161"}, "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-0685b250a7948473", "name": "Stray `console.log` in TS/JS \u2014 src/lib/sabsms/events/consumer.ts:395", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabsms/events/consumer.ts:395"}, "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-6fb907d9b7dca831", "name": "Stray `console.log` in TS/JS \u2014 src/lib/seo/outreach.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/seo/outreach.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-ace264ae8c248f4f", "name": "Stray `console.log` in TS/JS \u2014 src/lib/seo/plugins/registry.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/seo/plugins/registry.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-b993a4c4f711570c", "name": "Stray `console.log` in TS/JS \u2014 src/workers/sabflow-scheduler.ts:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabflow-scheduler.ts:63"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd9075bc1a3d3cd6", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo.worker.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo.worker.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-e69f87ed7d6afd9b", "name": "TODO/FIXME marker in shipping code \u2014 src/workers/sabmail-sync.ts:442", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/workers/sabmail-sync.ts:442"}, "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-27d74f08dc619094", "name": "Stray `console.log` in TS/JS \u2014 src/workers/sabmail-sync.ts:330", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabmail-sync.ts:330"}, "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-630b7bbe0674d059", "name": "Stray `console.log` in TS/JS \u2014 src/workers/sabmail-push-sync.ts:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabmail-push-sync.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-8a965240badd49dc", "name": "Stray `console.log` in TS/JS \u2014 src/workers/sabflow-worker.ts:332", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabflow-worker.ts:332"}, "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-e37cb7928a4f9745", "name": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/send.worker.js:294", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/send.worker.js:294"}, "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-0c9379197efa275d", "name": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/index.js:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/index.js: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-670595510d14aaef", "name": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/control.worker.js:255", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/control.worker.js:255"}, "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-f9ef5e852c1d06b1", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/email.worker.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/email.worker.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-2c22e765fbc83460", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/brand.worker.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/brand.worker.ts:17"}, "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-c9ebc7aaf13b8e66", "name": "TODO/FIXME marker in shipping code \u2014 src/workers/seo/embedding.worker.ts:36", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/workers/seo/embedding.worker.ts:36"}, "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-b74780ca066f2af1", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/embedding.worker.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/embedding.worker.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-cb0a5e49857411e0", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/audit.worker.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/audit.worker.ts:62"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4484e52658f0c245", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/webhook.worker.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/webhook.worker.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-97a7e9ff1cf3271b", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/snapshot.worker.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/snapshot.worker.ts:17"}, "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-ccf7c19105c2b291", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/image.worker.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/image.worker.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-c87aff4722878fd4", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/local.worker.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/local.worker.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-3503063ddade8fa7", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/content.worker.ts:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/content.worker.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-207b68767b5fc453", "name": "Stray `console.log` in TS/JS \u2014 src/workers/seo/rank.worker.ts:40", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/rank.worker.ts:40"}, "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-681f0c068bf4cc53", "name": "Stray `console.log` in TS/JS \u2014 src/workflows/automation-run.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/workflows/automation-run.ts:92"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66eaced5bae3a881", "name": "Stray `console.log` in TS/JS \u2014 e2e/global-setup.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/global-setup.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-14f97d860dd25519", "name": "Stray `console.log` in TS/JS \u2014 e2e/sabsms/campaigns.spec.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/sabsms/campaigns.spec.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-a78949ef74e61852", "name": "Stray `console.log` in TS/JS \u2014 benches/sabflow-editor-perf/run.js:312", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 benches/sabflow-editor-perf/run.js:312"}, "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-97a4fb77580f3772", "name": "Privileged port 43 in use", "shortDescription": {"text": "Privileged port 43 in use"}, "fullDescription": {"text": "Port 43 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-1faa60adef8e56d4", "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-a5407bcf10a661c7", "name": "Privileged port 465 in use", "shortDescription": {"text": "Privileged port 465 in use"}, "fullDescription": {"text": "Port 465 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-0087ca127c2e24f0", "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-5f82aea493aac436", "name": "Docker base image is tag-pinned but not digest-pinned: lukemathwalker/cargo-chef:0.1.68-rust-1.83-bookworm", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: lukemathwalker/cargo-chef:0.1.68-rust-1.83-bookworm"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da2d469a95e5b8f2", "name": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec49901c9eaf7ddd", "name": "Insecure pattern 'node_child_process' in check_ts.js:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in check_ts.js: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-622e6c59b0c279c4", "name": "Insecure pattern 'node_child_process' in scripts/gen-rust-client.ts:16", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/gen-rust-client.ts:16"}, "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-70944bf292056852", "name": "Insecure pattern 'node_child_process' in scripts/build-sabsites.mjs:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/build-sabsites.mjs:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f8cc652a9e47533e", "name": "Insecure pattern 'node_child_process' in scripts/sabflow-inventory-check.mjs:23", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/sabflow-inventory-check.mjs:23"}, "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-a80e1d345bde23af", "name": "Insecure pattern 'node_child_process' in scripts/sabsheet/function-parity.ts:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/sabsheet/function-parity.ts:11"}, "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-3d181333ddb792c6", "name": "Insecure pattern 'eval_used' in rust/crates/sabsheet-cells/src/handlers.rs:151", "shortDescription": {"text": "Insecure pattern 'eval_used' in rust/crates/sabsheet-cells/src/handlers.rs:151"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-52a68d2ca8755983", "name": "Insecure pattern 'eval_used' in rust/crates/sabsheet-cells/src/formula.rs:556", "shortDescription": {"text": "Insecure pattern 'eval_used' in rust/crates/sabsheet-cells/src/formula.rs:556"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9c371ff15082a705", "name": "Insecure pattern 'dangerous_innerhtml' in playwright-report/index.html:58", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in playwright-report/index.html:58"}, "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-9029cfde635dd36d", "name": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report/index.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report/index.html:57"}, "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-3e07f50b80348f43", "name": "Insecure pattern 'eval_used' in services/sabflow-ws/src/seats.ts:71", "shortDescription": {"text": "Insecure pattern 'eval_used' in services/sabflow-ws/src/seats.ts:71"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7732b912b9c0e755", "name": "Insecure pattern 'weak_hash' in services/sabchat-turn/README.md:14", "shortDescription": {"text": "Insecure pattern 'weak_hash' in services/sabchat-turn/README.md:14"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-991a08e4c9404c9a", "name": "Insecure pattern 'node_child_process' in services/sabflow-task-runner/src/index.ts:4", "shortDescription": {"text": "Insecure pattern 'node_child_process' in services/sabflow-task-runner/src/index.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-f76739e16cb99549", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/embed.js:299", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/embed.js:299"}, "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-8bf231a4a3817eb0", "name": "Insecure pattern 'weak_hash' in plans/sabsms-v2-audit-gaps.json:658", "shortDescription": {"text": "Insecure pattern 'weak_hash' in plans/sabsms-v2-audit-gaps.json:658"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3be11c4507e5a478", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/email/inbox/thread-view.tsx:247", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/email/inbox/thread-view.tsx:247"}, "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-f560abfb99771ddd", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:81", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:81"}, "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-b6e382664fd221a5", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/form-block-renderer.tsx:187", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/form-block-renderer.tsx:187"}, "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-df4ca37027a01ab4", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/crm-form-preview.tsx:165", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/crm-form-preview.tsx:165"}, "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-a33630e615c3b4f4", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/embedded-form.tsx:381", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/embedded-form.tsx:381"}, "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-e9d2b8e5a4386f7b", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/rich-text-block-renderer.tsx:84", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/rich-text-block-renderer.tsx:84"}, "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-a8815ae76446538f", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/form-block-renderer.tsx:185", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/form-block-renderer.tsx:185"}, "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-8646d12958c5d5d8", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/block-renderer.tsx:31", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/block-renderer.tsx:31"}, "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-0761e392cb5ca614", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/sabcrm/20ui/chart.tsx:129", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/sabcrm/20ui/chart.tsx:129"}, "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-e102884fa339ddaa", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/sabcrm/20ui/composites/editor/rich-text.tsx:276", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/sabcrm/20ui/composites/editor/rich-text.tsx:276"}, "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-e24d64a5a955bea9", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/sabcrm/20ui/composites/editor/rich-text.tsx:127", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/sabcrm/20ui/composites/editor/rich-text.tsx:127"}, "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-6901d3df9769ea35", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/crm/live-editor/live-canvas.tsx:62", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/crm/live-editor/live-canvas.tsx:62"}, "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-1f27342f4642dd46", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/sabflow/panels/blocks/shared/ChipInput.tsx:103", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/sabflow/panels/blocks/shared/ChipInput.tsx:103"}, "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-8cf1c35b7c1d13ae", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:107", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:107"}, "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-39ad6e0c764ee659", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/dl/[shortCode]/components/RedirectScript.tsx:41", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dl/[shortCode]/components/RedirectScript.tsx:41"}, "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-554cc32b6ff8b0c4", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/login/page.tsx:15", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/login/page.tsx:15"}, "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-9151e09ae155ce8b", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/message/route.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/message/route.ts:5"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0252e06329bde494", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/sabchat/[userId]/route.ts:224", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/sabchat/[userId]/route.ts:224"}, "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-165982dbbedbe19a", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/history/route.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/history/route.ts:5"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c6ef6b51f64502f", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/widget/ai/route.ts:19", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/widget/ai/route.ts:19"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1c6c15b77599d160", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/session/route.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/session/route.ts:5"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-430be45327227b77", "name": "Insecure pattern 'cors_wildcard' in src/app/api/seo-tools/dns/route.ts:12", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/seo-tools/dns/route.ts:12"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c77e687ff43c0f1e", "name": "Insecure pattern 'cors_wildcard' in src/app/api/v1/sabcall/calls/route.ts:32", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/v1/sabcall/calls/route.ts:32"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c5317c580b82cc0", "name": "Insecure pattern 'cors_wildcard' in src/app/api/v1/sabcall/contacts/route.ts:30", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/v1/sabcall/contacts/route.ts:30"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8649a1be4b07de8b", "name": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/sabcrm/route.ts:53", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/sabcrm/route.ts:53"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a0b6250db1ed6318", "name": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/sabcall/route.ts:36", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/sabcall/route.ts:36"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c99105872f12b368", "name": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/ad-manager/route.ts:44", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/ad-manager/route.ts:44"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2ee4b7d184ae443b", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabcrm/forms/submit/[publicId]/route.ts:16", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabcrm/forms/submit/[publicId]/route.ts:16"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-29d327b86e9ba1f5", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabmail/forms/[id]/submit/route.ts:34", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabmail/forms/[id]/submit/route.ts:34"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e1dedb2a0e4a4036", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabsense/ingest/route.ts:181", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabsense/ingest/route.ts:181"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa10d2d99de89d87", "name": "Insecure pattern 'cors_wildcard' in src/app/api/sabsense/snippet.js/route.ts:27", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabsense/snippet.js/route.ts:27"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1ea42c8b40746c18", "name": "Insecure pattern 'cors_wildcard' in src/app/api/crm/forms/submit/[formId]/route.ts:6", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/crm/forms/submit/[formId]/route.ts:6"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e5edb3abb1ffaa51", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/crm/forms/embed/[formId]/route.js:54", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/crm/forms/embed/[formId]/route.js:54"}, "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-a15a26d6b05fc476", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/widget/[projectId]/route.ts:55", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/widget/[projectId]/route.ts:55"}, "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-d07e7af69acab85d", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/sabsheet/[workbookId]/print/_print-view.tsx:141", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/sabsheet/[workbookId]/print/_print-view.tsx:141"}, "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-bb39d0e29e73b339", "name": "Possible secret in src/app/dashboard/user/profile/page.client.tsx", "shortDescription": {"text": "Possible secret in src/app/dashboard/user/profile/page.client.tsx"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-7f5215f5ed9713a1", "name": "Insecure pattern 'weak_hash' in src/app/dashboard/seo/tools/ssl-checker/page.tsx:31", "shortDescription": {"text": "Insecure pattern 'weak_hash' in src/app/dashboard/seo/tools/ssl-checker/page.tsx:31"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7fcf1fb6c74388c2", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/markdown-to-html/page.tsx:124", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/markdown-to-html/page.tsx:124"}, "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-c3ce732407d38f3c", "name": "Insecure pattern 'weak_hash' in src/app/dashboard/seo/tools/hash-generator/page.tsx:21", "shortDescription": {"text": "Insecure pattern 'weak_hash' in src/app/dashboard/seo/tools/hash-generator/page.tsx:21"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-16b6cd22db544d38", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/json-formatter/page.tsx:70", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/json-formatter/page.tsx:70"}, "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-f80369a8cec32c6a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/page-speed/page.tsx:184", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/page-speed/page.tsx:184"}, "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-7a0570f505ef9964", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/s/[shortCode]/page.tsx:170", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/s/[shortCode]/page.tsx:170"}, "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-acf39e9d705746a8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/sabcrm/[objectSlug]/[recordId]/_comments/comments-panel.tsx:207", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/sabcrm/[objectSlug]/[recordId]/_comments/comments-panel.tsx:207"}, "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-2f362fe2409a779f", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/r/[shortCode]/page.tsx:119", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/r/[shortCode]/page.tsx:119"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba294a8839f8b326", "name": "Insecure pattern 'exec_used' in src/app/sabmail/_components/rich-text-editor.tsx:87", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/app/sabmail/_components/rich-text-editor.tsx:87"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fbdd6efb02791417", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/app/sabmail/_components/rich-text-editor.tsx:48", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/sabmail/_components/rich-text-editor.tsx:48"}, "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-98bfd9c9b250ac83", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/portal/client/knowledge-base/[id]/page.tsx:53", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/portal/client/knowledge-base/[id]/page.tsx:53"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5daef35eb4dcfc7", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/present/[publishSlug]/page.tsx:52", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/present/[publishSlug]/page.tsx:52"}, "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-1dd4f37e12dd22a8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/share/contract/[hash]/page.tsx:56", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/share/contract/[hash]/page.tsx:56"}, "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-0edbe24807539e88", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/share/proposal/[hash]/page.tsx:72", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/share/proposal/[hash]/page.tsx:72"}, "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-def83375c799fc1b", "name": "Insecure pattern 'node_child_process' in src/app/actions/database-backup.actions.ts:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/app/actions/database-backup.actions.ts:5"}, "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-0eb0bd1d021f584d", "name": "Insecure pattern 'new_function_used' in src/app/actions/sabcrm-people-salary-structures.actions.types.ts:159", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/app/actions/sabcrm-people-salary-structures.actions.types.ts:159"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-25bfa5e0dc1f2a6c", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/store/[tenantSlug]/layout.tsx:44", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/store/[tenantSlug]/layout.tsx:44"}, "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-0dba50b6b82e88df", "name": "Insecure pattern 'new_function_used' in src/app/sites/[[...path]]/route.ts:26", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/app/sites/[[...path]]/route.ts:26"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b89440dcd118a27a", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/features/[slug]/page.tsx:107", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/features/[slug]/page.tsx:107"}, "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-2afd5505f1eb25e8", "name": "Insecure pattern 'dangerous_innerhtml' in src/app/sabsms/api-docs/api-docs-client.tsx:114", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/sabsms/api-docs/api-docs-client.tsx:114"}, "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-7fe08ca0768e32bf", "name": "Insecure pattern 'weak_hash' in src/lib/integrations/README.md:122", "shortDescription": {"text": "Insecure pattern 'weak_hash' in src/lib/integrations/README.md:122"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-858de4bdd3c4f49c", "name": "Insecure pattern 'weak_hash' in src/lib/seo-tools/registry.ts:174", "shortDescription": {"text": "Insecure pattern 'weak_hash' in src/lib/seo-tools/registry.ts:174"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-88551353a9ae61a1", "name": "Possible secret in src/lib/sabcrm/twenty-user-bridge.ts", "shortDescription": {"text": "Possible secret in src/lib/sabcrm/twenty-user-bridge.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-0771074f603891fb", "name": "Possible secret in src/lib/sabcrm/shared/src/types/AppPath.ts", "shortDescription": {"text": "Possible secret in src/lib/sabcrm/shared/src/types/AppPath.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-aa61df281a42f666", "name": "Insecure pattern 'dangerous_innerhtml' in src/lib/sabcrm/emails/src/utils/email-renderer/email-renderer.tsx:15", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/sabcrm/emails/src/utils/email-renderer/email-renderer.tsx:15"}, "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-325a2b1d146ecdd6", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/databases/index.ts:67", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/databases/index.ts:67"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-daad5bb1fa5bec5d", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_filter.ts:37", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_filter.ts:37"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c750ddbd80322c1", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_reduce.ts:39", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_reduce.ts:39"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eb8d79b230e77b63", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_map.ts:39", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_map.ts:39"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df8aa30b45ea9587", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/if.ts:33", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/if.ts:33"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-541a46189fe4c24d", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/filter.ts:33", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/filter.ts:33"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c8fc6817f3e80289", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/switch_n8n.ts:38", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/switch_n8n.ts:38"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-db977149f867d50c", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/triggers_as_actions/email_read_imap.ts:51", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/triggers_as_actions/email_read_imap.ts:51"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b79fef44af42f58b", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/langchain_vendor/tool_code.ts:27", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/langchain_vendor/tool_code.ts:27"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c80047dbcadccd10", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/deprecated/ai_transform_v1.ts:102", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/deprecated/ai_transform_v1.ts:102"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5edb52d228e4e25e", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/storage/ssh.ts:61", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/storage/ssh.ts:61"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-893b073229aeeefd", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/storage/ftp.ts:53", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/storage/ftp.ts:53"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04d5eca956d88b0b", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/_shared/optional_import.ts:10", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/_shared/optional_import.ts:10"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-677b85b2c667d2aa", "name": "Insecure pattern 'eval_used' in src/lib/sabflow/triggers/debounce.ts:77", "shortDescription": {"text": "Insecure pattern 'eval_used' in src/lib/sabflow/triggers/debounce.ts:77"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0a3fb3e96f42c9be", "name": "Insecure pattern 'weak_hash' in src/lib/sabflow/n8n/extensions/string-extensions.ts:11", "shortDescription": {"text": "Insecure pattern 'weak_hash' in src/lib/sabflow/n8n/extensions/string-extensions.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-73bfc96faf2c233e", "name": "Insecure pattern 'weak_hash' in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/request-helpers/a", "shortDescription": {"text": "Insecure pattern 'weak_hash' in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/request-helpers/axios-utils.ts:173"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bef4cd0192359f47", "name": "Insecure pattern 'domparser_html_parse' in src/lib/sabflow/helpers/sanitizeHtml.ts:75", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in src/lib/sabflow/helpers/sanitizeHtml.ts:75"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63cd7d6f25dfd693", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/execution/testNode.ts:480", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/execution/testNode.ts:480"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5d62160d82b56192", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/execution/sandbox/browserSandbox.ts:142", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/execution/sandbox/browserSandbox.ts:142"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9f700807953ac5c1", "name": "Insecure pattern 'exec_used' in src/lib/sabflow/queue/enqueue.ts:161", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/lib/sabflow/queue/enqueue.ts:161"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-15558c613c0b2f19", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/executeBlock.ts:335", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/executeBlock.ts:335"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-791d8bbd46012fa5", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/per-item-if-e2e.test.ts:20", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/per-item-if-e2e.test.ts:20"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43ab258d26ce9c0d", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/multi-output-routing.test.ts:49", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/multi-output-routing.test.ts:49"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b44d64c95e7925b4", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/per-item-filter-e2e.test.ts:18", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/per-item-filter-e2e.test.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ccb1ebe853f85e3b", "name": "Insecure pattern 'new_function_used' in src/lib/sabflow/executor/credentials/import-n8n.ts:627", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/executor/credentials/import-n8n.ts:627"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-381ae2ecb9830f75", "name": "Insecure pattern 'new_function_used' in src/lib/automations/workflow-runtime.ts:46", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/lib/automations/workflow-runtime.ts:46"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9d1a7ed926a7a4fe", "name": "Insecure pattern 'new_function_used' in src/workflows/automation-run.ts:32", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/workflows/automation-run.ts:32"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-43b282afe27dbc16", "name": "Insecure pattern 'new_function_used' in benches/sabflow-expression/run.js:154", "shortDescription": {"text": "Insecure pattern 'new_function_used' in benches/sabflow-expression/run.js:154"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fbed092a780cad42", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64d3a5784b12cb42", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-29336aa2153b2da0", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "dtolnay/rust-toolchain@stable can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b27c3181c7b0890", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55f2a780dccd65ed", "name": "Very large file: scripts/n8n-extract-full.ts (2898 lines)", "shortDescription": {"text": "Very large file: scripts/n8n-extract-full.ts (2898 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-161d0dd2ccf232b3", "name": "Very large file: rust/crates/telegram-contacts/src/handlers.rs (2037 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-contacts/src/handlers.rs (2037 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-324b03a8745ee469", "name": "Very large file: rust/crates/telegram-commands/src/handlers.rs (2361 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-commands/src/handlers.rs (2361 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-98f8d134c2e06851", "name": "Very large file: rust/crates/url-shortener/src/store.rs (1840 lines)", "shortDescription": {"text": "Very large file: rust/crates/url-shortener/src/store.rs (1840 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-923c063ca32e284e", "name": "Very large file: rust/crates/telegram-webhooks/src/handlers.rs (2154 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-webhooks/src/handlers.rs (2154 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-3f59a26f6c7d26f7", "name": "Very large file: rust/crates/crm-payroll-runs/src/handlers.rs (2101 lines)", "shortDescription": {"text": "Very large file: rust/crates/crm-payroll-runs/src/handlers.rs (2101 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-85f6bfc4d9e7a4d5", "name": "Very large file: rust/crates/api/src/router.rs (1388 lines)", "shortDescription": {"text": "Very large file: rust/crates/api/src/router.rs (1388 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-93c62e622414028d", "name": "Very large file: rust/crates/telegram-chats/src/handlers.rs (2226 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-chats/src/handlers.rs (2226 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-b7eed6bc309eadda", "name": "Very large file: rust/crates/crm-store/src/handlers.rs (2820 lines)", "shortDescription": {"text": "Very large file: rust/crates/crm-store/src/handlers.rs (2820 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-69613e6b03b324a9", "name": "Very large file: rust/crates/telegram-business-inbox/src/handlers.rs (2972 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-business-inbox/src/handlers.rs (2972 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-9b0fed16c04cba7b", "name": "Very large file: rust/crates/telegram-broadcasts/src/handlers.rs (1555 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-broadcasts/src/handlers.rs (1555 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-c60769df988ca6ba", "name": "Very large file: rust/crates/telegram-channels/src/handlers.rs (2253 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-channels/src/handlers.rs (2253 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-4e7b332b99912dce", "name": "Very large file: rust/crates/crm-pos/src/handlers.rs (1969 lines)", "shortDescription": {"text": "Very large file: rust/crates/crm-pos/src/handlers.rs (1969 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-9fa6b6bdfc962136", "name": "Very large file: rust/crates/sabcrm-records/src/handlers.rs (2712 lines)", "shortDescription": {"text": "Very large file: rust/crates/sabcrm-records/src/handlers.rs (2712 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-86696dc21f4360f3", "name": "Very large file: rust/crates/telegram-mini-apps/src/handlers.rs (1573 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-mini-apps/src/handlers.rs (1573 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa43786eb88507d7", "name": "Very large file: rust/crates/sabflow-nodes/src/nodes/mod.rs (2224 lines)", "shortDescription": {"text": "Very large file: rust/crates/sabflow-nodes/src/nodes/mod.rs (2224 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-c65d90a47c61ddc2", "name": "Very large file: rust/crates/telegram-payments/src/handlers.rs (2010 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-payments/src/handlers.rs (2010 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-8c4d5eb0ac4ea381", "name": "Very large file: rust/crates/sabfiles/src/handlers.rs (2168 lines)", "shortDescription": {"text": "Very large file: rust/crates/sabfiles/src/handlers.rs (2168 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-6bcc935d747dc432", "name": "Very large file: rust/crates/wachat-facebook-pages/src/handlers.rs (1742 lines)", "shortDescription": {"text": "Very large file: rust/crates/wachat-facebook-pages/src/handlers.rs (1742 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-4da13a2e20da92c9", "name": "Very large file: rust/crates/telegram-analytics/src/handlers.rs (1719 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-analytics/src/handlers.rs (1719 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-907b06e9bb0c2ed1", "name": "Very large file: rust/crates/telegram-stories/src/handlers.rs (2084 lines)", "shortDescription": {"text": "Very large file: rust/crates/telegram-stories/src/handlers.rs (2084 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-6d0470fc81a214d1", "name": "Very large file: src/config/dashboard-config.ts (856 lines)", "shortDescription": {"text": "Very large file: src/config/dashboard-config.ts (856 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-68ea8486a860248a", "name": "Very large file: src/components/20ui-domain/qr-code-generator.tsx (883 lines)", "shortDescription": {"text": "Very large file: src/components/20ui-domain/qr-code-generator.tsx (883 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-1868941eda29d419", "name": "Very large file: src/components/20ui-domain/clay-dashboard-layout.tsx (3893 lines)", "shortDescription": {"text": "Very large file: src/components/20ui-domain/clay-dashboard-layout.tsx (3893 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-8067ddab16c04dd7", "name": "Very large file: src/components/sabcrm/object-editor.tsx (1666 lines)", "shortDescription": {"text": "Very large file: src/components/sabcrm/object-editor.tsx (1666 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-c4eebf1756149764", "name": "Very large file: src/components/landing-v2/module-page-shell.tsx (1141 lines)", "shortDescription": {"text": "Very large file: src/components/landing-v2/module-page-shell.tsx (1141 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-9f321cc8c90d4559", "name": "Very large file: src/components/landing-v2/bespoke-extras.tsx (1004 lines)", "shortDescription": {"text": "Very large file: src/components/landing-v2/bespoke-extras.tsx (1004 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-468e5a0e1fcf007c", "name": "Very large file: src/app/page-client.tsx (2732 lines)", "shortDescription": {"text": "Very large file: src/app/page-client.tsx (2732 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-556455a0812bc7de", "name": "Very large file: src/app/sabchat/inbox/_components/inbox-client.tsx (2545 lines)", "shortDescription": {"text": "Very large file: src/app/sabchat/inbox/_components/inbox-client.tsx (2545 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-5782f759675e53df", "name": "Very large file: src/app/dashboard/settings/crm/import-export/page.tsx (1822 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/settings/crm/import-export/page.tsx (1822 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-21c314ff9c5af81a", "name": "Very large file: src/app/dashboard/settings/crm/roles/page.tsx (1830 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/settings/crm/roles/page.tsx (1830 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-98ae17dec6c2cd42", "name": "Very large file: src/app/dashboard/settings/crm/automations/page.tsx (2149 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/settings/crm/automations/page.tsx (2149 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-ee1e81989ef42707", "name": "Very large file: src/app/dashboard/settings/crm/data-model/page.tsx (2877 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/settings/crm/data-model/page.tsx (2877 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-3dcd04ca2b04fe14", "name": "Very large file: src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/flow-builder/page.tsx (2080 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/flow-builder/page.tsx (2080 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-f360011f2fa07eb5", "name": "Very large file: src/app/dashboard/telegram/api-credentials/page.tsx (1252 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/api-credentials/page.tsx (1252 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-80e5341ffb3e4dd5", "name": "Very large file: src/app/dashboard/telegram/commands/page.tsx (2249 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/commands/page.tsx (2249 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-acd8f76f0a4b428a", "name": "Very large file: src/app/dashboard/telegram/business-inbox/page.tsx (1898 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/business-inbox/page.tsx (1898 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-fc9d52d3b614c14f", "name": "Very large file: src/app/dashboard/telegram/stories/page.client.tsx (1317 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/stories/page.client.tsx (1317 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-c612c459eedf7920", "name": "Very large file: src/app/dashboard/telegram/payments/page.client.tsx (2019 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/payments/page.client.tsx (2019 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-488ba243847a0265", "name": "Very large file: src/app/dashboard/telegram/contacts/page.tsx (1858 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/contacts/page.tsx (1858 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-06f636bcddc9028a", "name": "Very large file: src/app/dashboard/telegram/channels/[channelId]/page.tsx (1463 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/channels/[channelId]/page.tsx (1463 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-b868e58decfd2ecb", "name": "Very large file: src/app/dashboard/telegram/broadcasts/page.tsx (2097 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/telegram/broadcasts/page.tsx (2097 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-5ee3e487a807847c", "name": "Very large file: src/app/dashboard/ad-manager/create/page.tsx (1872 lines)", "shortDescription": {"text": "Very large file: src/app/dashboard/ad-manager/create/page.tsx (1872 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-4ea221f6f014ba62", "name": "Very large file: src/app/sabcrm/[objectSlug]/record-surface.tsx (2524 lines)", "shortDescription": {"text": "Very large file: src/app/sabcrm/[objectSlug]/record-surface.tsx (2524 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-a49fda66114e9f26", "name": "Very large file: src/app/sabcrm/[objectSlug]/[recordId]/record-detail-surface.tsx (2085 lines)", "shortDescription": {"text": "Very large file: src/app/sabcrm/[objectSlug]/[recordId]/record-detail-surface.tsx (2085 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-7910869a4c3205f5", "name": "Very large file: src/app/admin/dashboard/plans/_components/PlanEditor.tsx (1114 lines)", "shortDescription": {"text": "Very large file: src/app/admin/dashboard/plans/_components/PlanEditor.tsx (1114 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-8a27743c43d89be7", "name": "Very large file: src/app/sabmail/inbox/actions.ts (1424 lines)", "shortDescription": {"text": "Very large file: src/app/sabmail/inbox/actions.ts (1424 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-bff807104394d94d", "name": "Very large file: src/app/sabmail/inbox/_components/inbox-client.tsx (1501 lines)", "shortDescription": {"text": "Very large file: src/app/sabmail/inbox/_components/inbox-client.tsx (1501 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-84740cadf6fd0715", "name": "Very large file: src/app/actions/hr.actions.ts (1472 lines)", "shortDescription": {"text": "Very large file: src/app/actions/hr.actions.ts (1472 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-62425a896cf621bc", "name": "Very large file: src/app/actions/whatsapp.actions.ts (1344 lines)", "shortDescription": {"text": "Very large file: src/app/actions/whatsapp.actions.ts (1344 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-58b78cde4abb6eda", "name": "Very large file: src/app/actions/crm-reports.actions.ts (2698 lines)", "shortDescription": {"text": "Very large file: src/app/actions/crm-reports.actions.ts (2698 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-70ab475f254d61b8", "name": "Very large file: src/app/actions/telegram.actions.ts (2007 lines)", "shortDescription": {"text": "Very large file: src/app/actions/telegram.actions.ts (2007 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-66e53c24e3dd8b02", "name": "Very large file: src/app/actions/sabcrm.actions.ts (3295 lines)", "shortDescription": {"text": "Very large file: src/app/actions/sabcrm.actions.ts (3295 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-9fa0129b955108da", "name": "Very large file: src/app/actions/sabcrm-twenty.actions.ts (1652 lines)", "shortDescription": {"text": "Very large file: src/app/actions/sabcrm-twenty.actions.ts (1652 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-1860d34e66416234", "name": "Very large file: src/app/actions/crm.actions.ts (1541 lines)", "shortDescription": {"text": "Very large file: src/app/actions/crm.actions.ts (1541 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-bf04739c57c3a419", "name": "Very large file: src/app/actions/crm-lookup.actions.ts (1477 lines)", "shortDescription": {"text": "Very large file: src/app/actions/crm-lookup.actions.ts (1477 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-c2840818ff9f7de5", "name": "Very large file: src/app/actions/crm-deals.actions.ts (1616 lines)", "shortDescription": {"text": "Very large file: src/app/actions/crm-deals.actions.ts (1616 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-835431babc9b5e8c", "name": "Very large file: src/app/actions/ad-manager.actions.ts (1619 lines)", "shortDescription": {"text": "Very large file: src/app/actions/ad-manager.actions.ts (1619 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-4689222dbc5776f2", "name": "Very large file: src/app/actions/sabcrm-finance.actions.ts (2417 lines)", "shortDescription": {"text": "Very large file: src/app/actions/sabcrm-finance.actions.ts (2417 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-bb8924d562496364", "name": "Very large file: src/app/actions/crm-leads.actions.ts (1666 lines)", "shortDescription": {"text": "Very large file: src/app/actions/crm-leads.actions.ts (1666 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-71fcef930d5a2366", "name": "Very large file: src/app/actions/facebook.actions.ts (3199 lines)", "shortDescription": {"text": "Very large file: src/app/actions/facebook.actions.ts (3199 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-9c0a58b568e00322", "name": "Very large file: src/app/actions/telegram-extra.actions.ts (2772 lines)", "shortDescription": {"text": "Very large file: src/app/actions/telegram-extra.actions.ts (2772 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-ed9503d4fceb64ed", "name": "Very large file: src/app/actions/worksuite/projects.actions.ts (1582 lines)", "shortDescription": {"text": "Very large file: src/app/actions/worksuite/projects.actions.ts (1582 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f3dcf4a186ee9ab", "name": "Very large file: src/app/actions/worksuite/reports.actions.ts (2746 lines)", "shortDescription": {"text": "Very large file: src/app/actions/worksuite/reports.actions.ts (2746 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-52a91db0ca5f9d3f", "name": "Very large file: src/lib/definitions.ts (4312 lines)", "shortDescription": {"text": "Very large file: src/lib/definitions.ts (4312 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-821339cf78275083", "name": "Very large file: src/lib/webhook-processor.ts (2329 lines)", "shortDescription": {"text": "Very large file: src/lib/webhook-processor.ts (2329 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-f56bd0204db05b63", "name": "Very large file: src/lib/rust-client/sabcrm-finance.ts (1446 lines)", "shortDescription": {"text": "Very large file: src/lib/rust-client/sabcrm-finance.ts (1446 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-2998e5475b58fb51", "name": "Very large file: src/lib/rust-client/sabpay.ts (1155 lines)", "shortDescription": {"text": "Very large file: src/lib/rust-client/sabpay.ts (1155 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-ff66c87ed7b67209", "name": "Very large file: src/lib/sabcrm/scheduler.ts (2077 lines)", "shortDescription": {"text": "Very large file: src/lib/sabcrm/scheduler.ts (2077 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-014721fd4986b847", "name": "Very large file: src/lib/sabcrm/shared/src/metadata/constants/standard-object.constant.ts (2748 lines)", "shortDescription": {"text": "Very large file: src/lib/sabcrm/shared/src/metadata/constants/standard-object.constant.ts (2748 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-f0cf8f667e9cf565", "name": "Very large file: src/lib/sabflow/types.ts (1699 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/types.ts (1699 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-f8446ab5141b36b9", "name": "Very large file: src/lib/sabflow/forge/stubFallbacks.ts (4710 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/forge/stubFallbacks.ts (4710 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-8c17ec7a87e6bcf6", "name": "Very large file: src/lib/sabflow/forge/blocks/parity4/index.ts (1397 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/forge/blocks/parity4/index.ts (1397 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-69149e1cb4f19979", "name": "Very large file: src/lib/sabflow/docs/nodeDocs.ts (1560 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/docs/nodeDocs.ts (1560 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-f5f618b995252b2f", "name": "Very large file: src/lib/sabflow/n8n/workflow-data-proxy.ts (1604 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/n8n/workflow-data-proxy.ts (1604 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-c58414d53fe74bdc", "name": "Very large file: src/lib/sabflow/n8n/node-helpers.ts (1999 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/n8n/node-helpers.ts (1999 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ce0b8a85e8559c2", "name": "Very large file: src/lib/sabflow/n8n/interfaces.ts (3624 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/n8n/interfaces.ts (3624 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-39d0a5d9c08675c8", "name": "Very large file: src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts (2692 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts (2692 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-69258a8d1c1b62e1", "name": "Very large file: src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/request-helper-functions.ts (168", "shortDescription": {"text": "Very large file: src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/request-helper-functions.ts (1685 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-db7648aff4080656", "name": "Very large file: src/lib/sabflow/oauth/providers.ts (2045 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/oauth/providers.ts (2045 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-d3e04b40ccd909d6", "name": "Very large file: src/lib/sabflow/recipes/seed-pack-4.ts (1604 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/recipes/seed-pack-4.ts (1604 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-3960f5e65ec0ce8d", "name": "Very large file: src/lib/sabflow/blocks/index.ts (1647 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/blocks/index.ts (1647 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-013dfff3f1c86867", "name": "Very large file: src/lib/sabflow/credentials/types.ts (1633 lines)", "shortDescription": {"text": "Very large file: src/lib/sabflow/credentials/types.ts (1633 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "390 test file(s) for 22480 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0d52242120d4f325", "name": "296 TODO/FIXME markers", "shortDescription": {"text": "296 TODO/FIXME markers"}, "fullDescription": {"text": "High count of TODO/FIXME/HACK markers \u2014 track them as issues so they're not forgotten."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-015a862160d16585", "name": "Node manifest has dependencies but no lockfile: sdks/typescript/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: sdks/typescript/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-27fa268f82881663", "name": "Node manifest has dependencies but no lockfile: packages/sabcall-sdk/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/sabcall-sdk/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a28f43a25ee0a7e", "name": "Node manifest has dependencies but no lockfile: services/sabflow-triggers/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: services/sabflow-triggers/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f1688ae3e9a1fdf", "name": "Node manifest has dependencies but no lockfile: services/sabflow-ws/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: services/sabflow-ws/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 663 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 7426 placeholder/mock markers across 2391 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-043a063869cb9f3e", "name": "Commented-code block (7 lines) in ecosystem.config.js:71", "shortDescription": {"text": "Commented-code block (7 lines) in ecosystem.config.js:71"}, "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-2f5b3f80802af786", "name": "Commented-code block (5 lines) in worker.js:235", "shortDescription": {"text": "Commented-code block (5 lines) in worker.js:235"}, "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-2b13e8b07e57feb2", "name": "Commented-code block (5 lines) in fix_fmtdate.js:25", "shortDescription": {"text": "Commented-code block (5 lines) in fix_fmtdate.js:25"}, "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-aa2a8573525f9ab0", "name": "Commented-code block (8 lines) in next.config.js:32", "shortDescription": {"text": "Commented-code block (8 lines) in next.config.js: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-3ce6035ad65dd1f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 next.config.js:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 next.config.js:71"}, "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-cfa58eda7c48fc31", "name": "Commented-code block (5 lines) in tests/sabflow-worker/roundtrip.test.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in tests/sabflow-worker/roundtrip.test.ts: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-d0732e021a24520d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen-rust-client.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen-rust-client.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2ac3ae4808eef5d", "name": "Commented-code block (5 lines) in scripts/zoru-codemod-safe.mjs:161", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/zoru-codemod-safe.mjs:161"}, "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-2c0ebbea931794a7", "name": "Commented-code block (5 lines) in scripts/sabsms-e2e.mjs:347", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/sabsms-e2e.mjs: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-a2198bc884a2ffea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabsms-e2e.mjs:272", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabsms-e2e.mjs:272"}, "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-b4858ad3c2852e6e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/cron-worker.mjs:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/cron-worker.mjs:94"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-75a47249fdc99505", "name": "Legacy-named symbol `file_copy` in scripts/n8n-extract-full.ts:418", "shortDescription": {"text": "Legacy-named symbol `file_copy` in scripts/n8n-extract-full.ts:418"}, "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-6e1cb89aea07a990", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-brand-logos.mjs:264", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-brand-logos.mjs:264"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-09a9e9504d79d254", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_sabdesk_crates.py:23", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_sabdesk_crates.py:23"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb39991ac519cc4b", "name": "Commented-code block (5 lines) in scripts/chunk35_step4.py:22", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/chunk35_step4.py:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d8afc8357e3b9b1a", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_phase3.py:23", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_phase3.py:23"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-be97374fed358742", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_sabsign.py:21", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_sabsign.py:21"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd6802fa870459e4", "name": "Commented-code block (6 lines) in scripts/zoru-codemod.mjs:384", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/zoru-codemod.mjs:384"}, "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-ba4f9b3a6de468e6", "name": "Commented-code block (6 lines) in scripts/zoru-fixer.mjs:88", "shortDescription": {"text": "Commented-code block (6 lines) in scripts/zoru-fixer.mjs:88"}, "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-3c439cef0b9a5628", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabpay-e2e.mjs:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabpay-e2e.mjs:73"}, "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-7f9d65135974420a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabsheet/function-parity.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabsheet/function-parity.ts:67"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0cf5923c08fa9ceb", "name": "Legacy-named symbol `buildYDocFromLegacy` in scripts/sabflow/migrate-docs-to-crdt.mjs:207", "shortDescription": {"text": "Legacy-named symbol `buildYDocFromLegacy` in scripts/sabflow/migrate-docs-to-crdt.mjs:207"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18d57d494f7aa27d", "name": "Commented-code block (5 lines) in scripts/db/backfill-users.mjs:131", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/db/backfill-users.mjs: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-e02f4d8c1ba233d1", "name": "Commented-code block (5 lines) in services/sabflow-ws/test/fuzz/protocol.fuzz.test.ts:540", "shortDescription": {"text": "Commented-code block (5 lines) in services/sabflow-ws/test/fuzz/protocol.fuzz.test.ts:540"}, "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-91af19911ad0a6d3", "name": "Commented-code block (5 lines) in services/sabflow-ws/src/connection.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in services/sabflow-ws/src/connection.ts: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-711dd6787538a551", "name": "Commented-code block (8 lines) in services/sabflow-ws/src/room.ts:163", "shortDescription": {"text": "Commented-code block (8 lines) in services/sabflow-ws/src/room.ts:163"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-360d18943ad235b7", "name": "Commented-code block (7 lines) in services/sabflow-ws/src/logger.ts:52", "shortDescription": {"text": "Commented-code block (7 lines) in services/sabflow-ws/src/logger.ts:52"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5a9643ad2fa9fc78", "name": "Commented-code block (5 lines) in services/sabflow-ws/src/sync/initial.ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in services/sabflow-ws/src/sync/initial.ts:54"}, "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-4a82cffb5e9987ff", "name": "Commented-code block (12 lines) in services/sabflow-ws/src/backplane/redis-backplane.ts:46", "shortDescription": {"text": "Commented-code block (12 lines) in services/sabflow-ws/src/backplane/redis-backplane.ts: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-86e62df3de91a8d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 tools/api-codegen/generate-ts-sdk.ts:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/api-codegen/generate-ts-sdk.ts:132"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b38cc9d092fb7a7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 tools/api-codegen/code-samples.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/api-codegen/code-samples.ts:92"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-02f369864417bc68", "name": "Commented-code block (5 lines) in public/embed.js:170", "shortDescription": {"text": "Commented-code block (5 lines) in public/embed.js:170"}, "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-be42df9829d6501f", "name": "Commented-code block (5 lines) in src/ai/flows/seo-schema-generator.ts:53", "shortDescription": {"text": "Commented-code block (5 lines) in src/ai/flows/seo-schema-generator.ts:53"}, "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-8799338e812de5d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/ai/flows/generate-promo-video.ts:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/ai/flows/generate-promo-video.ts:66"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a1c1b0d2c3e58272", "name": "Commented-code block (5 lines) in src/components/email/inbox/inbox-client.tsx:32", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/email/inbox/inbox-client.tsx: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-9e09ef0f9fcb2dd8", "name": "Commented-code block (5 lines) in src/components/ui/sidebar-component.tsx:499", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ui/sidebar-component.tsx:499"}, "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-0a3ee415fcc251c5", "name": "Commented-code block (8 lines) in src/components/20ui-domain/whatsapp-widget-generator.tsx:144", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/20ui-domain/whatsapp-widget-generator.tsx:144"}, "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-8cd1c2032e3f0653", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/whatsapp.actions.ts:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/whatsapp.actions.ts:43"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0f8313756202ee1c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/project.actions.ts:51", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/project.actions.ts:51"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2021c83cf092a0bf", "name": "Legacy-named symbol `offer_update_v2` in src/components/20ui-domain/bulk-broadcast-form.tsx:80", "shortDescription": {"text": "Legacy-named symbol `offer_update_v2` in src/components/20ui-domain/bulk-broadcast-form.tsx:80"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e10dcdbbfb15561", "name": "Legacy-named symbol `normalizeLegacy` in src/components/20ui-domain/admin-plan-permissions-dialog.tsx:21", "shortDescription": {"text": "Legacy-named symbol `normalizeLegacy` in src/components/20ui-domain/admin-plan-permissions-dialog.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-fb8dba44a347e2e3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/run-cron-jobs-button.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/run-cron-jobs-button.tsx:20"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-36ca3d74dfc38616", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/login-form.tsx:87", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/login-form.tsx:87"}, "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-3eab5fcdcbda6963", "name": "Commented-code block (7 lines) in src/components/20ui-domain/rbac-guard.tsx:82", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/20ui-domain/rbac-guard.tsx:82"}, "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-76eb042a043bc12b", "name": "Legacy-named symbol `normalizeLegacy` in src/components/20ui-domain/plan-permission-selector.tsx:24", "shortDescription": {"text": "Legacy-named symbol `normalizeLegacy` in src/components/20ui-domain/plan-permission-selector.tsx:24"}, "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-2fde6d52596e2521", "name": "Commented-code block (13 lines) in src/components/20ui-domain/templates/ProductPicker.tsx:41", "shortDescription": {"text": "Commented-code block (13 lines) in src/components/20ui-domain/templates/ProductPicker.tsx:41"}, "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-e2145eccd8444012", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/onboarding/steps/account-step.tsx:207", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/onboarding/steps/account-step.tsx:207"}, "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-cfeed55da2ce5c19", "name": "Commented-code block (5 lines) in src/components/sabcrm/use-command-menu.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabcrm/use-command-menu.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-d4f4f932d31b347b", "name": "Commented-code block (6 lines) in src/components/sabcrm/command-menu.tsx:314", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/sabcrm/command-menu.tsx:314"}, "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-4787976cc21a854f", "name": "Commented-code block (5 lines) in src/components/sabcrm/sabcrm-outer-shell.tsx:23", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabcrm/sabcrm-outer-shell.tsx:23"}, "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-fe0984903404d1e5", "name": "Commented-code block (5 lines) in src/components/sabcrm/sabcrm-notify.ts:86", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabcrm/sabcrm-notify.ts:86"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-98c82546ce41ca29", "name": "Commented-code block (7 lines) in src/components/sabcrm/20ui/avatar.tsx:22", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/sabcrm/20ui/avatar.tsx:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-037a19b0ef65bf14", "name": "Commented-code block (7 lines) in src/components/sabcrm/20ui/portal-popover.tsx:164", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/sabcrm/20ui/portal-popover.tsx:164"}, "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-c58f5adf8437277c", "name": "Commented-code block (6 lines) in src/components/sabcrm/20ui/combobox.tsx:144", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/sabcrm/20ui/combobox.tsx:144"}, "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-5bb3f11bd10fcc08", "name": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/index.ts:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/index.ts: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-d2fb165b091bb2b8", "name": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/shell/apps.ts:174", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/shell/apps.ts:174"}, "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-b8d59070e9c96a6c", "name": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/shell/launchpad.tsx:88", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/shell/launchpad.tsx:88"}, "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-d9cf8fa6ccb84aa6", "name": "Commented-code block (10 lines) in src/components/sabcrm/20ui/composites/shell/home-shell.tsx:17", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/sabcrm/20ui/composites/shell/home-shell.tsx:17"}, "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-1fa69ab8f758b10d", "name": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/record/board.tsx:316", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/record/board.tsx:316"}, "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-a42209a54549621a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabcrm/20ui/composites/record/record-timeline-view.tsx:54", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabcrm/20ui/composites/record/record-timeline-view.tsx:54"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9cec9e8d7422f830", "name": "Commented-code block (5 lines) in src/components/builder/editor-layout.tsx:51", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/builder/editor-layout.tsx:51"}, "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-3599150b3812e4a6", "name": "Commented-code block (6 lines) in src/components/crm/entity-list-shell.tsx:86", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/crm/entity-list-shell.tsx:86"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d33e8f75a27c2a4f", "name": "Commented-code block (5 lines) in src/components/crm/settings-deep-page.tsx:750", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/crm/settings-deep-page.tsx:750"}, "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-6499f87c51e24f3e", "name": "Commented-code block (5 lines) in src/components/crm/command-palette.tsx:359", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/crm/command-palette.tsx:359"}, "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-d621fd854c504149", "name": "Commented-code block (5 lines) in src/components/crm/entity-picker.tsx:466", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/crm/entity-picker.tsx:466"}, "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-152b0cc98165793c", "name": "Commented-code block (6 lines) in src/components/crm/inventory/add-warehouse-dialog.tsx:42", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/crm/inventory/add-warehouse-dialog.tsx:42"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-acc57bc3a5ba56cf", "name": "Commented-code block (7 lines) in src/components/crm/live-editor/seed-templates.ts:295", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/crm/live-editor/seed-templates.ts:295"}, "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-289e3a8f74369f8d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/results/FlowResultsClient.tsx:266", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/results/FlowResultsClient.tsx:266"}, "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-fc4b05365dc04615", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/DomainsPanel.tsx:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/DomainsPanel.tsx:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98660dc0b9179d95", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/NotificationsPanel.tsx:229", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/NotificationsPanel.tsx:229"}, "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-5180f66dc3c71e03", "name": "Legacy-named symbol `eleven_monolingual_v1` in src/components/sabflow/panels/blocks/integrations/ElevenLabsSettings.tsx:", "shortDescription": {"text": "Legacy-named symbol `eleven_monolingual_v1` in src/components/sabflow/panels/blocks/integrations/ElevenLabsSettings.tsx:20"}, "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-f5db4d59216651a7", "name": "Commented-code block (5 lines) in src/components/sabflow/panels/blocks/shared/TestNodePanel.tsx:657", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabflow/panels/blocks/shared/TestNodePanel.tsx:657"}, "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-d39e95586a3e6b8e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/blocks/logic/ScriptSettings.tsx:334", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/blocks/logic/ScriptSettings.tsx:334"}, "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-683897b81bf8303a", "name": "Commented-code block (5 lines) in src/components/sabflow/editor/EditorContentCollab.tsx:225", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/EditorContentCollab.tsx:225"}, "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-2028a6fac38bd0a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/editor/EditorContentCollab.tsx:125", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/editor/EditorContentCollab.tsx:125"}, "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-de6c5fafa6e0e352", "name": "Commented-code block (7 lines) in src/components/sabflow/editor/EditorPage.tsx:227", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/sabflow/editor/EditorPage.tsx:227"}, "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-a1fdb3c62af78a29", "name": "Commented-code block (5 lines) in src/components/sabflow/editor/state/use-local-cursor-broadcast.ts:61", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/state/use-local-cursor-broadcast.ts:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7fbc91724f0c1edd", "name": "Commented-code block (5 lines) in src/components/sabflow/editor/state/use-follow-mode.ts:129", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/state/use-follow-mode.ts:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f31528a1aff95218", "name": "Commented-code block (7 lines) in src/components/sabflow/editor/state/use-selection-awareness.ts:197", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/sabflow/editor/state/use-selection-awareness.ts:197"}, "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-abacd6c85fdbe4c5", "name": "Commented-code block (8 lines) in src/components/sabflow/editor/chrome/EditorCollabMount.tsx:223", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/sabflow/editor/chrome/EditorCollabMount.tsx:223"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4986e24beb297181", "name": "Commented-code block (5 lines) in src/components/sabflow/editor/overlays/ConflictBanner.tsx:98", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/overlays/ConflictBanner.tsx:98"}, "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-89ab2575122ee14d", "name": "Commented-code block (7 lines) in src/components/sabflow/editor/overlays/SelectionHighlightLayer.tsx:271", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/sabflow/editor/overlays/SelectionHighlightLayer.tsx:271"}, "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-7031f89803b1cb12", "name": "Commented-code block (5 lines) in src/components/sabflow/canvas/adapter.ts:155", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabflow/canvas/adapter.ts:155"}, "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-5d655dd218d4c89f", "name": "Commented-code block (11 lines) in src/components/sabflow/canvas/nodes/CanvasNodeDefault.tsx:107", "shortDescription": {"text": "Commented-code block (11 lines) in src/components/sabflow/canvas/nodes/CanvasNodeDefault.tsx:107"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3af076cb7d00ccf0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/presence/usePresence.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/presence/usePresence.ts:72"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-63a29faa1d5c6ec9", "name": "Commented-code block (6 lines) in src/components/sabflow/graph/components/nodes/group/GroupNode.tsx:89", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/sabflow/graph/components/nodes/group/GroupNode.tsx:89"}, "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-cbf86023a52d8298", "name": "Commented-code block (5 lines) in src/components/sabflow/graph/components/nodes/block/BlockNodesList.tsx:207", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/sabflow/graph/components/nodes/block/BlockNodesList.tsx:207"}, "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-b9da4b96eb3bcc64", "name": "Legacy-named symbol `welcome_v1` in src/components/sabbigin/automation/rule-builder.tsx:608", "shortDescription": {"text": "Legacy-named symbol `welcome_v1` in src/components/sabbigin/automation/rule-builder.tsx:608"}, "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-56703429ebb73b27", "name": "Commented-code block (7 lines) in src/components/sabfiles/sab-file-picker.tsx:721", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/sabfiles/sab-file-picker.tsx:721"}, "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-9f68a9a6dea76f1c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabfiles/sab-file-picker.tsx:875", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabfiles/sab-file-picker.tsx:875"}, "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-3520bcc68c63f792", "name": "Legacy-named symbol `err__copy` in src/app/error.tsx:63", "shortDescription": {"text": "Legacy-named symbol `err__copy` in src/app/error.tsx:63"}, "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-ef6b2109ff7b391f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/page-client.tsx:2701", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/page-client.tsx:2701"}, "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-90e44cd55dd9c810", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabchat/inbox/_components/inbox-client.tsx:360", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabchat/inbox/_components/inbox-client.tsx:360"}, "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-94d93da83abdd714", "name": "Commented-code block (6 lines) in src/app/invite/[token]/page.tsx:21", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/invite/[token]/page.tsx:21"}, "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-a2548e25bbc58ead", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabchat/[userId]/route.ts:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabchat/[userId]/route.ts:99"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a890c0851cc80fe1", "name": "Commented-code block (7 lines) in src/app/api/push/outlook/route.ts:144", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/push/outlook/route.ts:144"}, "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-dab6077586083230", "name": "Commented-code block (5 lines) in src/app/api/push/gmail/route.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/push/gmail/route.ts:55"}, "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-4274bd3ebbcd00b1", "name": "Commented-code block (6 lines) in src/app/api/auth/admin-logout/route.ts:43", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/auth/admin-logout/route.ts:43"}, "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-5a4c324c2c3777a2", "name": "Commented-code block (5 lines) in src/app/api/auth/two-fa/route.ts:80", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/auth/two-fa/route.ts:80"}, "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-dbf70d8ec6626b12", "name": "Commented-code block (6 lines) in src/app/api/auth/session/route.ts:96", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/auth/session/route.ts:96"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d9267fb8952d31cb", "name": "Commented-code block (8 lines) in src/app/api/v1/messages/send-template/route.ts:28", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/api/v1/messages/send-template/route.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-317edbc322de2aed", "name": "Commented-code block (5 lines) in src/app/api/catalyst/[projectSlug]/functions/[functionName]/route.ts:59", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/catalyst/[projectSlug]/functions/[functionName]/route.ts:59"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0fd7f1ede2309097", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabcrm/ai/route.ts:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabcrm/ai/route.ts:127"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9794d8769434566e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabcrm/oauth/[provider]/callback/route.ts:164", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabcrm/oauth/[provider]/callback/route.ts:164"}, "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-c0c4180fed7d85c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabsense/ingest/route.ts:144", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabsense/ingest/route.ts:144"}, "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-47fa51280aa98246", "name": "Commented-code block (5 lines) in src/app/api/cron/process-webhooks/route.ts:29", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/process-webhooks/route.ts:29"}, "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-d71641ad98b46c67", "name": "Commented-code block (6 lines) in src/app/api/cron/sla-breach-check/route.ts:269", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/cron/sla-breach-check/route.ts:269"}, "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-f90090be9065356d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cron/sync-local-templates/route.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cron/sync-local-templates/route.ts:12"}, "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-97d27915710e7eea", "name": "Commented-code block (5 lines) in src/app/api/cron/webhook-dispatcher/route.ts:116", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/cron/webhook-dispatcher/route.ts:116"}, "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-355c65d7d2f8dde0", "name": "Commented-code block (5 lines) in src/app/api/sabflow/upload/route.ts:98", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sabflow/upload/route.ts:98"}, "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-5087a4704241e21e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabflow/presets/import-openapi/route.ts:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabflow/presets/import-openapi/route.ts:66"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3029220348a0fa79", "name": "Legacy-named symbol `waitForExecutionLegacy` in src/app/api/sabflow/webhook/[id]/route.ts:289", "shortDescription": {"text": "Legacy-named symbol `waitForExecutionLegacy` in src/app/api/sabflow/webhook/[id]/route.ts:289"}, "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-399d67820a42b968", "name": "Commented-code block (5 lines) in src/app/api/sabflow/load-options/buildContext.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sabflow/load-options/buildContext.ts:38"}, "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-81da67143cadeca5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/sabmail-events/[provider]/route.ts:249", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/sabmail-events/[provider]/route.ts:249"}, "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-d443f5c632f0cc31", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/meta/route.ts:254", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/meta/route.ts:254"}, "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-9aad7a6baf3679a4", "name": "Commented-code block (6 lines) in src/app/api/webhooks/sabmail-inbound/route.ts:232", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/webhooks/sabmail-inbound/route.ts:232"}, "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-87ff4f91c8f76735", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabsms/imports/process/route.ts:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabsms/imports/process/route.ts:49"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-edd8b77f813ba8f5", "name": "Commented-code block (5 lines) in src/app/api/sabsms/credits/route.ts:84", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/sabsms/credits/route.ts:84"}, "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-3d3771b55a5b2b6f", "name": "Commented-code block (5 lines) in src/app/dashboard/layout.tsx:59", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/layout.tsx:59"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-510977664303850e", "name": "Commented-code block (6 lines) in src/app/dashboard/settings/crm/import-export/page.tsx:131", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/settings/crm/import-export/page.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-5179a08b92b5911a", "name": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/pipelines/page.tsx:96", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/pipelines/page.tsx:96"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ffb67be3661662a", "name": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/page-layouts/page.tsx:87", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/page-layouts/page.tsx:87"}, "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-d9db4273d0c2bff0", "name": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/templates/page.tsx:79", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/templates/page.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-b453c7eebd5b1c46", "name": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/admin/page.tsx:75", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/admin/page.tsx:75"}, "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-f16c3d5e6297682b", "name": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/automations/page.tsx:147", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/automations/page.tsx:147"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7789fd17beb0a1fc", "name": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/members/page.tsx:428", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/members/page.tsx:428"}, "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-9138ca40a1622969", "name": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/segments/page.tsx:88", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/segments/page.tsx:88"}, "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-c76f826f55590a4b", "name": "Commented-code block (9 lines) in src/app/dashboard/settings/crm/webhooks/page.tsx:123", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/dashboard/settings/crm/webhooks/page.tsx:123"}, "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-ed74bed7d2c205cd", "name": "Commented-code block (8 lines) in src/app/dashboard/settings/crm/data-model/page.tsx:315", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/dashboard/settings/crm/data-model/page.tsx:315"}, "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-9892e64005a08e31", "name": "Legacy-named symbol `settings_webhooks_v1` in src/app/dashboard/settings/webhooks/page.tsx:45", "shortDescription": {"text": "Legacy-named symbol `settings_webhooks_v1` in src/app/dashboard/settings/webhooks/page.tsx:45"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fddc8deea78bb048", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/marketplace/installed/page.tsx:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/marketplace/installed/page.tsx:68"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68b25a57c1af1e49", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/telegram/page.client.tsx:197", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/telegram/page.client.tsx:197"}, "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-583dfc16b5888fb9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/telegram/payments/page.client.tsx:375", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/telegram/payments/page.client.tsx:375"}, "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-0586df78764ab802", "name": "Commented-code block (6 lines) in src/app/dashboard/ad-manager/layout.tsx:187", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/dashboard/ad-manager/layout.tsx:187"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e11cd3399ed3bc27", "name": "Legacy-named symbol `handleDeleteOld` in src/app/dashboard/sabbi/reports/_components/runs-list-client.tsx:64", "shortDescription": {"text": "Legacy-named symbol `handleDeleteOld` in src/app/dashboard/sabbi/reports/_components/runs-list-client.tsx:64"}, "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-95c9bf781b43e15f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/sabflow/audit/_components/audit-client.tsx:149", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/sabflow/audit/_components/audit-client.tsx:149"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b4dc6bce211e9b5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/sabfiles/vault/_components/vault-client.tsx:359", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/sabfiles/vault/_components/vault-client.tsx:359"}, "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-9f0e906fa3f3b67c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/[projectId]/timetravel/actions.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/[projectId]/timetravel/actions.ts:32"}, "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-b56d5e062a2c5412", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/related-keywords/actions.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/related-keywords/actions.ts:32"}, "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-5701e55f36900525", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/keyword-difficulty/actions.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/keyword-difficulty/actions.ts:30"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13bb9aecc4a84b28", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/page-speed/page.tsx:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/page-speed/page.tsx:57"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-162af3ffc421469a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/password-generator/page.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/password-generator/page.tsx:128"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e0a1856c8426b682", "name": "Commented-code block (8 lines) in src/app/s/[shortCode]/page.tsx:44", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/s/[shortCode]/page.tsx:44"}, "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-c3a37f72ab904b14", "name": "Commented-code block (7 lines) in src/app/wachat/page.tsx:219", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/wachat/page.tsx:219"}, "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-3363c000d63afe7e", "name": "Legacy-named symbol `isDeprecated` in src/app/wachat/flows/create/page.tsx:275", "shortDescription": {"text": "Legacy-named symbol `isDeprecated` in src/app/wachat/flows/create/page.tsx:275"}, "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-4d4288e618c51c6b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/wachat/webhooks/actions.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/wachat/webhooks/actions.ts:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cd39ae32e04c8c7e", "name": "Commented-code block (7 lines) in src/app/wachat/_components/ui20-kanban-board.tsx:60", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/wachat/_components/ui20-kanban-board.tsx:60"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27beb8cfb2859f77", "name": "Legacy-named symbol `offer_update_v2` in src/app/wachat/_components/bulk-actions-client.tsx:308", "shortDescription": {"text": "Legacy-named symbol `offer_update_v2` in src/app/wachat/_components/bulk-actions-client.tsx:308"}, "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-f4b942896f628fc0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/nba/page.tsx:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/nba/page.tsx:6"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-beb6c58ceaef7ebe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/offline/page.tsx:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/offline/page.tsx:8"}, "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-d18c485ad566fe4a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/supply/vendors/vendors-client.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/supply/vendors/vendors-client.tsx:18"}, "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-3c2882cc382ec291", "name": "Commented-code block (5 lines) in src/app/sabcrm/supply/items/items-client.tsx:864", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabcrm/supply/items/items-client.tsx:864"}, "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-477769e3906727a8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/bills/page.tsx:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/bills/page.tsx:11"}, "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-903d7abbb8e64892", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/debit-notes/page.tsx:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/debit-notes/page.tsx:12"}, "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-e73a184b2c4b6478", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/credit-notes/page.tsx:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/credit-notes/page.tsx:12"}, "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-9bf8b0905df607c0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/invoices/page.tsx:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/invoices/page.tsx:10"}, "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-28881b6ffee27413", "name": "Commented-code block (5 lines) in src/app/sabcrm/reports/builder/page.tsx:212", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabcrm/reports/builder/page.tsx:212"}, "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-b31662adbdf215a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabmail/inbox/actions.ts:485", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabmail/inbox/actions.ts:485"}, "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-1978389cf35a736d", "name": "Commented-code block (6 lines) in src/app/sabadmin/actions/provision.actions.ts:230", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/sabadmin/actions/provision.actions.ts:230"}, "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-d21a902d4e772370", "name": "Legacy-named symbol `Enterprise_NDA_v2` in src/app/sabsign/form-builder/page.tsx:165", "shortDescription": {"text": "Legacy-named symbol `Enterprise_NDA_v2` in src/app/sabsign/form-builder/page.tsx:165"}, "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-969ea3b083163954", "name": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-accounts.actions.ts:44", "shortDescription": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-accounts.actions.ts:44"}, "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-c8fb75f26fae84b7", "name": "Commented-code block (5 lines) in src/app/actions/whatsapp.actions.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/whatsapp.actions.ts:41"}, "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-1e82761659b6f366", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-forms.actions.ts:109", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-forms.actions.ts:109"}, "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-4f1b46bfbe9477cc", "name": "Commented-code block (7 lines) in src/app/actions/sabchat.actions.ts:15", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/actions/sabchat.actions.ts:15"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-201c31680d3643f1", "name": "Commented-code block (10 lines) in src/app/actions/telegram-contacts.actions.ts:66", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/actions/telegram-contacts.actions.ts:66"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f2e07c73e92b8e13", "name": "Commented-code block (5 lines) in src/app/actions/public-invoice.actions.ts:819", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/public-invoice.actions.ts:819"}, "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-1d0ecfc530291506", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/public-invoice.actions.ts:596", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/public-invoice.actions.ts:596"}, "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-9b2e9324a2eec9c7", "name": "Commented-code block (5 lines) in src/app/actions/plan.actions.ts:41", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/plan.actions.ts:41"}, "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-2532ad0bd7391595", "name": "Commented-code block (7 lines) in src/app/actions/two-fa.actions.ts:264", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/actions/two-fa.actions.ts:264"}, "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-1d1ab44a45e0d6d0", "name": "Legacy-named symbol `sendTelegramBroadcastNowLegacy` in src/app/actions/telegram.actions.ts:540", "shortDescription": {"text": "Legacy-named symbol `sendTelegramBroadcastNowLegacy` in src/app/actions/telegram.actions.ts:540"}, "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-5a70c349fa6a62e7", "name": "Commented-code block (7 lines) in src/app/actions/telegram.actions.ts:539", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/actions/telegram.actions.ts:539"}, "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-7fa32562349d853f", "name": "Commented-code block (8 lines) in src/app/actions/user.actions.ts:222", "shortDescription": {"text": "Commented-code block (8 lines) in src/app/actions/user.actions.ts:222"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a8cdb689b7fa902d", "name": "Commented-code block (6 lines) in src/app/actions/sabcrm-comms.actions.ts:135", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm-comms.actions.ts:135"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-de9462569ceb1f73", "name": "Commented-code block (6 lines) in src/app/actions/sabcrm.actions.ts:254", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm.actions.ts:254"}, "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-104d420cb353f327", "name": "Legacy-named symbol `rustContactDocToLegacy` in src/app/actions/crm.actions.ts:24", "shortDescription": {"text": "Legacy-named symbol `rustContactDocToLegacy` in src/app/actions/crm.actions.ts:24"}, "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-0fbac5d07c876713", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/sabcrm-supply-vendors.actions.types.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/sabcrm-supply-vendors.actions.types.ts:71"}, "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-d6e9cfcdec7cd473", "name": "Commented-code block (6 lines) in src/app/actions/crm-lookup.actions.ts:486", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/crm-lookup.actions.ts:486"}, "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-adfac83dab06c55c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-lookup.actions.ts:113", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-lookup.actions.ts:113"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c5f09d02a7d1ff0c", "name": "Commented-code block (6 lines) in src/app/actions/broadcast.actions.ts:30", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/broadcast.actions.ts:30"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2817ad904ea1ac8f", "name": "Legacy-named symbol `lineItemsLegacy` in src/app/actions/crm-invoices.actions.ts:110", "shortDescription": {"text": "Legacy-named symbol `lineItemsLegacy` in src/app/actions/crm-invoices.actions.ts:110"}, "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-73428ed069a7123e", "name": "Commented-code block (5 lines) in src/app/actions/crm-invoices.actions.ts:236", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/crm-invoices.actions.ts:236"}, "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-f214d1018503d041", "name": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-deals.actions.ts:83", "shortDescription": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-deals.actions.ts:83"}, "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-8646a7ac43f9b05d", "name": "Commented-code block (6 lines) in src/app/actions/crm-portal-auth.actions.ts:161", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/crm-portal-auth.actions.ts:161"}, "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-57c76d2e7b0e21f6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-india-gst.actions.ts:301", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-india-gst.actions.ts:301"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4790c85533b414e", "name": "Commented-code block (5 lines) in src/app/actions/crm-purchase-orders.actions.ts:287", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/crm-purchase-orders.actions.ts:287"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47e584adb29da138", "name": "Commented-code block (6 lines) in src/app/actions/sabcrm-targets.actions.ts:230", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm-targets.actions.ts:230"}, "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-f0c2acb8795838b9", "name": "Legacy-named symbol `rustDeptToLegacy` in src/app/actions/crm-employees.actions.ts:56", "shortDescription": {"text": "Legacy-named symbol `rustDeptToLegacy` in src/app/actions/crm-employees.actions.ts:56"}, "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-594d15a2a0d361dc", "name": "Commented-code block (5 lines) in src/app/actions/crm-employees.actions.ts:50", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/crm-employees.actions.ts:50"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b0ce80e3f23bee64", "name": "Commented-code block (5 lines) in src/app/actions/email.actions.ts:289", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/email.actions.ts:289"}, "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-1b1ef29bda40f44b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/public-lead-form.actions.ts:131", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/public-lead-form.actions.ts:131"}, "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-1722b60dab594e7d", "name": "Legacy-named symbol `deep_copy` in src/app/actions/ad-manager.actions.ts:232", "shortDescription": {"text": "Legacy-named symbol `deep_copy` in src/app/actions/ad-manager.actions.ts:232"}, "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-f581ba4d0da61472", "name": "Commented-code block (7 lines) in src/app/actions/ad-manager.actions.ts:924", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/actions/ad-manager.actions.ts:924"}, "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-94327bfc16901c60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/ad-manager.actions.ts:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/ad-manager.actions.ts:89"}, "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-4faea6ca8ba08ac4", "name": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-products.actions.ts:37", "shortDescription": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-products.actions.ts:37"}, "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-3626ab877edc5d44", "name": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-vendors.actions.ts:50", "shortDescription": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-vendors.actions.ts:50"}, "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-47369c0b4ddcb019", "name": "Commented-code block (6 lines) in src/app/actions/sabcrm-finance.actions.ts:391", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm-finance.actions.ts:391"}, "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-60d7994c57cbd66a", "name": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-leads.actions.ts:58", "shortDescription": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-leads.actions.ts:58"}, "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-ada2a2a551ebf52e", "name": "Legacy-named symbol `rustToLegacy` in src/app/actions/crm-document-templates.actions.ts:43", "shortDescription": {"text": "Legacy-named symbol `rustToLegacy` in src/app/actions/crm-document-templates.actions.ts:43"}, "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-4b80667d0c975571", "name": "Commented-code block (6 lines) in src/app/actions/facebook.actions.ts:2516", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/facebook.actions.ts:2516"}, "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-7aacc5296acfcf67", "name": "Commented-code block (7 lines) in src/app/actions/telegram-extra.actions.ts:420", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/actions/telegram-extra.actions.ts:420"}, "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-b5a2e770b3dd0401", "name": "Commented-code block (5 lines) in src/app/actions/telegram-stickers.actions.ts:224", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/telegram-stickers.actions.ts:224"}, "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-7efdca38ebc692ee", "name": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-pipelines.actions.ts:50", "shortDescription": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-pipelines.actions.ts:50"}, "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-6c3a9170ae274a93", "name": "Commented-code block (5 lines) in src/app/actions/email/templates.actions.ts:133", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/email/templates.actions.ts:133"}, "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-cd8bf88cbc788ea9", "name": "Commented-code block (5 lines) in src/app/actions/worksuite/billing.actions.ts:177", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/worksuite/billing.actions.ts:177"}, "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-e80c5120233732fb", "name": "Commented-code block (7 lines) in src/app/actions/crm/conversions.actions.ts:126", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/actions/crm/conversions.actions.ts:126"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bc17f0312f3f7427", "name": "Commented-code block (5 lines) in src/app/actions/crm/invoices.actions.ts:919", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/crm/invoices.actions.ts:919"}, "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-b9ab562a086165ae", "name": "Commented-code block (6 lines) in src/app/actions/crm/tickets.actions.ts:227", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/crm/tickets.actions.ts:227"}, "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-f5cae3c83df0cbab", "name": "Commented-code block (6 lines) in src/app/actions/crm/leaves.actions.ts:266", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/actions/crm/leaves.actions.ts:266"}, "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-c61cf2f90beb096f", "name": "Commented-code block (5 lines) in src/app/actions/crm/rfqs.actions.ts:289", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/actions/crm/rfqs.actions.ts:289"}, "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-3851b113c12ae986", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/flow/executions/page.tsx:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/flow/executions/page.tsx:85"}, "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-7af77b2d7c1e6454", "name": "Commented-code block (10 lines) in src/app/sites/[[...path]]/route.ts:72", "shortDescription": {"text": "Commented-code block (10 lines) in src/app/sites/[[...path]]/route.ts:72"}, "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-9803c7ade0537318", "name": "Commented-code block (6 lines) in src/app/sabsms/analytics/aggregations.ts:345", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/sabsms/analytics/aggregations.ts:345"}, "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-7adaeaaf5faf2546", "name": "Commented-code block (5 lines) in src/app/sabsms/analytics/cost/page.tsx:9", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabsms/analytics/cost/page.tsx: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-c0d736ab99665694", "name": "Commented-code block (5 lines) in src/app/sabsms/send/actions.ts:208", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabsms/send/actions.ts:208"}, "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-c8d9c357ba57e57e", "name": "Legacy-named symbol `setDeprecated` in src/app/sabsms/templates/actions.ts:310", "shortDescription": {"text": "Legacy-named symbol `setDeprecated` in src/app/sabsms/templates/actions.ts:310"}, "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-dae7046b218ff198", "name": "Legacy-named symbol `setDeprecated` in src/app/sabsms/templates/templates-table.tsx:58", "shortDescription": {"text": "Legacy-named symbol `setDeprecated` in src/app/sabsms/templates/templates-table.tsx:58"}, "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-6d2e0613bac5ba1c", "name": "Commented-code block (5 lines) in src/app/sabsms/templates/[id]/preview.tsx:31", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabsms/templates/[id]/preview.tsx: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-3913f9b6c4801c25", "name": "Commented-code block (6 lines) in src/app/sabsms/campaigns/actions.ts:727", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/sabsms/campaigns/actions.ts:727"}, "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-5d4524b56fc0621b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabsms/campaigns/actions.ts:999", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabsms/campaigns/actions.ts:999"}, "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-a942609688083df1", "name": "Commented-code block (5 lines) in src/app/sabsms/ab-tests/actions.ts:565", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabsms/ab-tests/actions.ts:565"}, "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-b8a41d8ea5bcac91", "name": "Commented-code block (7 lines) in src/app/sabsms/inbox/inbox-layout.tsx:226", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/sabsms/inbox/inbox-layout.tsx:226"}, "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-5b97d922c3740fed", "name": "Commented-code block (5 lines) in src/app/sabsms/inbox/actions.ts:358", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabsms/inbox/actions.ts:358"}, "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-403bbaf532248537", "name": "Commented-code block (5 lines) in src/app/sabsms/_components/sabsms-sidebar-config.ts:27", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/sabsms/_components/sabsms-sidebar-config.ts:27"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8de0ce8bb299d300", "name": "Commented-code block (6 lines) in src/lib/auth.ts:19", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/auth.ts:19"}, "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-a25b10b35d841bbb", "name": "Commented-code block (6 lines) in src/lib/definitions.ts:20", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/definitions.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3b5556d6450ff33f", "name": "Commented-code block (9 lines) in src/lib/server-cache.ts:9", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/server-cache.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-fb8a088a75be9c9e", "name": "Commented-code block (5 lines) in src/lib/webhook-processor.ts:1344", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/webhook-processor.ts:1344"}, "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-367a88f0c29479de", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabshop/payments.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabshop/payments.ts:92"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0f34749a04b8fce6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabshop/shipping.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabshop/shipping.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9da8e46dc5537e5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/integrations/google-calendar.ts:223", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/integrations/google-calendar.ts:223"}, "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-a2d1fd061122a1fa", "name": "Commented-code block (7 lines) in src/lib/integrations/imap-tickets.ts:132", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/integrations/imap-tickets.ts:132"}, "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-19c4f2a6d73aded0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/integrations/quickbooks/api.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/integrations/quickbooks/api.ts:68"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b84479ccc7267c09", "name": "Commented-code block (7 lines) in src/lib/__tests__/crm-lineage-chain.smoke.test.ts:270", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/__tests__/crm-lineage-chain.smoke.test.ts:270"}, "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-357e5c4f4f1dbccb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo-tools/api-client.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo-tools/api-client.ts:17"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6068a96df711533", "name": "Commented-code block (13 lines) in src/lib/india-tax/e-invoice-providers.ts:205", "shortDescription": {"text": "Commented-code block (13 lines) in src/lib/india-tax/e-invoice-providers.ts:205"}, "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-a79171ce311375c3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/india-tax/e-invoice-providers.ts:209", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/india-tax/e-invoice-providers.ts:209"}, "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-534f31e37954b23c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/embeddings.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/embeddings.ts:12"}, "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-b514361039c778e4", "name": "Commented-code block (5 lines) in src/lib/marketplace/lifecycle.ts:70", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/marketplace/lifecycle.ts:70"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-724fa7b74633b6c4", "name": "Commented-code block (5 lines) in src/lib/data-fabric/sync.ts:104", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/data-fabric/sync.ts:104"}, "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-1f17b60c37caf847", "name": "Commented-code block (5 lines) in src/lib/api/oauth-scopes.ts:20", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api/oauth-scopes.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-48e76400e1413e22", "name": "Commented-code block (6 lines) in src/lib/rust-client/wachat-features.ts:47", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/rust-client/wachat-features.ts:47"}, "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-b01281a2815fcbdd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-analytics.ts:317", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-analytics.ts:317"}, "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-68dd958d5da61ce9", "name": "Commented-code block (5 lines) in src/lib/rust-client/telegram-flows.ts:215", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rust-client/telegram-flows.ts:215"}, "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-0d938c17953d4709", "name": "Commented-code block (5 lines) in src/lib/rust-client/wachat-auto-reply-settings.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rust-client/wachat-auto-reply-settings.ts:26"}, "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-64315bf8b741c7fc", "name": "Commented-code block (5 lines) in src/lib/rust-client/telegram-auto-reply.ts:386", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rust-client/telegram-auto-reply.ts:386"}, "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-eed36b5d3b8b58e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-stories.ts:369", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-stories.ts:369"}, "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-f873dd1138c83478", "name": "Commented-code block (5 lines) in src/lib/rust-client/session.ts:13", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rust-client/session.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-91a2e2739dcc5e9f", "name": "Commented-code block (8 lines) in src/lib/rust-client/wachat-analytics.ts:145", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/rust-client/wachat-analytics.ts:145"}, "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-58ce11e6ec37f5d9", "name": "Commented-code block (6 lines) in src/lib/rust-client/wachat-number-routing.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/rust-client/wachat-number-routing.ts:22"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c6219434c90f0b6", "name": "Commented-code block (5 lines) in src/lib/rust-client/wachat-facebook-messenger-profile.ts:248", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rust-client/wachat-facebook-messenger-profile.ts:248"}, "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-5a47055fcf57fb83", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-ads.ts:187", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-ads.ts:187"}, "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-8c5e7244de41ede1", "name": "Commented-code block (5 lines) in src/lib/rust-client/wachat-instagram.ts:37", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/rust-client/wachat-instagram.ts:37"}, "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-7c816d4d200bb64f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-commands.ts:317", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-commands.ts:317"}, "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-6901ef8c423367f2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-contacts.ts:331", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-contacts.ts:331"}, "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-aaf1d71878e16d91", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/telegram/bot-api.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/telegram/bot-api.ts:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8c6e47e991db1516", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/wachat/ai/client.ts:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/wachat/ai/client.ts:73"}, "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-dd3d4ff0c66f6c0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/n8n/nodeExecutors/whatsappExecutor.ts:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/n8n/nodeExecutors/whatsappExecutor.ts:70"}, "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-e49f3f7cdeef0218", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsheet/connections/run.server.ts:181", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsheet/connections/run.server.ts:181"}, "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-4a660bed4c348724", "name": "Legacy-named symbol `allowDeprecated` in src/lib/sabcrm/value-sets.ts:52", "shortDescription": {"text": "Legacy-named symbol `allowDeprecated` in src/lib/sabcrm/value-sets.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-b9cd3b6360ca1637", "name": "Commented-code block (5 lines) in src/lib/sabcrm/twenty-metadata.ts:32", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/twenty-metadata.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-9fc065de02e793d9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/booking.server.ts:418", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/booking.server.ts:418"}, "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-30bf279be841e35e", "name": "Commented-code block (5 lines) in src/lib/sabcrm/records.server.ts:386", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/records.server.ts:386"}, "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-aa011a3ece969e71", "name": "Commented-code block (7 lines) in src/lib/sabcrm/ann-lsh.ts:286", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabcrm/ann-lsh.ts:286"}, "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-022877730c3eaa8a", "name": "Commented-code block (8 lines) in src/lib/sabcrm/runtime.ts:553", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/sabcrm/runtime.ts:553"}, "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-d4391172bd6cef12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/runtime.ts:536", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/runtime.ts:536"}, "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-8b7ca2e7c40f3b2c", "name": "Commented-code block (7 lines) in src/lib/sabcrm/objects.server.ts:271", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabcrm/objects.server.ts:271"}, "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-3c7dcdb31080e17a", "name": "Commented-code block (8 lines) in src/lib/sabcrm/scheduler.ts:1382", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/sabcrm/scheduler.ts:1382"}, "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-cf7dc867c8445ac8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/scheduler.ts:527", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/scheduler.ts:527"}, "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-2170b16b944d0c5b", "name": "Commented-code block (8 lines) in src/lib/sabcrm/access-enforcement.server.ts:245", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/sabcrm/access-enforcement.server.ts:245"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73e6bb00bb9b9711", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/embeddings.server.ts:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/embeddings.server.ts:96"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d2cd28ba73522a46", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/ai-llm.server.ts:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/ai-llm.server.ts:83"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-76357948da0edfa2", "name": "Commented-code block (5 lines) in src/lib/sabcrm/email-inbound.ts:241", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/email-inbound.ts:241"}, "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-6bf8c86a1b0ca13a", "name": "Commented-code block (5 lines) in src/lib/sabcrm/db.ts:367", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/db.ts:367"}, "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-bf9442ec8d1f83c7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/attribution.server.ts:292", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/attribution.server.ts:292"}, "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-d127f018c72c79b2", "name": "Commented-code block (6 lines) in src/lib/sabcrm/__tests__/gate-security.test.ts:104", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabcrm/__tests__/gate-security.test.ts:104"}, "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-c89d37190949aa59", "name": "Legacy-named symbol `allowDeprecated` in src/lib/sabcrm/__tests__/value-sets.test.ts:56", "shortDescription": {"text": "Legacy-named symbol `allowDeprecated` in src/lib/sabcrm/__tests__/value-sets.test.ts:56"}, "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-1f7cf468ae146a09", "name": "Legacy-named symbol `onlyOld` in src/lib/sabcrm/__tests__/notifications.test.ts:245", "shortDescription": {"text": "Legacy-named symbol `onlyOld` in src/lib/sabcrm/__tests__/notifications.test.ts:245"}, "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-85acea41314b8a77", "name": "Legacy-named symbol `RecordGqlFieldsDeprecated` in src/lib/sabcrm/shared/src/types/RecordGqlOperationGqlRecordFields.ts:", "shortDescription": {"text": "Legacy-named symbol `RecordGqlFieldsDeprecated` in src/lib/sabcrm/shared/src/types/RecordGqlOperationGqlRecordFields.ts:1"}, "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-fea1c2acb1e4afe6", "name": "Legacy-named symbol `RecordGqlFieldsDeprecated` in src/lib/sabcrm/shared/src/types/RecordGqlFieldsDeprecated.ts:4", "shortDescription": {"text": "Legacy-named symbol `RecordGqlFieldsDeprecated` in src/lib/sabcrm/shared/src/types/RecordGqlFieldsDeprecated.ts:4"}, "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-ea9f34da2c43c394", "name": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/types/StepFilters.ts:1", "shortDescription": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/types/StepFilters.ts:1"}, "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-2c180d70949e724f", "name": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/types/ViewFilterOperandDeprecated.ts:1", "shortDescription": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/types/ViewFilterOperandDeprecated.ts:1"}, "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-7d17f68aa0113689", "name": "Commented-code block (7 lines) in src/lib/sabcrm/shared/src/constants/ObjectsWithChannelVisibilityConstraints.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabcrm/shared/src/constants/ObjectsWithChannelVisibilityConstraints.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-2486f1ff7d1b8cf5", "name": "Commented-code block (5 lines) in src/lib/sabcrm/shared/src/utils/applyDiff.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/shared/src/utils/applyDiff.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-1decabdb928c0361", "name": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/utils/filter/utils/convert-view-filter-op", "shortDescription": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/utils/filter/utils/convert-view-filter-operand-to-core-operand.util.ts:2"}, "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-971d2a1738c21ee9", "name": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/workflow/schemas/step-filter-schema.ts:3", "shortDescription": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/workflow/schemas/step-filter-schema.ts:3"}, "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-ae5b108c31cecb73", "name": "Commented-code block (5 lines) in src/lib/sabcrm/shared/src/application/workflowActionTriggerSettingsType.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/shared/src/application/workflowActionTriggerSettingsType.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13efaaaf0e0079e0", "name": "Commented-code block (6 lines) in src/lib/sabcrm/shared/src/application/appConnectionType.ts:21", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabcrm/shared/src/application/appConnectionType.ts:21"}, "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-708489b3ce43fca5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/identity/sso.ts:211", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/identity/sso.ts:211"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5ca65556c0397b52", "name": "Legacy-named symbol `wayOld` in src/lib/identity/__tests__/totp.test.ts:73", "shortDescription": {"text": "Legacy-named symbol `wayOld` in src/lib/identity/__tests__/totp.test.ts:73"}, "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-c56bb77853461f51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/billing/connect.ts:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/billing/connect.ts:63"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d5e3989009cba5cd", "name": "Legacy-named symbol `credit_unused_old` in src/lib/billing/proration.ts:8", "shortDescription": {"text": "Legacy-named symbol `credit_unused_old` in src/lib/billing/proration.ts:8"}, "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-acf1cc8502fc5ebf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/ai.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/ai.ts:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f215058e77a0d19", "name": "Commented-code block (5 lines) in src/lib/sabmail/hosted-provider.ts:61", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabmail/hosted-provider.ts:61"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-054a29f0128f5b58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/hosted-provider.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/hosted-provider.ts:8"}, "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-bbc79c092f3c2e2e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/oauth.ts:182", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/oauth.ts:182"}, "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-684cbe30fd5e7309", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/engine-client.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/engine-client.ts:6"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d0d802568f6d7e38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/providers/imap.ts:288", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/providers/imap.ts:288"}, "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-b5773cbcc1e1b328", "name": "Legacy-named symbol `gmail_v1` in src/lib/sabmail/providers/gmail.ts:3", "shortDescription": {"text": "Legacy-named symbol `gmail_v1` in src/lib/sabmail/providers/gmail.ts:3"}, "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-a9c1804b4a49a1d4", "name": "Commented-code block (5 lines) in src/lib/sabmail/providers/graph.ts:579", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabmail/providers/graph.ts:579"}, "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-61b7deed55f062b8", "name": "Commented-code block (5 lines) in src/lib/sabmail/providers/types.ts:169", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabmail/providers/types.ts:169"}, "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-ba52d391e5b6ed2d", "name": "Legacy-named symbol `last_copy` in src/lib/agents/agents/copywriter.ts:31", "shortDescription": {"text": "Legacy-named symbol `last_copy` in src/lib/agents/agents/copywriter.ts:31"}, "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-98ebd799521ec82e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsign/pdf/sabfiles-io.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsign/pdf/sabfiles-io.ts:19"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9164628f4771216b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api-platform/sample-builder.ts:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api-platform/sample-builder.ts:99"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2fa47e86f3f5a2d1", "name": "Commented-code block (5 lines) in src/lib/api-platform/__tests__/server-only-shim.cjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/api-platform/__tests__/server-only-shim.cjs: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-66fd55a157f34072", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/app-presets/client.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/app-presets/client.ts:50"}, "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-3f7875fb8e76c90b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/nocodb.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/nocodb.ts:33"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ff6c3642b74e6259", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/openAi.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/openAi.ts:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-704fdde0085e7306", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/calCom.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/calCom.ts:29"}, "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-f170b42d49bc9f51", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/anthropicAi.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/anthropicAi.ts:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-44c1fc79a9abcba9", "name": "Legacy-named symbol `eleven_monolingual_v1` in src/lib/sabflow/integrations/elevenlabs.ts:14", "shortDescription": {"text": "Legacy-named symbol `eleven_monolingual_v1` in src/lib/sabflow/integrations/elevenlabs.ts:14"}, "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-614d8a0753cc130f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/googleSheets.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/googleSheets.ts:29"}, "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-907bafc75239ff43", "name": "Commented-code block (14 lines) in src/lib/sabflow/__tests__/crdt-fuzz.test.ts:125", "shortDescription": {"text": "Commented-code block (14 lines) in src/lib/sabflow/__tests__/crdt-fuzz.test.ts:125"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a976a39e0f4194c4", "name": "Legacy-named symbol `set_v1` in src/lib/sabflow/forge/index.ts:604", "shortDescription": {"text": "Legacy-named symbol `set_v1` in src/lib/sabflow/forge/index.ts:604"}, "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-53cb6a19a1c8b163", "name": "Commented-code block (5 lines) in src/lib/sabflow/forge/helpers.ts:252", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/forge/helpers.ts:252"}, "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-15ef0057ec3d7d9a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/helpers.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/helpers.ts:8"}, "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-8d37292051f7cb01", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/metadata-client.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/metadata-client.ts:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-956eebf0701c4311", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/types.ts:254", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/types.ts:254"}, "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-bcffc737a09b302f", "name": "Legacy-named symbol `forge_test_legacy` in src/lib/sabflow/forge/__tests__/multi-output.test.ts:63", "shortDescription": {"text": "Legacy-named symbol `forge_test_legacy` in src/lib/sabflow/forge/__tests__/multi-output.test.ts:63"}, "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-3cf2f24173dfdefd", "name": "Commented-code block (5 lines) in src/lib/sabflow/forge/blocks/agent-tool.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/forge/blocks/agent-tool.ts: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-041447bc4edbfe3c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/sendgrid.ts:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/sendgrid.ts:59"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a75f0b386390178", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_openai_tts.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_openai_tts.ts:25"}, "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-0d5b8537d707deb4", "name": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/sabflow/forge/blocks/n8n/mass_f/audio_elevenlabs_tts.ts:21", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/sabflow/forge/blocks/n8n/mass_f/audio_elevenlabs_tts.ts: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-62230f6f45f03cb7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_elevenlabs_tts.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_elevenlabs_tts.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9238b3a82f3631bb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_whisper.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_whisper.ts:26"}, "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-353c3d0e30e77d0b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/image_stable_diffusion.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/image_stable_diffusion.ts:33"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ce8ebdcc1a71ca79", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/ai/openai_ext.ts:157", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/ai/openai_ext.ts:157"}, "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-3e2682e10cfb9355", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/ai/mindee.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/ai/mindee.ts:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-303c61c5f01b00c4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_binary_files.ts:104", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_binary_files.ts:104"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1e1f502d8d8263ec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_write_file.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_write_file.ts:80"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d767349407f8edf1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/write_binary_file.ts:171", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/write_binary_file.ts:171"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d50da1ca2f75bc42", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/spreadsheet_file.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/spreadsheet_file.ts:92"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc21646cfdb507a5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_binary_file.ts:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_binary_file.ts:67"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dbd18d8c730ee268", "name": "Commented-code block (7 lines) in src/lib/sabflow/forge/blocks/n8n/generic/if.ts:54", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/forge/blocks/n8n/generic/if.ts:54"}, "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-980654cc19fd61d5", "name": "Legacy-named symbol `forge_set_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/set_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_set_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/set_v1.ts:6"}, "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-5e28436f54c8a9be", "name": "Legacy-named symbol `forge_set_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/set_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_set_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/set_v2.ts:6"}, "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-6b2510a5b494d04a", "name": "Legacy-named symbol `forge_switch_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/switch_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_switch_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/switch_v1.ts:6"}, "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-d1587e0a01552029", "name": "Legacy-named symbol `forge_filter_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/filter_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_filter_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/filter_v1.ts:6"}, "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-e238f7d4b50d279d", "name": "Legacy-named symbol `forge_switch_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/switch_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_switch_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/switch_v2.ts:6"}, "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-af758c18d28b4cee", "name": "Legacy-named symbol `forge_merge_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/merge_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_merge_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/merge_v2.ts:6"}, "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-698f4346b4312cf8", "name": "Legacy-named symbol `forge_merge_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/merge_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_merge_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/merge_v1.ts:6"}, "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-d1e8b0a81d3a5e9f", "name": "Legacy-named symbol `forge_http_request_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/http_request_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_http_request_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/http_request_v2.ts:6"}, "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-949612332f6c88dd", "name": "Legacy-named symbol `forge_if_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/if_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_if_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/if_v1.ts:6"}, "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-206318d1e376d4df", "name": "Legacy-named symbol `forge_http_request_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/http_request_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_http_request_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/http_request_v1.ts:6"}, "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-97c7ab5e771ebfc0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_h/sdxl.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_h/sdxl.ts:36"}, "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-524d6341727c80b2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/triggers_as_actions/email_read_imap.ts:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/triggers_as_actions/email_read_imap.ts:95"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d16ee9563b317c3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/crm/zoho_crm.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/crm/zoho_crm.ts:17"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e8634bd9bfd352dc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/devops/jenkins.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/devops/jenkins.ts:14"}, "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-6bc8f389bda83178", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/tools/quickchart.ts:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/tools/quickchart.ts:81"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67defc61771ae2e1", "name": "Legacy-named symbol `forge_gmail_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/gmail_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_gmail_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/gmail_v1.ts:6"}, "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-aa0b524b110fbf22", "name": "Legacy-named symbol `forge_hubspot_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/hubspot_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_hubspot_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/hubspot_v2.ts:6"}, "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-f20586bbcd7e912d", "name": "Legacy-named symbol `forge_emailimap_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/emailimap_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_emailimap_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/emailimap_v2.ts:6"}, "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-a32266f271efb9e3", "name": "Legacy-named symbol `forge_notion_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/notion_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_notion_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/notion_v2.ts:6"}, "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-e098f9dfc12d3e8a", "name": "Legacy-named symbol `forge_todoist_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/todoist_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_todoist_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/todoist_v1.ts:6"}, "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-232b14ac8e215543", "name": "Legacy-named symbol `forge_highlevel_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/highlevel_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_highlevel_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/highlevel_v2.ts:6"}, "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-5f6c122152726d79", "name": "Legacy-named symbol `forge_seatable_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/seatable_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_seatable_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/seatable_v2.ts:6"}, "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-797103552c2af4ce", "name": "Legacy-named symbol `forge_mailerlite_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/mailerlite_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_mailerlite_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/mailerlite_v2.ts:6"}, "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-b9a5e5dd8c5c834b", "name": "Legacy-named symbol `forge_syncromsp_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/syncromsp_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_syncromsp_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/syncromsp_v1.ts:6"}, "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-5b1d3ec286509eec", "name": "Legacy-named symbol `forge_highlevel_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/highlevel_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_highlevel_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/highlevel_v1.ts:6"}, "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-e081099c70d386a7", "name": "Legacy-named symbol `forge_airtable_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/airtable_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_airtable_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/airtable_v2.ts:6"}, "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-1ffa992dd0257b4c", "name": "Legacy-named symbol `forge_pipedrive_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/pipedrive_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_pipedrive_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/pipedrive_v2.ts:6"}, "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-078a4672dfc2e1ba", "name": "Legacy-named symbol `forge_todoist_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/todoist_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_todoist_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/todoist_v2.ts:6"}, "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-df8b98295b13027c", "name": "Legacy-named symbol `forge_bamboohr_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/bamboohr_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_bamboohr_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/bamboohr_v1.ts:6"}, "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-d97b3d73a98cbe57", "name": "Legacy-named symbol `forge_emailimap_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/emailimap_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_emailimap_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/emailimap_v1.ts:6"}, "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-8876ec8c14703136", "name": "Legacy-named symbol `forge_discord_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/discord_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_discord_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/discord_v2.ts:6"}, "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-f9147bd0c6b90fe9", "name": "Legacy-named symbol `forge_lemlist_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/lemlist_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_lemlist_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/lemlist_v2.ts:6"}, "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-e29dc013732f0274", "name": "Legacy-named symbol `forge_seatable_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/seatable_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_seatable_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/seatable_v1.ts:6"}, "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-15ab60169abb6fce", "name": "Legacy-named symbol `forge_webflow_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/webflow_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_webflow_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/webflow_v2.ts:6"}, "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-66aae6f96763deec", "name": "Legacy-named symbol `forge_splunk_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/splunk_v2.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_splunk_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/splunk_v2.ts:6"}, "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-6a2258ab174e4ae1", "name": "Legacy-named symbol `forge_airtable_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/airtable_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_airtable_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/airtable_v1.ts:6"}, "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-bceeaa840bf0e6db", "name": "Legacy-named symbol `forge_notion_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/notion_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_notion_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/notion_v1.ts:6"}, "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-da026df8e2aa4536", "name": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/slack_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/slack_v1.ts:6"}, "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-9150cb2793afa7b0", "name": "Legacy-named symbol `forge_twitter_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/twitter_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_twitter_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/twitter_v1.ts:6"}, "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-3bc7b859b36608e9", "name": "Legacy-named symbol `forge_hubspot_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/hubspot_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_hubspot_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/hubspot_v1.ts:6"}, "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-36dc287bc81a884b", "name": "Legacy-named symbol `forge_discord_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/discord_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_discord_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/discord_v1.ts:6"}, "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-51da85ee2e41ae20", "name": "Legacy-named symbol `forge_pipedrive_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/pipedrive_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_pipedrive_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/pipedrive_v1.ts:6"}, "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-0170733e6b312160", "name": "Legacy-named symbol `forge_mattermost_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/mattermost_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_mattermost_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/mattermost_v1.ts:6"}, "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-ff02efe965d12407", "name": "Legacy-named symbol `forge_splunk_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/splunk_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_splunk_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/splunk_v1.ts:6"}, "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-c03333f31e2e3b3c", "name": "Legacy-named symbol `forge_lemlist_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/lemlist_v1.ts:6", "shortDescription": {"text": "Legacy-named symbol `forge_lemlist_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/lemlist_v1.ts:6"}, "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-cd8ff8c79f737fd7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/utilities/edit_image.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/utilities/edit_image.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bec7f4c2397665df", "name": "Legacy-named symbol `forge_lm_ollama_legacy` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_ollama_legacy.ts:44", "shortDescription": {"text": "Legacy-named symbol `forge_lm_ollama_legacy` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_ollama_legacy.ts:44"}, "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-541beb3890a449f7", "name": "Legacy-named symbol `chatcompletion_v2` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_chat_minimax.ts:4", "shortDescription": {"text": "Legacy-named symbol `chatcompletion_v2` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_chat_minimax.ts:4"}, "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-85a51c43c6f366d6", "name": "Legacy-named symbol `forge_lm_openai_legacy` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_openai_legacy.ts:39", "shortDescription": {"text": "Legacy-named symbol `forge_lm_openai_legacy` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_openai_legacy.ts:39"}, "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-5e8c1a9f0f776a38", "name": "Legacy-named symbol `forge_filter_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/filter_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_filter_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/filter_v2.ts:14"}, "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-309333d384dadb3a", "name": "Legacy-named symbol `forge_datetime_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/datetime_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_datetime_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/datetime_v2.ts:14"}, "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-25c54dd36aea4e59", "name": "Legacy-named symbol `forge_emailsend_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/emailsend_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_emailsend_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/emailsend_v2.ts:14"}, "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-ba7ae7fa277d04dc", "name": "Legacy-named symbol `forge_if_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/if_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_if_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/if_v2.ts:14"}, "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-7c4949e6461b3b70", "name": "Legacy-named symbol `forge_emailsend_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/emailsend_v1.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_emailsend_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/emailsend_v1.ts:14"}, "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-8502847389e8bb0a", "name": "Legacy-named symbol `forge_datetime_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/datetime_v1.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_datetime_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/datetime_v1.ts:14"}, "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-5e85e0372f1c1d9f", "name": "Legacy-named symbol `forge_itemlists_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/itemlists_v1.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_itemlists_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/itemlists_v1.ts:14"}, "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-683b1d2623ddf3ad", "name": "Legacy-named symbol `forge_splitinbatches_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/splitinbatches_v1.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_splitinbatches_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/splitinbatches_v1.ts:14"}, "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-8547abe6e2163afd", "name": "Legacy-named symbol `forge_splitinbatches_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/splitinbatches_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_splitinbatches_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/splitinbatches_v2.ts:14"}, "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-11b685cec2d33722", "name": "Legacy-named symbol `forge_crypto_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/crypto_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_crypto_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/crypto_v2.ts:14"}, "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-e8e2cf18d1238500", "name": "Legacy-named symbol `forge_removeduplicates_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/removeduplicates_v1.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_removeduplicates_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/removeduplicates_v1.ts:14"}, "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-8d74e5c4ca3bbba2", "name": "Legacy-named symbol `forge_spreadsheetfile_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/spreadsheetfile_v1.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_spreadsheetfile_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/spreadsheetfile_v1.ts:14"}, "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-e372f39f2b851095", "name": "Legacy-named symbol `forge_itemlists_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/itemlists_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_itemlists_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/itemlists_v2.ts:14"}, "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-0d95ce3ffdcdb897", "name": "Legacy-named symbol `forge_crypto_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/crypto_v1.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_crypto_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/crypto_v1.ts:14"}, "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-a0f6758d10ab6d6f", "name": "Legacy-named symbol `forge_removeduplicates_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/removeduplicates_v2.ts:14", "shortDescription": {"text": "Legacy-named symbol `forge_removeduplicates_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/removeduplicates_v2.ts:14"}, "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-f7549591f1ba628e", "name": "Legacy-named symbol `run_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/function_legacy.ts:14", "shortDescription": {"text": "Legacy-named symbol `run_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/function_legacy.ts:14"}, "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-3482175c6d02c3be", "name": "Legacy-named symbol `transform_v1` in src/lib/sabflow/forge/blocks/n8n/deprecated/ai_transform_v1.ts:21", "shortDescription": {"text": "Legacy-named symbol `transform_v1` in src/lib/sabflow/forge/blocks/n8n/deprecated/ai_transform_v1.ts: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-a00460bd54258f8b", "name": "Legacy-named symbol `forge_function_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/legacy_variants_info.ts:74", "shortDescription": {"text": "Legacy-named symbol `forge_function_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/legacy_variants_info.ts:74"}, "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-544db170b6554e80", "name": "Legacy-named symbol `forge_function_item_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/function_item_legacy.ts:", "shortDescription": {"text": "Legacy-named symbol `forge_function_item_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/function_item_legacy.ts:78"}, "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-f3d9a865789d6025", "name": "Legacy-named symbol `forge_ms_outlook_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_outlook_v1.ts:87", "shortDescription": {"text": "Legacy-named symbol `forge_ms_outlook_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_outlook_v1.ts:87"}, "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-2f22635c3b14ad18", "name": "Commented-code block (5 lines) in src/lib/sabflow/forge/blocks/n8n/mass_c/mailchimp_ext.ts:84", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/forge/blocks/n8n/mass_c/mailchimp_ext.ts:84"}, "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-a072c3f1b965ec45", "name": "Legacy-named symbol `forge_ms_teams_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_teams_v1.ts:64", "shortDescription": {"text": "Legacy-named symbol `forge_ms_teams_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_teams_v1.ts:64"}, "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-d7b09a822b3130f5", "name": "Legacy-named symbol `forge_ms_excel_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_excel_v1.ts:76", "shortDescription": {"text": "Legacy-named symbol `forge_ms_excel_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_excel_v1.ts:76"}, "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-fd092146e748264c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/storage/nextcloud.ts:95", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/storage/nextcloud.ts:95"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-03a38f15f940e83a", "name": "Legacy-named symbol `create_folder_v2` in src/lib/sabflow/forge/blocks/n8n/storage/dropbox.ts:12", "shortDescription": {"text": "Legacy-named symbol `create_folder_v2` in src/lib/sabflow/forge/blocks/n8n/storage/dropbox.ts:12"}, "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-cbed4881ce8c7da5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/_shared/http.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/_shared/http.ts:46"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3b4fcbac20a9635f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/client/telemetry.ts:246", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/client/telemetry.ts:246"}, "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-b88c3ddb946ea6c7", "name": "Commented-code block (6 lines) in src/lib/sabflow/client/usePresence.ts:249", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabflow/client/usePresence.ts:249"}, "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-dda6e3ef0d131b2b", "name": "Commented-code block (9 lines) in src/lib/sabflow/client/optimistic.ts:366", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/sabflow/client/optimistic.ts:366"}, "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-0fc509cd517bfd47", "name": "Commented-code block (6 lines) in src/lib/sabflow/client/schema-migrate.ts:98", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabflow/client/schema-migrate.ts:98"}, "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-6515c2543ec10bc4", "name": "Commented-code block (5 lines) in src/lib/sabflow/client/SabFlowProvider.tsx:44", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/client/SabFlowProvider.tsx:44"}, "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-f926abff86419087", "name": "Commented-code block (5 lines) in src/lib/sabflow/triggers/replay.ts:361", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/triggers/replay.ts:361"}, "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-dae9130734d17ba3", "name": "Legacy-named symbol `launch_announce_v2` in src/lib/sabflow/docs/samplePayloads.ts:97", "shortDescription": {"text": "Legacy-named symbol `launch_announce_v2` in src/lib/sabflow/docs/samplePayloads.ts:97"}, "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-adf74ab58218271b", "name": "Commented-code block (5 lines) in src/lib/sabflow/n8n/from-ai-parse-utils.ts:435", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/from-ai-parse-utils.ts:435"}, "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-bfa6544a3d5945b6", "name": "Commented-code block (6 lines) in src/lib/sabflow/n8n/expression.ts:2", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabflow/n8n/expression.ts:2"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-cfa9833cb842d3fb", "name": "Commented-code block (5 lines) in src/lib/sabflow/n8n/expression-runner.ts:262", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/expression-runner.ts:262"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ddf29974bbd37fdf", "name": "Commented-code block (5 lines) in src/lib/sabflow/n8n/internal/config-stub.d.ts:43", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/internal/config-stub.d.ts:43"}, "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-ed6f0a68211de384", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/date-extensions.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/date-extensions.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-0e5b0bd7e716c881", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/array-extensions.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/array-extensions.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-776b245c88f2f87b", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/utils.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/utils.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-701ddf9ecc89f951", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/boolean-extensions.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/boolean-extensions.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-c1e7edb3e2f98019", "name": "Commented-code block (8 lines) in src/lib/sabflow/n8n/extensions/number-extensions.ts:1", "shortDescription": {"text": "Commented-code block (8 lines) in src/lib/sabflow/n8n/extensions/number-extensions.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-af28e72929e9e62e", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/object-extensions.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/object-extensions.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-d1811d52c3acd39c", "name": "Commented-code block (6 lines) in src/lib/sabflow/n8n/extensions/expression-extension.ts:219", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabflow/n8n/extensions/expression-extension.ts:219"}, "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-4042337721f79d5d", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/string-extensions.ts:1", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/string-extensions.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-5257f98ef8a393fd", "name": "Commented-code block (5 lines) in src/lib/sabflow/n8n/extensions/extended-functions.ts:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/extensions/extended-functions.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-b24dfa7ddbd177a7", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts:1618", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts:1618"}, "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-f99d55f996c211fa", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/eval-mock-helpers.ts:18", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/eval-mock-helpers.ts:18"}, "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-d59a21f0f81c3a8b", "name": "Commented-code block (14 lines) in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/node-execution-conte", "shortDescription": {"text": "Commented-code block (14 lines) in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/node-execution-context.ts:415"}, "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-e30cca948cdb93b1", "name": "Commented-code block (5 lines) in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/parse-incoming-", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/parse-incoming-message.ts:12"}, "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-6a32c4cae08963f1", "name": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-trigger-for-par", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-trigger-for-partial-execution.ts:126"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6be19ed85e61ee3c", "name": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/editor-catalog/useAppCatalog.ts:72", "shortDescription": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/editor-catalog/useAppCatalog.ts:72"}, "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-6e151db9f947413b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/editor-catalog/useAppCatalog.ts:191", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/editor-catalog/useAppCatalog.ts:191"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-801714604c08b85c", "name": "Commented-code block (5 lines) in src/lib/sabflow/oauth/providers.ts:598", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/oauth/providers.ts:598"}, "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-7c930cef14fa3ad3", "name": "Commented-code block (6 lines) in src/lib/sabflow/recipes/registry.ts:127", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabflow/recipes/registry.ts:127"}, "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-b8c0ab8848be9e93", "name": "Legacy-named symbol `welcome_v1` in src/lib/sabflow/recipes/lead-to-whatsapp-welcome.ts:36", "shortDescription": {"text": "Legacy-named symbol `welcome_v1` in src/lib/sabflow/recipes/lead-to-whatsapp-welcome.ts:36"}, "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-c8cc3eadbb75e233", "name": "Legacy-named symbol `b_extract_old` in src/lib/sabflow/recipes/seed-pack-4.ts:134", "shortDescription": {"text": "Legacy-named symbol `b_extract_old` in src/lib/sabflow/recipes/seed-pack-4.ts:134"}, "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-cd61f31dd308a5a3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/testNode.ts:206", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/testNode.ts:206"}, "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-6c029287432e9e23", "name": "Commented-code block (5 lines) in src/lib/sabflow/execution/traceBus.ts:35", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/execution/traceBus.ts:35"}, "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-23f22ba5643838cc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/sandbox/browserSandbox.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/sandbox/browserSandbox.ts:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-df7d6e37dba54be2", "name": "Commented-code block (5 lines) in src/lib/sabflow/execution/sandbox/serverSandbox.ts:235", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/execution/sandbox/serverSandbox.ts:235"}, "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-e13b3eb75144686e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/sandbox/serverSandbox.ts:94", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/sandbox/serverSandbox.ts:94"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a4dea8cd6db39d65", "name": "Commented-code block (5 lines) in src/lib/sabflow/queue/dlq.ts:432", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/queue/dlq.ts:432"}, "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-f3640c63f678cbe1", "name": "Commented-code block (7 lines) in src/lib/sabflow/queue/cancel.ts:173", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/queue/cancel.ts:173"}, "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-8b1f0a2cd61c48da", "name": "Commented-code block (5 lines) in src/lib/sabflow/queue/rate-limit.ts:104", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/queue/rate-limit.ts:104"}, "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-3cbbcc7286e2bdeb", "name": "Commented-code block (6 lines) in src/lib/sabflow/queue/enqueue.ts:485", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabflow/queue/enqueue.ts:485"}, "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-54158a15ceface6a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/payments/stripe.ts:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/payments/stripe.ts:127"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a11cc38dad6c63f0", "name": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/sabflow/nodeOutputs/declarations.ts:55", "shortDescription": {"text": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/sabflow/nodeOutputs/declarations.ts:55"}, "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-9c909f81a90fc7f1", "name": "Commented-code block (5 lines) in src/lib/sabflow/engine/executeBlock.ts:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/engine/executeBlock.ts:14"}, "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-f2d51f1907f537d4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/engine/executeBlock.ts:411", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/engine/executeBlock.ts:411"}, "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-0ad844c1dde33475", "name": "Commented-code block (5 lines) in src/lib/sabflow/engine/executeFlow.ts:191", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/engine/executeFlow.ts:191"}, "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-10c924786891d918", "name": "Commented-code block (5 lines) in src/lib/sabflow/engine/__tests__/paired-item.test.ts:54", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/engine/__tests__/paired-item.test.ts:54"}, "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-5751d0be12e8f92c", "name": "Legacy-named symbol `e_legacy` in src/lib/sabflow/engine/__tests__/multi-output-routing.test.ts:163", "shortDescription": {"text": "Legacy-named symbol `e_legacy` in src/lib/sabflow/engine/__tests__/multi-output-routing.test.ts:163"}, "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-26f589f48d127141", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/executor/errors.ts:176", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/executor/errors.ts:176"}, "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-d1e20d8829c59c6e", "name": "Commented-code block (7 lines) in src/lib/sabflow/executor/expression/parser.ts:822", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/executor/expression/parser.ts:822"}, "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-1eae0d1efcc2616e", "name": "Commented-code block (5 lines) in src/lib/sabflow/executor/expression/sandbox.ts:296", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/expression/sandbox.ts:296"}, "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-2d7e362c9a4ec01b", "name": "Commented-code block (7 lines) in src/lib/sabflow/executor/nodes/code.ts:94", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/executor/nodes/code.ts:94"}, "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-0912c867e0b524de", "name": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/wait.ts:421", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/wait.ts:421"}, "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-25992276676aace7", "name": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/http-request.ts:133", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/http-request.ts:133"}, "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-2c5c03034a6e7705", "name": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/function.ts:250", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/function.ts:250"}, "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-e0642d4a878f731c", "name": "Commented-code block (6 lines) in src/lib/sabflow/executor/credentials/audit.ts:296", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabflow/executor/credentials/audit.ts:296"}, "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-db1201f9f8618fea", "name": "Legacy-named symbol `SABFLOW_KEK_v1` in src/lib/sabflow/executor/credentials/crypto.ts:31", "shortDescription": {"text": "Legacy-named symbol `SABFLOW_KEK_v1` in src/lib/sabflow/executor/credentials/crypto.ts:31"}, "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-742d54e790538581", "name": "Commented-code block (5 lines) in src/lib/sabflow/executor/credentials/crypto.ts:538", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/credentials/crypto.ts:538"}, "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-3c295db332ec8799", "name": "Commented-code block (7 lines) in src/lib/sabflow/persistence/repo.ts:117", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabflow/persistence/repo.ts:117"}, "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-062ea43eadd655d8", "name": "Commented-code block (5 lines) in src/lib/sabflow/persistence/indexes.ts:96", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabflow/persistence/indexes.ts:96"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a2969c39f37fb998", "name": "Legacy-named symbol `forge_function_legacy` in src/lib/sabflow/blocks/index.ts:475", "shortDescription": {"text": "Legacy-named symbol `forge_function_legacy` in src/lib/sabflow/blocks/index.ts:475"}, "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-b6572ba829d4b4eb", "name": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/blocks/icons.ts:35", "shortDescription": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/blocks/icons.ts:35"}, "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-c026f89ef7770c7c", "name": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/blocks/__tests__/icons.test.ts:20", "shortDescription": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/blocks/__tests__/icons.test.ts:20"}, "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-2491601caec37fc6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo-suite/backlinks.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo-suite/backlinks.ts:11"}, "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-804a8aaee0a6c179", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/channels/adapters/discord.ts:76", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/channels/adapters/discord.ts:76"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0ce8036898cc15da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/channels/adapters/voice.ts:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/channels/adapters/voice.ts:83"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5d2d8dcc8cd07881", "name": "Commented-code block (5 lines) in src/lib/automations/dispatch.ts:122", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/automations/dispatch.ts:122"}, "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-a8cc7457dd077d99", "name": "Commented-code block (6 lines) in src/lib/actions/user.actions.ts:563", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/actions/user.actions.ts:563"}, "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-ecb0ca0f69d82a87", "name": "Commented-code block (5 lines) in src/lib/reports/india/gstr1.ts:365", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/reports/india/gstr1.ts:365"}, "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-be4ab60962cce4d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/engine-client.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/engine-client.ts:15"}, "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-a746ca18aa19943e", "name": "Commented-code block (6 lines) in src/lib/sabsms/types.ts:185", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabsms/types.ts:185"}, "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-fdf3e6735e195100", "name": "Commented-code block (5 lines) in src/lib/sabsms/journeys/executor.ts:420", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabsms/journeys/executor.ts:420"}, "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-4b52f2a716209ee5", "name": "Commented-code block (5 lines) in src/lib/sabsms/events/consumer.ts:436", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabsms/events/consumer.ts:436"}, "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-1711cc157da9bce6", "name": "Commented-code block (5 lines) in src/lib/sabsms/ratecards/store.ts:108", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/sabsms/ratecards/store.ts:108"}, "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-cea78a57aad6664d", "name": "Commented-code block (6 lines) in src/lib/sabsms/agent/store.ts:482", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabsms/agent/store.ts:482"}, "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-e74794961fd9d449", "name": "Commented-code block (7 lines) in src/lib/sabsms/agent/runtime.ts:318", "shortDescription": {"text": "Commented-code block (7 lines) in src/lib/sabsms/agent/runtime.ts:318"}, "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-456a2c3082698a9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/agent/llm.ts:71", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/agent/llm.ts:71"}, "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-2aa30cedb487efe8", "name": "Commented-code block (6 lines) in src/lib/sabsms/db/collections.ts:636", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/sabsms/db/collections.ts:636"}, "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-997365ad97b8c3d8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/apikeys/openapi.ts:660", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/apikeys/openapi.ts:660"}, "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-d966e68b2bbbd960", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/indexnow-client.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/indexnow-client.ts:26"}, "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-bd413910206961f1", "name": "Commented-code block (6 lines) in src/lib/seo/outreach.ts:20", "shortDescription": {"text": "Commented-code block (6 lines) in src/lib/seo/outreach.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c72cc85855cb4afb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/outreach.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/outreach.ts:23"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11c0b1d5b67b4731", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/data-for-seo.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/data-for-seo.ts:31"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2c07b6feae8e412c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/data-for-seo-client.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/data-for-seo-client.ts:15"}, "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-43d22cafa8437816", "name": "Commented-code block (5 lines) in src/workers/seo.worker.ts:34", "shortDescription": {"text": "Commented-code block (5 lines) in src/workers/seo.worker.ts:34"}, "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-973d952f1e810f65", "name": "Commented-code block (6 lines) in src/workers/sabmail-sync.ts:442", "shortDescription": {"text": "Commented-code block (6 lines) in src/workers/sabmail-sync.ts:442"}, "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-d0dbd9c8671fb1f6", "name": "Commented-code block (6 lines) in src/workers/sabflow-worker.ts:130", "shortDescription": {"text": "Commented-code block (6 lines) in src/workers/sabflow-worker.ts:130"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21658770d32da242", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/workers/sabflow-worker.ts:254", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/workers/sabflow-worker.ts:254"}, "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-b5723382043c7558", "name": "Commented-code block (5 lines) in src/workers/broadcast/send.worker.js:153", "shortDescription": {"text": "Commented-code block (5 lines) in src/workers/broadcast/send.worker.js:153"}, "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-523e1a80cf667af3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/workers/sabsheet/calc.worker.ts:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/workers/sabsheet/calc.worker.ts:50"}, "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-a44a35417cdd918f", "name": "Commented-code block (5 lines) in src/workers/seo/audit.worker.ts:138", "shortDescription": {"text": "Commented-code block (5 lines) in src/workers/seo/audit.worker.ts:138"}, "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-fa63e12080444f0b", "name": "Commented-code block (6 lines) in src/workflows/automation-run.ts:20", "shortDescription": {"text": "Commented-code block (6 lines) in src/workflows/automation-run.ts:20"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-81546b6215ed4eb9", "name": "Commented-code block (8 lines) in src/context/project-context.tsx:160", "shortDescription": {"text": "Commented-code block (8 lines) in src/context/project-context.tsx:160"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6c6e07ad4ab2f0ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/helpers/session.ts:218", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/helpers/session.ts:218"}, "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-0b927d565b04ff05", "name": "Commented-code block (5 lines) in benches/sabflow-node-parity/runner.mjs:11", "shortDescription": {"text": "Commented-code block (5 lines) in benches/sabflow-node-parity/runner.mjs:11"}, "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-6f329dea14d33963", "name": "Commented-code block (5 lines) in benches/sabflow-expression/run.js:196", "shortDescription": {"text": "Commented-code block (5 lines) in benches/sabflow-expression/run.js:196"}, "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-a6e70e5553fe06ac", "name": "255 env vars used in code but missing from .env.example", "shortDescription": {"text": "255 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_GATEWAY_API_KEY`, `ALLOW_RUST_SKIP`, `ALL_PROXY`, `ANALYTICS_EMBED_SECRET`, `ANALYZE`, `ANTHROPIC_API_KEY`, `APP_SECRET`, `APP_URL` + 247 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-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/app/dashboard/telegram/payments/split.py:get_component_bounds, src/app/dashboard/telegram/payments/split_write.py:get_component_bounds, src/app/dashboard/telegram/payments/split_clean.py:get_component_bounds\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d179f4313b43bdb", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (worker.js:179)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (worker.js:179)"}, "fullDescription": {"text": "`worker.js:179` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-13d499f291c722b5", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/media (worker.js:303)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/media (worker.js:303)"}, "fullDescription": {"text": "`worker.js:303` calls `POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/media`\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-1ba499f547385a95", "name": "Dangling fetch: POST https://html.duckduckgo.com/html/ (ddg_test.js:6)", "shortDescription": {"text": "Dangling fetch: POST https://html.duckduckgo.com/html/ (ddg_test.js:6)"}, "fullDescription": {"text": "`ddg_test.js:6` calls `POST https://html.duckduckgo.com/html/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/html.duckduckgo.com/html`\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-51b0981cebc231c1", "name": "Dangling fetch: GET https://api.iconify.design/simple-icons/${name}.svg?color=%23525252 (scripts/fetch-brand-logos.mjs:4", "shortDescription": {"text": "Dangling fetch: GET https://api.iconify.design/simple-icons/${name}.svg?color=%23525252 (scripts/fetch-brand-logos.mjs:460)"}, "fullDescription": {"text": "`scripts/fetch-brand-logos.mjs:460` calls `GET https://api.iconify.design/simple-icons/${name}.svg?color=%23525252` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.iconify.design/simple-icons/<p>.svg`\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-e309c158e77a1229", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (workers/broadcast-worker.js:11", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (workers/broadcast-worker.js:117)"}, "fullDescription": {"text": "`workers/broadcast-worker.js:117` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-e105f7cbb036abcf", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/worker.js:109)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/worker.js:109)"}, "fullDescription": {"text": "`src/worker.js:109` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/media`\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-6236a024d55b9a7c", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/worker.js:164)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/worker.js:164)"}, "fullDescription": {"text": "`src/worker.js:164` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-e7e24b801ef05376", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/broadcast-worker.js:13", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/broadcast-worker.js:131)"}, "fullDescription": {"text": "`src/lib/broadcast-worker.js:131` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-af0e011ba0fe24f4", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/messages (src/workers/broadcast/send", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/messages (src/workers/broadcast/send-message.js:235)"}, "fullDescription": {"text": "`src/workers/broadcast/send-message.js:235` calls `POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-3d6f316e8dba31fa", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${broadcast.phoneNumberId}/media (src/workers/broadcast/c", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${broadcast.phoneNumberId}/media (src/workers/broadcast/control.worker.js:63)"}, "fullDescription": {"text": "`src/workers/broadcast/control.worker.js:63` calls `POST https://graph.facebook.com/${API_VERSION}/${broadcast.phoneNumberId}/media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/media`\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-3b6d0b8cb9140732", "name": "Dangling fetch: POST /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:304)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:304)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:304` calls `POST /api/v1/sabcall/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/calls`\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-cc640828d5aa5661", "name": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:315)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:315)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:315` calls `GET /api/v1/sabcall/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/calls`\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-11c7267a59674e79", "name": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:336)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:336)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:336` calls `GET /api/v1/sabcall/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/calls`\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-7c0454827ef71b52", "name": "Dangling fetch: GET /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:354)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:354)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:354` calls `GET /api/v1/sabcall/contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/contacts`\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-87eaafcb5029c29d", "name": "Dangling fetch: GET /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:373)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:373)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:373` calls `GET /api/v1/sabcall/contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/contacts`\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-8d9e1bb13ee7c70b", "name": "Dangling fetch: POST /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:386)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:386)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:386` calls `POST /api/v1/sabcall/contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/contacts`\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-c40e3f0744d77984", "name": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:408)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:408)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:408` calls `GET /api/v1/sabcall/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/calls`\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-23f59a6522cfc084", "name": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:439)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:439)"}, "fullDescription": {"text": "`packages/sabcall-sdk/src/client.ts:439` calls `GET /api/v1/sabcall/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/calls`\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-d38564345c4eed84", "name": "Dangling fetch: GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken} (src/components/2", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken} (src/components/20ui-domain/whatsapp.actions.ts:848)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:848` calls `GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/v25.0/<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-9e1a2f7b13fb2a3d", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${appId}/uploads (src/components/20ui-domain/whatsapp.act", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${appId}/uploads (src/components/20ui-domain/whatsapp.actions.ts:118)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:118` calls `POST https://graph.facebook.com/${API_VERSION}/${appId}/uploads` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/uploads`\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-6160779eefdc9817", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${uploadSessionId} (src/components/20ui-domain/whatsapp.a", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${uploadSessionId} (src/components/20ui-domain/whatsapp.actions.ts:122)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:122` calls `POST https://graph.facebook.com/${API_VERSION}/${uploadSessionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<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-632fe3e3ccb6f842", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile (src/component", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile (src/components/20ui-domain/whatsapp.actions.ts:128)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:128` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/whatsapp_business_profile`\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-81ab5584f9e612c6", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile (src/component", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile (src/components/20ui-domain/whatsapp.actions.ts:154)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:154` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/whatsapp_business_profile`\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-cdc58b1b8dfcef01", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps (src/components/20ui-domain/what", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps (src/components/20ui-domain/whatsapp.actions.ts:179)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:179` calls `GET https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/subscribed_apps`\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-7db942b32919ea65", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${appId}/subscriptions (src/components/20ui-domain/whatsa", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${appId}/subscriptions (src/components/20ui-domain/whatsapp.actions.ts:199)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:199` calls `POST https://graph.facebook.com/${API_VERSION}/${appId}/subscriptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/subscriptions`\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-6d09bb4ed3e8f74e", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps (src/components/20ui-domain/wha", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps (src/components/20ui-domain/whatsapp.actions.ts:211)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:211` calls `POST https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/subscribed_apps`\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-99a604608999ef76", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/components/20ui-domain/whatsa", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/components/20ui-domain/whatsapp.actions.ts:261)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:261` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/media`\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-3e02bed31ccec0e1", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/components/20ui-domain/wha", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/components/20ui-domain/whatsapp.actions.ts:296)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:296` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-203f0b8e64d470f8", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/components/20ui-domain/whatsa", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/components/20ui-domain/whatsapp.actions.ts:367)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:367` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/media`\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-530ff1e7fe101414", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/components/20ui-domain/wha", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/components/20ui-domain/whatsapp.actions.ts:415)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:415` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-96bec11fa8df029f", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations (src/components/", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations (src/components/20ui-domain/whatsapp.actions.ts:497)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:497` calls `POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_configurations`\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-1942c651e258c3b4", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration/${configurationNa", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration/${configurationName} (src/components/20ui-domain/whatsapp.actions.ts:535)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:535` calls `POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration/${configurationName}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_configuration/<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-5c4784c022683263", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/generate_payment_configuration_oauth_li", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/generate_payment_configuration_oauth_link (src/components/20ui-domain/whatsapp.actions.ts:572)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:572` calls `POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/generate_payment_configuration_oauth_link` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/generate_payment_configuration_oauth_link`\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-15ed699d17344207", "name": "Dangling fetch: DELETE https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration (src/components", "shortDescription": {"text": "Dangling fetch: DELETE https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration (src/components/20ui-domain/whatsapp.actions.ts:603)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:603` calls `DELETE https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_configuration`\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-a496536eefe778b9", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests (src/components/20ui-do", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests (src/components/20ui-domain/whatsapp.actions.ts:656)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:656` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_requests`\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-42c3d21f1c990d72", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests/${requestId} (src/compon", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests/${requestId} (src/components/20ui-domain/whatsapp.actions.ts:700)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:700` calls `GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests/${requestId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_requests/<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-b01fe400adc26210", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests (src/components/20ui-dom", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests (src/components/20ui-domain/whatsapp.actions.ts:725)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:725` calls `GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_requests`\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-fa3ef97ec78a30bb", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations (src/components/2", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations (src/components/20ui-domain/whatsapp.actions.ts:747)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:747` calls `GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_configurations`\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-e040b5047a50e02c", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations/${configurationNa", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations/${configurationName} (src/components/20ui-domain/whatsapp.actions.ts:774)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:774` calls `GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations/${configurationName}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/payment_configurations/<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-d46a2f1eee202c69", "name": "Dangling fetch: GET https://graph.facebook.com/v25.0/me/businesses (src/components/20ui-domain/whatsapp.actions.ts:833)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/me/businesses (src/components/20ui-domain/whatsapp.actions.ts:833)"}, "fullDescription": {"text": "`src/components/20ui-domain/whatsapp.actions.ts:833` calls `GET https://graph.facebook.com/v25.0/me/businesses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/v25.0/me/businesses`\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-7f6efe0313ac10e7", "name": "Dangling fetch: POST /api/cron/sync-local-templates (src/components/20ui-domain/sync-local-templates-button.tsx:18)", "shortDescription": {"text": "Dangling fetch: POST /api/cron/sync-local-templates (src/components/20ui-domain/sync-local-templates-button.tsx:18)"}, "fullDescription": {"text": "`src/components/20ui-domain/sync-local-templates-button.tsx:18` calls `POST /api/cron/sync-local-templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/cron/sync-local-templates`\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-55df8e8bae906b2a", "name": "Dangling fetch: GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken} (src/components/2", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken} (src/components/20ui-domain/project.actions.ts:51)"}, "fullDescription": {"text": "`src/components/20ui-domain/project.actions.ts:51` calls `GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/v25.0/<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-a6e0a67f83760a96", "name": "Dangling fetch: GET https://graph.facebook.com/v25.0/me/businesses (src/components/20ui-domain/project.actions.ts:36)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/me/businesses (src/components/20ui-domain/project.actions.ts:36)"}, "fullDescription": {"text": "`src/components/20ui-domain/project.actions.ts:36` calls `GET https://graph.facebook.com/v25.0/me/businesses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/v25.0/me/businesses`\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-ac8d8dbf4c47bce8", "name": "Dangling fetch: POST /api/auth/session (src/components/20ui-domain/login-form.tsx:87)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/session (src/components/20ui-domain/login-form.tsx:87)"}, "fullDescription": {"text": "`src/components/20ui-domain/login-form.tsx:87` calls `POST /api/auth/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/session`\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-2f3bd71c4c56f5f3", "name": "Dangling fetch: POST /api/auth/two-fa (src/components/20ui-domain/login-form.tsx:108)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/two-fa (src/components/20ui-domain/login-form.tsx:108)"}, "fullDescription": {"text": "`src/components/20ui-domain/login-form.tsx:108` calls `POST /api/auth/two-fa` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/two-fa`\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-58fb49a82683629d", "name": "Dangling fetch: POST /api/crm/forms/submit/${form._id.toString()} (src/components/20ui-domain/embedded-form.tsx:282)", "shortDescription": {"text": "Dangling fetch: POST /api/crm/forms/submit/${form._id.toString()} (src/components/20ui-domain/embedded-form.tsx:282)"}, "fullDescription": {"text": "`src/components/20ui-domain/embedded-form.tsx:282` calls `POST /api/crm/forms/submit/${form._id.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/crm/forms/submit/<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-91d4f023721c41c2", "name": "Dangling fetch: GET /wachat (src/components/20ui-domain/onboarding/steps/complete-step.tsx:29)", "shortDescription": {"text": "Dangling fetch: GET /wachat (src/components/20ui-domain/onboarding/steps/complete-step.tsx:29)"}, "fullDescription": {"text": "`src/components/20ui-domain/onboarding/steps/complete-step.tsx:29` calls `GET /wachat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wachat`\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-8ffae27a7ac6eb9f", "name": "Dangling fetch: POST /api/auth/session (src/components/20ui-domain/onboarding/steps/account-step.tsx:207)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/session (src/components/20ui-domain/onboarding/steps/account-step.tsx:207)"}, "fullDescription": {"text": "`src/components/20ui-domain/onboarding/steps/account-step.tsx:207` calls `POST /api/auth/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/session`\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-d946d59b3d813b6f", "name": "Dangling fetch: POST /api/v1/wachat/ai/stream (src/components/wachat/ai/copilot-dock.tsx:89)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/wachat/ai/stream (src/components/wachat/ai/copilot-dock.tsx:89)"}, "fullDescription": {"text": "`src/components/wachat/ai/copilot-dock.tsx:89` calls `POST /api/v1/wachat/ai/stream` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/wachat/ai/stream`\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-c274d200485705a0", "name": "Dangling fetch: POST /api/sabsheet/presence (src/components/sabsheet/grid/sheet-canvas.tsx:272)", "shortDescription": {"text": "Dangling fetch: POST /api/sabsheet/presence (src/components/sabsheet/grid/sheet-canvas.tsx:272)"}, "fullDescription": {"text": "`src/components/sabsheet/grid/sheet-canvas.tsx:272` calls `POST /api/sabsheet/presence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabsheet/presence`\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-be0bf4b61390e18b", "name": "Dangling fetch: POST /api/builder/save (src/components/builder/editor-layout.tsx:206)", "shortDescription": {"text": "Dangling fetch: POST /api/builder/save (src/components/builder/editor-layout.tsx:206)"}, "fullDescription": {"text": "`src/components/builder/editor-layout.tsx:206` calls `POST /api/builder/save` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/builder/save`\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-4d996db874c04520", "name": "Dangling fetch: GET /api/sabflow/recent-submissions (src/components/sabflow/RecentActivityFeed.tsx:47)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/recent-submissions (src/components/sabflow/RecentActivityFeed.tsx:47)"}, "fullDescription": {"text": "`src/components/sabflow/RecentActivityFeed.tsx:47` calls `GET /api/sabflow/recent-submissions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/recent-submissions`\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-cbcba0acfdef6568", "name": "Dangling fetch: POST /api/sabflow/import (src/components/sabflow/FlowImportExport.tsx:81)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/import (src/components/sabflow/FlowImportExport.tsx:81)"}, "fullDescription": {"text": "`src/components/sabflow/FlowImportExport.tsx:81` calls `POST /api/sabflow/import` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/import`\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-4e1333999edf5a27", "name": "Dangling fetch: POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/install (src/components/sabflo", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/install (src/components/sabflow/marketplace/InstallModal.tsx:103)"}, "fullDescription": {"text": "`src/components/sabflow/marketplace/InstallModal.tsx:103` calls `POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/install` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/marketplace/templates/<p>/install`\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-5344f54ca62b25c3", "name": "Dangling fetch: POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/upgrade (src/components/sabflo", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/upgrade (src/components/sabflow/marketplace/UpgradeDiffModal.tsx:136)"}, "fullDescription": {"text": "`src/components/sabflow/marketplace/UpgradeDiffModal.tsx:136` calls `POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/upgrade` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/marketplace/templates/<p>/upgrade`\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-7aa90ef842e40881", "name": "Dangling fetch: PATCH /api/sabflow/workspaces/${workspace.id} (src/components/sabflow/workspaces/WorkspaceSettingsPage.t", "shortDescription": {"text": "Dangling fetch: PATCH /api/sabflow/workspaces/${workspace.id} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:228)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:228` calls `PATCH /api/sabflow/workspaces/${workspace.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<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-df56296b2c0a4527", "name": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspace.id} (src/components/sabflow/workspaces/WorkspaceSettingsPage.", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspace.id} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:256)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:256` calls `DELETE /api/sabflow/workspaces/${workspace.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<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-5ea320e449bc6ea9", "name": "Dangling fetch: PATCH /api/sabflow/workspaces/${workspaceId}/members (src/components/sabflow/workspaces/WorkspaceSetting", "shortDescription": {"text": "Dangling fetch: PATCH /api/sabflow/workspaces/${workspaceId}/members (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:370)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:370` calls `PATCH /api/sabflow/workspaces/${workspaceId}/members` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<p>/members`\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-6705dc4222eea8fd", "name": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/members/${memberId} (src/components/sabflow/workspaces/Wor", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/members/${memberId} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:432)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:432` calls `DELETE /api/sabflow/workspaces/${workspaceId}/members/${memberId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<p>/members/<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-28b8d324c40982c6", "name": "Dangling fetch: POST /api/sabflow/workspaces/${workspaceId}/invites (src/components/sabflow/workspaces/WorkspaceSettings", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/workspaces/${workspaceId}/invites (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:600)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:600` calls `POST /api/sabflow/workspaces/${workspaceId}/invites` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<p>/invites`\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-b79670b119f6efed", "name": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId} (src/components/sabflow/workspaces/Wor", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:667)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:667` calls `DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<p>/invites/<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-187d9282fea9a6db", "name": "Dangling fetch: GET /api/sabflow/workspaces/${workspaceId}/audit-logs (src/components/sabflow/workspaces/WorkspaceSettin", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/workspaces/${workspaceId}/audit-logs (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:882)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:882` calls `GET /api/sabflow/workspaces/${workspaceId}/audit-logs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<p>/audit-logs`\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-3985de86ead7e84b", "name": "Dangling fetch: GET /api/sabflow/workspaces (src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:105)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/workspaces (src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:105)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:105` calls `GET /api/sabflow/workspaces` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces`\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-c23bb7a52ba51a9e", "name": "Dangling fetch: POST /api/sabflow/workspaces (src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:173)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/workspaces (src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:173)"}, "fullDescription": {"text": "`src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:173` calls `POST /api/sabflow/workspaces` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces`\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-bcb648c3a870ba2d", "name": "Dangling fetch: GET /api/sabflow/${flowId}/submissions?${qs} (src/components/sabflow/results/FlowResultsClient.tsx:266)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/submissions?${qs} (src/components/sabflow/results/FlowResultsClient.tsx:266)"}, "fullDescription": {"text": "`src/components/sabflow/results/FlowResultsClient.tsx:266` calls `GET /api/sabflow/${flowId}/submissions?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/submissions`\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-b9f31d95d29ac02e", "name": "Dangling fetch: GET /api/sabflow/${flowId}/analytics (src/components/sabflow/results/FlowResultsClient.tsx:473)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/analytics (src/components/sabflow/results/FlowResultsClient.tsx:473)"}, "fullDescription": {"text": "`src/components/sabflow/results/FlowResultsClient.tsx:473` calls `GET /api/sabflow/${flowId}/analytics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/analytics`\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-06bac56b782d63b9", "name": "Dangling fetch: POST /api/sabflow/session (src/components/sabflow/chat/SabFlowChat.tsx:21)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/session (src/components/sabflow/chat/SabFlowChat.tsx:21)"}, "fullDescription": {"text": "`src/components/sabflow/chat/SabFlowChat.tsx:21` calls `POST /api/sabflow/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/session`\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-0b28597fc451880b", "name": "Dangling fetch: POST /api/sabflow/execute (src/components/sabflow/chat/SabFlowChat.tsx:37)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/execute (src/components/sabflow/chat/SabFlowChat.tsx:37)"}, "fullDescription": {"text": "`src/components/sabflow/chat/SabFlowChat.tsx:37` calls `POST /api/sabflow/execute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/execute`\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-fa1968ab279a5531", "name": "Dangling fetch: POST /api/sabflow/payments/stripe/create-intent (src/components/sabflow/chat/blocks/PaymentBlock.tsx:177", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/payments/stripe/create-intent (src/components/sabflow/chat/blocks/PaymentBlock.tsx:177)"}, "fullDescription": {"text": "`src/components/sabflow/chat/blocks/PaymentBlock.tsx:177` calls `POST /api/sabflow/payments/stripe/create-intent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/payments/stripe/create-intent`\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-4663c2c5576eddaa", "name": "Dangling fetch: GET /api/sabflow/whatsapp/${flowId}/config (src/components/sabflow/panels/WhatsAppPanel.tsx:165)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/whatsapp/${flowId}/config (src/components/sabflow/panels/WhatsAppPanel.tsx:165)"}, "fullDescription": {"text": "`src/components/sabflow/panels/WhatsAppPanel.tsx:165` calls `GET /api/sabflow/whatsapp/${flowId}/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/whatsapp/<p>/config`\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-a9264cf0b746c398", "name": "Dangling fetch: POST /api/sabflow/whatsapp/${flowId}/config (src/components/sabflow/panels/WhatsAppPanel.tsx:218)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/whatsapp/${flowId}/config (src/components/sabflow/panels/WhatsAppPanel.tsx:218)"}, "fullDescription": {"text": "`src/components/sabflow/panels/WhatsAppPanel.tsx:218` calls `POST /api/sabflow/whatsapp/${flowId}/config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/whatsapp/<p>/config`\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-1ffe1cf764d5b59e", "name": "Dangling fetch: GET /api/sabflow/${flowId}/versions (src/components/sabflow/panels/VersionHistoryPanel.tsx:148)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/versions (src/components/sabflow/panels/VersionHistoryPanel.tsx:148)"}, "fullDescription": {"text": "`src/components/sabflow/panels/VersionHistoryPanel.tsx:148` calls `GET /api/sabflow/${flowId}/versions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/versions`\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-bb5d8b2ecd4f4027", "name": "Dangling fetch: POST /api/sabflow/${flowId}/versions (src/components/sabflow/panels/VersionHistoryPanel.tsx:172)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/versions (src/components/sabflow/panels/VersionHistoryPanel.tsx:172)"}, "fullDescription": {"text": "`src/components/sabflow/panels/VersionHistoryPanel.tsx:172` calls `POST /api/sabflow/${flowId}/versions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/versions`\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-7d4a5ff70d1bc110", "name": "Dangling fetch: GET /api/sabflow/domains (src/components/sabflow/panels/DomainsPanel.tsx:72)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/domains (src/components/sabflow/panels/DomainsPanel.tsx:72)"}, "fullDescription": {"text": "`src/components/sabflow/panels/DomainsPanel.tsx:72` calls `GET /api/sabflow/domains` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/domains`\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-1346f85296ef3c46", "name": "Dangling fetch: POST /api/sabflow/domains (src/components/sabflow/panels/DomainsPanel.tsx:79)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/domains (src/components/sabflow/panels/DomainsPanel.tsx:79)"}, "fullDescription": {"text": "`src/components/sabflow/panels/DomainsPanel.tsx:79` calls `POST /api/sabflow/domains` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/domains`\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-132ffa019d3e6abf", "name": "Dangling fetch: POST /api/sabflow/domains/${id}/verify (src/components/sabflow/panels/DomainsPanel.tsx:94)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/domains/${id}/verify (src/components/sabflow/panels/DomainsPanel.tsx:94)"}, "fullDescription": {"text": "`src/components/sabflow/panels/DomainsPanel.tsx:94` calls `POST /api/sabflow/domains/${id}/verify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/domains/<p>/verify`\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-984baa4deff80b55", "name": "Dangling fetch: DELETE /api/sabflow/domains/${id} (src/components/sabflow/panels/DomainsPanel.tsx:114)", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/domains/${id} (src/components/sabflow/panels/DomainsPanel.tsx:114)"}, "fullDescription": {"text": "`src/components/sabflow/panels/DomainsPanel.tsx:114` calls `DELETE /api/sabflow/domains/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/domains/<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-2fe2234420dc0c6f", "name": "Dangling fetch: POST /api/sabflow/${flowId}/publish (src/components/sabflow/panels/SharePanelClient.tsx:20)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/publish (src/components/sabflow/panels/SharePanelClient.tsx:20)"}, "fullDescription": {"text": "`src/components/sabflow/panels/SharePanelClient.tsx:20` calls `POST /api/sabflow/${flowId}/publish` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/publish`\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-64731a1a3c734565", "name": "Dangling fetch: GET /api/sabflow/${flowId}/notifications (src/components/sabflow/panels/NotificationsPanel.tsx:136)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/notifications (src/components/sabflow/panels/NotificationsPanel.tsx:136)"}, "fullDescription": {"text": "`src/components/sabflow/panels/NotificationsPanel.tsx:136` calls `GET /api/sabflow/${flowId}/notifications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/notifications`\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-8e14eba7a7b7a177", "name": "Dangling fetch: POST /api/sabflow/${flowId}/notifications (src/components/sabflow/panels/NotificationsPanel.tsx:229)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/notifications (src/components/sabflow/panels/NotificationsPanel.tsx:229)"}, "fullDescription": {"text": "`src/components/sabflow/panels/NotificationsPanel.tsx:229` calls `POST /api/sabflow/${flowId}/notifications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/notifications`\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-7869e376234af503", "name": "Dangling fetch: POST /api/sabflow/load-options (src/components/sabflow/panels/blocks/forge/useLoadOptions.ts:97)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/load-options (src/components/sabflow/panels/blocks/forge/useLoadOptions.ts:97)"}, "fullDescription": {"text": "`src/components/sabflow/panels/blocks/forge/useLoadOptions.ts:97` calls `POST /api/sabflow/load-options` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/load-options`\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-386f1be7abba0796", "name": "Dangling fetch: GET /api/sabflow/credentials?type=${provider} (src/components/sabflow/panels/blocks/inputs/PaymentInputS", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/credentials?type=${provider} (src/components/sabflow/panels/blocks/inputs/PaymentInputSettings.tsx:159)"}, "fullDescription": {"text": "`src/components/sabflow/panels/blocks/inputs/PaymentInputSettings.tsx:159` calls `GET /api/sabflow/credentials?type=${provider}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials`\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-4ab5bea17080c515", "name": "Dangling fetch: GET /api/sabflow/credentials?type=${encodeURIComponent(credentialType)} (src/components/sabflow/panels/b", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/credentials?type=${encodeURIComponent(credentialType)} (src/components/sabflow/panels/blocks/shared/CredentialSelect.tsx:43)"}, "fullDescription": {"text": "`src/components/sabflow/panels/blocks/shared/CredentialSelect.tsx:43` calls `GET /api/sabflow/credentials?type=${encodeURIComponent(credentialType)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials`\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-a860a5f4ff5c8abe", "name": "Dangling fetch: GET /api/sabflow/nodes/${encodeURIComponent(name)} (src/components/sabflow/panels/blocks/shared/NodeSett", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/nodes/${encodeURIComponent(name)} (src/components/sabflow/panels/blocks/shared/NodeSettings.tsx:162)"}, "fullDescription": {"text": "`src/components/sabflow/panels/blocks/shared/NodeSettings.tsx:162` calls `GET /api/sabflow/nodes/${encodeURIComponent(name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/nodes/<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-842d63971011ebc9", "name": "Dangling fetch: POST /api/sabflow/ws-token?docId=${encodeURIComponent(docId)} (src/components/sabflow/editor/EditorConte", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/ws-token?docId=${encodeURIComponent(docId)} (src/components/sabflow/editor/EditorContentCollab.tsx:125)"}, "fullDescription": {"text": "`src/components/sabflow/editor/EditorContentCollab.tsx:125` calls `POST /api/sabflow/ws-token?docId=${encodeURIComponent(docId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/ws-token`\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-1a3ff3968ae0303a", "name": "Dangling fetch: GET /api/sabflow/nodes (src/components/sabflow/editor/descriptorRegistry.ts:222)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/nodes (src/components/sabflow/editor/descriptorRegistry.ts:222)"}, "fullDescription": {"text": "`src/components/sabflow/editor/descriptorRegistry.ts:222` calls `GET /api/sabflow/nodes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/nodes`\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-47770599f1cee035", "name": "Dangling fetch: POST /api/sabflow/${flowId}/presence (src/components/sabflow/presence/usePresence.ts:49)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/presence (src/components/sabflow/presence/usePresence.ts:49)"}, "fullDescription": {"text": "`src/components/sabflow/presence/usePresence.ts:49` calls `POST /api/sabflow/${flowId}/presence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/presence`\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-13be129e6bb5b9fd", "name": "Dangling fetch: DELETE /api/sabflow/${flowId}/presence (src/components/sabflow/presence/usePresence.ts:72)", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/${flowId}/presence (src/components/sabflow/presence/usePresence.ts:72)"}, "fullDescription": {"text": "`src/components/sabflow/presence/usePresence.ts:72` calls `DELETE /api/sabflow/${flowId}/presence` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/presence`\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-9b65e00903987582", "name": "Dangling fetch: GET /api/sabflow/${flowId}/analytics?${params.toString()} (src/components/sabflow/graph/providers/Analyt", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/analytics?${params.toString()} (src/components/sabflow/graph/providers/AnalyticsProvider.tsx:166)"}, "fullDescription": {"text": "`src/components/sabflow/graph/providers/AnalyticsProvider.tsx:166` calls `GET /api/sabflow/${flowId}/analytics?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/analytics`\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-f5dfe48763df1937", "name": "Dangling fetch: GET /api/status (src/app/page-client.tsx:2701)", "shortDescription": {"text": "Dangling fetch: GET /api/status (src/app/page-client.tsx:2701)"}, "fullDescription": {"text": "`src/app/page-client.tsx:2701` calls `GET /api/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/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-8731afec8f44e644", "name": "Dangling fetch: GET https://suggestqueries.google.com/complete/search?client=firefox&q=${encodeURIComponent(q)} (src/app", "shortDescription": {"text": "Dangling fetch: GET https://suggestqueries.google.com/complete/search?client=firefox&q=${encodeURIComponent(q)} (src/app/api/seo-tools/questions/route.ts:43)"}, "fullDescription": {"text": "`src/app/api/seo-tools/questions/route.ts:43` calls `GET https://suggestqueries.google.com/complete/search?client=firefox&q=${encodeURIComponent(q)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/suggestqueries.google.com/complete/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-c04bb491e8f35f1d", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/sabcrm/ai/route.ts:127)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/sabcrm/ai/route.ts:127)"}, "fullDescription": {"text": "`src/app/api/sabcrm/ai/route.ts:127` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-86c076ac369de095", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/sabcrm/ai/route.ts:171)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/sabcrm/ai/route.ts:171)"}, "fullDescription": {"text": "`src/app/api/sabcrm/ai/route.ts:171` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-c3844334136a50f5", "name": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/app/api/sabcrm/oauth/[provider]/callback/route.ts:164)", "shortDescription": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/app/api/sabcrm/oauth/[provider]/callback/route.ts:164)"}, "fullDescription": {"text": "`src/app/api/sabcrm/oauth/[provider]/callback/route.ts:164` calls `POST https://oauth2.googleapis.com/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/oauth2.googleapis.com/token`\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-92c7ce22dce40241", "name": "Dangling fetch: GET https://openidconnect.googleapis.com/v1/userinfo (src/app/api/sabcrm/oauth/[provider]/callback/route", "shortDescription": {"text": "Dangling fetch: GET https://openidconnect.googleapis.com/v1/userinfo (src/app/api/sabcrm/oauth/[provider]/callback/route.ts:180)"}, "fullDescription": {"text": "`src/app/api/sabcrm/oauth/[provider]/callback/route.ts:180` calls `GET https://openidconnect.googleapis.com/v1/userinfo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openidconnect.googleapis.com/v1/userinfo`\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-f69cde7c97b0f589", "name": "Dangling fetch: POST https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token (src/app/api/sabcrm/oauth/[provider]/", "shortDescription": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token (src/app/api/sabcrm/oauth/[provider]/callback/route.ts:218)"}, "fullDescription": {"text": "`src/app/api/sabcrm/oauth/[provider]/callback/route.ts:218` calls `POST https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/login.microsoftonline.com/<p>/oauth2/v2.0/token`\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-7a0b7594922c9556", "name": "Dangling fetch: GET https://graph.microsoft.com/v1.0/me (src/app/api/crm/auth/outlook/callback/route.ts:8)", "shortDescription": {"text": "Dangling fetch: GET https://graph.microsoft.com/v1.0/me (src/app/api/crm/auth/outlook/callback/route.ts:8)"}, "fullDescription": {"text": "`src/app/api/crm/auth/outlook/callback/route.ts:8` calls `GET https://graph.microsoft.com/v1.0/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/me`\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-03ce6c1cefa1a4d7", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${wabaId}/message_templates (src/app/api/cron/sync-local-", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${wabaId}/message_templates (src/app/api/cron/sync-local-templates/route.ts:59)"}, "fullDescription": {"text": "`src/app/api/cron/sync-local-templates/route.ts:59` calls `POST https://graph.facebook.com/${API_VERSION}/${wabaId}/message_templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/message_templates`\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-570aa8b3947776db", "name": "Dangling fetch: POST https://slack.com/api/auth.test (src/app/api/sabflow/credentials/test/route.ts:142)", "shortDescription": {"text": "Dangling fetch: POST https://slack.com/api/auth.test (src/app/api/sabflow/credentials/test/route.ts:142)"}, "fullDescription": {"text": "`src/app/api/sabflow/credentials/test/route.ts:142` calls `POST https://slack.com/api/auth.test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/slack.com/api/auth.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-4e9a417c3b809d79", "name": "Dangling fetch: GET https://api.github.com/user (src/app/api/sabflow/credentials/test/route.ts:160)", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/user (src/app/api/sabflow/credentials/test/route.ts:160)"}, "fullDescription": {"text": "`src/app/api/sabflow/credentials/test/route.ts:160` calls `GET https://api.github.com/user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/user`\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-b05223d3e42c1b61", "name": "Dangling fetch: GET /api/marketplace/installed?projectId=${encodeURIComponent(projectId)} (src/app/dashboard/marketplace", "shortDescription": {"text": "Dangling fetch: GET /api/marketplace/installed?projectId=${encodeURIComponent(projectId)} (src/app/dashboard/marketplace/installed/page.tsx:68)"}, "fullDescription": {"text": "`src/app/dashboard/marketplace/installed/page.tsx:68` calls `GET /api/marketplace/installed?projectId=${encodeURIComponent(projectId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/marketplace/installed`\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-f7de323cb57de52f", "name": "Dangling fetch: POST /api/meta/ai/generate (src/app/dashboard/facebook/studio/page.tsx:196)", "shortDescription": {"text": "Dangling fetch: POST /api/meta/ai/generate (src/app/dashboard/facebook/studio/page.tsx:196)"}, "fullDescription": {"text": "`src/app/dashboard/facebook/studio/page.tsx:196` calls `POST /api/meta/ai/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/meta/ai/generate`\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-3162f2f6dedb1b85", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/dashboard/ad-manager/ai-lab/actions.ts:12)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/dashboard/ad-manager/ai-lab/actions.ts:12)"}, "fullDescription": {"text": "`src/app/dashboard/ad-manager/ai-lab/actions.ts:12` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-9cdab76b23d5e7c4", "name": "Dangling fetch: GET /api/sabflow/usage?days=${days} (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:101)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/usage?days=${days} (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:101)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/usage/_components/usage-client.tsx:101` calls `GET /api/sabflow/usage?days=${days}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/usage`\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-9619b71500b123ca", "name": "Dangling fetch: GET /api/sabflow/usage/alerts (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:418)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/usage/alerts (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:418)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/usage/_components/usage-client.tsx:418` calls `GET /api/sabflow/usage/alerts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/usage/alerts`\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-4a37615193465761", "name": "Dangling fetch: POST /api/sabflow/usage/alerts (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:440)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/usage/alerts (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:440)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/usage/_components/usage-client.tsx:440` calls `POST /api/sabflow/usage/alerts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/usage/alerts`\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-ad1a662afa1b437e", "name": "Dangling fetch: POST /api/sabflow/executions/${executionId}/rerun (src/app/dashboard/sabflow/executions/_components/exec", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/executions/${executionId}/rerun (src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:99)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:99` calls `POST /api/sabflow/executions/${executionId}/rerun` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/executions/<p>/rerun`\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-ddf9d89ca42504c1", "name": "Dangling fetch: GET /api/sabflow/executions/${executionId} (src/app/dashboard/sabflow/executions/_components/execution-r", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/executions/${executionId} (src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:133)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:133` calls `GET /api/sabflow/executions/${executionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/executions/<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-91e27ac579a73776", "name": "Dangling fetch: GET /api/sabflow/executions?${params.toString()} (src/app/dashboard/sabflow/executions/_components/execu", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/executions?${params.toString()} (src/app/dashboard/sabflow/executions/_components/executions-list-client.tsx:102)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/executions/_components/executions-list-client.tsx:102` calls `GET /api/sabflow/executions?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/executions`\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-baf203cc471fe003", "name": "Dangling fetch: GET /api/sabflow/health (src/app/dashboard/sabflow/health/_components/health-client.tsx:120)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/health (src/app/dashboard/sabflow/health/_components/health-client.tsx:120)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/health/_components/health-client.tsx:120` calls `GET /api/sabflow/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/health`\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-a806a0b345af6274", "name": "Dangling fetch: GET /api/sabflow/${flowId}/webhooks (src/app/dashboard/sabflow/[flowId]/webhooks/_components/webhooks-cl", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/webhooks (src/app/dashboard/sabflow/[flowId]/webhooks/_components/webhooks-client.tsx:69)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/[flowId]/webhooks/_components/webhooks-client.tsx:69` calls `GET /api/sabflow/${flowId}/webhooks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/webhooks`\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-40df6c890cfa4004", "name": "Dangling fetch: GET /api/sabflow/env-vars (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:85)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/env-vars (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:85)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:85` calls `GET /api/sabflow/env-vars` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/env-vars`\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-241fbf9b462b4dff", "name": "Dangling fetch: DELETE /api/sabflow/env-vars?key=${encodeURIComponent(confirmDelete.key)} (src/app/dashboard/sabflow/env", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/env-vars?key=${encodeURIComponent(confirmDelete.key)} (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:147)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:147` calls `DELETE /api/sabflow/env-vars?key=${encodeURIComponent(confirmDelete.key)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/env-vars`\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-acb3299ab9f62814", "name": "Dangling fetch: PUT /api/sabflow/env-vars (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:393)", "shortDescription": {"text": "Dangling fetch: PUT /api/sabflow/env-vars (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:393)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:393` calls `PUT /api/sabflow/env-vars` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/env-vars`\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-ea6d61df158ec413", "name": "Dangling fetch: GET /api/sabflow/audit?${params.toString()} (src/app/dashboard/sabflow/audit/_components/audit-client.ts", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/audit?${params.toString()} (src/app/dashboard/sabflow/audit/_components/audit-client.tsx:149)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/audit/_components/audit-client.tsx:149` calls `GET /api/sabflow/audit?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/audit`\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-ed11fd5cd0eb1830", "name": "Dangling fetch: GET /api/sabflow/logs?limit=300 (src/app/dashboard/sabflow/logs/page.tsx:123)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/logs?limit=300 (src/app/dashboard/sabflow/logs/page.tsx:123)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/logs/page.tsx:123` calls `GET /api/sabflow/logs?limit=300` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/logs`\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-9d5170c4947dfa76", "name": "Dangling fetch: GET /api/sabflow/api-keys (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:94)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/api-keys (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:94)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:94` calls `GET /api/sabflow/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/api-keys`\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-cd548e60121bf430", "name": "Dangling fetch: POST /api/sabflow/api-keys (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:134)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/api-keys (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:134)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:134` calls `POST /api/sabflow/api-keys` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/api-keys`\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-8f9e40f92833e214", "name": "Dangling fetch: DELETE /api/sabflow/api-keys/${row._id} (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/api-keys/${row._id} (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:189)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:189` calls `DELETE /api/sabflow/api-keys/${row._id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/api-keys/<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-02059ff310c43831", "name": "Dangling fetch: POST /api/sabflow/${flowId}/trigger (src/app/dashboard/sabflow/flow-builder/page.tsx:217)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/trigger (src/app/dashboard/sabflow/flow-builder/page.tsx:217)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/flow-builder/page.tsx:217` calls `POST /api/sabflow/${flowId}/trigger` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/trigger`\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-e5f2ca01c85d3eb4", "name": "Dangling fetch: GET /api/sabflow/${flowId}/versions/${versionId} (src/app/dashboard/sabflow/flow-builder/[flowId]/diff/p", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/versions/${versionId} (src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:83)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:83` calls `GET /api/sabflow/${flowId}/versions/${versionId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/versions/<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-2547a0d6c4e15056", "name": "Dangling fetch: POST /api/sabflow/${flowId}/versions/${side.versionId}/restore (src/app/dashboard/sabflow/flow-builder/[", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/versions/${side.versionId}/restore (src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:210)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:210` calls `POST /api/sabflow/${flowId}/versions/${side.versionId}/restore` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/<p>/versions/<p>/restore`\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-75dbcf2a97946e30", "name": "Dangling fetch: GET /api/sabflow/folders (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:75)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/folders (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:75)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/folders/_components/folders-client.tsx:75` calls `GET /api/sabflow/folders` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/folders`\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-00e155f7c68d470a", "name": "Dangling fetch: GET /api/sabflow/flows-by-folder?folder=${encodeURIComponent(folder.name)} (src/app/dashboard/sabflow/fo", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/flows-by-folder?folder=${encodeURIComponent(folder.name)} (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:88)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/folders/_components/folders-client.tsx:88` calls `GET /api/sabflow/flows-by-folder?folder=${encodeURIComponent(folder.name)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/flows-by-folder`\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-016abda4a7ad51b0", "name": "Dangling fetch: POST /api/sabflow/folders (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:126)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/folders (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:126)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/folders/_components/folders-client.tsx:126` calls `POST /api/sabflow/folders` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/folders`\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-34775ec8f0182984", "name": "Dangling fetch: PATCH /api/sabflow/folders/${folderId} (src/app/dashboard/sabflow/folders/_components/folders-client.tsx", "shortDescription": {"text": "Dangling fetch: PATCH /api/sabflow/folders/${folderId} (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:146)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/folders/_components/folders-client.tsx:146` calls `PATCH /api/sabflow/folders/${folderId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/folders/<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-d878237903ee6c9b", "name": "Dangling fetch: DELETE /api/sabflow/folders/${folderId} (src/app/dashboard/sabflow/folders/_components/folders-client.ts", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/folders/${folderId} (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:166)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/folders/_components/folders-client.tsx:166` calls `DELETE /api/sabflow/folders/${folderId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/folders/<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-414b6ac4bad62df2", "name": "Dangling fetch: GET /api/sabflow/stats?window=24h (src/app/dashboard/sabflow/_components/flow-list-client.tsx:168)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/stats?window=24h (src/app/dashboard/sabflow/_components/flow-list-client.tsx:168)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/_components/flow-list-client.tsx:168` calls `GET /api/sabflow/stats?window=24h` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/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-cca560fe08175a39", "name": "Dangling fetch: GET /api/sabflow/credentials (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:3", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/credentials (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:345)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/connections/_components/connections-client.tsx:345` calls `GET /api/sabflow/credentials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials`\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-e4313200506a23a9", "name": "Dangling fetch: POST /api/sabflow/credentials/test (src/app/dashboard/sabflow/connections/_components/connections-client", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/credentials/test (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:416)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/connections/_components/connections-client.tsx:416` calls `POST /api/sabflow/credentials/test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/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-8d83b0021c52916d", "name": "Dangling fetch: PATCH /api/sabflow/credentials/${editing.id} (src/app/dashboard/sabflow/connections/_components/connecti", "shortDescription": {"text": "Dangling fetch: PATCH /api/sabflow/credentials/${editing.id} (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:464)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/connections/_components/connections-client.tsx:464` calls `PATCH /api/sabflow/credentials/${editing.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/<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-26cd8b7d7e607788", "name": "Dangling fetch: POST /api/sabflow/credentials (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/credentials (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:469)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/connections/_components/connections-client.tsx:469` calls `POST /api/sabflow/credentials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials`\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-38c7badb1af6bb26", "name": "Dangling fetch: POST /api/sabflow/credentials/${cred.id}/test (src/app/dashboard/sabflow/connections/_components/connect", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/credentials/${cred.id}/test (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:495)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/connections/_components/connections-client.tsx:495` calls `POST /api/sabflow/credentials/${cred.id}/test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/<p>/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-ad407800c4047e21", "name": "Dangling fetch: DELETE /api/sabflow/credentials/${deleteTarget.id} (src/app/dashboard/sabflow/connections/_components/co", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/credentials/${deleteTarget.id} (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:525)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/connections/_components/connections-client.tsx:525` calls `DELETE /api/sabflow/credentials/${deleteTarget.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/<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-d7f4cb8d2cc225ae", "name": "Dangling fetch: GET /api/sabflow/credentials/${credentialId}/scopes (src/app/dashboard/sabflow/credentials/[id]/scopes/_", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/credentials/${credentialId}/scopes (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:111)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:111` calls `GET /api/sabflow/credentials/${credentialId}/scopes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/<p>/scopes`\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-1a2d8660793c4562", "name": "Dangling fetch: DELETE /api/sabflow/credentials/${credentialId}/scopes/${encodeURIComponent(\n            scope,\n        ", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/credentials/${credentialId}/scopes/${encodeURIComponent(\n            scope,\n          )} (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:156)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:156` calls `DELETE /api/sabflow/credentials/${credentialId}/scopes/${encodeURIComponent(\n            scope,\n          )}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/<p>/scopes/<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-8de3c42d8ab32359", "name": "Dangling fetch: POST /api/sabflow/credentials/${credentialId}/scopes (src/app/dashboard/sabflow/credentials/[id]/scopes/", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/credentials/${credentialId}/scopes (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:188)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:188` calls `POST /api/sabflow/credentials/${credentialId}/scopes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/<p>/scopes`\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-dde24224ffc1af3f", "name": "Dangling fetch: DELETE /api/sabflow/credentials/${credentialId} (src/app/dashboard/sabflow/credentials/[id]/scopes/_comp", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/credentials/${credentialId} (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:227)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:227` calls `DELETE /api/sabflow/credentials/${credentialId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/credentials/<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-0208495c77ea5352", "name": "Dangling fetch: GET /api/sabflow/workspaces/invites (src/app/dashboard/sabflow/invites/_components/invites-client.tsx:14", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/workspaces/invites (src/app/dashboard/sabflow/invites/_components/invites-client.tsx:145)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/invites/_components/invites-client.tsx:145` calls `GET /api/sabflow/workspaces/invites` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/invites`\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-f6f2305eb829a0f9", "name": "Dangling fetch: POST /api/sabflow/workspaces/invites/accept/${inv.token} (src/app/dashboard/sabflow/invites/_components/", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/workspaces/invites/accept/${inv.token} (src/app/dashboard/sabflow/invites/_components/invites-client.tsx:169)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/invites/_components/invites-client.tsx:169` calls `POST /api/sabflow/workspaces/invites/accept/${inv.token}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/invites/accept/<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-f86e293a75231bae", "name": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId} (src/app/dashboard/sabflow/invites/_co", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId} (src/app/dashboard/sabflow/invites/_components/invites-client.tsx:201)"}, "fullDescription": {"text": "`src/app/dashboard/sabflow/invites/_components/invites-client.tsx:201` calls `DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/workspaces/<p>/invites/<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-a36124398fe11f38", "name": "Dangling fetch: GET https://archive.org/wayback/available?url=${encodeURIComponent(url)} (src/app/dashboard/seo/[project", "shortDescription": {"text": "Dangling fetch: GET https://archive.org/wayback/available?url=${encodeURIComponent(url)} (src/app/dashboard/seo/[projectId]/timetravel/actions.ts:32)"}, "fullDescription": {"text": "`src/app/dashboard/seo/[projectId]/timetravel/actions.ts:32` calls `GET https://archive.org/wayback/available?url=${encodeURIComponent(url)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/archive.org/wayback/available`\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-9d24bfd7cf20e141", "name": "Dangling fetch: POST /api/v1/seo/ai/keyword-clusters (src/app/dashboard/seo/[projectId]/pseo/_components/pseo-client.tsx", "shortDescription": {"text": "Dangling fetch: POST /api/v1/seo/ai/keyword-clusters (src/app/dashboard/seo/[projectId]/pseo/_components/pseo-client.tsx:196)"}, "fullDescription": {"text": "`src/app/dashboard/seo/[projectId]/pseo/_components/pseo-client.tsx:196` calls `POST /api/v1/seo/ai/keyword-clusters` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/seo/ai/keyword-clusters`\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-493beb84e270d970", "name": "Dangling fetch: GET https://ipwhois.app/json/${ip} (src/app/dashboard/seo/tools/server-location/page.tsx:58)", "shortDescription": {"text": "Dangling fetch: GET https://ipwhois.app/json/${ip} (src/app/dashboard/seo/tools/server-location/page.tsx:58)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/server-location/page.tsx:58` calls `GET https://ipwhois.app/json/${ip}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/ipwhois.app/json/<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-ed1051e3f5aa32cc", "name": "Dangling fetch: GET https://tinyurl.com/api-create.php?url=${encodeURIComponent(out)} (src/app/dashboard/seo/tools/utm-b", "shortDescription": {"text": "Dangling fetch: GET https://tinyurl.com/api-create.php?url=${encodeURIComponent(out)} (src/app/dashboard/seo/tools/utm-builder/page.tsx:105)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/utm-builder/page.tsx:105` calls `GET https://tinyurl.com/api-create.php?url=${encodeURIComponent(out)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/tinyurl.com/api-create.php`\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-c98fbf2649b5dfe7", "name": "Dangling fetch: POST https://tmpfiles.org/api/v1/upload (src/app/dashboard/seo/tools/reverse-image-search/page.tsx:49)", "shortDescription": {"text": "Dangling fetch: POST https://tmpfiles.org/api/v1/upload (src/app/dashboard/seo/tools/reverse-image-search/page.tsx:49)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/reverse-image-search/page.tsx:49` calls `POST https://tmpfiles.org/api/v1/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/tmpfiles.org/api/v1/upload`\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-a1db772f54fe43b1", "name": "Dangling fetch: GET http://suggestqueries.google.com/complete/search?client=chrome&q=${encodeURIComponent(normalizedSeed", "shortDescription": {"text": "Dangling fetch: GET http://suggestqueries.google.com/complete/search?client=chrome&q=${encodeURIComponent(normalizedSeed)}%20 (src/app/dashboard/seo/tools/related-keywords/actions.ts:23)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/related-keywords/actions.ts:23` calls `GET http://suggestqueries.google.com/complete/search?client=chrome&q=${encodeURIComponent(normalizedSeed)}%20` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/suggestqueries.google.com/complete/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-87c1cc1782f5d60c", "name": "Dangling fetch: GET http://suggestqueries.google.com/complete/search?client=chrome&q=how%20to%20${encodeURIComponent(nor", "shortDescription": {"text": "Dangling fetch: GET http://suggestqueries.google.com/complete/search?client=chrome&q=how%20to%20${encodeURIComponent(normalizedSeed)} (src/app/dashboard/seo/tools/related-keywords/actions.ts:32)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/related-keywords/actions.ts:32` calls `GET http://suggestqueries.google.com/complete/search?client=chrome&q=how%20to%20${encodeURIComponent(normalizedSeed)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/suggestqueries.google.com/complete/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-3a801b962aebb41b", "name": "Dangling fetch: GET https://html.duckduckgo.com/html/?q=${urlEncoded} (src/app/dashboard/seo/tools/keyword-difficulty/ac", "shortDescription": {"text": "Dangling fetch: GET https://html.duckduckgo.com/html/?q=${urlEncoded} (src/app/dashboard/seo/tools/keyword-difficulty/actions.ts:30)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/keyword-difficulty/actions.ts:30` calls `GET https://html.duckduckgo.com/html/?q=${urlEncoded}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/html.duckduckgo.com/html`\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-1774b16dd5f0684b", "name": "Dangling fetch: POST /api/v1/seo/ai/title-tags (src/app/dashboard/seo/tools/title-tag-checker/page.tsx:113)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/seo/ai/title-tags (src/app/dashboard/seo/tools/title-tag-checker/page.tsx:113)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/title-tag-checker/page.tsx:113` calls `POST /api/v1/seo/ai/title-tags` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/seo/ai/title-tags`\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-b5a3e19600279e97", "name": "Dangling fetch: POST https://api.dataforseo.com/v3/serp/google/organic/live/advanced (src/app/dashboard/seo/tools/keywor", "shortDescription": {"text": "Dangling fetch: POST https://api.dataforseo.com/v3/serp/google/organic/live/advanced (src/app/dashboard/seo/tools/keyword-rank-checker/action.ts:19)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/keyword-rank-checker/action.ts:19` calls `POST https://api.dataforseo.com/v3/serp/google/organic/live/advanced` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.dataforseo.com/v3/serp/google/organic/live/advanced`\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-2bcf987327b31371", "name": "Dangling fetch: POST https://html.duckduckgo.com/html/ (src/app/dashboard/seo/tools/keyword-rank-checker/action.ts:147)", "shortDescription": {"text": "Dangling fetch: POST https://html.duckduckgo.com/html/ (src/app/dashboard/seo/tools/keyword-rank-checker/action.ts:147)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/keyword-rank-checker/action.ts:147` calls `POST https://html.duckduckgo.com/html/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/html.duckduckgo.com/html`\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-2ccc7e8a804ea7e0", "name": "Dangling fetch: GET https://api.datamuse.com/words?ml=${encodeURIComponent(s)}&max=1000 (src/app/dashboard/seo/tools/lsi", "shortDescription": {"text": "Dangling fetch: GET https://api.datamuse.com/words?ml=${encodeURIComponent(s)}&max=1000 (src/app/dashboard/seo/tools/lsi-keywords/page.tsx:33)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/lsi-keywords/page.tsx:33` calls `GET https://api.datamuse.com/words?ml=${encodeURIComponent(s)}&max=1000` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.datamuse.com/words`\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-ab21dc4e1d59a8c7", "name": "Dangling fetch: GET https://api.datamuse.com/words?rel_trg=${encodeURIComponent(s)}&max=1000 (src/app/dashboard/seo/tool", "shortDescription": {"text": "Dangling fetch: GET https://api.datamuse.com/words?rel_trg=${encodeURIComponent(s)}&max=1000 (src/app/dashboard/seo/tools/lsi-keywords/page.tsx:34)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/lsi-keywords/page.tsx:34` calls `GET https://api.datamuse.com/words?rel_trg=${encodeURIComponent(s)}&max=1000` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.datamuse.com/words`\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-9411ce81d4ec0ce0", "name": "Dangling fetch: POST /api/seo-tools/questions (src/app/dashboard/seo/tools/question-keywords/page.tsx:42)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/questions (src/app/dashboard/seo/tools/question-keywords/page.tsx:42)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/question-keywords/page.tsx:42` calls `POST /api/seo-tools/questions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/questions`\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-91789a4be84678e0", "name": "Dangling fetch: GET https://api.pwnedpasswords.com/range/${prefix} (src/app/dashboard/seo/tools/password-generator/page.", "shortDescription": {"text": "Dangling fetch: GET https://api.pwnedpasswords.com/range/${prefix} (src/app/dashboard/seo/tools/password-generator/page.tsx:128)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/password-generator/page.tsx:128` calls `GET https://api.pwnedpasswords.com/range/${prefix}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.pwnedpasswords.com/range/<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-bda50c75e5747b43", "name": "Dangling fetch: POST https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_metrics/live (src/app/dashboard/seo/to", "shortDescription": {"text": "Dangling fetch: POST https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_metrics/live (src/app/dashboard/seo/tools/keyword-cpc/actions.ts:18)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/keyword-cpc/actions.ts:18` calls `POST https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_metrics/live` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.dataforseo.com/v3/dataforseo_labs/google/keyword_metrics/live`\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-90510225f6400166", "name": "Dangling fetch: POST /api/seo-tools/autocomplete (src/app/dashboard/seo/tools/people-also-ask/page.tsx:58)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/autocomplete (src/app/dashboard/seo/tools/people-also-ask/page.tsx:58)"}, "fullDescription": {"text": "`src/app/dashboard/seo/tools/people-also-ask/page.tsx:58` calls `POST /api/seo-tools/autocomplete` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/autocomplete`\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-442cc9f89bcfa64f", "name": "Dangling fetch: GET /api/sign/kiosk/${params.envelopeId}?signerId=${signerId} (src/app/sign/kiosk/[envelopeId]/page.tsx:", "shortDescription": {"text": "Dangling fetch: GET /api/sign/kiosk/${params.envelopeId}?signerId=${signerId} (src/app/sign/kiosk/[envelopeId]/page.tsx:60)"}, "fullDescription": {"text": "`src/app/sign/kiosk/[envelopeId]/page.tsx:60` calls `GET /api/sign/kiosk/${params.envelopeId}?signerId=${signerId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sign/kiosk/<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-338453f93c0dacef", "name": "Dangling fetch: POST /wachat/whatsapp-ads/generate-copy (src/app/wachat/whatsapp-ads/page.tsx:764)", "shortDescription": {"text": "Dangling fetch: POST /wachat/whatsapp-ads/generate-copy (src/app/wachat/whatsapp-ads/page.tsx:764)"}, "fullDescription": {"text": "`src/app/wachat/whatsapp-ads/page.tsx:764` calls `POST /wachat/whatsapp-ads/generate-copy` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wachat/whatsapp-ads/generate-copy`\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-fdb305586a9a5eeb", "name": "Dangling fetch: GET /api/wachat/contacts/export?${params.toString()} (src/app/wachat/contacts/page.tsx:297)", "shortDescription": {"text": "Dangling fetch: GET /api/wachat/contacts/export?${params.toString()} (src/app/wachat/contacts/page.tsx:297)"}, "fullDescription": {"text": "`src/app/wachat/contacts/page.tsx:297` calls `GET /api/wachat/contacts/export?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/wachat/contacts/export`\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-98527d7b5d7023dd", "name": "Dangling fetch: POST /api/sabcrm/ai (src/app/sabcrm/ai/page.tsx:373)", "shortDescription": {"text": "Dangling fetch: POST /api/sabcrm/ai (src/app/sabcrm/ai/page.tsx:373)"}, "fullDescription": {"text": "`src/app/sabcrm/ai/page.tsx:373` calls `POST /api/sabcrm/ai` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabcrm/ai`\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-c0121e18566a51f1", "name": "Dangling fetch: POST /api/sabflow/marketplace/submissions/${id}/review (src/app/admin/dashboard/marketplace/queue/_compo", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/marketplace/submissions/${id}/review (src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:228)"}, "fullDescription": {"text": "`src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:228` calls `POST /api/sabflow/marketplace/submissions/${id}/review` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/marketplace/submissions/<p>/review`\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-275f23d14bfdde1f", "name": "Dangling fetch: POST /api/sabflow/marketplace/submissions/${id}/review (src/app/admin/dashboard/marketplace/queue/_compo", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/marketplace/submissions/${id}/review (src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:254)"}, "fullDescription": {"text": "`src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:254` calls `POST /api/sabflow/marketplace/submissions/${id}/review` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/marketplace/submissions/<p>/review`\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-2e109700495e09e5", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/oauth/access_token (src/app/actions/onboarding.actions.ts", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/oauth/access_token (src/app/actions/onboarding.actions.ts:67)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:67` calls `POST https://graph.facebook.com/${API_VERSION}/oauth/access_token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/oauth/access_token`\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-1e3f5bbe1c8eea86", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/debug_token (src/app/actions/onboarding.actions.ts:80)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/debug_token (src/app/actions/onboarding.actions.ts:80)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:80` calls `GET https://graph.facebook.com/${API_VERSION}/debug_token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/debug_token`\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-736ca83b2c87ac33", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${wabaId} (src/app/actions/onboarding.actions.ts:106)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${wabaId} (src/app/actions/onboarding.actions.ts:106)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:106` calls `GET https://graph.facebook.com/${API_VERSION}/${wabaId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<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-15866dae2a9f1f45", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${businessId} (src/app/actions/onboarding.actions.ts:130)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${businessId} (src/app/actions/onboarding.actions.ts:130)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:130` calls `GET https://graph.facebook.com/${API_VERSION}/${businessId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<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-9a8d8396a6be806a", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phone.id}/register (src/app/actions/onboarding.actions.", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phone.id}/register (src/app/actions/onboarding.actions.ts:187)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:187` calls `POST https://graph.facebook.com/${API_VERSION}/${phone.id}/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/register`\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-29f221cec957836c", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/oauth/access_token (src/app/actions/onboarding.actions.ts", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/oauth/access_token (src/app/actions/onboarding.actions.ts:251)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:251` calls `POST https://graph.facebook.com/${API_VERSION}/oauth/access_token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/oauth/access_token`\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-fbf34dbc6925f768", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/me/accounts (src/app/actions/onboarding.actions.ts:256)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/me/accounts (src/app/actions/onboarding.actions.ts:256)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:256` calls `GET https://graph.facebook.com/${API_VERSION}/me/accounts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/me/accounts`\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-f3a12393a99597b0", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/me/adaccounts (src/app/actions/onboarding.actions.ts:278)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/me/adaccounts (src/app/actions/onboarding.actions.ts:278)"}, "fullDescription": {"text": "`src/app/actions/onboarding.actions.ts:278` calls `GET https://graph.facebook.com/${API_VERSION}/me/adaccounts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/me/adaccounts`\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-a34501865f797d84", "name": "Dangling fetch: POST https://graph.facebook.com/v25.0/ (src/app/actions/custom-ecommerce.actions.ts:856)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v25.0/ (src/app/actions/custom-ecommerce.actions.ts:856)"}, "fullDescription": {"text": "`src/app/actions/custom-ecommerce.actions.ts:856` calls `POST https://graph.facebook.com/v25.0/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/v25.0`\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-6d9f0af6c95d85e0", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/actions/ai-lab.actions.ts:12)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/actions/ai-lab.actions.ts:12)"}, "fullDescription": {"text": "`src/app/actions/ai-lab.actions.ts:12` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-53b85bcae988e375", "name": "Dangling fetch: GET /api/sabflow/executions?limit=100 (src/app/flow/executions/page.tsx:85)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/executions?limit=100 (src/app/flow/executions/page.tsx:85)"}, "fullDescription": {"text": "`src/app/flow/executions/page.tsx:85` calls `GET /api/sabflow/executions?limit=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/executions`\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-1d5b656b0df66ebb", "name": "Dangling fetch: GET /api/sabflow/nodes (src/app/flow/nodes/NodesSidebar.tsx:22)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/nodes (src/app/flow/nodes/NodesSidebar.tsx:22)"}, "fullDescription": {"text": "`src/app/flow/nodes/NodesSidebar.tsx:22` calls `GET /api/sabflow/nodes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/nodes`\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-512bc06c80eb8e55", "name": "Dangling fetch: POST /api/sabpay/checkout/${data.paymentId}/payu-session (src/app/pay/[pageSlug]/checkout-client.tsx:93)", "shortDescription": {"text": "Dangling fetch: POST /api/sabpay/checkout/${data.paymentId}/payu-session (src/app/pay/[pageSlug]/checkout-client.tsx:93)"}, "fullDescription": {"text": "`src/app/pay/[pageSlug]/checkout-client.tsx:93` calls `POST /api/sabpay/checkout/${data.paymentId}/payu-session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabpay/checkout/<p>/payu-session`\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-8319462e71dd6a54", "name": "Dangling fetch: POST /api/sabpay/checkout/${data.paymentId}/simulate (src/app/pay/[pageSlug]/checkout-client.tsx:119)", "shortDescription": {"text": "Dangling fetch: POST /api/sabpay/checkout/${data.paymentId}/simulate (src/app/pay/[pageSlug]/checkout-client.tsx:119)"}, "fullDescription": {"text": "`src/app/pay/[pageSlug]/checkout-client.tsx:119` calls `POST /api/sabpay/checkout/${data.paymentId}/simulate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabpay/checkout/<p>/simulate`\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-7828be169c1228d5", "name": "Dangling fetch: POST /api/sabsms/imports/ai-mapping (src/app/sabsms/imports/wizard.tsx:215)", "shortDescription": {"text": "Dangling fetch: POST /api/sabsms/imports/ai-mapping (src/app/sabsms/imports/wizard.tsx:215)"}, "fullDescription": {"text": "`src/app/sabsms/imports/wizard.tsx:215` calls `POST /api/sabsms/imports/ai-mapping` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabsms/imports/ai-mapping`\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-7ecc31ee36f5c7f9", "name": "Dangling fetch: GET /api/sabsms/blocks (src/app/sabsms/sabflow-blocks/client.tsx:52)", "shortDescription": {"text": "Dangling fetch: GET /api/sabsms/blocks (src/app/sabsms/sabflow-blocks/client.tsx:52)"}, "fullDescription": {"text": "`src/app/sabsms/sabflow-blocks/client.tsx:52` calls `GET /api/sabsms/blocks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabsms/blocks`\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-549949d1d5583573", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/lib/meta-upload.ts:34)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/lib/meta-upload.ts:34)"}, "fullDescription": {"text": "`src/lib/meta-upload.ts:34` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/media`\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-2f3f02125b4195ec", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:2", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:200)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:200` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-b95050193b2af324", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:2", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:248)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:248` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-9db306d37338b409", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:285)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:285)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:285` calls `POST https://graph.facebook.com/${API_VERSION}/me/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/me/messages`\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-d742dd82e22eac3d", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:341)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:341)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:341` calls `POST https://graph.facebook.com/${API_VERSION}/me/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/me/messages`\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-595427f6aa6b3cba", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:3", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:377)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:377` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-5406206da234ce62", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:4", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:433)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:433` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-dca3a705dd30b3c3", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:5", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:556)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:556` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-1258722e6d13c3b1", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:6", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:602)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:602` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-1d6f0b5ce9379ac0", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${contact.phoneNumberId}/messages (src/lib/webhook-proces", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${contact.phoneNumberId}/messages (src/lib/webhook-processor.ts:743)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:743` calls `POST https://graph.facebook.com/${API_VERSION}/${contact.phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-2ebbe0cccf42fa63", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:1", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:1202)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:1202` calls `POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/messages`\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-6e38eed83c8710aa", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${message[message.type].id} (src/lib/webhook-processor.ts:", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${message[message.type].id} (src/lib/webhook-processor.ts:1446)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:1446` calls `GET https://graph.facebook.com/${API_VERSION}/${message[message.type].id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<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-aecb5779d5b5af75", "name": "Dangling fetch: DELETE https://graph.facebook.com/${API_VERSION}/${commentId} (src/lib/webhook-processor.ts:1963)", "shortDescription": {"text": "Dangling fetch: DELETE https://graph.facebook.com/${API_VERSION}/${commentId} (src/lib/webhook-processor.ts:1963)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:1963` calls `DELETE https://graph.facebook.com/${API_VERSION}/${commentId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<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-28ab2e4f42aa2555", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments (src/lib/webhook-processor.ts:1982)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments (src/lib/webhook-processor.ts:1982)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:1982` calls `POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/comments`\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-3a9518270bb9ed3f", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments (src/lib/webhook-processor.ts:1997)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments (src/lib/webhook-processor.ts:1997)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:1997` calls `POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<p>/comments`\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-25a266d90db0a0ec", "name": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${senderPsid} (src/lib/webhook-processor.ts:2048)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${senderPsid} (src/lib/webhook-processor.ts:2048)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:2048` calls `GET https://graph.facebook.com/${API_VERSION}/${senderPsid}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/<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-85aee3af6a4db4fc", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:2074)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:2074)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:2074` calls `POST https://graph.facebook.com/${API_VERSION}/me/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/me/messages`\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-2d7338af05b29cfc", "name": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:2090)", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:2090)"}, "fullDescription": {"text": "`src/lib/webhook-processor.ts:2090` calls `POST https://graph.facebook.com/${API_VERSION}/me/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/me/messages`\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-24bb4e65701ee957", "name": "Dangling fetch: GET https://api.stripe.com/v1${path} (src/lib/sabshop/payments.ts:92)", "shortDescription": {"text": "Dangling fetch: GET https://api.stripe.com/v1${path} (src/lib/sabshop/payments.ts:92)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:92` calls `GET https://api.stripe.com/v1${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.stripe.com/v1/<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-ddf87a30b5a756fd", "name": "Dangling fetch: POST https://api.razorpay.com/v1/orders (src/lib/sabshop/payments.ts:207)", "shortDescription": {"text": "Dangling fetch: POST https://api.razorpay.com/v1/orders (src/lib/sabshop/payments.ts:207)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:207` calls `POST https://api.razorpay.com/v1/orders` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.razorpay.com/v1/orders`\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-991fac4ebeacfb99", "name": "Dangling fetch: POST https://api.razorpay.com/v1/payments/${encodeURIComponent(intentId)}/capture (src/lib/sabshop/payme", "shortDescription": {"text": "Dangling fetch: POST https://api.razorpay.com/v1/payments/${encodeURIComponent(intentId)}/capture (src/lib/sabshop/payments.ts:235)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:235` calls `POST https://api.razorpay.com/v1/payments/${encodeURIComponent(intentId)}/capture` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.razorpay.com/v1/payments/<p>/capture`\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-579aaa2e87ea0dfd", "name": "Dangling fetch: POST https://api.razorpay.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refund (src/lib/sabsho", "shortDescription": {"text": "Dangling fetch: POST https://api.razorpay.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refund (src/lib/sabshop/payments.ts:260)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:260` calls `POST https://api.razorpay.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refund` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.razorpay.com/v1/payments/<p>/refund`\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-0df77ba19302c189", "name": "Dangling fetch: POST https://api.mercadopago.com/v1/payments (src/lib/sabshop/payments.ts:455)", "shortDescription": {"text": "Dangling fetch: POST https://api.mercadopago.com/v1/payments (src/lib/sabshop/payments.ts:455)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:455` calls `POST https://api.mercadopago.com/v1/payments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mercadopago.com/v1/payments`\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-387a3a23989a91fb", "name": "Dangling fetch: PUT https://api.mercadopago.com/v1/payments/${encodeURIComponent(intentId)} (src/lib/sabshop/payments.ts", "shortDescription": {"text": "Dangling fetch: PUT https://api.mercadopago.com/v1/payments/${encodeURIComponent(intentId)} (src/lib/sabshop/payments.ts:479)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:479` calls `PUT https://api.mercadopago.com/v1/payments/${encodeURIComponent(intentId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mercadopago.com/v1/payments/<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-755d5bc5bb5884fb", "name": "Dangling fetch: POST https://api.mercadopago.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refunds (src/lib/sa", "shortDescription": {"text": "Dangling fetch: POST https://api.mercadopago.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refunds (src/lib/sabshop/payments.ts:491)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:491` calls `POST https://api.mercadopago.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refunds` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mercadopago.com/v1/payments/<p>/refunds`\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-3568146107ad5e22", "name": "Dangling fetch: POST https://api.paystack.co/transaction/initialize (src/lib/sabshop/payments.ts:533)", "shortDescription": {"text": "Dangling fetch: POST https://api.paystack.co/transaction/initialize (src/lib/sabshop/payments.ts:533)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:533` calls `POST https://api.paystack.co/transaction/initialize` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.paystack.co/transaction/initialize`\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-662797a59e4559de", "name": "Dangling fetch: GET https://api.paystack.co/transaction/verify/${encodeURIComponent(intentId)} (src/lib/sabshop/payments", "shortDescription": {"text": "Dangling fetch: GET https://api.paystack.co/transaction/verify/${encodeURIComponent(intentId)} (src/lib/sabshop/payments.ts:557)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:557` calls `GET https://api.paystack.co/transaction/verify/${encodeURIComponent(intentId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.paystack.co/transaction/verify/<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-127c418e156273d9", "name": "Dangling fetch: POST https://api.paystack.co/refund (src/lib/sabshop/payments.ts:572)", "shortDescription": {"text": "Dangling fetch: POST https://api.paystack.co/refund (src/lib/sabshop/payments.ts:572)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:572` calls `POST https://api.paystack.co/refund` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.paystack.co/refund`\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-0cd3b1bef7654ccc", "name": "Dangling fetch: GET https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials (src/lib/sabshop/payment", "shortDescription": {"text": "Dangling fetch: GET https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials (src/lib/sabshop/payments.ts:608)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:608` calls `GET https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.safaricom.co.ke/oauth/v1/generate`\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-16f2e32ace6dcbbe", "name": "Dangling fetch: POST https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest (src/lib/sabshop/payments.ts:631)", "shortDescription": {"text": "Dangling fetch: POST https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest (src/lib/sabshop/payments.ts:631)"}, "fullDescription": {"text": "`src/lib/sabshop/payments.ts:631` calls `POST https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.safaricom.co.ke/mpesa/stkpush/v1/processrequest`\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-29bbc937d9f07871", "name": "Dangling fetch: POST https://api.goshippo.com/shipments/ (src/lib/sabshop/shipping.ts:75)", "shortDescription": {"text": "Dangling fetch: POST https://api.goshippo.com/shipments/ (src/lib/sabshop/shipping.ts:75)"}, "fullDescription": {"text": "`src/lib/sabshop/shipping.ts:75` calls `POST https://api.goshippo.com/shipments/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.goshippo.com/shipments`\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-4b0ca983bea26487", "name": "Dangling fetch: POST https://api.goshippo.com/transactions/ (src/lib/sabshop/shipping.ts:110)", "shortDescription": {"text": "Dangling fetch: POST https://api.goshippo.com/transactions/ (src/lib/sabshop/shipping.ts:110)"}, "fullDescription": {"text": "`src/lib/sabshop/shipping.ts:110` calls `POST https://api.goshippo.com/transactions/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.goshippo.com/transactions`\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-54180162c50761f7", "name": "Dangling fetch: POST https://api.easypost.com/v2/shipments (src/lib/sabshop/shipping.ts:150)", "shortDescription": {"text": "Dangling fetch: POST https://api.easypost.com/v2/shipments (src/lib/sabshop/shipping.ts:150)"}, "fullDescription": {"text": "`src/lib/sabshop/shipping.ts:150` calls `POST https://api.easypost.com/v2/shipments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.easypost.com/v2/shipments`\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-77b6a1933618164c", "name": "Dangling fetch: POST https://apiv2.shiprocket.in/v1/external/auth/login (src/lib/sabshop/shipping.ts:204)", "shortDescription": {"text": "Dangling fetch: POST https://apiv2.shiprocket.in/v1/external/auth/login (src/lib/sabshop/shipping.ts:204)"}, "fullDescription": {"text": "`src/lib/sabshop/shipping.ts:204` calls `POST https://apiv2.shiprocket.in/v1/external/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/apiv2.shiprocket.in/v1/external/auth/login`\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-8e4bfc63d97d4daa", "name": "Dangling fetch: POST /api/seo-tools/fetch-url (src/lib/seo-tools/api-client.ts:17)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/fetch-url (src/lib/seo-tools/api-client.ts:17)"}, "fullDescription": {"text": "`src/lib/seo-tools/api-client.ts:17` calls `POST /api/seo-tools/fetch-url` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/fetch-url`\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-df194d1949c412bb", "name": "Dangling fetch: POST /api/seo-tools/dns (src/lib/seo-tools/api-client.ts:26)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/dns (src/lib/seo-tools/api-client.ts:26)"}, "fullDescription": {"text": "`src/lib/seo-tools/api-client.ts:26` calls `POST /api/seo-tools/dns` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/dns`\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-8c0c67ac32377647", "name": "Dangling fetch: POST /api/seo-tools/whois (src/lib/seo-tools/api-client.ts:35)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/whois (src/lib/seo-tools/api-client.ts:35)"}, "fullDescription": {"text": "`src/lib/seo-tools/api-client.ts:35` calls `POST /api/seo-tools/whois` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/whois`\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-00e6987c5d76eeee", "name": "Dangling fetch: POST /api/seo-tools/ssl (src/lib/seo-tools/api-client.ts:44)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/ssl (src/lib/seo-tools/api-client.ts:44)"}, "fullDescription": {"text": "`src/lib/seo-tools/api-client.ts:44` calls `POST /api/seo-tools/ssl` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/ssl`\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-99d84d7ed96bdd95", "name": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/ai/embeddings.ts:12)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/ai/embeddings.ts:12)"}, "fullDescription": {"text": "`src/lib/ai/embeddings.ts:12` calls `POST https://api.openai.com/v1/embeddings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/embeddings`\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-c74883be5c33254c", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/wachat/ai/client.ts:73)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/wachat/ai/client.ts:73)"}, "fullDescription": {"text": "`src/lib/wachat/ai/client.ts:73` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-c332dbfe3c4f1345", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/wachat/ai/client.ts:101)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/wachat/ai/client.ts:101)"}, "fullDescription": {"text": "`src/lib/wachat/ai/client.ts:101` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-e3ce6c704281b61d", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/wachat/ai/client.ts:187)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/wachat/ai/client.ts:187)"}, "fullDescription": {"text": "`src/lib/wachat/ai/client.ts:187` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-a44f03755310cd96", "name": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/sabcrm/embeddings.server.ts:96)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/sabcrm/embeddings.server.ts:96)"}, "fullDescription": {"text": "`src/lib/sabcrm/embeddings.server.ts:96` calls `POST https://api.openai.com/v1/embeddings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/embeddings`\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-d4427b05205e8918", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabcrm/ai-llm.server.ts:83)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabcrm/ai-llm.server.ts:83)"}, "fullDescription": {"text": "`src/lib/sabcrm/ai-llm.server.ts:83` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-23401309c5f498fd", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabcrm/ai-llm.server.ts:122)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabcrm/ai-llm.server.ts:122)"}, "fullDescription": {"text": "`src/lib/sabcrm/ai-llm.server.ts:122` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-0b25265f6d3ccbc5", "name": "Dangling fetch: DELETE /api/sabwriter/presence/leave?documentId=${encodeURIComponent(this.docId)} (src/lib/sabwriter/tra", "shortDescription": {"text": "Dangling fetch: DELETE /api/sabwriter/presence/leave?documentId=${encodeURIComponent(this.docId)} (src/lib/sabwriter/transport.ts:123)"}, "fullDescription": {"text": "`src/lib/sabwriter/transport.ts:123` calls `DELETE /api/sabwriter/presence/leave?documentId=${encodeURIComponent(this.docId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabwriter/presence/leave`\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-f62d4e3201083779", "name": "Dangling fetch: POST /api/v1/sabcall/calls (src/lib/sabcall/sdk.ts:141)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/sabcall/calls (src/lib/sabcall/sdk.ts:141)"}, "fullDescription": {"text": "`src/lib/sabcall/sdk.ts:141` calls `POST /api/v1/sabcall/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/calls`\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-1efdaf3bc6635e6f", "name": "Dangling fetch: GET /api/v1/sabcall/calls (src/lib/sabcall/sdk.ts:152)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (src/lib/sabcall/sdk.ts:152)"}, "fullDescription": {"text": "`src/lib/sabcall/sdk.ts:152` calls `GET /api/v1/sabcall/calls` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/calls`\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-a85aebeed981e158", "name": "Dangling fetch: GET /api/v1/sabcall/contacts (src/lib/sabcall/sdk.ts:165)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/sabcall/contacts (src/lib/sabcall/sdk.ts:165)"}, "fullDescription": {"text": "`src/lib/sabcall/sdk.ts:165` calls `GET /api/v1/sabcall/contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/contacts`\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-24a54d37b1d7ad00", "name": "Dangling fetch: POST /api/v1/sabcall/contacts (src/lib/sabcall/sdk.ts:175)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/sabcall/contacts (src/lib/sabcall/sdk.ts:175)"}, "fullDescription": {"text": "`src/lib/sabcall/sdk.ts:175` calls `POST /api/v1/sabcall/contacts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/v1/sabcall/contacts`\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-4550e8bfd8066ce7", "name": "Dangling fetch: POST https://graph.microsoft.com/v1.0/subscriptions (src/lib/sabmail/push-registration.ts:106)", "shortDescription": {"text": "Dangling fetch: POST https://graph.microsoft.com/v1.0/subscriptions (src/lib/sabmail/push-registration.ts:106)"}, "fullDescription": {"text": "`src/lib/sabmail/push-registration.ts:106` calls `POST https://graph.microsoft.com/v1.0/subscriptions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/subscriptions`\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-20101ffdc60524ad", "name": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/subscriptions/${encodeURIComponent(subscriptionId)} (src/lib/sabm", "shortDescription": {"text": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/subscriptions/${encodeURIComponent(subscriptionId)} (src/lib/sabmail/push-registration.ts:136)"}, "fullDescription": {"text": "`src/lib/sabmail/push-registration.ts:136` calls `PATCH https://graph.microsoft.com/v1.0/subscriptions/${encodeURIComponent(subscriptionId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/subscriptions/<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-1fe1f53e7244affb", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabmail/ai.ts:44)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabmail/ai.ts:44)"}, "fullDescription": {"text": "`src/lib/sabmail/ai.ts:44` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-f324efb7a9c0c42e", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabmail/ai.ts:74)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabmail/ai.ts:74)"}, "fullDescription": {"text": "`src/lib/sabmail/ai.ts:74` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-0d38ca004eb00bef", "name": "Dangling fetch: GET https://openidconnect.googleapis.com/v1/userinfo (src/lib/sabmail/oauth.ts:174)", "shortDescription": {"text": "Dangling fetch: GET https://openidconnect.googleapis.com/v1/userinfo (src/lib/sabmail/oauth.ts:174)"}, "fullDescription": {"text": "`src/lib/sabmail/oauth.ts:174` calls `GET https://openidconnect.googleapis.com/v1/userinfo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/openidconnect.googleapis.com/v1/userinfo`\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-3d451c1af3bad582", "name": "Dangling fetch: GET https://graph.microsoft.com/v1.0/me (src/lib/sabmail/oauth.ts:182)", "shortDescription": {"text": "Dangling fetch: GET https://graph.microsoft.com/v1.0/me (src/lib/sabmail/oauth.ts:182)"}, "fullDescription": {"text": "`src/lib/sabmail/oauth.ts:182` calls `GET https://graph.microsoft.com/v1.0/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.microsoft.com/v1.0/me`\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-804dc797117e6c5f", "name": "Dangling fetch: GET /api/sabmail/ws-token?docId=${encodeURIComponent(docId)} (src/lib/sabmail/collab/use-collab-doc.ts:6", "shortDescription": {"text": "Dangling fetch: GET /api/sabmail/ws-token?docId=${encodeURIComponent(docId)} (src/lib/sabmail/collab/use-collab-doc.ts:68)"}, "fullDescription": {"text": "`src/lib/sabmail/collab/use-collab-doc.ts:68` calls `GET /api/sabmail/ws-token?docId=${encodeURIComponent(docId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabmail/ws-token`\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-88029b6755df06dd", "name": "Dangling fetch: GET /api/sabflow/app-presets (src/lib/sabflow/app-presets/client.ts:50)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/app-presets (src/lib/sabflow/app-presets/client.ts:50)"}, "fullDescription": {"text": "`src/lib/sabflow/app-presets/client.ts:50` calls `GET /api/sabflow/app-presets` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/app-presets`\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-180150aa0905f7c7", "name": "Dangling fetch: GET /api/sabflow/app-presets/${encodeURIComponent(id)} (src/lib/sabflow/app-presets/client.ts:78)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/app-presets/${encodeURIComponent(id)} (src/lib/sabflow/app-presets/client.ts:78)"}, "fullDescription": {"text": "`src/lib/sabflow/app-presets/client.ts:78` calls `GET /api/sabflow/app-presets/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/app-presets/<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-1561841f058d75fe", "name": "Dangling fetch: POST https://api.mistral.ai/v1/chat/completions (src/lib/sabflow/integrations/mistral.ts:14)", "shortDescription": {"text": "Dangling fetch: POST https://api.mistral.ai/v1/chat/completions (src/lib/sabflow/integrations/mistral.ts:14)"}, "fullDescription": {"text": "`src/lib/sabflow/integrations/mistral.ts:14` calls `POST https://api.mistral.ai/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mistral.ai/v1/chat/completions`\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-a6e10f74141774d6", "name": "Dangling fetch: POST https://api.together.xyz/v1/chat/completions (src/lib/sabflow/integrations/togetherAi.ts:15)", "shortDescription": {"text": "Dangling fetch: POST https://api.together.xyz/v1/chat/completions (src/lib/sabflow/integrations/togetherAi.ts:15)"}, "fullDescription": {"text": "`src/lib/sabflow/integrations/togetherAi.ts:15` calls `POST https://api.together.xyz/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.together.xyz/v1/chat/completions`\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-05ef7b16206e8a1f", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabflow/integrations/openAi.ts:23)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabflow/integrations/openAi.ts:23)"}, "fullDescription": {"text": "`src/lib/sabflow/integrations/openAi.ts:23` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-f482623671f7c4ef", "name": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/sabflow/integrations/openAi.ts:43)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/sabflow/integrations/openAi.ts:43)"}, "fullDescription": {"text": "`src/lib/sabflow/integrations/openAi.ts:43` calls `POST https://api.openai.com/v1/embeddings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/embeddings`\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-506974fbf02cfa4b", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabflow/integrations/anthropicAi.ts:23)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabflow/integrations/anthropicAi.ts:23)"}, "fullDescription": {"text": "`src/lib/sabflow/integrations/anthropicAi.ts:23` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-8b69e3217c5518ba", "name": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (src/lib/sabflow/integrations/elevenlabs.ts:", "shortDescription": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (src/lib/sabflow/integrations/elevenlabs.ts:17)"}, "fullDescription": {"text": "`src/lib/sabflow/integrations/elevenlabs.ts:17` calls `POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.elevenlabs.io/v1/text-to-speech/<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-6b76116460271013", "name": "Dangling fetch: GET /api/sabflow/forge-metadata (src/lib/sabflow/forge/metadata-client.ts:28)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/forge-metadata (src/lib/sabflow/forge/metadata-client.ts:28)"}, "fullDescription": {"text": "`src/lib/sabflow/forge/metadata-client.ts:28` calls `GET /api/sabflow/forge-metadata` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/forge-metadata`\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-d64719dbe4881f17", "name": "Dangling fetch: POST https://api.stripe.com/v1/charges (src/lib/sabflow/forge/blocks/parity/index.ts:75)", "shortDescription": {"text": "Dangling fetch: POST https://api.stripe.com/v1/charges (src/lib/sabflow/forge/blocks/parity/index.ts:75)"}, "fullDescription": {"text": "`src/lib/sabflow/forge/blocks/parity/index.ts:75` calls `POST https://api.stripe.com/v1/charges` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.stripe.com/v1/charges`\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-5754196f243a4433", "name": "Dangling fetch: POST https://api.bunny.net/purge?${params.toString()} (src/lib/sabflow/forge/blocks/parity/index.ts:283)", "shortDescription": {"text": "Dangling fetch: POST https://api.bunny.net/purge?${params.toString()} (src/lib/sabflow/forge/blocks/parity/index.ts:283)"}, "fullDescription": {"text": "`src/lib/sabflow/forge/blocks/parity/index.ts:283` calls `POST https://api.bunny.net/purge?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.bunny.net/purge`\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-fc683975b15f9e79", "name": "Dangling fetch: POST https://api.cloudinary.com/v1_1/${encodeURIComponent(cloudName)}/${encodeURIComponent(resourceType)", "shortDescription": {"text": "Dangling fetch: POST https://api.cloudinary.com/v1_1/${encodeURIComponent(cloudName)}/${encodeURIComponent(resourceType)}/upload (src/lib/sabflow/forge/blocks/parity2/index.ts:743)"}, "fullDescription": {"text": "`src/lib/sabflow/forge/blocks/parity2/index.ts:743` calls `POST https://api.cloudinary.com/v1_1/${encodeURIComponent(cloudName)}/${encodeURIComponent(resourceType)}/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.cloudinary.com/v1_1/<p>/<p>/upload`\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-f3aceb9bfd0d950a", "name": "Dangling fetch: GET /api/sabflow/forge-metadata?summary=1 (src/lib/sabflow/editor-catalog/useAppCatalog.ts:191)", "shortDescription": {"text": "Dangling fetch: GET /api/sabflow/forge-metadata?summary=1 (src/lib/sabflow/editor-catalog/useAppCatalog.ts:191)"}, "fullDescription": {"text": "`src/lib/sabflow/editor-catalog/useAppCatalog.ts:191` calls `GET /api/sabflow/forge-metadata?summary=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/forge-metadata`\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-02dfc43c63ef89ec", "name": "Dangling fetch: POST https://api.notion.com/v1/oauth/token (src/lib/sabflow/oauth/providers.ts:263)", "shortDescription": {"text": "Dangling fetch: POST https://api.notion.com/v1/oauth/token (src/lib/sabflow/oauth/providers.ts:263)"}, "fullDescription": {"text": "`src/lib/sabflow/oauth/providers.ts:263` calls `POST https://api.notion.com/v1/oauth/token` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.notion.com/v1/oauth/token`\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-ccf344ce666d2bb8", "name": "Dangling fetch: POST /api/sabflow/test-forge (src/lib/sabflow/execution/testNode.ts:71)", "shortDescription": {"text": "Dangling fetch: POST /api/sabflow/test-forge (src/lib/sabflow/execution/testNode.ts:71)"}, "fullDescription": {"text": "`src/lib/sabflow/execution/testNode.ts:71` calls `POST /api/sabflow/test-forge` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabflow/test-forge`\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-ff932d50d44f2a76", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabflow/execution/testNode.ts:324)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabflow/execution/testNode.ts:324)"}, "fullDescription": {"text": "`src/lib/sabflow/execution/testNode.ts:324` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-49ff9cb116fba836", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabflow/execution/testNode.ts:373)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabflow/execution/testNode.ts:373)"}, "fullDescription": {"text": "`src/lib/sabflow/execution/testNode.ts:373` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-cc50a49a930b967f", "name": "Dangling fetch: POST https://api.mistral.ai/v1/chat/completions (src/lib/sabflow/execution/testNode.ts:426)", "shortDescription": {"text": "Dangling fetch: POST https://api.mistral.ai/v1/chat/completions (src/lib/sabflow/execution/testNode.ts:426)"}, "fullDescription": {"text": "`src/lib/sabflow/execution/testNode.ts:426` calls `POST https://api.mistral.ai/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.mistral.ai/v1/chat/completions`\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-92747b8a1d58a3ee", "name": "Dangling fetch: POST https://api.stripe.com/v1/payment_intents (src/lib/sabflow/payments/stripe.ts:127)", "shortDescription": {"text": "Dangling fetch: POST https://api.stripe.com/v1/payment_intents (src/lib/sabflow/payments/stripe.ts:127)"}, "fullDescription": {"text": "`src/lib/sabflow/payments/stripe.ts:127` calls `POST https://api.stripe.com/v1/payment_intents` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.stripe.com/v1/payment_intents`\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-d70f559d37abc56f", "name": "Dangling fetch: POST /api/seo-tools/rank-track (src/lib/seo-suite/rank-tracker.ts:55)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/rank-track (src/lib/seo-suite/rank-tracker.ts:55)"}, "fullDescription": {"text": "`src/lib/seo-suite/rank-tracker.ts:55` calls `POST /api/seo-tools/rank-track` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/rank-track`\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-981da4d501e7ff6e", "name": "Dangling fetch: POST /api/seo-tools/backlinks (src/lib/seo-suite/backlinks.ts:27)", "shortDescription": {"text": "Dangling fetch: POST /api/seo-tools/backlinks (src/lib/seo-suite/backlinks.ts:27)"}, "fullDescription": {"text": "`src/lib/seo-suite/backlinks.ts:27` calls `POST /api/seo-tools/backlinks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/seo-tools/backlinks`\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-0f8702f8a690e175", "name": "Dangling fetch: GET https://graph.facebook.com/v25.0/${businessId}/${edge} (src/lib/actions/user.actions.ts:290)", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/${businessId}/${edge} (src/lib/actions/user.actions.ts:290)"}, "fullDescription": {"text": "`src/lib/actions/user.actions.ts:290` calls `GET https://graph.facebook.com/v25.0/${businessId}/${edge}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: axios\nNormalized path used for matching: `/https:/graph.facebook.com/v25.0/<p>/<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-bacea199616d85e6", "name": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabsms/agent/llm.ts:71)", "shortDescription": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabsms/agent/llm.ts:71)"}, "fullDescription": {"text": "`src/lib/sabsms/agent/llm.ts:71` calls `POST https://api.anthropic.com/v1/messages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.anthropic.com/v1/messages`\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-fa2325f6380a7bf6", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabsms/agent/llm.ts:113)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabsms/agent/llm.ts:113)"}, "fullDescription": {"text": "`src/lib/sabsms/agent/llm.ts:113` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\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-9c310865d35bab01", "name": "Dangling fetch: GET /sabsheet-engine/manifest.json (src/workers/sabsheet/calc.worker.ts:50)", "shortDescription": {"text": "Dangling fetch: GET /sabsheet-engine/manifest.json (src/workers/sabsheet/calc.worker.ts:50)"}, "fullDescription": {"text": "`src/workers/sabsheet/calc.worker.ts:50` calls `GET /sabsheet-engine/manifest.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sabsheet-engine/manifest.json`\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-69a693dfc33637f4", "name": "Unused endpoint: POST /run", "shortDescription": {"text": "Unused endpoint: POST /run"}, "fullDescription": {"text": "`services/sabflow-task-runner/src/index.ts` declares `POST /run` 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-3238261769795a80", "name": "Unused endpoint: POST /webhooks/sabpay", "shortDescription": {"text": "Unused endpoint: POST /webhooks/sabpay"}, "fullDescription": {"text": "`src/app/sabpay/docs/webhooks/page.tsx` declares `POST /webhooks/sabpay` 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-684f0e83ba7e1558", "name": "Unused endpoint: GET ", "shortDescription": {"text": "Unused endpoint: GET "}, "fullDescription": {"text": "`src/lib/sabcrm/reports.server.ts` declares `GET ` 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/19553"}, "properties": {"repository": "shaktisingh204/wachat", "repoUrl": "https://github.com/shaktisingh204/wachat", "branch": "main"}, "results": [{"ruleId": "scanner-d38e329f92ce9145", "level": "note", "message": {"text": "Possibly dead Python function: count_lines"}, "properties": {"repobilityId": "d218d66cf664b261", "scanner": "scanner-primary", "fingerprint": "d38e329f92ce9145", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mynew.py:9"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0cae448ee8d5bb39", "level": "note", "message": {"text": "File has no detected symbols: .tmp_sabshop_rename2.py"}, "properties": {"repobilityId": "2e6c6638c28fe187", "scanner": "scanner-primary", "fingerprint": "0cae448ee8d5bb39", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code-candidate"]}}, {"ruleId": "scanner-391c801aee58109f", "level": "note", "message": {"text": "File has no detected symbols: .tmp_sabshop_rename.py"}, "properties": {"repobilityId": "b7aff47b0e9b8497", "scanner": "scanner-primary", "fingerprint": "391c801aee58109f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code-candidate"]}}, {"ruleId": "scanner-3e631120ec223da9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 worker.js:231"}, "properties": {"repobilityId": "1fb47c3a0b98f77b", "scanner": "scanner-primary", "fingerprint": "3e631120ec223da9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-214861965aeff64c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 process_chunk.js:41"}, "properties": {"repobilityId": "e008c937a16886fa", "scanner": "scanner-primary", "fingerprint": "214861965aeff64c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d629e665e5d972b4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fix_fmtdate.js:34"}, "properties": {"repobilityId": "4aaa5910660867f0", "scanner": "scanner-primary", "fingerprint": "d629e665e5d972b4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5f1dc7447c68994", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dmp-lines.js:15"}, "properties": {"repobilityId": "8e2abcd63f209286", "scanner": "scanner-primary", "fingerprint": "b5f1dc7447c68994", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f1f5da3eacf22d82", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scaffold_sabsign_pages.js:44"}, "properties": {"repobilityId": "ca546ea69cba2097", "scanner": "scanner-primary", "fingerprint": "f1f5da3eacf22d82", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-346877f48401487a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 ddg_test.js:16"}, "properties": {"repobilityId": "66149b8d3fbb24ad", "scanner": "scanner-primary", "fingerprint": "346877f48401487a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3e05c5c05982b0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 patch.js:12"}, "properties": {"repobilityId": "8a2f5c269ff3e3f3", "scanner": "scanner-primary", "fingerprint": "e3e05c5c05982b0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a8b31ddd13388d41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 analyze.js:57"}, "properties": {"repobilityId": "8e8b0590114803af", "scanner": "scanner-primary", "fingerprint": "a8b31ddd13388d41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec212bd852afaa66", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 patch_cargo.js:9"}, "properties": {"repobilityId": "6ba3fa97f80497ad", "scanner": "scanner-primary", "fingerprint": "ec212bd852afaa66", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f90f9f0b8e7f645", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check_client.js:38"}, "properties": {"repobilityId": "961fd6fe190f1745", "scanner": "scanner-primary", "fingerprint": "9f90f9f0b8e7f645", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-902c895c10fd2f3a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 patch3.js:22"}, "properties": {"repobilityId": "397a8592be54245f", "scanner": "scanner-primary", "fingerprint": "902c895c10fd2f3a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-645f843ce2375551", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 patch3.js:116"}, "properties": {"repobilityId": "eaae488a2a8603d3", "scanner": "scanner-primary", "fingerprint": "645f843ce2375551", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f00ff7188f840c0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dmp-sidebyside.js:60"}, "properties": {"repobilityId": "94981f193d4bc6f9", "scanner": "scanner-primary", "fingerprint": "2f00ff7188f840c0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e7668fac8cd6792", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 patch_sidebar.js:11"}, "properties": {"repobilityId": "09c93ce6c6749ceb", "scanner": "scanner-primary", "fingerprint": "3e7668fac8cd6792", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d225cbf40c883ee6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dmp-align.js:86"}, "properties": {"repobilityId": "511ec0392333e4e7", "scanner": "scanner-primary", "fingerprint": "d225cbf40c883ee6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2d01a89286d2c7ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 patch-inbox.ts:185"}, "properties": {"repobilityId": "96601fecdff24c19", "scanner": "scanner-primary", "fingerprint": "2d01a89286d2c7ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0b87b866ffc9f83b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dmp-ui.js:76"}, "properties": {"repobilityId": "1be7a5e94a1dff22", "scanner": "scanner-primary", "fingerprint": "0b87b866ffc9f83b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-50f56a29648a5d1f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fix_syntax.js:105"}, "properties": {"repobilityId": "21cc6ba7ae2f305a", "scanner": "scanner-primary", "fingerprint": "50f56a29648a5d1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8fac432efc7be45b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.js:29"}, "properties": {"repobilityId": "a9deebb5fdc93edc", "scanner": "scanner-primary", "fingerprint": "8fac432efc7be45b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ce263b0edec23b1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 generate_skeletons.js:84"}, "properties": {"repobilityId": "68e24f61c27a19a0", "scanner": "scanner-primary", "fingerprint": "0ce263b0edec23b1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-861b6f47544c128e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 patch2.js:9"}, "properties": {"repobilityId": "892ec5ab0c861282", "scanner": "scanner-primary", "fingerprint": "861b6f47544c128e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bebf96e5a7f089aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 write_client.js:283"}, "properties": {"repobilityId": "3531a02c489e4acd", "scanner": "scanner-primary", "fingerprint": "bebf96e5a7f089aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f58d45107918ec30", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 write_client.js:493"}, "properties": {"repobilityId": "da501acf95612a79", "scanner": "scanner-primary", "fingerprint": "f58d45107918ec30", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-be3996bb832a0837", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 get_stopwords.js:5"}, "properties": {"repobilityId": "3125e0d3d2889556", "scanner": "scanner-primary", "fingerprint": "be3996bb832a0837", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-953440e289fc07da", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 patch_router.js:9"}, "properties": {"repobilityId": "dba45763ef9ab396", "scanner": "scanner-primary", "fingerprint": "953440e289fc07da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b4ed9255029b8691", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 dmp-test.js:5"}, "properties": {"repobilityId": "34cd32898a221c13", "scanner": "scanner-primary", "fingerprint": "b4ed9255029b8691", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c790efb6fef0d310", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 process.js:19"}, "properties": {"repobilityId": "035958060416bb22", "scanner": "scanner-primary", "fingerprint": "c790efb6fef0d310", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f43aefb555b324a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 parse-query.js:37"}, "properties": {"repobilityId": "99b2cbad41d6fb65", "scanner": "scanner-primary", "fingerprint": "9f43aefb555b324a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0606d89627d1a50f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check_tools.js:44"}, "properties": {"repobilityId": "04cdf57adefa1e12", "scanner": "scanner-primary", "fingerprint": "0606d89627d1a50f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e4efe870b2627b7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fix_ssr_false.js:16"}, "properties": {"repobilityId": "8564d012984eb551", "scanner": "scanner-primary", "fingerprint": "7e4efe870b2627b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d03ecb73aeab13b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check_ts.js:21"}, "properties": {"repobilityId": "9a3b9a4b93253d50", "scanner": "scanner-primary", "fingerprint": "d03ecb73aeab13b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ec8a80f428db19e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 setup_layouts.js:80"}, "properties": {"repobilityId": "87fb5d7ee42545e7", "scanner": "scanner-primary", "fingerprint": "6ec8a80f428db19e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78b1e87b766c7e34", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 scripts/rewrite_file_manager.js:107"}, "properties": {"repobilityId": "3bf63134c9bd11e4", "scanner": "scanner-primary", "fingerprint": "78b1e87b766c7e34", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b6c0ec32780eb22", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen-rust-client.ts:26"}, "properties": {"repobilityId": "5909d25022225585", "scanner": "scanner-primary", "fingerprint": "4b6c0ec32780eb22", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bde7591e5179b06e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clear-old-broadcasts.js:8"}, "properties": {"repobilityId": "b4d4347a5bed634e", "scanner": "scanner-primary", "fingerprint": "bde7591e5179b06e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a139b03c210739cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/assign-default-plan.mongo.js:11"}, "properties": {"repobilityId": "b352253bed08a647", "scanner": "scanner-primary", "fingerprint": "a139b03c210739cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fca94226735d1ec1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/n8n-extract-full.ts:2608"}, "properties": {"repobilityId": "a207ea0068c36481", "scanner": "scanner-primary", "fingerprint": "fca94226735d1ec1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cfac4c7ea2cd84cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wachat-index-and-dedup-migration.js:38"}, "properties": {"repobilityId": "9598cecd1a42d2ed", "scanner": "scanner-primary", "fingerprint": "cfac4c7ea2cd84cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd586a2513859730", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/create-indexes.ts:276"}, "properties": {"repobilityId": "c116eb1e3d2c01e9", "scanner": "scanner-primary", "fingerprint": "bd586a2513859730", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d509274dd80eb07f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabflow-catalog-audit.ts:560"}, "properties": {"repobilityId": "f4d363d25b7b149f", "scanner": "scanner-primary", "fingerprint": "d509274dd80eb07f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c8c430415b1bf67", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 scripts/scaffold-forge-block.ts:77"}, "properties": {"repobilityId": "65a9c5948272fae3", "scanner": "scanner-primary", "fingerprint": "1c8c430415b1bf67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dbf0f43a56719968", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scaffold-forge-block.ts:130"}, "properties": {"repobilityId": "d4086a401e1d9f67", "scanner": "scanner-primary", "fingerprint": "dbf0f43a56719968", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83ee578228c70e57", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/set-admin-credentials.ts:26"}, "properties": {"repobilityId": "00da525b97f27d9d", "scanner": "scanner-primary", "fingerprint": "83ee578228c70e57", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6dedc672d7d22a8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/hash-admin-password.ts:22"}, "properties": {"repobilityId": "4257c236904a5229", "scanner": "scanner-primary", "fingerprint": "6dedc672d7d22a8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-497caadf2acb4d00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/n8n-to-preset.ts:816"}, "properties": {"repobilityId": "b77b8a30cc0a69be", "scanner": "scanner-primary", "fingerprint": "497caadf2acb4d00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e47dce677c0f426", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/assign-default-plan.ts:10"}, "properties": {"repobilityId": "20d51bf811c0b42f", "scanner": "scanner-primary", "fingerprint": "4e47dce677c0f426", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db16ee173665e994", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/email/migrate-conversations-to-threads.ts:48"}, "properties": {"repobilityId": "417ec8d41d1f5bb9", "scanner": "scanner-primary", "fingerprint": "db16ee173665e994", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3bca8e8e7c22884", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/wachat/backfill/canned-messages.ts:115"}, "properties": {"repobilityId": "0299c9c853a3416d", "scanner": "scanner-primary", "fingerprint": "e3bca8e8e7c22884", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d37e541a9b683d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabsheet/function-parity.ts:167"}, "properties": {"repobilityId": "70823a375c115287", "scanner": "scanner-primary", "fingerprint": "4d37e541a9b683d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ffd71f9630dae80b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabsheet/migrate-v2.ts:257"}, "properties": {"repobilityId": "eab1ae2b2d045138", "scanner": "scanner-primary", "fingerprint": "ffd71f9630dae80b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18657b751f310dd5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabflow/n8n-to-rust.ts:19"}, "properties": {"repobilityId": "3d40c2ed082237d7", "scanner": "scanner-primary", "fingerprint": "18657b751f310dd5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-293d860b59f53104", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabflow/create-indexes.ts:23"}, "properties": {"repobilityId": "15dd28c007766118", "scanner": "scanner-primary", "fingerprint": "293d860b59f53104", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7df6d54ff8868ed9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sabbigin/create-indexes.ts:53"}, "properties": {"repobilityId": "b9c784b290a63e1c", "scanner": "scanner-primary", "fingerprint": "7df6d54ff8868ed9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a0fb0521d63d99f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrations/2026-05-18-lift-custom-roles-to-crm-roles.ts:90"}, "properties": {"repobilityId": "969edbc8ffcc9f0f", "scanner": "scanner-primary", "fingerprint": "1a0fb0521d63d99f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-351ba3c749055a7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 workers/broadcast-worker.js:152"}, "properties": {"repobilityId": "2ba85a8e9f3c9b10", "scanner": "scanner-primary", "fingerprint": "351ba3c749055a7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ede27fe01f866ed1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/sabcall-sdk/src/client.ts:22"}, "properties": {"repobilityId": "e98b5afd3ae3be5e", "scanner": "scanner-primary", "fingerprint": "ede27fe01f866ed1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4c6eaf9bb4c0475", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 services/sabflow-ws/src/index.ts:64"}, "properties": {"repobilityId": "2e5068da33f56e85", "scanner": "scanner-primary", "fingerprint": "e4c6eaf9bb4c0475", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a8f1e002c65c28fe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 services/sabflow-task-runner/src/index.ts:94"}, "properties": {"repobilityId": "fe4c28308296a966", "scanner": "scanner-primary", "fingerprint": "a8f1e002c65c28fe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f409a405e76c17c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate-ts-sdk.ts:313"}, "properties": {"repobilityId": "e8e907e0df2c21d1", "scanner": "scanner-primary", "fingerprint": "5f409a405e76c17c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb4c3d3b26bef5cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/code-samples.ts:96"}, "properties": {"repobilityId": "746bbf5a956cf26e", "scanner": "scanner-primary", "fingerprint": "cb4c3d3b26bef5cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c01fad7fd53876cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate-openapi-paths.ts:80"}, "properties": {"repobilityId": "06e4acb3dd0eb255", "scanner": "scanner-primary", "fingerprint": "c01fad7fd53876cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-701d67b33744c70c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/generate.ts:41"}, "properties": {"repobilityId": "efa1aacfbf0ceb5b", "scanner": "scanner-primary", "fingerprint": "701d67b33744c70c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c87a5c30d8174956", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/lint.ts:155"}, "properties": {"repobilityId": "261a0d66d782ae36", "scanner": "scanner-primary", "fingerprint": "c87a5c30d8174956", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8918db992c5a26b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 tools/api-codegen/generate-docs.ts:161"}, "properties": {"repobilityId": "9c8e35417b4fcb94", "scanner": "scanner-primary", "fingerprint": "8918db992c5a26b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-85d1f5a651024f70", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tools/api-codegen/__tests__/_count.ts:4"}, "properties": {"repobilityId": "20a13fc6f95d010b", "scanner": "scanner-primary", "fingerprint": "85d1f5a651024f70", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-700cfd8e5f3d1dc7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/sabsign-embed.js:10"}, "properties": {"repobilityId": "c4ee97400cbdcb99", "scanner": "scanner-primary", "fingerprint": "700cfd8e5f3d1dc7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bd484b7c789f91d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/worker.js:192"}, "properties": {"repobilityId": "b59abfae9788845d", "scanner": "scanner-primary", "fingerprint": "bd484b7c789f91d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0248bf63a0096311", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server.js:33"}, "properties": {"repobilityId": "51ec0d6adae748e2", "scanner": "scanner-primary", "fingerprint": "0248bf63a0096311", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2ac83dd1bd1dc3e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/api-key-create-dialog.tsx:110"}, "properties": {"repobilityId": "6a45f45241bcdd76", "scanner": "scanner-primary", "fingerprint": "2ac83dd1bd1dc3e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f23094d2bfb7fa70", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/webhook-table.tsx:83"}, "properties": {"repobilityId": "75689fe832f6b682", "scanner": "scanner-primary", "fingerprint": "f23094d2bfb7fa70", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e28825cf9d269594", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/integrations/webhook-form.tsx:174"}, "properties": {"repobilityId": "4204948a740c9a56", "scanner": "scanner-primary", "fingerprint": "e28825cf9d269594", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4e48747da796627d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/layout/email-context-bar.tsx:33"}, "properties": {"repobilityId": "5d26294a62a25c6f", "scanner": "scanner-primary", "fingerprint": "4e48747da796627d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c31910ec3af41c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/layout/email-account-switcher.tsx:33"}, "properties": {"repobilityId": "930e5bbecd9f5d71", "scanner": "scanner-primary", "fingerprint": "8c31910ec3af41c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fcd2995ffbeb385c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/journey-list.tsx:75"}, "properties": {"repobilityId": "7170cd2dd79800ce", "scanner": "scanner-primary", "fingerprint": "fcd2995ffbeb385c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1bdf714fcd77952", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/journey-detail-client.tsx:166"}, "properties": {"repobilityId": "6707763838a6b5ad", "scanner": "scanner-primary", "fingerprint": "c1bdf714fcd77952", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e016d767eb4d0260", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/journeys/canvas/node-types.tsx:78"}, "properties": {"repobilityId": "13e2297dccc8244b", "scanner": "scanner-primary", "fingerprint": "e016d767eb4d0260", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33a53e42faf12542", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/templates/transactional/transactional-templates-client.tsx:166"}, "properties": {"repobilityId": "d70d9e90a9d15ec6", "scanner": "scanner-primary", "fingerprint": "33a53e42faf12542", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df16580cd1b2692d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/audience/list-table.tsx:49"}, "properties": {"repobilityId": "344ccacfa5ab8d1d", "scanner": "scanner-primary", "fingerprint": "df16580cd1b2692d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4293ac682532a847", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/deliverability/dns-record-row.tsx:61"}, "properties": {"repobilityId": "98f19f5ec11cf647", "scanner": "scanner-primary", "fingerprint": "4293ac682532a847", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e84a7ab14ba573c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/campaigns/campaigns-client.tsx:107"}, "properties": {"repobilityId": "fd03def6cf14a436", "scanner": "scanner-primary", "fingerprint": "e84a7ab14ba573c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-897e973ce91d8f1f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/thread-view.tsx:95"}, "properties": {"repobilityId": "ccab132acb956fa5", "scanner": "scanner-primary", "fingerprint": "897e973ce91d8f1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0c47c19c409b7f1", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/email/inbox/thread-view.tsx:247"}, "properties": {"repobilityId": "cfe0032d51f3dcb0", "scanner": "scanner-primary", "fingerprint": "e0c47c19c409b7f1", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f71cbdb63da0bf75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/conversation-list.tsx:179"}, "properties": {"repobilityId": "d7c9853e014b998a", "scanner": "scanner-primary", "fingerprint": "f71cbdb63da0bf75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b14564dcaab57f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/inbox/reply-composer.tsx:109"}, "properties": {"repobilityId": "42896988b7f0b13d", "scanner": "scanner-primary", "fingerprint": "8b14564dcaab57f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8365ad239bc36621", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/overview/activity-feed.tsx:44"}, "properties": {"repobilityId": "4f7d622642aa2da7", "scanner": "scanner-primary", "fingerprint": "8365ad239bc36621", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1eb54eb15512a247", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/email/overview/account-list.tsx:78"}, "properties": {"repobilityId": "08bbb4daa543ba09", "scanner": "scanner-primary", "fingerprint": "1eb54eb15512a247", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e62fb927320cca99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/sidebar-component.tsx:614"}, "properties": {"repobilityId": "394d41aff8445b6e", "scanner": "scanner-primary", "fingerprint": "e62fb927320cca99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78719a1215afd42a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "78719a1215afd42a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-08e44a9545d3cf18", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ui/page-header.tsx:82"}, "properties": {"repobilityId": "d57121adf4e7f1fa", "scanner": "scanner-primary", "fingerprint": "08e44a9545d3cf18", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2a967af4a8af06e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/whatsapp-embedded-signup.tsx:122"}, "properties": {"repobilityId": "cb9977467b50ce40", "scanner": "scanner-primary", "fingerprint": "c2a967af4a8af06e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-399d91433e048f75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-features-selector.tsx:266"}, "properties": {"repobilityId": "027c229c1f16b370", "scanner": "scanner-primary", "fingerprint": "399d91433e048f75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-783207903128a899", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/share-permissions-modal.tsx:149"}, "properties": {"repobilityId": "ab8dc7c19a7030d6", "scanner": "scanner-primary", "fingerprint": "783207903128a899", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b071c5b579a035a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/url-shortener-sidebar.tsx:266"}, "properties": {"repobilityId": "e275d8ab9906ab83", "scanner": "scanner-primary", "fingerprint": "9b071c5b579a035a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0250d3b34e8e923e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/form-block-renderer.tsx:187"}, "properties": {"repobilityId": "b136c9e7030337e1", "scanner": "scanner-primary", "fingerprint": "0250d3b34e8e923e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7998781b4d9bf188", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/crm-product-form.tsx:167"}, "properties": {"repobilityId": "14509bd6dde3eece", "scanner": "scanner-primary", "fingerprint": "7998781b4d9bf188", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0204bb1864d82599", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-permissions-matrix.tsx:295"}, "properties": {"repobilityId": "4eb86b76c7370c53", "scanner": "scanner-primary", "fingerprint": "0204bb1864d82599", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0a56e79a336397df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/facebook-conversation-list.tsx:112"}, "properties": {"repobilityId": "0dacd3ba0b57229c", "scanner": "scanner-primary", "fingerprint": "0a56e79a336397df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-726fc4b9ba86eace", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-module-tile.tsx:119"}, "properties": {"repobilityId": "24333b2afef5111a", "scanner": "scanner-primary", "fingerprint": "726fc4b9ba86eace", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d5ed851e59152db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/project.actions.ts:532"}, "properties": {"repobilityId": "1b7d8afd0b118153", "scanner": "scanner-primary", "fingerprint": "6d5ed851e59152db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-789240ee3a415f0e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/project-switcher.tsx:35"}, "properties": {"repobilityId": "a31e51d41bc3174d", "scanner": "scanner-primary", "fingerprint": "789240ee3a415f0e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df070e3bd6df6587", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/create-template-form.tsx:222"}, "properties": {"repobilityId": "92d42f5d9db31656", "scanner": "scanner-primary", "fingerprint": "df070e3bd6df6587", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d3c80bfdb5deb5d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-message-input.tsx:311"}, "properties": {"repobilityId": "ed1db5e79bf9d8e4", "scanner": "scanner-primary", "fingerprint": "d3c80bfdb5deb5d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbd2404ae82d2a8f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/new-chat-dialog.tsx:89"}, "properties": {"repobilityId": "cb348634ebc0ec97", "scanner": "scanner-primary", "fingerprint": "cbd2404ae82d2a8f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ba4bd77b0d46737", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/crm-add-client-dialog.tsx:172"}, "properties": {"repobilityId": "3e28a5f6360995d4", "scanner": "scanner-primary", "fingerprint": "6ba4bd77b0d46737", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c290ad2b90201c7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/referrer-table.tsx:149"}, "properties": {"repobilityId": "72c342bff996d6ff", "scanner": "scanner-primary", "fingerprint": "c290ad2b90201c7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90fdd3011afd4b64", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/crm-form-preview.tsx:165"}, "properties": {"repobilityId": "bc4047a90280106c", "scanner": "scanner-primary", "fingerprint": "90fdd3011afd4b64", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a746f89e9d3c2954", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/project-card.tsx:121"}, "properties": {"repobilityId": "47c045042a9b6d64", "scanner": "scanner-primary", "fingerprint": "a746f89e9d3c2954", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40e7e7d04f6de079", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/url-collections-sidebar.tsx:99"}, "properties": {"repobilityId": "c1a7badd303a318d", "scanner": "scanner-primary", "fingerprint": "40e7e7d04f6de079", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8258c9f41418993c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-contact-list.tsx:218"}, "properties": {"repobilityId": "5d48a8ab7abd58a2", "scanner": "scanner-primary", "fingerprint": "8258c9f41418993c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-46e1e601415b2f5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/canned-messages-settings-tab.tsx:143"}, "properties": {"repobilityId": "96f3613a53e97036", "scanner": "scanner-primary", "fingerprint": "46e1e601415b2f5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e54eafe1cbd67266", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/20ui-domain/run-cron-jobs-button.tsx:42"}, "properties": {"repobilityId": "e7e2134113854c4b", "scanner": "scanner-primary", "fingerprint": "e54eafe1cbd67266", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e7698054e306657", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/properties-panel.tsx:56"}, "properties": {"repobilityId": "83563b72f917f073", "scanner": "scanner-primary", "fingerprint": "4e7698054e306657", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d41705c626ddb8e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/qr-code-generator.tsx:820"}, "properties": {"repobilityId": "5d17a6fa5fec69ae", "scanner": "scanner-primary", "fingerprint": "d41705c626ddb8e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4c69f64197729c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-notification-card.tsx:69"}, "properties": {"repobilityId": "6dab750189070e72", "scanner": "scanner-primary", "fingerprint": "f4c69f64197729c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ecc20bf48cd9983b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-dashboard-layout.tsx:2990"}, "properties": {"repobilityId": "cf98f140aad796ca", "scanner": "scanner-primary", "fingerprint": "ecc20bf48cd9983b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc693e0b3e2c290e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/comments-notes-panel.tsx:226"}, "properties": {"repobilityId": "0447f0a4735e47b3", "scanner": "scanner-primary", "fingerprint": "dc693e0b3e2c290e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7427066969edea58", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/crm-add-account-dialog.tsx:61"}, "properties": {"repobilityId": "2d9c632c30b0016e", "scanner": "scanner-primary", "fingerprint": "7427066969edea58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-00db053fe69cd18e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/embedded-form.tsx:482"}, "properties": {"repobilityId": "4f3112befdbd734a", "scanner": "scanner-primary", "fingerprint": "00db053fe69cd18e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9184f4803bd4e9ee", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/20ui-domain/embedded-form.tsx:468"}, "properties": {"repobilityId": "696a796743c17f38", "scanner": "scanner-primary", "fingerprint": "9184f4803bd4e9ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d1656673128440a0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/embedded-form.tsx:381"}, "properties": {"repobilityId": "a4c7a79f6e891779", "scanner": "scanner-primary", "fingerprint": "d1656673128440a0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e63d2a3850ac4175", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/plan-feature-groups.tsx:152"}, "properties": {"repobilityId": "27f322193d9a1b27", "scanner": "scanner-primary", "fingerprint": "e63d2a3850ac4175", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b5ec41a480464fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-project-gate.tsx:254"}, "properties": {"repobilityId": "e31331efc6b14487", "scanner": "scanner-primary", "fingerprint": "9b5ec41a480464fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a6a06dbe875435e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-sidebar.tsx:136"}, "properties": {"repobilityId": "f0c08a175e4becb5", "scanner": "scanner-primary", "fingerprint": "8a6a06dbe875435e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45ccd3b67a235b3a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo-project-card.tsx:119"}, "properties": {"repobilityId": "46172382b7f2b7ba", "scanner": "scanner-primary", "fingerprint": "45ccd3b67a235b3a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07c84a989244b00c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/admin-sidebar-nav.tsx:88"}, "properties": {"repobilityId": "0eb45ce0970e5562", "scanner": "scanner-primary", "fingerprint": "07c84a989244b00c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d69232236ec87446", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-message.tsx:155"}, "properties": {"repobilityId": "4317f115800df590", "scanner": "scanner-primary", "fingerprint": "d69232236ec87446", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc00083d21909edd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-user-card.tsx:45"}, "properties": {"repobilityId": "27cf37843bdbee87", "scanner": "scanner-primary", "fingerprint": "bc00083d21909edd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef7d8933f653137a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/clay-section-list.tsx:63"}, "properties": {"repobilityId": "829b630447d658af", "scanner": "scanner-primary", "fingerprint": "ef7d8933f653137a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c21773e9b7c5579", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/sabchat-conversation-list.tsx:103"}, "properties": {"repobilityId": "6a808418e81a76f4", "scanner": "scanner-primary", "fingerprint": "2c21773e9b7c5579", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce2f93c5a25cbafa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/saved-qr-codes.tsx:130"}, "properties": {"repobilityId": "4c5cc20520178fe7", "scanner": "scanner-primary", "fingerprint": "ce2f93c5a25cbafa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b0b06d4d718ebd1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/add-thumbnail-dialog.tsx:85"}, "properties": {"repobilityId": "47b621b94563f793", "scanner": "scanner-primary", "fingerprint": "3b0b06d4d718ebd1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b8d91981dd7bfd0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/chat-window.tsx:200"}, "properties": {"repobilityId": "da55a97817d02be6", "scanner": "scanner-primary", "fingerprint": "0b8d91981dd7bfd0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a44795faf311a777", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/meta-flow-editor/layout/meta-flow-navigator.tsx:129"}, "properties": {"repobilityId": "5417a40caefda3ad", "scanner": "scanner-primary", "fingerprint": "a44795faf311a777", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-382944d648aff0fd", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/rich-text-block-renderer.tsx:84"}, "properties": {"repobilityId": "57adc6606c77065d", "scanner": "scanner-primary", "fingerprint": "382944d648aff0fd", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-68a89a4ff6559ef4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/form-block-renderer.tsx:185"}, "properties": {"repobilityId": "a451fc341251d26b", "scanner": "scanner-primary", "fingerprint": "68a89a4ff6559ef4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-88dbbe360f67b025", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/20ui-domain/website-builder/block-renderer.tsx:31"}, "properties": {"repobilityId": "58d0ce3e52547c2e", "scanner": "scanner-primary", "fingerprint": "88dbbe360f67b025", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-05df2b4f87b9de65", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/page-manager-panel.tsx:100"}, "properties": {"repobilityId": "64ad4b317737ec99", "scanner": "scanner-primary", "fingerprint": "05df2b4f87b9de65", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a99852d30d41387", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/crm-form-builder.tsx:190"}, "properties": {"repobilityId": "357c8b8ef2614b5a", "scanner": "scanner-primary", "fingerprint": "6a99852d30d41387", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed03ac688880f3e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/website-builder/surface-switcher.tsx:38"}, "properties": {"repobilityId": "347abb1322145272", "scanner": "scanner-primary", "fingerprint": "ed03ac688880f3e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8d83053e8889aa9a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/templates/CarouselBuilder.tsx:327"}, "properties": {"repobilityId": "310c3a615b1d57f5", "scanner": "scanner-primary", "fingerprint": "8d83053e8889aa9a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f280217bc9eeb68c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/meta-data-table.tsx:205"}, "properties": {"repobilityId": "de5be47730be6a47", "scanner": "scanner-primary", "fingerprint": "f280217bc9eeb68c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de3df61b594b57f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/ad-manager-shell.tsx:63"}, "properties": {"repobilityId": "1877830c592fa7ec", "scanner": "scanner-primary", "fingerprint": "de3df61b594b57f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd6169cefe86c4f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/ad-manager/create-wizard/ad-previews.tsx:87"}, "properties": {"repobilityId": "86970f3b769f360a", "scanner": "scanner-primary", "fingerprint": "dd6169cefe86c4f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-490a509326119c64", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 src/components/20ui-domain/flow-builder/page.tsx:394"}, "properties": {"repobilityId": "2bd1f80ceee3736c", "scanner": "scanner-primary", "fingerprint": "490a509326119c64", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-aade1c21e3c89682", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/flow-builder/properties/send-template-editor.tsx:174"}, "properties": {"repobilityId": "1a3c2171273bc48f", "scanner": "scanner-primary", "fingerprint": "aade1c21e3c89682", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5801c67e3e7c2aaf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/audit-table.tsx:90"}, "properties": {"repobilityId": "586bf847e8e14507", "scanner": "scanner-primary", "fingerprint": "5801c67e3e7c2aaf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-223617175b2da324", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/audit-diff-viewer.tsx:81"}, "properties": {"repobilityId": "664183ebe1b18e08", "scanner": "scanner-primary", "fingerprint": "223617175b2da324", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b199f7fc93bb5d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/20ui-domain/seo/rankings-table.tsx:48"}, "properties": {"repobilityId": "f42299a945bdaa31", "scanner": "scanner-primary", "fingerprint": "8b199f7fc93bb5d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2d040c91569f46e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wachat/preview/index.tsx:78"}, "properties": {"repobilityId": "2ba21636b909498f", "scanner": "scanner-primary", "fingerprint": "d2d040c91569f46e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d02bf39796b77e90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/wachat/contacts/ai-duplicate-finder.tsx:107"}, "properties": {"repobilityId": "d0b75c0ab458993e", "scanner": "scanner-primary", "fingerprint": "d02bf39796b77e90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a898914beec959da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/files/file-upload.tsx:482"}, "properties": {"repobilityId": "e154ee467c4a017e", "scanner": "scanner-primary", "fingerprint": "a898914beec959da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f8065fa1c6ece74b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/panels/NodePropertiesPanel.tsx:612"}, "properties": {"repobilityId": "a55264476df210ab", "scanner": "scanner-primary", "fingerprint": "f8065fa1c6ece74b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1b45dd46c3812ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNodesList.tsx:179"}, "properties": {"repobilityId": "6e8b7b84a2c454cc", "scanner": "scanner-primary", "fingerprint": "e1b45dd46c3812ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26bde41b35f37601", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNodeProperties.tsx:62"}, "properties": {"repobilityId": "e3b4445abc1d1eb9", "scanner": "scanner-primary", "fingerprint": "26bde41b35f37601", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c70cb0b63991b43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/N8NNode.tsx:145"}, "properties": {"repobilityId": "3dc94744898d9b3e", "scanner": "scanner-primary", "fingerprint": "5c70cb0b63991b43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-daff774e46db2c30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/triggers/ScheduleTrigger.tsx:288"}, "properties": {"repobilityId": "2eba3f55c07473f8", "scanner": "scanner-primary", "fingerprint": "daff774e46db2c30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26ddd2acfc8d0a28", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/triggers/WebhookTrigger.tsx:107"}, "properties": {"repobilityId": "fabc570a84b70f1c", "scanner": "scanner-primary", "fingerprint": "26ddd2acfc8d0a28", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cbcc01cdc26d029b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/logic/SwitchNode.tsx:208"}, "properties": {"repobilityId": "ed7e1e445558aee1", "scanner": "scanner-primary", "fingerprint": "cbcc01cdc26d029b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-924e41087dee4dee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/SetDataNode.tsx:294"}, "properties": {"repobilityId": "c96695ef5106d7a0", "scanner": "scanner-primary", "fingerprint": "924e41087dee4dee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bd71a2e6b0b97a31", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/WhatsAppSendNode.tsx:390"}, "properties": {"repobilityId": "b2c588ba7c85cb32", "scanner": "scanner-primary", "fingerprint": "bd71a2e6b0b97a31", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-16fe1b49cb50dc89", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/n8n/nodes/actions/HttpRequestNode.tsx:512"}, "properties": {"repobilityId": "fa1bc08eadb82d3a", "scanner": "scanner-primary", "fingerprint": "16fe1b49cb50dc89", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f8e147b9dd0361c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/assignment-control.tsx:288"}, "properties": {"repobilityId": "4f7a89f809e36c3b", "scanner": "scanner-primary", "fingerprint": "5f8e147b9dd0361c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06cbb224b2707a6e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/record-activity.tsx:315"}, "properties": {"repobilityId": "c53c423f403daf2a", "scanner": "scanner-primary", "fingerprint": "06cbb224b2707a6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1eb86c46d703626", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/sabcrm/sabcrm-suite-frame.tsx:357"}, "properties": {"repobilityId": "fe460f00f8136b68", "scanner": "scanner-primary", "fingerprint": "f1eb86c46d703626", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-852e54571e48c9d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/object-editor.tsx:873"}, "properties": {"repobilityId": "975b8839bf8cca02", "scanner": "scanner-primary", "fingerprint": "852e54571e48c9d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df406860f9729af7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/apikey-manager.tsx:355"}, "properties": {"repobilityId": "6f01ef6a274255ba", "scanner": "scanner-primary", "fingerprint": "df406860f9729af7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7bdec2ed3d95c4f1", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/components/sabcrm/command-menu-data.ts:91"}, "properties": {"repobilityId": "6d8526c9e23127a4", "scanner": "scanner-primary", "fingerprint": "7bdec2ed3d95c4f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-5f6f5463e774c890", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/activity-composer.tsx:440"}, "properties": {"repobilityId": "c4880f32e68602ee", "scanner": "scanner-primary", "fingerprint": "5f6f5463e774c890", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c09e44e855ebd9f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/relation-input.tsx:128"}, "properties": {"repobilityId": "cd3f7a3f9059b765", "scanner": "scanner-primary", "fingerprint": "c09e44e855ebd9f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-72a704f6d3b0233b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/webhook-manager.tsx:567"}, "properties": {"repobilityId": "38e71d66ddcc0a3e", "scanner": "scanner-primary", "fingerprint": "72a704f6d3b0233b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-574afd0b25ab62e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/related-records-panel.tsx:465"}, "properties": {"repobilityId": "9262aefd960fa715", "scanner": "scanner-primary", "fingerprint": "574afd0b25ab62e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34adae9a9251ccd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/sabcrm-command.tsx:215"}, "properties": {"repobilityId": "2db3b54a35189ca6", "scanner": "scanner-primary", "fingerprint": "34adae9a9251ccd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44de81b392bd68f9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/activity-timeline.tsx:277"}, "properties": {"repobilityId": "db5d66243e5daa75", "scanner": "scanner-primary", "fingerprint": "44de81b392bd68f9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-71c96acf8f0058df", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/chart.tsx:129"}, "properties": {"repobilityId": "3cd0fb0cf641c988", "scanner": "scanner-primary", "fingerprint": "71c96acf8f0058df", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-8d1ea8a92f20bb30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/tag-picker.tsx:185"}, "properties": {"repobilityId": "c26fbee618d793b3", "scanner": "scanner-primary", "fingerprint": "8d1ea8a92f20bb30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c5badae37dd6e05e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/composites/markdown.tsx:24"}, "properties": {"repobilityId": "3b17f53f4e1275b6", "scanner": "scanner-primary", "fingerprint": "c5badae37dd6e05e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-c8218973250451d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/chart.tsx:90"}, "properties": {"repobilityId": "38551f974282ebcc", "scanner": "scanner-primary", "fingerprint": "c8218973250451d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a03f7ad2afc9fe40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/action-search-bar.tsx:129"}, "properties": {"repobilityId": "6f96526ccab97c07", "scanner": "scanner-primary", "fingerprint": "a03f7ad2afc9fe40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a836b646dbb10758", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/launchpad.tsx:258"}, "properties": {"repobilityId": "c422163c64f74139", "scanner": "scanner-primary", "fingerprint": "a836b646dbb10758", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0bb606fbaadd671", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/app-sidebar.tsx:254"}, "properties": {"repobilityId": "e8d5253fa4507e98", "scanner": "scanner-primary", "fingerprint": "e0bb606fbaadd671", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d3f18944e971721", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/shell/desktop-canvas.tsx:344"}, "properties": {"repobilityId": "f722680a78e8dd80", "scanner": "scanner-primary", "fingerprint": "9d3f18944e971721", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41d58efb56e02a96", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/sabcrm/20ui/composites/editor/rich-text.tsx:190"}, "properties": {"repobilityId": "f21c52378f6053fe", "scanner": "scanner-primary", "fingerprint": "41d58efb56e02a96", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8ce950083046fb9e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/sabcrm/20ui/composites/editor/rich-text.tsx:276"}, "properties": {"repobilityId": "c539ff60647b1f64", "scanner": "scanner-primary", "fingerprint": "8ce950083046fb9e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e0dcd555eeb68884", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabcrm/20ui/composites/dynamic-selector/selector.tsx:188"}, "properties": {"repobilityId": "01e51d96a70d6fdd", "scanner": "scanner-primary", "fingerprint": "e0dcd555eeb68884", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a857406af352cdd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sab-ui/sab-button.tsx:118"}, "properties": {"repobilityId": "15f463b0cf8be38e", "scanner": "scanner-primary", "fingerprint": "6a857406af352cdd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-148ad45206512cff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/shell.tsx:95"}, "properties": {"repobilityId": "6c52fdb7484d45fe", "scanner": "scanner-primary", "fingerprint": "148ad45206512cff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8114dc30f0bff1ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin/AuditLogTable.tsx:109"}, "properties": {"repobilityId": "cb5e132774193497", "scanner": "scanner-primary", "fingerprint": "8114dc30f0bff1ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc3f8612dc77a10d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabmail/surface/list-row.tsx:57"}, "properties": {"repobilityId": "5d530debb5e74a59", "scanner": "scanner-primary", "fingerprint": "bc3f8612dc77a10d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f1e57dbc666fac0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing/landing-header.tsx:801"}, "properties": {"repobilityId": "86f0da72286275c3", "scanner": "scanner-primary", "fingerprint": "9f1e57dbc666fac0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cea3b791e7e561bf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/builder/editor-layout.tsx:102"}, "properties": {"repobilityId": "b1e772d886354165", "scanner": "scanner-primary", "fingerprint": "cea3b791e7e561bf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c26d764c2dfc1c5b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/category-sections.tsx:83"}, "properties": {"repobilityId": "a2909e1a6a0b9fa0", "scanner": "scanner-primary", "fingerprint": "c26d764c2dfc1c5b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cc414fd544990002", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/mega-menu.tsx:257"}, "properties": {"repobilityId": "94fb000cec495586", "scanner": "scanner-primary", "fingerprint": "cc414fd544990002", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-28f8a05d89bcb363", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/pricing-page.tsx:585"}, "properties": {"repobilityId": "90ff41462b4e5405", "scanner": "scanner-primary", "fingerprint": "28f8a05d89bcb363", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8895cb27c9a62cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/bespoke-extras.tsx:324"}, "properties": {"repobilityId": "3ca19168eb7d2bc8", "scanner": "scanner-primary", "fingerprint": "d8895cb27c9a62cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f625fe73ae6118c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/sabcall-showcase.tsx:328"}, "properties": {"repobilityId": "f4c58e94238a3877", "scanner": "scanner-primary", "fingerprint": "f625fe73ae6118c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-123011a548c1fbf7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/crm-demo.tsx:141"}, "properties": {"repobilityId": "f75e04196cd67dd5", "scanner": "scanner-primary", "fingerprint": "123011a548c1fbf7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8e4bb664c3ea0443", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/landing-v2/sections/sabflow-demo.tsx:205"}, "properties": {"repobilityId": "a3bf980198af94fc", "scanner": "scanner-primary", "fingerprint": "8e4bb664c3ea0443", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-7e8f5f3e8d174bc5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/sabflow-demo.tsx:177"}, "properties": {"repobilityId": "61679cfaa9b5415f", "scanner": "scanner-primary", "fingerprint": "7e8f5f3e8d174bc5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94384c8648aebd26", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/sections/hero.tsx:215"}, "properties": {"repobilityId": "4f3010d8bcfd5b4e", "scanner": "scanner-primary", "fingerprint": "94384c8648aebd26", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-470e30f5988a67d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/heroes/sabchat-hero.tsx:99"}, "properties": {"repobilityId": "7b2461544ba11fe5", "scanner": "scanner-primary", "fingerprint": "470e30f5988a67d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0f39d3d9d7c91d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/heroes/crm-hero.tsx:88"}, "properties": {"repobilityId": "1546319948106677", "scanner": "scanner-primary", "fingerprint": "f0f39d3d9d7c91d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c152bcb1431cfcba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-v2/mockups/index.tsx:217"}, "properties": {"repobilityId": "952ea1c5e5f25a32", "scanner": "scanner-primary", "fingerprint": "c152bcb1431cfcba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4afb3b85a111ccd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/hub-kpi-grid.tsx:135"}, "properties": {"repobilityId": "621963b0be824aa5", "scanner": "scanner-primary", "fingerprint": "4afb3b85a111ccd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc580e3ae4b6acd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/universal-search.tsx:152"}, "properties": {"repobilityId": "fc2e8f2e1f96bf80", "scanner": "scanner-primary", "fingerprint": "dc580e3ae4b6acd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-981e0d4bf0b1af89", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-list-shell.tsx:99"}, "properties": {"repobilityId": "411af0aafeab72f9", "scanner": "scanner-primary", "fingerprint": "981e0d4bf0b1af89", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f8284b4c749b861", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/crm-form-drawer.tsx:80"}, "properties": {"repobilityId": "4fd80cde9b701838", "scanner": "scanner-primary", "fingerprint": "8f8284b4c749b861", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-475a2a0a020eaad1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/SavedViewsBar.tsx:311"}, "properties": {"repobilityId": "3e8c054e39602805", "scanner": "scanner-primary", "fingerprint": "475a2a0a020eaad1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b1b61cad9afd488", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/assignment-control.tsx:222"}, "properties": {"repobilityId": "cd40546f421d7c38", "scanner": "scanner-primary", "fingerprint": "5b1b61cad9afd488", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a044943a7e0c78f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/command-palette.tsx:517"}, "properties": {"repobilityId": "09d7c2f517ce761b", "scanner": "scanner-primary", "fingerprint": "a044943a7e0c78f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e06fa1e5c16b9ab5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/crm-lineage-chart.tsx:80"}, "properties": {"repobilityId": "b5f6bdbd5a98e558", "scanner": "scanner-primary", "fingerprint": "e06fa1e5c16b9ab5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ea9421abd3514081", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-detail-shell.tsx:97"}, "properties": {"repobilityId": "1cd3f5ecf6aca0b4", "scanner": "scanner-primary", "fingerprint": "ea9421abd3514081", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b0edae5132690e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/keyboard-shortcuts.tsx:222"}, "properties": {"repobilityId": "1bf0b8f915eb6ee3", "scanner": "scanner-primary", "fingerprint": "6b0edae5132690e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d29c81cad8afa9bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/mention-textarea.tsx:195"}, "properties": {"repobilityId": "ab2d8fd17fd45d4a", "scanner": "scanner-primary", "fingerprint": "d29c81cad8afa9bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d8380e957e76d51", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/BulkImportWizard.tsx:428"}, "properties": {"repobilityId": "78e0e53b65af2941", "scanner": "scanner-primary", "fingerprint": "3d8380e957e76d51", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70831092ce758ff3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/entity-picker.tsx:257"}, "properties": {"repobilityId": "6cea2e8a9042232b", "scanner": "scanner-primary", "fingerprint": "70831092ce758ff3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02277c041d148d95", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/crm/enum-filter-field.tsx:12"}, "properties": {"repobilityId": "8fdb1e92d715101d", "scanner": "scanner-primary", "fingerprint": "02277c041d148d95", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a1c2e7264a866e8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/lineage-rail.tsx:244"}, "properties": {"repobilityId": "e1794693c2a098dd", "scanner": "scanner-primary", "fingerprint": "a1c2e7264a866e8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec175e705a195884", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/crm/live-editor/live-sidebar.tsx:254"}, "properties": {"repobilityId": "ba0e88504f0c5ae7", "scanner": "scanner-primary", "fingerprint": "ec175e705a195884", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aab03dd308718b0f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/crm/live-editor/live-canvas.tsx:62"}, "properties": {"repobilityId": "60335b52c3ec39b3", "scanner": "scanner-primary", "fingerprint": "aab03dd308718b0f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-93608ea85b88d7d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/telegram-flows/FlowCanvas.tsx:360"}, "properties": {"repobilityId": "5f03af69acf63261", "scanner": "scanner-primary", "fingerprint": "93608ea85b88d7d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a59856a265acb66c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/RecentActivityFeed.tsx:98"}, "properties": {"repobilityId": "2b7b09942eb0b2fc", "scanner": "scanner-primary", "fingerprint": "a59856a265acb66c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3e8aaad3a47d5ff0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/UpstreamDataPicker.tsx:413"}, "properties": {"repobilityId": "d2c8650624daeef3", "scanner": "scanner-primary", "fingerprint": "3e8aaad3a47d5ff0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-577ce78bd8547774", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/NodeOutputBadge.tsx:68"}, "properties": {"repobilityId": "457f3b8c8c805cb3", "scanner": "scanner-primary", "fingerprint": "577ce78bd8547774", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aacc782f90331848", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/dataPicker/NodeOutputRow.tsx:55"}, "properties": {"repobilityId": "f681dab9d4920098", "scanner": "scanner-primary", "fingerprint": "aacc782f90331848", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2601a9886837318b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/marketplace/TemplateCard.tsx:111"}, "properties": {"repobilityId": "10f8aa4794203a62", "scanner": "scanner-primary", "fingerprint": "2601a9886837318b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6111fa539029fd6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:507"}, "properties": {"repobilityId": "8cf940a4bcc872ee", "scanner": "scanner-primary", "fingerprint": "b6111fa539029fd6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2955a416be20f881", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:237"}, "properties": {"repobilityId": "36f65521ab699a86", "scanner": "scanner-primary", "fingerprint": "2955a416be20f881", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc7869392bc5082e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/results/ResultsTable.tsx:103"}, "properties": {"repobilityId": "75bb60a3e4c97b3d", "scanner": "scanner-primary", "fingerprint": "fc7869392bc5082e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0aacaa99919bb5e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/results/FlowResultsClient.tsx:207"}, "properties": {"repobilityId": "d8abad9dd8bc8b42", "scanner": "scanner-primary", "fingerprint": "0aacaa99919bb5e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4e5007812d0d319", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/variables/VariablesPanel.tsx:154"}, "properties": {"repobilityId": "43cf78d1bf0febca", "scanner": "scanner-primary", "fingerprint": "e4e5007812d0d319", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6ef5978d9fb324a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/ValidationPanel.tsx:128"}, "properties": {"repobilityId": "fdc1434fdbaeede9", "scanner": "scanner-primary", "fingerprint": "b6ef5978d9fb324a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8107448ae05d76a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/TriggerEventSettings.tsx:116"}, "properties": {"repobilityId": "d25b4eba0beae687", "scanner": "scanner-primary", "fingerprint": "b8107448ae05d76a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42f060539f8c0563", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/VersionHistoryPanel.tsx:492"}, "properties": {"repobilityId": "4e1d45a99f608be0", "scanner": "scanner-primary", "fingerprint": "42f060539f8c0563", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00662ebe04ef99fd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/BlockSettingsPanel.tsx:275"}, "properties": {"repobilityId": "8b9c776b088f8213", "scanner": "scanner-primary", "fingerprint": "00662ebe04ef99fd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aebe6df95e29e1ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/DomainsPanel.tsx:210"}, "properties": {"repobilityId": "2e536167671b415b", "scanner": "scanner-primary", "fingerprint": "aebe6df95e29e1ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-521d7db803ccf7b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/VariablesPanel.tsx:104"}, "properties": {"repobilityId": "470bcacca655da56", "scanner": "scanner-primary", "fingerprint": "521d7db803ccf7b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-33523f71039eb002", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/NotificationsPanel.tsx:304"}, "properties": {"repobilityId": "1d11f34d2ffb3228", "scanner": "scanner-primary", "fingerprint": "33523f71039eb002", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-28f02d3cb3fc6e15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/AudioBubbleSettings.tsx:23"}, "properties": {"repobilityId": "281232af95d41178", "scanner": "scanner-primary", "fingerprint": "28f02d3cb3fc6e15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc98b1e541ed6101", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/forge/AppPresetSettings.tsx:233"}, "properties": {"repobilityId": "b0608575f0fbcc49", "scanner": "scanner-primary", "fingerprint": "bc98b1e541ed6101", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f906334d9e3d9cdb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/ExpressionEditor.tsx:683"}, "properties": {"repobilityId": "deeb00ec71fe5050", "scanner": "scanner-primary", "fingerprint": "f906334d9e3d9cdb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b87c793852e55604", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/VariableMentionMenu.tsx:151"}, "properties": {"repobilityId": "17a70ddf7260659a", "scanner": "scanner-primary", "fingerprint": "b87c793852e55604", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-937c59db354b55f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/shared/FileUploadInput.tsx:126"}, "properties": {"repobilityId": "ff0bfcc6839997ab", "scanner": "scanner-primary", "fingerprint": "937c59db354b55f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c2071ab8b44a6ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/panels/blocks/logic/ScriptSettings.tsx:388"}, "properties": {"repobilityId": "83617c3bc763cf06", "scanner": "scanner-primary", "fingerprint": "4c2071ab8b44a6ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e647085bba59b4db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/playback/PlaybackInspector.tsx:512"}, "properties": {"repobilityId": "ce32925b08f64eae", "scanner": "scanner-primary", "fingerprint": "e647085bba59b4db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a60651919cc7270e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/playback/PlaybackDiff.tsx:247"}, "properties": {"repobilityId": "35bb6219236c96e0", "scanner": "scanner-primary", "fingerprint": "a60651919cc7270e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee74ceacc13382c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/BlocksSideBar.tsx:511"}, "properties": {"repobilityId": "3dbe9fb27d045702", "scanner": "scanner-primary", "fingerprint": "ee74ceacc13382c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-575af8650e713d30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowSettingsPanel.tsx:233"}, "properties": {"repobilityId": "02ea65f8afbd22d6", "scanner": "scanner-primary", "fingerprint": "575af8650e713d30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30bceed482e5bac3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowPreviewPanel.tsx:856"}, "properties": {"repobilityId": "8fdbe434c7d21ba0", "scanner": "scanner-primary", "fingerprint": "30bceed482e5bac3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f038bad016bdb0d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/FlowEditorHeader.tsx:112"}, "properties": {"repobilityId": "705d893acf59354d", "scanner": "scanner-primary", "fingerprint": "2f038bad016bdb0d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b6a732eb9d6a83bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/chrome/PresenceAvatarStack.tsx:311"}, "properties": {"repobilityId": "b2bfc39387d23cf6", "scanner": "scanner-primary", "fingerprint": "b6a732eb9d6a83bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2deb923df136b13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/editor/chrome/PresenceSidebar.tsx:157"}, "properties": {"repobilityId": "23532b53aedf30c7", "scanner": "scanner-primary", "fingerprint": "a2deb923df136b13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-178ed513d6a675aa", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/sabflow/editor/chrome/EditorCollabMount.tsx:224"}, "properties": {"repobilityId": "395e64f7f94df86d", "scanner": "scanner-primary", "fingerprint": "178ed513d6a675aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2dfefe74a6de1842", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/diff/FlowDiffView.tsx:448"}, "properties": {"repobilityId": "42d4dafeede7b6d5", "scanner": "scanner-primary", "fingerprint": "2dfefe74a6de1842", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d293623adae3e43a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/diff/DiffRow.tsx:105"}, "properties": {"repobilityId": "f24623da0da71128", "scanner": "scanner-primary", "fingerprint": "d293623adae3e43a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4108becb3046c74d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/canvas/nodeCreator/NodeCreator.tsx:209"}, "properties": {"repobilityId": "b47185f826e62a0c", "scanner": "scanner-primary", "fingerprint": "4108becb3046c74d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b709d191ff0b629", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/StepTimelineItem.tsx:134"}, "properties": {"repobilityId": "574f5edc00657575", "scanner": "scanner-primary", "fingerprint": "1b709d191ff0b629", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-42cf9c27dc4bcee9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/VariableDiffItem.tsx:67"}, "properties": {"repobilityId": "a1015cd19430657e", "scanner": "scanner-primary", "fingerprint": "42cf9c27dc4bcee9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4079f10204e4383", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/debug/DebugConsolePanel.tsx:442"}, "properties": {"repobilityId": "765353efa0de5994", "scanner": "scanner-primary", "fingerprint": "e4079f10204e4383", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20b9c35e2e8f4e5f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/blocks/panels/BlockPropertiesPanel.tsx:82"}, "properties": {"repobilityId": "08cf09c04357684d", "scanner": "scanner-primary", "fingerprint": "20b9c35e2e8f4e5f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e6c0ba754325eac", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/inspector/NodeDataInspector.tsx:191"}, "properties": {"repobilityId": "e3c4fab741f6d2a7", "scanner": "scanner-primary", "fingerprint": "7e6c0ba754325eac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9abc1443e0f8b0b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/group/GroupNode.tsx:210"}, "properties": {"repobilityId": "47cee35be71fddb8", "scanner": "scanner-primary", "fingerprint": "a9abc1443e0f8b0b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-837594ad2c2c059e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/block/BlockNodeOverlay.tsx:45"}, "properties": {"repobilityId": "05eae14d2cadd683", "scanner": "scanner-primary", "fingerprint": "837594ad2c2c059e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df4483b4073309d7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/block/BlockNodeContent.tsx:212"}, "properties": {"repobilityId": "a98791da8dba06d7", "scanner": "scanner-primary", "fingerprint": "df4483b4073309d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ecf2bcd721f28e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabflow/graph/components/nodes/item/ItemNodeContent.tsx:14"}, "properties": {"repobilityId": "0503f71076f3619d", "scanner": "scanner-primary", "fingerprint": "7ecf2bcd721f28e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7efe743789969d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow-builder/CustomNode.tsx:23"}, "properties": {"repobilityId": "336911658c82ca48", "scanner": "scanner-primary", "fingerprint": "d7efe743789969d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e75d2c5e90e8a205", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/flow-builder/Sidebar.tsx:160"}, "properties": {"repobilityId": "78972cf2917a21df", "scanner": "scanner-primary", "fingerprint": "e75d2c5e90e8a205", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-82d38af561f107a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/comms/file-cabinet-button.tsx:110"}, "properties": {"repobilityId": "9762ffb27b1d0571", "scanner": "scanner-primary", "fingerprint": "82d38af561f107a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8098aff600df20e7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/onboarding/onboarding-checklist.tsx:200"}, "properties": {"repobilityId": "9013decd709c4ec3", "scanner": "scanner-primary", "fingerprint": "8098aff600df20e7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f0f9f98d352eb745", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabbigin/deals/deal-board.tsx:193"}, "properties": {"repobilityId": "3f7683927564059d", "scanner": "scanner-primary", "fingerprint": "f0f9f98d352eb745", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c108a27615429ec5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/sab-file-picker.tsx:594"}, "properties": {"repobilityId": "0df3ba6cd6d2ad3d", "scanner": "scanner-primary", "fingerprint": "c108a27615429ec5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-44d2a195b98c699d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-card-collections.tsx:67"}, "properties": {"repobilityId": "15b0d29617e4df84", "scanner": "scanner-primary", "fingerprint": "44d2a195b98c699d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e955e485428a9b47", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-upload-card.tsx:127"}, "properties": {"repobilityId": "71b29987f1e215fd", "scanner": "scanner-primary", "fingerprint": "e955e485428a9b47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9deda4ccebf71d77", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/file-manager/file-picker/picker.tsx:191"}, "properties": {"repobilityId": "94b7809818287355", "scanner": "scanner-primary", "fingerprint": "9deda4ccebf71d77", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d5d616571fb74aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-security-panel.tsx:676"}, "properties": {"repobilityId": "0ae364f7155f3fde", "scanner": "scanner-primary", "fingerprint": "5d5d616571fb74aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b1aeefe49d0bcf3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-table.tsx:81"}, "properties": {"repobilityId": "ac8188bf777381f9", "scanner": "scanner-primary", "fingerprint": "3b1aeefe49d0bcf3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4629d8e7d31de302", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-details-panel.tsx:47"}, "properties": {"repobilityId": "cfc22f0b2982edac", "scanner": "scanner-primary", "fingerprint": "4629d8e7d31de302", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-578ae60e911a0ece", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-file-grid-card.tsx:61"}, "properties": {"repobilityId": "4df6a1ce22688753", "scanner": "scanner-primary", "fingerprint": "578ae60e911a0ece", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-37376fb52040bf0f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-folder-card.tsx:66"}, "properties": {"repobilityId": "7e3276d52f24d386", "scanner": "scanner-primary", "fingerprint": "37376fb52040bf0f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a44a5d70d5289c1c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabfiles/views/sab-share-dialog.tsx:247"}, "properties": {"repobilityId": "8168ad9b723ad300", "scanner": "scanner-primary", "fingerprint": "a44a5d70d5289c1c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6ea48b92b5fd4faa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin-panel/sidebar/app-sidebar.tsx:130"}, "properties": {"repobilityId": "326ce9ac095e0963", "scanner": "scanner-primary", "fingerprint": "6ea48b92b5fd4faa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38e48b45a7e71885", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/admin-panel/header/admin-header.tsx:100"}, "properties": {"repobilityId": "1e465f0c036fe048", "scanner": "scanner-primary", "fingerprint": "38e48b45a7e71885", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-794cd0b65157a582", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/landing-3d/ModuleSections.tsx:428"}, "properties": {"repobilityId": "768e2bab1ed40efb", "scanner": "scanner-primary", "fingerprint": "794cd0b65157a582", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e0c6bca1678358a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/sabsms/page-toolkit/sabsms-saved-views.tsx:215"}, "properties": {"repobilityId": "de4be04429b6c474", "scanner": "scanner-primary", "fingerprint": "1e0c6bca1678358a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22df0780c89c4f90", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/layout.tsx:107"}, "properties": {"repobilityId": "0d72350965068f5b", "scanner": "scanner-primary", "fingerprint": "22df0780c89c4f90", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-e212b16848eb547a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/page-client.tsx:568"}, "properties": {"repobilityId": "eca53f8d84231cb5", "scanner": "scanner-primary", "fingerprint": "e212b16848eb547a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00f93a9d85b58e05", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/integrations/client.tsx:199"}, "properties": {"repobilityId": "716821bcdb267f3d", "scanner": "scanner-primary", "fingerprint": "00f93a9d85b58e05", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-218e969fb772159d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/settings/_sections.tsx:232"}, "properties": {"repobilityId": "fa1f4fc3aadd446f", "scanner": "scanner-primary", "fingerprint": "218e969fb772159d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7431fcdd6baa45b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/journeys/_client.tsx:245"}, "properties": {"repobilityId": "ee185975ddb83bae", "scanner": "scanner-primary", "fingerprint": "7431fcdd6baa45b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-77ff8d008963dec3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/projects/_client.tsx:183"}, "properties": {"repobilityId": "12c1fed71e5c9832", "scanner": "scanner-primary", "fingerprint": "77ff8d008963dec3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4c40b23f3901932", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/community/_client.tsx:292"}, "properties": {"repobilityId": "6f1b4fbe59f0399a", "scanner": "scanner-primary", "fingerprint": "a4c40b23f3901932", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d250c364e6ae4f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/admin/_sections.tsx:110"}, "properties": {"repobilityId": "b65a0ac6e4a121a8", "scanner": "scanner-primary", "fingerprint": "1d250c364e6ae4f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80a4d5647de01045", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/cart-recovery/_client.tsx:171"}, "properties": {"repobilityId": "15427da2fbaab61c", "scanner": "scanner-primary", "fingerprint": "80a4d5647de01045", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-55f3ce4e861de79a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/actions/_client.tsx:178"}, "properties": {"repobilityId": "a79d9182ba2523a6", "scanner": "scanner-primary", "fingerprint": "55f3ce4e861de79a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc6f43a1984acb92", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/widget/_components/widget-studio-client.tsx:408"}, "properties": {"repobilityId": "1a026c9db34c6ed7", "scanner": "scanner-primary", "fingerprint": "fc6f43a1984acb92", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c99b50b8ab26b241", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/inbox/_components/inbox-client.tsx:1202"}, "properties": {"repobilityId": "6054ac117c91ae68", "scanner": "scanner-primary", "fingerprint": "c99b50b8ab26b241", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64ff5dab5c1180bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/_components/settings-nav-list.tsx:33"}, "properties": {"repobilityId": "23e594fd099da7e2", "scanner": "scanner-primary", "fingerprint": "64ff5dab5c1180bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b216191b6e2d72b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/_components/sabchat-shell.tsx:71"}, "properties": {"repobilityId": "05e7b02640f21d61", "scanner": "scanner-primary", "fingerprint": "b216191b6e2d72b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7c2e704cacd4683", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabchat/knowledge/_client.tsx:99"}, "properties": {"repobilityId": "bd23f11e6d731fc4", "scanner": "scanner-primary", "fingerprint": "c7c2e704cacd4683", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70718792ef07dba3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dl/[shortCode]/components/RedirectScript.tsx:41"}, "properties": {"repobilityId": "c2297d22d950dcb0", "scanner": "scanner-primary", "fingerprint": "70718792ef07dba3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f9592113c2aee010", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/careers/page.tsx:52"}, "properties": {"repobilityId": "71cc9f1deb4bb1da", "scanner": "scanner-primary", "fingerprint": "f9592113c2aee010", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1b3ca1bab4b985f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/logout/route.ts:51"}, "properties": {"repobilityId": "0a1e1b9ea85013d4", "scanner": "scanner-primary", "fingerprint": "c1b3ca1bab4b985f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81b64f5c797248d4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/p/invoice/[token]/_components/PaymentHistory.tsx:31"}, "properties": {"repobilityId": "07483d3762ba8b98", "scanner": "scanner-primary", "fingerprint": "81b64f5c797248d4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27bbcffe0f00bc8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/p/ticket-form/[formId]/_form.tsx:222"}, "properties": {"repobilityId": "7b599f4a964d94eb", "scanner": "scanner-primary", "fingerprint": "27bbcffe0f00bc8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e82ee056d8272056", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/page.tsx:93"}, "properties": {"repobilityId": "bb5678e56dfc87b5", "scanner": "scanner-primary", "fingerprint": "e82ee056d8272056", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a8704b001f389bb9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/settings/_client.tsx:192"}, "properties": {"repobilityId": "6588c5de3c01872b", "scanner": "scanner-primary", "fingerprint": "a8704b001f389bb9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9935c03ce025e9f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/payslips/_client.tsx:111"}, "properties": {"repobilityId": "99efca05c73fc02d", "scanner": "scanner-primary", "fingerprint": "c9935c03ce025e9f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26b2b061133a9ad7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/org-chart/page.tsx:25"}, "properties": {"repobilityId": "dbbbe5d9b3ac925d", "scanner": "scanner-primary", "fingerprint": "26b2b061133a9ad7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4aab85931dd54f62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/employees/_client.tsx:143"}, "properties": {"repobilityId": "eb101592d9161bc9", "scanner": "scanner-primary", "fingerprint": "4aab85931dd54f62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0c8e20b421eefefe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/departments/_client.tsx:158"}, "properties": {"repobilityId": "78864d1e68b4e038", "scanner": "scanner-primary", "fingerprint": "0c8e20b421eefefe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcddce2060c10944", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/goals/_client.tsx:195"}, "properties": {"repobilityId": "15e5cad818231f29", "scanner": "scanner-primary", "fingerprint": "dcddce2060c10944", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c01268b9d0a2b654", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/analytics/page.tsx:66"}, "properties": {"repobilityId": "70e4d2a6be1a2382", "scanner": "scanner-primary", "fingerprint": "c01268b9d0a2b654", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5fc233f524ab929", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/projects/_client.tsx:187"}, "properties": {"repobilityId": "cef1003d9e0f0ed0", "scanner": "scanner-primary", "fingerprint": "a5fc233f524ab929", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a8bde189d31e19bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/payroll-runs/_client.tsx:112"}, "properties": {"repobilityId": "a5811d064a4cbca4", "scanner": "scanner-primary", "fingerprint": "a8bde189d31e19bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c154652d3a8dddc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/shifts/_client.tsx:175"}, "properties": {"repobilityId": "c9e76b80ffc98611", "scanner": "scanner-primary", "fingerprint": "8c154652d3a8dddc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13123d15765d7dc9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/me/_client.tsx:62"}, "properties": {"repobilityId": "84ae9e681ebdd46e", "scanner": "scanner-primary", "fingerprint": "13123d15765d7dc9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-143ecfd31617647e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabhrm/_components/sabhrm-shell.tsx:65"}, "properties": {"repobilityId": "53cfa0f4f9b3dcef", "scanner": "scanner-primary", "fingerprint": "143ecfd31617647e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ecad9582553f6ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/invite/[token]/invite-client.tsx:357"}, "properties": {"repobilityId": "b573e086dc1989c4", "scanner": "scanner-primary", "fingerprint": "8ecad9582553f6ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-625781dcb4a82a19", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/invite/[token]/invite-client.tsx:134"}, "properties": {"repobilityId": "1181cfc7030bbd9e", "scanner": "scanner-primary", "fingerprint": "625781dcb4a82a19", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f9e10c3ec6d4eb25", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/webinar/[slug]/replay/page.tsx:49"}, "properties": {"repobilityId": "a6ed21c8000fa8c8", "scanner": "scanner-primary", "fingerprint": "f9e10c3ec6d4eb25", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9ef9ae8675c0ede3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/login/page.tsx:15"}, "properties": {"repobilityId": "b50ac45f1535a767", "scanner": "scanner-primary", "fingerprint": "9ef9ae8675c0ede3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-35ef118e9358f1b5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/push/outlook/route.ts:144"}, "properties": {"repobilityId": "f02488f8737c2380", "scanner": "scanner-primary", "fingerprint": "35ef118e9358f1b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f22755da98638856", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/push/outlook/route.ts:113"}, "properties": {"repobilityId": "b61652375543114d", "scanner": "scanner-primary", "fingerprint": "f22755da98638856", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3c7565a5e6f68dbb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/push/gmail/route.ts:55"}, "properties": {"repobilityId": "093e15df9def0f7a", "scanner": "scanner-primary", "fingerprint": "3c7565a5e6f68dbb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e1c48a5980d0cfb8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/push/gmail/route.ts:85"}, "properties": {"repobilityId": "f8e4a2e53842f08c", "scanner": "scanner-primary", "fingerprint": "e1c48a5980d0cfb8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-41eacafd6de1920b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/admin-logout/route.ts:27"}, "properties": {"repobilityId": "4625b85179e9edf7", "scanner": "scanner-primary", "fingerprint": "41eacafd6de1920b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e53f1cc36e751c0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/logout/route.ts:28"}, "properties": {"repobilityId": "8a24307082a0da6a", "scanner": "scanner-primary", "fingerprint": "0e53f1cc36e751c0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cdefc28da8e334c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/auth/saml/route.ts:18"}, "properties": {"repobilityId": "6290aae5fc89f95b", "scanner": "scanner-primary", "fingerprint": "5cdefc28da8e334c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6eac2bc0d674ff5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/saml/route.ts:48"}, "properties": {"repobilityId": "566dc1fa5f211e5e", "scanner": "scanner-primary", "fingerprint": "6eac2bc0d674ff5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bc7b7f0e75b57d54", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/auth/session/route.ts:23"}, "properties": {"repobilityId": "b2ffda957ddd748e", "scanner": "scanner-primary", "fingerprint": "bc7b7f0e75b57d54", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8f793af7fab9f4b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/v1/flows/[flowId]/run/route.ts:114"}, "properties": {"repobilityId": "167301c76cc8ceec", "scanner": "scanner-primary", "fingerprint": "8f793af7fab9f4b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a5e2d8da3ea9d40", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/v1/marketplace/usage/route.ts:131"}, "properties": {"repobilityId": "54b95886318dc75c", "scanner": "scanner-primary", "fingerprint": "0a5e2d8da3ea9d40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f31eb9b6a92ae48a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/[module]/page.tsx:71"}, "properties": {"repobilityId": "b7e87bf3cba46c9e", "scanner": "scanner-primary", "fingerprint": "f31eb9b6a92ae48a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1d207efbb2ff420", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/[module]/[endpoint]/page.tsx:113"}, "properties": {"repobilityId": "0fd7a81efab45961", "scanner": "scanner-primary", "fingerprint": "a1d207efbb2ff420", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0532f0ee1f2d313", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/api/docs/modules/_components/module-directory-client.tsx:88"}, "properties": {"repobilityId": "7a9b1652a30a7e97", "scanner": "scanner-primary", "fingerprint": "c0532f0ee1f2d313", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a568d52b0fcdcb16", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/sabcrm/oauth/[provider]/callback/route.ts:128"}, "properties": {"repobilityId": "c4a81ddd63f0ff41", "scanner": "scanner-primary", "fingerprint": "a568d52b0fcdcb16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-af3d16081fd0bd6b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/admin/database-backup/download/route.ts:39"}, "properties": {"repobilityId": "95f149e75371560b", "scanner": "scanner-primary", "fingerprint": "af3d16081fd0bd6b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14477c57a50efb43", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/calls/route/route.ts:10"}, "properties": {"repobilityId": "6f6bf8a76a1d593b", "scanner": "scanner-primary", "fingerprint": "14477c57a50efb43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8e3c25ec76038ff5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/crm/automations/test-webhook/route.ts:8"}, "properties": {"repobilityId": "d65ec67a9d9cdc59", "scanner": "scanner-primary", "fingerprint": "8e3c25ec76038ff5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4db122696583fd90", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/url-health/route.ts:80"}, "properties": {"repobilityId": "4439a07e787d24f6", "scanner": "scanner-primary", "fingerprint": "4db122696583fd90", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7277d7b7aa58f431", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/delete-failed-templates/route.ts:21"}, "properties": {"repobilityId": "06025226ded786d5", "scanner": "scanner-primary", "fingerprint": "7277d7b7aa58f431", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-08a14269e169b239", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sabmail-rag/route.ts:135"}, "properties": {"repobilityId": "a028db2ff2aba694", "scanner": "scanner-primary", "fingerprint": "08a14269e169b239", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e570fc1d36b7387", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/webhook-dispatcher/route.ts:227"}, "properties": {"repobilityId": "7ec234d08cf6c2c5", "scanner": "scanner-primary", "fingerprint": "3e570fc1d36b7387", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85ecf81e4b5d0099", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/msme-45-day-check/route.ts:262"}, "properties": {"repobilityId": "98824b2c0fbd664b", "scanner": "scanner-primary", "fingerprint": "85ecf81e4b5d0099", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0813b87a3246acd7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/subscriptions-daily/route.ts:95"}, "properties": {"repobilityId": "8ac885a755c4c895", "scanner": "scanner-primary", "fingerprint": "0813b87a3246acd7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45feff8b4702caca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/sabflow-executions-retention/route.ts:52"}, "properties": {"repobilityId": "ee802774ada0dc0b", "scanner": "scanner-primary", "fingerprint": "45feff8b4702caca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec15835ea87b1dfe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/cron/link-scheduler/route.ts:46"}, "properties": {"repobilityId": "3c4f6361d4d7fa83", "scanner": "scanner-primary", "fingerprint": "ec15835ea87b1dfe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7494f9ba4a88f00f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/marketplace/submissions/route.ts:195"}, "properties": {"repobilityId": "efff1797c08bf5e6", "scanner": "scanner-primary", "fingerprint": "7494f9ba4a88f00f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60f4734f49b668f0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/marketplace/submissions/[id]/review/route.ts:186"}, "properties": {"repobilityId": "edd9bb0d37002ea8", "scanner": "scanner-primary", "fingerprint": "60f4734f49b668f0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef47bdbef916c44e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/pin/route.ts:240"}, "properties": {"repobilityId": "7aea703d79aa7b22", "scanner": "scanner-primary", "fingerprint": "ef47bdbef916c44e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc1267c10fd791f0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/rerun/route.ts:140"}, "properties": {"repobilityId": "336e70c8a47c71c9", "scanner": "scanner-primary", "fingerprint": "fc1267c10fd791f0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4c0c5d160e4b473", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/executions/[executionId]/export/route.ts:427"}, "properties": {"repobilityId": "3fde1edc7ed13111", "scanner": "scanner-primary", "fingerprint": "e4c0c5d160e4b473", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-72b0c382cd965779", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/webhook/[id]/route.ts:815"}, "properties": {"repobilityId": "6c87262f07d1e147", "scanner": "scanner-primary", "fingerprint": "72b0c382cd965779", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f80fae98e6cfd4d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/[flowId]/export-n8n/route.ts:24"}, "properties": {"repobilityId": "581f800eff145f7c", "scanner": "scanner-primary", "fingerprint": "f80fae98e6cfd4d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d659f8566f4e47df", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/oauth/callback/route.ts:26"}, "properties": {"repobilityId": "43145bc5e5ba566f", "scanner": "scanner-primary", "fingerprint": "d659f8566f4e47df", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01fe464643064c7b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/oauth/authorize/route.ts:24"}, "properties": {"repobilityId": "1502dae622153e9a", "scanner": "scanner-primary", "fingerprint": "01fe464643064c7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-848ecf78e5422403", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/api-keys/route.ts:53"}, "properties": {"repobilityId": "7288acc88a0118f4", "scanner": "scanner-primary", "fingerprint": "848ecf78e5422403", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d880dd763411a2d4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/api-keys/[keyId]/route.ts:30"}, "properties": {"repobilityId": "b0385000668413a3", "scanner": "scanner-primary", "fingerprint": "d880dd763411a2d4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8554b2e9fd435bb8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/import-n8n/route.ts:19"}, "properties": {"repobilityId": "85502fa2a50bb8e9", "scanner": "scanner-primary", "fingerprint": "8554b2e9fd435bb8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6619fd87e6b53a43", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/import-typebot/route.ts:19"}, "properties": {"repobilityId": "5a08b2c73b54f212", "scanner": "scanner-primary", "fingerprint": "6619fd87e6b53a43", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09b164ab851f4c8e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/credentials/[id]/scopes/route.ts:183"}, "properties": {"repobilityId": "9346581029632715", "scanner": "scanner-primary", "fingerprint": "09b164ab851f4c8e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f888d1219c6fb93", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/sabflow/credentials/[id]/scopes/[scope]/route.ts:157"}, "properties": {"repobilityId": "192ce4dd0b7fe519", "scanner": "scanner-primary", "fingerprint": "3f888d1219c6fb93", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9971d6fef76309e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/razorpay/route.ts:137"}, "properties": {"repobilityId": "7ba4b0f0aa8614ae", "scanner": "scanner-primary", "fingerprint": "9971d6fef76309e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c04660c445b03e26", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/meta/route.ts:220"}, "properties": {"repobilityId": "b6a32d0008b8e58d", "scanner": "scanner-primary", "fingerprint": "c04660c445b03e26", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-828c5d3a81d3ae8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/webhooks/email-inbound/route.ts:134"}, "properties": {"repobilityId": "833945be336d9618", "scanner": "scanner-primary", "fingerprint": "828c5d3a81d3ae8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc28080360ce5545", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/api/scim/v2/Users/route.ts:35"}, "properties": {"repobilityId": "046cd25dc8098efd", "scanner": "scanner-primary", "fingerprint": "fc28080360ce5545", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e8112183dde85cac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/scim/v2/Users/route.ts:52"}, "properties": {"repobilityId": "0d274a55df47bd64", "scanner": "scanner-primary", "fingerprint": "e8112183dde85cac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd4bacc00295c146", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/page.tsx:316"}, "properties": {"repobilityId": "4ba209c1bd3eacfd", "scanner": "scanner-primary", "fingerprint": "cd4bacc00295c146", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9fae49bbeb2d3764", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/page.tsx:132"}, "properties": {"repobilityId": "06c993996b407de3", "scanner": "scanner-primary", "fingerprint": "9fae49bbeb2d3764", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80111e82670d535d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/page.tsx:256"}, "properties": {"repobilityId": "06f849de84e607e6", "scanner": "scanner-primary", "fingerprint": "80111e82670d535d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8734f6ca6b7011f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/inventory/transfers/page.tsx:217"}, "properties": {"repobilityId": "024df62e3c867dfe", "scanner": "scanner-primary", "fingerprint": "8734f6ca6b7011f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d99f15f199d90a05", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/orders/[orderId]/page.tsx:264"}, "properties": {"repobilityId": "1d4b781800c19f76", "scanner": "scanner-primary", "fingerprint": "d99f15f199d90a05", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-51c038b78903b8e8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/analytics/live/page.tsx:153"}, "properties": {"repobilityId": "978bf26054580a60", "scanner": "scanner-primary", "fingerprint": "51c038b78903b8e8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c396bbff8b8a350", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/customers/reviews/page.tsx:231"}, "properties": {"repobilityId": "0808e93b58eef6c8", "scanner": "scanner-primary", "fingerprint": "4c396bbff8b8a350", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60260aad92752ad1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/collections/page.tsx:147"}, "properties": {"repobilityId": "4eb5ece7f053eae7", "scanner": "scanner-primary", "fingerprint": "60260aad92752ad1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-80ecc258a2478125", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/products/page.tsx:224"}, "properties": {"repobilityId": "4612377aeb9af5bf", "scanner": "scanner-primary", "fingerprint": "80ecc258a2478125", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-236c317c97ed2c44", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshop/[storefrontId]/products/new/page.tsx:144"}, "properties": {"repobilityId": "bb2ab1442a6d53d8", "scanner": "scanner-primary", "fingerprint": "236c317c97ed2c44", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4bc5166d86ee5e22", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/api-keys/page.tsx:307"}, "properties": {"repobilityId": "bb100fe116c91a52", "scanner": "scanner-primary", "fingerprint": "4bc5166d86ee5e22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5a4fbbfc1ca4754f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/security/page.tsx:1275"}, "properties": {"repobilityId": "de3b8024a091982f", "scanner": "scanner-primary", "fingerprint": "5a4fbbfc1ca4754f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-471b54edd9dca841", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/playground/page.tsx:411"}, "properties": {"repobilityId": "0ddc03f7ed89f8ed", "scanner": "scanner-primary", "fingerprint": "471b54edd9dca841", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c79d8cfe468004c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/functions/page.tsx:156"}, "properties": {"repobilityId": "da134ca1ea435368", "scanner": "scanner-primary", "fingerprint": "c79d8cfe468004c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d591aebcf39a4d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/import-export/page.tsx:1122"}, "properties": {"repobilityId": "dc86227c769dd99a", "scanner": "scanner-primary", "fingerprint": "9d591aebcf39a4d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c2c426c8645999a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/pipelines/page.tsx:763"}, "properties": {"repobilityId": "00b01c9afd845fe0", "scanner": "scanner-primary", "fingerprint": "6c2c426c8645999a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f2f442b2fc851b7f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/audit/page.tsx:349"}, "properties": {"repobilityId": "7c59acb9a648ce4b", "scanner": "scanner-primary", "fingerprint": "f2f442b2fc851b7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c7a92507bca20a8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/booking/page.tsx:397"}, "properties": {"repobilityId": "eab1a8570ce73824", "scanner": "scanner-primary", "fingerprint": "6c7a92507bca20a8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b9ea05c235da08a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/roles/page.tsx:451"}, "properties": {"repobilityId": "0d84fceae8d7cd8e", "scanner": "scanner-primary", "fingerprint": "3b9ea05c235da08a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-62b3da7ac7b8ad1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/automations/page.tsx:1222"}, "properties": {"repobilityId": "e2b264bf400a823d", "scanner": "scanner-primary", "fingerprint": "62b3da7ac7b8ad1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6736a8c896af4382", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/members/page.tsx:294"}, "properties": {"repobilityId": "cf2554624b001ee9", "scanner": "scanner-primary", "fingerprint": "6736a8c896af4382", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-432d9a6c50f97a75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/webhooks/page.tsx:249"}, "properties": {"repobilityId": "c5e07b0712e38428", "scanner": "scanner-primary", "fingerprint": "432d9a6c50f97a75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2475db69b55413cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/data-model/data-model-client.tsx:772"}, "properties": {"repobilityId": "38a33d63d6c517a3", "scanner": "scanner-primary", "fingerprint": "2475db69b55413cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6db379e51db54c5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/crm/data-model/page.tsx:1147"}, "properties": {"repobilityId": "adfc63ee802a0082", "scanner": "scanner-primary", "fingerprint": "6db379e51db54c5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8f805de1a70b942", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/webhooks/page.tsx:243"}, "properties": {"repobilityId": "ddf06a17e4cd2036", "scanner": "scanner-primary", "fingerprint": "b8f805de1a70b942", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fcf02febb52d63a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/settings/invoices/page.tsx:92"}, "properties": {"repobilityId": "a1ff9f3b440a7c86", "scanner": "scanner-primary", "fingerprint": "fcf02febb52d63a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f1654aa3388f118", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/settings/webhooks/page.client.tsx:219"}, "properties": {"repobilityId": "7f6796d95f184192", "scanner": "scanner-primary", "fingerprint": "1f1654aa3388f118", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-529e326528cc513e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/components/UrlShortenerForm.tsx:91"}, "properties": {"repobilityId": "c3d98775bd40c7ad", "scanner": "scanner-primary", "fingerprint": "529e326528cc513e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a10f3db3bc857f6e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/[id]/components/short-url-header.tsx:48"}, "properties": {"repobilityId": "ca0139c44d64f642", "scanner": "scanner-primary", "fingerprint": "a10f3db3bc857f6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-877a82b558758b72", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/collections/page.client.tsx:124"}, "properties": {"repobilityId": "70bca554ac92585e", "scanner": "scanner-primary", "fingerprint": "877a82b558758b72", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d878255f3c32e07e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/url-shortener/bio/_components/BioPreview.tsx:75"}, "properties": {"repobilityId": "2664c76f7224170e", "scanner": "scanner-primary", "fingerprint": "d878255f3c32e07e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-adb1e2f129ea9f66", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/page.tsx:162"}, "properties": {"repobilityId": "7c31525f41646811", "scanner": "scanner-primary", "fingerprint": "adb1e2f129ea9f66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aa1eda634e8ce388", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/checks/page.tsx:155"}, "properties": {"repobilityId": "6a3850987a9dacdc", "scanner": "scanner-primary", "fingerprint": "aa1eda634e8ce388", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a478581989607cd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmonitor/status-pages/page.tsx:104"}, "properties": {"repobilityId": "a2fb7b8ba40711eb", "scanner": "scanner-primary", "fingerprint": "a478581989607cd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-45acf0424225c8d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/page.tsx:118"}, "properties": {"repobilityId": "88232639205b81ab", "scanner": "scanner-primary", "fingerprint": "45acf0424225c8d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-412099f6d9175d5e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/[deckId]/present/_present-view.tsx:86"}, "properties": {"repobilityId": "1fdbd92e158df192", "scanner": "scanner-primary", "fingerprint": "412099f6d9175d5e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fe3600d469d38dc7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabshow/[deckId]/history/page.tsx:96"}, "properties": {"repobilityId": "40501e4eae5851a1", "scanner": "scanner-primary", "fingerprint": "fe3600d469d38dc7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9dcb6d980930a29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/locations/[locationId]/_components/citations-tab.tsx:130"}, "properties": {"repobilityId": "fa660d10e1ad2212", "scanner": "scanner-primary", "fingerprint": "a9dcb6d980930a29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-788f840472192d33", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/locations/_components/locations-list-client.tsx:146"}, "properties": {"repobilityId": "aa91fbe64932f1d2", "scanner": "scanner-primary", "fingerprint": "788f840472192d33", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1f699dae35e4c587", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpublish/_components/overview-client.tsx:240"}, "properties": {"repobilityId": "2e2b75f6b8810b7f", "scanner": "scanner-primary", "fingerprint": "1f699dae35e4c587", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a27cb3974c7a4774", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/page.tsx:103"}, "properties": {"repobilityId": "c5a18f0901c64feb", "scanner": "scanner-primary", "fingerprint": "a27cb3974c7a4774", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4612289fd73ee46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/api-keys-tab.tsx:116"}, "properties": {"repobilityId": "0de6ffe44ddf391d", "scanner": "scanner-primary", "fingerprint": "f4612289fd73ee46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61699cfc1d743d69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/domains-tab.tsx:116"}, "properties": {"repobilityId": "76e08de12bac04a4", "scanner": "scanner-primary", "fingerprint": "61699cfc1d743d69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7872d2f85b056750", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/functions-tab.tsx:151"}, "properties": {"repobilityId": "03ff73b3c58023bc", "scanner": "scanner-primary", "fingerprint": "7872d2f85b056750", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e33b3d14d3b826f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/file-store-tab.tsx:99"}, "properties": {"repobilityId": "7e7e3a2f33fc46d7", "scanner": "scanner-primary", "fingerprint": "e33b3d14d3b826f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3adeeab5aafd744", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcatalyst/[projectId]/_components/auth-tab.tsx:83"}, "properties": {"repobilityId": "5b7a56f98ef09b2c", "scanner": "scanner-primary", "fingerprint": "d3adeeab5aafd744", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-70d900fde423a684", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/[baseId]/[tableId]/automations/_components/automations-builder-client.tsx:210"}, "properties": {"repobilityId": "83e4ccb551d78c36", "scanner": "scanner-primary", "fingerprint": "70d900fde423a684", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bb8ea34d741fc6e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/[baseId]/[tableId]/_components/table-view-client.tsx:546"}, "properties": {"repobilityId": "60cba809b620741b", "scanner": "scanner-primary", "fingerprint": "3bb8ea34d741fc6e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a3f4ff43eaf2c56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/[workspaceId]/_components/bases-list-client.tsx:156"}, "properties": {"repobilityId": "4d45f8bbc2a0e12d", "scanner": "scanner-primary", "fingerprint": "9a3f4ff43eaf2c56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df0c92890265e619", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabtables/_components/workspaces-list-client.tsx:149"}, "properties": {"repobilityId": "18fcb6751e948c06", "scanner": "scanner-primary", "fingerprint": "df0c92890265e619", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-723a2b3e4010a4aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketplace/installed/page.tsx:263"}, "properties": {"repobilityId": "5cc74262bfef993c", "scanner": "scanner-primary", "fingerprint": "723a2b3e4010a4aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc03f0953096295b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/sessions/page.tsx:132"}, "properties": {"repobilityId": "24662c2131376b63", "scanner": "scanner-primary", "fingerprint": "dc03f0953096295b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-21c26be0d536ecaa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/plans/plans-client.tsx:217"}, "properties": {"repobilityId": "a57c1dbd7cdebded", "scanner": "scanner-primary", "fingerprint": "21c26be0d536ecaa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8f1757ced6532fb1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcheckout/_components/sabcheckout-pages-list-client.tsx:81"}, "properties": {"repobilityId": "c516555e3db75352", "scanner": "scanner-primary", "fingerprint": "8f1757ced6532fb1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4db75cc08eec32c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sablens/devices/page.tsx:123"}, "properties": {"repobilityId": "7dab9dfb95267e14", "scanner": "scanner-primary", "fingerprint": "4db75cc08eec32c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-194462adfb187102", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/api/webhooks/_WebhooksClient.tsx:207"}, "properties": {"repobilityId": "f4667e82bd8016d1", "scanner": "scanner-primary", "fingerprint": "194462adfb187102", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a340fa80c9b31293", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/page.tsx:151"}, "properties": {"repobilityId": "09852867c4a98e26", "scanner": "scanner-primary", "fingerprint": "a340fa80c9b31293", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b66e7dcf892b7c56", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/settings/page.tsx:431"}, "properties": {"repobilityId": "ce1c5bd037bc6449", "scanner": "scanner-primary", "fingerprint": "b66e7dcf892b7c56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b7063a0fdd00657", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/page-roles/page.tsx:98"}, "properties": {"repobilityId": "9da275b1c77e3b68", "scanner": "scanner-primary", "fingerprint": "6b7063a0fdd00657", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-714a91e81f0f6f48", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/posts/page.tsx:260"}, "properties": {"repobilityId": "ca99bba83f33ffbe", "scanner": "scanner-primary", "fingerprint": "714a91e81f0f6f48", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a1419a54601ceee", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/media/page.tsx:175"}, "properties": {"repobilityId": "a739bfd737b5afbb", "scanner": "scanner-primary", "fingerprint": "1a1419a54601ceee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-05c46a1d4d3502b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/scheduled/page.tsx:236"}, "properties": {"repobilityId": "5ae65e68d7817982", "scanner": "scanner-primary", "fingerprint": "05c46a1d4d3502b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-92de05faf3c6f073", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/page.tsx:87"}, "properties": {"repobilityId": "816ed54e95ee457b", "scanner": "scanner-primary", "fingerprint": "92de05faf3c6f073", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef630a8d43e4f582", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/orders/page.tsx:297"}, "properties": {"repobilityId": "10018cf26fc53be1", "scanner": "scanner-primary", "fingerprint": "ef630a8d43e4f582", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9ccbee67fd16d44b", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/flow-builder/page.tsx:1484"}, "properties": {"repobilityId": "48b7004775a9e89a", "scanner": "scanner-primary", "fingerprint": "9ccbee67fd16d44b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-35bbbf6732db0917", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/appearance/page.tsx:306"}, "properties": {"repobilityId": "1e9ff4bf4e8ed3da", "scanner": "scanner-primary", "fingerprint": "35bbbf6732db0917", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9cf1f61cee94b2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/custom-ecommerce/appearance/page.tsx:225"}, "properties": {"repobilityId": "2ef20a313c91510e", "scanner": "scanner-primary", "fingerprint": "b9cf1f61cee94b2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4e774a4c82ce211", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/custom-ecommerce/appearance/page.tsx:84"}, "properties": {"repobilityId": "4e3700d6cd615c1e", "scanner": "scanner-primary", "fingerprint": "d4e774a4c82ce211", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-878c812c99c64616", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/all/projects/page.tsx:81"}, "properties": {"repobilityId": "404ba5b8aed8f44b", "scanner": "scanner-primary", "fingerprint": "878c812c99c64616", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-675c39bdd67abc6a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/live-studio/page.tsx:331"}, "properties": {"repobilityId": "a82752719cae206e", "scanner": "scanner-primary", "fingerprint": "675c39bdd67abc6a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c8bcf57903ed1898", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/pages/page.tsx:261"}, "properties": {"repobilityId": "9c3c43da85e590a4", "scanner": "scanner-primary", "fingerprint": "c8bcf57903ed1898", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f91f255f39183d4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/studio/page.tsx:652"}, "properties": {"repobilityId": "4c44b3bbc287b3a3", "scanner": "scanner-primary", "fingerprint": "f91f255f39183d4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22434a86da0ea419", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/setup/page.tsx:355"}, "properties": {"repobilityId": "d33d3231675c9520", "scanner": "scanner-primary", "fingerprint": "22434a86da0ea419", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b2beb978a841dad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/create-post/page.tsx:419"}, "properties": {"repobilityId": "0ad63cbc3a85c7c6", "scanner": "scanner-primary", "fingerprint": "6b2beb978a841dad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd22ad7add96979c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/inbox/page.tsx:468"}, "properties": {"repobilityId": "afe95b1ab87c6a9c", "scanner": "scanner-primary", "fingerprint": "cd22ad7add96979c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4dee8291d7a2a1df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/_components/ui20-facebook-kanban-board.tsx:183"}, "properties": {"repobilityId": "a1ed3bebd5ee72e0", "scanner": "scanner-primary", "fingerprint": "4dee8291d7a2a1df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c9153b6e4aaf1200", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/facebook/_components/ui20-facebook-kanban-board.tsx:257"}, "properties": {"repobilityId": "7f17ff6964822bcc", "scanner": "scanner-primary", "fingerprint": "c9153b6e4aaf1200", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ab7cdb940db376c7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/_components/ui20-fb-chat-client.tsx:195"}, "properties": {"repobilityId": "2fe12623de193a6e", "scanner": "scanner-primary", "fingerprint": "ab7cdb940db376c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-09ebc108abc3e3d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/calendar/page.tsx:147"}, "properties": {"repobilityId": "26f9b3068a8b1452", "scanner": "scanner-primary", "fingerprint": "09ebc108abc3e3d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bff11f7be1e9cec7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/facebook/all-projects/page.tsx:154"}, "properties": {"repobilityId": "93a8b8cf00cd45db", "scanner": "scanner-primary", "fingerprint": "bff11f7be1e9cec7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2db2a793df644864", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/analytics/page.tsx:670"}, "properties": {"repobilityId": "f74965aa6bce811a", "scanner": "scanner-primary", "fingerprint": "2db2a793df644864", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b22bf5839e01e21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/projects/page.client.tsx:95"}, "properties": {"repobilityId": "40dbc3ae3e45e909", "scanner": "scanner-primary", "fingerprint": "5b22bf5839e01e21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be75955a7d92a357", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/commands/page.tsx:1580"}, "properties": {"repobilityId": "e82fa476f224975e", "scanner": "scanner-primary", "fingerprint": "be75955a7d92a357", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-26b1c02728cfe160", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/business-inbox/page.tsx:771"}, "properties": {"repobilityId": "9771aacf74af6001", "scanner": "scanner-primary", "fingerprint": "26b1c02728cfe160", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e54a1074b6410dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/ads/page.tsx:729"}, "properties": {"repobilityId": "64c2d8b9072058de", "scanner": "scanner-primary", "fingerprint": "7e54a1074b6410dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64801d961f890f4d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/chat/page.tsx:279"}, "properties": {"repobilityId": "e345c8ea8cc2defb", "scanner": "scanner-primary", "fingerprint": "64801d961f890f4d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b060e50dbd12e40", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/set-detail-drawer.tsx:413"}, "properties": {"repobilityId": "6be954eb66a53a92", "scanner": "scanner-primary", "fingerprint": "9b060e50dbd12e40", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99b6fd041ac59272", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/create-pack-drawer.tsx:442"}, "properties": {"repobilityId": "9dcb1b18d348a889", "scanner": "scanner-primary", "fingerprint": "99b6fd041ac59272", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29e31fdb2605c608", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/stickers/_components/sets-grid.tsx:163"}, "properties": {"repobilityId": "cc018f25d5ab575c", "scanner": "scanner-primary", "fingerprint": "29e31fdb2605c608", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f5eda11ace7d228e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/payments/page.client.tsx:822"}, "properties": {"repobilityId": "93c5d3e6cd968b1c", "scanner": "scanner-primary", "fingerprint": "f5eda11ace7d228e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e4a884db1dd829ff", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/payments/_components/payments.tsx:355"}, "properties": {"repobilityId": "ef44095880481324", "scanner": "scanner-primary", "fingerprint": "e4a884db1dd829ff", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b601981857ad0143", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/contacts/page.tsx:1131"}, "properties": {"repobilityId": "f0c679598fde7d2e", "scanner": "scanner-primary", "fingerprint": "b601981857ad0143", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4f4d804166e78ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/channels/page.tsx:121"}, "properties": {"repobilityId": "5cc562462f389315", "scanner": "scanner-primary", "fingerprint": "b4f4d804166e78ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-094be3a7009c44d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/channels/[channelId]/page.tsx:1114"}, "properties": {"repobilityId": "6392f941be08a893", "scanner": "scanner-primary", "fingerprint": "094be3a7009c44d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c43de9bf41134557", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/broadcasts/page.tsx:1576"}, "properties": {"repobilityId": "16869ce818a930f2", "scanner": "scanner-primary", "fingerprint": "c43de9bf41134557", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ac69c5d5f39fa58", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/bots/page.tsx:115"}, "properties": {"repobilityId": "999ca640646ab6d4", "scanner": "scanner-primary", "fingerprint": "8ac69c5d5f39fa58", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-14bd159a6324febf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/bots/bot-detail-drawer.tsx:138"}, "properties": {"repobilityId": "e922e617c5c53b45", "scanner": "scanner-primary", "fingerprint": "14bd159a6324febf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a1cad050382f6950", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/connections/page.tsx:330"}, "properties": {"repobilityId": "bde43d0d753dcc8d", "scanner": "scanner-primary", "fingerprint": "a1cad050382f6950", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a2f5a871c6017bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/telegram/auto-reply/_components/rule-table-row.tsx:102"}, "properties": {"repobilityId": "ea61d51d7249ceec", "scanner": "scanner-primary", "fingerprint": "8a2f5a871c6017bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a13f532f33fded43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/sprints/[sprintId]/plan/_components/sprint-plan-board.tsx:217"}, "properties": {"repobilityId": "bee86b3397d8dbfc", "scanner": "scanner-primary", "fingerprint": "a13f532f33fded43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-62c3bae93f51ff8a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/backlog/_components/backlog-board.tsx:285"}, "properties": {"repobilityId": "8b24dd3d2b8d9fd7", "scanner": "scanner-primary", "fingerprint": "62c3bae93f51ff8a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d347646638df5ccd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabsprints/[projectId]/epics/_components/epics-board.tsx:249"}, "properties": {"repobilityId": "d2bb6c2ad0e399f1", "scanner": "scanner-primary", "fingerprint": "d347646638df5ccd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ecb9233f862201d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/org-switcher/client.tsx:153"}, "properties": {"repobilityId": "cb1183a0c45cc65a", "scanner": "scanner-primary", "fingerprint": "3ecb9233f862201d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9a68fb13a3ec82e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/global-search/global-search-client.tsx:130"}, "properties": {"repobilityId": "56402d16bb0f3648", "scanner": "scanner-primary", "fingerprint": "e9a68fb13a3ec82e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c06d5b9f838168cd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/platform/webhooks/webhooks-client.tsx:185"}, "properties": {"repobilityId": "29a5164c7f1ecf0e", "scanner": "scanner-primary", "fingerprint": "c06d5b9f838168cd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34ce671157ab12c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/page.tsx:309"}, "properties": {"repobilityId": "89ed91873df1bac1", "scanner": "scanner-primary", "fingerprint": "34ce671157ab12c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b40eb984535ccf5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/tasks/page.tsx:503"}, "properties": {"repobilityId": "9a04533de954793d", "scanner": "scanner-primary", "fingerprint": "1b40eb984535ccf5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b8bd6f6662f54bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/page.tsx:511"}, "properties": {"repobilityId": "26f1c54927a86adf", "scanner": "scanner-primary", "fingerprint": "4b8bd6f6662f54bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc9035c05b198c92", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/_components/pinned-strip.tsx:46"}, "properties": {"repobilityId": "1d762473e5aa7551", "scanner": "scanner-primary", "fingerprint": "dc9035c05b198c92", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-50e5d81d41f4dee7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/team-chat/_components/composer-extras.tsx:86"}, "properties": {"repobilityId": "896066ebfeab3a21", "scanner": "scanner-primary", "fingerprint": "50e5d81d41f4dee7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4bc8317b80d48a6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/manage-users/page.tsx:673"}, "properties": {"repobilityId": "193b11644841eef3", "scanner": "scanner-primary", "fingerprint": "4bc8317b80d48a6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3a4f781e838ecd2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/team/invites/page.tsx:225"}, "properties": {"repobilityId": "8ea281dc84560836", "scanner": "scanner-primary", "fingerprint": "3a4f781e838ecd2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b0a84394bcfda4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/wachat/page.client.tsx:282"}, "properties": {"repobilityId": "d81d1e8956f20888", "scanner": "scanner-primary", "fingerprint": "7b0a84394bcfda4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8217ecf5494b8673", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/wachat/contacts/page.client.tsx:107"}, "properties": {"repobilityId": "f09c93531828cfdc", "scanner": "scanner-primary", "fingerprint": "8217ecf5494b8673", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4621659f96cccff8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/finance/page.tsx:174"}, "properties": {"repobilityId": "083608b9e5f198fb", "scanner": "scanner-primary", "fingerprint": "4621659f96cccff8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4b468cc08c1df12d", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/budgets/types.ts:5"}, "properties": {"repobilityId": "502b3111ced335e8", "scanner": "scanner-primary", "fingerprint": "4b468cc08c1df12d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-d62d1228df2d232f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/inventory/types.ts:5"}, "properties": {"repobilityId": "a77b4f5350607175", "scanner": "scanner-primary", "fingerprint": "d62d1228df2d232f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b48e4c64c30bd3bd", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/payouts/types.ts:5"}, "properties": {"repobilityId": "d08f3ce9b084cab3", "scanner": "scanner-primary", "fingerprint": "b48e4c64c30bd3bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fad15dda83f9614f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/po-approvals/types.ts:5"}, "properties": {"repobilityId": "8196023c870cc6fe", "scanner": "scanner-primary", "fingerprint": "fad15dda83f9614f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-14ed67a285bbb5bc", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/taxes/types.ts:5"}, "properties": {"repobilityId": "a41fbfd748b42e59", "scanner": "scanner-primary", "fingerprint": "14ed67a285bbb5bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0f626fe785baea35", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/assets/types.ts:5"}, "properties": {"repobilityId": "5a1faf088917a7be", "scanner": "scanner-primary", "fingerprint": "0f626fe785baea35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2c54b2a4c25022b9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/vendor-portal/types.ts:5"}, "properties": {"repobilityId": "a00ac3f3347c6850", "scanner": "scanner-primary", "fingerprint": "2c54b2a4c25022b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-35b96c51a7ba61b5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/gl/types.ts:5"}, "properties": {"repobilityId": "0d480a63e9475e15", "scanner": "scanner-primary", "fingerprint": "35b96c51a7ba61b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b2a3679cc0908675", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/bank-reconciliation/types.ts:5"}, "properties": {"repobilityId": "5fe1ba058dd7b913", "scanner": "scanner-primary", "fingerprint": "b2a3679cc0908675", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-46683b6fb0ec7f14", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/dashboard/finance/subscriptions/types.ts:5"}, "properties": {"repobilityId": "2b7dbc4a2f022f0c", "scanner": "scanner-primary", "fingerprint": "46683b6fb0ec7f14", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cf3ec5714604dade", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/sabsheet/[workbookId]/print/_print-view.tsx:141"}, "properties": {"repobilityId": "b3d4499647de024b", "scanner": "scanner-primary", "fingerprint": "cf3ec5714604dade", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-57f7e9e9817af932", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketing/universal-inbox/_universal-inbox-client.tsx:120"}, "properties": {"repobilityId": "0b8b0759c6934c7a", "scanner": "scanner-primary", "fingerprint": "57f7e9e9817af932", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76c32b544ead9ca8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/marketing/social-media-scheduler/_social-media-scheduler-client.tsx:382"}, "properties": {"repobilityId": "1ec8c6101e9593dd", "scanner": "scanner-primary", "fingerprint": "76c32b544ead9ca8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9af2c1b43d66bfc7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/pages/[pageId]/_components/page-designer-client.tsx:250"}, "properties": {"repobilityId": "941a922c820a870f", "scanner": "scanner-primary", "fingerprint": "9af2c1b43d66bfc7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d3b70381d5ade5c9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/_components/builder-shell-client.tsx:327"}, "properties": {"repobilityId": "f29b6fea033843ed", "scanner": "scanner-primary", "fingerprint": "d3b70381d5ade5c9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-126c77f01ac035f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/[appId]/builder/forms/[formId]/_components/form-designer-client.tsx:267"}, "properties": {"repobilityId": "250613411bbecf24", "scanner": "scanner-primary", "fingerprint": "126c77f01ac035f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1ef5aecb00c07cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabcreator/_components/apps-list-client.tsx:191"}, "properties": {"repobilityId": "fc46ead72dcee9b2", "scanner": "scanner-primary", "fingerprint": "c1ef5aecb00c07cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1142524dbc01b67a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabprep/_components/recipe-list-client.tsx:162"}, "properties": {"repobilityId": "327cac794bec6b66", "scanner": "scanner-primary", "fingerprint": "1142524dbc01b67a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8809e4cb0c0f9b5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabmail/crm-email/components/EmailClient.tsx:191"}, "properties": {"repobilityId": "8e3dc57ec52f847b", "scanner": "scanner-primary", "fingerprint": "b8809e4cb0c0f9b5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-652c0f147032d178", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/whatsapp/ads/page.client.tsx:602"}, "properties": {"repobilityId": "f93d4e0e6745b9c2", "scanner": "scanner-primary", "fingerprint": "652c0f147032d178", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d271cf548d73d668", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/page.tsx:312"}, "properties": {"repobilityId": "856df19d0247dd4e", "scanner": "scanner-primary", "fingerprint": "d271cf548d73d668", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b200c2493ae7feb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/budget-optimizer/page.tsx:103"}, "properties": {"repobilityId": "94efccf58635b732", "scanner": "scanner-primary", "fingerprint": "7b200c2493ae7feb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ed835c702b3eceb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/ad-previews/page.tsx:152"}, "properties": {"repobilityId": "8b920ee6def8f65e", "scanner": "scanner-primary", "fingerprint": "3ed835c702b3eceb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec7947e33fb8b14f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/creative-library/page.tsx:163"}, "properties": {"repobilityId": "fda75546dadffd5d", "scanner": "scanner-primary", "fingerprint": "ec7947e33fb8b14f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f57a3810b6c03ae8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/ad-accounts/page.tsx:196"}, "properties": {"repobilityId": "6c00e5886dc1586a", "scanner": "scanner-primary", "fingerprint": "f57a3810b6c03ae8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a3f97e19486259b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/create/page.tsx:499"}, "properties": {"repobilityId": "641fb0ae55a180aa", "scanner": "scanner-primary", "fingerprint": "1a3f97e19486259b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ae805bbb42fcc23a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/lead-forms/lead-forms-client.tsx:475"}, "properties": {"repobilityId": "01a8a8bc835b7ba2", "scanner": "scanner-primary", "fingerprint": "ae805bbb42fcc23a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9b5bfba906b1909", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/campaigns/page.tsx:515"}, "properties": {"repobilityId": "65c5f0b16e377b18", "scanner": "scanner-primary", "fingerprint": "f9b5bfba906b1909", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5159b56b6ae99dfa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/audiences/page.tsx:145"}, "properties": {"repobilityId": "19e2c605ff9fe3a2", "scanner": "scanner-primary", "fingerprint": "5159b56b6ae99dfa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0783fb35270fe446", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/pixels/page.tsx:188"}, "properties": {"repobilityId": "6c5e7df8095c24ca", "scanner": "scanner-primary", "fingerprint": "0783fb35270fe446", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-610298856a85ebe6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/ad-manager/compare/page.tsx:177"}, "properties": {"repobilityId": "fbc21bb52c62a309", "scanner": "scanner-primary", "fingerprint": "610298856a85ebe6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-30f1764d08becfa3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/datasets/_components/new-dataset-panel.tsx:116"}, "properties": {"repobilityId": "20fe9aeb2d83a4cf", "scanner": "scanner-primary", "fingerprint": "30f1764d08becfa3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-00e774278bdc539b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/new/error.tsx:31"}, "properties": {"repobilityId": "e4c6a51d701614a6", "scanner": "scanner-primary", "fingerprint": "00e774278bdc539b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e9cfb426548180d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/[id]/public/error.tsx:29"}, "properties": {"repobilityId": "25a810ae55765f3e", "scanner": "scanner-primary", "fingerprint": "e9cfb426548180d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0e234f9c62943dc5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/dashboards/_components/widget-renderer.tsx:155"}, "properties": {"repobilityId": "aceb4b0e1c2e4f56", "scanner": "scanner-primary", "fingerprint": "0e234f9c62943dc5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fd2d647cb4e21b2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/sabbi/reports/invoice-aging/page.tsx:131"}, "properties": {"repobilityId": "f8eabdde5aa4b241", "scanner": "scanner-primary", "fingerprint": "fd2d647cb4e21b2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2cd39431da0c91df", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/expense/page.tsx:203"}, "properties": {"repobilityId": "07ec20f7032465fc", "scanner": "scanner-primary", "fingerprint": "2cd39431da0c91df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b1442a47f7708fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/leave-report/page.tsx:187"}, "properties": {"repobilityId": "1af03086d3650f9c", "scanner": "scanner-primary", "fingerprint": "7b1442a47f7708fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f47f8d15a23344e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/profit-loss/page.tsx:189"}, "properties": {"repobilityId": "d58ca5ee5bc1b44e", "scanner": "scanner-primary", "fingerprint": "f47f8d15a23344e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0fa4f83a1e617d30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/reports-hub-client.tsx:256"}, "properties": {"repobilityId": "e9f1c84febf10271", "scanner": "scanner-primary", "fingerprint": "0fa4f83a1e617d30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dbbce4f84e4dde55", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/report-toolbar.tsx:104"}, "properties": {"repobilityId": "6baabb6b447ffa7d", "scanner": "scanner-primary", "fingerprint": "dbbce4f84e4dde55", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e500ba0df51cd78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/reports/_components/gantt-chart-preview.tsx:51"}, "properties": {"repobilityId": "e2627dfb95fd220d", "scanner": "scanner-primary", "fingerprint": "7e500ba0df51cd78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-252619db5d65a7c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/xray/[modelId]/xray-view.tsx:92"}, "properties": {"repobilityId": "281eae6540031c00", "scanner": "scanner-primary", "fingerprint": "252619db5d65a7c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4038a505d670f6a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbi/boards/[id]/board-view.tsx:104"}, "properties": {"repobilityId": "ef2df41dcd5205ab", "scanner": "scanner-primary", "fingerprint": "d4038a505d670f6a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d28f97c3ae7ee422", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/usage/_components/usage-client.tsx:342"}, "properties": {"repobilityId": "9505c2dab7c5eaa6", "scanner": "scanner-primary", "fingerprint": "d28f97c3ae7ee422", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb5963bdffc815fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:311"}, "properties": {"repobilityId": "a38fdfe8295c32e9", "scanner": "scanner-primary", "fingerprint": "bb5963bdffc815fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4380d6db4df9c52c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/executions/_components/executions-list-client.tsx:223"}, "properties": {"repobilityId": "f35a2e9e32d83063", "scanner": "scanner-primary", "fingerprint": "4380d6db4df9c52c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cd138b907a039422", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/workspaces/_components/workspaces-client.tsx:171"}, "properties": {"repobilityId": "1edfebec19518167", "scanner": "scanner-primary", "fingerprint": "cd138b907a039422", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ebdd001241d64365", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/[flowId]/webhooks/_components/webhooks-client.tsx:196"}, "properties": {"repobilityId": "eba2148486008ed0", "scanner": "scanner-primary", "fingerprint": "ebdd001241d64365", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fc758f44298275a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/audit/_components/audit-client.tsx:458"}, "properties": {"repobilityId": "08de7a87ae64e56c", "scanner": "scanner-primary", "fingerprint": "fc758f44298275a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-56ca00a3b147d898", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:420"}, "properties": {"repobilityId": "13d36804a632d397", "scanner": "scanner-primary", "fingerprint": "56ca00a3b147d898", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e6bcc5fb2457f836", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/links/page.tsx:93"}, "properties": {"repobilityId": "887120d0032abe58", "scanner": "scanner-primary", "fingerprint": "e6bcc5fb2457f836", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13ea326ba4133400", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/flow-builder/page.tsx:343"}, "properties": {"repobilityId": "0f77898d899abe69", "scanner": "scanner-primary", "fingerprint": "13ea326ba4133400", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6f9cbc3c59b75b6c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:252"}, "properties": {"repobilityId": "7de8ae7c52b8fcb2", "scanner": "scanner-primary", "fingerprint": "6f9cbc3c59b75b6c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-14e1f08ead9b19e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/_components/templates-sheet.tsx:284"}, "properties": {"repobilityId": "813d1e238f03e06b", "scanner": "scanner-primary", "fingerprint": "14e1f08ead9b19e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3c7c841bc515ba1f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/connections/_components/connections-client.tsx:679"}, "properties": {"repobilityId": "040657be144806f7", "scanner": "scanner-primary", "fingerprint": "3c7c841bc515ba1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e45653bcb57722a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabflow/invites/_components/invites-client.tsx:309"}, "properties": {"repobilityId": "2e6d9259f2ede35e", "scanner": "scanner-primary", "fingerprint": "e45653bcb57722a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fb3d4dc62a2423da", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/page.tsx:166"}, "properties": {"repobilityId": "cb3d8e9edbdc9477", "scanner": "scanner-primary", "fingerprint": "fb3d4dc62a2423da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65decd59b5a84b67", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/settings/page.client.tsx:201"}, "properties": {"repobilityId": "09a463cb875090e3", "scanner": "scanner-primary", "fingerprint": "65decd59b5a84b67", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d26711c102be4dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/profile/page.client.tsx:112"}, "properties": {"repobilityId": "5000deb25aa09a70", "scanner": "scanner-primary", "fingerprint": "0d26711c102be4dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7cb747ed1fab3f99", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/user/profile/components/OnboardingDetailsCard.tsx:18"}, "properties": {"repobilityId": "2b7729b35a6a6c5d", "scanner": "scanner-primary", "fingerprint": "7cb747ed1fab3f99", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a06980644975fa00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/page.tsx:575"}, "properties": {"repobilityId": "201aeb9fff2901d5", "scanner": "scanner-primary", "fingerprint": "a06980644975fa00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54fbeec2e24ee8aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/settings/brand-kit/page.tsx:237"}, "properties": {"repobilityId": "191effd4538bf6ae", "scanner": "scanner-primary", "fingerprint": "54fbeec2e24ee8aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bc2d4ae9e2c35337", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/qr-code-maker/campaigns/page.tsx:195"}, "properties": {"repobilityId": "e594709c966a273d", "scanner": "scanner-primary", "fingerprint": "bc2d4ae9e2c35337", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a297614f057173f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabrequests/new/new-request-client.tsx:277"}, "properties": {"repobilityId": "96a7c31ea0fb3dce", "scanner": "scanner-primary", "fingerprint": "a297614f057173f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7c0b29f3813609f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/page.tsx:214"}, "properties": {"repobilityId": "315afae535156b93", "scanner": "scanner-primary", "fingerprint": "e7c0b29f3813609f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ef3bf919f9831c38", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/pipelines/[pipelineId]/page.tsx:192"}, "properties": {"repobilityId": "6543cc326a367948", "scanner": "scanner-primary", "fingerprint": "ef3bf919f9831c38", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f76800590de3d8a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/activities/_components/activities-client.tsx:461"}, "properties": {"repobilityId": "f003a9777a8ab9cc", "scanner": "scanner-primary", "fingerprint": "9f76800590de3d8a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d44c480ccbd516ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/contacts/page.tsx:109"}, "properties": {"repobilityId": "ff1228e6913aacfa", "scanner": "scanner-primary", "fingerprint": "d44c480ccbd516ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8751c18ca92a8375", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/contacts/[contactId]/_components/contact-detail-client.tsx:346"}, "properties": {"repobilityId": "9057dc14846ae54e", "scanner": "scanner-primary", "fingerprint": "8751c18ca92a8375", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a79a005a98071643", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/products/_components/products-client.tsx:148"}, "properties": {"repobilityId": "181c4ec36bae58fa", "scanner": "scanner-primary", "fingerprint": "a79a005a98071643", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c4f59ff551ba61d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/deals/[dealId]/_components/deal-detail-client.tsx:456"}, "properties": {"repobilityId": "03834c6eafababb2", "scanner": "scanner-primary", "fingerprint": "8c4f59ff551ba61d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b861a0b9f0d7a3bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/companies/page.tsx:131"}, "properties": {"repobilityId": "681d283d792c6397", "scanner": "scanner-primary", "fingerprint": "b861a0b9f0d7a3bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68dd98bfec082eee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabbigin/companies/[companyId]/_components/company-detail-client.tsx:474"}, "properties": {"repobilityId": "dce522dcdb5ff5ba", "scanner": "scanner-primary", "fingerprint": "68dd98bfec082eee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cb2e36396b3b7179", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabfiles/_components/file-manager.tsx:171"}, "properties": {"repobilityId": "240802c081f138fb", "scanner": "scanner-primary", "fingerprint": "cb2e36396b3b7179", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-997b8e47b2a8a277", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/messages/page.tsx:209"}, "properties": {"repobilityId": "b078676c780f844c", "scanner": "scanner-primary", "fingerprint": "997b8e47b2a8a277", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20659b2008db23d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/setup/page.tsx:225"}, "properties": {"repobilityId": "2ceb6880cf46591d", "scanner": "scanner-primary", "fingerprint": "20659b2008db23d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa53ea2ef0ce02fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/instagram/connections/ConnectionsClient.tsx:305"}, "properties": {"repobilityId": "9a57d9ec2f1de2ec", "scanner": "scanner-primary", "fingerprint": "fa53ea2ef0ce02fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e16cd4625cc786e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/page.tsx:162"}, "properties": {"repobilityId": "30bafab0a9d5d311", "scanner": "scanner-primary", "fingerprint": "e16cd4625cc786e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1d7382b10f90a155", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/clients/[clientId]/page.tsx:228"}, "properties": {"repobilityId": "508b6ff41a98ec27", "scanner": "scanner-primary", "fingerprint": "1d7382b10f90a155", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-311dee5c03c66a00", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/sabpractice/clients/[clientId]/_components/client-doc-request-binder.tsx:72"}, "properties": {"repobilityId": "f013de2fd88d33f4", "scanner": "scanner-primary", "fingerprint": "311dee5c03c66a00", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7444d6f580fc431c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/_components/shared.tsx:96"}, "properties": {"repobilityId": "1666b773c43ce983", "scanner": "scanner-primary", "fingerprint": "7444d6f580fc431c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-54e4918ec3ff4a97", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/_components/SidebarCards.tsx:111"}, "properties": {"repobilityId": "26fb18bd85195d3e", "scanner": "scanner-primary", "fingerprint": "54e4918ec3ff4a97", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-309b981ddf11707c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/[projectId]/pseo/_components/pseo-client.tsx:314"}, "properties": {"repobilityId": "5b92478a328c764c", "scanner": "scanner-primary", "fingerprint": "309b981ddf11707c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fea862c6a28d045", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/site-explorer/_components/site-explorer-client.tsx:236"}, "properties": {"repobilityId": "82b74af47499b610", "scanner": "scanner-primary", "fingerprint": "4fea862c6a28d045", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b31294c09fb1ac20", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/meta-tag-generator/page.tsx:111"}, "properties": {"repobilityId": "8b00a46ac2d3ff26", "scanner": "scanner-primary", "fingerprint": "b31294c09fb1ac20", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f556e6e785c58dd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/seo/tools/keyword-trends/test.js:8"}, "properties": {"repobilityId": "ce99af6dad0060cd", "scanner": "scanner-primary", "fingerprint": "7f556e6e785c58dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bf5c6aadb44bab8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/meta-tag-analyzer/page.tsx:186"}, "properties": {"repobilityId": "8b75fdb16e2588cc", "scanner": "scanner-primary", "fingerprint": "3bf5c6aadb44bab8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-261937ed365ffd16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/og-tag-generator/page.tsx:135"}, "properties": {"repobilityId": "790df5f375814625", "scanner": "scanner-primary", "fingerprint": "261937ed365ffd16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5cb138b8870a2fc2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/markdown-to-html/page.tsx:124"}, "properties": {"repobilityId": "f7c3b6c703810e52", "scanner": "scanner-primary", "fingerprint": "5cb138b8870a2fc2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-89065c5634b05a8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/hash-generator/page.tsx:213"}, "properties": {"repobilityId": "7dc4fe5aa2cf2f65", "scanner": "scanner-primary", "fingerprint": "89065c5634b05a8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-31091befe4089b02", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/twitter-card-generator/page.tsx:269"}, "properties": {"repobilityId": "3e85bbb4fd39e75b", "scanner": "scanner-primary", "fingerprint": "31091befe4089b02", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1969508cf2db6a63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/anchor-text-analyzer/page.tsx:156"}, "properties": {"repobilityId": "1fd8dfec13adbc2d", "scanner": "scanner-primary", "fingerprint": "1969508cf2db6a63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8edb4c2a574378fc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/url-rewriter/page.tsx:146"}, "properties": {"repobilityId": "a89edd22ddfbfd2a", "scanner": "scanner-primary", "fingerprint": "8edb4c2a574378fc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c13fc61b5b18c00d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/json-formatter/page.tsx:70"}, "properties": {"repobilityId": "ef65c787cecd8b9b", "scanner": "scanner-primary", "fingerprint": "c13fc61b5b18c00d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-6640373d39609d90", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/open-graph-generator/page.tsx:133"}, "properties": {"repobilityId": "4d6205fab3ca14ec", "scanner": "scanner-primary", "fingerprint": "6640373d39609d90", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-280d8d16588c3314", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/dashboard/seo/tools/page-speed/page.tsx:184"}, "properties": {"repobilityId": "bd19dd7bf1d2d60b", "scanner": "scanner-primary", "fingerprint": "280d8d16588c3314", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-235dd9428f4f6cbb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/keyword-rank-checker/page.tsx:101"}, "properties": {"repobilityId": "1efe54e7e4d7b126", "scanner": "scanner-primary", "fingerprint": "235dd9428f4f6cbb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c24f96e85fd8e64", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/domain-authority/page.tsx:165"}, "properties": {"repobilityId": "30425ccad7601644", "scanner": "scanner-primary", "fingerprint": "5c24f96e85fd8e64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f7703025dc8eca04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/dashboard/seo/tools/broken-link-checker/page.tsx:180"}, "properties": {"repobilityId": "64bfbad88b2c4c1b", "scanner": "scanner-primary", "fingerprint": "f7703025dc8eca04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d7ac4e4739056a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/dashboard/seo/tools/js-minifier/test-terser.js:3"}, "properties": {"repobilityId": "902dcda2d08e9a42", "scanner": "scanner-primary", "fingerprint": "9d7ac4e4739056a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e7a1b2e0cf20e582", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/s/[shortCode]/page.tsx:170"}, "properties": {"repobilityId": "1349c9f393777eb6", "scanner": "scanner-primary", "fingerprint": "e7a1b2e0cf20e582", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3200a7fcf4983f4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/page.tsx:165"}, "properties": {"repobilityId": "5fdc65716cf63d8f", "scanner": "scanner-primary", "fingerprint": "3200a7fcf4983f4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cfe339dcb91972b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/settings/canned/page.tsx:588"}, "properties": {"repobilityId": "f6a4056bcaef6fbf", "scanner": "scanner-primary", "fingerprint": "8cfe339dcb91972b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-426895cc188ce83d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/automation/page.tsx:547"}, "properties": {"repobilityId": "5dd9c72e0f00fbba", "scanner": "scanner-primary", "fingerprint": "426895cc188ce83d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-683dc8f1d2522729", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/flows/create/page.tsx:623"}, "properties": {"repobilityId": "8890a1ea0459d353", "scanner": "scanner-primary", "fingerprint": "683dc8f1d2522729", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12970707cf5e5fa2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/health/page.tsx:480"}, "properties": {"repobilityId": "ae3b4a806df410fb", "scanner": "scanner-primary", "fingerprint": "12970707cf5e5fa2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-11790b6ffb54e7b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/conversation-kanban/page.tsx:130"}, "properties": {"repobilityId": "a38205acd57e50a2", "scanner": "scanner-primary", "fingerprint": "11790b6ffb54e7b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c3dba5a3d97437a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/catalog/page.tsx:65"}, "properties": {"repobilityId": "79f7445fc02b8382", "scanner": "scanner-primary", "fingerprint": "4c3dba5a3d97437a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22fc680f92c7c249", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/whatsapp-ads/page.tsx:663"}, "properties": {"repobilityId": "b01d57011bd1cbd8", "scanner": "scanner-primary", "fingerprint": "22fc680f92c7c249", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-46826b4150b2820e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/opt-out/page.tsx:477"}, "properties": {"repobilityId": "978cbd627209fada", "scanner": "scanner-primary", "fingerprint": "46826b4150b2820e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c63f2b749863f2fa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/templates/page.tsx:548"}, "properties": {"repobilityId": "1976edadbd3d01e3", "scanner": "scanner-primary", "fingerprint": "c63f2b749863f2fa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8c406177832faa63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/assignments/page.tsx:189"}, "properties": {"repobilityId": "d8ea38a530def4be", "scanner": "scanner-primary", "fingerprint": "8c406177832faa63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-40fb7ad4cf11f5c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/response-time-tracker/page.tsx:587"}, "properties": {"repobilityId": "8c8f9d281102efcc", "scanner": "scanner-primary", "fingerprint": "40fb7ad4cf11f5c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d912f5d54813c81a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/calls/settings/page.tsx:211"}, "properties": {"repobilityId": "8ac87ec1a25d38b0", "scanner": "scanner-primary", "fingerprint": "d912f5d54813c81a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9167ee30bd6e9592", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/numbers/page.tsx:349"}, "properties": {"repobilityId": "fcfbbd50a906ef14", "scanner": "scanner-primary", "fingerprint": "9167ee30bd6e9592", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d943cb6073e4e78a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcast-scheduler/page.tsx:477"}, "properties": {"repobilityId": "0dbc80a8ea20e443", "scanner": "scanner-primary", "fingerprint": "d943cb6073e4e78a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-446320080e4be065", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/qr-codes/page.tsx:422"}, "properties": {"repobilityId": "a1133789a821e5d9", "scanner": "scanner-primary", "fingerprint": "446320080e4be065", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34766bbb4a6c233e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/contact-groups/page.tsx:213"}, "properties": {"repobilityId": "38eb54fc70c24db2", "scanner": "scanner-primary", "fingerprint": "34766bbb4a6c233e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b5a4ede13da5df08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/contacts/page.tsx:148"}, "properties": {"repobilityId": "9b1c060f96b23e83", "scanner": "scanner-primary", "fingerprint": "b5a4ede13da5df08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4a09736f283ad15", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/saved-replies/page.tsx:231"}, "properties": {"repobilityId": "81c6fb814bbc1172", "scanner": "scanner-primary", "fingerprint": "d4a09736f283ad15", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19704a2479cec02b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/link-tracking/page.tsx:206"}, "properties": {"repobilityId": "3d38125f5e6ebc4c", "scanner": "scanner-primary", "fingerprint": "19704a2479cec02b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2067183ca32b2bbd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcasts/page.tsx:653"}, "properties": {"repobilityId": "1753b106a311c446", "scanner": "scanner-primary", "fingerprint": "2067183ca32b2bbd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8afb75ebe2ba55c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/conversation-summary/page.tsx:252"}, "properties": {"repobilityId": "9333d4cca7b3387c", "scanner": "scanner-primary", "fingerprint": "8afb75ebe2ba55c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-859a5543d0d24d3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/wachat/webhooks/page.tsx:77"}, "properties": {"repobilityId": "ebc827ac351a67a7", "scanner": "scanner-primary", "fingerprint": "859a5543d0d24d3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cc6ba3c409eec588", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/ui20-chat-client.tsx:272"}, "properties": {"repobilityId": "016f7104de83d700", "scanner": "scanner-primary", "fingerprint": "cc6ba3c409eec588", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dd6e9f00e4ceaab5", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/wachat/_components/create-template-form.tsx:303"}, "properties": {"repobilityId": "a2e9931a3b8efaaf", "scanner": "scanner-primary", "fingerprint": "dd6e9f00e4ceaab5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3c2abbe4d51e4263", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/scheduler-view.tsx:463"}, "properties": {"repobilityId": "586866cd47ca2625", "scanner": "scanner-primary", "fingerprint": "3c2abbe4d51e4263", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-888c75a80853a0e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/ui20-kanban-board.tsx:224"}, "properties": {"repobilityId": "04e38e20686e32fa", "scanner": "scanner-primary", "fingerprint": "888c75a80853a0e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6b3aca4863e6acf5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/broadcast-form.tsx:693"}, "properties": {"repobilityId": "956d2363bca6b1f5", "scanner": "scanner-primary", "fingerprint": "6b3aca4863e6acf5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-065fbf881ea383d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-window.tsx:211"}, "properties": {"repobilityId": "d72b97d6e22849e7", "scanner": "scanner-primary", "fingerprint": "065fbf881ea383d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-defb147ccbafe722", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-message.tsx:172"}, "properties": {"repobilityId": "b1c11ccd571857cf", "scanner": "scanner-primary", "fingerprint": "defb147ccbafe722", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3cc397287b71e722", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/_components/chat/ui20-chat-message-input.tsx:358"}, "properties": {"repobilityId": "ad806c853bd27297", "scanner": "scanner-primary", "fingerprint": "3cc397287b71e722", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fead5375747e0b08", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/overview/page.tsx:595"}, "properties": {"repobilityId": "ded51a4859662769", "scanner": "scanner-primary", "fingerprint": "fead5375747e0b08", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99225741f07c3376", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/broadcast-cron/page.tsx:515"}, "properties": {"repobilityId": "9b8f77d7917fb442", "scanner": "scanner-primary", "fingerprint": "99225741f07c3376", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be14aca964edd715", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/wachat/scheduled-messages/page.tsx:382"}, "properties": {"repobilityId": "50e388aad0d659e2", "scanner": "scanner-primary", "fingerprint": "be14aca964edd715", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-460b84ed4c7e6917", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabcrm/tasks/page.tsx:680"}, "properties": {"repobilityId": "116687ee964deef2", "scanner": "scanner-primary", "fingerprint": "460b84ed4c7e6917", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f621bab81bde276c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/leaderboard/leaderboard-client.tsx:307"}, "properties": {"repobilityId": "668ec89dd4995862", "scanner": "scanner-primary", "fingerprint": "f621bab81bde276c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b496f06e5d9e833", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/sabcrm/[objectSlug]/[recordId]/_comments/comments-panel.tsx:207"}, "properties": {"repobilityId": "7cc90bf1ffd78610", "scanner": "scanner-primary", "fingerprint": "0b496f06e5d9e833", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a5a6e576585dde7c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/copilot/copilot-client.tsx:73"}, "properties": {"repobilityId": "87d1367dfed905f7", "scanner": "scanner-primary", "fingerprint": "a5a6e576585dde7c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ff96b576b6cc542", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/inbox/inbox-client.tsx:256"}, "properties": {"repobilityId": "7e2094dd57fef1c8", "scanner": "scanner-primary", "fingerprint": "7ff96b576b6cc542", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce4753a29d420808", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/employees/[id]/employee-detail-client.tsx:276"}, "properties": {"repobilityId": "e31048a5d3491b67", "scanner": "scanner-primary", "fingerprint": "ce4753a29d420808", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7c6e1adb9cad8570", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/attendance/attendance-client.tsx:318"}, "properties": {"repobilityId": "28f7689bbc8f6fc1", "scanner": "scanner-primary", "fingerprint": "7c6e1adb9cad8570", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-69e2013ba901c6b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcrm/people/leave/leave-client.tsx:554"}, "properties": {"repobilityId": "cc053c550825b2c0", "scanner": "scanner-primary", "fingerprint": "69e2013ba901c6b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9344db8af5f29aa", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/r/[shortCode]/page.tsx:119"}, "properties": {"repobilityId": "719d959a638c4ccb", "scanner": "scanner-primary", "fingerprint": "f9344db8af5f29aa", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a5e7da1e210df7bc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/embed/sabbi/board/[token]/public-board.tsx:33"}, "properties": {"repobilityId": "a5059dc66a2ba25d", "scanner": "scanner-primary", "fingerprint": "a5e7da1e210df7bc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cc5c5127489c6cb5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/dashboard/page.tsx:131"}, "properties": {"repobilityId": "23bd6b6658e505b1", "scanner": "scanner-primary", "fingerprint": "cc5c5127489c6cb5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5c54087bf50ef2fb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:387"}, "properties": {"repobilityId": "882bdafa898c0c8c", "scanner": "scanner-primary", "fingerprint": "5c54087bf50ef2fb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e983c748ab73dd98", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/page.tsx:415"}, "properties": {"repobilityId": "0ac196c7fff04dc3", "scanner": "scanner-primary", "fingerprint": "e983c748ab73dd98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-79eaeae114a504a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/relationships/page.tsx:176"}, "properties": {"repobilityId": "acde3fe6923cf601", "scanner": "scanner-primary", "fingerprint": "79eaeae114a504a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b67daa0a96472c16", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/projects/_client.tsx:191"}, "properties": {"repobilityId": "5283d0907258fbe3", "scanner": "scanner-primary", "fingerprint": "b67daa0a96472c16", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8a6a3bc60c30675", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/conversations/page.tsx:134"}, "properties": {"repobilityId": "fd16930a3ce824c2", "scanner": "scanner-primary", "fingerprint": "b8a6a3bc60c30675", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d72def67a95b6d2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/ivr/page.tsx:584"}, "properties": {"repobilityId": "34f92d86401e7f11", "scanner": "scanner-primary", "fingerprint": "d72def67a95b6d2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fcb8ef16d2b37585", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/secrets/page.tsx:156"}, "properties": {"repobilityId": "db69d4ca08abd222", "scanner": "scanner-primary", "fingerprint": "fcb8ef16d2b37585", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-165f646dc7ba64b8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/agent-dashboard/page.tsx:152"}, "properties": {"repobilityId": "ba82a5c3e0af3dc7", "scanner": "scanner-primary", "fingerprint": "165f646dc7ba64b8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6555ae9fab1a6ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/contacts/page.tsx:704"}, "properties": {"repobilityId": "c01fce106b7f8aef", "scanner": "scanner-primary", "fingerprint": "d6555ae9fab1a6ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-94b071a44752220e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/agent-console/page.tsx:130"}, "properties": {"repobilityId": "f77a711f20770aab", "scanner": "scanner-primary", "fingerprint": "94b071a44752220e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20f8f9a4bac6c0d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/_components/command-palette.tsx:240"}, "properties": {"repobilityId": "84b29b8f436f63df", "scanner": "scanner-primary", "fingerprint": "20f8f9a4bac6c0d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d730c968957afd0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabcall/_components/sabcall-shell.tsx:79"}, "properties": {"repobilityId": "7a080d6b8f3f4be7", "scanner": "scanner-primary", "fingerprint": "2d730c968957afd0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b2a8f0182f5a243", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/security/_client.tsx:148"}, "properties": {"repobilityId": "314a73ca3d39d32d", "scanner": "scanner-primary", "fingerprint": "3b2a8f0182f5a243", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abe4cffbf87e03ef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/ai/_client.tsx:304"}, "properties": {"repobilityId": "e66f1496e974f634", "scanner": "scanner-primary", "fingerprint": "abe4cffbf87e03ef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bcda3cb0043b8cde", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/rules/_client.tsx:294"}, "properties": {"repobilityId": "5d01d4305a327e0f", "scanner": "scanner-primary", "fingerprint": "bcda3cb0043b8cde", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1b60e0050d00d0bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/projects/_client.tsx:187"}, "properties": {"repobilityId": "387c84d981c30c9c", "scanner": "scanner-primary", "fingerprint": "1b60e0050d00d0bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fe3ffccd58df0638", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/autopilot/_client.tsx:346"}, "properties": {"repobilityId": "d9120c5e0e493521", "scanner": "scanner-primary", "fingerprint": "fe3ffccd58df0638", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-76a4312ac6bd0a2e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/team/_client.tsx:365"}, "properties": {"repobilityId": "c0ed06d5e7498d11", "scanner": "scanner-primary", "fingerprint": "76a4312ac6bd0a2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91a39d9ce1e7bc61", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/templates/_client.tsx:302"}, "properties": {"repobilityId": "aac221e811299c84", "scanner": "scanner-primary", "fingerprint": "91a39d9ce1e7bc61", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4aa5c0d150f344e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/mailboxes/_client.tsx:500"}, "properties": {"repobilityId": "9ca2b8e492b7d2cb", "scanner": "scanner-primary", "fingerprint": "d4aa5c0d150f344e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d09a7cdf8b813c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/campaigns/_client.tsx:698"}, "properties": {"repobilityId": "e0db4c3636b1b409", "scanner": "scanner-primary", "fingerprint": "5d09a7cdf8b813c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-338b724cb2ffd1cb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/contacts/_client.tsx:296"}, "properties": {"repobilityId": "a01b11b32f0d47ba", "scanner": "scanner-primary", "fingerprint": "338b724cb2ffd1cb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f1a92fff8f750441", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/_client.tsx:233"}, "properties": {"repobilityId": "9bd513e299ff5b8b", "scanner": "scanner-primary", "fingerprint": "f1a92fff8f750441", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-96c12164cd63cd7a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/[id]/_client.tsx:430"}, "properties": {"repobilityId": "00a25fa43b3416b2", "scanner": "scanner-primary", "fingerprint": "96c12164cd63cd7a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-13aa199d49f7ef80", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/automations/[id]/runs/_client.tsx:135"}, "properties": {"repobilityId": "8e372b7582a6e86b", "scanner": "scanner-primary", "fingerprint": "13aa199d49f7ef80", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-134e1171cb851b78", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/setup/_client.tsx:325"}, "properties": {"repobilityId": "d801bae6ec7b40d0", "scanner": "scanner-primary", "fingerprint": "134e1171cb851b78", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-98002841db4013ee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/unified/_components/unified-inbox-client.tsx:285"}, "properties": {"repobilityId": "71cc5aa370bb4e99", "scanner": "scanner-primary", "fingerprint": "98002841db4013ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-544202d89c6a2557", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/segments/_client.tsx:230"}, "properties": {"repobilityId": "ea71904dd29e83c2", "scanner": "scanner-primary", "fingerprint": "544202d89c6a2557", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03e14e5dd98c5572", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/inbox/_components/inbox-client.tsx:776"}, "properties": {"repobilityId": "5e2ec2b54153dab9", "scanner": "scanner-primary", "fingerprint": "03e14e5dd98c5572", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b448bad709f47cca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/inbox/_components/compose-modal.tsx:406"}, "properties": {"repobilityId": "059747f1b02ed518", "scanner": "scanner-primary", "fingerprint": "b448bad709f47cca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b459535fa64ecca3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/recipient-chips.tsx:70"}, "properties": {"repobilityId": "4aec0261badc7f06", "scanner": "scanner-primary", "fingerprint": "b459535fa64ecca3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-91dbe4e003b222aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/sabmail-shell.tsx:110"}, "properties": {"repobilityId": "188912b3dfe58996", "scanner": "scanner-primary", "fingerprint": "91dbe4e003b222aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f82b6d0c1fa143f7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/_components/default-mailbox-claim.tsx:120"}, "properties": {"repobilityId": "938de53e66bb709a", "scanner": "scanner-primary", "fingerprint": "f82b6d0c1fa143f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a1363704031d09d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/forms/_client.tsx:168"}, "properties": {"repobilityId": "14e4198a43724922", "scanner": "scanner-primary", "fingerprint": "8a1363704031d09d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fe64258bfeb61462", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabmail/domains/_client.tsx:309"}, "properties": {"repobilityId": "9ca2ff26a8cd684a", "scanner": "scanner-primary", "fingerprint": "fe64258bfeb61462", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ccaf09b940c16cf5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabadmin/mail-domains/_client.tsx:197"}, "properties": {"repobilityId": "3b79d877f14b556c", "scanner": "scanner-primary", "fingerprint": "ccaf09b940c16cf5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dab973d1ed51e911", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabpay/onboarding/_client.tsx:274"}, "properties": {"repobilityId": "a575804bd5a8a30d", "scanner": "scanner-primary", "fingerprint": "dab973d1ed51e911", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5b30c23f6abe2723", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/page.tsx:416"}, "properties": {"repobilityId": "c2e31ebe5e9443a4", "scanner": "scanner-primary", "fingerprint": "5b30c23f6abe2723", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7394a4d7ea62b3d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/[id]/page.tsx:446"}, "properties": {"repobilityId": "e4cbf0c3dc654be4", "scanner": "scanner-primary", "fingerprint": "7394a4d7ea62b3d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c382b55872413ebe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/templates/page.tsx:303"}, "properties": {"repobilityId": "31ac628ad83e0db8", "scanner": "scanner-primary", "fingerprint": "c382b55872413ebe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2605f857b9ea18eb", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/form-builder/page.tsx:146"}, "properties": {"repobilityId": "f6c99c63eab92211", "scanner": "scanner-primary", "fingerprint": "2605f857b9ea18eb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-451bc474a3f74473", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsign/_components/sabsign-shell.tsx:68"}, "properties": {"repobilityId": "a1ac1dabb1beed2c", "scanner": "scanner-primary", "fingerprint": "451bc474a3f74473", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e0f1e9cab16eeb7f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/lens/[token]/_components/customer-lens-client.tsx:63"}, "properties": {"repobilityId": "bbf89710ede90366", "scanner": "scanner-primary", "fingerprint": "e0f1e9cab16eeb7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6773b05139d3b854", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/portal/client/knowledge-base/[id]/page.tsx:53"}, "properties": {"repobilityId": "9cdc74e570bf6a48", "scanner": "scanner-primary", "fingerprint": "6773b05139d3b854", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-855fcd8bf09bd89e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/portal/client/_components/ClientOverviewContent.tsx:331"}, "properties": {"repobilityId": "9b5aecc7fd429900", "scanner": "scanner-primary", "fingerprint": "855fcd8bf09bd89e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a1f9fe69097619b", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/present/[publishSlug]/page.tsx:52"}, "properties": {"repobilityId": "74a87ce2494e996d", "scanner": "scanner-primary", "fingerprint": "6a1f9fe69097619b", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-ed628e29a9061599", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/layout.tsx:103"}, "properties": {"repobilityId": "0352e57af9b0319b", "scanner": "scanner-primary", "fingerprint": "ed628e29a9061599", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-603cd62b60bb70a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/gantt/[hash]/_components/public-gantt-chart.tsx:290"}, "properties": {"repobilityId": "2aaa2b481231abb8", "scanner": "scanner-primary", "fingerprint": "603cd62b60bb70a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a5b9b1af91a68ac2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/share/contract/[hash]/page.tsx:56"}, "properties": {"repobilityId": "f08954491c3a9a35", "scanner": "scanner-primary", "fingerprint": "a5b9b1af91a68ac2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-63e8709b8f1440c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/taskboard/[hash]/TaskboardClient.tsx:135"}, "properties": {"repobilityId": "ef545205e2bbf88f", "scanner": "scanner-primary", "fingerprint": "63e8709b8f1440c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35b1b468950085e2", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/share/proposal/[hash]/page.tsx:72"}, "properties": {"repobilityId": "ba8f23de4a57ca3f", "scanner": "scanner-primary", "fingerprint": "35b1b468950085e2", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f801264441717287", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/share/[token]/share-landing.tsx:237"}, "properties": {"repobilityId": "73ba30e484d15c2b", "scanner": "scanner-primary", "fingerprint": "f801264441717287", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1165e2d03068f878", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabrequests.actions.ts:450"}, "properties": {"repobilityId": "7d8f54e70e2b45dd", "scanner": "scanner-primary", "fingerprint": "1165e2d03068f878", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a120f3e8b4573ebb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabmeet.actions.ts:119"}, "properties": {"repobilityId": "cc55ec2efe4d4da3", "scanner": "scanner-primary", "fingerprint": "a120f3e8b4573ebb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2045efb1be567393", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-accounts.actions.ts:805"}, "properties": {"repobilityId": "05fa32050c4ea96c", "scanner": "scanner-primary", "fingerprint": "2045efb1be567393", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8ce7f869e1bd160d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/whatsapp.actions.ts:100"}, "properties": {"repobilityId": "8ed10812a765e53b", "scanner": "scanner-primary", "fingerprint": "8ce7f869e1bd160d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22df49794ff32624", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/team.actions.ts:300"}, "properties": {"repobilityId": "5b3372a4c802b9fe", "scanner": "scanner-primary", "fingerprint": "22df49794ff32624", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d05be26daae787c3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/mailbox.actions.ts:162"}, "properties": {"repobilityId": "617749f8067f8f0e", "scanner": "scanner-primary", "fingerprint": "d05be26daae787c3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6135d8637138d015", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/onboarding.actions.ts:58"}, "properties": {"repobilityId": "5e7a0a963cd89989", "scanner": "scanner-primary", "fingerprint": "6135d8637138d015", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83887e1f1877122e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/crm-reports.actions.ts:1207"}, "properties": {"repobilityId": "49702353aeedc912", "scanner": "scanner-primary", "fingerprint": "83887e1f1877122e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84b3e938855271af", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/user.actions.ts:258"}, "properties": {"repobilityId": "7d926976c627d8bb", "scanner": "scanner-primary", "fingerprint": "84b3e938855271af", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3fa4bf8f0cab4d30", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-lookup.actions.ts:735"}, "properties": {"repobilityId": "00e75ec56f7dc612", "scanner": "scanner-primary", "fingerprint": "3fa4bf8f0cab4d30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-44641ae84546790e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/seo.actions.ts:511"}, "properties": {"repobilityId": "2c734189434d1552", "scanner": "scanner-primary", "fingerprint": "44641ae84546790e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3d30cf2af25d6aa8", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabsheet.actions.ts:351"}, "properties": {"repobilityId": "7b629fa135cabeb8", "scanner": "scanner-primary", "fingerprint": "3d30cf2af25d6aa8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-64d4486003f67928", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-portal-auth.actions.ts:161"}, "properties": {"repobilityId": "3e6c44bee61ca372", "scanner": "scanner-primary", "fingerprint": "64d4486003f67928", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-eeb92a4fd29eb748", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabwriter.actions.ts:338"}, "properties": {"repobilityId": "3832a423d750fada", "scanner": "scanner-primary", "fingerprint": "eeb92a4fd29eb748", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0e2d36113630af9a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm-employees.actions.ts:548"}, "properties": {"repobilityId": "91cd339821c4741f", "scanner": "scanner-primary", "fingerprint": "0e2d36113630af9a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1208b37f58755b9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/email.actions.ts:630"}, "properties": {"repobilityId": "4acf7b0f392e37b1", "scanner": "scanner-primary", "fingerprint": "1208b37f58755b9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1d47a0989a4f63e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/facebook.actions.ts:155"}, "properties": {"repobilityId": "894fbc3e5f6da3e2", "scanner": "scanner-primary", "fingerprint": "1d47a0989a4f63e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b255940b539cf85", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/sabwebinar.actions.ts:155"}, "properties": {"repobilityId": "7ba65cb3f1698f89", "scanner": "scanner-primary", "fingerprint": "6b255940b539cf85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7890db3c236a45ee", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/client-signup.actions.ts:118"}, "properties": {"repobilityId": "ef77db331d99103d", "scanner": "scanner-primary", "fingerprint": "7890db3c236a45ee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6c20166c87b75ac9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/client-signup.actions.ts:119"}, "properties": {"repobilityId": "f5cad8d557130e71", "scanner": "scanner-primary", "fingerprint": "6c20166c87b75ac9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-33456b9fcc283fba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/worksuite/payments.actions.ts:423"}, "properties": {"repobilityId": "5fd5f2809de30d8a", "scanner": "scanner-primary", "fingerprint": "33456b9fcc283fba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0380b9f13c05acdf", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/n8n/index.ts:213"}, "properties": {"repobilityId": "b6a35dd02169b279", "scanner": "scanner-primary", "fingerprint": "0380b9f13c05acdf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-06fa04ad7d524b1d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/n8n/index.ts:215"}, "properties": {"repobilityId": "43b3f2dd6ba8315a", "scanner": "scanner-primary", "fingerprint": "06fa04ad7d524b1d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85c59e316df40fe3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/payouts.actions.ts:408"}, "properties": {"repobilityId": "2c2a3d0e23655fe8", "scanner": "scanner-primary", "fingerprint": "85c59e316df40fe3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-564d7bbf6b01acec", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/bookings.actions.ts:322"}, "properties": {"repobilityId": "a6fa3f4e5db102eb", "scanner": "scanner-primary", "fingerprint": "564d7bbf6b01acec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0f5e94790e60aa62", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/actions/crm/tickets.actions.ts:246"}, "properties": {"repobilityId": "0c91ba3c73db91e8", "scanner": "scanner-primary", "fingerprint": "0f5e94790e60aa62", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3569b679e49b7383", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/actions/crm/payment-receipts.actions.ts:474"}, "properties": {"repobilityId": "40e9f41011da56d4", "scanner": "scanner-primary", "fingerprint": "3569b679e49b7383", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e272d2cecc4b6809", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/store/[tenantSlug]/layout.tsx:44"}, "properties": {"repobilityId": "055d07b16f6d7caa", "scanner": "scanner-primary", "fingerprint": "e272d2cecc4b6809", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4f209c725098c51f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/features/[slug]/page.tsx:127"}, "properties": {"repobilityId": "7306360343b096f7", "scanner": "scanner-primary", "fingerprint": "4f209c725098c51f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e636c51e80fdf25f", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/features/[slug]/page.tsx:107"}, "properties": {"repobilityId": "60e04b1a8a83f84b", "scanner": "scanner-primary", "fingerprint": "e636c51e80fdf25f", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-26e1d51e59847f46", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/settings/sinks-card.tsx:100"}, "properties": {"repobilityId": "bc0cbc66c396cd9b", "scanner": "scanner-primary", "fingerprint": "26e1d51e59847f46", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f264a010c78aefc7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/api-docs/api-docs-client.tsx:237"}, "properties": {"repobilityId": "1c6b2bc4adfaf09a", "scanner": "scanner-primary", "fingerprint": "f264a010c78aefc7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36bdf3dba2b8cda0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/app/sabsms/api-docs/api-docs-client.tsx:114"}, "properties": {"repobilityId": "d7f1d90f241adcb9", "scanner": "scanner-primary", "fingerprint": "36bdf3dba2b8cda0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-700a0c392e8929f5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/routing/page.tsx:668"}, "properties": {"repobilityId": "0129f2955d71bd54", "scanner": "scanner-primary", "fingerprint": "700a0c392e8929f5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bd639bdaa062aef", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/analytics/actions.ts:54"}, "properties": {"repobilityId": "b9facf17b871d258", "scanner": "scanner-primary", "fingerprint": "0bd639bdaa062aef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3cd9d89e6ca1d7c4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/projects/_client.tsx:204"}, "properties": {"repobilityId": "48097df91d2e2d44", "scanner": "scanner-primary", "fingerprint": "3cd9d89e6ca1d7c4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f74ac90a04ee021b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/health/page.tsx:99"}, "properties": {"repobilityId": "58dbed31713b5d45", "scanner": "scanner-primary", "fingerprint": "f74ac90a04ee021b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0d2586ee74267bf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/scheduled/client.tsx:326"}, "properties": {"repobilityId": "9cbf241b3bcdc5cb", "scanner": "scanner-primary", "fingerprint": "c0d2586ee74267bf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6e7819f17cd8b2a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/send/composer.tsx:850"}, "properties": {"repobilityId": "a460e563f6f458ef", "scanner": "scanner-primary", "fingerprint": "6e7819f17cd8b2a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dc830e610f432178", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/sdk-reference/page.tsx:118"}, "properties": {"repobilityId": "c3e5e11b51c4b862", "scanner": "scanner-primary", "fingerprint": "dc830e610f432178", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-caf87653fabedf6d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/providers/providers-client.tsx:124"}, "properties": {"repobilityId": "8599e56c4ece1e01", "scanner": "scanner-primary", "fingerprint": "caf87653fabedf6d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fbb400002fe4a9c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/providers/[id]/provider-detail-client.tsx:65"}, "properties": {"repobilityId": "a7fb5f5f05788398", "scanner": "scanner-primary", "fingerprint": "4fbb400002fe4a9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a16d3ef8ce8d03a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/templates/page.tsx:91"}, "properties": {"repobilityId": "172fabb226b2cf73", "scanner": "scanner-primary", "fingerprint": "9a16d3ef8ce8d03a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7556d507c9da7fac", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/templates/approvals/actions.ts:166"}, "properties": {"repobilityId": "5088250afcb1ada4", "scanner": "scanner-primary", "fingerprint": "7556d507c9da7fac", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-94fd6cce4e645ca9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/logs/page.tsx:298"}, "properties": {"repobilityId": "57644ccc86840158", "scanner": "scanner-primary", "fingerprint": "94fd6cce4e645ca9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fdc777fee042832f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/compliance/dlt/dlt-client.tsx:377"}, "properties": {"repobilityId": "cadcacde4374e2a7", "scanner": "scanner-primary", "fingerprint": "fdc777fee042832f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b46ec6b56b7d306", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/numbers/[id]/actions.ts:335"}, "properties": {"repobilityId": "f4dc01fb8d06bdbf", "scanner": "scanner-primary", "fingerprint": "2b46ec6b56b7d306", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cde0385c7e4fed35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/api-keys/page.tsx:590"}, "properties": {"repobilityId": "53a6b3da631a38f9", "scanner": "scanner-primary", "fingerprint": "cde0385c7e4fed35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c336bcdfceb51688", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/imports/actions.ts:411"}, "properties": {"repobilityId": "34b82becf864ef42", "scanner": "scanner-primary", "fingerprint": "c336bcdfceb51688", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3fc33ca54d917ca1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/quick-send/progress-dashboard.tsx:249"}, "properties": {"repobilityId": "32f53b8ffc6dda38", "scanner": "scanner-primary", "fingerprint": "3fc33ca54d917ca1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67a5d5eaef1f9ceb", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/quick-send/actions.ts:25"}, "properties": {"repobilityId": "e449406e9165c334", "scanner": "scanner-primary", "fingerprint": "67a5d5eaef1f9ceb", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-33e5e6c9b94bd633", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/quick-send/actions.ts:228"}, "properties": {"repobilityId": "b3a57499a8342548", "scanner": "scanner-primary", "fingerprint": "33e5e6c9b94bd633", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a88581970ac14d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/quick-send/quick-send-client.tsx:569"}, "properties": {"repobilityId": "3e29ce1de3bee39a", "scanner": "scanner-primary", "fingerprint": "2a88581970ac14d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-557df60665e2fa56", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/campaigns/campaigns-table.tsx:301"}, "properties": {"repobilityId": "b7d9d73bc2d622d6", "scanner": "scanner-primary", "fingerprint": "557df60665e2fa56", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bb63c89c53d90014", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/campaigns/new/actions.ts:276"}, "properties": {"repobilityId": "c2c02b9bc03d5405", "scanner": "scanner-primary", "fingerprint": "bb63c89c53d90014", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a324d34e50ae77c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/campaigns/new/steps/step-review.tsx:240"}, "properties": {"repobilityId": "bf1854ec04d56e50", "scanner": "scanner-primary", "fingerprint": "6a324d34e50ae77c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-472bc385cfc30d70", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/campaigns/new/steps/step-schedule.tsx:106"}, "properties": {"repobilityId": "3738dd2d55327477", "scanner": "scanner-primary", "fingerprint": "472bc385cfc30d70", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9ac9bb7d27578e01", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/campaigns/create/page.tsx:320"}, "properties": {"repobilityId": "603ee3f61fb37539", "scanner": "scanner-primary", "fingerprint": "9ac9bb7d27578e01", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-63e5b0ae2c77feba", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/contacts/actions.ts:595"}, "properties": {"repobilityId": "f760f4ab836a2b50", "scanner": "scanner-primary", "fingerprint": "63e5b0ae2c77feba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8041f0293b2e10da", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/ab-tests/actions.ts:411"}, "properties": {"repobilityId": "33bbe1f58e6a38e0", "scanner": "scanner-primary", "fingerprint": "8041f0293b2e10da", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7237a80c3ff47666", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/segments/actions.ts:829"}, "properties": {"repobilityId": "951bf9fb09763ec1", "scanner": "scanner-primary", "fingerprint": "7237a80c3ff47666", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8823c4ce42227b92", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/sabsms/segments/new/actions.ts:598"}, "properties": {"repobilityId": "fef6cb4e4eb4bc71", "scanner": "scanner-primary", "fingerprint": "8823c4ce42227b92", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-469b8cc2fc81a0bd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/webhooks/webhooks-table.tsx:259"}, "properties": {"repobilityId": "2aef89bc6e8fc369", "scanner": "scanner-primary", "fingerprint": "469b8cc2fc81a0bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce2f9672888506e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/webhooks/deliveries-panel.tsx:145"}, "properties": {"repobilityId": "456db5fe7a8accbd", "scanner": "scanner-primary", "fingerprint": "ce2f9672888506e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3fe686c278c4dfe6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/consent/consent-table.tsx:197"}, "properties": {"repobilityId": "48ad4dc654e6af60", "scanner": "scanner-primary", "fingerprint": "3fe686c278c4dfe6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-220a560f4132e48a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/inbox/thread-view.tsx:876"}, "properties": {"repobilityId": "8dd6437ada7a8cda", "scanner": "scanner-primary", "fingerprint": "220a560f4132e48a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-221bd04133d2a832", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/inbox/conversation-list.tsx:204"}, "properties": {"repobilityId": "ced97aae729661b4", "scanner": "scanner-primary", "fingerprint": "221bd04133d2a832", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d8863e1397a93bf6", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/app/sabsms/inbox/actions.ts:856"}, "properties": {"repobilityId": "749b3e6b665a3983", "scanner": "scanner-primary", "fingerprint": "d8863e1397a93bf6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-556d26ec69c718be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/sabsms/_components/sabsms-shell.tsx:76"}, "properties": {"repobilityId": "54e5d30166a67550", "scanner": "scanner-primary", "fingerprint": "556d26ec69c718be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b4c26c206f7c9db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/auth.ts:83"}, "properties": {"repobilityId": "32a8e942e048add0", "scanner": "scanner-primary", "fingerprint": "9b4c26c206f7c9db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-df8e9ca62ed7de42", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/crm-auth.ts:21"}, "properties": {"repobilityId": "ff5e94984d5c404a", "scanner": "scanner-primary", "fingerprint": "df8e9ca62ed7de42", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d6cc746787bf601", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cron-scheduler.js:42"}, "properties": {"repobilityId": "028eb742ff07493d", "scanner": "scanner-primary", "fingerprint": "0d6cc746787bf601", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f77fdafedc11163", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/call-webhook-processor.ts:54"}, "properties": {"repobilityId": "7928d72581554ec3", "scanner": "scanner-primary", "fingerprint": "1f77fdafedc11163", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1bdb1db7c10bf72f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/broadcast-worker.js:168"}, "properties": {"repobilityId": "2757bb6aac5d8227", "scanner": "scanner-primary", "fingerprint": "1bdb1db7c10bf72f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f85d050331c2ad6d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/calling-webhook-processor.ts:40"}, "properties": {"repobilityId": "f0b230c6f2003b95", "scanner": "scanner-primary", "fingerprint": "f85d050331c2ad6d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c2c11eeae7c4365d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/webhook-processor.ts:1357"}, "properties": {"repobilityId": "d1413c5f472efb00", "scanner": "scanner-primary", "fingerprint": "c2c11eeae7c4365d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a714a040f7b1a7de", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/integrations/imap-tickets.ts:137"}, "properties": {"repobilityId": "f1b1eb6f7fdf074b", "scanner": "scanner-primary", "fingerprint": "a714a040f7b1a7de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-246c1cdc9bcb4837", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/india-tax/e-invoice-providers.ts:205"}, "properties": {"repobilityId": "df60951edba1cc8c", "scanner": "scanner-primary", "fingerprint": "246c1cdc9bcb4837", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-58f97ac92424753e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/india-tax/eway-bill-providers.ts:200"}, "properties": {"repobilityId": "d128a2f586b0be00", "scanner": "scanner-primary", "fingerprint": "58f97ac92424753e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-738605cc4fd0151b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/email/send.ts:26"}, "properties": {"repobilityId": "c7d18bb299e8ec97", "scanner": "scanner-primary", "fingerprint": "738605cc4fd0151b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9fe63614725bd0a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/email/send.ts:27"}, "properties": {"repobilityId": "303f370a84e0c7a1", "scanner": "scanner-primary", "fingerprint": "9fe63614725bd0a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b97504105ab3a2b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabcrm/seed.server.ts:153"}, "properties": {"repobilityId": "e631962f71003974", "scanner": "scanner-primary", "fingerprint": "b97504105ab3a2b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5f5cc25674a22be", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/types/page-layout/PageLayoutWidgetConditionalDisplay.ts:1"}, "properties": {"repobilityId": "b21521a71e189c8b", "scanner": "scanner-primary", "fingerprint": "d5f5cc25674a22be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4ca87460b2c0ae9c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/constants/ObjectsWithChannelVisibilityConstraints.ts:1"}, "properties": {"repobilityId": "a13f540a6b0332a4", "scanner": "scanner-primary", "fingerprint": "4ca87460b2c0ae9c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f82512da2c06ae42", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/utils/compositeFieldFilterOperandsMap.ts:14"}, "properties": {"repobilityId": "ffc3c9016ca294d9", "scanner": "scanner-primary", "fingerprint": "f82512da2c06ae42", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-52f486620565a17a", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveRelativeDateFilter.ts:11"}, "properties": {"repobilityId": "f3ea74d3f4c15828", "scanner": "scanner-primary", "fingerprint": "52f486620565a17a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-2119d4a93e44e7bd", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveDateTimeFilter.ts:12"}, "properties": {"repobilityId": "50bd32daa153cf09", "scanner": "scanner-primary", "fingerprint": "2119d4a93e44e7bd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-75311d08f3467f7b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabcrm/shared/src/utils/filter/dates/utils/resolveDateFilter.ts:12"}, "properties": {"repobilityId": "c123b5eb7cfc7a40", "scanner": "scanner-primary", "fingerprint": "75311d08f3467f7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e4babfb205a03a85", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/lib/sabcrm/emails/src/utils/email-renderer/email-renderer.tsx:15"}, "properties": {"repobilityId": "f22bbed568409fbe", "scanner": "scanner-primary", "fingerprint": "e4babfb205a03a85", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-be60488d827df5fe", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabwriter/transport.ts:167"}, "properties": {"repobilityId": "6477f3b727d2d180", "scanner": "scanner-primary", "fingerprint": "be60488d827df5fe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-aebcf90546fcd090", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/cron/utils.ts:121"}, "properties": {"repobilityId": "24620a924c55aa32", "scanner": "scanner-primary", "fingerprint": "aebcf90546fcd090", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c5233ca2493bd804", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/cron/jobs/visa-passport-expiry-alerts.ts:89"}, "properties": {"repobilityId": "40b563d11a3f03c7", "scanner": "scanner-primary", "fingerprint": "c5233ca2493bd804", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-80285161a85ded85", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/cron/jobs/follow-up-reminders.ts:62"}, "properties": {"repobilityId": "f52691f2117b3406", "scanner": "scanner-primary", "fingerprint": "80285161a85ded85", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bd0438449cc29b95", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api-platform/handler.ts:105"}, "properties": {"repobilityId": "e4f03dac284c4694", "scanner": "scanner-primary", "fingerprint": "bd0438449cc29b95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81050a52e2a0984c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/api-platform/sample-builder.ts:103"}, "properties": {"repobilityId": "3e064d1af4f50cd8", "scanner": "scanner-primary", "fingerprint": "81050a52e2a0984c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1ac1d4f412500b64", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/app-presets/runtime/exec.ts:389"}, "properties": {"repobilityId": "66bfbe9d6a9ef111", "scanner": "scanner-primary", "fingerprint": "1ac1d4f412500b64", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e6c49369c9b3902f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/workflow-data-proxy.ts:62"}, "properties": {"repobilityId": "e668e6ad7c0b3fe3", "scanner": "scanner-primary", "fingerprint": "e6c49369c9b3902f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-943c8d4a0dc75cc2", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/schemas.ts:160"}, "properties": {"repobilityId": "387ed312dd395f2c", "scanner": "scanner-primary", "fingerprint": "943c8d4a0dc75cc2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-dfb73954918ad9e4", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/workflow.ts:833"}, "properties": {"repobilityId": "4f3455edb3cea0d9", "scanner": "scanner-primary", "fingerprint": "dfb73954918ad9e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9ae195bbc58233aa", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/utils.ts:64"}, "properties": {"repobilityId": "d2bccbe4fb5a87df", "scanner": "scanner-primary", "fingerprint": "9ae195bbc58233aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5601f8fe0322db09", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/node-helpers.ts:512"}, "properties": {"repobilityId": "573c7e2f9ebe2dec", "scanner": "scanner-primary", "fingerprint": "5601f8fe0322db09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-64af1ef42236a4df", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/interfaces.ts:911"}, "properties": {"repobilityId": "08dba890b9cb7dad", "scanner": "scanner-primary", "fingerprint": "64af1ef42236a4df", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9802bfe161432841", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/internal/backend-common/index.ts:29"}, "properties": {"repobilityId": "a36e7ab46601f626", "scanner": "scanner-primary", "fingerprint": "9802bfe161432841", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d5a91470afc0e07", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/date-extensions.ts:3"}, "properties": {"repobilityId": "203c5db01fa9b2e3", "scanner": "scanner-primary", "fingerprint": "0d5a91470afc0e07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9b152bc24c8ea922", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/array-extensions.ts:3"}, "properties": {"repobilityId": "ac9a4d0a4e0bef63", "scanner": "scanner-primary", "fingerprint": "9b152bc24c8ea922", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b729c4c45941fe2e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/utils.ts:3"}, "properties": {"repobilityId": "5d2deebdf91d1300", "scanner": "scanner-primary", "fingerprint": "b729c4c45941fe2e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5d04276e84c9da2f", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/boolean-extensions.ts:3"}, "properties": {"repobilityId": "a4ed472f420db0e0", "scanner": "scanner-primary", "fingerprint": "5d04276e84c9da2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-e93c4cd097d1b62c", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/number-extensions.ts:3"}, "properties": {"repobilityId": "68ae08ff8a412566", "scanner": "scanner-primary", "fingerprint": "e93c4cd097d1b62c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c790063445a31a53", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/object-extensions.ts:3"}, "properties": {"repobilityId": "bf20e670f5e5e92e", "scanner": "scanner-primary", "fingerprint": "c790063445a31a53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4c5c079e454620f7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/string-extensions.ts:3"}, "properties": {"repobilityId": "04a485822d752abf", "scanner": "scanner-primary", "fingerprint": "4c5c079e454620f7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-9910cc78edd39702", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/extensions/extended-functions.ts:3"}, "properties": {"repobilityId": "ffb889853a0ed89b", "scanner": "scanner-primary", "fingerprint": "9910cc78edd39702", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-8c52f6fb475d9ec7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/node-execute-functions.ts:16"}, "properties": {"repobilityId": "8e06efa0893b0bad", "scanner": "scanner-primary", "fingerprint": "8c52f6fb475d9ec7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3e1330750571b50e", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts:230"}, "properties": {"repobilityId": "ecd0dad77baff7b8", "scanner": "scanner-primary", "fingerprint": "3e1330750571b50e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-ae38c68723595ebc", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/requests-response.ts:69"}, "properties": {"repobilityId": "c2571711605c77e6", "scanner": "scanner-primary", "fingerprint": "ae38c68723595ebc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7dc8fa1c84d44b20", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/supply-data-context.ts:317"}, "properties": {"repobilityId": "b50f07a807ec394e", "scanner": "scanner-primary", "fingerprint": "7dc8fa1c84d44b20", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-3b96864c01325d1f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/supply-data-context.ts:377"}, "properties": {"repobilityId": "753688fa13357b12", "scanner": "scanner-primary", "fingerprint": "3b96864c01325d1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0f577bc143a9becf", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/node-execution-context.ts:415"}, "properties": {"repobilityId": "359f9702b3a96f85", "scanner": "scanner-primary", "fingerprint": "0f577bc143a9becf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-cb93992e556a76d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/execute-context.ts:223"}, "properties": {"repobilityId": "2e58ad75a1d3af0a", "scanner": "scanner-primary", "fingerprint": "cb93992e556a76d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4019f727cd2fac8b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/binary-helper-functions.ts:302"}, "properties": {"repobilityId": "c9982599abb454e8", "scanner": "scanner-primary", "fingerprint": "4019f727cd2fac8b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-05a8502d26af91af", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/get-secrets-proxy.ts:34"}, "properties": {"repobilityId": "a0cc65cfff7fd206", "scanner": "scanner-primary", "fingerprint": "05a8502d26af91af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-bcb3b1a7728309aa", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-start-nodes.ts:14"}, "properties": {"repobilityId": "4a2d7fe9108e6e0f", "scanner": "scanner-primary", "fingerprint": "bcb3b1a7728309aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-5a690e0d441f32ca", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/directed-graph.ts:475"}, "properties": {"repobilityId": "42e6fb4b3a2aabba", "scanner": "scanner-primary", "fingerprint": "5a690e0d441f32ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1bb717bd302594b3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-trigger-for-partial-execution.ts:77"}, "properties": {"repobilityId": "cd341154ffd95c59", "scanner": "scanner-primary", "fingerprint": "1bb717bd302594b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-59ee5b62bed9f3a0", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-subgraph.ts:47"}, "properties": {"repobilityId": "c08bf0a7fafbc125", "scanner": "scanner-primary", "fingerprint": "59ee5b62bed9f3a0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-229c3ef624732818", "level": "note", "message": {"text": "React Flow edge with `label=` but no project-wide edge-label CSS override \u2014 src/lib/sabflow/editor-catalog/useAppCatalog.ts:232"}, "properties": {"repobilityId": "59bb8f7596d1bb22", "scanner": "scanner-primary", "fingerprint": "229c3ef624732818", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.edge-label.no-bg"]}}, {"ruleId": "scanner-6862a80ca4075153", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/execution/sandbox/browserSandbox.ts:309"}, "properties": {"repobilityId": "34ab0a7ccd18916d", "scanner": "scanner-primary", "fingerprint": "6862a80ca4075153", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a4e1a46317db049", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/sabflow/queue/dlq.ts:500"}, "properties": {"repobilityId": "aa7fdcbce63a353e", "scanner": "scanner-primary", "fingerprint": "4a4e1a46317db049", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-80ded9fa09b8ca9c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/expression/tokenizer.test.ts:133"}, "properties": {"repobilityId": "8632c137b37ea9c6", "scanner": "scanner-primary", "fingerprint": "80ded9fa09b8ca9c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2c5803b3ff9c28b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/expression/coerce.ts:330"}, "properties": {"repobilityId": "f6a81d0d8f4c3393", "scanner": "scanner-primary", "fingerprint": "b2c5803b3ff9c28b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7db03e06348047b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/credentials/oauth2-refresh.ts:313"}, "properties": {"repobilityId": "d436788ba9801e03", "scanner": "scanner-primary", "fingerprint": "7db03e06348047b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8d1b3009de2ccf72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/executor/credentials/crypto.ts:39"}, "properties": {"repobilityId": "5bb1e9aa9f92da58", "scanner": "scanner-primary", "fingerprint": "8d1b3009de2ccf72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-834e2e24e441e3d1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/persistence/indexes.ts:239"}, "properties": {"repobilityId": "cd01b44b9a226b15", "scanner": "scanner-primary", "fingerprint": "834e2e24e441e3d1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c56adbfd5e8b6134", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabflow/expressions/__tests__.ts:147"}, "properties": {"repobilityId": "8257fbefcae04bb8", "scanner": "scanner-primary", "fingerprint": "c56adbfd5e8b6134", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c83d6ad4619b3e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/automations/actions/send-email.ts:40"}, "properties": {"repobilityId": "aebca6c429b1fb70", "scanner": "scanner-primary", "fingerprint": "6c83d6ad4619b3e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-abb42eda3957ed71", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/automations/actions/webhook.ts:34"}, "properties": {"repobilityId": "ac7dfc079b164b54", "scanner": "scanner-primary", "fingerprint": "abb42eda3957ed71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-162988feb3a50477", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/actions/user.actions.ts:74"}, "properties": {"repobilityId": "9e1ddab1b153bb63", "scanner": "scanner-primary", "fingerprint": "162988feb3a50477", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a949fa04115b5169", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/contracts/esign-providers.ts:105"}, "properties": {"repobilityId": "19db6872d838aa22", "scanner": "scanner-primary", "fingerprint": "a949fa04115b5169", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-efb137a17743c4c7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/lib/contracts/signature-providers.ts:161"}, "properties": {"repobilityId": "8de1b33b3a464d2f", "scanner": "scanner-primary", "fingerprint": "efb137a17743c4c7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0685b250a7948473", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/sabsms/events/consumer.ts:395"}, "properties": {"repobilityId": "72f6b4036ddd95f6", "scanner": "scanner-primary", "fingerprint": "0685b250a7948473", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6fb907d9b7dca831", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/seo/outreach.ts:7"}, "properties": {"repobilityId": "b9e37310625bf3d4", "scanner": "scanner-primary", "fingerprint": "6fb907d9b7dca831", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ace264ae8c248f4f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/seo/plugins/registry.ts:13"}, "properties": {"repobilityId": "3052e7181170dc77", "scanner": "scanner-primary", "fingerprint": "ace264ae8c248f4f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b993a4c4f711570c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabflow-scheduler.ts:63"}, "properties": {"repobilityId": "67231f00f044f44d", "scanner": "scanner-primary", "fingerprint": "b993a4c4f711570c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd9075bc1a3d3cd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo.worker.ts:18"}, "properties": {"repobilityId": "503ab970c58a6feb", "scanner": "scanner-primary", "fingerprint": "fd9075bc1a3d3cd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e69f87ed7d6afd9b", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/workers/sabmail-sync.ts:442"}, "properties": {"repobilityId": "af2c176b23f6c54e", "scanner": "scanner-primary", "fingerprint": "e69f87ed7d6afd9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-27d74f08dc619094", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabmail-sync.ts:330"}, "properties": {"repobilityId": "e33b7a178e7695fe", "scanner": "scanner-primary", "fingerprint": "27d74f08dc619094", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-630b7bbe0674d059", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabmail-push-sync.ts:123"}, "properties": {"repobilityId": "29f4e7c139014606", "scanner": "scanner-primary", "fingerprint": "630b7bbe0674d059", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8a965240badd49dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/sabflow-worker.ts:332"}, "properties": {"repobilityId": "470d2b11067a333d", "scanner": "scanner-primary", "fingerprint": "8a965240badd49dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e37cb7928a4f9745", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/send.worker.js:294"}, "properties": {"repobilityId": "adc3aa57eebd08c3", "scanner": "scanner-primary", "fingerprint": "e37cb7928a4f9745", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0c9379197efa275d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/index.js:35"}, "properties": {"repobilityId": "ff18141e499060a8", "scanner": "scanner-primary", "fingerprint": "0c9379197efa275d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-670595510d14aaef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/broadcast/control.worker.js:255"}, "properties": {"repobilityId": "e1b358861a1ca650", "scanner": "scanner-primary", "fingerprint": "670595510d14aaef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9ef5e852c1d06b1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/email.worker.ts:15"}, "properties": {"repobilityId": "5c6222b1518032d2", "scanner": "scanner-primary", "fingerprint": "f9ef5e852c1d06b1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c22e765fbc83460", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/brand.worker.ts:17"}, "properties": {"repobilityId": "24b2a4f888fb6728", "scanner": "scanner-primary", "fingerprint": "2c22e765fbc83460", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c9ebc7aaf13b8e66", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/workers/seo/embedding.worker.ts:36"}, "properties": {"repobilityId": "858c38c34629fe9d", "scanner": "scanner-primary", "fingerprint": "c9ebc7aaf13b8e66", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-b74780ca066f2af1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/embedding.worker.ts:20"}, "properties": {"repobilityId": "425fb58ee31e438e", "scanner": "scanner-primary", "fingerprint": "b74780ca066f2af1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb0a5e49857411e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/audit.worker.ts:62"}, "properties": {"repobilityId": "e6bd8bf7d647c0f1", "scanner": "scanner-primary", "fingerprint": "cb0a5e49857411e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4484e52658f0c245", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/webhook.worker.ts:15"}, "properties": {"repobilityId": "e160bee16758d473", "scanner": "scanner-primary", "fingerprint": "4484e52658f0c245", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97a7e9ff1cf3271b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/snapshot.worker.ts:17"}, "properties": {"repobilityId": "af3d273772d4461a", "scanner": "scanner-primary", "fingerprint": "97a7e9ff1cf3271b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ccf7c19105c2b291", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/image.worker.ts:14"}, "properties": {"repobilityId": "271764400ebfeec3", "scanner": "scanner-primary", "fingerprint": "ccf7c19105c2b291", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c87aff4722878fd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/local.worker.ts:15"}, "properties": {"repobilityId": "704fb6efec4dd5fb", "scanner": "scanner-primary", "fingerprint": "c87aff4722878fd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3503063ddade8fa7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/content.worker.ts:15"}, "properties": {"repobilityId": "a1bc95d95fabc1d9", "scanner": "scanner-primary", "fingerprint": "3503063ddade8fa7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-207b68767b5fc453", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workers/seo/rank.worker.ts:40"}, "properties": {"repobilityId": "a4e80434c929a7de", "scanner": "scanner-primary", "fingerprint": "207b68767b5fc453", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-681f0c068bf4cc53", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/workflows/automation-run.ts:92"}, "properties": {"repobilityId": "11e9a06fd9d834f3", "scanner": "scanner-primary", "fingerprint": "681f0c068bf4cc53", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-66eaced5bae3a881", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/global-setup.ts:28"}, "properties": {"repobilityId": "47b4f7ec079f9271", "scanner": "scanner-primary", "fingerprint": "66eaced5bae3a881", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14f97d860dd25519", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/sabsms/campaigns.spec.ts:20"}, "properties": {"repobilityId": "963ab206fe51915d", "scanner": "scanner-primary", "fingerprint": "14f97d860dd25519", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a78949ef74e61852", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 benches/sabflow-editor-perf/run.js:312"}, "properties": {"repobilityId": "0929482b11307242", "scanner": "scanner-primary", "fingerprint": "a78949ef74e61852", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97a4fb77580f3772", "level": "warning", "message": {"text": "Privileged port 43 in use"}, "properties": {"repobilityId": "af1bc8881542418e", "scanner": "scanner-primary", "fingerprint": "97a4fb77580f3772", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/seo-tools/whois/route.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1faa60adef8e56d4", "level": "warning", "message": {"text": "Privileged port 993 in use"}, "properties": {"repobilityId": "a36e56a26353e9ee", "scanner": "scanner-primary", "fingerprint": "1faa60adef8e56d4", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sabmail/_components/mailbox-connect-form.tsx"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5407bcf10a661c7", "level": "warning", "message": {"text": "Privileged port 465 in use"}, "properties": {"repobilityId": "bcd1f06b60a2b6bc", "scanner": "scanner-primary", "fingerprint": "a5407bcf10a661c7", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sabmail/_components/mailbox-connect-form.tsx"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0087ca127c2e24f0", "level": "warning", "message": {"text": "Privileged port 587 in use"}, "properties": {"repobilityId": "a87a96c3b2e62c08", "scanner": "scanner-primary", "fingerprint": "0087ca127c2e24f0", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sabmail/_components/mailbox-connect-form.tsx"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5f82aea493aac436", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: lukemathwalker/cargo-chef:0.1.68-rust-1.83-bookworm"}, "properties": {"repobilityId": "f050434a703cd583", "scanner": "scanner-primary", "fingerprint": "5f82aea493aac436", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "rust/Dockerfile"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-da2d469a95e5b8f2", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim"}, "properties": {"repobilityId": "ea421dad65ba5465", "scanner": "scanner-primary", "fingerprint": "da2d469a95e5b8f2", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "rust/Dockerfile"}, "region": {"startLine": 41}}}]}, {"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-ec49901c9eaf7ddd", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in check_ts.js:1"}, "properties": {"repobilityId": "f443abacde7154fb", "scanner": "scanner-primary", "fingerprint": "ec49901c9eaf7ddd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "check_ts.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-622e6c59b0c279c4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/gen-rust-client.ts:16"}, "properties": {"repobilityId": "df228bef5f76927d", "scanner": "scanner-primary", "fingerprint": "622e6c59b0c279c4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen-rust-client.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-70944bf292056852", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/build-sabsites.mjs:14"}, "properties": {"repobilityId": "312993855d31b4bc", "scanner": "scanner-primary", "fingerprint": "70944bf292056852", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/build-sabsites.mjs"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-f8cc652a9e47533e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/sabflow-inventory-check.mjs:23"}, "properties": {"repobilityId": "6a0f27058933bc8b", "scanner": "scanner-primary", "fingerprint": "f8cc652a9e47533e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/sabflow-inventory-check.mjs"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-a80e1d345bde23af", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/sabsheet/function-parity.ts:11"}, "properties": {"repobilityId": "6e4e61651fa3ab9f", "scanner": "scanner-primary", "fingerprint": "a80e1d345bde23af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/sabsheet/function-parity.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-3d181333ddb792c6", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in rust/crates/sabsheet-cells/src/handlers.rs:151"}, "properties": {"repobilityId": "ee7917ac774d378c", "scanner": "scanner-primary", "fingerprint": "3d181333ddb792c6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "rust/crates/sabsheet-cells/src/handlers.rs"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-52a68d2ca8755983", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in rust/crates/sabsheet-cells/src/formula.rs:556"}, "properties": {"repobilityId": "75b23c4b374365e4", "scanner": "scanner-primary", "fingerprint": "52a68d2ca8755983", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "rust/crates/sabsheet-cells/src/formula.rs"}, "region": {"startLine": 556}}}]}, {"ruleId": "scanner-9c371ff15082a705", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in playwright-report/index.html:58"}, "properties": {"repobilityId": "5c1a4d4daf334529", "scanner": "scanner-primary", "fingerprint": "9c371ff15082a705", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report/index.html"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-9029cfde635dd36d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in playwright-report/index.html:57"}, "properties": {"repobilityId": "72bf5b0e0e2b9155", "scanner": "scanner-primary", "fingerprint": "9029cfde635dd36d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "playwright-report/index.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-3e07f50b80348f43", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in services/sabflow-ws/src/seats.ts:71"}, "properties": {"repobilityId": "4f0401a5779303c5", "scanner": "scanner-primary", "fingerprint": "3e07f50b80348f43", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/sabflow-ws/src/seats.ts"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-7732b912b9c0e755", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in services/sabchat-turn/README.md:14"}, "properties": {"repobilityId": "b39ea43291a4814d", "scanner": "scanner-primary", "fingerprint": "7732b912b9c0e755", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/sabchat-turn/README.md"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-991a08e4c9404c9a", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in services/sabflow-task-runner/src/index.ts:4"}, "properties": {"repobilityId": "7e92cbb471482e3a", "scanner": "scanner-primary", "fingerprint": "991a08e4c9404c9a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/sabflow-task-runner/src/index.ts"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-f76739e16cb99549", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/embed.js:299"}, "properties": {"repobilityId": "39b4977c02764074", "scanner": "scanner-primary", "fingerprint": "f76739e16cb99549", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/embed.js"}, "region": {"startLine": 299}}}]}, {"ruleId": "scanner-8bf231a4a3817eb0", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in plans/sabsms-v2-audit-gaps.json:658"}, "properties": {"repobilityId": "972481b7b7eaae0d", "scanner": "scanner-primary", "fingerprint": "8bf231a4a3817eb0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "plans/sabsms-v2-audit-gaps.json"}, "region": {"startLine": 658}}}]}, {"ruleId": "scanner-3be11c4507e5a478", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/email/inbox/thread-view.tsx:247"}, "properties": {"repobilityId": "b2e1f93bbd8b79cd", "scanner": "scanner-primary", "fingerprint": "3be11c4507e5a478", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/email/inbox/thread-view.tsx"}, "region": {"startLine": 247}}}]}, {"ruleId": "scanner-f560abfb99771ddd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:81"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "f560abfb99771ddd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 81}}}]}, {"ruleId": "scanner-b6e382664fd221a5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/form-block-renderer.tsx:187"}, "properties": {"repobilityId": "3ac80b9f6125e889", "scanner": "scanner-primary", "fingerprint": "b6e382664fd221a5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/20ui-domain/form-block-renderer.tsx"}, "region": {"startLine": 187}}}]}, {"ruleId": "scanner-df4ca37027a01ab4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/crm-form-preview.tsx:165"}, "properties": {"repobilityId": "fa7f9da33aa6d170", "scanner": "scanner-primary", "fingerprint": "df4ca37027a01ab4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/20ui-domain/crm-form-preview.tsx"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-a33630e615c3b4f4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/embedded-form.tsx:381"}, "properties": {"repobilityId": "1030aa438c3ec6db", "scanner": "scanner-primary", "fingerprint": "a33630e615c3b4f4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/20ui-domain/embedded-form.tsx"}, "region": {"startLine": 381}}}]}, {"ruleId": "scanner-e9d2b8e5a4386f7b", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/rich-text-block-renderer.tsx:84"}, "properties": {"repobilityId": "53dea9fa55150e1d", "scanner": "scanner-primary", "fingerprint": "e9d2b8e5a4386f7b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/20ui-domain/website-builder/rich-text-block-renderer.tsx"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-a8815ae76446538f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/form-block-renderer.tsx:185"}, "properties": {"repobilityId": "b96b8e4ac80d5c86", "scanner": "scanner-primary", "fingerprint": "a8815ae76446538f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/20ui-domain/website-builder/form-block-renderer.tsx"}, "region": {"startLine": 185}}}]}, {"ruleId": "scanner-8646d12958c5d5d8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/20ui-domain/website-builder/block-renderer.tsx:31"}, "properties": {"repobilityId": "f7821be413d58958", "scanner": "scanner-primary", "fingerprint": "8646d12958c5d5d8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/20ui-domain/website-builder/block-renderer.tsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-0761e392cb5ca614", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/sabcrm/20ui/chart.tsx:129"}, "properties": {"repobilityId": "3ee2b314393543ba", "scanner": "scanner-primary", "fingerprint": "0761e392cb5ca614", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/sabcrm/20ui/chart.tsx"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-e102884fa339ddaa", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/sabcrm/20ui/composites/editor/rich-text.tsx:276"}, "properties": {"repobilityId": "d8fb595395d1d2d0", "scanner": "scanner-primary", "fingerprint": "e102884fa339ddaa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/sabcrm/20ui/composites/editor/rich-text.tsx"}, "region": {"startLine": 276}}}]}, {"ruleId": "scanner-e24d64a5a955bea9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/sabcrm/20ui/composites/editor/rich-text.tsx:127"}, "properties": {"repobilityId": "c8f4a84072c90532", "scanner": "scanner-primary", "fingerprint": "e24d64a5a955bea9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/sabcrm/20ui/composites/editor/rich-text.tsx"}, "region": {"startLine": 127}}}]}, {"ruleId": "scanner-6901d3df9769ea35", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/crm/live-editor/live-canvas.tsx:62"}, "properties": {"repobilityId": "dfdc15bfaf08d10e", "scanner": "scanner-primary", "fingerprint": "6901d3df9769ea35", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/crm/live-editor/live-canvas.tsx"}, "region": {"startLine": 62}}}]}, {"ruleId": "scanner-1f27342f4642dd46", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/sabflow/panels/blocks/shared/ChipInput.tsx:103"}, "properties": {"repobilityId": "163672387e3c88d2", "scanner": "scanner-primary", "fingerprint": "1f27342f4642dd46", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/sabflow/panels/blocks/shared/ChipInput.tsx"}, "region": {"startLine": 103}}}]}, {"ruleId": "scanner-8cf1c35b7c1d13ae", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/layout.tsx:107"}, "properties": {"repobilityId": "0bca654fa2052eb0", "scanner": "scanner-primary", "fingerprint": "8cf1c35b7c1d13ae", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/layout.tsx"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-39ad6e0c764ee659", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dl/[shortCode]/components/RedirectScript.tsx:41"}, "properties": {"repobilityId": "e544796a1b5314e2", "scanner": "scanner-primary", "fingerprint": "39ad6e0c764ee659", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dl/[shortCode]/components/RedirectScript.tsx"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-554cc32b6ff8b0c4", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/login/page.tsx:15"}, "properties": {"repobilityId": "31201e7e133dc3a6", "scanner": "scanner-primary", "fingerprint": "554cc32b6ff8b0c4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/login/page.tsx"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-9151e09ae155ce8b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/message/route.ts:5"}, "properties": {"repobilityId": "dd57da1cd8bd5cd3", "scanner": "scanner-primary", "fingerprint": "9151e09ae155ce8b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabchat/message/route.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-0252e06329bde494", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/sabchat/[userId]/route.ts:224"}, "properties": {"repobilityId": "4ea6e867819b40a2", "scanner": "scanner-primary", "fingerprint": "0252e06329bde494", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabchat/[userId]/route.ts"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-165982dbbedbe19a", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/history/route.ts:5"}, "properties": {"repobilityId": "8c53a5e7223f5ed5", "scanner": "scanner-primary", "fingerprint": "165982dbbedbe19a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabchat/history/route.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-4c6ef6b51f64502f", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/widget/ai/route.ts:19"}, "properties": {"repobilityId": "3cbe6309809de41d", "scanner": "scanner-primary", "fingerprint": "4c6ef6b51f64502f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabchat/widget/ai/route.ts"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-1c6c15b77599d160", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabchat/session/route.ts:5"}, "properties": {"repobilityId": "1e8ef2967a1b8e66", "scanner": "scanner-primary", "fingerprint": "1c6c15b77599d160", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabchat/session/route.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-430be45327227b77", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/seo-tools/dns/route.ts:12"}, "properties": {"repobilityId": "8bdd8b86653d4181", "scanner": "scanner-primary", "fingerprint": "430be45327227b77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/seo-tools/dns/route.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-c77e687ff43c0f1e", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/v1/sabcall/calls/route.ts:32"}, "properties": {"repobilityId": "a7c1408d5610a0ab", "scanner": "scanner-primary", "fingerprint": "c77e687ff43c0f1e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/v1/sabcall/calls/route.ts"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-2c5317c580b82cc0", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/v1/sabcall/contacts/route.ts:30"}, "properties": {"repobilityId": "b7e43096c77f3a95", "scanner": "scanner-primary", "fingerprint": "2c5317c580b82cc0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/v1/sabcall/contacts/route.ts"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-8649a1be4b07de8b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/sabcrm/route.ts:53"}, "properties": {"repobilityId": "8e072ff29092f288", "scanner": "scanner-primary", "fingerprint": "8649a1be4b07de8b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/mcp/sabcrm/route.ts"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-a0b6250db1ed6318", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/sabcall/route.ts:36"}, "properties": {"repobilityId": "8bb0c3f7a86b5884", "scanner": "scanner-primary", "fingerprint": "a0b6250db1ed6318", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/mcp/sabcall/route.ts"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-c99105872f12b368", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/mcp/ad-manager/route.ts:44"}, "properties": {"repobilityId": "fc6bd17a28feb016", "scanner": "scanner-primary", "fingerprint": "c99105872f12b368", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/mcp/ad-manager/route.ts"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-2ee4b7d184ae443b", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabcrm/forms/submit/[publicId]/route.ts:16"}, "properties": {"repobilityId": "454bf4b84a212317", "scanner": "scanner-primary", "fingerprint": "2ee4b7d184ae443b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabcrm/forms/submit/[publicId]/route.ts"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-29d327b86e9ba1f5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabmail/forms/[id]/submit/route.ts:34"}, "properties": {"repobilityId": "4e6b174aa5dec55c", "scanner": "scanner-primary", "fingerprint": "29d327b86e9ba1f5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabmail/forms/[id]/submit/route.ts"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-e1dedb2a0e4a4036", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabsense/ingest/route.ts:181"}, "properties": {"repobilityId": "4831178f0fdad2bd", "scanner": "scanner-primary", "fingerprint": "e1dedb2a0e4a4036", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabsense/ingest/route.ts"}, "region": {"startLine": 181}}}]}, {"ruleId": "scanner-fa10d2d99de89d87", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/sabsense/snippet.js/route.ts:27"}, "properties": {"repobilityId": "a1dcda362dfc0b1e", "scanner": "scanner-primary", "fingerprint": "fa10d2d99de89d87", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/sabsense/snippet.js/route.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-1ea42c8b40746c18", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/app/api/crm/forms/submit/[formId]/route.ts:6"}, "properties": {"repobilityId": "88631348693f882f", "scanner": "scanner-primary", "fingerprint": "1ea42c8b40746c18", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/crm/forms/submit/[formId]/route.ts"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-e5edb3abb1ffaa51", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/crm/forms/embed/[formId]/route.js:54"}, "properties": {"repobilityId": "de9a9da24fbe8058", "scanner": "scanner-primary", "fingerprint": "e5edb3abb1ffaa51", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/crm/forms/embed/[formId]/route.js"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-a15a26d6b05fc476", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/api/widget/[projectId]/route.ts:55"}, "properties": {"repobilityId": "a4236f9ac336a056", "scanner": "scanner-primary", "fingerprint": "a15a26d6b05fc476", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/api/widget/[projectId]/route.ts"}, "region": {"startLine": 55}}}]}, {"ruleId": "scanner-d07e7af69acab85d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/sabsheet/[workbookId]/print/_print-view.tsx:141"}, "properties": {"repobilityId": "282fb4e438afd56e", "scanner": "scanner-primary", "fingerprint": "d07e7af69acab85d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/sabsheet/[workbookId]/print/_print-view.tsx"}, "region": {"startLine": 141}}}]}, {"ruleId": "scanner-bb39d0e29e73b339", "level": "error", "message": {"text": "Possible secret in src/app/dashboard/user/profile/page.client.tsx"}, "properties": {"repobilityId": "89ec8d3e08f01cfe", "scanner": "scanner-primary", "fingerprint": "bb39d0e29e73b339", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/user/profile/page.client.tsx"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-7f5215f5ed9713a1", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in src/app/dashboard/seo/tools/ssl-checker/page.tsx:31"}, "properties": {"repobilityId": "290664a471f45b97", "scanner": "scanner-primary", "fingerprint": "7f5215f5ed9713a1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/seo/tools/ssl-checker/page.tsx"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-7fcf1fb6c74388c2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/markdown-to-html/page.tsx:124"}, "properties": {"repobilityId": "90c5d9d3e7d1dc34", "scanner": "scanner-primary", "fingerprint": "7fcf1fb6c74388c2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/seo/tools/markdown-to-html/page.tsx"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-c3ce732407d38f3c", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in src/app/dashboard/seo/tools/hash-generator/page.tsx:21"}, "properties": {"repobilityId": "ef83c4add3d3f624", "scanner": "scanner-primary", "fingerprint": "c3ce732407d38f3c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/seo/tools/hash-generator/page.tsx"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-16b6cd22db544d38", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/json-formatter/page.tsx:70"}, "properties": {"repobilityId": "3c13c757658c1b89", "scanner": "scanner-primary", "fingerprint": "16b6cd22db544d38", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/seo/tools/json-formatter/page.tsx"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-f80369a8cec32c6a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/dashboard/seo/tools/page-speed/page.tsx:184"}, "properties": {"repobilityId": "a85fb759fdf40fa3", "scanner": "scanner-primary", "fingerprint": "f80369a8cec32c6a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/dashboard/seo/tools/page-speed/page.tsx"}, "region": {"startLine": 184}}}]}, {"ruleId": "scanner-7a0570f505ef9964", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/s/[shortCode]/page.tsx:170"}, "properties": {"repobilityId": "b2746ea0cf5211d0", "scanner": "scanner-primary", "fingerprint": "7a0570f505ef9964", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/s/[shortCode]/page.tsx"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-acf39e9d705746a8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/sabcrm/[objectSlug]/[recordId]/_comments/comments-panel.tsx:207"}, "properties": {"repobilityId": "b550ad9a0b561b5f", "scanner": "scanner-primary", "fingerprint": "acf39e9d705746a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sabcrm/[objectSlug]/[recordId]/_comments/comments-panel.tsx"}, "region": {"startLine": 207}}}]}, {"ruleId": "scanner-2f362fe2409a779f", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/r/[shortCode]/page.tsx:119"}, "properties": {"repobilityId": "af58f9444500c412", "scanner": "scanner-primary", "fingerprint": "2f362fe2409a779f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/r/[shortCode]/page.tsx"}, "region": {"startLine": 119}}}]}, {"ruleId": "scanner-ba294a8839f8b326", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/app/sabmail/_components/rich-text-editor.tsx:87"}, "properties": {"repobilityId": "f49389eaa03d0335", "scanner": "scanner-primary", "fingerprint": "ba294a8839f8b326", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sabmail/_components/rich-text-editor.tsx"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-fbdd6efb02791417", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/app/sabmail/_components/rich-text-editor.tsx:48"}, "properties": {"repobilityId": "174f60dda46b4142", "scanner": "scanner-primary", "fingerprint": "fbdd6efb02791417", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sabmail/_components/rich-text-editor.tsx"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-98bfd9c9b250ac83", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/portal/client/knowledge-base/[id]/page.tsx:53"}, "properties": {"repobilityId": "75f7a94d56a6c321", "scanner": "scanner-primary", "fingerprint": "98bfd9c9b250ac83", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/portal/client/knowledge-base/[id]/page.tsx"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-b5daef35eb4dcfc7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/present/[publishSlug]/page.tsx:52"}, "properties": {"repobilityId": "ce2ce9f7773391c1", "scanner": "scanner-primary", "fingerprint": "b5daef35eb4dcfc7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/present/[publishSlug]/page.tsx"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-1dd4f37e12dd22a8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/share/contract/[hash]/page.tsx:56"}, "properties": {"repobilityId": "79c7252b70974c82", "scanner": "scanner-primary", "fingerprint": "1dd4f37e12dd22a8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/share/contract/[hash]/page.tsx"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-0edbe24807539e88", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/share/proposal/[hash]/page.tsx:72"}, "properties": {"repobilityId": "028ec98c8a09641c", "scanner": "scanner-primary", "fingerprint": "0edbe24807539e88", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/share/proposal/[hash]/page.tsx"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-def83375c799fc1b", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/app/actions/database-backup.actions.ts:5"}, "properties": {"repobilityId": "661764006cd9e5be", "scanner": "scanner-primary", "fingerprint": "def83375c799fc1b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/actions/database-backup.actions.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-0eb0bd1d021f584d", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/app/actions/sabcrm-people-salary-structures.actions.types.ts:159"}, "properties": {"repobilityId": "0de7edbe22e37b2b", "scanner": "scanner-primary", "fingerprint": "0eb0bd1d021f584d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/actions/sabcrm-people-salary-structures.actions.types.ts"}, "region": {"startLine": 159}}}]}, {"ruleId": "scanner-25bfa5e0dc1f2a6c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/store/[tenantSlug]/layout.tsx:44"}, "properties": {"repobilityId": "38f93f81f9f11c3c", "scanner": "scanner-primary", "fingerprint": "25bfa5e0dc1f2a6c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/store/[tenantSlug]/layout.tsx"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-0dba50b6b82e88df", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/app/sites/[[...path]]/route.ts:26"}, "properties": {"repobilityId": "6788e9eea08275db", "scanner": "scanner-primary", "fingerprint": "0dba50b6b82e88df", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sites/[[...path]]/route.ts"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-b89440dcd118a27a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/features/[slug]/page.tsx:107"}, "properties": {"repobilityId": "7566287acdb61e9b", "scanner": "scanner-primary", "fingerprint": "b89440dcd118a27a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/features/[slug]/page.tsx"}, "region": {"startLine": 107}}}]}, {"ruleId": "scanner-2afd5505f1eb25e8", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/app/sabsms/api-docs/api-docs-client.tsx:114"}, "properties": {"repobilityId": "fc3070a5458071ff", "scanner": "scanner-primary", "fingerprint": "2afd5505f1eb25e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/app/sabsms/api-docs/api-docs-client.tsx"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-7fe08ca0768e32bf", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in src/lib/integrations/README.md:122"}, "properties": {"repobilityId": "2baa134f2ee7ca7a", "scanner": "scanner-primary", "fingerprint": "7fe08ca0768e32bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/integrations/README.md"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-858de4bdd3c4f49c", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in src/lib/seo-tools/registry.ts:174"}, "properties": {"repobilityId": "4badb34b2001edc0", "scanner": "scanner-primary", "fingerprint": "858de4bdd3c4f49c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/seo-tools/registry.ts"}, "region": {"startLine": 174}}}]}, {"ruleId": "scanner-88551353a9ae61a1", "level": "error", "message": {"text": "Possible secret in src/lib/sabcrm/twenty-user-bridge.ts"}, "properties": {"repobilityId": "d39ae3ecaad9f159", "scanner": "scanner-primary", "fingerprint": "88551353a9ae61a1", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabcrm/twenty-user-bridge.ts"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-0771074f603891fb", "level": "error", "message": {"text": "Possible secret in src/lib/sabcrm/shared/src/types/AppPath.ts"}, "properties": {"repobilityId": "23f24ec0ec1c5230", "scanner": "scanner-primary", "fingerprint": "0771074f603891fb", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabcrm/shared/src/types/AppPath.ts"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-aa61df281a42f666", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/lib/sabcrm/emails/src/utils/email-renderer/email-renderer.tsx:15"}, "properties": {"repobilityId": "56440631613d1e19", "scanner": "scanner-primary", "fingerprint": "aa61df281a42f666", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabcrm/emails/src/utils/email-renderer/email-renderer.tsx"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-325a2b1d146ecdd6", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/databases/index.ts:67"}, "properties": {"repobilityId": "27c195dc9f4e2acc", "scanner": "scanner-primary", "fingerprint": "325a2b1d146ecdd6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/databases/index.ts"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-daad5bb1fa5bec5d", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_filter.ts:37"}, "properties": {"repobilityId": "de31f22b0ebbc5db", "scanner": "scanner-primary", "fingerprint": "daad5bb1fa5bec5d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/mass_e/array_filter.ts"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-6c750ddbd80322c1", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_reduce.ts:39"}, "properties": {"repobilityId": "9f951ac9d7fe65db", "scanner": "scanner-primary", "fingerprint": "6c750ddbd80322c1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/mass_e/array_reduce.ts"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-eb8d79b230e77b63", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/mass_e/array_map.ts:39"}, "properties": {"repobilityId": "4cfdba86ad35a5bd", "scanner": "scanner-primary", "fingerprint": "eb8d79b230e77b63", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/mass_e/array_map.ts"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-df8aa30b45ea9587", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/if.ts:33"}, "properties": {"repobilityId": "0f17862e7d12e785", "scanner": "scanner-primary", "fingerprint": "df8aa30b45ea9587", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/generic/if.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-541a46189fe4c24d", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/filter.ts:33"}, "properties": {"repobilityId": "48ce538ed2bd8506", "scanner": "scanner-primary", "fingerprint": "541a46189fe4c24d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/generic/filter.ts"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-c8fc6817f3e80289", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/generic/switch_n8n.ts:38"}, "properties": {"repobilityId": "e006b77b33432923", "scanner": "scanner-primary", "fingerprint": "c8fc6817f3e80289", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/generic/switch_n8n.ts"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-db977149f867d50c", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/triggers_as_actions/email_read_imap.ts:51"}, "properties": {"repobilityId": "40ad92e2a9830984", "scanner": "scanner-primary", "fingerprint": "db977149f867d50c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/triggers_as_actions/email_read_imap.ts"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-b79fef44af42f58b", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/langchain_vendor/tool_code.ts:27"}, "properties": {"repobilityId": "db7feb98ff24b686", "scanner": "scanner-primary", "fingerprint": "b79fef44af42f58b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/langchain_vendor/tool_code.ts"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-c80047dbcadccd10", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/deprecated/ai_transform_v1.ts:102"}, "properties": {"repobilityId": "26c60fefeb5bffb3", "scanner": "scanner-primary", "fingerprint": "c80047dbcadccd10", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/deprecated/ai_transform_v1.ts"}, "region": {"startLine": 102}}}]}, {"ruleId": "scanner-5edb52d228e4e25e", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/storage/ssh.ts:61"}, "properties": {"repobilityId": "82b320da04597280", "scanner": "scanner-primary", "fingerprint": "5edb52d228e4e25e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/storage/ssh.ts"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-893b073229aeeefd", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/storage/ftp.ts:53"}, "properties": {"repobilityId": "a7f82225ff61cb62", "scanner": "scanner-primary", "fingerprint": "893b073229aeeefd", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/storage/ftp.ts"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-04d5eca956d88b0b", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/forge/blocks/n8n/_shared/optional_import.ts:10"}, "properties": {"repobilityId": "8a794564a4579629", "scanner": "scanner-primary", "fingerprint": "04d5eca956d88b0b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/forge/blocks/n8n/_shared/optional_import.ts"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-677b85b2c667d2aa", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in src/lib/sabflow/triggers/debounce.ts:77"}, "properties": {"repobilityId": "1200509c3f34a5e2", "scanner": "scanner-primary", "fingerprint": "677b85b2c667d2aa", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/triggers/debounce.ts"}, "region": {"startLine": 77}}}]}, {"ruleId": "scanner-0a3fb3e96f42c9be", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in src/lib/sabflow/n8n/extensions/string-extensions.ts:11"}, "properties": {"repobilityId": "7a34608d203b09f2", "scanner": "scanner-primary", "fingerprint": "0a3fb3e96f42c9be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/n8n/extensions/string-extensions.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-73bfc96faf2c233e", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/request-helpers/axios-utils.ts:173"}, "properties": {"repobilityId": "52321f5ee902fe74", "scanner": "scanner-primary", "fingerprint": "73bfc96faf2c233e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/request-helpers/axios-utils.ts"}, "region": {"startLine": 173}}}]}, {"ruleId": "scanner-bef4cd0192359f47", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in src/lib/sabflow/helpers/sanitizeHtml.ts:75"}, "properties": {"repobilityId": "0d7335d10b8902e9", "scanner": "scanner-primary", "fingerprint": "bef4cd0192359f47", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/helpers/sanitizeHtml.ts"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-63cd7d6f25dfd693", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/execution/testNode.ts:480"}, "properties": {"repobilityId": "ae167e2c39f8d1db", "scanner": "scanner-primary", "fingerprint": "63cd7d6f25dfd693", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/execution/testNode.ts"}, "region": {"startLine": 480}}}]}, {"ruleId": "scanner-5d62160d82b56192", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/execution/sandbox/browserSandbox.ts:142"}, "properties": {"repobilityId": "9b2552f8c2c4fdbe", "scanner": "scanner-primary", "fingerprint": "5d62160d82b56192", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/execution/sandbox/browserSandbox.ts"}, "region": {"startLine": 142}}}]}, {"ruleId": "scanner-9f700807953ac5c1", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/lib/sabflow/queue/enqueue.ts:161"}, "properties": {"repobilityId": "4e8fe4b3ff384c2e", "scanner": "scanner-primary", "fingerprint": "9f700807953ac5c1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/queue/enqueue.ts"}, "region": {"startLine": 161}}}]}, {"ruleId": "scanner-15558c613c0b2f19", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/executeBlock.ts:335"}, "properties": {"repobilityId": "9a8214ecd2077c28", "scanner": "scanner-primary", "fingerprint": "15558c613c0b2f19", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/engine/executeBlock.ts"}, "region": {"startLine": 335}}}]}, {"ruleId": "scanner-791d8bbd46012fa5", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/per-item-if-e2e.test.ts:20"}, "properties": {"repobilityId": "61988b9ce3a9459c", "scanner": "scanner-primary", "fingerprint": "791d8bbd46012fa5", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/engine/__tests__/per-item-if-e2e.test.ts"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-43ab258d26ce9c0d", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/multi-output-routing.test.ts:49"}, "properties": {"repobilityId": "9879140b34870997", "scanner": "scanner-primary", "fingerprint": "43ab258d26ce9c0d", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/engine/__tests__/multi-output-routing.test.ts"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-b44d64c95e7925b4", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/engine/__tests__/per-item-filter-e2e.test.ts:18"}, "properties": {"repobilityId": "ca18496b37e93d43", "scanner": "scanner-primary", "fingerprint": "b44d64c95e7925b4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/engine/__tests__/per-item-filter-e2e.test.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-ccb1ebe853f85e3b", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/sabflow/executor/credentials/import-n8n.ts:627"}, "properties": {"repobilityId": "67398f9798a23d30", "scanner": "scanner-primary", "fingerprint": "ccb1ebe853f85e3b", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/sabflow/executor/credentials/import-n8n.ts"}, "region": {"startLine": 627}}}]}, {"ruleId": "scanner-381ae2ecb9830f75", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/lib/automations/workflow-runtime.ts:46"}, "properties": {"repobilityId": "8c2b76204bd5a84a", "scanner": "scanner-primary", "fingerprint": "381ae2ecb9830f75", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/automations/workflow-runtime.ts"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-9d1a7ed926a7a4fe", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/workflows/automation-run.ts:32"}, "properties": {"repobilityId": "bd34f58bf722044a", "scanner": "scanner-primary", "fingerprint": "9d1a7ed926a7a4fe", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/workflows/automation-run.ts"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-43b282afe27dbc16", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in benches/sabflow-expression/run.js:154"}, "properties": {"repobilityId": "fe57f5f0021b0c46", "scanner": "scanner-primary", "fingerprint": "43b282afe27dbc16", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "benches/sabflow-expression/run.js"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-fbed092a780cad42", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "64d844b5a9629100", "scanner": "scanner-primary", "fingerprint": "fbed092a780cad42", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sabflow-rust.yml"}, "region": {"startLine": 122}}}]}, {"ruleId": "scanner-fbed092a780cad42", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "89e27dd76abc2126", "scanner": "scanner-primary", "fingerprint": "fbed092a780cad42", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sabflow-rust.yml"}, "region": {"startLine": 187}}}]}, {"ruleId": "scanner-64d3a5784b12cb42", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "cd42268af6366142", "scanner": "scanner-primary", "fingerprint": "64d3a5784b12cb42", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sabflow-template-verify.yml"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-29336aa2153b2da0", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6e3c9d8a22567a1d", "scanner": "scanner-primary", "fingerprint": "29336aa2153b2da0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-ci.yml"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-29336aa2153b2da0", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b3fb3bacf80df14d", "scanner": "scanner-primary", "fingerprint": "29336aa2153b2da0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-ci.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-29336aa2153b2da0", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6e3c9d8a22567a1d", "scanner": "scanner-primary", "fingerprint": "29336aa2153b2da0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-ci.yml"}, "region": {"startLine": 64}}}]}, {"ruleId": "scanner-29336aa2153b2da0", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b3fb3bacf80df14d", "scanner": "scanner-primary", "fingerprint": "29336aa2153b2da0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-ci.yml"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-29336aa2153b2da0", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "adb0db1e7aa9b2ca", "scanner": "scanner-primary", "fingerprint": "29336aa2153b2da0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-ci.yml"}, "region": {"startLine": 84}}}]}, {"ruleId": "scanner-29336aa2153b2da0", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c4989a5d89f7b468", "scanner": "scanner-primary", "fingerprint": "29336aa2153b2da0", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-ci.yml"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-2b27c3181c7b0890", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a69c25f90855a1c2", "scanner": "scanner-primary", "fingerprint": "2b27c3181c7b0890", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sabflow-inventory.yml"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-2b27c3181c7b0890", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8ddd87238efcb3d4", "scanner": "scanner-primary", "fingerprint": "2b27c3181c7b0890", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/sabflow-inventory.yml"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "edeab51902066991", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-55f2a780dccd65ed", "level": "note", "message": {"text": "Very large file: scripts/n8n-extract-full.ts (2898 lines)"}, "properties": {"repobilityId": "37ea4afbdecdcfc5", "scanner": "scanner-primary", "fingerprint": "55f2a780dccd65ed", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-161d0dd2ccf232b3", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-contacts/src/handlers.rs (2037 lines)"}, "properties": {"repobilityId": "de66033d76e3cb6f", "scanner": "scanner-primary", "fingerprint": "161d0dd2ccf232b3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-324b03a8745ee469", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-commands/src/handlers.rs (2361 lines)"}, "properties": {"repobilityId": "f4aabf5507e55d0c", "scanner": "scanner-primary", "fingerprint": "324b03a8745ee469", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-98f8d134c2e06851", "level": "note", "message": {"text": "Very large file: rust/crates/url-shortener/src/store.rs (1840 lines)"}, "properties": {"repobilityId": "42bab8bc8126d489", "scanner": "scanner-primary", "fingerprint": "98f8d134c2e06851", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-923c063ca32e284e", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-webhooks/src/handlers.rs (2154 lines)"}, "properties": {"repobilityId": "3a5b635a1e43e07b", "scanner": "scanner-primary", "fingerprint": "923c063ca32e284e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3f59a26f6c7d26f7", "level": "note", "message": {"text": "Very large file: rust/crates/crm-payroll-runs/src/handlers.rs (2101 lines)"}, "properties": {"repobilityId": "b2ee2335d237c828", "scanner": "scanner-primary", "fingerprint": "3f59a26f6c7d26f7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-85f6bfc4d9e7a4d5", "level": "note", "message": {"text": "Very large file: rust/crates/api/src/router.rs (1388 lines)"}, "properties": {"repobilityId": "60be8dacb4624520", "scanner": "scanner-primary", "fingerprint": "85f6bfc4d9e7a4d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-93c62e622414028d", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-chats/src/handlers.rs (2226 lines)"}, "properties": {"repobilityId": "795217be99f26355", "scanner": "scanner-primary", "fingerprint": "93c62e622414028d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b7eed6bc309eadda", "level": "note", "message": {"text": "Very large file: rust/crates/crm-store/src/handlers.rs (2820 lines)"}, "properties": {"repobilityId": "3a3d06a21ca0098c", "scanner": "scanner-primary", "fingerprint": "b7eed6bc309eadda", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-69613e6b03b324a9", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-business-inbox/src/handlers.rs (2972 lines)"}, "properties": {"repobilityId": "768a1b0bf850a1fb", "scanner": "scanner-primary", "fingerprint": "69613e6b03b324a9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9b0fed16c04cba7b", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-broadcasts/src/handlers.rs (1555 lines)"}, "properties": {"repobilityId": "a5e6dab9514fb69e", "scanner": "scanner-primary", "fingerprint": "9b0fed16c04cba7b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c60769df988ca6ba", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-channels/src/handlers.rs (2253 lines)"}, "properties": {"repobilityId": "fc8ff87f89229540", "scanner": "scanner-primary", "fingerprint": "c60769df988ca6ba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4e7b332b99912dce", "level": "note", "message": {"text": "Very large file: rust/crates/crm-pos/src/handlers.rs (1969 lines)"}, "properties": {"repobilityId": "ea0898404bf1bc0f", "scanner": "scanner-primary", "fingerprint": "4e7b332b99912dce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9fa6b6bdfc962136", "level": "note", "message": {"text": "Very large file: rust/crates/sabcrm-records/src/handlers.rs (2712 lines)"}, "properties": {"repobilityId": "5172451c485502ba", "scanner": "scanner-primary", "fingerprint": "9fa6b6bdfc962136", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-86696dc21f4360f3", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-mini-apps/src/handlers.rs (1573 lines)"}, "properties": {"repobilityId": "0426d1867dfb7f9e", "scanner": "scanner-primary", "fingerprint": "86696dc21f4360f3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aa43786eb88507d7", "level": "note", "message": {"text": "Very large file: rust/crates/sabflow-nodes/src/nodes/mod.rs (2224 lines)"}, "properties": {"repobilityId": "c31a71da6f9acb18", "scanner": "scanner-primary", "fingerprint": "aa43786eb88507d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c65d90a47c61ddc2", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-payments/src/handlers.rs (2010 lines)"}, "properties": {"repobilityId": "a7d6ecfccb56a653", "scanner": "scanner-primary", "fingerprint": "c65d90a47c61ddc2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8c4d5eb0ac4ea381", "level": "note", "message": {"text": "Very large file: rust/crates/sabfiles/src/handlers.rs (2168 lines)"}, "properties": {"repobilityId": "859cde85bcffcacc", "scanner": "scanner-primary", "fingerprint": "8c4d5eb0ac4ea381", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6bcc935d747dc432", "level": "note", "message": {"text": "Very large file: rust/crates/wachat-facebook-pages/src/handlers.rs (1742 lines)"}, "properties": {"repobilityId": "f0c9c0ac96fd16a1", "scanner": "scanner-primary", "fingerprint": "6bcc935d747dc432", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4da13a2e20da92c9", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-analytics/src/handlers.rs (1719 lines)"}, "properties": {"repobilityId": "bd910d9c29276663", "scanner": "scanner-primary", "fingerprint": "4da13a2e20da92c9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-907b06e9bb0c2ed1", "level": "note", "message": {"text": "Very large file: rust/crates/telegram-stories/src/handlers.rs (2084 lines)"}, "properties": {"repobilityId": "846a57fcadd48026", "scanner": "scanner-primary", "fingerprint": "907b06e9bb0c2ed1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6d0470fc81a214d1", "level": "note", "message": {"text": "Very large file: src/config/dashboard-config.ts (856 lines)"}, "properties": {"repobilityId": "ae375e3a9c16c33b", "scanner": "scanner-primary", "fingerprint": "6d0470fc81a214d1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-68ea8486a860248a", "level": "note", "message": {"text": "Very large file: src/components/20ui-domain/qr-code-generator.tsx (883 lines)"}, "properties": {"repobilityId": "c2f2d92ddcf5b88f", "scanner": "scanner-primary", "fingerprint": "68ea8486a860248a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1868941eda29d419", "level": "note", "message": {"text": "Very large file: src/components/20ui-domain/clay-dashboard-layout.tsx (3893 lines)"}, "properties": {"repobilityId": "0988daf32db9867a", "scanner": "scanner-primary", "fingerprint": "1868941eda29d419", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8067ddab16c04dd7", "level": "note", "message": {"text": "Very large file: src/components/sabcrm/object-editor.tsx (1666 lines)"}, "properties": {"repobilityId": "bc417cf007591a7d", "scanner": "scanner-primary", "fingerprint": "8067ddab16c04dd7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c4eebf1756149764", "level": "note", "message": {"text": "Very large file: src/components/landing-v2/module-page-shell.tsx (1141 lines)"}, "properties": {"repobilityId": "edeba685758a32d7", "scanner": "scanner-primary", "fingerprint": "c4eebf1756149764", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9f321cc8c90d4559", "level": "note", "message": {"text": "Very large file: src/components/landing-v2/bespoke-extras.tsx (1004 lines)"}, "properties": {"repobilityId": "b605ef815c36cf37", "scanner": "scanner-primary", "fingerprint": "9f321cc8c90d4559", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-468e5a0e1fcf007c", "level": "note", "message": {"text": "Very large file: src/app/page-client.tsx (2732 lines)"}, "properties": {"repobilityId": "172cc1ee76f059e3", "scanner": "scanner-primary", "fingerprint": "468e5a0e1fcf007c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-556455a0812bc7de", "level": "note", "message": {"text": "Very large file: src/app/sabchat/inbox/_components/inbox-client.tsx (2545 lines)"}, "properties": {"repobilityId": "7de14606346d6e29", "scanner": "scanner-primary", "fingerprint": "556455a0812bc7de", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5782f759675e53df", "level": "note", "message": {"text": "Very large file: src/app/dashboard/settings/crm/import-export/page.tsx (1822 lines)"}, "properties": {"repobilityId": "21bd4a460624067f", "scanner": "scanner-primary", "fingerprint": "5782f759675e53df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-21c314ff9c5af81a", "level": "note", "message": {"text": "Very large file: src/app/dashboard/settings/crm/roles/page.tsx (1830 lines)"}, "properties": {"repobilityId": "4bc043af56ebd13d", "scanner": "scanner-primary", "fingerprint": "21c314ff9c5af81a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-98ae17dec6c2cd42", "level": "note", "message": {"text": "Very large file: src/app/dashboard/settings/crm/automations/page.tsx (2149 lines)"}, "properties": {"repobilityId": "ba4853469b8deb82", "scanner": "scanner-primary", "fingerprint": "98ae17dec6c2cd42", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ee1e81989ef42707", "level": "note", "message": {"text": "Very large file: src/app/dashboard/settings/crm/data-model/page.tsx (2877 lines)"}, "properties": {"repobilityId": "4fed606898862682", "scanner": "scanner-primary", "fingerprint": "ee1e81989ef42707", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3dcd04ca2b04fe14", "level": "note", "message": {"text": "Very large file: src/app/dashboard/facebook/custom-ecommerce/manage/[shopId]/flow-builder/page.tsx (2080 lines)"}, "properties": {"repobilityId": "9a5d1c6dc64919ab", "scanner": "scanner-primary", "fingerprint": "3dcd04ca2b04fe14", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f360011f2fa07eb5", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/api-credentials/page.tsx (1252 lines)"}, "properties": {"repobilityId": "e7122292532706aa", "scanner": "scanner-primary", "fingerprint": "f360011f2fa07eb5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-80e5341ffb3e4dd5", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/commands/page.tsx (2249 lines)"}, "properties": {"repobilityId": "feb06fa1168a17cd", "scanner": "scanner-primary", "fingerprint": "80e5341ffb3e4dd5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-acd8f76f0a4b428a", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/business-inbox/page.tsx (1898 lines)"}, "properties": {"repobilityId": "a8ee5d9ed5d3fbc9", "scanner": "scanner-primary", "fingerprint": "acd8f76f0a4b428a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc9d52d3b614c14f", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/stories/page.client.tsx (1317 lines)"}, "properties": {"repobilityId": "5c5f8d44d7608d8f", "scanner": "scanner-primary", "fingerprint": "fc9d52d3b614c14f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c612c459eedf7920", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/payments/page.client.tsx (2019 lines)"}, "properties": {"repobilityId": "b4ec6cc18ea3f095", "scanner": "scanner-primary", "fingerprint": "c612c459eedf7920", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-488ba243847a0265", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/contacts/page.tsx (1858 lines)"}, "properties": {"repobilityId": "0700ccb42ffd6f0a", "scanner": "scanner-primary", "fingerprint": "488ba243847a0265", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-06f636bcddc9028a", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/channels/[channelId]/page.tsx (1463 lines)"}, "properties": {"repobilityId": "ed02502317492456", "scanner": "scanner-primary", "fingerprint": "06f636bcddc9028a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b868e58decfd2ecb", "level": "note", "message": {"text": "Very large file: src/app/dashboard/telegram/broadcasts/page.tsx (2097 lines)"}, "properties": {"repobilityId": "14870896ad92d805", "scanner": "scanner-primary", "fingerprint": "b868e58decfd2ecb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5ee3e487a807847c", "level": "note", "message": {"text": "Very large file: src/app/dashboard/ad-manager/create/page.tsx (1872 lines)"}, "properties": {"repobilityId": "bc1eb70d91819f3f", "scanner": "scanner-primary", "fingerprint": "5ee3e487a807847c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ea221f6f014ba62", "level": "note", "message": {"text": "Very large file: src/app/sabcrm/[objectSlug]/record-surface.tsx (2524 lines)"}, "properties": {"repobilityId": "fa96fab621a56943", "scanner": "scanner-primary", "fingerprint": "4ea221f6f014ba62", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a49fda66114e9f26", "level": "note", "message": {"text": "Very large file: src/app/sabcrm/[objectSlug]/[recordId]/record-detail-surface.tsx (2085 lines)"}, "properties": {"repobilityId": "903b4731655a31f3", "scanner": "scanner-primary", "fingerprint": "a49fda66114e9f26", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7910869a4c3205f5", "level": "note", "message": {"text": "Very large file: src/app/admin/dashboard/plans/_components/PlanEditor.tsx (1114 lines)"}, "properties": {"repobilityId": "e46a50d3edfdd492", "scanner": "scanner-primary", "fingerprint": "7910869a4c3205f5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8a27743c43d89be7", "level": "note", "message": {"text": "Very large file: src/app/sabmail/inbox/actions.ts (1424 lines)"}, "properties": {"repobilityId": "fd3b158427661938", "scanner": "scanner-primary", "fingerprint": "8a27743c43d89be7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bff807104394d94d", "level": "note", "message": {"text": "Very large file: src/app/sabmail/inbox/_components/inbox-client.tsx (1501 lines)"}, "properties": {"repobilityId": "997ade9547d26cf1", "scanner": "scanner-primary", "fingerprint": "bff807104394d94d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-84740cadf6fd0715", "level": "note", "message": {"text": "Very large file: src/app/actions/hr.actions.ts (1472 lines)"}, "properties": {"repobilityId": "68429a6cd9a91729", "scanner": "scanner-primary", "fingerprint": "84740cadf6fd0715", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-62425a896cf621bc", "level": "note", "message": {"text": "Very large file: src/app/actions/whatsapp.actions.ts (1344 lines)"}, "properties": {"repobilityId": "5ed9302b55d99370", "scanner": "scanner-primary", "fingerprint": "62425a896cf621bc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-58b78cde4abb6eda", "level": "note", "message": {"text": "Very large file: src/app/actions/crm-reports.actions.ts (2698 lines)"}, "properties": {"repobilityId": "cdaf63865636ceff", "scanner": "scanner-primary", "fingerprint": "58b78cde4abb6eda", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-70ab475f254d61b8", "level": "note", "message": {"text": "Very large file: src/app/actions/telegram.actions.ts (2007 lines)"}, "properties": {"repobilityId": "1f121dd5ccae5a02", "scanner": "scanner-primary", "fingerprint": "70ab475f254d61b8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-66e53c24e3dd8b02", "level": "note", "message": {"text": "Very large file: src/app/actions/sabcrm.actions.ts (3295 lines)"}, "properties": {"repobilityId": "045001eb37c7558b", "scanner": "scanner-primary", "fingerprint": "66e53c24e3dd8b02", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9fa0129b955108da", "level": "note", "message": {"text": "Very large file: src/app/actions/sabcrm-twenty.actions.ts (1652 lines)"}, "properties": {"repobilityId": "6b957e1fd3d7f1f2", "scanner": "scanner-primary", "fingerprint": "9fa0129b955108da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1860d34e66416234", "level": "note", "message": {"text": "Very large file: src/app/actions/crm.actions.ts (1541 lines)"}, "properties": {"repobilityId": "f9ff4db57dd9df30", "scanner": "scanner-primary", "fingerprint": "1860d34e66416234", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bf04739c57c3a419", "level": "note", "message": {"text": "Very large file: src/app/actions/crm-lookup.actions.ts (1477 lines)"}, "properties": {"repobilityId": "b01f68481991c784", "scanner": "scanner-primary", "fingerprint": "bf04739c57c3a419", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c2840818ff9f7de5", "level": "note", "message": {"text": "Very large file: src/app/actions/crm-deals.actions.ts (1616 lines)"}, "properties": {"repobilityId": "b654377795b2e72a", "scanner": "scanner-primary", "fingerprint": "c2840818ff9f7de5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-835431babc9b5e8c", "level": "note", "message": {"text": "Very large file: src/app/actions/ad-manager.actions.ts (1619 lines)"}, "properties": {"repobilityId": "b6730378c1784885", "scanner": "scanner-primary", "fingerprint": "835431babc9b5e8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4689222dbc5776f2", "level": "note", "message": {"text": "Very large file: src/app/actions/sabcrm-finance.actions.ts (2417 lines)"}, "properties": {"repobilityId": "486ba62d73c0c57b", "scanner": "scanner-primary", "fingerprint": "4689222dbc5776f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-bb8924d562496364", "level": "note", "message": {"text": "Very large file: src/app/actions/crm-leads.actions.ts (1666 lines)"}, "properties": {"repobilityId": "b1f66f13d85e125e", "scanner": "scanner-primary", "fingerprint": "bb8924d562496364", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-71fcef930d5a2366", "level": "note", "message": {"text": "Very large file: src/app/actions/facebook.actions.ts (3199 lines)"}, "properties": {"repobilityId": "2da5529bd3400a04", "scanner": "scanner-primary", "fingerprint": "71fcef930d5a2366", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9c0a58b568e00322", "level": "note", "message": {"text": "Very large file: src/app/actions/telegram-extra.actions.ts (2772 lines)"}, "properties": {"repobilityId": "21410acde1cb3363", "scanner": "scanner-primary", "fingerprint": "9c0a58b568e00322", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ed9503d4fceb64ed", "level": "note", "message": {"text": "Very large file: src/app/actions/worksuite/projects.actions.ts (1582 lines)"}, "properties": {"repobilityId": "4c5d140ad0b58c41", "scanner": "scanner-primary", "fingerprint": "ed9503d4fceb64ed", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6f3dcf4a186ee9ab", "level": "note", "message": {"text": "Very large file: src/app/actions/worksuite/reports.actions.ts (2746 lines)"}, "properties": {"repobilityId": "73301388255a08da", "scanner": "scanner-primary", "fingerprint": "6f3dcf4a186ee9ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-52a91db0ca5f9d3f", "level": "note", "message": {"text": "Very large file: src/lib/definitions.ts (4312 lines)"}, "properties": {"repobilityId": "e97b2c61a6fbc3f6", "scanner": "scanner-primary", "fingerprint": "52a91db0ca5f9d3f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-821339cf78275083", "level": "note", "message": {"text": "Very large file: src/lib/webhook-processor.ts (2329 lines)"}, "properties": {"repobilityId": "cdaa5fe777bf3262", "scanner": "scanner-primary", "fingerprint": "821339cf78275083", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f56bd0204db05b63", "level": "note", "message": {"text": "Very large file: src/lib/rust-client/sabcrm-finance.ts (1446 lines)"}, "properties": {"repobilityId": "f6f8ef5ce1c3762c", "scanner": "scanner-primary", "fingerprint": "f56bd0204db05b63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2998e5475b58fb51", "level": "note", "message": {"text": "Very large file: src/lib/rust-client/sabpay.ts (1155 lines)"}, "properties": {"repobilityId": "0f49644c7ec2ecea", "scanner": "scanner-primary", "fingerprint": "2998e5475b58fb51", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ff66c87ed7b67209", "level": "note", "message": {"text": "Very large file: src/lib/sabcrm/scheduler.ts (2077 lines)"}, "properties": {"repobilityId": "8affccdf86626c13", "scanner": "scanner-primary", "fingerprint": "ff66c87ed7b67209", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-014721fd4986b847", "level": "note", "message": {"text": "Very large file: src/lib/sabcrm/shared/src/metadata/constants/standard-object.constant.ts (2748 lines)"}, "properties": {"repobilityId": "bac46327b6ffef07", "scanner": "scanner-primary", "fingerprint": "014721fd4986b847", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f0cf8f667e9cf565", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/types.ts (1699 lines)"}, "properties": {"repobilityId": "e920633fe7c39ec9", "scanner": "scanner-primary", "fingerprint": "f0cf8f667e9cf565", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f8446ab5141b36b9", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/forge/stubFallbacks.ts (4710 lines)"}, "properties": {"repobilityId": "6ffa5bd5d1aa82d7", "scanner": "scanner-primary", "fingerprint": "f8446ab5141b36b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8c17ec7a87e6bcf6", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/forge/blocks/parity4/index.ts (1397 lines)"}, "properties": {"repobilityId": "4071bdbe3d96fae2", "scanner": "scanner-primary", "fingerprint": "8c17ec7a87e6bcf6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-69149e1cb4f19979", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/docs/nodeDocs.ts (1560 lines)"}, "properties": {"repobilityId": "d2586e847755d0f0", "scanner": "scanner-primary", "fingerprint": "69149e1cb4f19979", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f5f618b995252b2f", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/n8n/workflow-data-proxy.ts (1604 lines)"}, "properties": {"repobilityId": "837c3e36ab258d51", "scanner": "scanner-primary", "fingerprint": "f5f618b995252b2f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c58414d53fe74bdc", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/n8n/node-helpers.ts (1999 lines)"}, "properties": {"repobilityId": "f1daf61b1af2f03a", "scanner": "scanner-primary", "fingerprint": "c58414d53fe74bdc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0ce0b8a85e8559c2", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/n8n/interfaces.ts (3624 lines)"}, "properties": {"repobilityId": "498bff756cee973f", "scanner": "scanner-primary", "fingerprint": "0ce0b8a85e8559c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-39d0a5d9c08675c8", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts (2692 lines)"}, "properties": {"repobilityId": "31f94026a48f82b2", "scanner": "scanner-primary", "fingerprint": "39d0a5d9c08675c8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-69258a8d1c1b62e1", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/request-helper-functions.ts (1685 lines)"}, "properties": {"repobilityId": "c75602925757c6e4", "scanner": "scanner-primary", "fingerprint": "69258a8d1c1b62e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-db7648aff4080656", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/oauth/providers.ts (2045 lines)"}, "properties": {"repobilityId": "26d233ebb6ebe694", "scanner": "scanner-primary", "fingerprint": "db7648aff4080656", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d3e04b40ccd909d6", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/recipes/seed-pack-4.ts (1604 lines)"}, "properties": {"repobilityId": "a51ddd2c8a6c2f30", "scanner": "scanner-primary", "fingerprint": "d3e04b40ccd909d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3960f5e65ec0ce8d", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/blocks/index.ts (1647 lines)"}, "properties": {"repobilityId": "efb74d5f357e1782", "scanner": "scanner-primary", "fingerprint": "3960f5e65ec0ce8d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-013dfff3f1c86867", "level": "note", "message": {"text": "Very large file: src/lib/sabflow/credentials/types.ts (1633 lines)"}, "properties": {"repobilityId": "0cd24c695651509f", "scanner": "scanner-primary", "fingerprint": "013dfff3f1c86867", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-0d52242120d4f325", "level": "note", "message": {"text": "296 TODO/FIXME markers"}, "properties": {"repobilityId": "4b38c118003e07d2", "scanner": "scanner-primary", "fingerprint": "0d52242120d4f325", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["maintenance"]}}, {"ruleId": "scanner-015a862160d16585", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: sdks/typescript/package.json"}, "properties": {"repobilityId": "e97d1d5bf4d87aa0", "scanner": "scanner-primary", "fingerprint": "015a862160d16585", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "sdks/typescript/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-27fa268f82881663", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/sabcall-sdk/package.json"}, "properties": {"repobilityId": "d1cf001429ba807d", "scanner": "scanner-primary", "fingerprint": "27fa268f82881663", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/sabcall-sdk/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a28f43a25ee0a7e", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: services/sabflow-triggers/package.json"}, "properties": {"repobilityId": "6b18d341750b90b4", "scanner": "scanner-primary", "fingerprint": "7a28f43a25ee0a7e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/sabflow-triggers/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5f1688ae3e9a1fdf", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: services/sabflow-ws/package.json"}, "properties": {"repobilityId": "b9d69ab933d8a806", "scanner": "scanner-primary", "fingerprint": "5f1688ae3e9a1fdf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/sabflow-ws/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "ba3ff8929d4edb25", "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": "c34f33c10afad78e", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "ebfbe86d8667977d", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "ade5ea47590f6892", "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": "dcf20163108de7c6", "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": "d7c8b4036f818cef", "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": "06d60a147ba2d44c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-043a063869cb9f3e", "level": "none", "message": {"text": "Commented-code block (7 lines) in ecosystem.config.js:71"}, "properties": {"repobilityId": "4a7e52aacc4193ad", "scanner": "scanner-primary", "fingerprint": "043a063869cb9f3e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2f5b3f80802af786", "level": "none", "message": {"text": "Commented-code block (5 lines) in worker.js:235"}, "properties": {"repobilityId": "c442276930dc2701", "scanner": "scanner-primary", "fingerprint": "2f5b3f80802af786", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2b13e8b07e57feb2", "level": "none", "message": {"text": "Commented-code block (5 lines) in fix_fmtdate.js:25"}, "properties": {"repobilityId": "6d51dde15fa56481", "scanner": "scanner-primary", "fingerprint": "2b13e8b07e57feb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa2a8573525f9ab0", "level": "none", "message": {"text": "Commented-code block (8 lines) in next.config.js:32"}, "properties": {"repobilityId": "53cac66292fabee7", "scanner": "scanner-primary", "fingerprint": "aa2a8573525f9ab0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3ce6035ad65dd1f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 next.config.js:71"}, "properties": {"repobilityId": "8dc4744a7ac95d77", "scanner": "scanner-primary", "fingerprint": "3ce6035ad65dd1f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cfa58eda7c48fc31", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/sabflow-worker/roundtrip.test.ts:79"}, "properties": {"repobilityId": "5906285b47908e82", "scanner": "scanner-primary", "fingerprint": "cfa58eda7c48fc31", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0732e021a24520d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen-rust-client.ts:27"}, "properties": {"repobilityId": "a174ae7725397ec2", "scanner": "scanner-primary", "fingerprint": "d0732e021a24520d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f2ac3ae4808eef5d", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/zoru-codemod-safe.mjs:161"}, "properties": {"repobilityId": "f31a5d602c26d5c1", "scanner": "scanner-primary", "fingerprint": "f2ac3ae4808eef5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c0ebbea931794a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/sabsms-e2e.mjs:347"}, "properties": {"repobilityId": "b1e0e8b268fa5511", "scanner": "scanner-primary", "fingerprint": "2c0ebbea931794a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2198bc884a2ffea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabsms-e2e.mjs:272"}, "properties": {"repobilityId": "aa46b65a3b34fc26", "scanner": "scanner-primary", "fingerprint": "a2198bc884a2ffea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4858ad3c2852e6e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/cron-worker.mjs:94"}, "properties": {"repobilityId": "49d9dc060a6d34db", "scanner": "scanner-primary", "fingerprint": "b4858ad3c2852e6e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-75a47249fdc99505", "level": "note", "message": {"text": "Legacy-named symbol `file_copy` in scripts/n8n-extract-full.ts:418"}, "properties": {"repobilityId": "781eec64945f937e", "scanner": "scanner-primary", "fingerprint": "75a47249fdc99505", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6e1cb89aea07a990", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/fetch-brand-logos.mjs:264"}, "properties": {"repobilityId": "25b232efafa66629", "scanner": "scanner-primary", "fingerprint": "6e1cb89aea07a990", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-09a9e9504d79d254", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_sabdesk_crates.py:23"}, "properties": {"repobilityId": "7e108aa5bfd67794", "scanner": "scanner-primary", "fingerprint": "09a9e9504d79d254", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb39991ac519cc4b", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/chunk35_step4.py:22"}, "properties": {"repobilityId": "008ae016219dbb06", "scanner": "scanner-primary", "fingerprint": "cb39991ac519cc4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d8afc8357e3b9b1a", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_phase3.py:23"}, "properties": {"repobilityId": "01cbd669dc448490", "scanner": "scanner-primary", "fingerprint": "d8afc8357e3b9b1a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-be97374fed358742", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/scaffold_sabsign.py:21"}, "properties": {"repobilityId": "301b854e2cd9c98a", "scanner": "scanner-primary", "fingerprint": "be97374fed358742", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd6802fa870459e4", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/zoru-codemod.mjs:384"}, "properties": {"repobilityId": "1c6a2f0d1e1a6ee9", "scanner": "scanner-primary", "fingerprint": "cd6802fa870459e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba4f9b3a6de468e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in scripts/zoru-fixer.mjs:88"}, "properties": {"repobilityId": "28d5acf0b2ccb21f", "scanner": "scanner-primary", "fingerprint": "ba4f9b3a6de468e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c439cef0b9a5628", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabpay-e2e.mjs:73"}, "properties": {"repobilityId": "1cd89cd0e5584a41", "scanner": "scanner-primary", "fingerprint": "3c439cef0b9a5628", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f9d65135974420a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/sabsheet/function-parity.ts:67"}, "properties": {"repobilityId": "0c50a683e8cd00e0", "scanner": "scanner-primary", "fingerprint": "7f9d65135974420a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0cf5923c08fa9ceb", "level": "note", "message": {"text": "Legacy-named symbol `buildYDocFromLegacy` in scripts/sabflow/migrate-docs-to-crdt.mjs:207"}, "properties": {"repobilityId": "3d1472f6871657f8", "scanner": "scanner-primary", "fingerprint": "0cf5923c08fa9ceb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-18d57d494f7aa27d", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/db/backfill-users.mjs:131"}, "properties": {"repobilityId": "172d2a4b49168eab", "scanner": "scanner-primary", "fingerprint": "18d57d494f7aa27d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e02f4d8c1ba233d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/sabflow-ws/test/fuzz/protocol.fuzz.test.ts:540"}, "properties": {"repobilityId": "6c56076a1e4db804", "scanner": "scanner-primary", "fingerprint": "e02f4d8c1ba233d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91af19911ad0a6d3", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/sabflow-ws/src/connection.ts:31"}, "properties": {"repobilityId": "1f4fd42b5d6a72a9", "scanner": "scanner-primary", "fingerprint": "91af19911ad0a6d3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-711dd6787538a551", "level": "none", "message": {"text": "Commented-code block (8 lines) in services/sabflow-ws/src/room.ts:163"}, "properties": {"repobilityId": "a0d644f8a123d3ff", "scanner": "scanner-primary", "fingerprint": "711dd6787538a551", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-360d18943ad235b7", "level": "none", "message": {"text": "Commented-code block (7 lines) in services/sabflow-ws/src/logger.ts:52"}, "properties": {"repobilityId": "63a952a55dd1a6e5", "scanner": "scanner-primary", "fingerprint": "360d18943ad235b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a9643ad2fa9fc78", "level": "none", "message": {"text": "Commented-code block (5 lines) in services/sabflow-ws/src/sync/initial.ts:54"}, "properties": {"repobilityId": "b2346b0242017ef2", "scanner": "scanner-primary", "fingerprint": "5a9643ad2fa9fc78", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4a82cffb5e9987ff", "level": "none", "message": {"text": "Commented-code block (12 lines) in services/sabflow-ws/src/backplane/redis-backplane.ts:46"}, "properties": {"repobilityId": "2e4e537714d97c1e", "scanner": "scanner-primary", "fingerprint": "4a82cffb5e9987ff", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-86e62df3de91a8d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/api-codegen/generate-ts-sdk.ts:132"}, "properties": {"repobilityId": "c8a68f97decaa946", "scanner": "scanner-primary", "fingerprint": "86e62df3de91a8d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b38cc9d092fb7a7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 tools/api-codegen/code-samples.ts:92"}, "properties": {"repobilityId": "304d620e7a2aecdc", "scanner": "scanner-primary", "fingerprint": "1b38cc9d092fb7a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-02f369864417bc68", "level": "none", "message": {"text": "Commented-code block (5 lines) in public/embed.js:170"}, "properties": {"repobilityId": "4b13d2043fcbc1b9", "scanner": "scanner-primary", "fingerprint": "02f369864417bc68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be42df9829d6501f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/ai/flows/seo-schema-generator.ts:53"}, "properties": {"repobilityId": "3f7069bb596b7f7c", "scanner": "scanner-primary", "fingerprint": "be42df9829d6501f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8799338e812de5d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/ai/flows/generate-promo-video.ts:66"}, "properties": {"repobilityId": "44eec56be2e1b637", "scanner": "scanner-primary", "fingerprint": "8799338e812de5d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a1c1b0d2c3e58272", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/email/inbox/inbox-client.tsx:32"}, "properties": {"repobilityId": "1eaf839ebd3edeae", "scanner": "scanner-primary", "fingerprint": "a1c1b0d2c3e58272", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e09ef0f9fcb2dd8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ui/sidebar-component.tsx:499"}, "properties": {"repobilityId": "d361e583e62c41a0", "scanner": "scanner-primary", "fingerprint": "9e09ef0f9fcb2dd8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0a3ee415fcc251c5", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/20ui-domain/whatsapp-widget-generator.tsx:144"}, "properties": {"repobilityId": "7658e97ea37fd0a5", "scanner": "scanner-primary", "fingerprint": "0a3ee415fcc251c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8cd1c2032e3f0653", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/whatsapp.actions.ts:43"}, "properties": {"repobilityId": "94ddc614a510ceb1", "scanner": "scanner-primary", "fingerprint": "8cd1c2032e3f0653", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f8313756202ee1c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/project.actions.ts:51"}, "properties": {"repobilityId": "f770d20cc48d4f6e", "scanner": "scanner-primary", "fingerprint": "0f8313756202ee1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2021c83cf092a0bf", "level": "note", "message": {"text": "Legacy-named symbol `offer_update_v2` in src/components/20ui-domain/bulk-broadcast-form.tsx:80"}, "properties": {"repobilityId": "e4140ce3d2054db2", "scanner": "scanner-primary", "fingerprint": "2021c83cf092a0bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4e10dcdbbfb15561", "level": "note", "message": {"text": "Legacy-named symbol `normalizeLegacy` in src/components/20ui-domain/admin-plan-permissions-dialog.tsx:21"}, "properties": {"repobilityId": "d6b805aca305b462", "scanner": "scanner-primary", "fingerprint": "4e10dcdbbfb15561", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fb8dba44a347e2e3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/run-cron-jobs-button.tsx:20"}, "properties": {"repobilityId": "6fcacc952c1cce31", "scanner": "scanner-primary", "fingerprint": "fb8dba44a347e2e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36ca3d74dfc38616", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/login-form.tsx:87"}, "properties": {"repobilityId": "1baa81036dba8285", "scanner": "scanner-primary", "fingerprint": "36ca3d74dfc38616", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3eab5fcdcbda6963", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/20ui-domain/rbac-guard.tsx:82"}, "properties": {"repobilityId": "a01ca5fe80d5643c", "scanner": "scanner-primary", "fingerprint": "3eab5fcdcbda6963", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-76eb042a043bc12b", "level": "note", "message": {"text": "Legacy-named symbol `normalizeLegacy` in src/components/20ui-domain/plan-permission-selector.tsx:24"}, "properties": {"repobilityId": "c9df51333cda1e56", "scanner": "scanner-primary", "fingerprint": "76eb042a043bc12b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2fde6d52596e2521", "level": "none", "message": {"text": "Commented-code block (13 lines) in src/components/20ui-domain/templates/ProductPicker.tsx:41"}, "properties": {"repobilityId": "5ce3e74d55b3abc4", "scanner": "scanner-primary", "fingerprint": "2fde6d52596e2521", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2145eccd8444012", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/20ui-domain/onboarding/steps/account-step.tsx:207"}, "properties": {"repobilityId": "0f5abd554fc24edc", "scanner": "scanner-primary", "fingerprint": "e2145eccd8444012", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cfeed55da2ce5c19", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabcrm/use-command-menu.ts:5"}, "properties": {"repobilityId": "9ce943ef3eded2f8", "scanner": "scanner-primary", "fingerprint": "cfeed55da2ce5c19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4f4f932d31b347b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/sabcrm/command-menu.tsx:314"}, "properties": {"repobilityId": "64af6f6ab6191932", "scanner": "scanner-primary", "fingerprint": "d4f4f932d31b347b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4787976cc21a854f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabcrm/sabcrm-outer-shell.tsx:23"}, "properties": {"repobilityId": "ae818573d8896f51", "scanner": "scanner-primary", "fingerprint": "4787976cc21a854f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe0984903404d1e5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabcrm/sabcrm-notify.ts:86"}, "properties": {"repobilityId": "cef7add53b28017d", "scanner": "scanner-primary", "fingerprint": "fe0984903404d1e5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-98c82546ce41ca29", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/sabcrm/20ui/avatar.tsx:22"}, "properties": {"repobilityId": "b6ad78cdc534d448", "scanner": "scanner-primary", "fingerprint": "98c82546ce41ca29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-037a19b0ef65bf14", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/sabcrm/20ui/portal-popover.tsx:164"}, "properties": {"repobilityId": "ef1e54c4edd7e798", "scanner": "scanner-primary", "fingerprint": "037a19b0ef65bf14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c58f5adf8437277c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/sabcrm/20ui/combobox.tsx:144"}, "properties": {"repobilityId": "053f31252ae664e6", "scanner": "scanner-primary", "fingerprint": "c58f5adf8437277c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5bb3f11bd10fcc08", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/index.ts:31"}, "properties": {"repobilityId": "c02d7de2ac5107a0", "scanner": "scanner-primary", "fingerprint": "5bb3f11bd10fcc08", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d2fb165b091bb2b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/shell/apps.ts:174"}, "properties": {"repobilityId": "5310287123d5342c", "scanner": "scanner-primary", "fingerprint": "d2fb165b091bb2b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8d59070e9c96a6c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/shell/launchpad.tsx:88"}, "properties": {"repobilityId": "deb3b13f304c7e72", "scanner": "scanner-primary", "fingerprint": "b8d59070e9c96a6c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9cf8fa6ccb84aa6", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/sabcrm/20ui/composites/shell/home-shell.tsx:17"}, "properties": {"repobilityId": "1ae823a6f588b03b", "scanner": "scanner-primary", "fingerprint": "d9cf8fa6ccb84aa6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1fa69ab8f758b10d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabcrm/20ui/composites/record/board.tsx:316"}, "properties": {"repobilityId": "bc80625b3e2582e3", "scanner": "scanner-primary", "fingerprint": "1fa69ab8f758b10d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a42209a54549621a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabcrm/20ui/composites/record/record-timeline-view.tsx:54"}, "properties": {"repobilityId": "6a60b656c8e28756", "scanner": "scanner-primary", "fingerprint": "a42209a54549621a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9cec9e8d7422f830", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/builder/editor-layout.tsx:51"}, "properties": {"repobilityId": "4a519daebb79597f", "scanner": "scanner-primary", "fingerprint": "9cec9e8d7422f830", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3599150b3812e4a6", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/crm/entity-list-shell.tsx:86"}, "properties": {"repobilityId": "a0c05f65c528c30c", "scanner": "scanner-primary", "fingerprint": "3599150b3812e4a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d33e8f75a27c2a4f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/crm/settings-deep-page.tsx:750"}, "properties": {"repobilityId": "03a5b11f2f51a0ef", "scanner": "scanner-primary", "fingerprint": "d33e8f75a27c2a4f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6499f87c51e24f3e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/crm/command-palette.tsx:359"}, "properties": {"repobilityId": "bb0802235429046e", "scanner": "scanner-primary", "fingerprint": "6499f87c51e24f3e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d621fd854c504149", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/crm/entity-picker.tsx:466"}, "properties": {"repobilityId": "9ed1f30f4b30a203", "scanner": "scanner-primary", "fingerprint": "d621fd854c504149", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-152b0cc98165793c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/crm/inventory/add-warehouse-dialog.tsx:42"}, "properties": {"repobilityId": "a91b503aa3ea2a79", "scanner": "scanner-primary", "fingerprint": "152b0cc98165793c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-acc57bc3a5ba56cf", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/crm/live-editor/seed-templates.ts:295"}, "properties": {"repobilityId": "dd3f8551c75d81f4", "scanner": "scanner-primary", "fingerprint": "acc57bc3a5ba56cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-289e3a8f74369f8d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/results/FlowResultsClient.tsx:266"}, "properties": {"repobilityId": "0f660cf7c32db4b0", "scanner": "scanner-primary", "fingerprint": "289e3a8f74369f8d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc4b05365dc04615", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/DomainsPanel.tsx:72"}, "properties": {"repobilityId": "a79f30f61a9a7b63", "scanner": "scanner-primary", "fingerprint": "fc4b05365dc04615", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98660dc0b9179d95", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/NotificationsPanel.tsx:229"}, "properties": {"repobilityId": "a968d0814cf9c56a", "scanner": "scanner-primary", "fingerprint": "98660dc0b9179d95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5180f66dc3c71e03", "level": "note", "message": {"text": "Legacy-named symbol `eleven_monolingual_v1` in src/components/sabflow/panels/blocks/integrations/ElevenLabsSettings.tsx:20"}, "properties": {"repobilityId": "d1e1c460b033d322", "scanner": "scanner-primary", "fingerprint": "5180f66dc3c71e03", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f5db4d59216651a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabflow/panels/blocks/shared/TestNodePanel.tsx:657"}, "properties": {"repobilityId": "041d4c17cc77fe85", "scanner": "scanner-primary", "fingerprint": "f5db4d59216651a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d39e95586a3e6b8e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/panels/blocks/logic/ScriptSettings.tsx:334"}, "properties": {"repobilityId": "4e870daea2442aa6", "scanner": "scanner-primary", "fingerprint": "d39e95586a3e6b8e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-683897b81bf8303a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/EditorContentCollab.tsx:225"}, "properties": {"repobilityId": "cffbcb1cc613913b", "scanner": "scanner-primary", "fingerprint": "683897b81bf8303a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2028a6fac38bd0a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/editor/EditorContentCollab.tsx:125"}, "properties": {"repobilityId": "f84703d2ab77bc44", "scanner": "scanner-primary", "fingerprint": "2028a6fac38bd0a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-de6c5fafa6e0e352", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/sabflow/editor/EditorPage.tsx:227"}, "properties": {"repobilityId": "a9d71b2a3aee3645", "scanner": "scanner-primary", "fingerprint": "de6c5fafa6e0e352", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a1fdb3c62af78a29", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/state/use-local-cursor-broadcast.ts:61"}, "properties": {"repobilityId": "4e7a595c3f9967e3", "scanner": "scanner-primary", "fingerprint": "a1fdb3c62af78a29", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fbc91724f0c1edd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/state/use-follow-mode.ts:129"}, "properties": {"repobilityId": "301cbf7d442ec6cf", "scanner": "scanner-primary", "fingerprint": "7fbc91724f0c1edd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f31528a1aff95218", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/sabflow/editor/state/use-selection-awareness.ts:197"}, "properties": {"repobilityId": "d74170cb3b8cad6e", "scanner": "scanner-primary", "fingerprint": "f31528a1aff95218", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-abacd6c85fdbe4c5", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/sabflow/editor/chrome/EditorCollabMount.tsx:223"}, "properties": {"repobilityId": "d802131393e0ac59", "scanner": "scanner-primary", "fingerprint": "abacd6c85fdbe4c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4986e24beb297181", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabflow/editor/overlays/ConflictBanner.tsx:98"}, "properties": {"repobilityId": "923401c8ee7d4c02", "scanner": "scanner-primary", "fingerprint": "4986e24beb297181", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89ab2575122ee14d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/sabflow/editor/overlays/SelectionHighlightLayer.tsx:271"}, "properties": {"repobilityId": "377e31066bf89e90", "scanner": "scanner-primary", "fingerprint": "89ab2575122ee14d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7031f89803b1cb12", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabflow/canvas/adapter.ts:155"}, "properties": {"repobilityId": "627d4fd418eb2a46", "scanner": "scanner-primary", "fingerprint": "7031f89803b1cb12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d655dd218d4c89f", "level": "none", "message": {"text": "Commented-code block (11 lines) in src/components/sabflow/canvas/nodes/CanvasNodeDefault.tsx:107"}, "properties": {"repobilityId": "a95d6e95144605d5", "scanner": "scanner-primary", "fingerprint": "5d655dd218d4c89f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3af076cb7d00ccf0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabflow/presence/usePresence.ts:72"}, "properties": {"repobilityId": "5a979aa130f8d780", "scanner": "scanner-primary", "fingerprint": "3af076cb7d00ccf0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-63a29faa1d5c6ec9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/sabflow/graph/components/nodes/group/GroupNode.tsx:89"}, "properties": {"repobilityId": "08b63b98ae4431dd", "scanner": "scanner-primary", "fingerprint": "63a29faa1d5c6ec9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbf86023a52d8298", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/sabflow/graph/components/nodes/block/BlockNodesList.tsx:207"}, "properties": {"repobilityId": "247b01d526b2393e", "scanner": "scanner-primary", "fingerprint": "cbf86023a52d8298", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9da4b96eb3bcc64", "level": "note", "message": {"text": "Legacy-named symbol `welcome_v1` in src/components/sabbigin/automation/rule-builder.tsx:608"}, "properties": {"repobilityId": "3b764f35c91e6c01", "scanner": "scanner-primary", "fingerprint": "b9da4b96eb3bcc64", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-56703429ebb73b27", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/sabfiles/sab-file-picker.tsx:721"}, "properties": {"repobilityId": "aa515859e76c75f4", "scanner": "scanner-primary", "fingerprint": "56703429ebb73b27", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9f68a9a6dea76f1c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/sabfiles/sab-file-picker.tsx:875"}, "properties": {"repobilityId": "9c968fd697b344a1", "scanner": "scanner-primary", "fingerprint": "9f68a9a6dea76f1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3520bcc68c63f792", "level": "note", "message": {"text": "Legacy-named symbol `err__copy` in src/app/error.tsx:63"}, "properties": {"repobilityId": "ed523ccc5063e49a", "scanner": "scanner-primary", "fingerprint": "3520bcc68c63f792", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ef6b2109ff7b391f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/page-client.tsx:2701"}, "properties": {"repobilityId": "9ac7ee69c8042a70", "scanner": "scanner-primary", "fingerprint": "ef6b2109ff7b391f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-90e44cd55dd9c810", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabchat/inbox/_components/inbox-client.tsx:360"}, "properties": {"repobilityId": "9e2f6356e5f4a55c", "scanner": "scanner-primary", "fingerprint": "90e44cd55dd9c810", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-94d93da83abdd714", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/invite/[token]/page.tsx:21"}, "properties": {"repobilityId": "72454785f697c697", "scanner": "scanner-primary", "fingerprint": "94d93da83abdd714", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2548e25bbc58ead", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabchat/[userId]/route.ts:99"}, "properties": {"repobilityId": "1e6cdf46479ddd32", "scanner": "scanner-primary", "fingerprint": "a2548e25bbc58ead", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a890c0851cc80fe1", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/push/outlook/route.ts:144"}, "properties": {"repobilityId": "17b70f454f7cf901", "scanner": "scanner-primary", "fingerprint": "a890c0851cc80fe1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dab6077586083230", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/push/gmail/route.ts:55"}, "properties": {"repobilityId": "a43300dcde1960ec", "scanner": "scanner-primary", "fingerprint": "dab6077586083230", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4274bd3ebbcd00b1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/auth/admin-logout/route.ts:43"}, "properties": {"repobilityId": "3173d08840daa1c0", "scanner": "scanner-primary", "fingerprint": "4274bd3ebbcd00b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a4c324c2c3777a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/auth/two-fa/route.ts:80"}, "properties": {"repobilityId": "f21e80d0d32929c4", "scanner": "scanner-primary", "fingerprint": "5a4c324c2c3777a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dbf70d8ec6626b12", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/auth/session/route.ts:96"}, "properties": {"repobilityId": "68c63f21327ae97c", "scanner": "scanner-primary", "fingerprint": "dbf70d8ec6626b12", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9267fb8952d31cb", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/api/v1/messages/send-template/route.ts:28"}, "properties": {"repobilityId": "ba2ef2550bebcd1e", "scanner": "scanner-primary", "fingerprint": "d9267fb8952d31cb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-317edbc322de2aed", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/catalyst/[projectSlug]/functions/[functionName]/route.ts:59"}, "properties": {"repobilityId": "5f05b03444abbbd2", "scanner": "scanner-primary", "fingerprint": "317edbc322de2aed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fd7f1ede2309097", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabcrm/ai/route.ts:127"}, "properties": {"repobilityId": "666eb46550fff5d3", "scanner": "scanner-primary", "fingerprint": "0fd7f1ede2309097", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9794d8769434566e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabcrm/oauth/[provider]/callback/route.ts:164"}, "properties": {"repobilityId": "42db10feedf88a7f", "scanner": "scanner-primary", "fingerprint": "9794d8769434566e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c0c4180fed7d85c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabsense/ingest/route.ts:144"}, "properties": {"repobilityId": "08be91ec22fbf239", "scanner": "scanner-primary", "fingerprint": "c0c4180fed7d85c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-47fa51280aa98246", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/process-webhooks/route.ts:29"}, "properties": {"repobilityId": "f68a10abf990fe79", "scanner": "scanner-primary", "fingerprint": "47fa51280aa98246", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d71641ad98b46c67", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/cron/sla-breach-check/route.ts:269"}, "properties": {"repobilityId": "d85dbf2c25968af8", "scanner": "scanner-primary", "fingerprint": "d71641ad98b46c67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f90090be9065356d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/cron/sync-local-templates/route.ts:12"}, "properties": {"repobilityId": "b67e1f71eee0a326", "scanner": "scanner-primary", "fingerprint": "f90090be9065356d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97d27915710e7eea", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/cron/webhook-dispatcher/route.ts:116"}, "properties": {"repobilityId": "e9825c7bf414cc9a", "scanner": "scanner-primary", "fingerprint": "97d27915710e7eea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-355c65d7d2f8dde0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sabflow/upload/route.ts:98"}, "properties": {"repobilityId": "6fb974dfe568fca5", "scanner": "scanner-primary", "fingerprint": "355c65d7d2f8dde0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5087a4704241e21e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabflow/presets/import-openapi/route.ts:66"}, "properties": {"repobilityId": "84717e4349851080", "scanner": "scanner-primary", "fingerprint": "5087a4704241e21e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3029220348a0fa79", "level": "note", "message": {"text": "Legacy-named symbol `waitForExecutionLegacy` in src/app/api/sabflow/webhook/[id]/route.ts:289"}, "properties": {"repobilityId": "7dbe25d5795ff7ec", "scanner": "scanner-primary", "fingerprint": "3029220348a0fa79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-399d67820a42b968", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sabflow/load-options/buildContext.ts:38"}, "properties": {"repobilityId": "a657f342101f4f7f", "scanner": "scanner-primary", "fingerprint": "399d67820a42b968", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81da67143cadeca5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/sabmail-events/[provider]/route.ts:249"}, "properties": {"repobilityId": "d38b4686ec4966d0", "scanner": "scanner-primary", "fingerprint": "81da67143cadeca5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d443f5c632f0cc31", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/webhooks/meta/route.ts:254"}, "properties": {"repobilityId": "5ba9f7c2e35b86a2", "scanner": "scanner-primary", "fingerprint": "d443f5c632f0cc31", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9aad7a6baf3679a4", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/webhooks/sabmail-inbound/route.ts:232"}, "properties": {"repobilityId": "535176124294db09", "scanner": "scanner-primary", "fingerprint": "9aad7a6baf3679a4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-87ff4f91c8f76735", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/sabsms/imports/process/route.ts:49"}, "properties": {"repobilityId": "111945d96f12c66b", "scanner": "scanner-primary", "fingerprint": "87ff4f91c8f76735", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-edd8b77f813ba8f5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/sabsms/credits/route.ts:84"}, "properties": {"repobilityId": "2d99878da997869e", "scanner": "scanner-primary", "fingerprint": "edd8b77f813ba8f5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d3771b55a5b2b6f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/layout.tsx:59"}, "properties": {"repobilityId": "5809b201d27d9891", "scanner": "scanner-primary", "fingerprint": "3d3771b55a5b2b6f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-510977664303850e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/settings/crm/import-export/page.tsx:131"}, "properties": {"repobilityId": "bb5d6dec9f190829", "scanner": "scanner-primary", "fingerprint": "510977664303850e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5179a08b92b5911a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/pipelines/page.tsx:96"}, "properties": {"repobilityId": "906b527ad81b6ea0", "scanner": "scanner-primary", "fingerprint": "5179a08b92b5911a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1ffb67be3661662a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/page-layouts/page.tsx:87"}, "properties": {"repobilityId": "429a577055d79d5a", "scanner": "scanner-primary", "fingerprint": "1ffb67be3661662a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9db4273d0c2bff0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/templates/page.tsx:79"}, "properties": {"repobilityId": "ccd1c631287d4d5b", "scanner": "scanner-primary", "fingerprint": "d9db4273d0c2bff0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b453c7eebd5b1c46", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/admin/page.tsx:75"}, "properties": {"repobilityId": "473d820f1a2e2055", "scanner": "scanner-primary", "fingerprint": "b453c7eebd5b1c46", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f16c3d5e6297682b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/automations/page.tsx:147"}, "properties": {"repobilityId": "17bc9003cad1ccfd", "scanner": "scanner-primary", "fingerprint": "f16c3d5e6297682b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7789fd17beb0a1fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/members/page.tsx:428"}, "properties": {"repobilityId": "9815bb03c58a64dc", "scanner": "scanner-primary", "fingerprint": "7789fd17beb0a1fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9138ca40a1622969", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/dashboard/settings/crm/segments/page.tsx:88"}, "properties": {"repobilityId": "0112a928a2bd2a29", "scanner": "scanner-primary", "fingerprint": "9138ca40a1622969", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c76f826f55590a4b", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/dashboard/settings/crm/webhooks/page.tsx:123"}, "properties": {"repobilityId": "d939826a22382e96", "scanner": "scanner-primary", "fingerprint": "c76f826f55590a4b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed74bed7d2c205cd", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/dashboard/settings/crm/data-model/page.tsx:315"}, "properties": {"repobilityId": "267ef48d2c0f7a3d", "scanner": "scanner-primary", "fingerprint": "ed74bed7d2c205cd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9892e64005a08e31", "level": "note", "message": {"text": "Legacy-named symbol `settings_webhooks_v1` in src/app/dashboard/settings/webhooks/page.tsx:45"}, "properties": {"repobilityId": "d983b9e561d05193", "scanner": "scanner-primary", "fingerprint": "9892e64005a08e31", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fddc8deea78bb048", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/marketplace/installed/page.tsx:68"}, "properties": {"repobilityId": "8fd605fe35e52454", "scanner": "scanner-primary", "fingerprint": "fddc8deea78bb048", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-68b25a57c1af1e49", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/telegram/page.client.tsx:197"}, "properties": {"repobilityId": "0f1e8ef2317e8126", "scanner": "scanner-primary", "fingerprint": "68b25a57c1af1e49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-583dfc16b5888fb9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/telegram/payments/page.client.tsx:375"}, "properties": {"repobilityId": "54c171e46c1845a3", "scanner": "scanner-primary", "fingerprint": "583dfc16b5888fb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0586df78764ab802", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/dashboard/ad-manager/layout.tsx:187"}, "properties": {"repobilityId": "a11362563e6ac806", "scanner": "scanner-primary", "fingerprint": "0586df78764ab802", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e11cd3399ed3bc27", "level": "note", "message": {"text": "Legacy-named symbol `handleDeleteOld` in src/app/dashboard/sabbi/reports/_components/runs-list-client.tsx:64"}, "properties": {"repobilityId": "f32489001790ac45", "scanner": "scanner-primary", "fingerprint": "e11cd3399ed3bc27", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-95c9bf781b43e15f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/sabflow/audit/_components/audit-client.tsx:149"}, "properties": {"repobilityId": "c6ebf7383b050714", "scanner": "scanner-primary", "fingerprint": "95c9bf781b43e15f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b4dc6bce211e9b5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/sabfiles/vault/_components/vault-client.tsx:359"}, "properties": {"repobilityId": "439286d7d338a870", "scanner": "scanner-primary", "fingerprint": "b4dc6bce211e9b5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9f0e906fa3f3b67c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/[projectId]/timetravel/actions.ts:32"}, "properties": {"repobilityId": "d9aa3e928e7d04ba", "scanner": "scanner-primary", "fingerprint": "9f0e906fa3f3b67c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b56d5e062a2c5412", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/related-keywords/actions.ts:32"}, "properties": {"repobilityId": "7240cc91e3cd4556", "scanner": "scanner-primary", "fingerprint": "b56d5e062a2c5412", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5701e55f36900525", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/keyword-difficulty/actions.ts:30"}, "properties": {"repobilityId": "846b005753950f11", "scanner": "scanner-primary", "fingerprint": "5701e55f36900525", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-13bb9aecc4a84b28", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/page-speed/page.tsx:57"}, "properties": {"repobilityId": "e4bc3557e4770f51", "scanner": "scanner-primary", "fingerprint": "13bb9aecc4a84b28", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-162af3ffc421469a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/dashboard/seo/tools/password-generator/page.tsx:128"}, "properties": {"repobilityId": "2c028ee9f75d7922", "scanner": "scanner-primary", "fingerprint": "162af3ffc421469a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0a1856c8426b682", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/s/[shortCode]/page.tsx:44"}, "properties": {"repobilityId": "eb147da134fef2f9", "scanner": "scanner-primary", "fingerprint": "e0a1856c8426b682", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c3a37f72ab904b14", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/wachat/page.tsx:219"}, "properties": {"repobilityId": "56d4596743675c90", "scanner": "scanner-primary", "fingerprint": "c3a37f72ab904b14", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3363c000d63afe7e", "level": "note", "message": {"text": "Legacy-named symbol `isDeprecated` in src/app/wachat/flows/create/page.tsx:275"}, "properties": {"repobilityId": "b903ccd0debc362a", "scanner": "scanner-primary", "fingerprint": "3363c000d63afe7e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4d4288e618c51c6b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/wachat/webhooks/actions.ts:24"}, "properties": {"repobilityId": "c4e84161ecd9b80e", "scanner": "scanner-primary", "fingerprint": "4d4288e618c51c6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cd39ae32e04c8c7e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/wachat/_components/ui20-kanban-board.tsx:60"}, "properties": {"repobilityId": "8c9dd3c9ba4919a8", "scanner": "scanner-primary", "fingerprint": "cd39ae32e04c8c7e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27beb8cfb2859f77", "level": "note", "message": {"text": "Legacy-named symbol `offer_update_v2` in src/app/wachat/_components/bulk-actions-client.tsx:308"}, "properties": {"repobilityId": "9fa6bb1619998d3a", "scanner": "scanner-primary", "fingerprint": "27beb8cfb2859f77", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f4b942896f628fc0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/nba/page.tsx:6"}, "properties": {"repobilityId": "3a45ca376752177f", "scanner": "scanner-primary", "fingerprint": "f4b942896f628fc0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-beb6c58ceaef7ebe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/offline/page.tsx:8"}, "properties": {"repobilityId": "9d052d1e3c60fb64", "scanner": "scanner-primary", "fingerprint": "beb6c58ceaef7ebe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d18c485ad566fe4a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/supply/vendors/vendors-client.tsx:18"}, "properties": {"repobilityId": "5dd4fa4734c718e2", "scanner": "scanner-primary", "fingerprint": "d18c485ad566fe4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3c2882cc382ec291", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabcrm/supply/items/items-client.tsx:864"}, "properties": {"repobilityId": "74ca61327d24cd52", "scanner": "scanner-primary", "fingerprint": "3c2882cc382ec291", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-477769e3906727a8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/bills/page.tsx:11"}, "properties": {"repobilityId": "c969cec40d66b277", "scanner": "scanner-primary", "fingerprint": "477769e3906727a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-903d7abbb8e64892", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/debit-notes/page.tsx:12"}, "properties": {"repobilityId": "5c6186104dbe540f", "scanner": "scanner-primary", "fingerprint": "903d7abbb8e64892", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e73a184b2c4b6478", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/credit-notes/page.tsx:12"}, "properties": {"repobilityId": "5557f936458aa204", "scanner": "scanner-primary", "fingerprint": "e73a184b2c4b6478", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9bf8b0905df607c0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabcrm/finance/invoices/page.tsx:10"}, "properties": {"repobilityId": "85278eed266edb98", "scanner": "scanner-primary", "fingerprint": "9bf8b0905df607c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28881b6ffee27413", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabcrm/reports/builder/page.tsx:212"}, "properties": {"repobilityId": "22478013682253e7", "scanner": "scanner-primary", "fingerprint": "28881b6ffee27413", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b31662adbdf215a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabmail/inbox/actions.ts:485"}, "properties": {"repobilityId": "7702b46992a9a384", "scanner": "scanner-primary", "fingerprint": "b31662adbdf215a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1978389cf35a736d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/sabadmin/actions/provision.actions.ts:230"}, "properties": {"repobilityId": "cc2dc6bdd46e1a0f", "scanner": "scanner-primary", "fingerprint": "1978389cf35a736d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d21a902d4e772370", "level": "note", "message": {"text": "Legacy-named symbol `Enterprise_NDA_v2` in src/app/sabsign/form-builder/page.tsx:165"}, "properties": {"repobilityId": "386ff4f1ce498fb5", "scanner": "scanner-primary", "fingerprint": "d21a902d4e772370", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-969ea3b083163954", "level": "note", "message": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-accounts.actions.ts:44"}, "properties": {"repobilityId": "ed39b6eb8f5a922b", "scanner": "scanner-primary", "fingerprint": "969ea3b083163954", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c8fb75f26fae84b7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/whatsapp.actions.ts:41"}, "properties": {"repobilityId": "5e715e48d3ffb4d8", "scanner": "scanner-primary", "fingerprint": "c8fb75f26fae84b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e82761659b6f366", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-forms.actions.ts:109"}, "properties": {"repobilityId": "aba7feb7b41fed7a", "scanner": "scanner-primary", "fingerprint": "1e82761659b6f366", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4f1b46bfbe9477cc", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/actions/sabchat.actions.ts:15"}, "properties": {"repobilityId": "0c96006a11964560", "scanner": "scanner-primary", "fingerprint": "4f1b46bfbe9477cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-201c31680d3643f1", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/actions/telegram-contacts.actions.ts:66"}, "properties": {"repobilityId": "a9defa0023cedc1b", "scanner": "scanner-primary", "fingerprint": "201c31680d3643f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2e07c73e92b8e13", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/public-invoice.actions.ts:819"}, "properties": {"repobilityId": "257c7847fae756b3", "scanner": "scanner-primary", "fingerprint": "f2e07c73e92b8e13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d0ecfc530291506", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/public-invoice.actions.ts:596"}, "properties": {"repobilityId": "79b43f4b2fff7c86", "scanner": "scanner-primary", "fingerprint": "1d0ecfc530291506", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b2e9324a2eec9c7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/plan.actions.ts:41"}, "properties": {"repobilityId": "dec2e070b950b691", "scanner": "scanner-primary", "fingerprint": "9b2e9324a2eec9c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2532ad0bd7391595", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/actions/two-fa.actions.ts:264"}, "properties": {"repobilityId": "4ba95cf2b2c8e7a9", "scanner": "scanner-primary", "fingerprint": "2532ad0bd7391595", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d1ab44a45e0d6d0", "level": "note", "message": {"text": "Legacy-named symbol `sendTelegramBroadcastNowLegacy` in src/app/actions/telegram.actions.ts:540"}, "properties": {"repobilityId": "7776ec14b5204b27", "scanner": "scanner-primary", "fingerprint": "1d1ab44a45e0d6d0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5a70c349fa6a62e7", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/actions/telegram.actions.ts:539"}, "properties": {"repobilityId": "c796d6ca4551b734", "scanner": "scanner-primary", "fingerprint": "5a70c349fa6a62e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fa32562349d853f", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/app/actions/user.actions.ts:222"}, "properties": {"repobilityId": "f34eaab0072ce8c6", "scanner": "scanner-primary", "fingerprint": "7fa32562349d853f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8cdb689b7fa902d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm-comms.actions.ts:135"}, "properties": {"repobilityId": "7c8c4b40c6bd8451", "scanner": "scanner-primary", "fingerprint": "a8cdb689b7fa902d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de9462569ceb1f73", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm.actions.ts:254"}, "properties": {"repobilityId": "e51700ab4967ebab", "scanner": "scanner-primary", "fingerprint": "de9462569ceb1f73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-104d420cb353f327", "level": "note", "message": {"text": "Legacy-named symbol `rustContactDocToLegacy` in src/app/actions/crm.actions.ts:24"}, "properties": {"repobilityId": "8f6f870e802ddc30", "scanner": "scanner-primary", "fingerprint": "104d420cb353f327", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0fbac5d07c876713", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/sabcrm-supply-vendors.actions.types.ts:71"}, "properties": {"repobilityId": "150e28d8aeeaeb25", "scanner": "scanner-primary", "fingerprint": "0fbac5d07c876713", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d6e9cfcdec7cd473", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/crm-lookup.actions.ts:486"}, "properties": {"repobilityId": "9ea97bbcc4e038f8", "scanner": "scanner-primary", "fingerprint": "d6e9cfcdec7cd473", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-adfac83dab06c55c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-lookup.actions.ts:113"}, "properties": {"repobilityId": "335121ac0ddf9677", "scanner": "scanner-primary", "fingerprint": "adfac83dab06c55c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c5f09d02a7d1ff0c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/broadcast.actions.ts:30"}, "properties": {"repobilityId": "1a5a42fd9ea724d7", "scanner": "scanner-primary", "fingerprint": "c5f09d02a7d1ff0c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2817ad904ea1ac8f", "level": "note", "message": {"text": "Legacy-named symbol `lineItemsLegacy` in src/app/actions/crm-invoices.actions.ts:110"}, "properties": {"repobilityId": "038e6b2c172b5a4a", "scanner": "scanner-primary", "fingerprint": "2817ad904ea1ac8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-73428ed069a7123e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/crm-invoices.actions.ts:236"}, "properties": {"repobilityId": "a235f5114ab0b5b4", "scanner": "scanner-primary", "fingerprint": "73428ed069a7123e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f214d1018503d041", "level": "note", "message": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-deals.actions.ts:83"}, "properties": {"repobilityId": "f8cab01d20d95ad0", "scanner": "scanner-primary", "fingerprint": "f214d1018503d041", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8646a7ac43f9b05d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/crm-portal-auth.actions.ts:161"}, "properties": {"repobilityId": "0b43b583e2d409b1", "scanner": "scanner-primary", "fingerprint": "8646a7ac43f9b05d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57c76d2e7b0e21f6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/crm-india-gst.actions.ts:301"}, "properties": {"repobilityId": "2d7138a97845c1c6", "scanner": "scanner-primary", "fingerprint": "57c76d2e7b0e21f6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e4790c85533b414e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/crm-purchase-orders.actions.ts:287"}, "properties": {"repobilityId": "27dce116c89f2412", "scanner": "scanner-primary", "fingerprint": "e4790c85533b414e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47e584adb29da138", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm-targets.actions.ts:230"}, "properties": {"repobilityId": "f3ed32a0b99e8625", "scanner": "scanner-primary", "fingerprint": "47e584adb29da138", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0c2acb8795838b9", "level": "note", "message": {"text": "Legacy-named symbol `rustDeptToLegacy` in src/app/actions/crm-employees.actions.ts:56"}, "properties": {"repobilityId": "9f89328982e0466f", "scanner": "scanner-primary", "fingerprint": "f0c2acb8795838b9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-594d15a2a0d361dc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/crm-employees.actions.ts:50"}, "properties": {"repobilityId": "377a9164ff57db61", "scanner": "scanner-primary", "fingerprint": "594d15a2a0d361dc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b0ce80e3f23bee64", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/email.actions.ts:289"}, "properties": {"repobilityId": "46cfe1b0a704aedd", "scanner": "scanner-primary", "fingerprint": "b0ce80e3f23bee64", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b1ef29bda40f44b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/public-lead-form.actions.ts:131"}, "properties": {"repobilityId": "ea2de6837778bde4", "scanner": "scanner-primary", "fingerprint": "1b1ef29bda40f44b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1722b60dab594e7d", "level": "note", "message": {"text": "Legacy-named symbol `deep_copy` in src/app/actions/ad-manager.actions.ts:232"}, "properties": {"repobilityId": "e0790aef05b5280c", "scanner": "scanner-primary", "fingerprint": "1722b60dab594e7d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f581ba4d0da61472", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/actions/ad-manager.actions.ts:924"}, "properties": {"repobilityId": "3b3e0cb504461f43", "scanner": "scanner-primary", "fingerprint": "f581ba4d0da61472", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-94327bfc16901c60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/actions/ad-manager.actions.ts:89"}, "properties": {"repobilityId": "91c927e2678285e5", "scanner": "scanner-primary", "fingerprint": "94327bfc16901c60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4faea6ca8ba08ac4", "level": "note", "message": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-products.actions.ts:37"}, "properties": {"repobilityId": "2d64b2e6d8fea738", "scanner": "scanner-primary", "fingerprint": "4faea6ca8ba08ac4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3626ab877edc5d44", "level": "note", "message": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-vendors.actions.ts:50"}, "properties": {"repobilityId": "28cc5b160930692f", "scanner": "scanner-primary", "fingerprint": "3626ab877edc5d44", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-47369c0b4ddcb019", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/sabcrm-finance.actions.ts:391"}, "properties": {"repobilityId": "c816eee7b3b9a417", "scanner": "scanner-primary", "fingerprint": "47369c0b4ddcb019", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-60d7994c57cbd66a", "level": "note", "message": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-leads.actions.ts:58"}, "properties": {"repobilityId": "8321512f53ede668", "scanner": "scanner-primary", "fingerprint": "60d7994c57cbd66a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ada2a2a551ebf52e", "level": "note", "message": {"text": "Legacy-named symbol `rustToLegacy` in src/app/actions/crm-document-templates.actions.ts:43"}, "properties": {"repobilityId": "4c9536c0058f8875", "scanner": "scanner-primary", "fingerprint": "ada2a2a551ebf52e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4b80667d0c975571", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/facebook.actions.ts:2516"}, "properties": {"repobilityId": "d79151b65a641064", "scanner": "scanner-primary", "fingerprint": "4b80667d0c975571", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7aacc5296acfcf67", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/actions/telegram-extra.actions.ts:420"}, "properties": {"repobilityId": "e118098b5f6baeef", "scanner": "scanner-primary", "fingerprint": "7aacc5296acfcf67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5a2e770b3dd0401", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/telegram-stickers.actions.ts:224"}, "properties": {"repobilityId": "6ee88f75bdccbc32", "scanner": "scanner-primary", "fingerprint": "b5a2e770b3dd0401", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7efdca38ebc692ee", "level": "note", "message": {"text": "Legacy-named symbol `rustDocToLegacy` in src/app/actions/crm-pipelines.actions.ts:50"}, "properties": {"repobilityId": "69d62e51825bddd7", "scanner": "scanner-primary", "fingerprint": "7efdca38ebc692ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6c3a9170ae274a93", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/email/templates.actions.ts:133"}, "properties": {"repobilityId": "9a443324b920f989", "scanner": "scanner-primary", "fingerprint": "6c3a9170ae274a93", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd8bf88cbc788ea9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/worksuite/billing.actions.ts:177"}, "properties": {"repobilityId": "928f268b80010276", "scanner": "scanner-primary", "fingerprint": "cd8bf88cbc788ea9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e80c5120233732fb", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/actions/crm/conversions.actions.ts:126"}, "properties": {"repobilityId": "a1010d7ebedd410c", "scanner": "scanner-primary", "fingerprint": "e80c5120233732fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bc17f0312f3f7427", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/crm/invoices.actions.ts:919"}, "properties": {"repobilityId": "9632417e3ea0e59e", "scanner": "scanner-primary", "fingerprint": "bc17f0312f3f7427", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9ab562a086165ae", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/crm/tickets.actions.ts:227"}, "properties": {"repobilityId": "e40da891996479ba", "scanner": "scanner-primary", "fingerprint": "b9ab562a086165ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5cae3c83df0cbab", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/actions/crm/leaves.actions.ts:266"}, "properties": {"repobilityId": "caff648a21baaec2", "scanner": "scanner-primary", "fingerprint": "f5cae3c83df0cbab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c61cf2f90beb096f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/actions/crm/rfqs.actions.ts:289"}, "properties": {"repobilityId": "821ffd8616f7a2be", "scanner": "scanner-primary", "fingerprint": "c61cf2f90beb096f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3851b113c12ae986", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/flow/executions/page.tsx:85"}, "properties": {"repobilityId": "eb251f9a58f1a137", "scanner": "scanner-primary", "fingerprint": "3851b113c12ae986", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7af77b2d7c1e6454", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/app/sites/[[...path]]/route.ts:72"}, "properties": {"repobilityId": "c2e59e16bf499235", "scanner": "scanner-primary", "fingerprint": "7af77b2d7c1e6454", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9803c7ade0537318", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/sabsms/analytics/aggregations.ts:345"}, "properties": {"repobilityId": "989a2e060998c42d", "scanner": "scanner-primary", "fingerprint": "9803c7ade0537318", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7adaeaaf5faf2546", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabsms/analytics/cost/page.tsx:9"}, "properties": {"repobilityId": "e718b57bf9869214", "scanner": "scanner-primary", "fingerprint": "7adaeaaf5faf2546", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c0d736ab99665694", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabsms/send/actions.ts:208"}, "properties": {"repobilityId": "fba2aa62c565f045", "scanner": "scanner-primary", "fingerprint": "c0d736ab99665694", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8d9c357ba57e57e", "level": "note", "message": {"text": "Legacy-named symbol `setDeprecated` in src/app/sabsms/templates/actions.ts:310"}, "properties": {"repobilityId": "fb336be195410da2", "scanner": "scanner-primary", "fingerprint": "c8d9c357ba57e57e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dae7046b218ff198", "level": "note", "message": {"text": "Legacy-named symbol `setDeprecated` in src/app/sabsms/templates/templates-table.tsx:58"}, "properties": {"repobilityId": "6948de5144875e94", "scanner": "scanner-primary", "fingerprint": "dae7046b218ff198", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6d2e0613bac5ba1c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabsms/templates/[id]/preview.tsx:31"}, "properties": {"repobilityId": "1ca657443dc83c74", "scanner": "scanner-primary", "fingerprint": "6d2e0613bac5ba1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3913f9b6c4801c25", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/sabsms/campaigns/actions.ts:727"}, "properties": {"repobilityId": "ee43ef6facbae115", "scanner": "scanner-primary", "fingerprint": "3913f9b6c4801c25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d4524b56fc0621b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/sabsms/campaigns/actions.ts:999"}, "properties": {"repobilityId": "30695bfb1f41fcad", "scanner": "scanner-primary", "fingerprint": "5d4524b56fc0621b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a942609688083df1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabsms/ab-tests/actions.ts:565"}, "properties": {"repobilityId": "0503cb68a405c629", "scanner": "scanner-primary", "fingerprint": "a942609688083df1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8a41d8ea5bcac91", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/sabsms/inbox/inbox-layout.tsx:226"}, "properties": {"repobilityId": "f8aeee653bd394a9", "scanner": "scanner-primary", "fingerprint": "b8a41d8ea5bcac91", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5b97d922c3740fed", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabsms/inbox/actions.ts:358"}, "properties": {"repobilityId": "bb2602eeb8b32efe", "scanner": "scanner-primary", "fingerprint": "5b97d922c3740fed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-403bbaf532248537", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/sabsms/_components/sabsms-sidebar-config.ts:27"}, "properties": {"repobilityId": "075bbe194374b9cf", "scanner": "scanner-primary", "fingerprint": "403bbaf532248537", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8de0ce8bb299d300", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/auth.ts:19"}, "properties": {"repobilityId": "c1c8b5cbe32ab955", "scanner": "scanner-primary", "fingerprint": "8de0ce8bb299d300", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a25b10b35d841bbb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/definitions.ts:20"}, "properties": {"repobilityId": "e1681bd8ceab3b7d", "scanner": "scanner-primary", "fingerprint": "a25b10b35d841bbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3b5556d6450ff33f", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/server-cache.ts:9"}, "properties": {"repobilityId": "f82b22636ee1b90b", "scanner": "scanner-primary", "fingerprint": "3b5556d6450ff33f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb8a088a75be9c9e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/webhook-processor.ts:1344"}, "properties": {"repobilityId": "045216682a35c481", "scanner": "scanner-primary", "fingerprint": "fb8a088a75be9c9e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-367a88f0c29479de", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabshop/payments.ts:92"}, "properties": {"repobilityId": "87107bd3aef2016d", "scanner": "scanner-primary", "fingerprint": "367a88f0c29479de", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f34749a04b8fce6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabshop/shipping.ts:75"}, "properties": {"repobilityId": "de186f6bb62d7b1e", "scanner": "scanner-primary", "fingerprint": "0f34749a04b8fce6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9da8e46dc5537e5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/integrations/google-calendar.ts:223"}, "properties": {"repobilityId": "b4223ce8c3216a57", "scanner": "scanner-primary", "fingerprint": "9da8e46dc5537e5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a2d1fd061122a1fa", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/integrations/imap-tickets.ts:132"}, "properties": {"repobilityId": "548bed4521bfd697", "scanner": "scanner-primary", "fingerprint": "a2d1fd061122a1fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-19c4f2a6d73aded0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/integrations/quickbooks/api.ts:68"}, "properties": {"repobilityId": "3580445f9a1e1eb1", "scanner": "scanner-primary", "fingerprint": "19c4f2a6d73aded0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b84479ccc7267c09", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/__tests__/crm-lineage-chain.smoke.test.ts:270"}, "properties": {"repobilityId": "e6a79f452c022a03", "scanner": "scanner-primary", "fingerprint": "b84479ccc7267c09", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-357e5c4f4f1dbccb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo-tools/api-client.ts:17"}, "properties": {"repobilityId": "2f90b69383309b44", "scanner": "scanner-primary", "fingerprint": "357e5c4f4f1dbccb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6068a96df711533", "level": "none", "message": {"text": "Commented-code block (13 lines) in src/lib/india-tax/e-invoice-providers.ts:205"}, "properties": {"repobilityId": "f0e5ac8e4793ff33", "scanner": "scanner-primary", "fingerprint": "c6068a96df711533", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a79171ce311375c3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/india-tax/e-invoice-providers.ts:209"}, "properties": {"repobilityId": "00f078331ba02082", "scanner": "scanner-primary", "fingerprint": "a79171ce311375c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-534f31e37954b23c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/ai/embeddings.ts:12"}, "properties": {"repobilityId": "e0097f6fc9bb0ea0", "scanner": "scanner-primary", "fingerprint": "534f31e37954b23c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b514361039c778e4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/marketplace/lifecycle.ts:70"}, "properties": {"repobilityId": "9eafb55bd23c4b66", "scanner": "scanner-primary", "fingerprint": "b514361039c778e4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-724fa7b74633b6c4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/data-fabric/sync.ts:104"}, "properties": {"repobilityId": "50727403c5f58602", "scanner": "scanner-primary", "fingerprint": "724fa7b74633b6c4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f17b60c37caf847", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api/oauth-scopes.ts:20"}, "properties": {"repobilityId": "5c2465966d39a58a", "scanner": "scanner-primary", "fingerprint": "1f17b60c37caf847", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-48e76400e1413e22", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/rust-client/wachat-features.ts:47"}, "properties": {"repobilityId": "18b266f8e8890d3c", "scanner": "scanner-primary", "fingerprint": "48e76400e1413e22", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b01281a2815fcbdd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-analytics.ts:317"}, "properties": {"repobilityId": "4bc2422abbbc8add", "scanner": "scanner-primary", "fingerprint": "b01281a2815fcbdd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-68dd958d5da61ce9", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rust-client/telegram-flows.ts:215"}, "properties": {"repobilityId": "617cdbbb08e0a89d", "scanner": "scanner-primary", "fingerprint": "68dd958d5da61ce9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d938c17953d4709", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rust-client/wachat-auto-reply-settings.ts:26"}, "properties": {"repobilityId": "0f8f0ee7459e7bfc", "scanner": "scanner-primary", "fingerprint": "0d938c17953d4709", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-64315bf8b741c7fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rust-client/telegram-auto-reply.ts:386"}, "properties": {"repobilityId": "3176f46f49b0ce99", "scanner": "scanner-primary", "fingerprint": "64315bf8b741c7fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eed36b5d3b8b58e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-stories.ts:369"}, "properties": {"repobilityId": "03a3e10c46a43d14", "scanner": "scanner-primary", "fingerprint": "eed36b5d3b8b58e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f873dd1138c83478", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rust-client/session.ts:13"}, "properties": {"repobilityId": "720f3ffc511b17b6", "scanner": "scanner-primary", "fingerprint": "f873dd1138c83478", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-91a2e2739dcc5e9f", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/rust-client/wachat-analytics.ts:145"}, "properties": {"repobilityId": "8d2a2a967033d90e", "scanner": "scanner-primary", "fingerprint": "91a2e2739dcc5e9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-58ce11e6ec37f5d9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/rust-client/wachat-number-routing.ts:22"}, "properties": {"repobilityId": "165dd3be91c8d58b", "scanner": "scanner-primary", "fingerprint": "58ce11e6ec37f5d9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c6219434c90f0b6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rust-client/wachat-facebook-messenger-profile.ts:248"}, "properties": {"repobilityId": "6eafd61526681823", "scanner": "scanner-primary", "fingerprint": "9c6219434c90f0b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a47055fcf57fb83", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-ads.ts:187"}, "properties": {"repobilityId": "0b2c276c65766ba9", "scanner": "scanner-primary", "fingerprint": "5a47055fcf57fb83", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c5e7244de41ede1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/rust-client/wachat-instagram.ts:37"}, "properties": {"repobilityId": "5bc91cce551598fb", "scanner": "scanner-primary", "fingerprint": "8c5e7244de41ede1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c816d4d200bb64f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-commands.ts:317"}, "properties": {"repobilityId": "37407237f7d230c9", "scanner": "scanner-primary", "fingerprint": "7c816d4d200bb64f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6901ef8c423367f2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/rust-client/telegram-contacts.ts:331"}, "properties": {"repobilityId": "c397e89b6a2e606a", "scanner": "scanner-primary", "fingerprint": "6901ef8c423367f2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aaf1d71878e16d91", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/telegram/bot-api.ts:44"}, "properties": {"repobilityId": "556e1893075f786c", "scanner": "scanner-primary", "fingerprint": "aaf1d71878e16d91", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c6e47e991db1516", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/wachat/ai/client.ts:73"}, "properties": {"repobilityId": "a407f0858d17247a", "scanner": "scanner-primary", "fingerprint": "8c6e47e991db1516", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dd3d4ff0c66f6c0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/n8n/nodeExecutors/whatsappExecutor.ts:70"}, "properties": {"repobilityId": "6dea746093320f53", "scanner": "scanner-primary", "fingerprint": "dd3d4ff0c66f6c0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e49f3f7cdeef0218", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsheet/connections/run.server.ts:181"}, "properties": {"repobilityId": "0bddcfbfe2aa48e4", "scanner": "scanner-primary", "fingerprint": "e49f3f7cdeef0218", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4a660bed4c348724", "level": "note", "message": {"text": "Legacy-named symbol `allowDeprecated` in src/lib/sabcrm/value-sets.ts:52"}, "properties": {"repobilityId": "360e6dd7af7feba4", "scanner": "scanner-primary", "fingerprint": "4a660bed4c348724", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b9cd3b6360ca1637", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/twenty-metadata.ts:32"}, "properties": {"repobilityId": "2a2067de7e8d187d", "scanner": "scanner-primary", "fingerprint": "b9cd3b6360ca1637", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9fc065de02e793d9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/booking.server.ts:418"}, "properties": {"repobilityId": "2528fe4aa7f1cb06", "scanner": "scanner-primary", "fingerprint": "9fc065de02e793d9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30bf279be841e35e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/records.server.ts:386"}, "properties": {"repobilityId": "fd301e0f051fb4eb", "scanner": "scanner-primary", "fingerprint": "30bf279be841e35e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa011a3ece969e71", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabcrm/ann-lsh.ts:286"}, "properties": {"repobilityId": "39f9ceabd3db3be8", "scanner": "scanner-primary", "fingerprint": "aa011a3ece969e71", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-022877730c3eaa8a", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/sabcrm/runtime.ts:553"}, "properties": {"repobilityId": "1767a6cc4802aa9b", "scanner": "scanner-primary", "fingerprint": "022877730c3eaa8a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d4391172bd6cef12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/runtime.ts:536"}, "properties": {"repobilityId": "238be761ce1f216c", "scanner": "scanner-primary", "fingerprint": "d4391172bd6cef12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b7ca2e7c40f3b2c", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabcrm/objects.server.ts:271"}, "properties": {"repobilityId": "cf6d5b65f28458fd", "scanner": "scanner-primary", "fingerprint": "8b7ca2e7c40f3b2c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c7dcdb31080e17a", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/sabcrm/scheduler.ts:1382"}, "properties": {"repobilityId": "d8208d49972ccfdf", "scanner": "scanner-primary", "fingerprint": "3c7dcdb31080e17a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cf7dc867c8445ac8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/scheduler.ts:527"}, "properties": {"repobilityId": "0b10ccd992f97b9e", "scanner": "scanner-primary", "fingerprint": "cf7dc867c8445ac8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2170b16b944d0c5b", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/sabcrm/access-enforcement.server.ts:245"}, "properties": {"repobilityId": "cfcdb0be999db154", "scanner": "scanner-primary", "fingerprint": "2170b16b944d0c5b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-73e6bb00bb9b9711", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/embeddings.server.ts:96"}, "properties": {"repobilityId": "aca6ec82f084e7f2", "scanner": "scanner-primary", "fingerprint": "73e6bb00bb9b9711", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d2cd28ba73522a46", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/ai-llm.server.ts:83"}, "properties": {"repobilityId": "e619d65494efd057", "scanner": "scanner-primary", "fingerprint": "d2cd28ba73522a46", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-76357948da0edfa2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/email-inbound.ts:241"}, "properties": {"repobilityId": "f8859f0c92796aa5", "scanner": "scanner-primary", "fingerprint": "76357948da0edfa2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6bf8c86a1b0ca13a", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/db.ts:367"}, "properties": {"repobilityId": "ab3ac9faed061f96", "scanner": "scanner-primary", "fingerprint": "6bf8c86a1b0ca13a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bf9442ec8d1f83c7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabcrm/attribution.server.ts:292"}, "properties": {"repobilityId": "ceec7079218f585e", "scanner": "scanner-primary", "fingerprint": "bf9442ec8d1f83c7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d127f018c72c79b2", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabcrm/__tests__/gate-security.test.ts:104"}, "properties": {"repobilityId": "3b86e46602ad1220", "scanner": "scanner-primary", "fingerprint": "d127f018c72c79b2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c89d37190949aa59", "level": "note", "message": {"text": "Legacy-named symbol `allowDeprecated` in src/lib/sabcrm/__tests__/value-sets.test.ts:56"}, "properties": {"repobilityId": "68b71d2320c574fc", "scanner": "scanner-primary", "fingerprint": "c89d37190949aa59", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1f7cf468ae146a09", "level": "note", "message": {"text": "Legacy-named symbol `onlyOld` in src/lib/sabcrm/__tests__/notifications.test.ts:245"}, "properties": {"repobilityId": "4ffb68e91292e63a", "scanner": "scanner-primary", "fingerprint": "1f7cf468ae146a09", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-85acea41314b8a77", "level": "note", "message": {"text": "Legacy-named symbol `RecordGqlFieldsDeprecated` in src/lib/sabcrm/shared/src/types/RecordGqlOperationGqlRecordFields.ts:1"}, "properties": {"repobilityId": "0864ae08932419b5", "scanner": "scanner-primary", "fingerprint": "85acea41314b8a77", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fea1c2acb1e4afe6", "level": "note", "message": {"text": "Legacy-named symbol `RecordGqlFieldsDeprecated` in src/lib/sabcrm/shared/src/types/RecordGqlFieldsDeprecated.ts:4"}, "properties": {"repobilityId": "d152fb38e9288189", "scanner": "scanner-primary", "fingerprint": "fea1c2acb1e4afe6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ea9f34da2c43c394", "level": "note", "message": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/types/StepFilters.ts:1"}, "properties": {"repobilityId": "48ecb3b6f7188f4b", "scanner": "scanner-primary", "fingerprint": "ea9f34da2c43c394", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2c180d70949e724f", "level": "note", "message": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/types/ViewFilterOperandDeprecated.ts:1"}, "properties": {"repobilityId": "f6ae1fe22170e058", "scanner": "scanner-primary", "fingerprint": "2c180d70949e724f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7d17f68aa0113689", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabcrm/shared/src/constants/ObjectsWithChannelVisibilityConstraints.ts:1"}, "properties": {"repobilityId": "b4cc8ecd1c9612e0", "scanner": "scanner-primary", "fingerprint": "7d17f68aa0113689", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2486f1ff7d1b8cf5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/shared/src/utils/applyDiff.ts:1"}, "properties": {"repobilityId": "fa87c333527be281", "scanner": "scanner-primary", "fingerprint": "2486f1ff7d1b8cf5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1decabdb928c0361", "level": "note", "message": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/utils/filter/utils/convert-view-filter-operand-to-core-operand.util.ts:2"}, "properties": {"repobilityId": "2f35b8e28c384d5b", "scanner": "scanner-primary", "fingerprint": "1decabdb928c0361", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-971d2a1738c21ee9", "level": "note", "message": {"text": "Legacy-named symbol `ViewFilterOperandDeprecated` in src/lib/sabcrm/shared/src/workflow/schemas/step-filter-schema.ts:3"}, "properties": {"repobilityId": "c65abfce4e0bd6be", "scanner": "scanner-primary", "fingerprint": "971d2a1738c21ee9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ae5b108c31cecb73", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabcrm/shared/src/application/workflowActionTriggerSettingsType.ts:3"}, "properties": {"repobilityId": "86f73b720ba51563", "scanner": "scanner-primary", "fingerprint": "ae5b108c31cecb73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13efaaaf0e0079e0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabcrm/shared/src/application/appConnectionType.ts:21"}, "properties": {"repobilityId": "72b914f0e07346b6", "scanner": "scanner-primary", "fingerprint": "13efaaaf0e0079e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-708489b3ce43fca5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/identity/sso.ts:211"}, "properties": {"repobilityId": "a866b1cb770edd43", "scanner": "scanner-primary", "fingerprint": "708489b3ce43fca5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ca65556c0397b52", "level": "note", "message": {"text": "Legacy-named symbol `wayOld` in src/lib/identity/__tests__/totp.test.ts:73"}, "properties": {"repobilityId": "ece0deb13d0b2304", "scanner": "scanner-primary", "fingerprint": "5ca65556c0397b52", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c56bb77853461f51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/billing/connect.ts:63"}, "properties": {"repobilityId": "4087cfdd75813fec", "scanner": "scanner-primary", "fingerprint": "c56bb77853461f51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5e3989009cba5cd", "level": "note", "message": {"text": "Legacy-named symbol `credit_unused_old` in src/lib/billing/proration.ts:8"}, "properties": {"repobilityId": "bad28aac39dd063d", "scanner": "scanner-primary", "fingerprint": "d5e3989009cba5cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-acf1cc8502fc5ebf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/ai.ts:44"}, "properties": {"repobilityId": "c62c49937efdcac8", "scanner": "scanner-primary", "fingerprint": "acf1cc8502fc5ebf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f215058e77a0d19", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabmail/hosted-provider.ts:61"}, "properties": {"repobilityId": "45ce0c1aac6817d9", "scanner": "scanner-primary", "fingerprint": "8f215058e77a0d19", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-054a29f0128f5b58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/hosted-provider.ts:8"}, "properties": {"repobilityId": "78e1b45caef63986", "scanner": "scanner-primary", "fingerprint": "054a29f0128f5b58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bbc79c092f3c2e2e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/oauth.ts:182"}, "properties": {"repobilityId": "b15f4610c37733b8", "scanner": "scanner-primary", "fingerprint": "bbc79c092f3c2e2e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-684cbe30fd5e7309", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/engine-client.ts:6"}, "properties": {"repobilityId": "99828269f8d649b6", "scanner": "scanner-primary", "fingerprint": "684cbe30fd5e7309", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0d802568f6d7e38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabmail/providers/imap.ts:288"}, "properties": {"repobilityId": "3c1dc43c9c0c24bc", "scanner": "scanner-primary", "fingerprint": "d0d802568f6d7e38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5773cbcc1e1b328", "level": "note", "message": {"text": "Legacy-named symbol `gmail_v1` in src/lib/sabmail/providers/gmail.ts:3"}, "properties": {"repobilityId": "32b943d6d5ba438c", "scanner": "scanner-primary", "fingerprint": "b5773cbcc1e1b328", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a9c1804b4a49a1d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabmail/providers/graph.ts:579"}, "properties": {"repobilityId": "b09ba0b0f7606475", "scanner": "scanner-primary", "fingerprint": "a9c1804b4a49a1d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-61b7deed55f062b8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabmail/providers/types.ts:169"}, "properties": {"repobilityId": "759d575f5aa06601", "scanner": "scanner-primary", "fingerprint": "61b7deed55f062b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ba52d391e5b6ed2d", "level": "note", "message": {"text": "Legacy-named symbol `last_copy` in src/lib/agents/agents/copywriter.ts:31"}, "properties": {"repobilityId": "9900c4e736080249", "scanner": "scanner-primary", "fingerprint": "ba52d391e5b6ed2d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-98ebd799521ec82e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsign/pdf/sabfiles-io.ts:19"}, "properties": {"repobilityId": "d7f0565055215b78", "scanner": "scanner-primary", "fingerprint": "98ebd799521ec82e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9164628f4771216b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/api-platform/sample-builder.ts:99"}, "properties": {"repobilityId": "283796e46f3f1aac", "scanner": "scanner-primary", "fingerprint": "9164628f4771216b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2fa47e86f3f5a2d1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/api-platform/__tests__/server-only-shim.cjs:1"}, "properties": {"repobilityId": "3853596226c369a9", "scanner": "scanner-primary", "fingerprint": "2fa47e86f3f5a2d1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-66fd55a157f34072", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/app-presets/client.ts:50"}, "properties": {"repobilityId": "1592575bfbb14fe8", "scanner": "scanner-primary", "fingerprint": "66fd55a157f34072", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f7875fb8e76c90b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/nocodb.ts:33"}, "properties": {"repobilityId": "5893e17218fb7981", "scanner": "scanner-primary", "fingerprint": "3f7875fb8e76c90b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff6c3642b74e6259", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/openAi.ts:23"}, "properties": {"repobilityId": "d36f80fbe704259c", "scanner": "scanner-primary", "fingerprint": "ff6c3642b74e6259", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-704fdde0085e7306", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/calCom.ts:29"}, "properties": {"repobilityId": "31ecaa5491ecf4fd", "scanner": "scanner-primary", "fingerprint": "704fdde0085e7306", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f170b42d49bc9f51", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/anthropicAi.ts:23"}, "properties": {"repobilityId": "d37fe0839103d7b9", "scanner": "scanner-primary", "fingerprint": "f170b42d49bc9f51", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-44c1fc79a9abcba9", "level": "note", "message": {"text": "Legacy-named symbol `eleven_monolingual_v1` in src/lib/sabflow/integrations/elevenlabs.ts:14"}, "properties": {"repobilityId": "f41ce679731cddda", "scanner": "scanner-primary", "fingerprint": "44c1fc79a9abcba9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-614d8a0753cc130f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/integrations/googleSheets.ts:29"}, "properties": {"repobilityId": "fbef35c8e6c03d8d", "scanner": "scanner-primary", "fingerprint": "614d8a0753cc130f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-907bafc75239ff43", "level": "none", "message": {"text": "Commented-code block (14 lines) in src/lib/sabflow/__tests__/crdt-fuzz.test.ts:125"}, "properties": {"repobilityId": "44e9c6a3c2316730", "scanner": "scanner-primary", "fingerprint": "907bafc75239ff43", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a976a39e0f4194c4", "level": "note", "message": {"text": "Legacy-named symbol `set_v1` in src/lib/sabflow/forge/index.ts:604"}, "properties": {"repobilityId": "347bfac42d6115ea", "scanner": "scanner-primary", "fingerprint": "a976a39e0f4194c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-53cb6a19a1c8b163", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/forge/helpers.ts:252"}, "properties": {"repobilityId": "abdc002f7483102e", "scanner": "scanner-primary", "fingerprint": "53cb6a19a1c8b163", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-15ef0057ec3d7d9a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/helpers.ts:8"}, "properties": {"repobilityId": "41ec3740825611e3", "scanner": "scanner-primary", "fingerprint": "15ef0057ec3d7d9a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8d37292051f7cb01", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/metadata-client.ts:28"}, "properties": {"repobilityId": "4ea3da8b48317f95", "scanner": "scanner-primary", "fingerprint": "8d37292051f7cb01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-956eebf0701c4311", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/types.ts:254"}, "properties": {"repobilityId": "3cdc2e533d4b256d", "scanner": "scanner-primary", "fingerprint": "956eebf0701c4311", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bcffc737a09b302f", "level": "note", "message": {"text": "Legacy-named symbol `forge_test_legacy` in src/lib/sabflow/forge/__tests__/multi-output.test.ts:63"}, "properties": {"repobilityId": "3a2b9857f37c3d25", "scanner": "scanner-primary", "fingerprint": "bcffc737a09b302f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3cf2f24173dfdefd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/forge/blocks/agent-tool.ts:79"}, "properties": {"repobilityId": "e41d5fc057504995", "scanner": "scanner-primary", "fingerprint": "3cf2f24173dfdefd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-041447bc4edbfe3c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/sendgrid.ts:59"}, "properties": {"repobilityId": "31634d29749b6d71", "scanner": "scanner-primary", "fingerprint": "041447bc4edbfe3c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6a75f0b386390178", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_openai_tts.ts:25"}, "properties": {"repobilityId": "ac72ca2d2fcf8ab4", "scanner": "scanner-primary", "fingerprint": "6a75f0b386390178", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d5b8537d707deb4", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/sabflow/forge/blocks/n8n/mass_f/audio_elevenlabs_tts.ts:21"}, "properties": {"repobilityId": "bdccd59680f0982d", "scanner": "scanner-primary", "fingerprint": "0d5b8537d707deb4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-62230f6f45f03cb7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_elevenlabs_tts.ts:27"}, "properties": {"repobilityId": "3551b23da36c118c", "scanner": "scanner-primary", "fingerprint": "62230f6f45f03cb7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9238b3a82f3631bb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/audio_whisper.ts:26"}, "properties": {"repobilityId": "016d765e825a488e", "scanner": "scanner-primary", "fingerprint": "9238b3a82f3631bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-353c3d0e30e77d0b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_f/image_stable_diffusion.ts:33"}, "properties": {"repobilityId": "a03ffa8519b14db2", "scanner": "scanner-primary", "fingerprint": "353c3d0e30e77d0b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ce8ebdcc1a71ca79", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/ai/openai_ext.ts:157"}, "properties": {"repobilityId": "0de07057220391df", "scanner": "scanner-primary", "fingerprint": "ce8ebdcc1a71ca79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3e2682e10cfb9355", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/ai/mindee.ts:44"}, "properties": {"repobilityId": "ef019c7b179c8017", "scanner": "scanner-primary", "fingerprint": "3e2682e10cfb9355", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-303c61c5f01b00c4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_binary_files.ts:104"}, "properties": {"repobilityId": "47b930a0016b9db2", "scanner": "scanner-primary", "fingerprint": "303c61c5f01b00c4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e1f502d8d8263ec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_write_file.ts:80"}, "properties": {"repobilityId": "ece96782ef264227", "scanner": "scanner-primary", "fingerprint": "1e1f502d8d8263ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d767349407f8edf1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/write_binary_file.ts:171"}, "properties": {"repobilityId": "b99396a5c16eef71", "scanner": "scanner-primary", "fingerprint": "d767349407f8edf1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d50da1ca2f75bc42", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/spreadsheet_file.ts:92"}, "properties": {"repobilityId": "cc8db6d8e63261b8", "scanner": "scanner-primary", "fingerprint": "d50da1ca2f75bc42", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc21646cfdb507a5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/binary_ops/read_binary_file.ts:67"}, "properties": {"repobilityId": "99b614102599adf1", "scanner": "scanner-primary", "fingerprint": "dc21646cfdb507a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dbd18d8c730ee268", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/forge/blocks/n8n/generic/if.ts:54"}, "properties": {"repobilityId": "27dee1d50daecc0a", "scanner": "scanner-primary", "fingerprint": "dbd18d8c730ee268", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-980654cc19fd61d5", "level": "note", "message": {"text": "Legacy-named symbol `forge_set_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/set_v1.ts:6"}, "properties": {"repobilityId": "29cdc52f038c2d46", "scanner": "scanner-primary", "fingerprint": "980654cc19fd61d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e28436f54c8a9be", "level": "note", "message": {"text": "Legacy-named symbol `forge_set_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/set_v2.ts:6"}, "properties": {"repobilityId": "f74bfc4e9f3af9ae", "scanner": "scanner-primary", "fingerprint": "5e28436f54c8a9be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6b2510a5b494d04a", "level": "note", "message": {"text": "Legacy-named symbol `forge_switch_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/switch_v1.ts:6"}, "properties": {"repobilityId": "473b4d39b31d44b4", "scanner": "scanner-primary", "fingerprint": "6b2510a5b494d04a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d1587e0a01552029", "level": "note", "message": {"text": "Legacy-named symbol `forge_filter_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/filter_v1.ts:6"}, "properties": {"repobilityId": "abfcb0442efd9fb0", "scanner": "scanner-primary", "fingerprint": "d1587e0a01552029", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e238f7d4b50d279d", "level": "note", "message": {"text": "Legacy-named symbol `forge_switch_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/switch_v2.ts:6"}, "properties": {"repobilityId": "f2e9aaca5066b831", "scanner": "scanner-primary", "fingerprint": "e238f7d4b50d279d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-af758c18d28b4cee", "level": "note", "message": {"text": "Legacy-named symbol `forge_merge_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/merge_v2.ts:6"}, "properties": {"repobilityId": "0d28ba698855b189", "scanner": "scanner-primary", "fingerprint": "af758c18d28b4cee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-698f4346b4312cf8", "level": "note", "message": {"text": "Legacy-named symbol `forge_merge_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/merge_v1.ts:6"}, "properties": {"repobilityId": "fdaaadc1a6900039", "scanner": "scanner-primary", "fingerprint": "698f4346b4312cf8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d1e8b0a81d3a5e9f", "level": "note", "message": {"text": "Legacy-named symbol `forge_http_request_v2` in src/lib/sabflow/forge/blocks/n8n/variants_utility/http_request_v2.ts:6"}, "properties": {"repobilityId": "166e79ded29da45a", "scanner": "scanner-primary", "fingerprint": "d1e8b0a81d3a5e9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-949612332f6c88dd", "level": "note", "message": {"text": "Legacy-named symbol `forge_if_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/if_v1.ts:6"}, "properties": {"repobilityId": "4371432113f97ffc", "scanner": "scanner-primary", "fingerprint": "949612332f6c88dd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-206318d1e376d4df", "level": "note", "message": {"text": "Legacy-named symbol `forge_http_request_v1` in src/lib/sabflow/forge/blocks/n8n/variants_utility/http_request_v1.ts:6"}, "properties": {"repobilityId": "6b0549db5f6e6d1c", "scanner": "scanner-primary", "fingerprint": "206318d1e376d4df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-97c7ab5e771ebfc0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/mass_h/sdxl.ts:36"}, "properties": {"repobilityId": "6799feba2de1b2ad", "scanner": "scanner-primary", "fingerprint": "97c7ab5e771ebfc0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-524d6341727c80b2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/triggers_as_actions/email_read_imap.ts:95"}, "properties": {"repobilityId": "f7bd6024eada5be5", "scanner": "scanner-primary", "fingerprint": "524d6341727c80b2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9d16ee9563b317c3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/crm/zoho_crm.ts:17"}, "properties": {"repobilityId": "655433b10a807131", "scanner": "scanner-primary", "fingerprint": "9d16ee9563b317c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e8634bd9bfd352dc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/devops/jenkins.ts:14"}, "properties": {"repobilityId": "5d17a4e5a66af6a7", "scanner": "scanner-primary", "fingerprint": "e8634bd9bfd352dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6bc8f389bda83178", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/tools/quickchart.ts:81"}, "properties": {"repobilityId": "58f7894be01a4dd3", "scanner": "scanner-primary", "fingerprint": "6bc8f389bda83178", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67defc61771ae2e1", "level": "note", "message": {"text": "Legacy-named symbol `forge_gmail_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/gmail_v1.ts:6"}, "properties": {"repobilityId": "e4fe3c8d0ecfb15e", "scanner": "scanner-primary", "fingerprint": "67defc61771ae2e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aa0b524b110fbf22", "level": "note", "message": {"text": "Legacy-named symbol `forge_hubspot_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/hubspot_v2.ts:6"}, "properties": {"repobilityId": "29677d33210e6e33", "scanner": "scanner-primary", "fingerprint": "aa0b524b110fbf22", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f20586bbcd7e912d", "level": "note", "message": {"text": "Legacy-named symbol `forge_emailimap_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/emailimap_v2.ts:6"}, "properties": {"repobilityId": "71fd7ae08b14f89a", "scanner": "scanner-primary", "fingerprint": "f20586bbcd7e912d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a32266f271efb9e3", "level": "note", "message": {"text": "Legacy-named symbol `forge_notion_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/notion_v2.ts:6"}, "properties": {"repobilityId": "66b4029d007683ea", "scanner": "scanner-primary", "fingerprint": "a32266f271efb9e3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e098f9dfc12d3e8a", "level": "note", "message": {"text": "Legacy-named symbol `forge_todoist_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/todoist_v1.ts:6"}, "properties": {"repobilityId": "afb9a400ce2add38", "scanner": "scanner-primary", "fingerprint": "e098f9dfc12d3e8a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-232b14ac8e215543", "level": "note", "message": {"text": "Legacy-named symbol `forge_highlevel_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/highlevel_v2.ts:6"}, "properties": {"repobilityId": "c8492958de1167db", "scanner": "scanner-primary", "fingerprint": "232b14ac8e215543", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5f6c122152726d79", "level": "note", "message": {"text": "Legacy-named symbol `forge_seatable_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/seatable_v2.ts:6"}, "properties": {"repobilityId": "29d66b02cb6cf872", "scanner": "scanner-primary", "fingerprint": "5f6c122152726d79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-797103552c2af4ce", "level": "note", "message": {"text": "Legacy-named symbol `forge_mailerlite_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/mailerlite_v2.ts:6"}, "properties": {"repobilityId": "4c9f27eed81b50da", "scanner": "scanner-primary", "fingerprint": "797103552c2af4ce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b9a5e5dd8c5c834b", "level": "note", "message": {"text": "Legacy-named symbol `forge_syncromsp_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/syncromsp_v1.ts:6"}, "properties": {"repobilityId": "4ef96f9a28b2e74b", "scanner": "scanner-primary", "fingerprint": "b9a5e5dd8c5c834b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5b1d3ec286509eec", "level": "note", "message": {"text": "Legacy-named symbol `forge_highlevel_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/highlevel_v1.ts:6"}, "properties": {"repobilityId": "1baaab30b409c250", "scanner": "scanner-primary", "fingerprint": "5b1d3ec286509eec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e081099c70d386a7", "level": "note", "message": {"text": "Legacy-named symbol `forge_airtable_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/airtable_v2.ts:6"}, "properties": {"repobilityId": "f58ebdfad1497c1e", "scanner": "scanner-primary", "fingerprint": "e081099c70d386a7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1ffa992dd0257b4c", "level": "note", "message": {"text": "Legacy-named symbol `forge_pipedrive_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/pipedrive_v2.ts:6"}, "properties": {"repobilityId": "102af6589daa057f", "scanner": "scanner-primary", "fingerprint": "1ffa992dd0257b4c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-078a4672dfc2e1ba", "level": "note", "message": {"text": "Legacy-named symbol `forge_todoist_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/todoist_v2.ts:6"}, "properties": {"repobilityId": "5c02d768aabe5be6", "scanner": "scanner-primary", "fingerprint": "078a4672dfc2e1ba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-df8b98295b13027c", "level": "note", "message": {"text": "Legacy-named symbol `forge_bamboohr_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/bamboohr_v1.ts:6"}, "properties": {"repobilityId": "7e899bc509af8a82", "scanner": "scanner-primary", "fingerprint": "df8b98295b13027c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d97b3d73a98cbe57", "level": "note", "message": {"text": "Legacy-named symbol `forge_emailimap_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/emailimap_v1.ts:6"}, "properties": {"repobilityId": "fa6a6d63b7f38fac", "scanner": "scanner-primary", "fingerprint": "d97b3d73a98cbe57", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8876ec8c14703136", "level": "note", "message": {"text": "Legacy-named symbol `forge_discord_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/discord_v2.ts:6"}, "properties": {"repobilityId": "6cd7d49c2c58a90f", "scanner": "scanner-primary", "fingerprint": "8876ec8c14703136", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f9147bd0c6b90fe9", "level": "note", "message": {"text": "Legacy-named symbol `forge_lemlist_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/lemlist_v2.ts:6"}, "properties": {"repobilityId": "11c07da72d237443", "scanner": "scanner-primary", "fingerprint": "f9147bd0c6b90fe9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e29dc013732f0274", "level": "note", "message": {"text": "Legacy-named symbol `forge_seatable_v1` in src/lib/sabflow/forge/blocks/n8n/mass_b/seatable_v1.ts:6"}, "properties": {"repobilityId": "5c8c381c9b78af54", "scanner": "scanner-primary", "fingerprint": "e29dc013732f0274", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-15ab60169abb6fce", "level": "note", "message": {"text": "Legacy-named symbol `forge_webflow_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/webflow_v2.ts:6"}, "properties": {"repobilityId": "460586e1eb498915", "scanner": "scanner-primary", "fingerprint": "15ab60169abb6fce", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-66aae6f96763deec", "level": "note", "message": {"text": "Legacy-named symbol `forge_splunk_v2` in src/lib/sabflow/forge/blocks/n8n/mass_b/splunk_v2.ts:6"}, "properties": {"repobilityId": "9b041840d8ef0b40", "scanner": "scanner-primary", "fingerprint": "66aae6f96763deec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6a2258ab174e4ae1", "level": "note", "message": {"text": "Legacy-named symbol `forge_airtable_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/airtable_v1.ts:6"}, "properties": {"repobilityId": "4b0ecd06754e4409", "scanner": "scanner-primary", "fingerprint": "6a2258ab174e4ae1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bceeaa840bf0e6db", "level": "note", "message": {"text": "Legacy-named symbol `forge_notion_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/notion_v1.ts:6"}, "properties": {"repobilityId": "4cca1a093012e847", "scanner": "scanner-primary", "fingerprint": "bceeaa840bf0e6db", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-da026df8e2aa4536", "level": "note", "message": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/slack_v1.ts:6"}, "properties": {"repobilityId": "7be0af5fc2ff60b6", "scanner": "scanner-primary", "fingerprint": "da026df8e2aa4536", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9150cb2793afa7b0", "level": "note", "message": {"text": "Legacy-named symbol `forge_twitter_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/twitter_v1.ts:6"}, "properties": {"repobilityId": "987e6eb8452fb700", "scanner": "scanner-primary", "fingerprint": "9150cb2793afa7b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3bc7b859b36608e9", "level": "note", "message": {"text": "Legacy-named symbol `forge_hubspot_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/hubspot_v1.ts:6"}, "properties": {"repobilityId": "4d6a94fc9351c34f", "scanner": "scanner-primary", "fingerprint": "3bc7b859b36608e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-36dc287bc81a884b", "level": "note", "message": {"text": "Legacy-named symbol `forge_discord_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/discord_v1.ts:6"}, "properties": {"repobilityId": "7269e57b5b52ddda", "scanner": "scanner-primary", "fingerprint": "36dc287bc81a884b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-51da85ee2e41ae20", "level": "note", "message": {"text": "Legacy-named symbol `forge_pipedrive_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/pipedrive_v1.ts:6"}, "properties": {"repobilityId": "4b91c80c35e9fbc5", "scanner": "scanner-primary", "fingerprint": "51da85ee2e41ae20", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0170733e6b312160", "level": "note", "message": {"text": "Legacy-named symbol `forge_mattermost_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/mattermost_v1.ts:6"}, "properties": {"repobilityId": "0d3097c4b9a1e426", "scanner": "scanner-primary", "fingerprint": "0170733e6b312160", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ff02efe965d12407", "level": "note", "message": {"text": "Legacy-named symbol `forge_splunk_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/splunk_v1.ts:6"}, "properties": {"repobilityId": "c965f80304ed03fa", "scanner": "scanner-primary", "fingerprint": "ff02efe965d12407", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c03333f31e2e3b3c", "level": "note", "message": {"text": "Legacy-named symbol `forge_lemlist_v1` in src/lib/sabflow/forge/blocks/n8n/variants_service/lemlist_v1.ts:6"}, "properties": {"repobilityId": "82583ba56269fd37", "scanner": "scanner-primary", "fingerprint": "c03333f31e2e3b3c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cd8ff8c79f737fd7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/utilities/edit_image.ts:75"}, "properties": {"repobilityId": "b55d2da9fb5075db", "scanner": "scanner-primary", "fingerprint": "cd8ff8c79f737fd7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bec7f4c2397665df", "level": "note", "message": {"text": "Legacy-named symbol `forge_lm_ollama_legacy` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_ollama_legacy.ts:44"}, "properties": {"repobilityId": "9c7ef58146c5cbf7", "scanner": "scanner-primary", "fingerprint": "bec7f4c2397665df", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-541beb3890a449f7", "level": "note", "message": {"text": "Legacy-named symbol `chatcompletion_v2` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_chat_minimax.ts:4"}, "properties": {"repobilityId": "8f113638eb1d8d45", "scanner": "scanner-primary", "fingerprint": "541beb3890a449f7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-85a51c43c6f366d6", "level": "note", "message": {"text": "Legacy-named symbol `forge_lm_openai_legacy` in src/lib/sabflow/forge/blocks/n8n/gap_a/lm_openai_legacy.ts:39"}, "properties": {"repobilityId": "51b0a1d26a0a5240", "scanner": "scanner-primary", "fingerprint": "85a51c43c6f366d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e8c1a9f0f776a38", "level": "note", "message": {"text": "Legacy-named symbol `forge_filter_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/filter_v2.ts:14"}, "properties": {"repobilityId": "d5d224e524478622", "scanner": "scanner-primary", "fingerprint": "5e8c1a9f0f776a38", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-309333d384dadb3a", "level": "note", "message": {"text": "Legacy-named symbol `forge_datetime_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/datetime_v2.ts:14"}, "properties": {"repobilityId": "595412f39a5d51cc", "scanner": "scanner-primary", "fingerprint": "309333d384dadb3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-25c54dd36aea4e59", "level": "note", "message": {"text": "Legacy-named symbol `forge_emailsend_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/emailsend_v2.ts:14"}, "properties": {"repobilityId": "4afc1ed56471bba3", "scanner": "scanner-primary", "fingerprint": "25c54dd36aea4e59", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ba7ae7fa277d04dc", "level": "note", "message": {"text": "Legacy-named symbol `forge_if_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/if_v2.ts:14"}, "properties": {"repobilityId": "ea2014b0cdef549c", "scanner": "scanner-primary", "fingerprint": "ba7ae7fa277d04dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7c4949e6461b3b70", "level": "note", "message": {"text": "Legacy-named symbol `forge_emailsend_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/emailsend_v1.ts:14"}, "properties": {"repobilityId": "1670221eb5ed75bb", "scanner": "scanner-primary", "fingerprint": "7c4949e6461b3b70", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8502847389e8bb0a", "level": "note", "message": {"text": "Legacy-named symbol `forge_datetime_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/datetime_v1.ts:14"}, "properties": {"repobilityId": "03a3aa6480915f9e", "scanner": "scanner-primary", "fingerprint": "8502847389e8bb0a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e85e0372f1c1d9f", "level": "note", "message": {"text": "Legacy-named symbol `forge_itemlists_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/itemlists_v1.ts:14"}, "properties": {"repobilityId": "803e008e5cff8c19", "scanner": "scanner-primary", "fingerprint": "5e85e0372f1c1d9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-683b1d2623ddf3ad", "level": "note", "message": {"text": "Legacy-named symbol `forge_splitinbatches_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/splitinbatches_v1.ts:14"}, "properties": {"repobilityId": "368b98600a7a0ae2", "scanner": "scanner-primary", "fingerprint": "683b1d2623ddf3ad", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8547abe6e2163afd", "level": "note", "message": {"text": "Legacy-named symbol `forge_splitinbatches_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/splitinbatches_v2.ts:14"}, "properties": {"repobilityId": "11e5a1c5fdd1d32f", "scanner": "scanner-primary", "fingerprint": "8547abe6e2163afd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-11b685cec2d33722", "level": "note", "message": {"text": "Legacy-named symbol `forge_crypto_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/crypto_v2.ts:14"}, "properties": {"repobilityId": "44cc760431479289", "scanner": "scanner-primary", "fingerprint": "11b685cec2d33722", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e8e2cf18d1238500", "level": "note", "message": {"text": "Legacy-named symbol `forge_removeduplicates_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/removeduplicates_v1.ts:14"}, "properties": {"repobilityId": "98e7eacf49e30a94", "scanner": "scanner-primary", "fingerprint": "e8e2cf18d1238500", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8d74e5c4ca3bbba2", "level": "note", "message": {"text": "Legacy-named symbol `forge_spreadsheetfile_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/spreadsheetfile_v1.ts:14"}, "properties": {"repobilityId": "d96bc0a8ea3b765a", "scanner": "scanner-primary", "fingerprint": "8d74e5c4ca3bbba2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e372f39f2b851095", "level": "note", "message": {"text": "Legacy-named symbol `forge_itemlists_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/itemlists_v2.ts:14"}, "properties": {"repobilityId": "7038d4ae731ed191", "scanner": "scanner-primary", "fingerprint": "e372f39f2b851095", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0d95ce3ffdcdb897", "level": "note", "message": {"text": "Legacy-named symbol `forge_crypto_v1` in src/lib/sabflow/forge/blocks/n8n/mass_a/crypto_v1.ts:14"}, "properties": {"repobilityId": "52f3065af8a3c44f", "scanner": "scanner-primary", "fingerprint": "0d95ce3ffdcdb897", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a0f6758d10ab6d6f", "level": "note", "message": {"text": "Legacy-named symbol `forge_removeduplicates_v2` in src/lib/sabflow/forge/blocks/n8n/mass_a/removeduplicates_v2.ts:14"}, "properties": {"repobilityId": "32c30178476a89aa", "scanner": "scanner-primary", "fingerprint": "a0f6758d10ab6d6f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f7549591f1ba628e", "level": "note", "message": {"text": "Legacy-named symbol `run_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/function_legacy.ts:14"}, "properties": {"repobilityId": "60a394ff1f34eadb", "scanner": "scanner-primary", "fingerprint": "f7549591f1ba628e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3482175c6d02c3be", "level": "note", "message": {"text": "Legacy-named symbol `transform_v1` in src/lib/sabflow/forge/blocks/n8n/deprecated/ai_transform_v1.ts:21"}, "properties": {"repobilityId": "e8baf4c98fccaa73", "scanner": "scanner-primary", "fingerprint": "3482175c6d02c3be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a00460bd54258f8b", "level": "note", "message": {"text": "Legacy-named symbol `forge_function_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/legacy_variants_info.ts:74"}, "properties": {"repobilityId": "2a6bb3501d7bd1b8", "scanner": "scanner-primary", "fingerprint": "a00460bd54258f8b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-544db170b6554e80", "level": "note", "message": {"text": "Legacy-named symbol `forge_function_item_legacy` in src/lib/sabflow/forge/blocks/n8n/deprecated/function_item_legacy.ts:78"}, "properties": {"repobilityId": "0b3cb2ad7631d603", "scanner": "scanner-primary", "fingerprint": "544db170b6554e80", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f3d9a865789d6025", "level": "note", "message": {"text": "Legacy-named symbol `forge_ms_outlook_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_outlook_v1.ts:87"}, "properties": {"repobilityId": "d26268a4fee3fc3b", "scanner": "scanner-primary", "fingerprint": "f3d9a865789d6025", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2f22635c3b14ad18", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/forge/blocks/n8n/mass_c/mailchimp_ext.ts:84"}, "properties": {"repobilityId": "a7c2ed75973fae19", "scanner": "scanner-primary", "fingerprint": "2f22635c3b14ad18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a072c3f1b965ec45", "level": "note", "message": {"text": "Legacy-named symbol `forge_ms_teams_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_teams_v1.ts:64"}, "properties": {"repobilityId": "aede58b9841581e9", "scanner": "scanner-primary", "fingerprint": "a072c3f1b965ec45", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d7b09a822b3130f5", "level": "note", "message": {"text": "Legacy-named symbol `forge_ms_excel_v1` in src/lib/sabflow/forge/blocks/n8n/mass_c/ms_excel_v1.ts:76"}, "properties": {"repobilityId": "dc718451ce0a46de", "scanner": "scanner-primary", "fingerprint": "d7b09a822b3130f5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fd092146e748264c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/storage/nextcloud.ts:95"}, "properties": {"repobilityId": "1990d255a733b439", "scanner": "scanner-primary", "fingerprint": "fd092146e748264c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-03a38f15f940e83a", "level": "note", "message": {"text": "Legacy-named symbol `create_folder_v2` in src/lib/sabflow/forge/blocks/n8n/storage/dropbox.ts:12"}, "properties": {"repobilityId": "f2ba0fb6881ed18a", "scanner": "scanner-primary", "fingerprint": "03a38f15f940e83a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cbed4881ce8c7da5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/forge/blocks/n8n/_shared/http.ts:46"}, "properties": {"repobilityId": "556d01d34454fd4e", "scanner": "scanner-primary", "fingerprint": "cbed4881ce8c7da5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b4fcbac20a9635f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/client/telemetry.ts:246"}, "properties": {"repobilityId": "920bd664b6482280", "scanner": "scanner-primary", "fingerprint": "3b4fcbac20a9635f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b88c3ddb946ea6c7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabflow/client/usePresence.ts:249"}, "properties": {"repobilityId": "babac9d96eba55ab", "scanner": "scanner-primary", "fingerprint": "b88c3ddb946ea6c7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dda6e3ef0d131b2b", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/sabflow/client/optimistic.ts:366"}, "properties": {"repobilityId": "0c4bdd7fed71fa88", "scanner": "scanner-primary", "fingerprint": "dda6e3ef0d131b2b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0fc509cd517bfd47", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabflow/client/schema-migrate.ts:98"}, "properties": {"repobilityId": "c04f55c98216fe28", "scanner": "scanner-primary", "fingerprint": "0fc509cd517bfd47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6515c2543ec10bc4", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/client/SabFlowProvider.tsx:44"}, "properties": {"repobilityId": "9ab0ff61968ea0b6", "scanner": "scanner-primary", "fingerprint": "6515c2543ec10bc4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f926abff86419087", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/triggers/replay.ts:361"}, "properties": {"repobilityId": "6379fa8910cd5f06", "scanner": "scanner-primary", "fingerprint": "f926abff86419087", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dae9130734d17ba3", "level": "note", "message": {"text": "Legacy-named symbol `launch_announce_v2` in src/lib/sabflow/docs/samplePayloads.ts:97"}, "properties": {"repobilityId": "ba63f4fda8e90bc1", "scanner": "scanner-primary", "fingerprint": "dae9130734d17ba3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-adf74ab58218271b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/from-ai-parse-utils.ts:435"}, "properties": {"repobilityId": "31ff1af1a783366a", "scanner": "scanner-primary", "fingerprint": "adf74ab58218271b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bfa6544a3d5945b6", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabflow/n8n/expression.ts:2"}, "properties": {"repobilityId": "952742df2571c1c7", "scanner": "scanner-primary", "fingerprint": "bfa6544a3d5945b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfa9833cb842d3fb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/expression-runner.ts:262"}, "properties": {"repobilityId": "f7c0f8a289e17de7", "scanner": "scanner-primary", "fingerprint": "cfa9833cb842d3fb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddf29974bbd37fdf", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/internal/config-stub.d.ts:43"}, "properties": {"repobilityId": "db160dce71db02ce", "scanner": "scanner-primary", "fingerprint": "ddf29974bbd37fdf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed6f0a68211de384", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/date-extensions.ts:1"}, "properties": {"repobilityId": "33f5f8f4a3980307", "scanner": "scanner-primary", "fingerprint": "ed6f0a68211de384", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e5b0bd7e716c881", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/array-extensions.ts:1"}, "properties": {"repobilityId": "0326a38b29a32cc4", "scanner": "scanner-primary", "fingerprint": "0e5b0bd7e716c881", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-776b245c88f2f87b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/utils.ts:1"}, "properties": {"repobilityId": "4fff1f0b5babed9a", "scanner": "scanner-primary", "fingerprint": "776b245c88f2f87b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-701ddf9ecc89f951", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/boolean-extensions.ts:1"}, "properties": {"repobilityId": "8e5ddba89d9d5b62", "scanner": "scanner-primary", "fingerprint": "701ddf9ecc89f951", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c1e7edb3e2f98019", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/lib/sabflow/n8n/extensions/number-extensions.ts:1"}, "properties": {"repobilityId": "bc626a8c5c10fc04", "scanner": "scanner-primary", "fingerprint": "c1e7edb3e2f98019", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af28e72929e9e62e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/object-extensions.ts:1"}, "properties": {"repobilityId": "3f329ea3e0f71bee", "scanner": "scanner-primary", "fingerprint": "af28e72929e9e62e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d1811d52c3acd39c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabflow/n8n/extensions/expression-extension.ts:219"}, "properties": {"repobilityId": "5fca81f91afd60c9", "scanner": "scanner-primary", "fingerprint": "d1811d52c3acd39c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4042337721f79d5d", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/extensions/string-extensions.ts:1"}, "properties": {"repobilityId": "4ed3687faa636ca9", "scanner": "scanner-primary", "fingerprint": "4042337721f79d5d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5257f98ef8a393fd", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/extensions/extended-functions.ts:1"}, "properties": {"repobilityId": "a9aa5e46e2c0f780", "scanner": "scanner-primary", "fingerprint": "5257f98ef8a393fd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b24dfa7ddbd177a7", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/workflow-execute.ts:1618"}, "properties": {"repobilityId": "a7b1c5ad3b54ab82", "scanner": "scanner-primary", "fingerprint": "b24dfa7ddbd177a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f99d55f996c211fa", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/eval-mock-helpers.ts:18"}, "properties": {"repobilityId": "c6ab4a07a596d79d", "scanner": "scanner-primary", "fingerprint": "f99d55f996c211fa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d59a21f0f81c3a8b", "level": "none", "message": {"text": "Commented-code block (14 lines) in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/node-execution-context.ts:415"}, "properties": {"repobilityId": "44b6fb54be2b642f", "scanner": "scanner-primary", "fingerprint": "d59a21f0f81c3a8b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e30cca948cdb93b1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/n8n/core/execution-engine/node-execution-context/utils/parse-incoming-message.ts:12"}, "properties": {"repobilityId": "4eedeb40eef8d945", "scanner": "scanner-primary", "fingerprint": "e30cca948cdb93b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a32c4cae08963f1", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/n8n/core/execution-engine/partial-execution-utils/find-trigger-for-partial-execution.ts:126"}, "properties": {"repobilityId": "d1ae33f45acbaf1b", "scanner": "scanner-primary", "fingerprint": "6a32c4cae08963f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6be19ed85e61ee3c", "level": "note", "message": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/editor-catalog/useAppCatalog.ts:72"}, "properties": {"repobilityId": "b720c49256f7e2b9", "scanner": "scanner-primary", "fingerprint": "6be19ed85e61ee3c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6e151db9f947413b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/editor-catalog/useAppCatalog.ts:191"}, "properties": {"repobilityId": "09e5a5b75e3c2cbd", "scanner": "scanner-primary", "fingerprint": "6e151db9f947413b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-801714604c08b85c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/oauth/providers.ts:598"}, "properties": {"repobilityId": "7e7f27fa2d0a8b62", "scanner": "scanner-primary", "fingerprint": "801714604c08b85c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c930cef14fa3ad3", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabflow/recipes/registry.ts:127"}, "properties": {"repobilityId": "ba266f89ff26e156", "scanner": "scanner-primary", "fingerprint": "7c930cef14fa3ad3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b8c0ab8848be9e93", "level": "note", "message": {"text": "Legacy-named symbol `welcome_v1` in src/lib/sabflow/recipes/lead-to-whatsapp-welcome.ts:36"}, "properties": {"repobilityId": "6cbb3b160b417caf", "scanner": "scanner-primary", "fingerprint": "b8c0ab8848be9e93", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c8cc3eadbb75e233", "level": "note", "message": {"text": "Legacy-named symbol `b_extract_old` in src/lib/sabflow/recipes/seed-pack-4.ts:134"}, "properties": {"repobilityId": "a9afdc46099d785a", "scanner": "scanner-primary", "fingerprint": "c8cc3eadbb75e233", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-cd61f31dd308a5a3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/testNode.ts:206"}, "properties": {"repobilityId": "f4fb7784148cb4d7", "scanner": "scanner-primary", "fingerprint": "cd61f31dd308a5a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6c029287432e9e23", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/execution/traceBus.ts:35"}, "properties": {"repobilityId": "ae786f0f72af4693", "scanner": "scanner-primary", "fingerprint": "6c029287432e9e23", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-23f22ba5643838cc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/sandbox/browserSandbox.ts:28"}, "properties": {"repobilityId": "88009e271b90a49d", "scanner": "scanner-primary", "fingerprint": "23f22ba5643838cc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-df7d6e37dba54be2", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/execution/sandbox/serverSandbox.ts:235"}, "properties": {"repobilityId": "510c46b8d94aeeb8", "scanner": "scanner-primary", "fingerprint": "df7d6e37dba54be2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e13b3eb75144686e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/execution/sandbox/serverSandbox.ts:94"}, "properties": {"repobilityId": "e4c9897c63206575", "scanner": "scanner-primary", "fingerprint": "e13b3eb75144686e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a4dea8cd6db39d65", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/queue/dlq.ts:432"}, "properties": {"repobilityId": "d0ee5813b28ac867", "scanner": "scanner-primary", "fingerprint": "a4dea8cd6db39d65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3640c63f678cbe1", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/queue/cancel.ts:173"}, "properties": {"repobilityId": "5b8fb8f57fb865b9", "scanner": "scanner-primary", "fingerprint": "f3640c63f678cbe1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8b1f0a2cd61c48da", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/queue/rate-limit.ts:104"}, "properties": {"repobilityId": "30ef01d83e74ab4e", "scanner": "scanner-primary", "fingerprint": "8b1f0a2cd61c48da", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3cbbcc7286e2bdeb", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabflow/queue/enqueue.ts:485"}, "properties": {"repobilityId": "c1b4befb04f15bfd", "scanner": "scanner-primary", "fingerprint": "3cbbcc7286e2bdeb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-54158a15ceface6a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/payments/stripe.ts:127"}, "properties": {"repobilityId": "1167f3ae9b5b76a4", "scanner": "scanner-primary", "fingerprint": "54158a15ceface6a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a11cc38dad6c63f0", "level": "note", "message": {"text": "Legacy-named symbol `eleven_multilingual_v2` in src/lib/sabflow/nodeOutputs/declarations.ts:55"}, "properties": {"repobilityId": "840be09785c8faaa", "scanner": "scanner-primary", "fingerprint": "a11cc38dad6c63f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9c909f81a90fc7f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/engine/executeBlock.ts:14"}, "properties": {"repobilityId": "df4a50143ec895ef", "scanner": "scanner-primary", "fingerprint": "9c909f81a90fc7f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f2d51f1907f537d4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/engine/executeBlock.ts:411"}, "properties": {"repobilityId": "c02578059e9d5e91", "scanner": "scanner-primary", "fingerprint": "f2d51f1907f537d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ad844c1dde33475", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/engine/executeFlow.ts:191"}, "properties": {"repobilityId": "b71e33306d7403d5", "scanner": "scanner-primary", "fingerprint": "0ad844c1dde33475", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-10c924786891d918", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/engine/__tests__/paired-item.test.ts:54"}, "properties": {"repobilityId": "0c09020e83739377", "scanner": "scanner-primary", "fingerprint": "10c924786891d918", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5751d0be12e8f92c", "level": "note", "message": {"text": "Legacy-named symbol `e_legacy` in src/lib/sabflow/engine/__tests__/multi-output-routing.test.ts:163"}, "properties": {"repobilityId": "9e7db08653f79214", "scanner": "scanner-primary", "fingerprint": "5751d0be12e8f92c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-26f589f48d127141", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabflow/executor/errors.ts:176"}, "properties": {"repobilityId": "5673157431096889", "scanner": "scanner-primary", "fingerprint": "26f589f48d127141", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d1e20d8829c59c6e", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/executor/expression/parser.ts:822"}, "properties": {"repobilityId": "0f5be90c616944b2", "scanner": "scanner-primary", "fingerprint": "d1e20d8829c59c6e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1eae0d1efcc2616e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/expression/sandbox.ts:296"}, "properties": {"repobilityId": "8b7b546a24349609", "scanner": "scanner-primary", "fingerprint": "1eae0d1efcc2616e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d7e362c9a4ec01b", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/executor/nodes/code.ts:94"}, "properties": {"repobilityId": "9bb8f5d0b49ae61f", "scanner": "scanner-primary", "fingerprint": "2d7e362c9a4ec01b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0912c867e0b524de", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/wait.ts:421"}, "properties": {"repobilityId": "53ec2807187aca9b", "scanner": "scanner-primary", "fingerprint": "0912c867e0b524de", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25992276676aace7", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/http-request.ts:133"}, "properties": {"repobilityId": "3c1fe859d6953f01", "scanner": "scanner-primary", "fingerprint": "25992276676aace7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c5c03034a6e7705", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/nodes/function.ts:250"}, "properties": {"repobilityId": "b7aad4251c764277", "scanner": "scanner-primary", "fingerprint": "2c5c03034a6e7705", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e0642d4a878f731c", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabflow/executor/credentials/audit.ts:296"}, "properties": {"repobilityId": "80b83c927d8be8c6", "scanner": "scanner-primary", "fingerprint": "e0642d4a878f731c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-db1201f9f8618fea", "level": "note", "message": {"text": "Legacy-named symbol `SABFLOW_KEK_v1` in src/lib/sabflow/executor/credentials/crypto.ts:31"}, "properties": {"repobilityId": "1a8be129673a612a", "scanner": "scanner-primary", "fingerprint": "db1201f9f8618fea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-742d54e790538581", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/executor/credentials/crypto.ts:538"}, "properties": {"repobilityId": "35d7d0f73b453ff3", "scanner": "scanner-primary", "fingerprint": "742d54e790538581", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c295db332ec8799", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabflow/persistence/repo.ts:117"}, "properties": {"repobilityId": "5513ab49bc2e365c", "scanner": "scanner-primary", "fingerprint": "3c295db332ec8799", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-062ea43eadd655d8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabflow/persistence/indexes.ts:96"}, "properties": {"repobilityId": "ba1ea4e45c05c46a", "scanner": "scanner-primary", "fingerprint": "062ea43eadd655d8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a2969c39f37fb998", "level": "note", "message": {"text": "Legacy-named symbol `forge_function_legacy` in src/lib/sabflow/blocks/index.ts:475"}, "properties": {"repobilityId": "552a64319771b7e5", "scanner": "scanner-primary", "fingerprint": "a2969c39f37fb998", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b6572ba829d4b4eb", "level": "note", "message": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/blocks/icons.ts:35"}, "properties": {"repobilityId": "577671be6125920e", "scanner": "scanner-primary", "fingerprint": "b6572ba829d4b4eb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c026f89ef7770c7c", "level": "note", "message": {"text": "Legacy-named symbol `forge_slack_v1` in src/lib/sabflow/blocks/__tests__/icons.test.ts:20"}, "properties": {"repobilityId": "8f2df7655c345d93", "scanner": "scanner-primary", "fingerprint": "c026f89ef7770c7c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2491601caec37fc6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo-suite/backlinks.ts:11"}, "properties": {"repobilityId": "38c1eef5d46bd196", "scanner": "scanner-primary", "fingerprint": "2491601caec37fc6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-804a8aaee0a6c179", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/channels/adapters/discord.ts:76"}, "properties": {"repobilityId": "15880e287ef0f6e3", "scanner": "scanner-primary", "fingerprint": "804a8aaee0a6c179", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0ce8036898cc15da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/channels/adapters/voice.ts:83"}, "properties": {"repobilityId": "b9746ec93be167e5", "scanner": "scanner-primary", "fingerprint": "0ce8036898cc15da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d2d8dcc8cd07881", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/automations/dispatch.ts:122"}, "properties": {"repobilityId": "208316557a7b9f8d", "scanner": "scanner-primary", "fingerprint": "5d2d8dcc8cd07881", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a8cc7457dd077d99", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/actions/user.actions.ts:563"}, "properties": {"repobilityId": "52dddf050b5aeb92", "scanner": "scanner-primary", "fingerprint": "a8cc7457dd077d99", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ecb0ca0f69d82a87", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/reports/india/gstr1.ts:365"}, "properties": {"repobilityId": "3ebd15698b22fa0b", "scanner": "scanner-primary", "fingerprint": "ecb0ca0f69d82a87", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-be4ab60962cce4d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/engine-client.ts:15"}, "properties": {"repobilityId": "058cecf5d8a7d125", "scanner": "scanner-primary", "fingerprint": "be4ab60962cce4d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a746ca18aa19943e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabsms/types.ts:185"}, "properties": {"repobilityId": "f0186da933fb1555", "scanner": "scanner-primary", "fingerprint": "a746ca18aa19943e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fdf3e6735e195100", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabsms/journeys/executor.ts:420"}, "properties": {"repobilityId": "cb51772ad5c37408", "scanner": "scanner-primary", "fingerprint": "fdf3e6735e195100", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4b52f2a716209ee5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabsms/events/consumer.ts:436"}, "properties": {"repobilityId": "abe5d571daabb876", "scanner": "scanner-primary", "fingerprint": "4b52f2a716209ee5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1711cc157da9bce6", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/sabsms/ratecards/store.ts:108"}, "properties": {"repobilityId": "86185fa72dd84ad3", "scanner": "scanner-primary", "fingerprint": "1711cc157da9bce6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cea78a57aad6664d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabsms/agent/store.ts:482"}, "properties": {"repobilityId": "f42e7d187c8d80b2", "scanner": "scanner-primary", "fingerprint": "cea78a57aad6664d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e74794961fd9d449", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/lib/sabsms/agent/runtime.ts:318"}, "properties": {"repobilityId": "dbe9cef314eca855", "scanner": "scanner-primary", "fingerprint": "e74794961fd9d449", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-456a2c3082698a9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/agent/llm.ts:71"}, "properties": {"repobilityId": "f2abb2060cf6ffe8", "scanner": "scanner-primary", "fingerprint": "456a2c3082698a9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2aa30cedb487efe8", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/sabsms/db/collections.ts:636"}, "properties": {"repobilityId": "3a24bb2100352886", "scanner": "scanner-primary", "fingerprint": "2aa30cedb487efe8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-997365ad97b8c3d8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/sabsms/apikeys/openapi.ts:660"}, "properties": {"repobilityId": "6775d206b013c35d", "scanner": "scanner-primary", "fingerprint": "997365ad97b8c3d8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d966e68b2bbbd960", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/indexnow-client.ts:26"}, "properties": {"repobilityId": "b7577db826b1e0ca", "scanner": "scanner-primary", "fingerprint": "d966e68b2bbbd960", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bd413910206961f1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/lib/seo/outreach.ts:20"}, "properties": {"repobilityId": "1cda7d405eac315e", "scanner": "scanner-primary", "fingerprint": "bd413910206961f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c72cc85855cb4afb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/outreach.ts:23"}, "properties": {"repobilityId": "6562cf5968da679f", "scanner": "scanner-primary", "fingerprint": "c72cc85855cb4afb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11c0b1d5b67b4731", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/data-for-seo.ts:31"}, "properties": {"repobilityId": "dab6756b0effd114", "scanner": "scanner-primary", "fingerprint": "11c0b1d5b67b4731", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c07b6feae8e412c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/seo/data-for-seo-client.ts:15"}, "properties": {"repobilityId": "09961442eaa283d9", "scanner": "scanner-primary", "fingerprint": "2c07b6feae8e412c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-43d22cafa8437816", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/workers/seo.worker.ts:34"}, "properties": {"repobilityId": "d96ef97b4be46b0b", "scanner": "scanner-primary", "fingerprint": "43d22cafa8437816", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-973d952f1e810f65", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/workers/sabmail-sync.ts:442"}, "properties": {"repobilityId": "6533dcd4be67f830", "scanner": "scanner-primary", "fingerprint": "973d952f1e810f65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d0dbd9c8671fb1f6", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/workers/sabflow-worker.ts:130"}, "properties": {"repobilityId": "b2f24886afae729f", "scanner": "scanner-primary", "fingerprint": "d0dbd9c8671fb1f6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21658770d32da242", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/workers/sabflow-worker.ts:254"}, "properties": {"repobilityId": "0861893bebb9e166", "scanner": "scanner-primary", "fingerprint": "21658770d32da242", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b5723382043c7558", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/workers/broadcast/send.worker.js:153"}, "properties": {"repobilityId": "7c5a8eeeaf3acf84", "scanner": "scanner-primary", "fingerprint": "b5723382043c7558", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-523e1a80cf667af3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/workers/sabsheet/calc.worker.ts:50"}, "properties": {"repobilityId": "1bccd0bb2905b52b", "scanner": "scanner-primary", "fingerprint": "523e1a80cf667af3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a44a35417cdd918f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/workers/seo/audit.worker.ts:138"}, "properties": {"repobilityId": "025b4200b7d6077e", "scanner": "scanner-primary", "fingerprint": "a44a35417cdd918f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fa63e12080444f0b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/workflows/automation-run.ts:20"}, "properties": {"repobilityId": "151f481df6d0cac6", "scanner": "scanner-primary", "fingerprint": "fa63e12080444f0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-81546b6215ed4eb9", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/context/project-context.tsx:160"}, "properties": {"repobilityId": "2f51d350dd652b42", "scanner": "scanner-primary", "fingerprint": "81546b6215ed4eb9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6c6e07ad4ab2f0ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 e2e/helpers/session.ts:218"}, "properties": {"repobilityId": "7028c2bbcc4caf0a", "scanner": "scanner-primary", "fingerprint": "6c6e07ad4ab2f0ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b927d565b04ff05", "level": "none", "message": {"text": "Commented-code block (5 lines) in benches/sabflow-node-parity/runner.mjs:11"}, "properties": {"repobilityId": "1e67a8119dd70cc0", "scanner": "scanner-primary", "fingerprint": "0b927d565b04ff05", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6f329dea14d33963", "level": "none", "message": {"text": "Commented-code block (5 lines) in benches/sabflow-expression/run.js:196"}, "properties": {"repobilityId": "22a2f064ad9360b0", "scanner": "scanner-primary", "fingerprint": "6f329dea14d33963", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a6e70e5553fe06ac", "level": "note", "message": {"text": "255 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "b8dd59bac4dc8341", "scanner": "scanner-primary", "fingerprint": "a6e70e5553fe06ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "67729e4ea056218a", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2d179f4313b43bdb", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (worker.js:179)"}, "properties": {"repobilityId": "a0a3f8c45fc27806", "scanner": "scanner-primary", "fingerprint": "2d179f4313b43bdb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-13d499f291c722b5", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/media (worker.js:303)"}, "properties": {"repobilityId": "893883d80a8d6330", "scanner": "scanner-primary", "fingerprint": "13d499f291c722b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1ba499f547385a95", "level": "error", "message": {"text": "Dangling fetch: POST https://html.duckduckgo.com/html/ (ddg_test.js:6)"}, "properties": {"repobilityId": "dfb1b2375868b161", "scanner": "scanner-primary", "fingerprint": "1ba499f547385a95", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51b0981cebc231c1", "level": "error", "message": {"text": "Dangling fetch: GET https://api.iconify.design/simple-icons/${name}.svg?color=%23525252 (scripts/fetch-brand-logos.mjs:460)"}, "properties": {"repobilityId": "b93c4c2931b216bb", "scanner": "scanner-primary", "fingerprint": "51b0981cebc231c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e309c158e77a1229", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (workers/broadcast-worker.js:117)"}, "properties": {"repobilityId": "58f82cbfd41592a0", "scanner": "scanner-primary", "fingerprint": "e309c158e77a1229", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e105f7cbb036abcf", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/worker.js:109)"}, "properties": {"repobilityId": "41e2c63add5d8eea", "scanner": "scanner-primary", "fingerprint": "e105f7cbb036abcf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6236a024d55b9a7c", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/worker.js:164)"}, "properties": {"repobilityId": "11b4363b126c88dc", "scanner": "scanner-primary", "fingerprint": "6236a024d55b9a7c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-e7e24b801ef05376", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/broadcast-worker.js:131)"}, "properties": {"repobilityId": "a7d9ff16f1e564b2", "scanner": "scanner-primary", "fingerprint": "e7e24b801ef05376", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-af0e011ba0fe24f4", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${job.phoneNumberId}/messages (src/workers/broadcast/send-message.js:235)"}, "properties": {"repobilityId": "ab28698ae0f2df97", "scanner": "scanner-primary", "fingerprint": "af0e011ba0fe24f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-3d6f316e8dba31fa", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${broadcast.phoneNumberId}/media (src/workers/broadcast/control.worker.js:63)"}, "properties": {"repobilityId": "ea643fc264dbd93c", "scanner": "scanner-primary", "fingerprint": "3d6f316e8dba31fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-3b6d0b8cb9140732", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:304)"}, "properties": {"repobilityId": "37fb3e32fb8224bb", "scanner": "scanner-primary", "fingerprint": "3b6d0b8cb9140732", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-cc640828d5aa5661", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:315)"}, "properties": {"repobilityId": "cb56af6a0420c7bf", "scanner": "scanner-primary", "fingerprint": "cc640828d5aa5661", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-11c7267a59674e79", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:336)"}, "properties": {"repobilityId": "de35fa4bf0785b6c", "scanner": "scanner-primary", "fingerprint": "11c7267a59674e79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-7c0454827ef71b52", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:354)"}, "properties": {"repobilityId": "8ce9be26a12bf346", "scanner": "scanner-primary", "fingerprint": "7c0454827ef71b52", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-87eaafcb5029c29d", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:373)"}, "properties": {"repobilityId": "880b21dff74a308d", "scanner": "scanner-primary", "fingerprint": "87eaafcb5029c29d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8d9e1bb13ee7c70b", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/sabcall/contacts (packages/sabcall-sdk/src/client.ts:386)"}, "properties": {"repobilityId": "8040b651868ac093", "scanner": "scanner-primary", "fingerprint": "8d9e1bb13ee7c70b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c40e3f0744d77984", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:408)"}, "properties": {"repobilityId": "13c7a0b28c3ca9fd", "scanner": "scanner-primary", "fingerprint": "c40e3f0744d77984", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-23f59a6522cfc084", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (packages/sabcall-sdk/src/client.ts:439)"}, "properties": {"repobilityId": "080faa0df345dbc7", "scanner": "scanner-primary", "fingerprint": "23f59a6522cfc084", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-d38564345c4eed84", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken} (src/components/20ui-domain/whatsapp.actions.ts:848)"}, "properties": {"repobilityId": "7541d715b530472f", "scanner": "scanner-primary", "fingerprint": "d38564345c4eed84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e1a2f7b13fb2a3d", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${appId}/uploads (src/components/20ui-domain/whatsapp.actions.ts:118)"}, "properties": {"repobilityId": "1da925c7c48a8268", "scanner": "scanner-primary", "fingerprint": "9e1a2f7b13fb2a3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-6160779eefdc9817", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${uploadSessionId} (src/components/20ui-domain/whatsapp.actions.ts:122)"}, "properties": {"repobilityId": "a0480c94bdabffff", "scanner": "scanner-primary", "fingerprint": "6160779eefdc9817", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-632fe3e3ccb6f842", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile (src/components/20ui-domain/whatsapp.actions.ts:128)"}, "properties": {"repobilityId": "3a1b0a94de94171d", "scanner": "scanner-primary", "fingerprint": "632fe3e3ccb6f842", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-81ab5584f9e612c6", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/whatsapp_business_profile (src/components/20ui-domain/whatsapp.actions.ts:154)"}, "properties": {"repobilityId": "720ca6b07abc6dce", "scanner": "scanner-primary", "fingerprint": "81ab5584f9e612c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-cdc58b1b8dfcef01", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps (src/components/20ui-domain/whatsapp.actions.ts:179)"}, "properties": {"repobilityId": "d414a2841f69c72e", "scanner": "scanner-primary", "fingerprint": "cdc58b1b8dfcef01", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-7db942b32919ea65", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${appId}/subscriptions (src/components/20ui-domain/whatsapp.actions.ts:199)"}, "properties": {"repobilityId": "a2f181546646d70b", "scanner": "scanner-primary", "fingerprint": "7db942b32919ea65", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-6d09bb4ed3e8f74e", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${wabaId}/subscribed_apps (src/components/20ui-domain/whatsapp.actions.ts:211)"}, "properties": {"repobilityId": "b02050fa28244aca", "scanner": "scanner-primary", "fingerprint": "6d09bb4ed3e8f74e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-99a604608999ef76", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/components/20ui-domain/whatsapp.actions.ts:261)"}, "properties": {"repobilityId": "519d3f1e0ee8fa65", "scanner": "scanner-primary", "fingerprint": "99a604608999ef76", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-3e02bed31ccec0e1", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/components/20ui-domain/whatsapp.actions.ts:296)"}, "properties": {"repobilityId": "9d63b27782e8a6a9", "scanner": "scanner-primary", "fingerprint": "3e02bed31ccec0e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-203f0b8e64d470f8", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/components/20ui-domain/whatsapp.actions.ts:367)"}, "properties": {"repobilityId": "4b274a9eff72eae2", "scanner": "scanner-primary", "fingerprint": "203f0b8e64d470f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-530ff1e7fe101414", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/components/20ui-domain/whatsapp.actions.ts:415)"}, "properties": {"repobilityId": "dd2e965024bcd695", "scanner": "scanner-primary", "fingerprint": "530ff1e7fe101414", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-96bec11fa8df029f", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations (src/components/20ui-domain/whatsapp.actions.ts:497)"}, "properties": {"repobilityId": "4354c1f87b6ecb67", "scanner": "scanner-primary", "fingerprint": "96bec11fa8df029f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-1942c651e258c3b4", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration/${configurationName} (src/components/20ui-domain/whatsapp.actions.ts:535)"}, "properties": {"repobilityId": "75b12f3c16d86b14", "scanner": "scanner-primary", "fingerprint": "1942c651e258c3b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-5c4784c022683263", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${project.wabaId}/generate_payment_configuration_oauth_link (src/components/20ui-domain/whatsapp.actions.ts:572)"}, "properties": {"repobilityId": "52f096d4c97b1ca8", "scanner": "scanner-primary", "fingerprint": "5c4784c022683263", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-15ed699d17344207", "level": "error", "message": {"text": "Dangling fetch: DELETE https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configuration (src/components/20ui-domain/whatsapp.actions.ts:603)"}, "properties": {"repobilityId": "f588d5e85ecf86ea", "scanner": "scanner-primary", "fingerprint": "15ed699d17344207", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-a496536eefe778b9", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests (src/components/20ui-domain/whatsapp.actions.ts:656)"}, "properties": {"repobilityId": "96e67c5c83dc27b3", "scanner": "scanner-primary", "fingerprint": "a496536eefe778b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-42c3d21f1c990d72", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests/${requestId} (src/components/20ui-domain/whatsapp.actions.ts:700)"}, "properties": {"repobilityId": "1af99724e521ef96", "scanner": "scanner-primary", "fingerprint": "42c3d21f1c990d72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-b01fe400adc26210", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/payment_requests (src/components/20ui-domain/whatsapp.actions.ts:725)"}, "properties": {"repobilityId": "902a3cb28437c935", "scanner": "scanner-primary", "fingerprint": "b01fe400adc26210", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-fa3ef97ec78a30bb", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations (src/components/20ui-domain/whatsapp.actions.ts:747)"}, "properties": {"repobilityId": "b318f6c96a45a990", "scanner": "scanner-primary", "fingerprint": "fa3ef97ec78a30bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-e040b5047a50e02c", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${project.wabaId}/payment_configurations/${configurationName} (src/components/20ui-domain/whatsapp.actions.ts:774)"}, "properties": {"repobilityId": "cde41e71e68b9735", "scanner": "scanner-primary", "fingerprint": "e040b5047a50e02c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-d46a2f1eee202c69", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/me/businesses (src/components/20ui-domain/whatsapp.actions.ts:833)"}, "properties": {"repobilityId": "53f83960d54e3e5f", "scanner": "scanner-primary", "fingerprint": "d46a2f1eee202c69", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-7f6efe0313ac10e7", "level": "error", "message": {"text": "Dangling fetch: POST /api/cron/sync-local-templates (src/components/20ui-domain/sync-local-templates-button.tsx:18)"}, "properties": {"repobilityId": "a522bbffc72f98e5", "scanner": "scanner-primary", "fingerprint": "7f6efe0313ac10e7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-55df8e8bae906b2a", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/${wabaId}?fields=name&access_token=${accessToken} (src/components/20ui-domain/project.actions.ts:51)"}, "properties": {"repobilityId": "7e2454d784282a50", "scanner": "scanner-primary", "fingerprint": "55df8e8bae906b2a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a6e0a67f83760a96", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/me/businesses (src/components/20ui-domain/project.actions.ts:36)"}, "properties": {"repobilityId": "8363596450b522d5", "scanner": "scanner-primary", "fingerprint": "a6e0a67f83760a96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-ac8d8dbf4c47bce8", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/session (src/components/20ui-domain/login-form.tsx:87)"}, "properties": {"repobilityId": "58144550f6c09aed", "scanner": "scanner-primary", "fingerprint": "ac8d8dbf4c47bce8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2f3bd71c4c56f5f3", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/two-fa (src/components/20ui-domain/login-form.tsx:108)"}, "properties": {"repobilityId": "0bc9f524e840d3f5", "scanner": "scanner-primary", "fingerprint": "2f3bd71c4c56f5f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-58fb49a82683629d", "level": "error", "message": {"text": "Dangling fetch: POST /api/crm/forms/submit/${form._id.toString()} (src/components/20ui-domain/embedded-form.tsx:282)"}, "properties": {"repobilityId": "7d0d52918352dac1", "scanner": "scanner-primary", "fingerprint": "58fb49a82683629d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91d4f023721c41c2", "level": "error", "message": {"text": "Dangling fetch: GET /wachat (src/components/20ui-domain/onboarding/steps/complete-step.tsx:29)"}, "properties": {"repobilityId": "5fbff9db194d1428", "scanner": "scanner-primary", "fingerprint": "91d4f023721c41c2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8ffae27a7ac6eb9f", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/session (src/components/20ui-domain/onboarding/steps/account-step.tsx:207)"}, "properties": {"repobilityId": "2377d4103e8225db", "scanner": "scanner-primary", "fingerprint": "8ffae27a7ac6eb9f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d946d59b3d813b6f", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/wachat/ai/stream (src/components/wachat/ai/copilot-dock.tsx:89)"}, "properties": {"repobilityId": "8d41800731acb3c4", "scanner": "scanner-primary", "fingerprint": "d946d59b3d813b6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c274d200485705a0", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabsheet/presence (src/components/sabsheet/grid/sheet-canvas.tsx:272)"}, "properties": {"repobilityId": "c936139c44c3fbd8", "scanner": "scanner-primary", "fingerprint": "c274d200485705a0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-be0bf4b61390e18b", "level": "error", "message": {"text": "Dangling fetch: POST /api/builder/save (src/components/builder/editor-layout.tsx:206)"}, "properties": {"repobilityId": "5b0333555441e9dd", "scanner": "scanner-primary", "fingerprint": "be0bf4b61390e18b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d996db874c04520", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/recent-submissions (src/components/sabflow/RecentActivityFeed.tsx:47)"}, "properties": {"repobilityId": "5fc5f8f8e4f936a5", "scanner": "scanner-primary", "fingerprint": "4d996db874c04520", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cbcba0acfdef6568", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/import (src/components/sabflow/FlowImportExport.tsx:81)"}, "properties": {"repobilityId": "7394a5e07bbe1210", "scanner": "scanner-primary", "fingerprint": "cbcba0acfdef6568", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e1333999edf5a27", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/install (src/components/sabflow/marketplace/InstallModal.tsx:103)"}, "properties": {"repobilityId": "dd35b52d58873e0a", "scanner": "scanner-primary", "fingerprint": "4e1333999edf5a27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5344f54ca62b25c3", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/marketplace/templates/${encodeURIComponent(templateId)}/upgrade (src/components/sabflow/marketplace/UpgradeDiffModal.tsx:136)"}, "properties": {"repobilityId": "61f9a15287f564c0", "scanner": "scanner-primary", "fingerprint": "5344f54ca62b25c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7aa90ef842e40881", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/sabflow/workspaces/${workspace.id} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:228)"}, "properties": {"repobilityId": "6c4add3d9fa67524", "scanner": "scanner-primary", "fingerprint": "7aa90ef842e40881", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df56296b2c0a4527", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspace.id} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:256)"}, "properties": {"repobilityId": "1a981b0630180c6a", "scanner": "scanner-primary", "fingerprint": "df56296b2c0a4527", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ea320e449bc6ea9", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/sabflow/workspaces/${workspaceId}/members (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:370)"}, "properties": {"repobilityId": "84fff2bce7ea21da", "scanner": "scanner-primary", "fingerprint": "5ea320e449bc6ea9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6705dc4222eea8fd", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/members/${memberId} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:432)"}, "properties": {"repobilityId": "a817a499fa8a2679", "scanner": "scanner-primary", "fingerprint": "6705dc4222eea8fd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-28b8d324c40982c6", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/workspaces/${workspaceId}/invites (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:600)"}, "properties": {"repobilityId": "72dc7d82ff92398e", "scanner": "scanner-primary", "fingerprint": "28b8d324c40982c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b79670b119f6efed", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId} (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:667)"}, "properties": {"repobilityId": "0a041cb80678d93d", "scanner": "scanner-primary", "fingerprint": "b79670b119f6efed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-187d9282fea9a6db", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/workspaces/${workspaceId}/audit-logs (src/components/sabflow/workspaces/WorkspaceSettingsPage.tsx:882)"}, "properties": {"repobilityId": "6d6b8471fcab72ff", "scanner": "scanner-primary", "fingerprint": "187d9282fea9a6db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3985de86ead7e84b", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/workspaces (src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:105)"}, "properties": {"repobilityId": "96cd034a43fcc25a", "scanner": "scanner-primary", "fingerprint": "3985de86ead7e84b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c23bb7a52ba51a9e", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/workspaces (src/components/sabflow/workspaces/WorkspaceSwitcher.tsx:173)"}, "properties": {"repobilityId": "81984307157fcf0b", "scanner": "scanner-primary", "fingerprint": "c23bb7a52ba51a9e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bcb648c3a870ba2d", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/submissions?${qs} (src/components/sabflow/results/FlowResultsClient.tsx:266)"}, "properties": {"repobilityId": "d583fbfdfe0d8f90", "scanner": "scanner-primary", "fingerprint": "bcb648c3a870ba2d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9f31d95d29ac02e", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/analytics (src/components/sabflow/results/FlowResultsClient.tsx:473)"}, "properties": {"repobilityId": "949c0fd6b4816e6b", "scanner": "scanner-primary", "fingerprint": "b9f31d95d29ac02e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-06bac56b782d63b9", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/session (src/components/sabflow/chat/SabFlowChat.tsx:21)"}, "properties": {"repobilityId": "ba4e62c34d2251d4", "scanner": "scanner-primary", "fingerprint": "06bac56b782d63b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b28597fc451880b", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/execute (src/components/sabflow/chat/SabFlowChat.tsx:37)"}, "properties": {"repobilityId": "9257b24358c023b9", "scanner": "scanner-primary", "fingerprint": "0b28597fc451880b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa1968ab279a5531", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/payments/stripe/create-intent (src/components/sabflow/chat/blocks/PaymentBlock.tsx:177)"}, "properties": {"repobilityId": "244d2eaf18d53ee0", "scanner": "scanner-primary", "fingerprint": "fa1968ab279a5531", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4663c2c5576eddaa", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/whatsapp/${flowId}/config (src/components/sabflow/panels/WhatsAppPanel.tsx:165)"}, "properties": {"repobilityId": "65321c730c245ec4", "scanner": "scanner-primary", "fingerprint": "4663c2c5576eddaa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9264cf0b746c398", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/whatsapp/${flowId}/config (src/components/sabflow/panels/WhatsAppPanel.tsx:218)"}, "properties": {"repobilityId": "5f5b69d0d08ba45e", "scanner": "scanner-primary", "fingerprint": "a9264cf0b746c398", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ffe1cf764d5b59e", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/versions (src/components/sabflow/panels/VersionHistoryPanel.tsx:148)"}, "properties": {"repobilityId": "4b75839020be41b7", "scanner": "scanner-primary", "fingerprint": "1ffe1cf764d5b59e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bb5d8b2ecd4f4027", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/versions (src/components/sabflow/panels/VersionHistoryPanel.tsx:172)"}, "properties": {"repobilityId": "ba8b1e0510738f78", "scanner": "scanner-primary", "fingerprint": "bb5d8b2ecd4f4027", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d4a5ff70d1bc110", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/domains (src/components/sabflow/panels/DomainsPanel.tsx:72)"}, "properties": {"repobilityId": "1ad982aa71da7c5e", "scanner": "scanner-primary", "fingerprint": "7d4a5ff70d1bc110", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1346f85296ef3c46", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/domains (src/components/sabflow/panels/DomainsPanel.tsx:79)"}, "properties": {"repobilityId": "d6da22c2e106d36e", "scanner": "scanner-primary", "fingerprint": "1346f85296ef3c46", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-132ffa019d3e6abf", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/domains/${id}/verify (src/components/sabflow/panels/DomainsPanel.tsx:94)"}, "properties": {"repobilityId": "210298437fdd1860", "scanner": "scanner-primary", "fingerprint": "132ffa019d3e6abf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-984baa4deff80b55", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/domains/${id} (src/components/sabflow/panels/DomainsPanel.tsx:114)"}, "properties": {"repobilityId": "d15b6ca9eeb30417", "scanner": "scanner-primary", "fingerprint": "984baa4deff80b55", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2fe2234420dc0c6f", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/publish (src/components/sabflow/panels/SharePanelClient.tsx:20)"}, "properties": {"repobilityId": "9af16499696220d5", "scanner": "scanner-primary", "fingerprint": "2fe2234420dc0c6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-64731a1a3c734565", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/notifications (src/components/sabflow/panels/NotificationsPanel.tsx:136)"}, "properties": {"repobilityId": "40456e6f63080b79", "scanner": "scanner-primary", "fingerprint": "64731a1a3c734565", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e14eba7a7b7a177", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/notifications (src/components/sabflow/panels/NotificationsPanel.tsx:229)"}, "properties": {"repobilityId": "3a48a934d190d609", "scanner": "scanner-primary", "fingerprint": "8e14eba7a7b7a177", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7869e376234af503", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/load-options (src/components/sabflow/panels/blocks/forge/useLoadOptions.ts:97)"}, "properties": {"repobilityId": "bb5bcf388283eb12", "scanner": "scanner-primary", "fingerprint": "7869e376234af503", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-386f1be7abba0796", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/credentials?type=${provider} (src/components/sabflow/panels/blocks/inputs/PaymentInputSettings.tsx:159)"}, "properties": {"repobilityId": "c28aff7e0a1bf3ee", "scanner": "scanner-primary", "fingerprint": "386f1be7abba0796", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ab5bea17080c515", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/credentials?type=${encodeURIComponent(credentialType)} (src/components/sabflow/panels/blocks/shared/CredentialSelect.tsx:43)"}, "properties": {"repobilityId": "0c6a6ef8bd3b32f5", "scanner": "scanner-primary", "fingerprint": "4ab5bea17080c515", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a860a5f4ff5c8abe", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/nodes/${encodeURIComponent(name)} (src/components/sabflow/panels/blocks/shared/NodeSettings.tsx:162)"}, "properties": {"repobilityId": "b8e692a26640155b", "scanner": "scanner-primary", "fingerprint": "a860a5f4ff5c8abe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-842d63971011ebc9", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/ws-token?docId=${encodeURIComponent(docId)} (src/components/sabflow/editor/EditorContentCollab.tsx:125)"}, "properties": {"repobilityId": "d10bd314c58f3173", "scanner": "scanner-primary", "fingerprint": "842d63971011ebc9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a3ff3968ae0303a", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/nodes (src/components/sabflow/editor/descriptorRegistry.ts:222)"}, "properties": {"repobilityId": "64b597e1877cd145", "scanner": "scanner-primary", "fingerprint": "1a3ff3968ae0303a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-47770599f1cee035", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/presence (src/components/sabflow/presence/usePresence.ts:49)"}, "properties": {"repobilityId": "805fad49324d40c0", "scanner": "scanner-primary", "fingerprint": "47770599f1cee035", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13be129e6bb5b9fd", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/${flowId}/presence (src/components/sabflow/presence/usePresence.ts:72)"}, "properties": {"repobilityId": "75991515572504cf", "scanner": "scanner-primary", "fingerprint": "13be129e6bb5b9fd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b65e00903987582", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/analytics?${params.toString()} (src/components/sabflow/graph/providers/AnalyticsProvider.tsx:166)"}, "properties": {"repobilityId": "b1d5f1f5b4f33e8c", "scanner": "scanner-primary", "fingerprint": "9b65e00903987582", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f5dfe48763df1937", "level": "error", "message": {"text": "Dangling fetch: GET /api/status (src/app/page-client.tsx:2701)"}, "properties": {"repobilityId": "611a4af0d7728be2", "scanner": "scanner-primary", "fingerprint": "f5dfe48763df1937", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8731afec8f44e644", "level": "error", "message": {"text": "Dangling fetch: GET https://suggestqueries.google.com/complete/search?client=firefox&q=${encodeURIComponent(q)} (src/app/api/seo-tools/questions/route.ts:43)"}, "properties": {"repobilityId": "817c1ebcd1e4421a", "scanner": "scanner-primary", "fingerprint": "8731afec8f44e644", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c04bb491e8f35f1d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/app/api/sabcrm/ai/route.ts:127)"}, "properties": {"repobilityId": "6b0c5a994bedd2db", "scanner": "scanner-primary", "fingerprint": "c04bb491e8f35f1d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-86c076ac369de095", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/api/sabcrm/ai/route.ts:171)"}, "properties": {"repobilityId": "0bff71ebed67c866", "scanner": "scanner-primary", "fingerprint": "86c076ac369de095", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c3844334136a50f5", "level": "error", "message": {"text": "Dangling fetch: POST https://oauth2.googleapis.com/token (src/app/api/sabcrm/oauth/[provider]/callback/route.ts:164)"}, "properties": {"repobilityId": "c1a33abe1e368e57", "scanner": "scanner-primary", "fingerprint": "c3844334136a50f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-92c7ce22dce40241", "level": "error", "message": {"text": "Dangling fetch: GET https://openidconnect.googleapis.com/v1/userinfo (src/app/api/sabcrm/oauth/[provider]/callback/route.ts:180)"}, "properties": {"repobilityId": "9b9e63f4c9919aad", "scanner": "scanner-primary", "fingerprint": "92c7ce22dce40241", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f69cde7c97b0f589", "level": "error", "message": {"text": "Dangling fetch: POST https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token (src/app/api/sabcrm/oauth/[provider]/callback/route.ts:218)"}, "properties": {"repobilityId": "eaee4c3defd735f8", "scanner": "scanner-primary", "fingerprint": "f69cde7c97b0f589", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7a0b7594922c9556", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.microsoft.com/v1.0/me (src/app/api/crm/auth/outlook/callback/route.ts:8)"}, "properties": {"repobilityId": "b591679bdb87d031", "scanner": "scanner-primary", "fingerprint": "7a0b7594922c9556", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-03ce6c1cefa1a4d7", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${wabaId}/message_templates (src/app/api/cron/sync-local-templates/route.ts:59)"}, "properties": {"repobilityId": "6bbb05a4f0fb4916", "scanner": "scanner-primary", "fingerprint": "03ce6c1cefa1a4d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-570aa8b3947776db", "level": "error", "message": {"text": "Dangling fetch: POST https://slack.com/api/auth.test (src/app/api/sabflow/credentials/test/route.ts:142)"}, "properties": {"repobilityId": "91897a85364b90ad", "scanner": "scanner-primary", "fingerprint": "570aa8b3947776db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e9a417c3b809d79", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/user (src/app/api/sabflow/credentials/test/route.ts:160)"}, "properties": {"repobilityId": "71510152d6c0845e", "scanner": "scanner-primary", "fingerprint": "4e9a417c3b809d79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b05223d3e42c1b61", "level": "error", "message": {"text": "Dangling fetch: GET /api/marketplace/installed?projectId=${encodeURIComponent(projectId)} (src/app/dashboard/marketplace/installed/page.tsx:68)"}, "properties": {"repobilityId": "ff155f31b5724b46", "scanner": "scanner-primary", "fingerprint": "b05223d3e42c1b61", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f7de323cb57de52f", "level": "error", "message": {"text": "Dangling fetch: POST /api/meta/ai/generate (src/app/dashboard/facebook/studio/page.tsx:196)"}, "properties": {"repobilityId": "311c9b9adec9435d", "scanner": "scanner-primary", "fingerprint": "f7de323cb57de52f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3162f2f6dedb1b85", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/dashboard/ad-manager/ai-lab/actions.ts:12)"}, "properties": {"repobilityId": "45db314fa84aa462", "scanner": "scanner-primary", "fingerprint": "3162f2f6dedb1b85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9cdab76b23d5e7c4", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/usage?days=${days} (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:101)"}, "properties": {"repobilityId": "9af963c2244738c5", "scanner": "scanner-primary", "fingerprint": "9cdab76b23d5e7c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9619b71500b123ca", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/usage/alerts (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:418)"}, "properties": {"repobilityId": "d36bab6e3b2a9699", "scanner": "scanner-primary", "fingerprint": "9619b71500b123ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a37615193465761", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/usage/alerts (src/app/dashboard/sabflow/usage/_components/usage-client.tsx:440)"}, "properties": {"repobilityId": "309b487047e6fd95", "scanner": "scanner-primary", "fingerprint": "4a37615193465761", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad1a662afa1b437e", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/executions/${executionId}/rerun (src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:99)"}, "properties": {"repobilityId": "e4b72098d3a19a7e", "scanner": "scanner-primary", "fingerprint": "ad1a662afa1b437e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ddf9d89ca42504c1", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/executions/${executionId} (src/app/dashboard/sabflow/executions/_components/execution-replay-client.tsx:133)"}, "properties": {"repobilityId": "734623379412daf6", "scanner": "scanner-primary", "fingerprint": "ddf9d89ca42504c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91e27ac579a73776", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/executions?${params.toString()} (src/app/dashboard/sabflow/executions/_components/executions-list-client.tsx:102)"}, "properties": {"repobilityId": "8ddac0ae59506e19", "scanner": "scanner-primary", "fingerprint": "91e27ac579a73776", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-baf203cc471fe003", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/health (src/app/dashboard/sabflow/health/_components/health-client.tsx:120)"}, "properties": {"repobilityId": "c3d2ad4dc5e0a2eb", "scanner": "scanner-primary", "fingerprint": "baf203cc471fe003", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a806a0b345af6274", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/webhooks (src/app/dashboard/sabflow/[flowId]/webhooks/_components/webhooks-client.tsx:69)"}, "properties": {"repobilityId": "b2611260bf7320be", "scanner": "scanner-primary", "fingerprint": "a806a0b345af6274", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-40df6c890cfa4004", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/env-vars (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:85)"}, "properties": {"repobilityId": "06d715204c2a3082", "scanner": "scanner-primary", "fingerprint": "40df6c890cfa4004", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-241fbf9b462b4dff", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/env-vars?key=${encodeURIComponent(confirmDelete.key)} (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:147)"}, "properties": {"repobilityId": "f845b88f29c526d1", "scanner": "scanner-primary", "fingerprint": "241fbf9b462b4dff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acb3299ab9f62814", "level": "error", "message": {"text": "Dangling fetch: PUT /api/sabflow/env-vars (src/app/dashboard/sabflow/env-vars/_components/env-vars-client.tsx:393)"}, "properties": {"repobilityId": "6c59fa887294f71e", "scanner": "scanner-primary", "fingerprint": "acb3299ab9f62814", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ea6d61df158ec413", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/audit?${params.toString()} (src/app/dashboard/sabflow/audit/_components/audit-client.tsx:149)"}, "properties": {"repobilityId": "a8ed3fd5ffbe1c3d", "scanner": "scanner-primary", "fingerprint": "ea6d61df158ec413", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed11fd5cd0eb1830", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/logs?limit=300 (src/app/dashboard/sabflow/logs/page.tsx:123)"}, "properties": {"repobilityId": "c18d14242377d189", "scanner": "scanner-primary", "fingerprint": "ed11fd5cd0eb1830", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d5170c4947dfa76", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/api-keys (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:94)"}, "properties": {"repobilityId": "2e179bbd7ad2344f", "scanner": "scanner-primary", "fingerprint": "9d5170c4947dfa76", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cd548e60121bf430", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/api-keys (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:134)"}, "properties": {"repobilityId": "c2a986c235dd2d72", "scanner": "scanner-primary", "fingerprint": "cd548e60121bf430", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f9e40f92833e214", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/api-keys/${row._id} (src/app/dashboard/sabflow/api-keys/_components/api-keys-client.tsx:189)"}, "properties": {"repobilityId": "ac4233ea15d47897", "scanner": "scanner-primary", "fingerprint": "8f9e40f92833e214", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02059ff310c43831", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/trigger (src/app/dashboard/sabflow/flow-builder/page.tsx:217)"}, "properties": {"repobilityId": "8c0dc4b2f3825094", "scanner": "scanner-primary", "fingerprint": "02059ff310c43831", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e5f2ca01c85d3eb4", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/${flowId}/versions/${versionId} (src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:83)"}, "properties": {"repobilityId": "7f1011a0c218a258", "scanner": "scanner-primary", "fingerprint": "e5f2ca01c85d3eb4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2547a0d6c4e15056", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/${flowId}/versions/${side.versionId}/restore (src/app/dashboard/sabflow/flow-builder/[flowId]/diff/page.tsx:210)"}, "properties": {"repobilityId": "2c6d788d5950589f", "scanner": "scanner-primary", "fingerprint": "2547a0d6c4e15056", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-75dbcf2a97946e30", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/folders (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:75)"}, "properties": {"repobilityId": "86f6fbd30ece7f65", "scanner": "scanner-primary", "fingerprint": "75dbcf2a97946e30", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00e155f7c68d470a", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/flows-by-folder?folder=${encodeURIComponent(folder.name)} (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:88)"}, "properties": {"repobilityId": "b4f69213b9a2730c", "scanner": "scanner-primary", "fingerprint": "00e155f7c68d470a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-016abda4a7ad51b0", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/folders (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:126)"}, "properties": {"repobilityId": "98bd52c3d1113389", "scanner": "scanner-primary", "fingerprint": "016abda4a7ad51b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-34775ec8f0182984", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/sabflow/folders/${folderId} (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:146)"}, "properties": {"repobilityId": "9d0f772d2a0ef3c6", "scanner": "scanner-primary", "fingerprint": "34775ec8f0182984", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d878237903ee6c9b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/folders/${folderId} (src/app/dashboard/sabflow/folders/_components/folders-client.tsx:166)"}, "properties": {"repobilityId": "eac37d2d6b2f60c4", "scanner": "scanner-primary", "fingerprint": "d878237903ee6c9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-414b6ac4bad62df2", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/stats?window=24h (src/app/dashboard/sabflow/_components/flow-list-client.tsx:168)"}, "properties": {"repobilityId": "74e1aa1fb56e3634", "scanner": "scanner-primary", "fingerprint": "414b6ac4bad62df2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cca560fe08175a39", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/credentials (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:345)"}, "properties": {"repobilityId": "ea697ccdb668e7eb", "scanner": "scanner-primary", "fingerprint": "cca560fe08175a39", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e4313200506a23a9", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/credentials/test (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:416)"}, "properties": {"repobilityId": "27a8bd2c8dda4062", "scanner": "scanner-primary", "fingerprint": "e4313200506a23a9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d83b0021c52916d", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/sabflow/credentials/${editing.id} (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:464)"}, "properties": {"repobilityId": "e1b6e7f038f4e111", "scanner": "scanner-primary", "fingerprint": "8d83b0021c52916d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26cd8b7d7e607788", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/credentials (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:469)"}, "properties": {"repobilityId": "52056c0b6d91045e", "scanner": "scanner-primary", "fingerprint": "26cd8b7d7e607788", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-38c7badb1af6bb26", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/credentials/${cred.id}/test (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:495)"}, "properties": {"repobilityId": "082e1bcb80582e95", "scanner": "scanner-primary", "fingerprint": "38c7badb1af6bb26", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad407800c4047e21", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/credentials/${deleteTarget.id} (src/app/dashboard/sabflow/connections/_components/connections-client.tsx:525)"}, "properties": {"repobilityId": "6f740f144a1888bb", "scanner": "scanner-primary", "fingerprint": "ad407800c4047e21", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d7f4cb8d2cc225ae", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/credentials/${credentialId}/scopes (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:111)"}, "properties": {"repobilityId": "0809b720dcb60249", "scanner": "scanner-primary", "fingerprint": "d7f4cb8d2cc225ae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a2d8660793c4562", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/credentials/${credentialId}/scopes/${encodeURIComponent(\n            scope,\n          )} (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:156)"}, "properties": {"repobilityId": "3c425728c5186b53", "scanner": "scanner-primary", "fingerprint": "1a2d8660793c4562", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8de3c42d8ab32359", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/credentials/${credentialId}/scopes (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:188)"}, "properties": {"repobilityId": "4e7ee397343c4297", "scanner": "scanner-primary", "fingerprint": "8de3c42d8ab32359", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dde24224ffc1af3f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/credentials/${credentialId} (src/app/dashboard/sabflow/credentials/[id]/scopes/_components/scopes-client.tsx:227)"}, "properties": {"repobilityId": "774426d16898900e", "scanner": "scanner-primary", "fingerprint": "dde24224ffc1af3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0208495c77ea5352", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/workspaces/invites (src/app/dashboard/sabflow/invites/_components/invites-client.tsx:145)"}, "properties": {"repobilityId": "a9d0eeae48eb28a4", "scanner": "scanner-primary", "fingerprint": "0208495c77ea5352", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f6f2305eb829a0f9", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/workspaces/invites/accept/${inv.token} (src/app/dashboard/sabflow/invites/_components/invites-client.tsx:169)"}, "properties": {"repobilityId": "7b17bc2e31d9ce4f", "scanner": "scanner-primary", "fingerprint": "f6f2305eb829a0f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f86e293a75231bae", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabflow/workspaces/${workspaceId}/invites/${inviteId} (src/app/dashboard/sabflow/invites/_components/invites-client.tsx:201)"}, "properties": {"repobilityId": "cd1a18f247973661", "scanner": "scanner-primary", "fingerprint": "f86e293a75231bae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a36124398fe11f38", "level": "error", "message": {"text": "Dangling fetch: GET https://archive.org/wayback/available?url=${encodeURIComponent(url)} (src/app/dashboard/seo/[projectId]/timetravel/actions.ts:32)"}, "properties": {"repobilityId": "aaf65b5924721e49", "scanner": "scanner-primary", "fingerprint": "a36124398fe11f38", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d24bfd7cf20e141", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/seo/ai/keyword-clusters (src/app/dashboard/seo/[projectId]/pseo/_components/pseo-client.tsx:196)"}, "properties": {"repobilityId": "a2b09e659f4148ae", "scanner": "scanner-primary", "fingerprint": "9d24bfd7cf20e141", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-493beb84e270d970", "level": "error", "message": {"text": "Dangling fetch: GET https://ipwhois.app/json/${ip} (src/app/dashboard/seo/tools/server-location/page.tsx:58)"}, "properties": {"repobilityId": "5202a0e7fb2273d7", "scanner": "scanner-primary", "fingerprint": "493beb84e270d970", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ed1051e3f5aa32cc", "level": "error", "message": {"text": "Dangling fetch: GET https://tinyurl.com/api-create.php?url=${encodeURIComponent(out)} (src/app/dashboard/seo/tools/utm-builder/page.tsx:105)"}, "properties": {"repobilityId": "83222deed4990934", "scanner": "scanner-primary", "fingerprint": "ed1051e3f5aa32cc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c98fbf2649b5dfe7", "level": "error", "message": {"text": "Dangling fetch: POST https://tmpfiles.org/api/v1/upload (src/app/dashboard/seo/tools/reverse-image-search/page.tsx:49)"}, "properties": {"repobilityId": "cdb282dc771a27cf", "scanner": "scanner-primary", "fingerprint": "c98fbf2649b5dfe7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1db772f54fe43b1", "level": "error", "message": {"text": "Dangling fetch: GET http://suggestqueries.google.com/complete/search?client=chrome&q=${encodeURIComponent(normalizedSeed)}%20 (src/app/dashboard/seo/tools/related-keywords/actions.ts:23)"}, "properties": {"repobilityId": "4ba40d095e6d9a72", "scanner": "scanner-primary", "fingerprint": "a1db772f54fe43b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-87c1cc1782f5d60c", "level": "error", "message": {"text": "Dangling fetch: GET http://suggestqueries.google.com/complete/search?client=chrome&q=how%20to%20${encodeURIComponent(normalizedSeed)} (src/app/dashboard/seo/tools/related-keywords/actions.ts:32)"}, "properties": {"repobilityId": "9e62ca5929cf9dd0", "scanner": "scanner-primary", "fingerprint": "87c1cc1782f5d60c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3a801b962aebb41b", "level": "error", "message": {"text": "Dangling fetch: GET https://html.duckduckgo.com/html/?q=${urlEncoded} (src/app/dashboard/seo/tools/keyword-difficulty/actions.ts:30)"}, "properties": {"repobilityId": "155c1b5a78c88040", "scanner": "scanner-primary", "fingerprint": "3a801b962aebb41b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1774b16dd5f0684b", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/seo/ai/title-tags (src/app/dashboard/seo/tools/title-tag-checker/page.tsx:113)"}, "properties": {"repobilityId": "237660169fd5801a", "scanner": "scanner-primary", "fingerprint": "1774b16dd5f0684b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b5a3e19600279e97", "level": "error", "message": {"text": "Dangling fetch: POST https://api.dataforseo.com/v3/serp/google/organic/live/advanced (src/app/dashboard/seo/tools/keyword-rank-checker/action.ts:19)"}, "properties": {"repobilityId": "5a9fe19f2cc2018c", "scanner": "scanner-primary", "fingerprint": "b5a3e19600279e97", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2bcf987327b31371", "level": "error", "message": {"text": "Dangling fetch: POST https://html.duckduckgo.com/html/ (src/app/dashboard/seo/tools/keyword-rank-checker/action.ts:147)"}, "properties": {"repobilityId": "2757b51c8800b916", "scanner": "scanner-primary", "fingerprint": "2bcf987327b31371", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2ccc7e8a804ea7e0", "level": "error", "message": {"text": "Dangling fetch: GET https://api.datamuse.com/words?ml=${encodeURIComponent(s)}&max=1000 (src/app/dashboard/seo/tools/lsi-keywords/page.tsx:33)"}, "properties": {"repobilityId": "721b7c5f6314ec36", "scanner": "scanner-primary", "fingerprint": "2ccc7e8a804ea7e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab21dc4e1d59a8c7", "level": "error", "message": {"text": "Dangling fetch: GET https://api.datamuse.com/words?rel_trg=${encodeURIComponent(s)}&max=1000 (src/app/dashboard/seo/tools/lsi-keywords/page.tsx:34)"}, "properties": {"repobilityId": "e35ebb5d343251ed", "scanner": "scanner-primary", "fingerprint": "ab21dc4e1d59a8c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9411ce81d4ec0ce0", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/questions (src/app/dashboard/seo/tools/question-keywords/page.tsx:42)"}, "properties": {"repobilityId": "bcb3e794c7676591", "scanner": "scanner-primary", "fingerprint": "9411ce81d4ec0ce0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-91789a4be84678e0", "level": "error", "message": {"text": "Dangling fetch: GET https://api.pwnedpasswords.com/range/${prefix} (src/app/dashboard/seo/tools/password-generator/page.tsx:128)"}, "properties": {"repobilityId": "438aaecfdd9946ef", "scanner": "scanner-primary", "fingerprint": "91789a4be84678e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bda50c75e5747b43", "level": "error", "message": {"text": "Dangling fetch: POST https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_metrics/live (src/app/dashboard/seo/tools/keyword-cpc/actions.ts:18)"}, "properties": {"repobilityId": "06472b02e6a44b54", "scanner": "scanner-primary", "fingerprint": "bda50c75e5747b43", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-90510225f6400166", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/autocomplete (src/app/dashboard/seo/tools/people-also-ask/page.tsx:58)"}, "properties": {"repobilityId": "dcec44362df822f8", "scanner": "scanner-primary", "fingerprint": "90510225f6400166", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-442cc9f89bcfa64f", "level": "error", "message": {"text": "Dangling fetch: GET /api/sign/kiosk/${params.envelopeId}?signerId=${signerId} (src/app/sign/kiosk/[envelopeId]/page.tsx:60)"}, "properties": {"repobilityId": "8c2946cc35e26af8", "scanner": "scanner-primary", "fingerprint": "442cc9f89bcfa64f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-338453f93c0dacef", "level": "error", "message": {"text": "Dangling fetch: POST /wachat/whatsapp-ads/generate-copy (src/app/wachat/whatsapp-ads/page.tsx:764)"}, "properties": {"repobilityId": "34c8353fcb14dc34", "scanner": "scanner-primary", "fingerprint": "338453f93c0dacef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fdb305586a9a5eeb", "level": "error", "message": {"text": "Dangling fetch: GET /api/wachat/contacts/export?${params.toString()} (src/app/wachat/contacts/page.tsx:297)"}, "properties": {"repobilityId": "28346245d4a492e7", "scanner": "scanner-primary", "fingerprint": "fdb305586a9a5eeb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-98527d7b5d7023dd", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabcrm/ai (src/app/sabcrm/ai/page.tsx:373)"}, "properties": {"repobilityId": "365855e8e4734879", "scanner": "scanner-primary", "fingerprint": "98527d7b5d7023dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0121e18566a51f1", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/marketplace/submissions/${id}/review (src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:228)"}, "properties": {"repobilityId": "0e3d82c78afd0e54", "scanner": "scanner-primary", "fingerprint": "c0121e18566a51f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-275f23d14bfdde1f", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/marketplace/submissions/${id}/review (src/app/admin/dashboard/marketplace/queue/_components/SubmissionQueueClient.tsx:254)"}, "properties": {"repobilityId": "fc808795e816c450", "scanner": "scanner-primary", "fingerprint": "275f23d14bfdde1f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e109700495e09e5", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/oauth/access_token (src/app/actions/onboarding.actions.ts:67)"}, "properties": {"repobilityId": "d57a4c2e4ef64028", "scanner": "scanner-primary", "fingerprint": "2e109700495e09e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-1e3f5bbe1c8eea86", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/debug_token (src/app/actions/onboarding.actions.ts:80)"}, "properties": {"repobilityId": "817a492f5019e423", "scanner": "scanner-primary", "fingerprint": "1e3f5bbe1c8eea86", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-736ca83b2c87ac33", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${wabaId} (src/app/actions/onboarding.actions.ts:106)"}, "properties": {"repobilityId": "f58d2e301b5c05a4", "scanner": "scanner-primary", "fingerprint": "736ca83b2c87ac33", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-15866dae2a9f1f45", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${businessId} (src/app/actions/onboarding.actions.ts:130)"}, "properties": {"repobilityId": "9a48206eeaee3035", "scanner": "scanner-primary", "fingerprint": "15866dae2a9f1f45", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-9a8d8396a6be806a", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phone.id}/register (src/app/actions/onboarding.actions.ts:187)"}, "properties": {"repobilityId": "0212cd64c59a20e6", "scanner": "scanner-primary", "fingerprint": "9a8d8396a6be806a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-29f221cec957836c", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/oauth/access_token (src/app/actions/onboarding.actions.ts:251)"}, "properties": {"repobilityId": "3dac4b3d322a8bde", "scanner": "scanner-primary", "fingerprint": "29f221cec957836c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-fbf34dbc6925f768", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/me/accounts (src/app/actions/onboarding.actions.ts:256)"}, "properties": {"repobilityId": "63c4364eca57ed0c", "scanner": "scanner-primary", "fingerprint": "fbf34dbc6925f768", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-f3a12393a99597b0", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/me/adaccounts (src/app/actions/onboarding.actions.ts:278)"}, "properties": {"repobilityId": "4c7915cebe7dc377", "scanner": "scanner-primary", "fingerprint": "f3a12393a99597b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-a34501865f797d84", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v25.0/ (src/app/actions/custom-ecommerce.actions.ts:856)"}, "properties": {"repobilityId": "b6860582c33e19cd", "scanner": "scanner-primary", "fingerprint": "a34501865f797d84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-6d9f0af6c95d85e0", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/app/actions/ai-lab.actions.ts:12)"}, "properties": {"repobilityId": "bd0b78ccf1f7abfd", "scanner": "scanner-primary", "fingerprint": "6d9f0af6c95d85e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53b85bcae988e375", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/executions?limit=100 (src/app/flow/executions/page.tsx:85)"}, "properties": {"repobilityId": "73f26cf7c5f12f46", "scanner": "scanner-primary", "fingerprint": "53b85bcae988e375", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1d5b656b0df66ebb", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/nodes (src/app/flow/nodes/NodesSidebar.tsx:22)"}, "properties": {"repobilityId": "2426834c8d317a8d", "scanner": "scanner-primary", "fingerprint": "1d5b656b0df66ebb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-512bc06c80eb8e55", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabpay/checkout/${data.paymentId}/payu-session (src/app/pay/[pageSlug]/checkout-client.tsx:93)"}, "properties": {"repobilityId": "956ca8a1d688a0fa", "scanner": "scanner-primary", "fingerprint": "512bc06c80eb8e55", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8319462e71dd6a54", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabpay/checkout/${data.paymentId}/simulate (src/app/pay/[pageSlug]/checkout-client.tsx:119)"}, "properties": {"repobilityId": "245cda566d776c25", "scanner": "scanner-primary", "fingerprint": "8319462e71dd6a54", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7828be169c1228d5", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabsms/imports/ai-mapping (src/app/sabsms/imports/wizard.tsx:215)"}, "properties": {"repobilityId": "67cfe4d0c2cb59c2", "scanner": "scanner-primary", "fingerprint": "7828be169c1228d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7ecc31ee36f5c7f9", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabsms/blocks (src/app/sabsms/sabflow-blocks/client.tsx:52)"}, "properties": {"repobilityId": "3637f95fb354ca3a", "scanner": "scanner-primary", "fingerprint": "7ecc31ee36f5c7f9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-549949d1d5583573", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/media (src/lib/meta-upload.ts:34)"}, "properties": {"repobilityId": "fcdf55aa3251c566", "scanner": "scanner-primary", "fingerprint": "549949d1d5583573", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2f3f02125b4195ec", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:200)"}, "properties": {"repobilityId": "6bf256c062550e85", "scanner": "scanner-primary", "fingerprint": "2f3f02125b4195ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-b95050193b2af324", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:248)"}, "properties": {"repobilityId": "9f3080972e7b03e1", "scanner": "scanner-primary", "fingerprint": "b95050193b2af324", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-9db306d37338b409", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:285)"}, "properties": {"repobilityId": "3e79446179c9560c", "scanner": "scanner-primary", "fingerprint": "9db306d37338b409", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-d742dd82e22eac3d", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:341)"}, "properties": {"repobilityId": "3127616c62cf9e21", "scanner": "scanner-primary", "fingerprint": "d742dd82e22eac3d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-595427f6aa6b3cba", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:377)"}, "properties": {"repobilityId": "b25e20c78efed03b", "scanner": "scanner-primary", "fingerprint": "595427f6aa6b3cba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-5406206da234ce62", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:433)"}, "properties": {"repobilityId": "01fa1f44359b4aef", "scanner": "scanner-primary", "fingerprint": "5406206da234ce62", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-dca3a705dd30b3c3", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:556)"}, "properties": {"repobilityId": "a6024fdc997d15cb", "scanner": "scanner-primary", "fingerprint": "dca3a705dd30b3c3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-1258722e6d13c3b1", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:602)"}, "properties": {"repobilityId": "da975dbddc7e32ae", "scanner": "scanner-primary", "fingerprint": "1258722e6d13c3b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-1d6f0b5ce9379ac0", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${contact.phoneNumberId}/messages (src/lib/webhook-processor.ts:743)"}, "properties": {"repobilityId": "e7880e0e1a24f387", "scanner": "scanner-primary", "fingerprint": "1d6f0b5ce9379ac0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2ebbe0cccf42fa63", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${phoneNumberId}/messages (src/lib/webhook-processor.ts:1202)"}, "properties": {"repobilityId": "50fa8d832b0a1203", "scanner": "scanner-primary", "fingerprint": "2ebbe0cccf42fa63", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-6e38eed83c8710aa", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${message[message.type].id} (src/lib/webhook-processor.ts:1446)"}, "properties": {"repobilityId": "745dc9b2f10ce77d", "scanner": "scanner-primary", "fingerprint": "6e38eed83c8710aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-aecb5779d5b5af75", "level": "error", "message": {"text": "Dangling fetch: DELETE https://graph.facebook.com/${API_VERSION}/${commentId} (src/lib/webhook-processor.ts:1963)"}, "properties": {"repobilityId": "883e32dc177d6d46", "scanner": "scanner-primary", "fingerprint": "aecb5779d5b5af75", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-28ab2e4f42aa2555", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments (src/lib/webhook-processor.ts:1982)"}, "properties": {"repobilityId": "84c6aeed77b37c2f", "scanner": "scanner-primary", "fingerprint": "28ab2e4f42aa2555", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-3a9518270bb9ed3f", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/${commentId}/comments (src/lib/webhook-processor.ts:1997)"}, "properties": {"repobilityId": "6f0c80b8a270d98b", "scanner": "scanner-primary", "fingerprint": "3a9518270bb9ed3f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-25a266d90db0a0ec", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/${API_VERSION}/${senderPsid} (src/lib/webhook-processor.ts:2048)"}, "properties": {"repobilityId": "fa32af4a5d580bb4", "scanner": "scanner-primary", "fingerprint": "25a266d90db0a0ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-85aee3af6a4db4fc", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:2074)"}, "properties": {"repobilityId": "9b19f44ef41df6a1", "scanner": "scanner-primary", "fingerprint": "85aee3af6a4db4fc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-2d7338af05b29cfc", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${API_VERSION}/me/messages (src/lib/webhook-processor.ts:2090)"}, "properties": {"repobilityId": "1eb58cc5e2669d5c", "scanner": "scanner-primary", "fingerprint": "2d7338af05b29cfc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-24bb4e65701ee957", "level": "error", "message": {"text": "Dangling fetch: GET https://api.stripe.com/v1${path} (src/lib/sabshop/payments.ts:92)"}, "properties": {"repobilityId": "a6375e1a33c0e616", "scanner": "scanner-primary", "fingerprint": "24bb4e65701ee957", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ddf87a30b5a756fd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.razorpay.com/v1/orders (src/lib/sabshop/payments.ts:207)"}, "properties": {"repobilityId": "890cc68e215186be", "scanner": "scanner-primary", "fingerprint": "ddf87a30b5a756fd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-991fac4ebeacfb99", "level": "error", "message": {"text": "Dangling fetch: POST https://api.razorpay.com/v1/payments/${encodeURIComponent(intentId)}/capture (src/lib/sabshop/payments.ts:235)"}, "properties": {"repobilityId": "558f57fe41b746fa", "scanner": "scanner-primary", "fingerprint": "991fac4ebeacfb99", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-579aaa2e87ea0dfd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.razorpay.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refund (src/lib/sabshop/payments.ts:260)"}, "properties": {"repobilityId": "d1b513955282ef89", "scanner": "scanner-primary", "fingerprint": "579aaa2e87ea0dfd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0df77ba19302c189", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mercadopago.com/v1/payments (src/lib/sabshop/payments.ts:455)"}, "properties": {"repobilityId": "2a76d9fa1bca7404", "scanner": "scanner-primary", "fingerprint": "0df77ba19302c189", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-387a3a23989a91fb", "level": "error", "message": {"text": "Dangling fetch: PUT https://api.mercadopago.com/v1/payments/${encodeURIComponent(intentId)} (src/lib/sabshop/payments.ts:479)"}, "properties": {"repobilityId": "965cb0fd870b9b42", "scanner": "scanner-primary", "fingerprint": "387a3a23989a91fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-755d5bc5bb5884fb", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mercadopago.com/v1/payments/${encodeURIComponent(chargeOrIntentId)}/refunds (src/lib/sabshop/payments.ts:491)"}, "properties": {"repobilityId": "4aa50e3a81b31c2b", "scanner": "scanner-primary", "fingerprint": "755d5bc5bb5884fb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3568146107ad5e22", "level": "error", "message": {"text": "Dangling fetch: POST https://api.paystack.co/transaction/initialize (src/lib/sabshop/payments.ts:533)"}, "properties": {"repobilityId": "e1f76dcf038546ad", "scanner": "scanner-primary", "fingerprint": "3568146107ad5e22", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-662797a59e4559de", "level": "error", "message": {"text": "Dangling fetch: GET https://api.paystack.co/transaction/verify/${encodeURIComponent(intentId)} (src/lib/sabshop/payments.ts:557)"}, "properties": {"repobilityId": "e18578bd5885c1e0", "scanner": "scanner-primary", "fingerprint": "662797a59e4559de", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-127c418e156273d9", "level": "error", "message": {"text": "Dangling fetch: POST https://api.paystack.co/refund (src/lib/sabshop/payments.ts:572)"}, "properties": {"repobilityId": "97c993a16caff90a", "scanner": "scanner-primary", "fingerprint": "127c418e156273d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0cd3b1bef7654ccc", "level": "error", "message": {"text": "Dangling fetch: GET https://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentials (src/lib/sabshop/payments.ts:608)"}, "properties": {"repobilityId": "ee8f091512c10e2b", "scanner": "scanner-primary", "fingerprint": "0cd3b1bef7654ccc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-16f2e32ace6dcbbe", "level": "error", "message": {"text": "Dangling fetch: POST https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequest (src/lib/sabshop/payments.ts:631)"}, "properties": {"repobilityId": "ccd04030f550228d", "scanner": "scanner-primary", "fingerprint": "16f2e32ace6dcbbe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29bbc937d9f07871", "level": "error", "message": {"text": "Dangling fetch: POST https://api.goshippo.com/shipments/ (src/lib/sabshop/shipping.ts:75)"}, "properties": {"repobilityId": "a2bee29f8c687b72", "scanner": "scanner-primary", "fingerprint": "29bbc937d9f07871", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b0ca983bea26487", "level": "error", "message": {"text": "Dangling fetch: POST https://api.goshippo.com/transactions/ (src/lib/sabshop/shipping.ts:110)"}, "properties": {"repobilityId": "9bf5960c75afb706", "scanner": "scanner-primary", "fingerprint": "4b0ca983bea26487", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-54180162c50761f7", "level": "error", "message": {"text": "Dangling fetch: POST https://api.easypost.com/v2/shipments (src/lib/sabshop/shipping.ts:150)"}, "properties": {"repobilityId": "90db464806913bf8", "scanner": "scanner-primary", "fingerprint": "54180162c50761f7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77b6a1933618164c", "level": "error", "message": {"text": "Dangling fetch: POST https://apiv2.shiprocket.in/v1/external/auth/login (src/lib/sabshop/shipping.ts:204)"}, "properties": {"repobilityId": "d895a130514b61eb", "scanner": "scanner-primary", "fingerprint": "77b6a1933618164c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e4bfc63d97d4daa", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/fetch-url (src/lib/seo-tools/api-client.ts:17)"}, "properties": {"repobilityId": "86cbd96611a1ab21", "scanner": "scanner-primary", "fingerprint": "8e4bfc63d97d4daa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df194d1949c412bb", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/dns (src/lib/seo-tools/api-client.ts:26)"}, "properties": {"repobilityId": "490da81910e60209", "scanner": "scanner-primary", "fingerprint": "df194d1949c412bb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8c0c67ac32377647", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/whois (src/lib/seo-tools/api-client.ts:35)"}, "properties": {"repobilityId": "bb32bcaef4a4421f", "scanner": "scanner-primary", "fingerprint": "8c0c67ac32377647", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-00e6987c5d76eeee", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/ssl (src/lib/seo-tools/api-client.ts:44)"}, "properties": {"repobilityId": "0813da1503f198d0", "scanner": "scanner-primary", "fingerprint": "00e6987c5d76eeee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-99d84d7ed96bdd95", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/ai/embeddings.ts:12)"}, "properties": {"repobilityId": "295f1167767c1cdc", "scanner": "scanner-primary", "fingerprint": "99d84d7ed96bdd95", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c74883be5c33254c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/wachat/ai/client.ts:73)"}, "properties": {"repobilityId": "db57dce84dc1d6d7", "scanner": "scanner-primary", "fingerprint": "c74883be5c33254c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c332dbfe3c4f1345", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/wachat/ai/client.ts:101)"}, "properties": {"repobilityId": "a5f393b6c8d314a5", "scanner": "scanner-primary", "fingerprint": "c332dbfe3c4f1345", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e3ce6c704281b61d", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/wachat/ai/client.ts:187)"}, "properties": {"repobilityId": "1d4a7e7055597951", "scanner": "scanner-primary", "fingerprint": "e3ce6c704281b61d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a44f03755310cd96", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/sabcrm/embeddings.server.ts:96)"}, "properties": {"repobilityId": "f34082f21901aadf", "scanner": "scanner-primary", "fingerprint": "a44f03755310cd96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d4427b05205e8918", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabcrm/ai-llm.server.ts:83)"}, "properties": {"repobilityId": "546e290156b58756", "scanner": "scanner-primary", "fingerprint": "d4427b05205e8918", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-23401309c5f498fd", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabcrm/ai-llm.server.ts:122)"}, "properties": {"repobilityId": "a88712f6b19dac6b", "scanner": "scanner-primary", "fingerprint": "23401309c5f498fd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b25265f6d3ccbc5", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/sabwriter/presence/leave?documentId=${encodeURIComponent(this.docId)} (src/lib/sabwriter/transport.ts:123)"}, "properties": {"repobilityId": "9c512512bdfc4fa8", "scanner": "scanner-primary", "fingerprint": "0b25265f6d3ccbc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f62d4e3201083779", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/sabcall/calls (src/lib/sabcall/sdk.ts:141)"}, "properties": {"repobilityId": "3a464f82334aca83", "scanner": "scanner-primary", "fingerprint": "f62d4e3201083779", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-1efdaf3bc6635e6f", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/calls (src/lib/sabcall/sdk.ts:152)"}, "properties": {"repobilityId": "3deb4656bf926758", "scanner": "scanner-primary", "fingerprint": "1efdaf3bc6635e6f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-a85aebeed981e158", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/sabcall/contacts (src/lib/sabcall/sdk.ts:165)"}, "properties": {"repobilityId": "e80837e0e7870786", "scanner": "scanner-primary", "fingerprint": "a85aebeed981e158", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-24a54d37b1d7ad00", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/sabcall/contacts (src/lib/sabcall/sdk.ts:175)"}, "properties": {"repobilityId": "d97c04427899563e", "scanner": "scanner-primary", "fingerprint": "24a54d37b1d7ad00", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-4550e8bfd8066ce7", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.microsoft.com/v1.0/subscriptions (src/lib/sabmail/push-registration.ts:106)"}, "properties": {"repobilityId": "843634b3fe180850", "scanner": "scanner-primary", "fingerprint": "4550e8bfd8066ce7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-20101ffdc60524ad", "level": "error", "message": {"text": "Dangling fetch: PATCH https://graph.microsoft.com/v1.0/subscriptions/${encodeURIComponent(subscriptionId)} (src/lib/sabmail/push-registration.ts:136)"}, "properties": {"repobilityId": "e9bafa525d5fd9c7", "scanner": "scanner-primary", "fingerprint": "20101ffdc60524ad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1fe1f53e7244affb", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabmail/ai.ts:44)"}, "properties": {"repobilityId": "780cd5dec3605fea", "scanner": "scanner-primary", "fingerprint": "1fe1f53e7244affb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f324efb7a9c0c42e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabmail/ai.ts:74)"}, "properties": {"repobilityId": "babedfec29678144", "scanner": "scanner-primary", "fingerprint": "f324efb7a9c0c42e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0d38ca004eb00bef", "level": "error", "message": {"text": "Dangling fetch: GET https://openidconnect.googleapis.com/v1/userinfo (src/lib/sabmail/oauth.ts:174)"}, "properties": {"repobilityId": "aaa0ab07cc6a236b", "scanner": "scanner-primary", "fingerprint": "0d38ca004eb00bef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3d451c1af3bad582", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.microsoft.com/v1.0/me (src/lib/sabmail/oauth.ts:182)"}, "properties": {"repobilityId": "45f309071764c3ae", "scanner": "scanner-primary", "fingerprint": "3d451c1af3bad582", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-804dc797117e6c5f", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabmail/ws-token?docId=${encodeURIComponent(docId)} (src/lib/sabmail/collab/use-collab-doc.ts:68)"}, "properties": {"repobilityId": "f9890ca559b33107", "scanner": "scanner-primary", "fingerprint": "804dc797117e6c5f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88029b6755df06dd", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/app-presets (src/lib/sabflow/app-presets/client.ts:50)"}, "properties": {"repobilityId": "7c302f951c30dada", "scanner": "scanner-primary", "fingerprint": "88029b6755df06dd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-180150aa0905f7c7", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/app-presets/${encodeURIComponent(id)} (src/lib/sabflow/app-presets/client.ts:78)"}, "properties": {"repobilityId": "f222cef58fae2bcd", "scanner": "scanner-primary", "fingerprint": "180150aa0905f7c7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1561841f058d75fe", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mistral.ai/v1/chat/completions (src/lib/sabflow/integrations/mistral.ts:14)"}, "properties": {"repobilityId": "b714662d3d8147a9", "scanner": "scanner-primary", "fingerprint": "1561841f058d75fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a6e10f74141774d6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.together.xyz/v1/chat/completions (src/lib/sabflow/integrations/togetherAi.ts:15)"}, "properties": {"repobilityId": "e2e0f001cb782e29", "scanner": "scanner-primary", "fingerprint": "a6e10f74141774d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-05ef7b16206e8a1f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabflow/integrations/openAi.ts:23)"}, "properties": {"repobilityId": "0fd3862288af1cd9", "scanner": "scanner-primary", "fingerprint": "05ef7b16206e8a1f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f482623671f7c4ef", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/embeddings (src/lib/sabflow/integrations/openAi.ts:43)"}, "properties": {"repobilityId": "89a13ee776b24b4c", "scanner": "scanner-primary", "fingerprint": "f482623671f7c4ef", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-506974fbf02cfa4b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabflow/integrations/anthropicAi.ts:23)"}, "properties": {"repobilityId": "f32ddd7e87b152f5", "scanner": "scanner-primary", "fingerprint": "506974fbf02cfa4b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b69e3217c5518ba", "level": "error", "message": {"text": "Dangling fetch: POST https://api.elevenlabs.io/v1/text-to-speech/${voiceId} (src/lib/sabflow/integrations/elevenlabs.ts:17)"}, "properties": {"repobilityId": "2212d5551d22ec01", "scanner": "scanner-primary", "fingerprint": "8b69e3217c5518ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b76116460271013", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/forge-metadata (src/lib/sabflow/forge/metadata-client.ts:28)"}, "properties": {"repobilityId": "8f41ea4f63437fd5", "scanner": "scanner-primary", "fingerprint": "6b76116460271013", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d64719dbe4881f17", "level": "error", "message": {"text": "Dangling fetch: POST https://api.stripe.com/v1/charges (src/lib/sabflow/forge/blocks/parity/index.ts:75)"}, "properties": {"repobilityId": "761ecd2a5d5d53bd", "scanner": "scanner-primary", "fingerprint": "d64719dbe4881f17", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5754196f243a4433", "level": "error", "message": {"text": "Dangling fetch: POST https://api.bunny.net/purge?${params.toString()} (src/lib/sabflow/forge/blocks/parity/index.ts:283)"}, "properties": {"repobilityId": "8ddad40bfe8982b0", "scanner": "scanner-primary", "fingerprint": "5754196f243a4433", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fc683975b15f9e79", "level": "error", "message": {"text": "Dangling fetch: POST https://api.cloudinary.com/v1_1/${encodeURIComponent(cloudName)}/${encodeURIComponent(resourceType)}/upload (src/lib/sabflow/forge/blocks/parity2/index.ts:743)"}, "properties": {"repobilityId": "d10c1b67f55a4848", "scanner": "scanner-primary", "fingerprint": "fc683975b15f9e79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f3aceb9bfd0d950a", "level": "error", "message": {"text": "Dangling fetch: GET /api/sabflow/forge-metadata?summary=1 (src/lib/sabflow/editor-catalog/useAppCatalog.ts:191)"}, "properties": {"repobilityId": "c4ac69885d23c6a4", "scanner": "scanner-primary", "fingerprint": "f3aceb9bfd0d950a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-02dfc43c63ef89ec", "level": "error", "message": {"text": "Dangling fetch: POST https://api.notion.com/v1/oauth/token (src/lib/sabflow/oauth/providers.ts:263)"}, "properties": {"repobilityId": "8c3a8f475216f9b3", "scanner": "scanner-primary", "fingerprint": "02dfc43c63ef89ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ccf344ce666d2bb8", "level": "error", "message": {"text": "Dangling fetch: POST /api/sabflow/test-forge (src/lib/sabflow/execution/testNode.ts:71)"}, "properties": {"repobilityId": "80f5b6ea15295fb6", "scanner": "scanner-primary", "fingerprint": "ccf344ce666d2bb8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff932d50d44f2a76", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabflow/execution/testNode.ts:324)"}, "properties": {"repobilityId": "66911f5e6b407c58", "scanner": "scanner-primary", "fingerprint": "ff932d50d44f2a76", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-49ff9cb116fba836", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabflow/execution/testNode.ts:373)"}, "properties": {"repobilityId": "d0b006053c0c4769", "scanner": "scanner-primary", "fingerprint": "49ff9cb116fba836", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc50a49a930b967f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.mistral.ai/v1/chat/completions (src/lib/sabflow/execution/testNode.ts:426)"}, "properties": {"repobilityId": "af8bd5533cc376be", "scanner": "scanner-primary", "fingerprint": "cc50a49a930b967f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-92747b8a1d58a3ee", "level": "error", "message": {"text": "Dangling fetch: POST https://api.stripe.com/v1/payment_intents (src/lib/sabflow/payments/stripe.ts:127)"}, "properties": {"repobilityId": "70b01e8af5892437", "scanner": "scanner-primary", "fingerprint": "92747b8a1d58a3ee", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d70f559d37abc56f", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/rank-track (src/lib/seo-suite/rank-tracker.ts:55)"}, "properties": {"repobilityId": "744ccd0991f1476c", "scanner": "scanner-primary", "fingerprint": "d70f559d37abc56f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-981da4d501e7ff6e", "level": "error", "message": {"text": "Dangling fetch: POST /api/seo-tools/backlinks (src/lib/seo-suite/backlinks.ts:27)"}, "properties": {"repobilityId": "4de2eee31600f253", "scanner": "scanner-primary", "fingerprint": "981da4d501e7ff6e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0f8702f8a690e175", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/v25.0/${businessId}/${edge} (src/lib/actions/user.actions.ts:290)"}, "properties": {"repobilityId": "13b0447b00cfe83c", "scanner": "scanner-primary", "fingerprint": "0f8702f8a690e175", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "axios"]}}, {"ruleId": "scanner-bacea199616d85e6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.anthropic.com/v1/messages (src/lib/sabsms/agent/llm.ts:71)"}, "properties": {"repobilityId": "003e9cae604a655c", "scanner": "scanner-primary", "fingerprint": "bacea199616d85e6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fa2325f6380a7bf6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (src/lib/sabsms/agent/llm.ts:113)"}, "properties": {"repobilityId": "e45fe8c4c54ac65e", "scanner": "scanner-primary", "fingerprint": "fa2325f6380a7bf6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9c310865d35bab01", "level": "error", "message": {"text": "Dangling fetch: GET /sabsheet-engine/manifest.json (src/workers/sabsheet/calc.worker.ts:50)"}, "properties": {"repobilityId": "0e7a9158402eb962", "scanner": "scanner-primary", "fingerprint": "9c310865d35bab01", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69a693dfc33637f4", "level": "note", "message": {"text": "Unused endpoint: POST /run"}, "properties": {"repobilityId": "fb72ef9bef9c95d1", "scanner": "scanner-primary", "fingerprint": "69a693dfc33637f4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3238261769795a80", "level": "note", "message": {"text": "Unused endpoint: POST /webhooks/sabpay"}, "properties": {"repobilityId": "9f63b848a6e173ae", "scanner": "scanner-primary", "fingerprint": "3238261769795a80", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-684f0e83ba7e1558", "level": "note", "message": {"text": "Unused endpoint: GET "}, "properties": {"repobilityId": "5554b85b6ce08e8e", "scanner": "scanner-primary", "fingerprint": "684f0e83ba7e1558", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}