{"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-99beafb474489bea", "name": "Stray `console.log` in TS/JS \u2014 check-attendance-data.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-attendance-data.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-46e41746b42b367f", "name": "Stray `console.log` in TS/JS \u2014 test-email-service.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-email-service.js:22"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d19bf078b16c1ee5", "name": "Stray `console.log` in TS/JS \u2014 check-prayer-schema.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-prayer-schema.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-5a557ee3f635fd50", "name": "Stray `console.log` in TS/JS \u2014 apply-approval-migration.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apply-approval-migration.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-bee66ab1724bda5a", "name": "Stray `console.log` in TS/JS \u2014 test-member-details-real-data.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-member-details-real-data.js:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5badcf7c5ee5a4e7", "name": "Stray `console.log` in TS/JS \u2014 monitor_tokens.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 monitor_tokens.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-726872093866b9d6", "name": "Stray `console.log` in TS/JS \u2014 test_workflow_debug.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_workflow_debug.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-81e36d870086c3f5", "name": "Stray `console.log` in TS/JS \u2014 send_welcome_emails.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 send_welcome_emails.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-4a113178ab9e38b6", "name": "Stray `console.log` in TS/JS \u2014 test_regex.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_regex.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-828a82e2601a7621", "name": "Stray `console.log` in TS/JS \u2014 test-rls-policies.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-rls-policies.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-f33743e695e2e105", "name": "Stray `console.log` in TS/JS \u2014 test-database-connection.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-database-connection.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-d28e249926d3705f", "name": "Stray `console.log` in TS/JS \u2014 check-email-queue.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-email-queue.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-b9a571e4fb583c72", "name": "Stray `console.log` in TS/JS \u2014 test-rpc-function.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-rpc-function.js:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77995ea6120a884c", "name": "Stray `console.log` in TS/JS \u2014 find-newsletter-tables.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 find-newsletter-tables.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-4ee75e0afd2b9da8", "name": "Stray `console.log` in TS/JS \u2014 fix_suspense.js:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fix_suspense.js:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3596110a6d5e0019", "name": "Stray `console.log` in TS/JS \u2014 test_trigger_manually.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_trigger_manually.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-3bf77f80b3d7af6e", "name": "Stray `console.log` in TS/JS \u2014 test-notifications.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-notifications.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-09672f4c90b78e50", "name": "Stray `console.log` in TS/JS \u2014 check-attendance-tables.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-attendance-tables.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-50558361e26491db", "name": "Stray `console.log` in TS/JS \u2014 check-prayer-table.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-prayer-table.js:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db03c0ccbd296ad5", "name": "Stray `console.log` in TS/JS \u2014 test-member-metrics.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-member-metrics.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-f0d3b68ebc5f029f", "name": "Stray `console.log` in TS/JS \u2014 test_real_workflow.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_real_workflow.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-b5ac1b4139c49f52", "name": "Stray `console.log` in TS/JS \u2014 test-simple-member-details.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-simple-member-details.js:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e6806df81cbbba64", "name": "Stray `console.log` in TS/JS \u2014 test-fixed-giving-summary.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-fixed-giving-summary.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-a0a4ca50f459b96c", "name": "Stray `console.log` in TS/JS \u2014 add-table-checkboxes.js:110", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 add-table-checkboxes.js:110"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-231fa02e716f35f5", "name": "Stray `console.log` in TS/JS \u2014 test-upload-debug.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-upload-debug.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-96284def8f62b41d", "name": "Stray `console.log` in TS/JS \u2014 test_new_email_service.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_new_email_service.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-44aa2d45d0a9d3f5", "name": "Stray `console.log` in TS/JS \u2014 process_pending_emails.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 process_pending_emails.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-f6ab257d04726c3d", "name": "Stray `console.log` in TS/JS \u2014 debug-video-upload.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug-video-upload.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-339fcd486b0bffc5", "name": "Stray `console.log` in TS/JS \u2014 create_sample_transport_data.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 create_sample_transport_data.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-d67c37fab2b47a7a", "name": "Stray `console.log` in TS/JS \u2014 apply_trigger_fix.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apply_trigger_fix.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-8889ae9a41102542", "name": "Stray `console.log` in TS/JS \u2014 reset_failed_emails.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 reset_failed_emails.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-5f44879e34513b29", "name": "Stray `console.log` in TS/JS \u2014 check-tables-ready.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-tables-ready.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-a2359868321b61d3", "name": "Stray `console.log` in TS/JS \u2014 check-transactions-table.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-transactions-table.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-eae6cdd65c4750f8", "name": "Stray `console.log` in TS/JS \u2014 direct-newsletter-test.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 direct-newsletter-test.js:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6cab5ef444fb5f08", "name": "Stray `console.log` in TS/JS \u2014 test_automatic_triggers.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_automatic_triggers.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-35bba330616c5b60", "name": "Stray `console.log` in TS/JS \u2014 test-member-details-env.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-member-details-env.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-958da71596ffe0d9", "name": "Stray `console.log` in TS/JS \u2014 apply_welcome_triggers_fix.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apply_welcome_triggers_fix.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-d94c96bd639d7ea8", "name": "Stray `console.log` in TS/JS \u2014 test_member_automation.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_member_automation.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-85b382c637efe98f", "name": "Stray `console.log` in TS/JS \u2014 replace_test_tokens.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 replace_test_tokens.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-2c082b822c4abf76", "name": "Stray `console.log` in TS/JS \u2014 test-member-details-fix.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-member-details-fix.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-5a3639f703c9e419", "name": "Stray `console.log` in TS/JS \u2014 fix_prayer_rls_now.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fix_prayer_rls_now.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-2705f240b06d5ac7", "name": "Stray `console.log` in TS/JS \u2014 test-journey-pagination.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-journey-pagination.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-78d8d24482b3b791", "name": "Stray `console.log` in TS/JS \u2014 test-fixed-attendance.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-fixed-attendance.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-b5fdd1477016406e", "name": "Stray `console.log` in TS/JS \u2014 test_workflow_direct.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_workflow_direct.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-0498863abc23876a", "name": "Stray `console.log` in TS/JS \u2014 debug-member-details.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug-member-details.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-86d57dbef1ff2684", "name": "Stray `console.log` in TS/JS \u2014 test_member_creation_trigger.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_member_creation_trigger.js:14"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84016e7f4ad3161a", "name": "Stray `console.log` in TS/JS \u2014 verify-fixes.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 verify-fixes.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-c652cc43b388b35b", "name": "Stray `console.log` in TS/JS \u2014 test-database-fixes.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-database-fixes.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-0878cd06d19e4f01", "name": "Stray `console.log` in TS/JS \u2014 check_current_data.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check_current_data.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-deb4787f5a7afb8c", "name": "Stray `console.log` in TS/JS \u2014 check_triggers.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check_triggers.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-5cd4ad16edb4cb4b", "name": "Stray `console.log` in TS/JS \u2014 test-giving-summary.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-giving-summary.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-e68be24b2037e5d5", "name": "Stray `console.log` in TS/JS \u2014 test-prayer-notifications.js:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-prayer-notifications.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-62fa65b600687f89", "name": "Stray `console.log` in TS/JS \u2014 debug_email_queue.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 debug_email_queue.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-190b622eaff310b7", "name": "Stray `console.log` in TS/JS \u2014 check-database-structure.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-database-structure.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-b82b9596a59b35bb", "name": "Stray `console.log` in TS/JS \u2014 test-prayer-newsletter.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-prayer-newsletter.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-927edaca9672099b", "name": "Stray `console.log` in TS/JS \u2014 check-newsletter-count.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check-newsletter-count.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-829ea2f9b9414785", "name": "Stray `console.log` in TS/JS \u2014 test-notification-integration.js:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-notification-integration.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-d4f247c32cd056c5", "name": "Stray `console.log` in TS/JS \u2014 quick_test.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 quick_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-70a9509c90bd34fb", "name": "Stray `console.log` in TS/JS \u2014 check_tenant.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 check_tenant.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-da942546a038fcaa", "name": "Stray `console.log` in TS/JS \u2014 test-pagination.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-pagination.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-a3ec5477d578bda0", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/seed-admin.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/seed-admin.js:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ab812b4dc9bf324", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/schema-bootstrap.js:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/schema-bootstrap.js:89"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6982a38bd7b4dc32", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/server.js:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/server.js:64"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8d26f2cc51c0ab6", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/import-public-content.js:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/import-public-content.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-c37548d7bf819ea9", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/routes/webhooks.js:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/routes/webhooks.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-3a46f9ba751d1d8d", "name": "Stray `console.log` in TS/JS \u2014 apps/mobile/test-contact-lookup.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/test-contact-lookup.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-75d043b4aa1ab8e0", "name": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/contexts/NotificationsContext.tsx:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/contexts/NotificationsContext.tsx: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-c53c0fac3a0a1f56", "name": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/lib/auth.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/lib/auth.ts:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ec95a4cbb31e7922", "name": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/lib/supabase.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/lib/supabase.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-3f3dfd30aa5daabf", "name": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/services/branding.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/services/branding.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-6105af749582049b", "name": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/services/pushNotifications.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/services/pushNotifications.ts:77"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce04afdf7a928f76", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/fix-campaign-totals.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix-campaign-totals.js:7"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ec22840ddc269e6", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/test_real_push_token.js:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test_real_push_token.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-b5d7894715c9d661", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_welcome_template.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_welcome_template.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-dd4ed362f09d204b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_push_notifications.js:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_push_notifications.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-ac2d38cc37bbe1e1", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/add_real_test_token.js:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/add_real_test_token.js: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-a43cc0ad8be9b350", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/test-notification-function.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-notification-function.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-b0c1246b978b296b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/test-notifications.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-notifications.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-726cc357be92e168", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_transport_routes_schema.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_transport_routes_schema.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-167b401c57a68250", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/test_fixed_api.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test_fixed_api.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-48aea0d957b256f9", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/debug-transaction.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug-transaction.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-fa7615549a66a497", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/debug_joins.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug_joins.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-19e7d256f9b46467", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/test-create-payment-table.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-create-payment-table.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-7f6b24b1610a227e", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_triggers.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_triggers.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-6163305738aeb2e5", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/check_all_requests.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_all_requests.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-e3b9817a2c8df93c", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/debug_transport_summary.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug_transport_summary.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-c778804e6895eafb", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/check_route_structure.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_route_structure.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-de37d1cfd9eb62d5", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/create_welcome_template.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/create_welcome_template.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-3bd7b37e565499b4", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/check_current_data.js:12", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_current_data.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-48e6d40bf65f9f28", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/test-campaign-link.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-campaign-link.js:4"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e5738f5a0a920be", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/queue_welcome_emails.js:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/queue_welcome_emails.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-a600893f09084961", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/debug-env.js:1", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug-env.js:1"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-533fc9aec3aaacab", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/check_current_status.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_current_status.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8bfb09d7e95df08b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/test-stripe-integration.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-stripe-integration.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-2e185f6281aec744", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/scripts/generate-template.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/scripts/generate-template.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-ca121d9670019f43", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/EnhancedDeleteContactDialog.tsx:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/EnhancedDeleteContactDialog.tsx: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-9b1f51e5509098de", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/EnhancedGroupMessageModal.tsx:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/EnhancedGroupMessageModal.tsx:174"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-486f844b98e33707", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/GroupMessageModal.tsx:209", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/GroupMessageModal.tsx:209"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-733bae9d5487590d", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/MeetingPlanningTab.tsx:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/MeetingPlanningTab.tsx: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-f679d3d45fb04c81", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/GooglePlacesInput.tsx:456", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/GooglePlacesInput.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-819ccefa081e7319", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/GooglePlacesInput.tsx:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/GooglePlacesInput.tsx:66"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5d27a5259fdcdb88", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ContactForm.tsx:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ContactForm.tsx: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-13c33c7fb0d1c299", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/avatar.tsx:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/avatar.tsx: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-35ee9aa49ac13adf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/FileUpload.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/FileUpload.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-707bda53b40ee7e8", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/address-autocomplete.tsx:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/address-autocomplete.tsx:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2892efe296932ee", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/use-toast.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/use-toast.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4851ffe216cdddb2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/searchable-select.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/searchable-select.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-b37e4997dba2fc36", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/EventTransportTab.tsx:819", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/EventTransportTab.tsx:819"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a7fcd6d4d059a0ea", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/EventTransportTab.tsx:552", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/EventTransportTab.tsx:552"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09f4ed3e58e28945", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/VehicleCapacityDashboard.tsx:27", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/VehicleCapacityDashboard.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-1c141fbce2285a07", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/AutoAssignModal.tsx:642", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/AutoAssignModal.tsx:642"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7917ac43604c9881", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/AutoAssignModal.tsx:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/AutoAssignModal.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-8993383a5939a98b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/AddressAutocomplete.tsx:67", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/AddressAutocomplete.tsx:67"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9627fcb6d8584044", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/content/MediaPicker.tsx:217", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/content/MediaPicker.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-2fa5fd76bd151f1a", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/content/PageEditor.tsx:425", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/content/PageEditor.tsx:425"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a17816d751ec213", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/Layout/AdminLayout.tsx:730", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/Layout/AdminLayout.tsx:730"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9bfed80031ac5a7a", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/Layout/AdminLayout.tsx:413", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/Layout/AdminLayout.tsx:413"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84fbd4874cd50381", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/discipleship/GroupMessageModal.tsx:213", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/discipleship/GroupMessageModal.tsx:213"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa20775df1bcc82f", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/test-upload/page.tsx:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/test-upload/page.tsx:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e36249f5b826ac33", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/login/page.tsx:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/login/page.tsx:56"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f2e1982436510c4c", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/settings/communications/route.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/settings/communications/route.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-0a8b356658b48bdc", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/health/route.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/health/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-89882efe8d0284e0", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/test/route.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/test/route.ts:5"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eae96694987eb1b5", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send/route.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send/route.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-e2cbda9768b33514", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-with-sendgrid/route.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-with-sendgrid/route.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-43ce3a9a607269aa", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-direct/route.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-direct/route.ts:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-89d66b965c7e99fe", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/test-system/route.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/test-system/route.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f522c09edb35360f", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/bypass-queue/route.ts:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/bypass-queue/route.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-210b25a26f411445", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/process-queue/route.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/process-queue/route.ts:11"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-11e8826d603e3e84", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-database-smtp/route.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-database-smtp/route.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a78d71d96597a5d", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/tenant-settings/route.ts:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/tenant-settings/route.ts:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e16f3ba59be514cc", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/giving-categories/page.tsx:457", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/giving-categories/page.tsx:457"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2e3c3c86212fe863", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/comms-defaults/page.tsx:342", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/comms-defaults/page.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-a2604296db33338f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/roles/page.tsx:989", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/roles/page.tsx:989"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5480dde8cd8c37f1", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/roles/page.tsx:641", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/roles/page.tsx:641"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-034f0e5373df6d1b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/profile/page.tsx:123", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/profile/page.tsx: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-22b287d27d6e84c6", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/tenant/page.tsx:318", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/tenant/page.tsx:318"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eaa02f60ba8dbc3b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/templates/page.tsx:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/templates/page.tsx:68"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81245822c8f4213a", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/campaigns/page.tsx:140", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/campaigns/page.tsx: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-1bba0ab585cd956f", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/campaigns/new/page.tsx:138", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/campaigns/new/page.tsx:138"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7f7d5256eacb3b94", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/(admin)/comms/campaigns/[id]/page.tsx:508", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/(admin)/comms/campaigns/[id]/page.tsx:508"}, "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-f9376e99951d3eaf", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:327", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:327"}, "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-25719bfa9aaec5ca", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/events/page.tsx:764", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/events/page.tsx:764"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6252d9b98a82076a", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/page.tsx:281", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/page.tsx:281"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-da5f08838869c93a", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/new/page.tsx:195", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/new/page.tsx: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-4235eb404c650d72", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/[id]/page.tsx:225", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/[id]/page.tsx:225"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aeeda385c648becf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/events/[id]/transport/page.tsx:520", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/events/[id]/transport/page.tsx:520"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-dab8242b00a94227", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/dashboard/page.tsx:775", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/dashboard/page.tsx:775"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f86ccc6c5adc962e", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/expenses/page.tsx:302", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/expenses/page.tsx:302"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9c2de7a01bef3377", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/page.tsx:374", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/page.tsx:374"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3014faffb9e21cfb", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/new/page.tsx:90", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/new/page.tsx: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-f7e9d69e9bc6b509", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/[id]/page.tsx:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/[id]/page.tsx: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-150b59e231a47d62", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/get-involved/page.tsx:486", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/get-involved/page.tsx:486"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-523ddd83bf847b74", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/media/page.tsx:707", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/media/page.tsx:707"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-616e72d9c2161708", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/media/page.tsx:237", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/media/page.tsx:237"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3155af1e38ba2e17", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/sermons/page.tsx:518", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/sermons/page.tsx:518"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-859d61a507581f32", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/sermons/page.tsx:632", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/sermons/page.tsx:632"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f04f3ed9f578ab5a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/blogs/page.tsx:456", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/blogs/page.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-9bbfe359841d5b5c", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/blogs/page.tsx:570", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/blogs/page.tsx:570"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5f9ff4ec80b8bdf4", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/reports/attendance/page.tsx:189", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/reports/attendance/page.tsx:189"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9657a0c8b4c48dd6", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/soul-winning/page.tsx:147", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/soul-winning/page.tsx: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-c1289034914f240b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/soul-winning/new/page.tsx:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/soul-winning/new/page.tsx:111"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4442f5642dc5066f", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/website-messages/page.tsx:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/website-messages/page.tsx:127"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b067f4d7c5e3b00c", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx:1065"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4fda2cfb0a32ce14", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx:156"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2fe53bbfa36cb436", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/follow-ups/page.tsx:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/follow-ups/page.tsx: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-732ca3d4827838af", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx:937"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c64a010734152411", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx:140", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx: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-7b3d3b07b927f6b5", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/page.tsx:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/page.tsx: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-14bc43aa83f19f68", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/new/page.tsx:169", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/new/page.tsx:169"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-599fce3d2f2337ed", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/groups/[id]/page.tsx:1995", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/groups/[id]/page.tsx:1995"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d77668b2e57c1acc", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/[id]/page.tsx:505", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/[id]/page.tsx:505"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-00d11028a4c79340", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/visitors/page.tsx:141", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/visitors/page.tsx:141"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-062ceee7fe27c68f", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/visitors/new/page.tsx:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/visitors/new/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-b34a9237d6fe4054", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/drivers/[id]/page.tsx:183", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/drivers/[id]/page.tsx: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-bddd458ee60b4ac1", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/vehicles/page.tsx:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/vehicles/page.tsx:81"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87fe57bff0f6920e", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/vehicles/[id]/page.tsx:201", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/vehicles/[id]/page.tsx:201"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cbe658555777d54a", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/attendance/event/[id]/page.tsx:508", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/attendance/event/[id]/page.tsx:508"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25161d5daa3c17ef", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/page.tsx:118", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/page.tsx:118"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-feca7fc7171412d1", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/(admin)/people/discipleship/new/page.tsx:134", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/(admin)/people/discipleship/new/page.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-4de07e76966a0c92", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/new/page.tsx:139", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/new/page.tsx:139"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cd73a79301912972", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx:150", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx:150"}, "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-622e20b0f54b6657", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx:280", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx:280"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-73b414121f618339", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/page.tsx:85", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/page.tsx: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-8efd78ee26750dd4", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/new/page.tsx:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/new/page.tsx:154"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2a09debf80ebf5b", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/[id]/page.tsx:334", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/[id]/page.tsx:334"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-956bf344648b7147", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/pending-contacts/page.tsx:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/pending-contacts/page.tsx:88"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a15a83bf4fcae5e3", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/mobile-users/test-users/page.tsx:41", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/mobile-users/test-users/page.tsx: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-a8d8222b28615a47", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/env-validation.ts:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/env-validation.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-fb72c59470d62261", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/audit.ts:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/audit.ts:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-59ec90f8c3c5eb3e", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/emailAccounts.ts:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/emailAccounts.ts:154"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5a6f79ee58257c7", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/hooks/use-local-storage.ts:19", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/hooks/use-local-storage.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-d867460a0322691a", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/notificationService.ts:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/notificationService.ts:47"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ae3cc1e0d5560ca", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/recurringEvents.ts:311", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/recurringEvents.ts:311"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48632c7a9a6c0655", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/emailService.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/emailService.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-887ae310bfd7b908", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/settings.ts:210", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/settings.ts:210"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4bc3f3410e40c7d", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/contacts.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/contacts.ts:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6c4ab8561b54201", "name": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/services/comms/settings.ts:351", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/services/comms/settings.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-26beec2f1bf30e0f", "name": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/comms/settings.ts:282", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/comms/settings.ts:282"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eb4005d2c38aa2a7", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/video-modal.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/video-modal.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-ecff3e12c93c5e7e", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/word-of-year.tsx:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/word-of-year.tsx: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-199fa7e058203af4", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/planned-visit-form.tsx:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/planned-visit-form.tsx:154"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-837249fb16ef7956", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/blog-newsletter.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/blog-newsletter.tsx: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-b2831a961bc5d6a4", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/latest-sermons.tsx:209", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/latest-sermons.tsx:209"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6791ad5912ac8d9", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/hero-section.tsx:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/hero-section.tsx: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-cb53687f40b975bb", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/forms/LocationAutocomplete.tsx:63", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/forms/LocationAutocomplete.tsx: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-0526d69afa27b7f9", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/app/blog/[slug]/blog-client.tsx:128", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/app/blog/[slug]/blog-client.tsx:128"}, "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-496ad3779250f853", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/media/gallery/[collectionId]/page.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/media/gallery/[collectionId]/page.tsx:280"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4dda3d6663e00ed0", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/stripe.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/stripe.ts:16"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f99bbf0451062cbd", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useEventsPage.ts:82", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useEventsPage.ts:82"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e028902c531a6a65", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useSermons.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useSermons.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-9ca1144e32953c85", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useAbout.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useAbout.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-549bcfd31ef34275", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useNavigation.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useNavigation.ts:68"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1202384f3bc8d481", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useEvents.ts:104", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useEvents.ts:104"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2fdab6d501502d45", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useFooter.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useFooter.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-dc8b78346cafda74", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useMediaCollections.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useMediaCollections.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-d1c1c346c3f4adb6", "name": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useHomepage.ts:181", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useHomepage.ts:181"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-889ec51ccb9fe4a6", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-supabase-connection.js:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-supabase-connection.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-731fbc4ed3115686", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix-email-queue.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-email-queue.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55b55c5febf79d85", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-migrations.js:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-migrations.js: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-424ba52860775830", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-disable-rls.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-disable-rls.js:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25f2c9db96a588dc", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-contacts.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-contacts.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e2a9ab6a04e1ec8", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-from-supabase.js:146", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-from-supabase.js:146"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ba0fdb885d2eb4b8", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-add-location-data-to-events.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-add-location-data-to-events.js:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8301e2ebd29a943b", "name": "Stray `console.log` in TS/JS \u2014 scripts/set-event-locations.js:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/set-event-locations.js:32"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17f76391a8d0dff8", "name": "Stray `console.log` in TS/JS \u2014 scripts/run-fix-transport-location.js:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-fix-transport-location.js:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3b97d9f7e80535c4", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-migration.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-migration.js: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-6209daadfa197c18", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-storage-access.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-storage-access.js:25"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff7179c65125f927", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-events.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-events.js:18"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-190379c8a09a9dce", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send_email_batch/index.ts:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send_email_batch/index.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-b6e8511ff0939cb9", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/execute-workflows/index.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/execute-workflows/index.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-615a6fdfe740a89f", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/process_email_queue/index.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/process_email_queue/index.ts: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-5f1553ab31ca8e8d", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/track_email/index.ts:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/track_email/index.ts: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-7948ff1e6fa069a0", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/auto-complete-events/index.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/auto-complete-events/index.ts:35"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8cf12969e4893dd8", "name": "Stray `console.log` in TS/JS \u2014 supabase/functions/send_route_sms/index.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send_route_sms/index.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-3436e222791b5f67", "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-22cbf0e88849fce5", "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-3d70dcd36b57a39a", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "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-6c75b826297bba7e", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "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-74e2e2316f173b7a", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "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-39f0647abc71b8d9", "name": "Insecure pattern 'node_child_process' in test-notifications.js:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in test-notifications.js:8"}, "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-a357af5832038ba5", "name": "Possible secret in deploy-email-functions.sh", "shortDescription": {"text": "Possible secret in deploy-email-functions.sh"}, "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-62de82b263417558", "name": "Insecure pattern 'direct_innerhtml_assignment' in test-contact-deletion.html:112", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in test-contact-deletion.html:112"}, "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-4be9904c9580ab4e", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/ui/use-toast.tsx:208", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/ui/use-toast.tsx:208"}, "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-6cea720a406f0c9a", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/transport/EventTransportTab.tsx:764", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/transport/EventTransportTab.tsx:764"}, "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-6beb366a633a16af", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/Layout/AdminLayout.tsx:720", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/Layout/AdminLayout.tsx:720"}, "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-c3e0c84a898ace26", "name": "Insecure pattern 'cors_wildcard' in apps/admin/src/app/api/email/send/route.ts:8", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in apps/admin/src/app/api/email/send/route.ts:8"}, "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-d647475ac0d49025", "name": "Possible secret in apps/admin/src/app/(admin)/settings/roles/page.tsx", "shortDescription": {"text": "Possible secret in apps/admin/src/app/(admin)/settings/roles/page.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-b21b5bf83ea1a944", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/settings/word-of-year/page.tsx:381", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/settings/word-of-year/page.tsx:381"}, "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-a72e1ad428521bb9", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/(admin)/comms/campaigns/[id]/page.tsx:508", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/(admin)/comms/campaigns/[id]/page.tsx:508"}, "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-52180f2ec0fb2171", "name": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:327", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:327"}, "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-6aa4e2dc70f49a58", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/content/sermons/new/page.tsx:417", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/content/sermons/new/page.tsx:417"}, "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-4ea115960f040f8f", "name": "Insecure pattern 'document_write' in apps/admin/src/app/(admin)/tools/qr-code/page.tsx:151", "shortDescription": {"text": "Insecure pattern 'document_write' in apps/admin/src/app/(admin)/tools/qr-code/page.tsx:151"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bdf7267c8a54df78", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/tools/qr-code/page.tsx:85", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/tools/qr-code/page.tsx:85"}, "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-ff6eef69db50d34d", "name": "Insecure pattern 'local_storage_auth_token' in apps/admin/src/lib/local-auth.ts:168", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in apps/admin/src/lib/local-auth.ts:168"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e519de53eaa432a7", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/layout/navigation.tsx:113", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/layout/navigation.tsx:113"}, "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-f45a35fb4d938d48", "name": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/sections/DynamicSection.tsx:46", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/sections/DynamicSection.tsx:46"}, "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-f734382c85d46a7e", "name": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/app/blog/[slug]/blog-client.tsx:128", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/app/blog/[slug]/blog-client.tsx:128"}, "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-a1e68af6326794f5", "name": "Insecure pattern 'cors_wildcard' in apps/web/src/app/api/submit-contact/route.ts:12", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in apps/web/src/app/api/submit-contact/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-f5d6443e50cab1f1", "name": "Insecure pattern 'exec_used' in scripts/apply-migration.js:61", "shortDescription": {"text": "Insecure pattern 'exec_used' in scripts/apply-migration.js:61"}, "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-30a10e95897d17de", "name": "Insecure pattern 'node_child_process' in scripts/apply-migration.js:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/apply-migration.js:3"}, "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-26d1351fd69ed0ea", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/execute-workflows/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/execute-workflows/index.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-02075fb9978e6dd4", "name": "Insecure pattern 'cors_wildcard' in supabase/functions/auto-complete-events/index.ts:5", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/auto-complete-events/index.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-cdc9e247f76d2eef", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v3 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-175d308b3c2aebf6", "name": "Very large file: apps/admin/src/types/supabase.ts (4348 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/types/supabase.ts (4348 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-6b7f46401ec8d891", "name": "Very large file: apps/admin/src/components/content/PageEditor.tsx (2211 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/components/content/PageEditor.tsx (2211 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-0bc6fa8ba9208dba", "name": "Very large file: apps/admin/src/app/(admin)/settings/roles/page.tsx (1710 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/settings/roles/page.tsx (1710 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-c640bce25b4ae45f", "name": "Very large file: apps/admin/src/app/(admin)/settings/workflows/page.tsx (1573 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/settings/workflows/page.tsx (1573 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ef3cd9e5e0c0c94a", "name": "Very large file: apps/admin/src/app/(admin)/settings/footer/page.tsx (1183 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/settings/footer/page.tsx (1183 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-d6136ee7d0be4bd3", "name": "Very large file: apps/admin/src/app/(admin)/settings/tenant/page.tsx (1683 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/settings/tenant/page.tsx (1683 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-c760494affd36b37", "name": "Very large file: apps/admin/src/app/(admin)/comms/campaigns/new/page.tsx (1160 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/comms/campaigns/new/page.tsx (1160 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-8cee9f7e1af39aca", "name": "Very large file: apps/admin/src/app/(admin)/events/[id]/page.tsx (1748 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/events/[id]/page.tsx (1748 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-1a040474a93f2f92", "name": "Very large file: apps/admin/src/app/(admin)/reports/page.tsx (1914 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/reports/page.tsx (1914 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-e976eab61538bb94", "name": "Very large file: apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx (1763 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx (1763 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-94ea63cff77b0276", "name": "Very large file: apps/admin/src/app/(admin)/people/outreach/follow-ups/page.tsx (1338 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/people/outreach/follow-ups/page.tsx (1338 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-03a6e06ecf82b81a", "name": "Very large file: apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx (1442 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx (1442 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-6fd765ff01b78c6b", "name": "Very large file: apps/admin/src/app/(admin)/people/groups/[id]/page.tsx (2395 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/people/groups/[id]/page.tsx (2395 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-f6a8d8bba83a84ec", "name": "Very large file: apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx (1887 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx (1887 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-5138437f0f7df62a", "name": "Very large file: apps/admin/src/app/(admin)/people/members/[id]/page.tsx (1808 lines)", "shortDescription": {"text": "Very large file: apps/admin/src/app/(admin)/people/members/[id]/page.tsx (1808 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": "57 test file(s) for 671 source file(s) (ratio 0.08). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/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 1791 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 839 placeholder/mock markers across 183 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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-645f65df2786e6a1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test_workflow_debug.js:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_workflow_debug.js: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-8f31075678edaa2b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test_trigger_manually.js:123", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_trigger_manually.js:123"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba082335f7906817", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test_real_workflow.js:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_real_workflow.js: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-084b178afc474d47", "name": "Commented-code block (7 lines) in add-table-checkboxes.js:31", "shortDescription": {"text": "Commented-code block (7 lines) in add-table-checkboxes.js:31"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3083171b476e31b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test-upload-debug.js:65", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test-upload-debug.js:65"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0364715fd8f701b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test_new_email_service.js:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_new_email_service.js:62"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6b3d84d28c987c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test_member_automation.js:115", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_member_automation.js:115"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e9cc7c00915da39a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 replace_test_tokens.js:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 replace_test_tokens.js:74"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3806208ab5db7264", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test-prayer-notifications.js:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test-prayer-notifications.js:30"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42b0ac46c8735c95", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/expo-push.js:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/expo-push.js:42"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-04c8580511d5333d", "name": "Commented-code block (6 lines) in apps/api/src/schema-bootstrap.js:58", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/schema-bootstrap.js:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5848e75c92931a36", "name": "Commented-code block (7 lines) in apps/api/src/server.js:98", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/server.js: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-4f23b8470ca9e0cd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/import-public-content.js:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/import-public-content.js:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f86b02622582e38", "name": "Commented-code block (5 lines) in apps/api/src/routes/public.js:898", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/public.js:898"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5f30108e9e7ffa51", "name": "Commented-code block (5 lines) in apps/api/src/routes/admin-notifications.js:287", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/admin-notifications.js:287"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb51875bad4675da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/admin-notifications.js:304", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/admin-notifications.js:304"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-086ad90b2056a5a7", "name": "Commented-code block (6 lines) in apps/api/src/routes/admin-mobile-app-users.js:9", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/routes/admin-mobile-app-users.js:9"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ad76533310c9678a", "name": "Commented-code block (5 lines) in apps/api/src/routes/admin-settings.js:796", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/admin-settings.js:796"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b965b6a429179502", "name": "Legacy-named symbol `onboarding_complete_v1` in apps/mobile/App.tsx:79", "shortDescription": {"text": "Legacy-named symbol `onboarding_complete_v1` in apps/mobile/App.tsx:79"}, "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-73d7ef82823026f4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/screens/GiveScreenImpl.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/screens/GiveScreenImpl.tsx:103"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc47802a89750c72", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/screens/ProfileScreen.tsx:59", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/screens/ProfileScreen.tsx: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-8c9f4e5c54777008", "name": "Commented-code block (6 lines) in apps/mobile/src/services/pushNotifications.ts:16", "shortDescription": {"text": "Commented-code block (6 lines) in apps/mobile/src/services/pushNotifications.ts:16"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1f8012bc25413399", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/services/pushNotifications.ts:352", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/services/pushNotifications.ts:352"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7afc7b27c34ed766", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/fix_welcome_template.js:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/fix_welcome_template.js:48"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13a3dd118fdd43dd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/fix_push_notifications.js:89", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/fix_push_notifications.js: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-4cd75730462fdb1f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/settings/MultipleLogoUpload.tsx:132", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/settings/MultipleLogoUpload.tsx: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-d350b2241dcd68a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/integrations/route.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/integrations/route.ts:31"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d95111799d77e28", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/route.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/route.ts: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-a94b141b7792f79c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/[id]/route.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/[id]/route.ts:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e91cc848993cdb03", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/reorder/route.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/reorder/route.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-0f8b0c64bbcf528d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/notifications/send-push/route.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/notifications/send-push/route.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-ae48aeff441bec0a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/email/send-with-sendgrid/route.ts:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/email/send-with-sendgrid/route.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-201f7c9491c8d695", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/email/test-system/route.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/email/test-system/route.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-c42f5a5453b3c8c3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/send-verification/route.ts:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/send-verification/route.ts: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-7db8e23c847b2e37", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/create-user/route.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/create-user/route.ts:7"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a19bdaa5e64651b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/resend-verification/route.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/resend-verification/route.ts:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-68efe1659a738f22", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/verify-email/route.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/verify-email/route.ts:7"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fdfdbe661a7222a2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/link-existing-user/route.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/link-existing-user/route.ts:7"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-135915796f9e799a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/password-reset/confirm/route.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/password-reset/confirm/route.ts:7"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a06ca36c36ea0cca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/password-reset/request/route.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/password-reset/request/route.ts:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-086f4fb4febe5f86", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/media/collections/route.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/media/collections/route.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-0b1c7ff02417407c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/route.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/route.ts:22"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa9770fd92904f57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/route.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/route.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-26793a81dd30da50", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/reset-password/route.ts:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/reset-password/route.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-2dc4e83179c19ab3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/toggle-status/route.ts:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/toggle-status/route.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-d5a64a0c6beb04b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/media-fetch/route.ts:6", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/media-fetch/route.ts:6"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dc5d2843efb808a1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/trigger-workflow/route.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/trigger-workflow/route.ts:7"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef1582acba896f7d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/donations/create-payment-intent/route.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/donations/create-payment-intent/route.ts:41"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2bf7dda7201db761", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/route.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/route.ts:45"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-474c86a59967243c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/notification-preferences/route.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/notification-preferences/route.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-c414eda9aba90cfc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/register-push-token/route.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/register-push-token/route.ts:7"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3869f9e061c6ac55", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/webhooks/stripe/route.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/webhooks/stripe/route.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-00fc0fbf2327aa7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/simple-upload/page.tsx:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/simple-upload/page.tsx:44"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ac416b6efd0f909b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/settings/tenant/page.tsx:201", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/settings/tenant/page.tsx:201"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9850dc433d222874", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/page.tsx:122", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/page.tsx:122"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-97a4fac8a27d6fa4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:93"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-723cec0521b577ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:147"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-995b60f28e9af846", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/people/members/[id]/page.tsx:709", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/people/members/[id]/page.tsx:709"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dcdb80b9ac9b8951", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/local-auth.ts:55", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/local-auth.ts:55"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e0877e9b03498fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/admin-api-client.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/admin-api-client.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-46b5fe6e9b0c7540", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/upload-api.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/upload-api.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-380d3157bdd6c94a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/local-upload-client.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/local-upload-client.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-31471136420296f9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/newsletter-api-proxy.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/newsletter-api-proxy.ts: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-a83fe946a27cfd39", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/media.ts:61", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/media.ts:61"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c1c10a07d3fdee4b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/notificationService.ts:714", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/notificationService.ts:714"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd71575709c58d38", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/sms.ts:207", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/sms.ts: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-66a6c1cfef6ce70c", "name": "Commented-code block (6 lines) in apps/admin/src/services/youtube.ts:242", "shortDescription": {"text": "Commented-code block (6 lines) in apps/admin/src/services/youtube.ts:242"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-89dba6214582a674", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/contacts.ts:339", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/contacts.ts:339"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ebe7180f4bc7e5c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/comms/settings.ts:443", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/comms/settings.ts:443"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f3b153d31145dd8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/sections/media-gallery-section.tsx:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/sections/media-gallery-section.tsx:69"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-45c91380721e2081", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/media/sermons/browse/browse-client.tsx:136", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/media/sermons/browse/browse-client.tsx:136"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c30d618c60b8639e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/events/register/route.ts:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/events/register/route.ts:13"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8dfe90fda0d5cfa4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/donations/record-offline-payment/route.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/donations/record-offline-payment/route.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-5ed0de3ddee169b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/donations/confirm-recurring/route.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/donations/confirm-recurring/route.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-a766ffa8b043be1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/webhooks/stripe/route.ts:33", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/webhooks/stripe/route.ts:33"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b7a00cd1fbacdc5f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/planned-visits/route.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/planned-visits/route.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-60a5a98b968b191b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useBlogs.ts:92", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useBlogs.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-bc8e83bd7abf4b92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useMediaCollections.ts:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useMediaCollections.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-19b873c2a805f951", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-from-supabase.js:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-from-supabase.js:74"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bddda3d5a14c7401", "name": "29 env vars used in code but missing from .env.example", "shortDescription": {"text": "29 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `API_KEY`, `BASE_URL`, `CORS_ORIGINS`, `EXPO_ACCESS_TOKEN`, `EXPO_PUBLIC_ADMIN_API_URL`, `EXPO_PUBLIC_GOOGLE_MAPS_API_KEY`, `GMAIL_APP_PASSWORD`, `GMAIL_USER` + 21 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-965c431e7646d81f", "name": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (monitor_tokens.js:67)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (monitor_tokens.js:67)"}, "fullDescription": {"text": "`monitor_tokens.js:67` calls `POST http://localhost:3003/api/notifications/send-push` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/notifications/send-push`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-50e9f9e2eb75d123", "name": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (test_workflow_debug.js:80)", "shortDescription": {"text": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (test_workflow_debug.js:80)"}, "fullDescription": {"text": "`test_workflow_debug.js:80` calls `POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f7b9afbb9e3e5a26", "name": "Dangling fetch: POST http://localhost:3003/api/email/send (send_welcome_emails.js:143)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (send_welcome_emails.js:143)"}, "fullDescription": {"text": "`send_welcome_emails.js:143` calls `POST http://localhost:3003/api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-030f27febeef947d", "name": "Dangling fetch: POST http://localhost:3003/api/email/send (test_trigger_manually.js:123)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_trigger_manually.js:123)"}, "fullDescription": {"text": "`test_trigger_manually.js:123` calls `POST http://localhost:3003/api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-25c3694d85623b2c", "name": "Dangling fetch: POST http://localhost:3003/api/test-email-service (test-notifications.js:16)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/test-email-service (test-notifications.js:16)"}, "fullDescription": {"text": "`test-notifications.js:16` calls `POST http://localhost:3003/api/test-email-service` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/test-email-service`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-95ab64c51b2e4e23", "name": "Dangling fetch: POST http://localhost:3003/api/test-notifications (test-notifications.js:50)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/test-notifications (test-notifications.js:50)"}, "fullDescription": {"text": "`test-notifications.js:50` calls `POST http://localhost:3003/api/test-notifications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/test-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-8eb07e8a28bb74dc", "name": "Dangling fetch: POST http://localhost:3003/api/email/bypass-queue (test_real_workflow.js:83)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/email/bypass-queue (test_real_workflow.js:83)"}, "fullDescription": {"text": "`test_real_workflow.js:83` calls `POST http://localhost:3003/api/email/bypass-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/bypass-queue`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6d8885a7d1eb57b0", "name": "Dangling fetch: POST /api/upload-media (test-upload-debug.js:65)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-media (test-upload-debug.js:65)"}, "fullDescription": {"text": "`test-upload-debug.js:65` calls `POST /api/upload-media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-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-52f3b2586836026b", "name": "Dangling fetch: POST http://localhost:3003/api/email/send (test_new_email_service.js:18)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_new_email_service.js:18)"}, "fullDescription": {"text": "`test_new_email_service.js:18` calls `POST http://localhost:3003/api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7c3ef783282aaafe", "name": "Dangling fetch: POST http://localhost:3003/api/email/send (test_new_email_service.js:62)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_new_email_service.js:62)"}, "fullDescription": {"text": "`test_new_email_service.js:62` calls `POST http://localhost:3003/api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c86101b0e0a85bec", "name": "Dangling fetch: GET http://localhost:3003/api/email/health (test_new_email_service.js:101)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3003/api/email/health (test_new_email_service.js:101)"}, "fullDescription": {"text": "`test_new_email_service.js:101` calls `GET http://localhost:3003/api/email/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/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-e2ce12a31e3d90bd", "name": "Dangling fetch: POST http://localhost:3003/api/email/send (process_pending_emails.js:42)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (process_pending_emails.js:42)"}, "fullDescription": {"text": "`process_pending_emails.js:42` calls `POST http://localhost:3003/api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1074557e48fd6e90", "name": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (test_automatic_triggers.js", "shortDescription": {"text": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (test_automatic_triggers.js:109)"}, "fullDescription": {"text": "`test_automatic_triggers.js:109` calls `POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-42f83be3b405915d", "name": "Dangling fetch: POST http://localhost:3003/api/email/send (test_member_automation.js:115)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_member_automation.js:115)"}, "fullDescription": {"text": "`test_member_automation.js:115` calls `POST http://localhost:3003/api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-602b2c42b0a22021", "name": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (replace_test_tokens.js:74)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (replace_test_tokens.js:74)"}, "fullDescription": {"text": "`replace_test_tokens.js:74` calls `POST http://localhost:3003/api/notifications/send-push` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/notifications/send-push`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-042c31c724dc871c", "name": "Dangling fetch: POST https://exp.host/--/api/v2/push/send (apps/api/src/expo-push.js:42)", "shortDescription": {"text": "Dangling fetch: POST https://exp.host/--/api/v2/push/send (apps/api/src/expo-push.js:42)"}, "fullDescription": {"text": "`apps/api/src/expo-push.js:42` calls `POST https://exp.host/--/api/v2/push/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/exp.host/--/api/v2/push/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d00ac4636398453c", "name": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${smsSettings.account_sid}/Messages.json (apps/api/src/r", "shortDescription": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${smsSettings.account_sid}/Messages.json (apps/api/src/routes/admin-comms.js:930)"}, "fullDescription": {"text": "`apps/api/src/routes/admin-comms.js:930` calls `POST https://api.twilio.com/2010-04-01/Accounts/${smsSettings.account_sid}/Messages.json` 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.twilio.com/2010-04-01/accounts/<p>/messages.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-6b2a4986db3abfed", "name": "Dangling fetch: POST https://exp.host/--/api/v2/push/send (apps/api/src/routes/admin-notifications.js:304)", "shortDescription": {"text": "Dangling fetch: POST https://exp.host/--/api/v2/push/send (apps/api/src/routes/admin-notifications.js:304)"}, "fullDescription": {"text": "`apps/api/src/routes/admin-notifications.js:304` calls `POST https://exp.host/--/api/v2/push/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/exp.host/--/api/v2/push/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecb54e3f87f7a1f8", "name": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (apps/admin/test_real_push_token.js:68)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (apps/admin/test_real_push_token.js:68)"}, "fullDescription": {"text": "`apps/admin/test_real_push_token.js:68` calls `POST http://localhost:3003/api/notifications/send-push` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/notifications/send-push`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fe4f5c496191069d", "name": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (apps/admin/fix_welcome_tem", "shortDescription": {"text": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (apps/admin/fix_welcome_template.js:48)"}, "fullDescription": {"text": "`apps/admin/fix_welcome_template.js:48` calls `POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a26348906381d4e5", "name": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (apps/admin/fix_push_notifications.js:89)", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (apps/admin/fix_push_notifications.js:89)"}, "fullDescription": {"text": "`apps/admin/fix_push_notifications.js:89` calls `POST http://localhost:3003/api/notifications/send-push` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3003/api/notifications/send-push`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0c3c9259661ac0b5", "name": "Dangling fetch: GET http://localhost:3000/api/events/${eventId}/transport/summary (apps/admin/check_all_requests.js:39)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:3000/api/events/${eventId}/transport/summary (apps/admin/check_all_requests.js:39)"}, "fullDescription": {"text": "`apps/admin/check_all_requests.js:39` calls `GET http://localhost:3000/api/events/${eventId}/transport/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3000/api/events/<p>/transport/summary`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dc91b025c9b8fd1c", "name": "Dangling fetch: POST http://localhost:3001/api/donations/create-payment-intent (apps/admin/test-stripe-integration.js:11", "shortDescription": {"text": "Dangling fetch: POST http://localhost:3001/api/donations/create-payment-intent (apps/admin/test-stripe-integration.js:117)"}, "fullDescription": {"text": "`apps/admin/test-stripe-integration.js:117` calls `POST http://localhost:3001/api/donations/create-payment-intent` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:3001/api/donations/create-payment-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-a4eeaaf1bf02151a", "name": "Dangling fetch: POST /api/email/bypass-queue (apps/admin/src/components/CreateMeetingModal.tsx:242)", "shortDescription": {"text": "Dangling fetch: POST /api/email/bypass-queue (apps/admin/src/components/CreateMeetingModal.tsx:242)"}, "fullDescription": {"text": "`apps/admin/src/components/CreateMeetingModal.tsx:242` calls `POST /api/email/bypass-queue` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/bypass-queue`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-47a7e05af8f77c88", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/components/settings/MultipleLogoUpload.tsx:132)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/components/settings/MultipleLogoUpload.tsx:132)"}, "fullDescription": {"text": "`apps/admin/src/components/settings/MultipleLogoUpload.tsx:132` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b6bad51e21e793d6", "name": "Dangling fetch: GET /api/events/${eventId}/transport/routes (apps/admin/src/components/transport/EventTransportTab.tsx:6", "shortDescription": {"text": "Dangling fetch: GET /api/events/${eventId}/transport/routes (apps/admin/src/components/transport/EventTransportTab.tsx:619)"}, "fullDescription": {"text": "`apps/admin/src/components/transport/EventTransportTab.tsx:619` calls `GET /api/events/${eventId}/transport/routes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/events/<p>/transport/routes`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4f43178da405dd79", "name": "Dangling fetch: POST /api/newsletter/members/import (apps/admin/src/components/newsletter/MemberImportDialog.tsx:54)", "shortDescription": {"text": "Dangling fetch: POST /api/newsletter/members/import (apps/admin/src/components/newsletter/MemberImportDialog.tsx:54)"}, "fullDescription": {"text": "`apps/admin/src/components/newsletter/MemberImportDialog.tsx:54` calls `POST /api/newsletter/members/import` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/members/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-499115f12a3fda9d", "name": "Dangling fetch: POST /api/newsletter/members/sync (apps/admin/src/components/newsletter/MemberImportDialog.tsx:98)", "shortDescription": {"text": "Dangling fetch: POST /api/newsletter/members/sync (apps/admin/src/components/newsletter/MemberImportDialog.tsx:98)"}, "fullDescription": {"text": "`apps/admin/src/components/newsletter/MemberImportDialog.tsx:98` calls `POST /api/newsletter/members/sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/members/sync`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04905cf5d3e88552", "name": "Dangling fetch: POST /api/newsletter/members/sync (apps/admin/src/components/newsletter/MemberImportDialog.tsx:137)", "shortDescription": {"text": "Dangling fetch: POST /api/newsletter/members/sync (apps/admin/src/components/newsletter/MemberImportDialog.tsx:137)"}, "fullDescription": {"text": "`apps/admin/src/components/newsletter/MemberImportDialog.tsx:137` calls `POST /api/newsletter/members/sync` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/members/sync`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-542d5d13179692c9", "name": "Dangling fetch: PUT /api/newsletter/subscribers/${subscriber.id} (apps/admin/src/components/newsletter/EditSubscriberDia", "shortDescription": {"text": "Dangling fetch: PUT /api/newsletter/subscribers/${subscriber.id} (apps/admin/src/components/newsletter/EditSubscriberDialog.tsx:86)"}, "fullDescription": {"text": "`apps/admin/src/components/newsletter/EditSubscriberDialog.tsx:86` calls `PUT /api/newsletter/subscribers/${subscriber.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/subscribers/<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-9a18addf1d5c42d9", "name": "Dangling fetch: POST /api/admin/fix-birthday-column (apps/admin/src/app/fix-birthday/page.tsx:20)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/fix-birthday-column (apps/admin/src/app/fix-birthday/page.tsx:20)"}, "fullDescription": {"text": "`apps/admin/src/app/fix-birthday/page.tsx:20` calls `POST /api/admin/fix-birthday-column` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/fix-birthday-column`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-208fdb8fbdedcff1", "name": "Dangling fetch: POST https://api.sendgrid.com/v3/mail/send (apps/admin/src/app/api/email/send-with-sendgrid/route.ts:72)", "shortDescription": {"text": "Dangling fetch: POST https://api.sendgrid.com/v3/mail/send (apps/admin/src/app/api/email/send-with-sendgrid/route.ts:72)"}, "fullDescription": {"text": "`apps/admin/src/app/api/email/send-with-sendgrid/route.ts:72` calls `POST https://api.sendgrid.com/v3/mail/send` 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.sendgrid.com/v3/mail/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-566b612ba178f393", "name": "Dangling fetch: POST /api/upload-media (apps/admin/src/app/simple-upload/page.tsx:44)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-media (apps/admin/src/app/simple-upload/page.tsx:44)"}, "fullDescription": {"text": "`apps/admin/src/app/simple-upload/page.tsx:44` calls `POST /api/upload-media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-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-d8dc88985657c673", "name": "Dangling fetch: GET /api/settings/communications (apps/admin/src/app/(admin)/settings/email-system/page.tsx:42)", "shortDescription": {"text": "Dangling fetch: GET /api/settings/communications (apps/admin/src/app/(admin)/settings/email-system/page.tsx:42)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/email-system/page.tsx:42` calls `GET /api/settings/communications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/communications`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12228fb5575bf4e3", "name": "Dangling fetch: POST /api/settings/communications (apps/admin/src/app/(admin)/settings/email-system/page.tsx:65)", "shortDescription": {"text": "Dangling fetch: POST /api/settings/communications (apps/admin/src/app/(admin)/settings/email-system/page.tsx:65)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/email-system/page.tsx:65` calls `POST /api/settings/communications` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/settings/communications`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-12caf9ed734c4041", "name": "Dangling fetch: POST /api/email/test-system (apps/admin/src/app/(admin)/settings/email-system/page.tsx:96)", "shortDescription": {"text": "Dangling fetch: POST /api/email/test-system (apps/admin/src/app/(admin)/settings/email-system/page.tsx:96)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/email-system/page.tsx:96` calls `POST /api/email/test-system` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/test-system`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cbf861e564e42b27", "name": "Dangling fetch: POST /api/upload-footer-logo (apps/admin/src/app/(admin)/settings/footer/page.tsx:347)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-footer-logo (apps/admin/src/app/(admin)/settings/footer/page.tsx:347)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/footer/page.tsx:347` calls `POST /api/upload-footer-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-footer-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dfef3824646650b7", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:201)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:201)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/tenant/page.tsx:201` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d2d03dc74d386898", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:901)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:901)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/tenant/page.tsx:901` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f67792257e420e85", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1067)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1067)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/tenant/page.tsx:1067` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60f386966221ec27", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1156)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1156)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/tenant/page.tsx:1156` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3eb50c18fb01f56d", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1217)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1217)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/tenant/page.tsx:1217` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1768913ef1972b58", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1278)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1278)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/tenant/page.tsx:1278` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1d92c5157c7ecbcb", "name": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1339)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1339)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/settings/tenant/page.tsx:1339` calls `POST /api/upload-logo` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-logo`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-81e1d2bfc883d4c6", "name": "Dangling fetch: GET /api/email/health?includeQueue=true&includeErrors=true (apps/admin/src/app/(admin)/comms/email-healt", "shortDescription": {"text": "Dangling fetch: GET /api/email/health?includeQueue=true&includeErrors=true (apps/admin/src/app/(admin)/comms/email-health/page.tsx:82)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/email-health/page.tsx:82` calls `GET /api/email/health?includeQueue=true&includeErrors=true` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/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-c8b824add50b2b16", "name": "Dangling fetch: POST /api/email/health (apps/admin/src/app/(admin)/comms/email-health/page.tsx:106)", "shortDescription": {"text": "Dangling fetch: POST /api/email/health (apps/admin/src/app/(admin)/comms/email-health/page.tsx:106)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/email-health/page.tsx:106` calls `POST /api/email/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/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-1ac072da8d09fff2", "name": "Dangling fetch: GET /api/newsletter/stats (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:115)", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/stats (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:115)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/page.tsx:115` calls `GET /api/newsletter/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/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-8a9bb8e3e6aed0aa", "name": "Dangling fetch: GET /api/newsletter/newsletters (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:122)", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/newsletters (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:122)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/page.tsx:122` calls `GET /api/newsletter/newsletters` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/newsletters`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a574aea17154a72e", "name": "Dangling fetch: GET /api/newsletter/subscribers (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:129)", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/subscribers (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:129)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/page.tsx:129` calls `GET /api/newsletter/subscribers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/subscribers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9c9148eb10287fed", "name": "Dangling fetch: POST /api/newsletter/subscribers (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:157)", "shortDescription": {"text": "Dangling fetch: POST /api/newsletter/subscribers (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:157)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/page.tsx:157` calls `POST /api/newsletter/subscribers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/subscribers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-09c9ade12e283b03", "name": "Dangling fetch: DELETE /api/newsletter/subscribers/${selectedSubscriber.id} (apps/admin/src/app/(admin)/comms/newsletter", "shortDescription": {"text": "Dangling fetch: DELETE /api/newsletter/subscribers/${selectedSubscriber.id} (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:204)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/page.tsx:204` calls `DELETE /api/newsletter/subscribers/${selectedSubscriber.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/subscribers/<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-11c3b26f5871e15e", "name": "Dangling fetch: GET /api/newsletter/templates (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:86)", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/templates (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:86)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:86` calls `GET /api/newsletter/templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/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-f143f2e4a30262d8", "name": "Dangling fetch: GET /api/newsletter/segments (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:93)", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/segments (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:93)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:93` calls `GET /api/newsletter/segments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/segments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-14d53ff0691f0341", "name": "Dangling fetch: POST /api/newsletter/preview (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:134)", "shortDescription": {"text": "Dangling fetch: POST /api/newsletter/preview (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:134)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:134` calls `POST /api/newsletter/preview` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/preview`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-529dcc69c5f6f56d", "name": "Dangling fetch: POST /api/newsletter/newsletters (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:196)", "shortDescription": {"text": "Dangling fetch: POST /api/newsletter/newsletters (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:196)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:196` calls `POST /api/newsletter/newsletters` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/newsletters`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-613791fa748be34f", "name": "Dangling fetch: GET /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/page.t", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/page.tsx:67)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/[id]/page.tsx:67` calls `GET /api/newsletter/newsletters/${newsletterId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/newsletters/<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-fd4a27b04bd714e5", "name": "Dangling fetch: GET /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/p", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:107)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:107` calls `GET /api/newsletter/newsletters/${newsletterId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/newsletters/<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-c3ef1706713bc320", "name": "Dangling fetch: GET /api/newsletter/templates (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:147)", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/templates (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:147)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:147` calls `GET /api/newsletter/templates` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/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-e12cf28b4e61d357", "name": "Dangling fetch: GET /api/newsletter/segments (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:154)", "shortDescription": {"text": "Dangling fetch: GET /api/newsletter/segments (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:154)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:154` calls `GET /api/newsletter/segments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/segments`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-18abb1b3381b5047", "name": "Dangling fetch: PUT /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/p", "shortDescription": {"text": "Dangling fetch: PUT /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:220)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:220` calls `PUT /api/newsletter/newsletters/${newsletterId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/newsletter/newsletters/<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-b73628a56b915537", "name": "Dangling fetch: GET /api/upload-media (apps/admin/src/app/(admin)/content/media/page.tsx:231)", "shortDescription": {"text": "Dangling fetch: GET /api/upload-media (apps/admin/src/app/(admin)/content/media/page.tsx:231)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/content/media/page.tsx:231` calls `GET /api/upload-media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-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-26cfc6498888c2bf", "name": "Dangling fetch: POST /api/youtube/metadata (apps/admin/src/app/(admin)/content/sermons/new/page.tsx:101)", "shortDescription": {"text": "Dangling fetch: POST /api/youtube/metadata (apps/admin/src/app/(admin)/content/sermons/new/page.tsx:101)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/content/sermons/new/page.tsx:101` calls `POST /api/youtube/metadata` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/youtube/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-d0086e4dcc543dbe", "name": "Dangling fetch: POST /api/youtube/metadata (apps/admin/src/app/(admin)/content/sermons/[id]/edit/page.tsx:165)", "shortDescription": {"text": "Dangling fetch: POST /api/youtube/metadata (apps/admin/src/app/(admin)/content/sermons/[id]/edit/page.tsx:165)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/content/sermons/[id]/edit/page.tsx:165` calls `POST /api/youtube/metadata` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/youtube/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-fe7eefd2ed5fb950", "name": "Dangling fetch: POST /api/email/send (apps/admin/src/app/(admin)/email-test/email-test-form.tsx:49)", "shortDescription": {"text": "Dangling fetch: POST /api/email/send (apps/admin/src/app/(admin)/email-test/email-test-form.tsx:49)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/email-test/email-test-form.tsx:49` calls `POST /api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ab03ff4ca3ed7916", "name": "Dangling fetch: POST /api/trigger-workflow (apps/admin/src/app/(admin)/people/members/new/page.tsx:156)", "shortDescription": {"text": "Dangling fetch: POST /api/trigger-workflow (apps/admin/src/app/(admin)/people/members/new/page.tsx:156)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/people/members/new/page.tsx:156` calls `POST /api/trigger-workflow` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/trigger-workflow`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c310fde92837ac5d", "name": "Dangling fetch: POST /api/email/send (apps/admin/src/app/(admin)/people/members/[id]/page.tsx:709)", "shortDescription": {"text": "Dangling fetch: POST /api/email/send (apps/admin/src/app/(admin)/people/members/[id]/page.tsx:709)"}, "fullDescription": {"text": "`apps/admin/src/app/(admin)/people/members/[id]/page.tsx:709` calls `POST /api/email/send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/email/send`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-13820876ffdd7cfe", "name": "Dangling fetch: POST /api/upload-media (apps/admin/src/services/media.ts:61)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-media (apps/admin/src/services/media.ts:61)"}, "fullDescription": {"text": "`apps/admin/src/services/media.ts:61` calls `POST /api/upload-media` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-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-6bdd01ea1db78b05", "name": "Dangling fetch: POST /api/upload-image (apps/admin/src/services/contacts.ts:339)", "shortDescription": {"text": "Dangling fetch: POST /api/upload-image (apps/admin/src/services/contacts.ts:339)"}, "fullDescription": {"text": "`apps/admin/src/services/contacts.ts:339` calls `POST /api/upload-image` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/upload-image`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-87975f6541d37476", "name": "Dangling fetch: POST /api/events/register (apps/web/src/components/events/event-registration-form.tsx:95)", "shortDescription": {"text": "Dangling fetch: POST /api/events/register (apps/web/src/components/events/event-registration-form.tsx:95)"}, "fullDescription": {"text": "`apps/web/src/components/events/event-registration-form.tsx:95` calls `POST /api/events/register` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/events/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-6192a881f4b898b8", "name": "Dangling fetch: POST /api/donations/confirm-recurring (apps/web/src/components/sections/giving-form.tsx:77)", "shortDescription": {"text": "Dangling fetch: POST /api/donations/confirm-recurring (apps/web/src/components/sections/giving-form.tsx:77)"}, "fullDescription": {"text": "`apps/web/src/components/sections/giving-form.tsx:77` calls `POST /api/donations/confirm-recurring` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/donations/confirm-recurring`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4175e6c334a6303b", "name": "Dangling fetch: POST /api/donations/record-offline-payment (apps/web/src/components/sections/giving-form.tsx:347)", "shortDescription": {"text": "Dangling fetch: POST /api/donations/record-offline-payment (apps/web/src/components/sections/giving-form.tsx:347)"}, "fullDescription": {"text": "`apps/web/src/components/sections/giving-form.tsx:347` calls `POST /api/donations/record-offline-payment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/donations/record-offline-payment`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b854a335b1b779da", "name": "Dangling fetch: GET /api/events-list (apps/web/src/components/sections/planned-visit-form.tsx:62)", "shortDescription": {"text": "Dangling fetch: GET /api/events-list (apps/web/src/components/sections/planned-visit-form.tsx:62)"}, "fullDescription": {"text": "`apps/web/src/components/sections/planned-visit-form.tsx:62` calls `GET /api/events-list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/events-list`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-41826add1513e0aa", "name": "Dangling fetch: GET /api/media/collections?${params} (apps/web/src/components/sections/media-gallery-section.tsx:69)", "shortDescription": {"text": "Dangling fetch: GET /api/media/collections?${params} (apps/web/src/components/sections/media-gallery-section.tsx:69)"}, "fullDescription": {"text": "`apps/web/src/components/sections/media-gallery-section.tsx:69` calls `GET /api/media/collections?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/media/collections`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-42b1dbf019926e5d", "name": "Dangling fetch: GET /api/contact-page (apps/web/src/components/sections/office-hours.tsx:9)", "shortDescription": {"text": "Dangling fetch: GET /api/contact-page (apps/web/src/components/sections/office-hours.tsx:9)"}, "fullDescription": {"text": "`apps/web/src/components/sections/office-hours.tsx:9` calls `GET /api/contact-page` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/contact-page`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2cceb71f31114f3c", "name": "Dangling fetch: GET /api/blog-page (apps/web/src/hooks/useBlogPage.ts:88)", "shortDescription": {"text": "Dangling fetch: GET /api/blog-page (apps/web/src/hooks/useBlogPage.ts:88)"}, "fullDescription": {"text": "`apps/web/src/hooks/useBlogPage.ts:88` calls `GET /api/blog-page` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/blog-page`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-01b075c287b2d3b1", "name": "Dangling fetch: GET /api/events-page (apps/web/src/hooks/useEventsPage.ts:66)", "shortDescription": {"text": "Dangling fetch: GET /api/events-page (apps/web/src/hooks/useEventsPage.ts:66)"}, "fullDescription": {"text": "`apps/web/src/hooks/useEventsPage.ts:66` calls `GET /api/events-page` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/events-page`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8a2e265f40561067", "name": "Dangling fetch: GET /api/about (apps/web/src/hooks/useAbout.ts:93)", "shortDescription": {"text": "Dangling fetch: GET /api/about (apps/web/src/hooks/useAbout.ts:93)"}, "fullDescription": {"text": "`apps/web/src/hooks/useAbout.ts:93` calls `GET /api/about` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/about`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e000cb8d26104796", "name": "Dangling fetch: GET /api/giving-page (apps/web/src/hooks/useGivingPage.ts:35)", "shortDescription": {"text": "Dangling fetch: GET /api/giving-page (apps/web/src/hooks/useGivingPage.ts:35)"}, "fullDescription": {"text": "`apps/web/src/hooks/useGivingPage.ts:35` calls `GET /api/giving-page` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/giving-page`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d2430f951e5fe45e", "name": "Dangling fetch: GET /api/gallery-page (apps/web/src/hooks/useGalleryPage.ts:83)", "shortDescription": {"text": "Dangling fetch: GET /api/gallery-page (apps/web/src/hooks/useGalleryPage.ts:83)"}, "fullDescription": {"text": "`apps/web/src/hooks/useGalleryPage.ts:83` calls `GET /api/gallery-page` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/gallery-page`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6487da1c9bb5fa33", "name": "Dangling fetch: GET /api/sermons-page (apps/web/src/hooks/useSermonsPage.ts:79)", "shortDescription": {"text": "Dangling fetch: GET /api/sermons-page (apps/web/src/hooks/useSermonsPage.ts:79)"}, "fullDescription": {"text": "`apps/web/src/hooks/useSermonsPage.ts:79` calls `GET /api/sermons-page` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/sermons-page`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9c8fd0d3ccb28794", "name": "Dangling fetch: GET /api/contact-page (apps/web/src/hooks/useContactPage.ts:116)", "shortDescription": {"text": "Dangling fetch: GET /api/contact-page (apps/web/src/hooks/useContactPage.ts:116)"}, "fullDescription": {"text": "`apps/web/src/hooks/useContactPage.ts:116` calls `GET /api/contact-page` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/contact-page`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1bc898b3b7565990", "name": "Unused endpoint: USE /uploads", "shortDescription": {"text": "Unused endpoint: USE /uploads"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /uploads` 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-446fe4b6ad1a4ff9", "name": "Unused endpoint: USE /api/public", "shortDescription": {"text": "Unused endpoint: USE /api/public"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/public` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/auth` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-84bd4c31da0619b1", "name": "Unused endpoint: USE /api/uploads", "shortDescription": {"text": "Unused endpoint: USE /api/uploads"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/uploads` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e297457c06098dda", "name": "Unused endpoint: USE /api/admin/contacts", "shortDescription": {"text": "Unused endpoint: USE /api/admin/contacts"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/contacts` 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-554df9fd6434d881", "name": "Unused endpoint: USE /api/admin/members", "shortDescription": {"text": "Unused endpoint: USE /api/admin/members"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/members` 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-39db2b2c29a046c9", "name": "Unused endpoint: USE /api/admin/groups", "shortDescription": {"text": "Unused endpoint: USE /api/admin/groups"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/groups` 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-39bafdbdc6776011", "name": "Unused endpoint: USE /api/admin/events", "shortDescription": {"text": "Unused endpoint: USE /api/admin/events"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/events` 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-fe98af852e6ea8f5", "name": "Unused endpoint: USE /api/admin/event-tasks", "shortDescription": {"text": "Unused endpoint: USE /api/admin/event-tasks"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/event-tasks` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ec4881f63ed6122", "name": "Unused endpoint: USE /api/admin/transport", "shortDescription": {"text": "Unused endpoint: USE /api/admin/transport"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/transport` 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-0e895b26fdb6eb5c", "name": "Unused endpoint: USE /api/admin/content", "shortDescription": {"text": "Unused endpoint: USE /api/admin/content"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/content` 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-ebf1698736720618", "name": "Unused endpoint: USE /api/admin/attendance", "shortDescription": {"text": "Unused endpoint: USE /api/admin/attendance"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/attendance` 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-98ac120b9b1c669b", "name": "Unused endpoint: USE /api/admin/visitors", "shortDescription": {"text": "Unused endpoint: USE /api/admin/visitors"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/visitors` 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-dc812487abb4c393", "name": "Unused endpoint: USE /api/admin/follow-ups", "shortDescription": {"text": "Unused endpoint: USE /api/admin/follow-ups"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/follow-ups` 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-9d579b1e57c6329a", "name": "Unused endpoint: USE /api/admin/prayer-requests", "shortDescription": {"text": "Unused endpoint: USE /api/admin/prayer-requests"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/prayer-requests` 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-1d1d589dade328ed", "name": "Unused endpoint: USE /api/admin/soul-winning", "shortDescription": {"text": "Unused endpoint: USE /api/admin/soul-winning"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/soul-winning` 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-215dd45c94b5fcf2", "name": "Unused endpoint: USE /api/admin/mobile-app-users", "shortDescription": {"text": "Unused endpoint: USE /api/admin/mobile-app-users"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/mobile-app-users` 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-581a3f226503e318", "name": "Unused endpoint: USE /api/admin/planned-visits", "shortDescription": {"text": "Unused endpoint: USE /api/admin/planned-visits"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/planned-visits` 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-dd45438c0318f3a9", "name": "Unused endpoint: USE /api/admin/get-involved", "shortDescription": {"text": "Unused endpoint: USE /api/admin/get-involved"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/get-involved` 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-aa1fa1c4fae89fdc", "name": "Unused endpoint: USE /api/admin/website-messages", "shortDescription": {"text": "Unused endpoint: USE /api/admin/website-messages"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/website-messages` 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-ced78b8d36f856c3", "name": "Unused endpoint: USE /api/admin/footer", "shortDescription": {"text": "Unused endpoint: USE /api/admin/footer"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/footer` 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-854f84390b975fae", "name": "Unused endpoint: USE /api/admin/debug", "shortDescription": {"text": "Unused endpoint: USE /api/admin/debug"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/debug` 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-4e2cfe36e6843620", "name": "Unused endpoint: USE /api/admin/assets", "shortDescription": {"text": "Unused endpoint: USE /api/admin/assets"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/assets` 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-02bb5ce96f064b2c", "name": "Unused endpoint: USE /api/admin/expenses", "shortDescription": {"text": "Unused endpoint: USE /api/admin/expenses"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/expenses` 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-27d710506af72b66", "name": "Unused endpoint: USE /api/admin/transactions", "shortDescription": {"text": "Unused endpoint: USE /api/admin/transactions"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/transactions` 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-f06b8bc926923543", "name": "Unused endpoint: USE /api/admin/giving", "shortDescription": {"text": "Unused endpoint: USE /api/admin/giving"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/giving` 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-fafc2b56db9b14e5", "name": "Unused endpoint: USE /api/admin/settings", "shortDescription": {"text": "Unused endpoint: USE /api/admin/settings"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/settings` 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-e0cdfc54d1b370bd", "name": "Unused endpoint: USE /api/admin/users", "shortDescription": {"text": "Unused endpoint: USE /api/admin/users"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/users` 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-c60c0cc04774e3db", "name": "Unused endpoint: USE /api/admin/workflows", "shortDescription": {"text": "Unused endpoint: USE /api/admin/workflows"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/workflows` 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-d30b8a3507beb9df", "name": "Unused endpoint: USE /api/admin/comms", "shortDescription": {"text": "Unused endpoint: USE /api/admin/comms"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/comms` 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-1531e8eec46b09a3", "name": "Unused endpoint: USE /api/admin/meetings", "shortDescription": {"text": "Unused endpoint: USE /api/admin/meetings"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/meetings` 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-66c64dec2ce80528", "name": "Unused endpoint: USE /api/admin/discipleship", "shortDescription": {"text": "Unused endpoint: USE /api/admin/discipleship"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/discipleship` 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-a29e3c48f16dc456", "name": "Unused endpoint: USE /api/admin/notifications", "shortDescription": {"text": "Unused endpoint: USE /api/admin/notifications"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/notifications` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23bb1fec573b0241", "name": "Unused endpoint: USE /api/admin/reports", "shortDescription": {"text": "Unused endpoint: USE /api/admin/reports"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/reports` 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-e12115b7e5c20b4d", "name": "Unused endpoint: USE /api/admin/newsletter", "shortDescription": {"text": "Unused endpoint: USE /api/admin/newsletter"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/newsletter` 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-4c94202c2d87daa3", "name": "Unused endpoint: USE /api/admin/departments", "shortDescription": {"text": "Unused endpoint: USE /api/admin/departments"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/admin/departments` 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-203ec659ed8ada77", "name": "Unused endpoint: USE /api/webhooks", "shortDescription": {"text": "Unused endpoint: USE /api/webhooks"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/webhooks` 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-5a93b9e2f666daa8", "name": "Unused endpoint: USE /api/mobile", "shortDescription": {"text": "Unused endpoint: USE /api/mobile"}, "fullDescription": {"text": "`apps/api/src/server.js` declares `USE /api/mobile` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transactions.js` 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}}, {"id": "scanner-5a3860daa751399d", "name": "Unused endpoint: GET /ytd-total", "shortDescription": {"text": "Unused endpoint: GET /ytd-total"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transactions.js` declares `GET /ytd-total` 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-3ae5fabcb66fb3cb", "name": "Unused endpoint: GET /monthly-average", "shortDescription": {"text": "Unused endpoint: GET /monthly-average"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transactions.js` declares `GET /monthly-average` 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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transactions.js` declares `GET /:id` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transactions.js` declares `POST /` 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-5fbc954f63526821", "name": "Unused endpoint: PATCH /:id", "shortDescription": {"text": "Unused endpoint: PATCH /:id"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transactions.js` declares `PATCH /:id` 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-7a61c112b611f4bb", "name": "Unused endpoint: DELETE /:id", "shortDescription": {"text": "Unused endpoint: DELETE /:id"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transactions.js` declares `DELETE /:id` 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-42719ea76f9ecae3", "name": "Unused endpoint: GET /requests", "shortDescription": {"text": "Unused endpoint: GET /requests"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transport.js` declares `GET /requests` 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-b810fcd90b72b11f", "name": "Unused endpoint: GET /requests/:id", "shortDescription": {"text": "Unused endpoint: GET /requests/:id"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transport.js` declares `GET /requests/:id` 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-6c6a40b1125dae56", "name": "Unused endpoint: POST /requests", "shortDescription": {"text": "Unused endpoint: POST /requests"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transport.js` declares `POST /requests` 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-453581366e96a065", "name": "Unused endpoint: PATCH /requests/:id", "shortDescription": {"text": "Unused endpoint: PATCH /requests/:id"}, "fullDescription": {"text": "`apps/api/src/routes/admin-transport.js` declares `PATCH /requests/:id` 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/22194"}, "properties": {"repository": "ViableSystemsGlobal/finaldocmproject", "repoUrl": "https://github.com/ViableSystemsGlobal/finaldocmproject", "branch": "main"}, "results": [{"ruleId": "scanner-99beafb474489bea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-attendance-data.js:5"}, "properties": {"repobilityId": "6468d949c0b77dca", "scanner": "scanner-primary", "fingerprint": "99beafb474489bea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-46e41746b42b367f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-email-service.js:22"}, "properties": {"repobilityId": "307734c52609ed34", "scanner": "scanner-primary", "fingerprint": "46e41746b42b367f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d19bf078b16c1ee5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-prayer-schema.js:10"}, "properties": {"repobilityId": "c7abd7de4a925021", "scanner": "scanner-primary", "fingerprint": "d19bf078b16c1ee5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a557ee3f635fd50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apply-approval-migration.js:11"}, "properties": {"repobilityId": "106689259c7af7e5", "scanner": "scanner-primary", "fingerprint": "5a557ee3f635fd50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bee66ab1724bda5a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-member-details-real-data.js:4"}, "properties": {"repobilityId": "0da8b00f92de2ef5", "scanner": "scanner-primary", "fingerprint": "bee66ab1724bda5a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5badcf7c5ee5a4e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 monitor_tokens.js:37"}, "properties": {"repobilityId": "e4a36082f9738f42", "scanner": "scanner-primary", "fingerprint": "5badcf7c5ee5a4e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-726872093866b9d6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_workflow_debug.js:19"}, "properties": {"repobilityId": "635ce38f494344e6", "scanner": "scanner-primary", "fingerprint": "726872093866b9d6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81e36d870086c3f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 send_welcome_emails.js:11"}, "properties": {"repobilityId": "2dc054453e319294", "scanner": "scanner-primary", "fingerprint": "81e36d870086c3f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a113178ab9e38b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_regex.js:10"}, "properties": {"repobilityId": "ccb1e4b489136a73", "scanner": "scanner-primary", "fingerprint": "4a113178ab9e38b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-828a82e2601a7621", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-rls-policies.js:15"}, "properties": {"repobilityId": "0ec2a8a5adddd2ae", "scanner": "scanner-primary", "fingerprint": "828a82e2601a7621", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f33743e695e2e105", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-database-connection.js:8"}, "properties": {"repobilityId": "1e6196f3455215e4", "scanner": "scanner-primary", "fingerprint": "f33743e695e2e105", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d28e249926d3705f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-email-queue.js:8"}, "properties": {"repobilityId": "d93e2cf7dd5f92f9", "scanner": "scanner-primary", "fingerprint": "d28e249926d3705f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b9a571e4fb583c72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-rpc-function.js:7"}, "properties": {"repobilityId": "ec7f81f87ec90d86", "scanner": "scanner-primary", "fingerprint": "b9a571e4fb583c72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77995ea6120a884c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 find-newsletter-tables.js:10"}, "properties": {"repobilityId": "48211d0d84cf42fd", "scanner": "scanner-primary", "fingerprint": "77995ea6120a884c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4ee75e0afd2b9da8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fix_suspense.js:13"}, "properties": {"repobilityId": "19f6166df1f23745", "scanner": "scanner-primary", "fingerprint": "4ee75e0afd2b9da8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3596110a6d5e0019", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_trigger_manually.js:11"}, "properties": {"repobilityId": "271095cc38ab5cdc", "scanner": "scanner-primary", "fingerprint": "3596110a6d5e0019", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bf77f80b3d7af6e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-notifications.js:10"}, "properties": {"repobilityId": "fb44b38f0007abb0", "scanner": "scanner-primary", "fingerprint": "3bf77f80b3d7af6e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09672f4c90b78e50", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-attendance-tables.js:5"}, "properties": {"repobilityId": "6a4a6985bb595bd9", "scanner": "scanner-primary", "fingerprint": "09672f4c90b78e50", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-50558361e26491db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-prayer-table.js:7"}, "properties": {"repobilityId": "334fd390043786e7", "scanner": "scanner-primary", "fingerprint": "50558361e26491db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db03c0ccbd296ad5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-member-metrics.js:11"}, "properties": {"repobilityId": "fa3695a1e9fb181b", "scanner": "scanner-primary", "fingerprint": "db03c0ccbd296ad5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0d3b68ebc5f029f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_real_workflow.js:11"}, "properties": {"repobilityId": "25c2128fbc3d8699", "scanner": "scanner-primary", "fingerprint": "f0d3b68ebc5f029f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5ac1b4139c49f52", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-simple-member-details.js:4"}, "properties": {"repobilityId": "fb6800d3a43362f7", "scanner": "scanner-primary", "fingerprint": "b5ac1b4139c49f52", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e6806df81cbbba64", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-fixed-giving-summary.js:12"}, "properties": {"repobilityId": "1840635c74ac87ef", "scanner": "scanner-primary", "fingerprint": "e6806df81cbbba64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a0a4ca50f459b96c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 add-table-checkboxes.js:110"}, "properties": {"repobilityId": "97d257e528ea91b8", "scanner": "scanner-primary", "fingerprint": "a0a4ca50f459b96c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-231fa02e716f35f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-upload-debug.js:5"}, "properties": {"repobilityId": "b7a17fe35297d5ee", "scanner": "scanner-primary", "fingerprint": "231fa02e716f35f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-96284def8f62b41d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_new_email_service.js:10"}, "properties": {"repobilityId": "a5ebcbc9311f1773", "scanner": "scanner-primary", "fingerprint": "96284def8f62b41d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44aa2d45d0a9d3f5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 process_pending_emails.js:10"}, "properties": {"repobilityId": "88d658c42809fc1f", "scanner": "scanner-primary", "fingerprint": "44aa2d45d0a9d3f5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6ab257d04726c3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug-video-upload.js:5"}, "properties": {"repobilityId": "4eb53c2becab83f3", "scanner": "scanner-primary", "fingerprint": "f6ab257d04726c3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-339fcd486b0bffc5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 create_sample_transport_data.js:11"}, "properties": {"repobilityId": "a3641e4d0210631d", "scanner": "scanner-primary", "fingerprint": "339fcd486b0bffc5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d67c37fab2b47a7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apply_trigger_fix.js:10"}, "properties": {"repobilityId": "876e114ddef03fd6", "scanner": "scanner-primary", "fingerprint": "d67c37fab2b47a7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8889ae9a41102542", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 reset_failed_emails.js:10"}, "properties": {"repobilityId": "dc9d42dc895847c8", "scanner": "scanner-primary", "fingerprint": "8889ae9a41102542", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f44879e34513b29", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-tables-ready.js:5"}, "properties": {"repobilityId": "30ff15983535fc53", "scanner": "scanner-primary", "fingerprint": "5f44879e34513b29", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2359868321b61d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-transactions-table.js:5"}, "properties": {"repobilityId": "bc9c31527dedfb51", "scanner": "scanner-primary", "fingerprint": "a2359868321b61d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eae6cdd65c4750f8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 direct-newsletter-test.js:7"}, "properties": {"repobilityId": "c6089c66c775febc", "scanner": "scanner-primary", "fingerprint": "eae6cdd65c4750f8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6cab5ef444fb5f08", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_automatic_triggers.js:19"}, "properties": {"repobilityId": "3fe4aefaef2c96f5", "scanner": "scanner-primary", "fingerprint": "6cab5ef444fb5f08", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35bba330616c5b60", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-member-details-env.js:5"}, "properties": {"repobilityId": "b07df2d76ad9997c", "scanner": "scanner-primary", "fingerprint": "35bba330616c5b60", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-958da71596ffe0d9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apply_welcome_triggers_fix.js:11"}, "properties": {"repobilityId": "be1fa8f7cfe64159", "scanner": "scanner-primary", "fingerprint": "958da71596ffe0d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d94c96bd639d7ea8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_member_automation.js:10"}, "properties": {"repobilityId": "dc6ad1b272d3e338", "scanner": "scanner-primary", "fingerprint": "d94c96bd639d7ea8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-85b382c637efe98f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 replace_test_tokens.js:12"}, "properties": {"repobilityId": "5fc0aadcb7252658", "scanner": "scanner-primary", "fingerprint": "85b382c637efe98f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2c082b822c4abf76", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-member-details-fix.js:5"}, "properties": {"repobilityId": "b4ea61f17b358555", "scanner": "scanner-primary", "fingerprint": "2c082b822c4abf76", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a3639f703c9e419", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fix_prayer_rls_now.js:16"}, "properties": {"repobilityId": "31c24b33b16ab3dc", "scanner": "scanner-primary", "fingerprint": "5a3639f703c9e419", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2705f240b06d5ac7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-journey-pagination.js:11"}, "properties": {"repobilityId": "9f52f8b799b0ec8b", "scanner": "scanner-primary", "fingerprint": "2705f240b06d5ac7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78d8d24482b3b791", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-fixed-attendance.js:12"}, "properties": {"repobilityId": "536af7d73894f4ac", "scanner": "scanner-primary", "fingerprint": "78d8d24482b3b791", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5fdd1477016406e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_workflow_direct.js:12"}, "properties": {"repobilityId": "a365af88259312a4", "scanner": "scanner-primary", "fingerprint": "b5fdd1477016406e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0498863abc23876a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug-member-details.js:5"}, "properties": {"repobilityId": "50dc78b07fb47de6", "scanner": "scanner-primary", "fingerprint": "0498863abc23876a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-86d57dbef1ff2684", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_member_creation_trigger.js:14"}, "properties": {"repobilityId": "4c15e439f23faced", "scanner": "scanner-primary", "fingerprint": "86d57dbef1ff2684", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84016e7f4ad3161a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 verify-fixes.js:16"}, "properties": {"repobilityId": "53f0495365d5383b", "scanner": "scanner-primary", "fingerprint": "84016e7f4ad3161a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c652cc43b388b35b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-database-fixes.js:16"}, "properties": {"repobilityId": "b4712c61588281aa", "scanner": "scanner-primary", "fingerprint": "c652cc43b388b35b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0878cd06d19e4f01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check_current_data.js:12"}, "properties": {"repobilityId": "452207333d2bb8dc", "scanner": "scanner-primary", "fingerprint": "0878cd06d19e4f01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-deb4787f5a7afb8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check_triggers.js:10"}, "properties": {"repobilityId": "b28f43e570c27427", "scanner": "scanner-primary", "fingerprint": "deb4787f5a7afb8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cd4ad16edb4cb4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-giving-summary.js:5"}, "properties": {"repobilityId": "eccf048ec15a0207", "scanner": "scanner-primary", "fingerprint": "5cd4ad16edb4cb4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e68be24b2037e5d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-prayer-notifications.js:19"}, "properties": {"repobilityId": "f2fcb3e9afb5bc43", "scanner": "scanner-primary", "fingerprint": "e68be24b2037e5d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-62fa65b600687f89", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 debug_email_queue.js:10"}, "properties": {"repobilityId": "fcb0e66b7c1cdc39", "scanner": "scanner-primary", "fingerprint": "62fa65b600687f89", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-190b622eaff310b7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-database-structure.js:5"}, "properties": {"repobilityId": "1b413fa5d9933643", "scanner": "scanner-primary", "fingerprint": "190b622eaff310b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b82b9596a59b35bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-prayer-newsletter.js:15"}, "properties": {"repobilityId": "b4598e70129e10a4", "scanner": "scanner-primary", "fingerprint": "b82b9596a59b35bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-927edaca9672099b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check-newsletter-count.js:10"}, "properties": {"repobilityId": "6e6637a964e4d1fb", "scanner": "scanner-primary", "fingerprint": "927edaca9672099b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-829ea2f9b9414785", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-notification-integration.js:8"}, "properties": {"repobilityId": "78258534c0430713", "scanner": "scanner-primary", "fingerprint": "829ea2f9b9414785", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4f247c32cd056c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 quick_test.js:16"}, "properties": {"repobilityId": "de6dfb5d01a4a550", "scanner": "scanner-primary", "fingerprint": "d4f247c32cd056c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70a9509c90bd34fb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 check_tenant.js:12"}, "properties": {"repobilityId": "70fe3da4eca12fa8", "scanner": "scanner-primary", "fingerprint": "70a9509c90bd34fb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-da942546a038fcaa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-pagination.js:12"}, "properties": {"repobilityId": "4e26d460740c5bfc", "scanner": "scanner-primary", "fingerprint": "da942546a038fcaa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3ec5477d578bda0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/seed-admin.js:25"}, "properties": {"repobilityId": "3a7c9d6eb2449b95", "scanner": "scanner-primary", "fingerprint": "a3ec5477d578bda0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ab812b4dc9bf324", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/schema-bootstrap.js:89"}, "properties": {"repobilityId": "da8499be4583ef3f", "scanner": "scanner-primary", "fingerprint": "9ab812b4dc9bf324", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6982a38bd7b4dc32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/server.js:64"}, "properties": {"repobilityId": "58f1744a692de890", "scanner": "scanner-primary", "fingerprint": "6982a38bd7b4dc32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8d26f2cc51c0ab6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/import-public-content.js:37"}, "properties": {"repobilityId": "d0647375a9409215", "scanner": "scanner-primary", "fingerprint": "f8d26f2cc51c0ab6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c37548d7bf819ea9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/routes/webhooks.js:86"}, "properties": {"repobilityId": "a12683b09d62604f", "scanner": "scanner-primary", "fingerprint": "c37548d7bf819ea9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3a46f9ba751d1d8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/test-contact-lookup.js:11"}, "properties": {"repobilityId": "3893d07d4e120d8a", "scanner": "scanner-primary", "fingerprint": "3a46f9ba751d1d8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-75d043b4aa1ab8e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/contexts/NotificationsContext.tsx:64"}, "properties": {"repobilityId": "c43b0c8afb98c61d", "scanner": "scanner-primary", "fingerprint": "75d043b4aa1ab8e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c53c0fac3a0a1f56", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/lib/auth.ts:37"}, "properties": {"repobilityId": "f9a40ff1613d390f", "scanner": "scanner-primary", "fingerprint": "c53c0fac3a0a1f56", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ec95a4cbb31e7922", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/lib/supabase.ts:29"}, "properties": {"repobilityId": "80780fe81bc82615", "scanner": "scanner-primary", "fingerprint": "ec95a4cbb31e7922", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3f3dfd30aa5daabf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/services/branding.ts:46"}, "properties": {"repobilityId": "92578901ef2358cd", "scanner": "scanner-primary", "fingerprint": "3f3dfd30aa5daabf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6105af749582049b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/mobile/src/services/pushNotifications.ts:77"}, "properties": {"repobilityId": "57cd4e01c6d9ea84", "scanner": "scanner-primary", "fingerprint": "6105af749582049b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ce04afdf7a928f76", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix-campaign-totals.js:7"}, "properties": {"repobilityId": "8a783609680f29a4", "scanner": "scanner-primary", "fingerprint": "ce04afdf7a928f76", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ec22840ddc269e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test_real_push_token.js:15"}, "properties": {"repobilityId": "7c590295dcbc3615", "scanner": "scanner-primary", "fingerprint": "8ec22840ddc269e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5d7894715c9d661", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_welcome_template.js:9"}, "properties": {"repobilityId": "65af11d0d82b08a5", "scanner": "scanner-primary", "fingerprint": "b5d7894715c9d661", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd4ed362f09d204b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_push_notifications.js:21"}, "properties": {"repobilityId": "c9d3afdc07253cca", "scanner": "scanner-primary", "fingerprint": "dd4ed362f09d204b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ac2d38cc37bbe1e1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/add_real_test_token.js:17"}, "properties": {"repobilityId": "70bca0d2d3f8b2b9", "scanner": "scanner-primary", "fingerprint": "ac2d38cc37bbe1e1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a43cc0ad8be9b350", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-notification-function.js:9"}, "properties": {"repobilityId": "25e28e497a1081ed", "scanner": "scanner-primary", "fingerprint": "a43cc0ad8be9b350", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b0c1246b978b296b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-notifications.js:9"}, "properties": {"repobilityId": "43a597708228b078", "scanner": "scanner-primary", "fingerprint": "b0c1246b978b296b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-726cc357be92e168", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_transport_routes_schema.js:11"}, "properties": {"repobilityId": "582246e74f4504ec", "scanner": "scanner-primary", "fingerprint": "726cc357be92e168", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-167b401c57a68250", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test_fixed_api.js:12"}, "properties": {"repobilityId": "22ca3c80b8e6cafa", "scanner": "scanner-primary", "fingerprint": "167b401c57a68250", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48aea0d957b256f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug-transaction.js:9"}, "properties": {"repobilityId": "7eb6db3a314d3fa8", "scanner": "scanner-primary", "fingerprint": "48aea0d957b256f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa7615549a66a497", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug_joins.js:12"}, "properties": {"repobilityId": "1eb34380a3bad922", "scanner": "scanner-primary", "fingerprint": "fa7615549a66a497", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-19e7d256f9b46467", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-create-payment-table.js:16"}, "properties": {"repobilityId": "8171d3ddbb44b8ae", "scanner": "scanner-primary", "fingerprint": "19e7d256f9b46467", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f6b24b1610a227e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/fix_triggers.js:9"}, "properties": {"repobilityId": "50b92d7ead70b251", "scanner": "scanner-primary", "fingerprint": "7f6b24b1610a227e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6163305738aeb2e5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_all_requests.js:12"}, "properties": {"repobilityId": "6fb1eea569de3e03", "scanner": "scanner-primary", "fingerprint": "6163305738aeb2e5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3b9817a2c8df93c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug_transport_summary.js:34"}, "properties": {"repobilityId": "dd5c51ec44a99c9a", "scanner": "scanner-primary", "fingerprint": "e3b9817a2c8df93c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c778804e6895eafb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_route_structure.js:12"}, "properties": {"repobilityId": "e4da88d32417f312", "scanner": "scanner-primary", "fingerprint": "c778804e6895eafb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de37d1cfd9eb62d5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/create_welcome_template.js:9"}, "properties": {"repobilityId": "c3d5b198b80c30ae", "scanner": "scanner-primary", "fingerprint": "de37d1cfd9eb62d5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3bd7b37e565499b4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_current_data.js:12"}, "properties": {"repobilityId": "5f95075d14b29557", "scanner": "scanner-primary", "fingerprint": "3bd7b37e565499b4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48e6d40bf65f9f28", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-campaign-link.js:4"}, "properties": {"repobilityId": "074224b81e655a81", "scanner": "scanner-primary", "fingerprint": "48e6d40bf65f9f28", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0e5738f5a0a920be", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/queue_welcome_emails.js:9"}, "properties": {"repobilityId": "06d706a1cbd29da0", "scanner": "scanner-primary", "fingerprint": "0e5738f5a0a920be", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a600893f09084961", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/debug-env.js:1"}, "properties": {"repobilityId": "23452832224028a5", "scanner": "scanner-primary", "fingerprint": "a600893f09084961", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-533fc9aec3aaacab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/check_current_status.js:32"}, "properties": {"repobilityId": "d2f45c77933435bd", "scanner": "scanner-primary", "fingerprint": "533fc9aec3aaacab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8bfb09d7e95df08b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/test-stripe-integration.js:5"}, "properties": {"repobilityId": "6ac32d32d349e861", "scanner": "scanner-primary", "fingerprint": "8bfb09d7e95df08b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e185f6281aec744", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/scripts/generate-template.ts:54"}, "properties": {"repobilityId": "06b5fa4811ff4d54", "scanner": "scanner-primary", "fingerprint": "2e185f6281aec744", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca121d9670019f43", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/EnhancedDeleteContactDialog.tsx:57"}, "properties": {"repobilityId": "017bbadd8096cd15", "scanner": "scanner-primary", "fingerprint": "ca121d9670019f43", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b1f51e5509098de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/EnhancedGroupMessageModal.tsx:174"}, "properties": {"repobilityId": "278aaa4659fcef3b", "scanner": "scanner-primary", "fingerprint": "9b1f51e5509098de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-486f844b98e33707", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/GroupMessageModal.tsx:209"}, "properties": {"repobilityId": "34fab72a046516a5", "scanner": "scanner-primary", "fingerprint": "486f844b98e33707", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-733bae9d5487590d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/MeetingPlanningTab.tsx:153"}, "properties": {"repobilityId": "901500bf253659d6", "scanner": "scanner-primary", "fingerprint": "733bae9d5487590d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f679d3d45fb04c81", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/GooglePlacesInput.tsx:456"}, "properties": {"repobilityId": "c19e3b20aa35f7e9", "scanner": "scanner-primary", "fingerprint": "f679d3d45fb04c81", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-819ccefa081e7319", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/GooglePlacesInput.tsx:66"}, "properties": {"repobilityId": "a17a41a6c9b0e00c", "scanner": "scanner-primary", "fingerprint": "819ccefa081e7319", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d27a5259fdcdb88", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ContactForm.tsx:64"}, "properties": {"repobilityId": "80d636f4c2a0bf85", "scanner": "scanner-primary", "fingerprint": "5d27a5259fdcdb88", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-13c33c7fb0d1c299", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/avatar.tsx:24"}, "properties": {"repobilityId": "9b86c4093d366844", "scanner": "scanner-primary", "fingerprint": "13c33c7fb0d1c299", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-35ee9aa49ac13adf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/FileUpload.tsx:147"}, "properties": {"repobilityId": "10da7e2677e0132c", "scanner": "scanner-primary", "fingerprint": "35ee9aa49ac13adf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-707bda53b40ee7e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/address-autocomplete.tsx:67"}, "properties": {"repobilityId": "c5e43d16c0b05aae", "scanner": "scanner-primary", "fingerprint": "707bda53b40ee7e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2892efe296932ee", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/ui/use-toast.ts:11"}, "properties": {"repobilityId": "3e238d74539ab3c7", "scanner": "scanner-primary", "fingerprint": "e2892efe296932ee", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4851ffe216cdddb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/ui/searchable-select.tsx:175"}, "properties": {"repobilityId": "a6c6d381d562b18e", "scanner": "scanner-primary", "fingerprint": "4851ffe216cdddb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b37e4997dba2fc36", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/EventTransportTab.tsx:819"}, "properties": {"repobilityId": "290a9cd95fabb88b", "scanner": "scanner-primary", "fingerprint": "b37e4997dba2fc36", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7fcd6d4d059a0ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/EventTransportTab.tsx:552"}, "properties": {"repobilityId": "e35dd820565e679a", "scanner": "scanner-primary", "fingerprint": "a7fcd6d4d059a0ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-09f4ed3e58e28945", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/VehicleCapacityDashboard.tsx:277"}, "properties": {"repobilityId": "23c8a6d51f48eec4", "scanner": "scanner-primary", "fingerprint": "09f4ed3e58e28945", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c141fbce2285a07", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/transport/AutoAssignModal.tsx:642"}, "properties": {"repobilityId": "02070551432bb0ad", "scanner": "scanner-primary", "fingerprint": "1c141fbce2285a07", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7917ac43604c9881", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/AutoAssignModal.tsx:122"}, "properties": {"repobilityId": "b1ab8c253bd92bdc", "scanner": "scanner-primary", "fingerprint": "7917ac43604c9881", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8993383a5939a98b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/transport/AddressAutocomplete.tsx:67"}, "properties": {"repobilityId": "10a9701ce252e7b5", "scanner": "scanner-primary", "fingerprint": "8993383a5939a98b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9627fcb6d8584044", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/content/MediaPicker.tsx:217"}, "properties": {"repobilityId": "54c64b2afefc4634", "scanner": "scanner-primary", "fingerprint": "9627fcb6d8584044", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2fa5fd76bd151f1a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/content/PageEditor.tsx:425"}, "properties": {"repobilityId": "cccddb2e12217257", "scanner": "scanner-primary", "fingerprint": "2fa5fd76bd151f1a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a17816d751ec213", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/components/Layout/AdminLayout.tsx:730"}, "properties": {"repobilityId": "f417afdf94c13ded", "scanner": "scanner-primary", "fingerprint": "0a17816d751ec213", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9bfed80031ac5a7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/Layout/AdminLayout.tsx:413"}, "properties": {"repobilityId": "d00e10e094f46738", "scanner": "scanner-primary", "fingerprint": "9bfed80031ac5a7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-84fbd4874cd50381", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/components/discipleship/GroupMessageModal.tsx:213"}, "properties": {"repobilityId": "50d75b859e3dedd6", "scanner": "scanner-primary", "fingerprint": "84fbd4874cd50381", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aa20775df1bcc82f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/test-upload/page.tsx:32"}, "properties": {"repobilityId": "3f94bb601e85c0d9", "scanner": "scanner-primary", "fingerprint": "aa20775df1bcc82f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e36249f5b826ac33", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/login/page.tsx:56"}, "properties": {"repobilityId": "eb9f2b157a6936df", "scanner": "scanner-primary", "fingerprint": "e36249f5b826ac33", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f2e1982436510c4c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/settings/communications/route.ts:14"}, "properties": {"repobilityId": "68552e02a4cfb26e", "scanner": "scanner-primary", "fingerprint": "f2e1982436510c4c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a8b356658b48bdc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/health/route.ts:27"}, "properties": {"repobilityId": "1674668cdb841f98", "scanner": "scanner-primary", "fingerprint": "0a8b356658b48bdc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-89882efe8d0284e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/test/route.ts:5"}, "properties": {"repobilityId": "6146e0a56376b58c", "scanner": "scanner-primary", "fingerprint": "89882efe8d0284e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eae96694987eb1b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send/route.ts:54"}, "properties": {"repobilityId": "2258c5bdb61ff6c2", "scanner": "scanner-primary", "fingerprint": "eae96694987eb1b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2cbda9768b33514", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-with-sendgrid/route.ts:92"}, "properties": {"repobilityId": "2e90d852af866295", "scanner": "scanner-primary", "fingerprint": "e2cbda9768b33514", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43ce3a9a607269aa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-direct/route.ts:25"}, "properties": {"repobilityId": "6803fcb5debc1617", "scanner": "scanner-primary", "fingerprint": "43ce3a9a607269aa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-89d66b965c7e99fe", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/test-system/route.ts:9"}, "properties": {"repobilityId": "8910bfd558203c3d", "scanner": "scanner-primary", "fingerprint": "89d66b965c7e99fe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f522c09edb35360f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/bypass-queue/route.ts:41"}, "properties": {"repobilityId": "4b59bc30f4dbd885", "scanner": "scanner-primary", "fingerprint": "f522c09edb35360f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-210b25a26f411445", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/process-queue/route.ts:11"}, "properties": {"repobilityId": "7b0a1e80cbfa1315", "scanner": "scanner-primary", "fingerprint": "210b25a26f411445", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11e8826d603e3e84", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/email/send-database-smtp/route.ts:31"}, "properties": {"repobilityId": "4ee372a168ca4185", "scanner": "scanner-primary", "fingerprint": "11e8826d603e3e84", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a78d71d96597a5d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/api/tenant-settings/route.ts:6"}, "properties": {"repobilityId": "360a321ad56f7b50", "scanner": "scanner-primary", "fingerprint": "4a78d71d96597a5d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e16f3ba59be514cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/giving-categories/page.tsx:457"}, "properties": {"repobilityId": "8b887aaea6bc3997", "scanner": "scanner-primary", "fingerprint": "e16f3ba59be514cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e3c3c86212fe863", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/comms-defaults/page.tsx:342"}, "properties": {"repobilityId": "be43d9904bb8c639", "scanner": "scanner-primary", "fingerprint": "2e3c3c86212fe863", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2604296db33338f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/settings/roles/page.tsx:989"}, "properties": {"repobilityId": "4f6b23e15fd2c223", "scanner": "scanner-primary", "fingerprint": "a2604296db33338f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5480dde8cd8c37f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/roles/page.tsx:641"}, "properties": {"repobilityId": "7f45cf14ab8eaca1", "scanner": "scanner-primary", "fingerprint": "5480dde8cd8c37f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-034f0e5373df6d1b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/profile/page.tsx:123"}, "properties": {"repobilityId": "c24acd2074b5ead1", "scanner": "scanner-primary", "fingerprint": "034f0e5373df6d1b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22b287d27d6e84c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/settings/tenant/page.tsx:318"}, "properties": {"repobilityId": "433c2657fc35942d", "scanner": "scanner-primary", "fingerprint": "22b287d27d6e84c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eaa02f60ba8dbc3b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/templates/page.tsx:68"}, "properties": {"repobilityId": "b3078ef2a1b93725", "scanner": "scanner-primary", "fingerprint": "eaa02f60ba8dbc3b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-81245822c8f4213a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/campaigns/page.tsx:140"}, "properties": {"repobilityId": "99cf52d6b8b04d5d", "scanner": "scanner-primary", "fingerprint": "81245822c8f4213a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1bba0ab585cd956f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/comms/campaigns/new/page.tsx:138"}, "properties": {"repobilityId": "6b78311986f31be2", "scanner": "scanner-primary", "fingerprint": "1bba0ab585cd956f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f7d5256eacb3b94", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/(admin)/comms/campaigns/[id]/page.tsx:508"}, "properties": {"repobilityId": "8995d86a3159add2", "scanner": "scanner-primary", "fingerprint": "7f7d5256eacb3b94", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f9376e99951d3eaf", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:327"}, "properties": {"repobilityId": "3d482411b1c75788", "scanner": "scanner-primary", "fingerprint": "f9376e99951d3eaf", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-25719bfa9aaec5ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/events/page.tsx:764"}, "properties": {"repobilityId": "917078f132bbedf4", "scanner": "scanner-primary", "fingerprint": "25719bfa9aaec5ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6252d9b98a82076a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/page.tsx:281"}, "properties": {"repobilityId": "067acf44138e4071", "scanner": "scanner-primary", "fingerprint": "6252d9b98a82076a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-da5f08838869c93a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/new/page.tsx:195"}, "properties": {"repobilityId": "55dd9ab66f7a3215", "scanner": "scanner-primary", "fingerprint": "da5f08838869c93a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4235eb404c650d72", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/events/[id]/page.tsx:225"}, "properties": {"repobilityId": "1893861f1f04b43f", "scanner": "scanner-primary", "fingerprint": "4235eb404c650d72", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-aeeda385c648becf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/events/[id]/transport/page.tsx:520"}, "properties": {"repobilityId": "0acdddaaec87583a", "scanner": "scanner-primary", "fingerprint": "aeeda385c648becf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dab8242b00a94227", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/dashboard/page.tsx:775"}, "properties": {"repobilityId": "056d52b260e4652d", "scanner": "scanner-primary", "fingerprint": "dab8242b00a94227", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f86ccc6c5adc962e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/expenses/page.tsx:302"}, "properties": {"repobilityId": "fc93c49ed474eafe", "scanner": "scanner-primary", "fingerprint": "f86ccc6c5adc962e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c2de7a01bef3377", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/page.tsx:374"}, "properties": {"repobilityId": "568bcf696f0429cf", "scanner": "scanner-primary", "fingerprint": "9c2de7a01bef3377", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3014faffb9e21cfb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/new/page.tsx:90"}, "properties": {"repobilityId": "224fd9e11f0c0456", "scanner": "scanner-primary", "fingerprint": "3014faffb9e21cfb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f7e9d69e9bc6b509", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/finance/giving/[id]/page.tsx:113"}, "properties": {"repobilityId": "95becbf6edb75d75", "scanner": "scanner-primary", "fingerprint": "f7e9d69e9bc6b509", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-150b59e231a47d62", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/get-involved/page.tsx:486"}, "properties": {"repobilityId": "16f06835b39d3a66", "scanner": "scanner-primary", "fingerprint": "150b59e231a47d62", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-523ddd83bf847b74", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/media/page.tsx:707"}, "properties": {"repobilityId": "173f6505d10f0c2d", "scanner": "scanner-primary", "fingerprint": "523ddd83bf847b74", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-616e72d9c2161708", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/media/page.tsx:237"}, "properties": {"repobilityId": "f7b03fcbafaddaf7", "scanner": "scanner-primary", "fingerprint": "616e72d9c2161708", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3155af1e38ba2e17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/sermons/page.tsx:518"}, "properties": {"repobilityId": "af406beb2da6820d", "scanner": "scanner-primary", "fingerprint": "3155af1e38ba2e17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-859d61a507581f32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/sermons/page.tsx:632"}, "properties": {"repobilityId": "c144d02fd48809a0", "scanner": "scanner-primary", "fingerprint": "859d61a507581f32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f04f3ed9f578ab5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/content/blogs/page.tsx:456"}, "properties": {"repobilityId": "1f0e4ffc716c2558", "scanner": "scanner-primary", "fingerprint": "f04f3ed9f578ab5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9bbfe359841d5b5c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/content/blogs/page.tsx:570"}, "properties": {"repobilityId": "2e391f0135b5c7e6", "scanner": "scanner-primary", "fingerprint": "9bbfe359841d5b5c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f9ff4ec80b8bdf4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/reports/attendance/page.tsx:189"}, "properties": {"repobilityId": "f9af4055bee35891", "scanner": "scanner-primary", "fingerprint": "5f9ff4ec80b8bdf4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9657a0c8b4c48dd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/soul-winning/page.tsx:147"}, "properties": {"repobilityId": "bf176dc34166ed24", "scanner": "scanner-primary", "fingerprint": "9657a0c8b4c48dd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c1289034914f240b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/soul-winning/new/page.tsx:111"}, "properties": {"repobilityId": "825195fbb914d8e0", "scanner": "scanner-primary", "fingerprint": "c1289034914f240b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4442f5642dc5066f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/website-messages/page.tsx:127"}, "properties": {"repobilityId": "ceee8d7bab3eeb1f", "scanner": "scanner-primary", "fingerprint": "4442f5642dc5066f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b067f4d7c5e3b00c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx:1065"}, "properties": {"repobilityId": "2541b9bd369748aa", "scanner": "scanner-primary", "fingerprint": "b067f4d7c5e3b00c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4fda2cfb0a32ce14", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx:156"}, "properties": {"repobilityId": "66a1522f68f6edb0", "scanner": "scanner-primary", "fingerprint": "4fda2cfb0a32ce14", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2fe53bbfa36cb436", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/follow-ups/page.tsx:135"}, "properties": {"repobilityId": "5a6d65bb38b4acb1", "scanner": "scanner-primary", "fingerprint": "2fe53bbfa36cb436", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-732ca3d4827838af", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx:937"}, "properties": {"repobilityId": "597ebe5eff7b852e", "scanner": "scanner-primary", "fingerprint": "732ca3d4827838af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c64a010734152411", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx:140"}, "properties": {"repobilityId": "f226b1402b09241d", "scanner": "scanner-primary", "fingerprint": "c64a010734152411", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b3d3b07b927f6b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/page.tsx:114"}, "properties": {"repobilityId": "f992c1e245a0a277", "scanner": "scanner-primary", "fingerprint": "7b3d3b07b927f6b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-14bc43aa83f19f68", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/new/page.tsx:169"}, "properties": {"repobilityId": "0fe8f513bfbc6087", "scanner": "scanner-primary", "fingerprint": "14bc43aa83f19f68", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-599fce3d2f2337ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/admin/src/app/(admin)/people/groups/[id]/page.tsx:1995"}, "properties": {"repobilityId": "c22c38de29a6aec2", "scanner": "scanner-primary", "fingerprint": "599fce3d2f2337ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d77668b2e57c1acc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/groups/[id]/page.tsx:505"}, "properties": {"repobilityId": "5885e4a35a34dfec", "scanner": "scanner-primary", "fingerprint": "d77668b2e57c1acc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-00d11028a4c79340", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/visitors/page.tsx:141"}, "properties": {"repobilityId": "73a9e23b4c3959f2", "scanner": "scanner-primary", "fingerprint": "00d11028a4c79340", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-062ceee7fe27c68f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/visitors/new/page.tsx:77"}, "properties": {"repobilityId": "1eeb3bd08fdee123", "scanner": "scanner-primary", "fingerprint": "062ceee7fe27c68f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b34a9237d6fe4054", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/drivers/[id]/page.tsx:183"}, "properties": {"repobilityId": "dbdf0612520ff27b", "scanner": "scanner-primary", "fingerprint": "b34a9237d6fe4054", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bddd458ee60b4ac1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/vehicles/page.tsx:81"}, "properties": {"repobilityId": "bf3c7f1469fc783e", "scanner": "scanner-primary", "fingerprint": "bddd458ee60b4ac1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-87fe57bff0f6920e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/transport/vehicles/[id]/page.tsx:201"}, "properties": {"repobilityId": "44be838f06242c85", "scanner": "scanner-primary", "fingerprint": "87fe57bff0f6920e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cbe658555777d54a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/attendance/event/[id]/page.tsx:508"}, "properties": {"repobilityId": "15c6d2589145154a", "scanner": "scanner-primary", "fingerprint": "cbe658555777d54a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25161d5daa3c17ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/page.tsx:118"}, "properties": {"repobilityId": "b024506c05c91608", "scanner": "scanner-primary", "fingerprint": "25161d5daa3c17ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-feca7fc7171412d1", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/(admin)/people/discipleship/new/page.tsx:134"}, "properties": {"repobilityId": "fc361ae8baba5b8e", "scanner": "scanner-primary", "fingerprint": "feca7fc7171412d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-4de07e76966a0c92", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/new/page.tsx:139"}, "properties": {"repobilityId": "45b221901daea891", "scanner": "scanner-primary", "fingerprint": "4de07e76966a0c92", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd73a79301912972", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx:150"}, "properties": {"repobilityId": "770eac119d4ac0d6", "scanner": "scanner-primary", "fingerprint": "cd73a79301912972", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-622e20b0f54b6657", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx:280"}, "properties": {"repobilityId": "1ebedba1fd64e725", "scanner": "scanner-primary", "fingerprint": "622e20b0f54b6657", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-73b414121f618339", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/page.tsx:85"}, "properties": {"repobilityId": "461a146f00fd6383", "scanner": "scanner-primary", "fingerprint": "73b414121f618339", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8efd78ee26750dd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/new/page.tsx:154"}, "properties": {"repobilityId": "fd4aa751bf570287", "scanner": "scanner-primary", "fingerprint": "8efd78ee26750dd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2a09debf80ebf5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/members/[id]/page.tsx:334"}, "properties": {"repobilityId": "fd17ad95fb20ed79", "scanner": "scanner-primary", "fingerprint": "e2a09debf80ebf5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-956bf344648b7147", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/pending-contacts/page.tsx:88"}, "properties": {"repobilityId": "0900054b5899776b", "scanner": "scanner-primary", "fingerprint": "956bf344648b7147", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a15a83bf4fcae5e3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/app/(admin)/people/mobile-users/test-users/page.tsx:41"}, "properties": {"repobilityId": "b04585dd7cd1b365", "scanner": "scanner-primary", "fingerprint": "a15a83bf4fcae5e3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a8d8222b28615a47", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/env-validation.ts:114"}, "properties": {"repobilityId": "963b76cdbfad372d", "scanner": "scanner-primary", "fingerprint": "a8d8222b28615a47", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb72c59470d62261", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/audit.ts:31"}, "properties": {"repobilityId": "71b5758ae3591902", "scanner": "scanner-primary", "fingerprint": "fb72c59470d62261", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-59ec90f8c3c5eb3e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/lib/emailAccounts.ts:154"}, "properties": {"repobilityId": "d360c04d254afbf5", "scanner": "scanner-primary", "fingerprint": "59ec90f8c3c5eb3e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5a6f79ee58257c7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/hooks/use-local-storage.ts:19"}, "properties": {"repobilityId": "a08e7618dc722ea3", "scanner": "scanner-primary", "fingerprint": "f5a6f79ee58257c7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d867460a0322691a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/notificationService.ts:47"}, "properties": {"repobilityId": "425855d116d6ab4a", "scanner": "scanner-primary", "fingerprint": "d867460a0322691a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ae3cc1e0d5560ca", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/recurringEvents.ts:311"}, "properties": {"repobilityId": "227c85139e530716", "scanner": "scanner-primary", "fingerprint": "3ae3cc1e0d5560ca", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-48632c7a9a6c0655", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/emailService.ts:54"}, "properties": {"repobilityId": "f3437dc590f2e2ef", "scanner": "scanner-primary", "fingerprint": "48632c7a9a6c0655", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-887ae310bfd7b908", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/settings.ts:210"}, "properties": {"repobilityId": "64132e27d144b931", "scanner": "scanner-primary", "fingerprint": "887ae310bfd7b908", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e4bc3f3410e40c7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/contacts.ts:44"}, "properties": {"repobilityId": "1e1c0ed1d6ba43a1", "scanner": "scanner-primary", "fingerprint": "e4bc3f3410e40c7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6c4ab8561b54201", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/admin/src/services/comms/settings.ts:351"}, "properties": {"repobilityId": "8e0d42459776eead", "scanner": "scanner-primary", "fingerprint": "f6c4ab8561b54201", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-26beec2f1bf30e0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/admin/src/services/comms/settings.ts:282"}, "properties": {"repobilityId": "8448ca9a611110f0", "scanner": "scanner-primary", "fingerprint": "26beec2f1bf30e0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eb4005d2c38aa2a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ui/video-modal.tsx:86"}, "properties": {"repobilityId": "d38e254f3d9763a1", "scanner": "scanner-primary", "fingerprint": "eb4005d2c38aa2a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ecff3e12c93c5e7e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/word-of-year.tsx:38"}, "properties": {"repobilityId": "aa6b3772e7faa5dd", "scanner": "scanner-primary", "fingerprint": "ecff3e12c93c5e7e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-199fa7e058203af4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/planned-visit-form.tsx:154"}, "properties": {"repobilityId": "af6a3d0c17a6f0a8", "scanner": "scanner-primary", "fingerprint": "199fa7e058203af4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-837249fb16ef7956", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/blog-newsletter.tsx:13"}, "properties": {"repobilityId": "30f1293c97988483", "scanner": "scanner-primary", "fingerprint": "837249fb16ef7956", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2831a961bc5d6a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/latest-sermons.tsx:209"}, "properties": {"repobilityId": "4c92a4764279eddf", "scanner": "scanner-primary", "fingerprint": "b2831a961bc5d6a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6791ad5912ac8d9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/sections/hero-section.tsx:34"}, "properties": {"repobilityId": "8dbf11b240ce68c0", "scanner": "scanner-primary", "fingerprint": "f6791ad5912ac8d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cb53687f40b975bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/components/forms/LocationAutocomplete.tsx:63"}, "properties": {"repobilityId": "7813059c402747d8", "scanner": "scanner-primary", "fingerprint": "cb53687f40b975bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0526d69afa27b7f9", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 apps/web/src/app/blog/[slug]/blog-client.tsx:128"}, "properties": {"repobilityId": "ce528c8cf841526a", "scanner": "scanner-primary", "fingerprint": "0526d69afa27b7f9", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-496ad3779250f853", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/app/media/gallery/[collectionId]/page.tsx:280"}, "properties": {"repobilityId": "946c6bdf5b1f99b8", "scanner": "scanner-primary", "fingerprint": "496ad3779250f853", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4dda3d6663e00ed0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/lib/stripe.ts:16"}, "properties": {"repobilityId": "83d3157f1e31355e", "scanner": "scanner-primary", "fingerprint": "4dda3d6663e00ed0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f99bbf0451062cbd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useEventsPage.ts:82"}, "properties": {"repobilityId": "f80051a1273e85b7", "scanner": "scanner-primary", "fingerprint": "f99bbf0451062cbd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e028902c531a6a65", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useSermons.ts:58"}, "properties": {"repobilityId": "85c3e68dd5773e7a", "scanner": "scanner-primary", "fingerprint": "e028902c531a6a65", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ca1144e32953c85", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useAbout.ts:105"}, "properties": {"repobilityId": "73227cb8818fcfd3", "scanner": "scanner-primary", "fingerprint": "9ca1144e32953c85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-549bcfd31ef34275", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useNavigation.ts:68"}, "properties": {"repobilityId": "8481c38418b758d1", "scanner": "scanner-primary", "fingerprint": "549bcfd31ef34275", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1202384f3bc8d481", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useEvents.ts:104"}, "properties": {"repobilityId": "da1d11f3b52a511e", "scanner": "scanner-primary", "fingerprint": "1202384f3bc8d481", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2fdab6d501502d45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useFooter.ts:46"}, "properties": {"repobilityId": "82dae975d4ad588d", "scanner": "scanner-primary", "fingerprint": "2fdab6d501502d45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc8b78346cafda74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useMediaCollections.ts:53"}, "properties": {"repobilityId": "2bd49cd3801c751a", "scanner": "scanner-primary", "fingerprint": "dc8b78346cafda74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1c1c346c3f4adb6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/web/src/hooks/useHomepage.ts:181"}, "properties": {"repobilityId": "db60c8f2418f524e", "scanner": "scanner-primary", "fingerprint": "d1c1c346c3f4adb6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-889ec51ccb9fe4a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-supabase-connection.js:5"}, "properties": {"repobilityId": "48283caecbc10c54", "scanner": "scanner-primary", "fingerprint": "889ec51ccb9fe4a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-731fbc4ed3115686", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix-email-queue.js:18"}, "properties": {"repobilityId": "a205adb59d824fdb", "scanner": "scanner-primary", "fingerprint": "731fbc4ed3115686", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55b55c5febf79d85", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-migrations.js:77"}, "properties": {"repobilityId": "14146d04c45826ee", "scanner": "scanner-primary", "fingerprint": "55b55c5febf79d85", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-424ba52860775830", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-disable-rls.js:26"}, "properties": {"repobilityId": "1f91212090374964", "scanner": "scanner-primary", "fingerprint": "424ba52860775830", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25f2c9db96a588dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-contacts.js:18"}, "properties": {"repobilityId": "3ccd5e353ad497d5", "scanner": "scanner-primary", "fingerprint": "25f2c9db96a588dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e2a9ab6a04e1ec8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-from-supabase.js:146"}, "properties": {"repobilityId": "b116dc244d979f20", "scanner": "scanner-primary", "fingerprint": "7e2a9ab6a04e1ec8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ba0fdb885d2eb4b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-add-location-data-to-events.js:26"}, "properties": {"repobilityId": "33841a770195c63d", "scanner": "scanner-primary", "fingerprint": "ba0fdb885d2eb4b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8301e2ebd29a943b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/set-event-locations.js:32"}, "properties": {"repobilityId": "b9aeb96eca6926d4", "scanner": "scanner-primary", "fingerprint": "8301e2ebd29a943b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-17f76391a8d0dff8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/run-fix-transport-location.js:26"}, "properties": {"repobilityId": "8ed5beae44f18af0", "scanner": "scanner-primary", "fingerprint": "17f76391a8d0dff8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b97d9f7e80535c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-migration.js:23"}, "properties": {"repobilityId": "1674819e3c6f555f", "scanner": "scanner-primary", "fingerprint": "3b97d9f7e80535c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6209daadfa197c18", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-storage-access.js:25"}, "properties": {"repobilityId": "1917dddba472057a", "scanner": "scanner-primary", "fingerprint": "6209daadfa197c18", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ff7179c65125f927", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-events.js:18"}, "properties": {"repobilityId": "77a4e341f3dbc04c", "scanner": "scanner-primary", "fingerprint": "ff7179c65125f927", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-190379c8a09a9dce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send_email_batch/index.ts:34"}, "properties": {"repobilityId": "9fae67358d58d06d", "scanner": "scanner-primary", "fingerprint": "190379c8a09a9dce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6e8511ff0939cb9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/execute-workflows/index.ts:38"}, "properties": {"repobilityId": "98cad2ee2bd8676c", "scanner": "scanner-primary", "fingerprint": "b6e8511ff0939cb9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-615a6fdfe740a89f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/process_email_queue/index.ts:42"}, "properties": {"repobilityId": "ff242a7dd08c74cf", "scanner": "scanner-primary", "fingerprint": "615a6fdfe740a89f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f1553ab31ca8e8d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/track_email/index.ts:42"}, "properties": {"repobilityId": "9375e92f14e9153d", "scanner": "scanner-primary", "fingerprint": "5f1553ab31ca8e8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7948ff1e6fa069a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/auto-complete-events/index.ts:35"}, "properties": {"repobilityId": "0a67a86a4c1da950", "scanner": "scanner-primary", "fingerprint": "7948ff1e6fa069a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8cf12969e4893dd8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 supabase/functions/send_route_sms/index.ts:18"}, "properties": {"repobilityId": "35be08f63efa321f", "scanner": "scanner-primary", "fingerprint": "8cf12969e4893dd8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3436e222791b5f67", "level": "warning", "message": {"text": "Privileged port 465 in use"}, "properties": {"repobilityId": "bcd1f06b60a2b6bc", "scanner": "scanner-primary", "fingerprint": "3436e222791b5f67", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/api/email/send/route.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-22cbf0e88849fce5", "level": "warning", "message": {"text": "Privileged port 587 in use"}, "properties": {"repobilityId": "a87a96c3b2e62c08", "scanner": "scanner-primary", "fingerprint": "22cbf0e88849fce5", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/lib/emailAccounts.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3d70dcd36b57a39a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "9ea24efb3b1bd954", "scanner": "scanner-primary", "fingerprint": "3d70dcd36b57a39a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-6c75b826297bba7e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "17e700194514fbf0", "scanner": "scanner-primary", "fingerprint": "6c75b826297bba7e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-74e2e2316f173b7a", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "98c9624dee47a97a", "scanner": "scanner-primary", "fingerprint": "74e2e2316f173b7a", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/Dockerfile"}, "region": {"startLine": 2}}}]}, {"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-39f0647abc71b8d9", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in test-notifications.js:8"}, "properties": {"repobilityId": "e000e9bdb74dfdb3", "scanner": "scanner-primary", "fingerprint": "39f0647abc71b8d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test-notifications.js"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-a357af5832038ba5", "level": "error", "message": {"text": "Possible secret in deploy-email-functions.sh"}, "properties": {"repobilityId": "dea860c5cea6c302", "scanner": "scanner-primary", "fingerprint": "a357af5832038ba5", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "deploy-email-functions.sh"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-62de82b263417558", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in test-contact-deletion.html:112"}, "properties": {"repobilityId": "d6a780cab1f6ddd7", "scanner": "scanner-primary", "fingerprint": "62de82b263417558", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "test-contact-deletion.html"}, "region": {"startLine": 112}}}]}, {"ruleId": "scanner-4be9904c9580ab4e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/ui/use-toast.tsx:208"}, "properties": {"repobilityId": "3c897186aa5ba31f", "scanner": "scanner-primary", "fingerprint": "4be9904c9580ab4e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/components/ui/use-toast.tsx"}, "region": {"startLine": 208}}}]}, {"ruleId": "scanner-6cea720a406f0c9a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/transport/EventTransportTab.tsx:764"}, "properties": {"repobilityId": "dd1b3270ead1e8bc", "scanner": "scanner-primary", "fingerprint": "6cea720a406f0c9a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/components/transport/EventTransportTab.tsx"}, "region": {"startLine": 764}}}]}, {"ruleId": "scanner-6beb366a633a16af", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/components/Layout/AdminLayout.tsx:720"}, "properties": {"repobilityId": "5fe40b85b9a17641", "scanner": "scanner-primary", "fingerprint": "6beb366a633a16af", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/components/Layout/AdminLayout.tsx"}, "region": {"startLine": 720}}}]}, {"ruleId": "scanner-c3e0c84a898ace26", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in apps/admin/src/app/api/email/send/route.ts:8"}, "properties": {"repobilityId": "5a66d1bf9839ba65", "scanner": "scanner-primary", "fingerprint": "c3e0c84a898ace26", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/api/email/send/route.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-d647475ac0d49025", "level": "error", "message": {"text": "Possible secret in apps/admin/src/app/(admin)/settings/roles/page.tsx"}, "properties": {"repobilityId": "33b8f5262b379dee", "scanner": "scanner-primary", "fingerprint": "d647475ac0d49025", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/(admin)/settings/roles/page.tsx"}, "region": {"startLine": 673}}}]}, {"ruleId": "scanner-b21b5bf83ea1a944", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/settings/word-of-year/page.tsx:381"}, "properties": {"repobilityId": "e6f4b523218f5b17", "scanner": "scanner-primary", "fingerprint": "b21b5bf83ea1a944", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/(admin)/settings/word-of-year/page.tsx"}, "region": {"startLine": 381}}}]}, {"ruleId": "scanner-a72e1ad428521bb9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/(admin)/comms/campaigns/[id]/page.tsx:508"}, "properties": {"repobilityId": "d4b514f08d950420", "scanner": "scanner-primary", "fingerprint": "a72e1ad428521bb9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/(admin)/comms/campaigns/[id]/page.tsx"}, "region": {"startLine": 508}}}]}, {"ruleId": "scanner-52180f2ec0fb2171", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:327"}, "properties": {"repobilityId": "c5c506d579ecc1e8", "scanner": "scanner-primary", "fingerprint": "52180f2ec0fb2171", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx"}, "region": {"startLine": 327}}}]}, {"ruleId": "scanner-6aa4e2dc70f49a58", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/content/sermons/new/page.tsx:417"}, "properties": {"repobilityId": "798e3b3d9471e379", "scanner": "scanner-primary", "fingerprint": "6aa4e2dc70f49a58", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/(admin)/content/sermons/new/page.tsx"}, "region": {"startLine": 417}}}]}, {"ruleId": "scanner-4ea115960f040f8f", "level": "note", "message": {"text": "Insecure pattern 'document_write' in apps/admin/src/app/(admin)/tools/qr-code/page.tsx:151"}, "properties": {"repobilityId": "ded1c6d6c7ea2912", "scanner": "scanner-primary", "fingerprint": "4ea115960f040f8f", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/(admin)/tools/qr-code/page.tsx"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-bdf7267c8a54df78", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/admin/src/app/(admin)/tools/qr-code/page.tsx:85"}, "properties": {"repobilityId": "ab057b71ef9bfc2f", "scanner": "scanner-primary", "fingerprint": "bdf7267c8a54df78", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/app/(admin)/tools/qr-code/page.tsx"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-ff6eef69db50d34d", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in apps/admin/src/lib/local-auth.ts:168"}, "properties": {"repobilityId": "75d4dd1df2915afe", "scanner": "scanner-primary", "fingerprint": "ff6eef69db50d34d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/admin/src/lib/local-auth.ts"}, "region": {"startLine": 168}}}]}, {"ruleId": "scanner-e519de53eaa432a7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/layout/navigation.tsx:113"}, "properties": {"repobilityId": "77cc921cac0eeb01", "scanner": "scanner-primary", "fingerprint": "e519de53eaa432a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/components/layout/navigation.tsx"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-f45a35fb4d938d48", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in apps/web/src/components/sections/DynamicSection.tsx:46"}, "properties": {"repobilityId": "40b185c429f2f6ec", "scanner": "scanner-primary", "fingerprint": "f45a35fb4d938d48", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/components/sections/DynamicSection.tsx"}, "region": {"startLine": 46}}}]}, {"ruleId": "scanner-f734382c85d46a7e", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in apps/web/src/app/blog/[slug]/blog-client.tsx:128"}, "properties": {"repobilityId": "4b2990c81afe6eab", "scanner": "scanner-primary", "fingerprint": "f734382c85d46a7e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/app/blog/[slug]/blog-client.tsx"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-a1e68af6326794f5", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in apps/web/src/app/api/submit-contact/route.ts:12"}, "properties": {"repobilityId": "693d5658a21a0ec5", "scanner": "scanner-primary", "fingerprint": "a1e68af6326794f5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/src/app/api/submit-contact/route.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-f5d6443e50cab1f1", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in scripts/apply-migration.js:61"}, "properties": {"repobilityId": "3cf15bc6d98a4124", "scanner": "scanner-primary", "fingerprint": "f5d6443e50cab1f1", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/apply-migration.js"}, "region": {"startLine": 61}}}]}, {"ruleId": "scanner-30a10e95897d17de", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/apply-migration.js:3"}, "properties": {"repobilityId": "6c7f947a9646d738", "scanner": "scanner-primary", "fingerprint": "30a10e95897d17de", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/apply-migration.js"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-26d1351fd69ed0ea", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/execute-workflows/index.ts:5"}, "properties": {"repobilityId": "5a63944ca623dc21", "scanner": "scanner-primary", "fingerprint": "26d1351fd69ed0ea", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/execute-workflows/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-02075fb9978e6dd4", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in supabase/functions/auto-complete-events/index.ts:5"}, "properties": {"repobilityId": "fa5fac519c20ee01", "scanner": "scanner-primary", "fingerprint": "02075fb9978e6dd4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "supabase/functions/auto-complete-events/index.ts"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-cdc9e247f76d2eef", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a4ea5489ff35abe8", "scanner": "scanner-primary", "fingerprint": "cdc9e247f76d2eef", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/auto-complete-events.yml"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-175d308b3c2aebf6", "level": "note", "message": {"text": "Very large file: apps/admin/src/types/supabase.ts (4348 lines)"}, "properties": {"repobilityId": "13923fb9e6cdf874", "scanner": "scanner-primary", "fingerprint": "175d308b3c2aebf6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6b7f46401ec8d891", "level": "note", "message": {"text": "Very large file: apps/admin/src/components/content/PageEditor.tsx (2211 lines)"}, "properties": {"repobilityId": "edff0130f50b6ec0", "scanner": "scanner-primary", "fingerprint": "6b7f46401ec8d891", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0bc6fa8ba9208dba", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/settings/roles/page.tsx (1710 lines)"}, "properties": {"repobilityId": "f9f5ce58a3de2820", "scanner": "scanner-primary", "fingerprint": "0bc6fa8ba9208dba", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c640bce25b4ae45f", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/settings/workflows/page.tsx (1573 lines)"}, "properties": {"repobilityId": "5e144c5b0ddcbacd", "scanner": "scanner-primary", "fingerprint": "c640bce25b4ae45f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ef3cd9e5e0c0c94a", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/settings/footer/page.tsx (1183 lines)"}, "properties": {"repobilityId": "66043379d1c8e6ce", "scanner": "scanner-primary", "fingerprint": "ef3cd9e5e0c0c94a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d6136ee7d0be4bd3", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/settings/tenant/page.tsx (1683 lines)"}, "properties": {"repobilityId": "fba43ef8f4fefe3e", "scanner": "scanner-primary", "fingerprint": "d6136ee7d0be4bd3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c760494affd36b37", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/comms/campaigns/new/page.tsx (1160 lines)"}, "properties": {"repobilityId": "3117411c40baaafa", "scanner": "scanner-primary", "fingerprint": "c760494affd36b37", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8cee9f7e1af39aca", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/events/[id]/page.tsx (1748 lines)"}, "properties": {"repobilityId": "77f44297f4574d04", "scanner": "scanner-primary", "fingerprint": "8cee9f7e1af39aca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1a040474a93f2f92", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/reports/page.tsx (1914 lines)"}, "properties": {"repobilityId": "65c8f6430e8b5064", "scanner": "scanner-primary", "fingerprint": "1a040474a93f2f92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e976eab61538bb94", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/people/outreach/prayer-requests/page.tsx (1763 lines)"}, "properties": {"repobilityId": "fed783df9d740599", "scanner": "scanner-primary", "fingerprint": "e976eab61538bb94", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-94ea63cff77b0276", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/people/outreach/follow-ups/page.tsx (1338 lines)"}, "properties": {"repobilityId": "0fac9b2570e8c6e3", "scanner": "scanner-primary", "fingerprint": "94ea63cff77b0276", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-03a6e06ecf82b81a", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/people/outreach/planned-visits/page.tsx (1442 lines)"}, "properties": {"repobilityId": "827d71a03016446e", "scanner": "scanner-primary", "fingerprint": "03a6e06ecf82b81a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6fd765ff01b78c6b", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/people/groups/[id]/page.tsx (2395 lines)"}, "properties": {"repobilityId": "3d5a56997f379ed5", "scanner": "scanner-primary", "fingerprint": "6fd765ff01b78c6b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f6a8d8bba83a84ec", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/people/discipleship/[id]/page.tsx (1887 lines)"}, "properties": {"repobilityId": "1b41f5a1b4ace8d5", "scanner": "scanner-primary", "fingerprint": "f6a8d8bba83a84ec", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5138437f0f7df62a", "level": "note", "message": {"text": "Very large file: apps/admin/src/app/(admin)/people/members/[id]/page.tsx (1808 lines)"}, "properties": {"repobilityId": "7a30173ccbcbb85a", "scanner": "scanner-primary", "fingerprint": "5138437f0f7df62a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "c2bd260549784e1e", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "b42ce424267908a9", "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": "37bea92e2ebe0523", "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": "a1f9bf6b30f9a908", "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": "72a5aebf3da7277d", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "9f8e96f65b561208", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "2bd6ea2708d1cf4e", "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": "8063a20cc23f8f6f", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-645f65df2786e6a1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_workflow_debug.js:80"}, "properties": {"repobilityId": "49b1f6412295c482", "scanner": "scanner-primary", "fingerprint": "645f65df2786e6a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f31075678edaa2b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_trigger_manually.js:123"}, "properties": {"repobilityId": "5299d0a8d97527cc", "scanner": "scanner-primary", "fingerprint": "8f31075678edaa2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba082335f7906817", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_real_workflow.js:83"}, "properties": {"repobilityId": "e0cbbdb04ed80f54", "scanner": "scanner-primary", "fingerprint": "ba082335f7906817", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-084b178afc474d47", "level": "none", "message": {"text": "Commented-code block (7 lines) in add-table-checkboxes.js:31"}, "properties": {"repobilityId": "f82e8f1e3f1b4e69", "scanner": "scanner-primary", "fingerprint": "084b178afc474d47", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3083171b476e31b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test-upload-debug.js:65"}, "properties": {"repobilityId": "bc14687b0ecebe84", "scanner": "scanner-primary", "fingerprint": "f3083171b476e31b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0364715fd8f701b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_new_email_service.js:62"}, "properties": {"repobilityId": "2cbe9bc916622abb", "scanner": "scanner-primary", "fingerprint": "0364715fd8f701b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6b3d84d28c987c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_member_automation.js:115"}, "properties": {"repobilityId": "f6b795cd2ec0d4d1", "scanner": "scanner-primary", "fingerprint": "c6b3d84d28c987c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9cc7c00915da39a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 replace_test_tokens.js:74"}, "properties": {"repobilityId": "70672eaf86807169", "scanner": "scanner-primary", "fingerprint": "e9cc7c00915da39a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3806208ab5db7264", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test-prayer-notifications.js:30"}, "properties": {"repobilityId": "daa6374ed3328be4", "scanner": "scanner-primary", "fingerprint": "3806208ab5db7264", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-42b0ac46c8735c95", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/expo-push.js:42"}, "properties": {"repobilityId": "8f6a560a48d0528a", "scanner": "scanner-primary", "fingerprint": "42b0ac46c8735c95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04c8580511d5333d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/schema-bootstrap.js:58"}, "properties": {"repobilityId": "8022ce33a00c4e01", "scanner": "scanner-primary", "fingerprint": "04c8580511d5333d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5848e75c92931a36", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/server.js:98"}, "properties": {"repobilityId": "25e66ee276a16e55", "scanner": "scanner-primary", "fingerprint": "5848e75c92931a36", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f23b8470ca9e0cd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/import-public-content.js:48"}, "properties": {"repobilityId": "74b77b0725878c97", "scanner": "scanner-primary", "fingerprint": "4f23b8470ca9e0cd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f86b02622582e38", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/public.js:898"}, "properties": {"repobilityId": "d98f650dd59ff17d", "scanner": "scanner-primary", "fingerprint": "7f86b02622582e38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5f30108e9e7ffa51", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/admin-notifications.js:287"}, "properties": {"repobilityId": "6b673cb096fb0176", "scanner": "scanner-primary", "fingerprint": "5f30108e9e7ffa51", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-eb51875bad4675da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/api/src/routes/admin-notifications.js:304"}, "properties": {"repobilityId": "803f368fc36deba6", "scanner": "scanner-primary", "fingerprint": "eb51875bad4675da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-086ad90b2056a5a7", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/routes/admin-mobile-app-users.js:9"}, "properties": {"repobilityId": "96872d58bac20ca9", "scanner": "scanner-primary", "fingerprint": "086ad90b2056a5a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad76533310c9678a", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/admin-settings.js:796"}, "properties": {"repobilityId": "2e56c0e0e138c260", "scanner": "scanner-primary", "fingerprint": "ad76533310c9678a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b965b6a429179502", "level": "note", "message": {"text": "Legacy-named symbol `onboarding_complete_v1` in apps/mobile/App.tsx:79"}, "properties": {"repobilityId": "6206e8d053ab674a", "scanner": "scanner-primary", "fingerprint": "b965b6a429179502", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-73d7ef82823026f4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/screens/GiveScreenImpl.tsx:103"}, "properties": {"repobilityId": "9eca239e11113481", "scanner": "scanner-primary", "fingerprint": "73d7ef82823026f4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc47802a89750c72", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/screens/ProfileScreen.tsx:59"}, "properties": {"repobilityId": "73938bd03c99690a", "scanner": "scanner-primary", "fingerprint": "fc47802a89750c72", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8c9f4e5c54777008", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/mobile/src/services/pushNotifications.ts:16"}, "properties": {"repobilityId": "d6b8023b668311ba", "scanner": "scanner-primary", "fingerprint": "8c9f4e5c54777008", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1f8012bc25413399", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/mobile/src/services/pushNotifications.ts:352"}, "properties": {"repobilityId": "c87491eb0fea26b5", "scanner": "scanner-primary", "fingerprint": "1f8012bc25413399", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7afc7b27c34ed766", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/fix_welcome_template.js:48"}, "properties": {"repobilityId": "7c694f03d1bf6cbc", "scanner": "scanner-primary", "fingerprint": "7afc7b27c34ed766", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-13a3dd118fdd43dd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/fix_push_notifications.js:89"}, "properties": {"repobilityId": "935a11a4080b80d3", "scanner": "scanner-primary", "fingerprint": "13a3dd118fdd43dd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4cd75730462fdb1f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/components/settings/MultipleLogoUpload.tsx:132"}, "properties": {"repobilityId": "41f17254053d67f3", "scanner": "scanner-primary", "fingerprint": "4cd75730462fdb1f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d350b2241dcd68a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/integrations/route.ts:31"}, "properties": {"repobilityId": "80a4f139ffa543d7", "scanner": "scanner-primary", "fingerprint": "d350b2241dcd68a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2d95111799d77e28", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/route.ts:20"}, "properties": {"repobilityId": "6826c5abce1eb034", "scanner": "scanner-primary", "fingerprint": "2d95111799d77e28", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a94b141b7792f79c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/[id]/route.ts:22"}, "properties": {"repobilityId": "23a9d9998b06fe49", "scanner": "scanner-primary", "fingerprint": "a94b141b7792f79c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e91cc848993cdb03", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/settings/payment-categories/reorder/route.ts:11"}, "properties": {"repobilityId": "ba6deddbb3315bd7", "scanner": "scanner-primary", "fingerprint": "e91cc848993cdb03", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0f8b0c64bbcf528d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/notifications/send-push/route.ts:11"}, "properties": {"repobilityId": "be65ff4c3f122297", "scanner": "scanner-primary", "fingerprint": "0f8b0c64bbcf528d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae48aeff441bec0a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/email/send-with-sendgrid/route.ts:72"}, "properties": {"repobilityId": "61c61e339f6e4fb2", "scanner": "scanner-primary", "fingerprint": "ae48aeff441bec0a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-201f7c9491c8d695", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/email/test-system/route.ts:28"}, "properties": {"repobilityId": "9844bfaff2092842", "scanner": "scanner-primary", "fingerprint": "201f7c9491c8d695", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c42f5a5453b3c8c3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/send-verification/route.ts:10"}, "properties": {"repobilityId": "8da291125094747c", "scanner": "scanner-primary", "fingerprint": "c42f5a5453b3c8c3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7db8e23c847b2e37", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/create-user/route.ts:7"}, "properties": {"repobilityId": "8a6263c162e26bd5", "scanner": "scanner-primary", "fingerprint": "7db8e23c847b2e37", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a19bdaa5e64651b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/resend-verification/route.ts:9"}, "properties": {"repobilityId": "45ac14deed3cc41e", "scanner": "scanner-primary", "fingerprint": "a19bdaa5e64651b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-68efe1659a738f22", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/verify-email/route.ts:7"}, "properties": {"repobilityId": "282d142213dc663c", "scanner": "scanner-primary", "fingerprint": "68efe1659a738f22", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fdfdbe661a7222a2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/link-existing-user/route.ts:7"}, "properties": {"repobilityId": "2bc1e380529471a2", "scanner": "scanner-primary", "fingerprint": "fdfdbe661a7222a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-135915796f9e799a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/password-reset/confirm/route.ts:7"}, "properties": {"repobilityId": "b62250f4df9c6c14", "scanner": "scanner-primary", "fingerprint": "135915796f9e799a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a06ca36c36ea0cca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/auth/password-reset/request/route.ts:9"}, "properties": {"repobilityId": "fd8d43cadf6b2dfd", "scanner": "scanner-primary", "fingerprint": "a06ca36c36ea0cca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-086f4fb4febe5f86", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/media/collections/route.ts:24"}, "properties": {"repobilityId": "eacc21264f4cebc7", "scanner": "scanner-primary", "fingerprint": "086f4fb4febe5f86", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b1c7ff02417407c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/route.ts:22"}, "properties": {"repobilityId": "794bcec61a3506a8", "scanner": "scanner-primary", "fingerprint": "0b1c7ff02417407c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aa9770fd92904f57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/route.ts:30"}, "properties": {"repobilityId": "1586a80366717749", "scanner": "scanner-primary", "fingerprint": "aa9770fd92904f57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-26793a81dd30da50", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/reset-password/route.ts:11"}, "properties": {"repobilityId": "ed830dea64bb61dc", "scanner": "scanner-primary", "fingerprint": "26793a81dd30da50", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2dc4e83179c19ab3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/admin/users/[id]/toggle-status/route.ts:14"}, "properties": {"repobilityId": "d9afcb086993c2e0", "scanner": "scanner-primary", "fingerprint": "2dc4e83179c19ab3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d5a64a0c6beb04b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/media-fetch/route.ts:6"}, "properties": {"repobilityId": "00681e9b29aabf20", "scanner": "scanner-primary", "fingerprint": "d5a64a0c6beb04b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dc5d2843efb808a1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/trigger-workflow/route.ts:7"}, "properties": {"repobilityId": "29f52dcab3776497", "scanner": "scanner-primary", "fingerprint": "dc5d2843efb808a1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef1582acba896f7d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/donations/create-payment-intent/route.ts:41"}, "properties": {"repobilityId": "b513bf94dc106af2", "scanner": "scanner-primary", "fingerprint": "ef1582acba896f7d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2bf7dda7201db761", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/route.ts:45"}, "properties": {"repobilityId": "4a381c9cb4dead54", "scanner": "scanner-primary", "fingerprint": "2bf7dda7201db761", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-474c86a59967243c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/notification-preferences/route.ts:8"}, "properties": {"repobilityId": "d2083210b3c25bc1", "scanner": "scanner-primary", "fingerprint": "474c86a59967243c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c414eda9aba90cfc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/mobile-users/register-push-token/route.ts:7"}, "properties": {"repobilityId": "ac6234c60f6c10ff", "scanner": "scanner-primary", "fingerprint": "c414eda9aba90cfc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3869f9e061c6ac55", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/api/webhooks/stripe/route.ts:36"}, "properties": {"repobilityId": "fa926d0ed170bc4f", "scanner": "scanner-primary", "fingerprint": "3869f9e061c6ac55", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-00fc0fbf2327aa7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/simple-upload/page.tsx:44"}, "properties": {"repobilityId": "b264a52dc0cc58a5", "scanner": "scanner-primary", "fingerprint": "00fc0fbf2327aa7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ac416b6efd0f909b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/settings/tenant/page.tsx:201"}, "properties": {"repobilityId": "3cdc0d056e2003bc", "scanner": "scanner-primary", "fingerprint": "ac416b6efd0f909b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9850dc433d222874", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/page.tsx:122"}, "properties": {"repobilityId": "31d5092f9c9d20fe", "scanner": "scanner-primary", "fingerprint": "9850dc433d222874", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97a4fac8a27d6fa4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:93"}, "properties": {"repobilityId": "9fe0e1433507864a", "scanner": "scanner-primary", "fingerprint": "97a4fac8a27d6fa4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-723cec0521b577ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:147"}, "properties": {"repobilityId": "ccea57b285714d79", "scanner": "scanner-primary", "fingerprint": "723cec0521b577ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-995b60f28e9af846", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/app/(admin)/people/members/[id]/page.tsx:709"}, "properties": {"repobilityId": "e561f324308c1dbf", "scanner": "scanner-primary", "fingerprint": "995b60f28e9af846", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dcdb80b9ac9b8951", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/local-auth.ts:55"}, "properties": {"repobilityId": "a9c88b0d9a621067", "scanner": "scanner-primary", "fingerprint": "dcdb80b9ac9b8951", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3e0877e9b03498fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/admin-api-client.ts:12"}, "properties": {"repobilityId": "391316a60265a786", "scanner": "scanner-primary", "fingerprint": "3e0877e9b03498fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46b5fe6e9b0c7540", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/upload-api.ts:31"}, "properties": {"repobilityId": "59ee8798505349e9", "scanner": "scanner-primary", "fingerprint": "46b5fe6e9b0c7540", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-380d3157bdd6c94a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/local-upload-client.ts:12"}, "properties": {"repobilityId": "ab599ebbe665572f", "scanner": "scanner-primary", "fingerprint": "380d3157bdd6c94a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-31471136420296f9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/lib/newsletter-api-proxy.ts:18"}, "properties": {"repobilityId": "05b3b619d89c211e", "scanner": "scanner-primary", "fingerprint": "31471136420296f9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a83fe946a27cfd39", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/media.ts:61"}, "properties": {"repobilityId": "321967f80f235669", "scanner": "scanner-primary", "fingerprint": "a83fe946a27cfd39", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c1c10a07d3fdee4b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/notificationService.ts:714"}, "properties": {"repobilityId": "4a9035fa0f1124be", "scanner": "scanner-primary", "fingerprint": "c1c10a07d3fdee4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bd71575709c58d38", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/sms.ts:207"}, "properties": {"repobilityId": "de4447b9c6bb2057", "scanner": "scanner-primary", "fingerprint": "bd71575709c58d38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-66a6c1cfef6ce70c", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/admin/src/services/youtube.ts:242"}, "properties": {"repobilityId": "0dba84bcaf782af6", "scanner": "scanner-primary", "fingerprint": "66a6c1cfef6ce70c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-89dba6214582a674", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/contacts.ts:339"}, "properties": {"repobilityId": "10f45afbd130ed2c", "scanner": "scanner-primary", "fingerprint": "89dba6214582a674", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6ebe7180f4bc7e5c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/admin/src/services/comms/settings.ts:443"}, "properties": {"repobilityId": "0e1d75179f7cc462", "scanner": "scanner-primary", "fingerprint": "6ebe7180f4bc7e5c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f3b153d31145dd8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/components/sections/media-gallery-section.tsx:69"}, "properties": {"repobilityId": "787570c5266e2bb0", "scanner": "scanner-primary", "fingerprint": "7f3b153d31145dd8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-45c91380721e2081", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/media/sermons/browse/browse-client.tsx:136"}, "properties": {"repobilityId": "58677ffa2ae877d1", "scanner": "scanner-primary", "fingerprint": "45c91380721e2081", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c30d618c60b8639e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/events/register/route.ts:13"}, "properties": {"repobilityId": "7eb2addd6046fb6b", "scanner": "scanner-primary", "fingerprint": "c30d618c60b8639e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8dfe90fda0d5cfa4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/donations/record-offline-payment/route.ts:17"}, "properties": {"repobilityId": "ec57a3de57e3b18e", "scanner": "scanner-primary", "fingerprint": "8dfe90fda0d5cfa4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5ed0de3ddee169b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/donations/confirm-recurring/route.ts:44"}, "properties": {"repobilityId": "6494d4eba47513a1", "scanner": "scanner-primary", "fingerprint": "5ed0de3ddee169b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a766ffa8b043be1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/webhooks/stripe/route.ts:33"}, "properties": {"repobilityId": "87982137e7062000", "scanner": "scanner-primary", "fingerprint": "a766ffa8b043be1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b7a00cd1fbacdc5f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/app/api/planned-visits/route.ts:24"}, "properties": {"repobilityId": "b3a05c3e8ed1dc95", "scanner": "scanner-primary", "fingerprint": "b7a00cd1fbacdc5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-60a5a98b968b191b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useBlogs.ts:92"}, "properties": {"repobilityId": "41f370da4ad1763f", "scanner": "scanner-primary", "fingerprint": "60a5a98b968b191b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bc8e83bd7abf4b92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/hooks/useMediaCollections.ts:44"}, "properties": {"repobilityId": "71f78269a170789a", "scanner": "scanner-primary", "fingerprint": "bc8e83bd7abf4b92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-19b873c2a805f951", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/migrate-from-supabase.js:74"}, "properties": {"repobilityId": "aea5ac2785620401", "scanner": "scanner-primary", "fingerprint": "19b873c2a805f951", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bddda3d5a14c7401", "level": "note", "message": {"text": "29 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "3519a6b4ac1d4f19", "scanner": "scanner-primary", "fingerprint": "bddda3d5a14c7401", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-965c431e7646d81f", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (monitor_tokens.js:67)"}, "properties": {"repobilityId": "43bb5334c8f7cc6a", "scanner": "scanner-primary", "fingerprint": "965c431e7646d81f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-50e9f9e2eb75d123", "level": "error", "message": {"text": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (test_workflow_debug.js:80)"}, "properties": {"repobilityId": "260f723c965e7196", "scanner": "scanner-primary", "fingerprint": "50e9f9e2eb75d123", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f7b9afbb9e3e5a26", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (send_welcome_emails.js:143)"}, "properties": {"repobilityId": "5d1fa6bfce64620c", "scanner": "scanner-primary", "fingerprint": "f7b9afbb9e3e5a26", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-030f27febeef947d", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_trigger_manually.js:123)"}, "properties": {"repobilityId": "87fb4072d1ffef46", "scanner": "scanner-primary", "fingerprint": "030f27febeef947d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-25c3694d85623b2c", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/test-email-service (test-notifications.js:16)"}, "properties": {"repobilityId": "cea162807ac6168a", "scanner": "scanner-primary", "fingerprint": "25c3694d85623b2c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-95ab64c51b2e4e23", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/test-notifications (test-notifications.js:50)"}, "properties": {"repobilityId": "f4708c8e042eee77", "scanner": "scanner-primary", "fingerprint": "95ab64c51b2e4e23", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8eb07e8a28bb74dc", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/email/bypass-queue (test_real_workflow.js:83)"}, "properties": {"repobilityId": "54a5c879dc1bff2a", "scanner": "scanner-primary", "fingerprint": "8eb07e8a28bb74dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6d8885a7d1eb57b0", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-media (test-upload-debug.js:65)"}, "properties": {"repobilityId": "f52d46c38b11baf6", "scanner": "scanner-primary", "fingerprint": "6d8885a7d1eb57b0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-52f3b2586836026b", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_new_email_service.js:18)"}, "properties": {"repobilityId": "3705fa6e671f44a2", "scanner": "scanner-primary", "fingerprint": "52f3b2586836026b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7c3ef783282aaafe", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_new_email_service.js:62)"}, "properties": {"repobilityId": "38a154e3707daee3", "scanner": "scanner-primary", "fingerprint": "7c3ef783282aaafe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c86101b0e0a85bec", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3003/api/email/health (test_new_email_service.js:101)"}, "properties": {"repobilityId": "bdae57c8f03407dd", "scanner": "scanner-primary", "fingerprint": "c86101b0e0a85bec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e2ce12a31e3d90bd", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (process_pending_emails.js:42)"}, "properties": {"repobilityId": "1b4df20c97777464", "scanner": "scanner-primary", "fingerprint": "e2ce12a31e3d90bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1074557e48fd6e90", "level": "error", "message": {"text": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (test_automatic_triggers.js:109)"}, "properties": {"repobilityId": "3c6e36581bb359ea", "scanner": "scanner-primary", "fingerprint": "1074557e48fd6e90", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42f83be3b405915d", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/email/send (test_member_automation.js:115)"}, "properties": {"repobilityId": "bc41f64dedbd5a36", "scanner": "scanner-primary", "fingerprint": "42f83be3b405915d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-602b2c42b0a22021", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (replace_test_tokens.js:74)"}, "properties": {"repobilityId": "ef16d616daa84926", "scanner": "scanner-primary", "fingerprint": "602b2c42b0a22021", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-042c31c724dc871c", "level": "error", "message": {"text": "Dangling fetch: POST https://exp.host/--/api/v2/push/send (apps/api/src/expo-push.js:42)"}, "properties": {"repobilityId": "84d1a1b6653d6320", "scanner": "scanner-primary", "fingerprint": "042c31c724dc871c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d00ac4636398453c", "level": "error", "message": {"text": "Dangling fetch: POST https://api.twilio.com/2010-04-01/Accounts/${smsSettings.account_sid}/Messages.json (apps/api/src/routes/admin-comms.js:930)"}, "properties": {"repobilityId": "0ff9b3894e4a88de", "scanner": "scanner-primary", "fingerprint": "d00ac4636398453c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6b2a4986db3abfed", "level": "error", "message": {"text": "Dangling fetch: POST https://exp.host/--/api/v2/push/send (apps/api/src/routes/admin-notifications.js:304)"}, "properties": {"repobilityId": "585ad9d574fc4fd8", "scanner": "scanner-primary", "fingerprint": "6b2a4986db3abfed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ecb54e3f87f7a1f8", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (apps/admin/test_real_push_token.js:68)"}, "properties": {"repobilityId": "be07dae9ddb0092f", "scanner": "scanner-primary", "fingerprint": "ecb54e3f87f7a1f8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe4f5c496191069d", "level": "error", "message": {"text": "Dangling fetch: POST https://ufjfafcfkalaasdhgcbi.supabase.co/functions/v1/execute-workflows (apps/admin/fix_welcome_template.js:48)"}, "properties": {"repobilityId": "aac1c3bafd8b4b96", "scanner": "scanner-primary", "fingerprint": "fe4f5c496191069d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a26348906381d4e5", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3003/api/notifications/send-push (apps/admin/fix_push_notifications.js:89)"}, "properties": {"repobilityId": "17db4ec018ff38b4", "scanner": "scanner-primary", "fingerprint": "a26348906381d4e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0c3c9259661ac0b5", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:3000/api/events/${eventId}/transport/summary (apps/admin/check_all_requests.js:39)"}, "properties": {"repobilityId": "00190de32207c11a", "scanner": "scanner-primary", "fingerprint": "0c3c9259661ac0b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dc91b025c9b8fd1c", "level": "error", "message": {"text": "Dangling fetch: POST http://localhost:3001/api/donations/create-payment-intent (apps/admin/test-stripe-integration.js:117)"}, "properties": {"repobilityId": "afc22dac45858c1c", "scanner": "scanner-primary", "fingerprint": "dc91b025c9b8fd1c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a4eeaaf1bf02151a", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/bypass-queue (apps/admin/src/components/CreateMeetingModal.tsx:242)"}, "properties": {"repobilityId": "3a650b531249ee1c", "scanner": "scanner-primary", "fingerprint": "a4eeaaf1bf02151a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-47a7e05af8f77c88", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/components/settings/MultipleLogoUpload.tsx:132)"}, "properties": {"repobilityId": "a660e49772740919", "scanner": "scanner-primary", "fingerprint": "47a7e05af8f77c88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b6bad51e21e793d6", "level": "error", "message": {"text": "Dangling fetch: GET /api/events/${eventId}/transport/routes (apps/admin/src/components/transport/EventTransportTab.tsx:619)"}, "properties": {"repobilityId": "4a8c38d44be1c016", "scanner": "scanner-primary", "fingerprint": "b6bad51e21e793d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4f43178da405dd79", "level": "error", "message": {"text": "Dangling fetch: POST /api/newsletter/members/import (apps/admin/src/components/newsletter/MemberImportDialog.tsx:54)"}, "properties": {"repobilityId": "8b84aeaf10b25d61", "scanner": "scanner-primary", "fingerprint": "4f43178da405dd79", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-499115f12a3fda9d", "level": "error", "message": {"text": "Dangling fetch: POST /api/newsletter/members/sync (apps/admin/src/components/newsletter/MemberImportDialog.tsx:98)"}, "properties": {"repobilityId": "644a06d7ffe9392d", "scanner": "scanner-primary", "fingerprint": "499115f12a3fda9d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04905cf5d3e88552", "level": "error", "message": {"text": "Dangling fetch: POST /api/newsletter/members/sync (apps/admin/src/components/newsletter/MemberImportDialog.tsx:137)"}, "properties": {"repobilityId": "6c2b86e8f6425369", "scanner": "scanner-primary", "fingerprint": "04905cf5d3e88552", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-542d5d13179692c9", "level": "error", "message": {"text": "Dangling fetch: PUT /api/newsletter/subscribers/${subscriber.id} (apps/admin/src/components/newsletter/EditSubscriberDialog.tsx:86)"}, "properties": {"repobilityId": "ef69c584e79132df", "scanner": "scanner-primary", "fingerprint": "542d5d13179692c9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9a18addf1d5c42d9", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/fix-birthday-column (apps/admin/src/app/fix-birthday/page.tsx:20)"}, "properties": {"repobilityId": "de930d0c982dd022", "scanner": "scanner-primary", "fingerprint": "9a18addf1d5c42d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-208fdb8fbdedcff1", "level": "error", "message": {"text": "Dangling fetch: POST https://api.sendgrid.com/v3/mail/send (apps/admin/src/app/api/email/send-with-sendgrid/route.ts:72)"}, "properties": {"repobilityId": "28f880d72f30a486", "scanner": "scanner-primary", "fingerprint": "208fdb8fbdedcff1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-566b612ba178f393", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-media (apps/admin/src/app/simple-upload/page.tsx:44)"}, "properties": {"repobilityId": "a5ec22c1f70af72b", "scanner": "scanner-primary", "fingerprint": "566b612ba178f393", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d8dc88985657c673", "level": "error", "message": {"text": "Dangling fetch: GET /api/settings/communications (apps/admin/src/app/(admin)/settings/email-system/page.tsx:42)"}, "properties": {"repobilityId": "e0a636261beada56", "scanner": "scanner-primary", "fingerprint": "d8dc88985657c673", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-12228fb5575bf4e3", "level": "error", "message": {"text": "Dangling fetch: POST /api/settings/communications (apps/admin/src/app/(admin)/settings/email-system/page.tsx:65)"}, "properties": {"repobilityId": "2fd5fc6243548b48", "scanner": "scanner-primary", "fingerprint": "12228fb5575bf4e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-12caf9ed734c4041", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/test-system (apps/admin/src/app/(admin)/settings/email-system/page.tsx:96)"}, "properties": {"repobilityId": "8b6e715a69230b47", "scanner": "scanner-primary", "fingerprint": "12caf9ed734c4041", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cbf861e564e42b27", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-footer-logo (apps/admin/src/app/(admin)/settings/footer/page.tsx:347)"}, "properties": {"repobilityId": "84189838d1fc7c03", "scanner": "scanner-primary", "fingerprint": "cbf861e564e42b27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dfef3824646650b7", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:201)"}, "properties": {"repobilityId": "0fba3a64dd767da2", "scanner": "scanner-primary", "fingerprint": "dfef3824646650b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d2d03dc74d386898", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:901)"}, "properties": {"repobilityId": "de435a0d7e149d49", "scanner": "scanner-primary", "fingerprint": "d2d03dc74d386898", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f67792257e420e85", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1067)"}, "properties": {"repobilityId": "d869a210b9760e66", "scanner": "scanner-primary", "fingerprint": "f67792257e420e85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60f386966221ec27", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1156)"}, "properties": {"repobilityId": "78563af48aed6d82", "scanner": "scanner-primary", "fingerprint": "60f386966221ec27", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3eb50c18fb01f56d", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1217)"}, "properties": {"repobilityId": "c57190464b7730bc", "scanner": "scanner-primary", "fingerprint": "3eb50c18fb01f56d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1768913ef1972b58", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1278)"}, "properties": {"repobilityId": "cbeb70dc0336ea38", "scanner": "scanner-primary", "fingerprint": "1768913ef1972b58", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1d92c5157c7ecbcb", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-logo (apps/admin/src/app/(admin)/settings/tenant/page.tsx:1339)"}, "properties": {"repobilityId": "a83143818ce79030", "scanner": "scanner-primary", "fingerprint": "1d92c5157c7ecbcb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-81e1d2bfc883d4c6", "level": "error", "message": {"text": "Dangling fetch: GET /api/email/health?includeQueue=true&includeErrors=true (apps/admin/src/app/(admin)/comms/email-health/page.tsx:82)"}, "properties": {"repobilityId": "1d4219fbe034ef61", "scanner": "scanner-primary", "fingerprint": "81e1d2bfc883d4c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c8b824add50b2b16", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/health (apps/admin/src/app/(admin)/comms/email-health/page.tsx:106)"}, "properties": {"repobilityId": "18bce06c95e39771", "scanner": "scanner-primary", "fingerprint": "c8b824add50b2b16", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1ac072da8d09fff2", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/stats (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:115)"}, "properties": {"repobilityId": "ebc5798735cd1ce1", "scanner": "scanner-primary", "fingerprint": "1ac072da8d09fff2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a9bb8e3e6aed0aa", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/newsletters (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:122)"}, "properties": {"repobilityId": "90326cdf5a8108b5", "scanner": "scanner-primary", "fingerprint": "8a9bb8e3e6aed0aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a574aea17154a72e", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/subscribers (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:129)"}, "properties": {"repobilityId": "cce38207623a4464", "scanner": "scanner-primary", "fingerprint": "a574aea17154a72e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9c9148eb10287fed", "level": "error", "message": {"text": "Dangling fetch: POST /api/newsletter/subscribers (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:157)"}, "properties": {"repobilityId": "fa495caa23bcdffd", "scanner": "scanner-primary", "fingerprint": "9c9148eb10287fed", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-09c9ade12e283b03", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/newsletter/subscribers/${selectedSubscriber.id} (apps/admin/src/app/(admin)/comms/newsletter/page.tsx:204)"}, "properties": {"repobilityId": "5ba120b72f0975c6", "scanner": "scanner-primary", "fingerprint": "09c9ade12e283b03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11c3b26f5871e15e", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/templates (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:86)"}, "properties": {"repobilityId": "bcfd0438246c46d7", "scanner": "scanner-primary", "fingerprint": "11c3b26f5871e15e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f143f2e4a30262d8", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/segments (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:93)"}, "properties": {"repobilityId": "67fc26899b8b34c0", "scanner": "scanner-primary", "fingerprint": "f143f2e4a30262d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-14d53ff0691f0341", "level": "error", "message": {"text": "Dangling fetch: POST /api/newsletter/preview (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:134)"}, "properties": {"repobilityId": "f4a165fff94ad295", "scanner": "scanner-primary", "fingerprint": "14d53ff0691f0341", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-529dcc69c5f6f56d", "level": "error", "message": {"text": "Dangling fetch: POST /api/newsletter/newsletters (apps/admin/src/app/(admin)/comms/newsletter/new/page.tsx:196)"}, "properties": {"repobilityId": "69af85a939726904", "scanner": "scanner-primary", "fingerprint": "529dcc69c5f6f56d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-613791fa748be34f", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/page.tsx:67)"}, "properties": {"repobilityId": "da79b162e32fa868", "scanner": "scanner-primary", "fingerprint": "613791fa748be34f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd4a27b04bd714e5", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:107)"}, "properties": {"repobilityId": "44e95d1602d27e77", "scanner": "scanner-primary", "fingerprint": "fd4a27b04bd714e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c3ef1706713bc320", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/templates (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:147)"}, "properties": {"repobilityId": "650a290c74aed871", "scanner": "scanner-primary", "fingerprint": "c3ef1706713bc320", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e12cf28b4e61d357", "level": "error", "message": {"text": "Dangling fetch: GET /api/newsletter/segments (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:154)"}, "properties": {"repobilityId": "7e0f9a14dc005081", "scanner": "scanner-primary", "fingerprint": "e12cf28b4e61d357", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-18abb1b3381b5047", "level": "error", "message": {"text": "Dangling fetch: PUT /api/newsletter/newsletters/${newsletterId} (apps/admin/src/app/(admin)/comms/newsletter/[id]/edit/page.tsx:220)"}, "properties": {"repobilityId": "0195b5f01dea7e00", "scanner": "scanner-primary", "fingerprint": "18abb1b3381b5047", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b73628a56b915537", "level": "error", "message": {"text": "Dangling fetch: GET /api/upload-media (apps/admin/src/app/(admin)/content/media/page.tsx:231)"}, "properties": {"repobilityId": "01cf298f6327a771", "scanner": "scanner-primary", "fingerprint": "b73628a56b915537", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-26cfc6498888c2bf", "level": "error", "message": {"text": "Dangling fetch: POST /api/youtube/metadata (apps/admin/src/app/(admin)/content/sermons/new/page.tsx:101)"}, "properties": {"repobilityId": "4ff5cd4adeb90db3", "scanner": "scanner-primary", "fingerprint": "26cfc6498888c2bf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d0086e4dcc543dbe", "level": "error", "message": {"text": "Dangling fetch: POST /api/youtube/metadata (apps/admin/src/app/(admin)/content/sermons/[id]/edit/page.tsx:165)"}, "properties": {"repobilityId": "106bd7f64f0280c7", "scanner": "scanner-primary", "fingerprint": "d0086e4dcc543dbe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe7eefd2ed5fb950", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/send (apps/admin/src/app/(admin)/email-test/email-test-form.tsx:49)"}, "properties": {"repobilityId": "5c55c4ab22c221a7", "scanner": "scanner-primary", "fingerprint": "fe7eefd2ed5fb950", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab03ff4ca3ed7916", "level": "error", "message": {"text": "Dangling fetch: POST /api/trigger-workflow (apps/admin/src/app/(admin)/people/members/new/page.tsx:156)"}, "properties": {"repobilityId": "54669234d9225ef7", "scanner": "scanner-primary", "fingerprint": "ab03ff4ca3ed7916", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c310fde92837ac5d", "level": "error", "message": {"text": "Dangling fetch: POST /api/email/send (apps/admin/src/app/(admin)/people/members/[id]/page.tsx:709)"}, "properties": {"repobilityId": "d177355db37c59bb", "scanner": "scanner-primary", "fingerprint": "c310fde92837ac5d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-13820876ffdd7cfe", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-media (apps/admin/src/services/media.ts:61)"}, "properties": {"repobilityId": "21c52583a743a79f", "scanner": "scanner-primary", "fingerprint": "13820876ffdd7cfe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6bdd01ea1db78b05", "level": "error", "message": {"text": "Dangling fetch: POST /api/upload-image (apps/admin/src/services/contacts.ts:339)"}, "properties": {"repobilityId": "b5e1f5ac4d8ef3ba", "scanner": "scanner-primary", "fingerprint": "6bdd01ea1db78b05", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-87975f6541d37476", "level": "error", "message": {"text": "Dangling fetch: POST /api/events/register (apps/web/src/components/events/event-registration-form.tsx:95)"}, "properties": {"repobilityId": "498c5b2fae78f1aa", "scanner": "scanner-primary", "fingerprint": "87975f6541d37476", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6192a881f4b898b8", "level": "error", "message": {"text": "Dangling fetch: POST /api/donations/confirm-recurring (apps/web/src/components/sections/giving-form.tsx:77)"}, "properties": {"repobilityId": "ff65c5189f4fe4d4", "scanner": "scanner-primary", "fingerprint": "6192a881f4b898b8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4175e6c334a6303b", "level": "error", "message": {"text": "Dangling fetch: POST /api/donations/record-offline-payment (apps/web/src/components/sections/giving-form.tsx:347)"}, "properties": {"repobilityId": "c89968ca4fc6af9c", "scanner": "scanner-primary", "fingerprint": "4175e6c334a6303b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b854a335b1b779da", "level": "error", "message": {"text": "Dangling fetch: GET /api/events-list (apps/web/src/components/sections/planned-visit-form.tsx:62)"}, "properties": {"repobilityId": "2c0698110894996a", "scanner": "scanner-primary", "fingerprint": "b854a335b1b779da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41826add1513e0aa", "level": "error", "message": {"text": "Dangling fetch: GET /api/media/collections?${params} (apps/web/src/components/sections/media-gallery-section.tsx:69)"}, "properties": {"repobilityId": "687340deacea8030", "scanner": "scanner-primary", "fingerprint": "41826add1513e0aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42b1dbf019926e5d", "level": "error", "message": {"text": "Dangling fetch: GET /api/contact-page (apps/web/src/components/sections/office-hours.tsx:9)"}, "properties": {"repobilityId": "d2e2d85fe2e4d341", "scanner": "scanner-primary", "fingerprint": "42b1dbf019926e5d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2cceb71f31114f3c", "level": "error", "message": {"text": "Dangling fetch: GET /api/blog-page (apps/web/src/hooks/useBlogPage.ts:88)"}, "properties": {"repobilityId": "f28b94026e493af3", "scanner": "scanner-primary", "fingerprint": "2cceb71f31114f3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-01b075c287b2d3b1", "level": "error", "message": {"text": "Dangling fetch: GET /api/events-page (apps/web/src/hooks/useEventsPage.ts:66)"}, "properties": {"repobilityId": "a85164398f818b0a", "scanner": "scanner-primary", "fingerprint": "01b075c287b2d3b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8a2e265f40561067", "level": "error", "message": {"text": "Dangling fetch: GET /api/about (apps/web/src/hooks/useAbout.ts:93)"}, "properties": {"repobilityId": "142326bd1e49c4ae", "scanner": "scanner-primary", "fingerprint": "8a2e265f40561067", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e000cb8d26104796", "level": "error", "message": {"text": "Dangling fetch: GET /api/giving-page (apps/web/src/hooks/useGivingPage.ts:35)"}, "properties": {"repobilityId": "43a39875d4230132", "scanner": "scanner-primary", "fingerprint": "e000cb8d26104796", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d2430f951e5fe45e", "level": "error", "message": {"text": "Dangling fetch: GET /api/gallery-page (apps/web/src/hooks/useGalleryPage.ts:83)"}, "properties": {"repobilityId": "a3084a1da0de0899", "scanner": "scanner-primary", "fingerprint": "d2430f951e5fe45e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6487da1c9bb5fa33", "level": "error", "message": {"text": "Dangling fetch: GET /api/sermons-page (apps/web/src/hooks/useSermonsPage.ts:79)"}, "properties": {"repobilityId": "36d06629e854e372", "scanner": "scanner-primary", "fingerprint": "6487da1c9bb5fa33", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9c8fd0d3ccb28794", "level": "error", "message": {"text": "Dangling fetch: GET /api/contact-page (apps/web/src/hooks/useContactPage.ts:116)"}, "properties": {"repobilityId": "821c64c0961f5021", "scanner": "scanner-primary", "fingerprint": "9c8fd0d3ccb28794", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1bc898b3b7565990", "level": "note", "message": {"text": "Unused endpoint: USE /uploads"}, "properties": {"repobilityId": "e652cd7c111b4d54", "scanner": "scanner-primary", "fingerprint": "1bc898b3b7565990", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-446fe4b6ad1a4ff9", "level": "note", "message": {"text": "Unused endpoint: USE /api/public"}, "properties": {"repobilityId": "673ccac34e7d9b04", "scanner": "scanner-primary", "fingerprint": "446fe4b6ad1a4ff9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "8d3709150babbd4e", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84bd4c31da0619b1", "level": "note", "message": {"text": "Unused endpoint: USE /api/uploads"}, "properties": {"repobilityId": "cc6514c5841f0c4d", "scanner": "scanner-primary", "fingerprint": "84bd4c31da0619b1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "7dbde0fd03ffadb9", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e297457c06098dda", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/contacts"}, "properties": {"repobilityId": "ca5770e8e09ff024", "scanner": "scanner-primary", "fingerprint": "e297457c06098dda", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-554df9fd6434d881", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/members"}, "properties": {"repobilityId": "4d63a60c92d3b4a4", "scanner": "scanner-primary", "fingerprint": "554df9fd6434d881", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39db2b2c29a046c9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/groups"}, "properties": {"repobilityId": "d965336ffb18d1b3", "scanner": "scanner-primary", "fingerprint": "39db2b2c29a046c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39bafdbdc6776011", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/events"}, "properties": {"repobilityId": "24ef38822c8df7a9", "scanner": "scanner-primary", "fingerprint": "39bafdbdc6776011", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fe98af852e6ea8f5", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/event-tasks"}, "properties": {"repobilityId": "41c5250eb4a28916", "scanner": "scanner-primary", "fingerprint": "fe98af852e6ea8f5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ec4881f63ed6122", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/transport"}, "properties": {"repobilityId": "d245f2d9bed03a1a", "scanner": "scanner-primary", "fingerprint": "9ec4881f63ed6122", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e895b26fdb6eb5c", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/content"}, "properties": {"repobilityId": "6103333d4cdfcf16", "scanner": "scanner-primary", "fingerprint": "0e895b26fdb6eb5c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ebf1698736720618", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/attendance"}, "properties": {"repobilityId": "88a253c1c88d074c", "scanner": "scanner-primary", "fingerprint": "ebf1698736720618", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-98ac120b9b1c669b", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/visitors"}, "properties": {"repobilityId": "ddbb887545ddee8f", "scanner": "scanner-primary", "fingerprint": "98ac120b9b1c669b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc812487abb4c393", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/follow-ups"}, "properties": {"repobilityId": "c22d255060e61504", "scanner": "scanner-primary", "fingerprint": "dc812487abb4c393", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9d579b1e57c6329a", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/prayer-requests"}, "properties": {"repobilityId": "cd7595f2dc79bc8c", "scanner": "scanner-primary", "fingerprint": "9d579b1e57c6329a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1d1d589dade328ed", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/soul-winning"}, "properties": {"repobilityId": "f2592b10a87b3f8d", "scanner": "scanner-primary", "fingerprint": "1d1d589dade328ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-215dd45c94b5fcf2", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/mobile-app-users"}, "properties": {"repobilityId": "a56a7e9b7c08c0f7", "scanner": "scanner-primary", "fingerprint": "215dd45c94b5fcf2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-581a3f226503e318", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/planned-visits"}, "properties": {"repobilityId": "fabacaddfc3e7b54", "scanner": "scanner-primary", "fingerprint": "581a3f226503e318", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dd45438c0318f3a9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/get-involved"}, "properties": {"repobilityId": "6e34fda8d8378dd1", "scanner": "scanner-primary", "fingerprint": "dd45438c0318f3a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aa1fa1c4fae89fdc", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/website-messages"}, "properties": {"repobilityId": "c144e3eb6a243b07", "scanner": "scanner-primary", "fingerprint": "aa1fa1c4fae89fdc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ced78b8d36f856c3", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/footer"}, "properties": {"repobilityId": "e8143520f831d5f8", "scanner": "scanner-primary", "fingerprint": "ced78b8d36f856c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-854f84390b975fae", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/debug"}, "properties": {"repobilityId": "bc1df4ea3a0b6ef2", "scanner": "scanner-primary", "fingerprint": "854f84390b975fae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e2cfe36e6843620", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/assets"}, "properties": {"repobilityId": "bf27019e4577f6eb", "scanner": "scanner-primary", "fingerprint": "4e2cfe36e6843620", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-02bb5ce96f064b2c", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/expenses"}, "properties": {"repobilityId": "4f8791ed3bfef4ae", "scanner": "scanner-primary", "fingerprint": "02bb5ce96f064b2c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-27d710506af72b66", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/transactions"}, "properties": {"repobilityId": "7d3e64064cd84973", "scanner": "scanner-primary", "fingerprint": "27d710506af72b66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f06b8bc926923543", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/giving"}, "properties": {"repobilityId": "f760dea830fbfbcd", "scanner": "scanner-primary", "fingerprint": "f06b8bc926923543", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fafc2b56db9b14e5", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/settings"}, "properties": {"repobilityId": "b353066c314fcf1f", "scanner": "scanner-primary", "fingerprint": "fafc2b56db9b14e5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e0cdfc54d1b370bd", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/users"}, "properties": {"repobilityId": "cfc1b79471815555", "scanner": "scanner-primary", "fingerprint": "e0cdfc54d1b370bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c60c0cc04774e3db", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/workflows"}, "properties": {"repobilityId": "16063000a155921e", "scanner": "scanner-primary", "fingerprint": "c60c0cc04774e3db", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d30b8a3507beb9df", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/comms"}, "properties": {"repobilityId": "81da48a0bea99403", "scanner": "scanner-primary", "fingerprint": "d30b8a3507beb9df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1531e8eec46b09a3", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/meetings"}, "properties": {"repobilityId": "d6683839ce2a6f46", "scanner": "scanner-primary", "fingerprint": "1531e8eec46b09a3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-66c64dec2ce80528", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/discipleship"}, "properties": {"repobilityId": "d8fda87ed455c0f6", "scanner": "scanner-primary", "fingerprint": "66c64dec2ce80528", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a29e3c48f16dc456", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/notifications"}, "properties": {"repobilityId": "7f8393bfd4e0bde1", "scanner": "scanner-primary", "fingerprint": "a29e3c48f16dc456", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-23bb1fec573b0241", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/reports"}, "properties": {"repobilityId": "edfeaa258f2f6a29", "scanner": "scanner-primary", "fingerprint": "23bb1fec573b0241", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e12115b7e5c20b4d", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/newsletter"}, "properties": {"repobilityId": "0d2f18651ad2c8fd", "scanner": "scanner-primary", "fingerprint": "e12115b7e5c20b4d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c94202c2d87daa3", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin/departments"}, "properties": {"repobilityId": "8993d91f30363c22", "scanner": "scanner-primary", "fingerprint": "4c94202c2d87daa3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-203ec659ed8ada77", "level": "note", "message": {"text": "Unused endpoint: USE /api/webhooks"}, "properties": {"repobilityId": "2f780d0564543795", "scanner": "scanner-primary", "fingerprint": "203ec659ed8ada77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a93b9e2f666daa8", "level": "note", "message": {"text": "Unused endpoint: USE /api/mobile"}, "properties": {"repobilityId": "61e7768dac77562d", "scanner": "scanner-primary", "fingerprint": "5a93b9e2f666daa8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "ac309446831b390b", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a3860daa751399d", "level": "note", "message": {"text": "Unused endpoint: GET /ytd-total"}, "properties": {"repobilityId": "9da5ff22343c7519", "scanner": "scanner-primary", "fingerprint": "5a3860daa751399d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3ae5fabcb66fb3cb", "level": "note", "message": {"text": "Unused endpoint: GET /monthly-average"}, "properties": {"repobilityId": "72f101bd420ed7f0", "scanner": "scanner-primary", "fingerprint": "3ae5fabcb66fb3cb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "ce9e0bb5c1e7610f", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "f6eb1c0d1779984e", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fbc954f63526821", "level": "note", "message": {"text": "Unused endpoint: PATCH /:id"}, "properties": {"repobilityId": "d7dd195befd412f4", "scanner": "scanner-primary", "fingerprint": "5fbc954f63526821", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a61c112b611f4bb", "level": "note", "message": {"text": "Unused endpoint: DELETE /:id"}, "properties": {"repobilityId": "ce42280e63cb6773", "scanner": "scanner-primary", "fingerprint": "7a61c112b611f4bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-42719ea76f9ecae3", "level": "note", "message": {"text": "Unused endpoint: GET /requests"}, "properties": {"repobilityId": "174f9b4b668f7a7f", "scanner": "scanner-primary", "fingerprint": "42719ea76f9ecae3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b810fcd90b72b11f", "level": "note", "message": {"text": "Unused endpoint: GET /requests/:id"}, "properties": {"repobilityId": "e09c882613c1e725", "scanner": "scanner-primary", "fingerprint": "b810fcd90b72b11f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6c6a40b1125dae56", "level": "note", "message": {"text": "Unused endpoint: POST /requests"}, "properties": {"repobilityId": "d9f521eba215cd7e", "scanner": "scanner-primary", "fingerprint": "6c6a40b1125dae56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-453581366e96a065", "level": "note", "message": {"text": "Unused endpoint: PATCH /requests/:id"}, "properties": {"repobilityId": "665b52f64ee92b55", "scanner": "scanner-primary", "fingerprint": "453581366e96a065", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}