{"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-c73fdc4c7b3598b6", "name": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_api.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_api.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-1880098f01bf2d74", "name": "Stray `console.log` in TS/JS \u2014 test_parser_verification.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_parser_verification.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-df28632db51d3f34", "name": "Stray `console.log` in TS/JS \u2014 run_migration.js:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 run_migration.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-5a1c4d71515dcf2b", "name": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_not_showing.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_not_showing.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-ca1fcc8fa4570266", "name": "Stray `console.log` in TS/JS \u2014 add_loading_states.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 add_loading_states.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-1395102dbf960147", "name": "Stray `console.log` in TS/JS \u2014 test_location_ref_import_steps.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_location_ref_import_steps.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-f0197bc344359c1d", "name": "Stray `console.log` in TS/JS \u2014 diagnose_xml_contact_import.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_xml_contact_import.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-ed5dea7f182b94fa", "name": "Stray `console.log` in TS/JS \u2014 test_parser.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_parser.js:27"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f4874dc108e21c9", "name": "Stray `console.log` in TS/JS \u2014 test-results-import.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-results-import.js:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd3f62c00742999f", "name": "Stray `console.log` in TS/JS \u2014 test_xml_parsing.js:31", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_xml_parsing.js:31"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-442743fa8f7cbab1", "name": "Stray `console.log` in TS/JS \u2014 diagnose_tags_ui_issue.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_tags_ui_issue.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-d6b908eefb1787f6", "name": "Stray `console.log` in TS/JS \u2014 test_narratives_browser.js:4", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_narratives_browser.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-d25d1896df8abda5", "name": "Stray `console.log` in TS/JS \u2014 add_xml_loading_states.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 add_xml_loading_states.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6ad01db5243cb460", "name": "Stray `console.log` in TS/JS \u2014 setup-iati-policy-markers-http.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 setup-iati-policy-markers-http.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-7a5c85d42adfbfd7", "name": "Stray `console.log` in TS/JS \u2014 fix_location_matching.js:6", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 fix_location_matching.js:6"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6c99ecfb1e1afb10", "name": "Stray `console.log` in TS/JS \u2014 test-narrative-import.js:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test-narrative-import.js: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-a2276e365dc1d3e7", "name": "Stray `console.log` in TS/JS \u2014 setup-iati-policy-markers.js:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 setup-iati-policy-markers.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-d5f83a4aef4e51ac", "name": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_ui.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_ui.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-c6e8e774318ff2b5", "name": "Stray `console.log` in TS/JS \u2014 test_tag_creation_directly.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_tag_creation_directly.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-23287239acfcd7db", "name": "Stray `console.log` in TS/JS \u2014 diagnose_tag_import_browser.js:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_tag_import_browser.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-5cc420f6e1f9bb7e", "name": "Stray `console.log` in TS/JS \u2014 test_location_ref_import.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 test_location_ref_import.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-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 614 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. 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-43cadc32f6cebfa4", "name": "Commented-code block (8 lines) in diagnose_contacts_api.js:6", "shortDescription": {"text": "Commented-code block (8 lines) in diagnose_contacts_api.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f0c67171171d9561", "name": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_contacts_api.js:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_contacts_api.js:32"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-51df96b965054c52", "name": "Commented-code block (7 lines) in diagnose_contacts_not_showing.js:6", "shortDescription": {"text": "Commented-code block (7 lines) in diagnose_contacts_not_showing.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2632d87304ef6c4f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_contacts_not_showing.js:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_contacts_not_showing.js:38"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30d8e70ed18c101e", "name": "Commented-code block (7 lines) in diagnose_xml_contact_import.js:6", "shortDescription": {"text": "Commented-code block (7 lines) in diagnose_xml_contact_import.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b844f19787d5cfb9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 test_narratives_browser.js:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_narratives_browser.js:16"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-582af94db3e44862", "name": "Commented-code block (6 lines) in diagnose_contacts_ui.js:6", "shortDescription": {"text": "Commented-code block (6 lines) in diagnose_contacts_ui.js:6"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3c6fd28d344cdf94", "name": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_tag_import_browser.js:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_tag_import_browser.js:64"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-319e66a630e14977", "name": "2 env vars used in code but missing from .env.example", "shortDescription": {"text": "2 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `CI`, `NEXT_PUBLIC_SUPABASE_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/27371"}, "properties": {"repository": "LeighHMitchell/AIMS", "repoUrl": "https://github.com/LeighHMitchell/AIMS", "branch": "main"}, "results": [{"ruleId": "scanner-c73fdc4c7b3598b6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_api.js:18"}, "properties": {"repobilityId": "c264ec58f6e02499", "scanner": "scanner-primary", "fingerprint": "c73fdc4c7b3598b6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1880098f01bf2d74", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_parser_verification.js:25"}, "properties": {"repobilityId": "2a8dba38db6b5bf7", "scanner": "scanner-primary", "fingerprint": "1880098f01bf2d74", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-df28632db51d3f34", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 run_migration.js:18"}, "properties": {"repobilityId": "d7f99a2e90192d42", "scanner": "scanner-primary", "fingerprint": "df28632db51d3f34", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5a1c4d71515dcf2b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_not_showing.js:14"}, "properties": {"repobilityId": "d30b0ce46e284222", "scanner": "scanner-primary", "fingerprint": "5a1c4d71515dcf2b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca1fcc8fa4570266", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 add_loading_states.js:23"}, "properties": {"repobilityId": "ea26f9e23b36222a", "scanner": "scanner-primary", "fingerprint": "ca1fcc8fa4570266", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1395102dbf960147", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_location_ref_import_steps.js:25"}, "properties": {"repobilityId": "fa0b1dcd2f56bdb3", "scanner": "scanner-primary", "fingerprint": "1395102dbf960147", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0197bc344359c1d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_xml_contact_import.js:14"}, "properties": {"repobilityId": "1547f168629345eb", "scanner": "scanner-primary", "fingerprint": "f0197bc344359c1d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed5dea7f182b94fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_parser.js:27"}, "properties": {"repobilityId": "99ccf2c6cea1f062", "scanner": "scanner-primary", "fingerprint": "ed5dea7f182b94fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1f4874dc108e21c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-results-import.js:42"}, "properties": {"repobilityId": "12eedac1072af637", "scanner": "scanner-primary", "fingerprint": "1f4874dc108e21c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fd3f62c00742999f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_xml_parsing.js:31"}, "properties": {"repobilityId": "f95bea0a28e7430e", "scanner": "scanner-primary", "fingerprint": "fd3f62c00742999f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-442743fa8f7cbab1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_tags_ui_issue.js:7"}, "properties": {"repobilityId": "87499e07ec085bb8", "scanner": "scanner-primary", "fingerprint": "442743fa8f7cbab1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d6b908eefb1787f6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_narratives_browser.js:4"}, "properties": {"repobilityId": "e309821402ec86b4", "scanner": "scanner-primary", "fingerprint": "d6b908eefb1787f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d25d1896df8abda5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 add_xml_loading_states.js:6"}, "properties": {"repobilityId": "cca862eff665ceec", "scanner": "scanner-primary", "fingerprint": "d25d1896df8abda5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6ad01db5243cb460", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 setup-iati-policy-markers-http.js:11"}, "properties": {"repobilityId": "14fb98148d0a55b6", "scanner": "scanner-primary", "fingerprint": "6ad01db5243cb460", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a5c85d42adfbfd7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 fix_location_matching.js:6"}, "properties": {"repobilityId": "9ed784b8e364dc08", "scanner": "scanner-primary", "fingerprint": "7a5c85d42adfbfd7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6c99ecfb1e1afb10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test-narrative-import.js:66"}, "properties": {"repobilityId": "5464bafd9af56470", "scanner": "scanner-primary", "fingerprint": "6c99ecfb1e1afb10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a2276e365dc1d3e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 setup-iati-policy-markers.js:11"}, "properties": {"repobilityId": "2384e8df7d6499f2", "scanner": "scanner-primary", "fingerprint": "a2276e365dc1d3e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d5f83a4aef4e51ac", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_contacts_ui.js:16"}, "properties": {"repobilityId": "74d7a58b91dd7e88", "scanner": "scanner-primary", "fingerprint": "d5f83a4aef4e51ac", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6e8e774318ff2b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_tag_creation_directly.js:7"}, "properties": {"repobilityId": "332f93234abbc3d3", "scanner": "scanner-primary", "fingerprint": "c6e8e774318ff2b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-23287239acfcd7db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 diagnose_tag_import_browser.js:7"}, "properties": {"repobilityId": "1c5ba74aa97739c3", "scanner": "scanner-primary", "fingerprint": "23287239acfcd7db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5cc420f6e1f9bb7e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 test_location_ref_import.js:25"}, "properties": {"repobilityId": "0dbd98bd68f612aa", "scanner": "scanner-primary", "fingerprint": "5cc420f6e1f9bb7e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "156e6b613b9f765c", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "6bf89f691178dd53", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "5c5735b3813bec52", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-43cadc32f6cebfa4", "level": "none", "message": {"text": "Commented-code block (8 lines) in diagnose_contacts_api.js:6"}, "properties": {"repobilityId": "ba3a5f0b51bfb0da", "scanner": "scanner-primary", "fingerprint": "43cadc32f6cebfa4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0c67171171d9561", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_contacts_api.js:32"}, "properties": {"repobilityId": "97fac331ab718d5f", "scanner": "scanner-primary", "fingerprint": "f0c67171171d9561", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51df96b965054c52", "level": "none", "message": {"text": "Commented-code block (7 lines) in diagnose_contacts_not_showing.js:6"}, "properties": {"repobilityId": "7dfa66feec90742f", "scanner": "scanner-primary", "fingerprint": "51df96b965054c52", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2632d87304ef6c4f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_contacts_not_showing.js:38"}, "properties": {"repobilityId": "a23dd99104672515", "scanner": "scanner-primary", "fingerprint": "2632d87304ef6c4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-30d8e70ed18c101e", "level": "none", "message": {"text": "Commented-code block (7 lines) in diagnose_xml_contact_import.js:6"}, "properties": {"repobilityId": "68901d707098764b", "scanner": "scanner-primary", "fingerprint": "30d8e70ed18c101e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b844f19787d5cfb9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 test_narratives_browser.js:16"}, "properties": {"repobilityId": "8633efaf54a0e9db", "scanner": "scanner-primary", "fingerprint": "b844f19787d5cfb9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-582af94db3e44862", "level": "none", "message": {"text": "Commented-code block (6 lines) in diagnose_contacts_ui.js:6"}, "properties": {"repobilityId": "cf4d1d799dab8f63", "scanner": "scanner-primary", "fingerprint": "582af94db3e44862", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3c6fd28d344cdf94", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 diagnose_tag_import_browser.js:64"}, "properties": {"repobilityId": "b68364662511bc4d", "scanner": "scanner-primary", "fingerprint": "3c6fd28d344cdf94", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-319e66a630e14977", "level": "none", "message": {"text": "2 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d838d1fc5d8231c9", "scanner": "scanner-primary", "fingerprint": "319e66a630e14977", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}